diff --git a/CMakeLists.txt b/CMakeLists.txt index bc19ca4393f..24201ae6869 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,6 +63,9 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/build_files/cmake/platform") # avoid having empty buildtype if(NOT DEFINED CMAKE_BUILD_TYPE_INIT) set(CMAKE_BUILD_TYPE_INIT "Release") + # Internal logic caches this variable, avoid showing it by default + # since it's easy to accidentally set instead of the build type. + mark_as_advanced(CMAKE_BUILD_TYPE_INIT) endif() # Omit superfluous "Up-to-date" messages. @@ -164,10 +167,6 @@ if(APPLE) endif() option(WITH_BUILDINFO "Include extra build details (only disable for development & faster builds)" ON) -if(${CMAKE_VERSION} VERSION_LESS 2.8.8) - # add_library OBJECT arg unsupported - set(WITH_BUILDINFO OFF) -endif() set(BUILDINFO_OVERRIDE_DATE "" CACHE STRING "Use instead of the current date for reproducible builds (empty string disables this option)") set(BUILDINFO_OVERRIDE_TIME "" CACHE STRING "Use instead of the current time for reproducible builds (empty string disables this option)") set(CPACK_OVERRIDE_PACKAGENAME "" CACHE STRING "Use instead of the standard packagename (empty string disables this option)") @@ -371,8 +370,8 @@ if(WITH_PYTHON_INSTALL) endif() endif() -option(WITH_CPU_SSE "Enable SIMD instruction if they're detected on the host machine" ON) -mark_as_advanced(WITH_CPU_SSE) +option(WITH_CPU_SIMD "Enable SIMD instruction if they're detected on the host machine" ON) +mark_as_advanced(WITH_CPU_SIMD) # Cycles option(WITH_CYCLES "Enable Cycles Render Engine" ON) @@ -417,6 +416,7 @@ else() option(LLVM_STATIC "Link with LLVM static libraries" OFF) endif() mark_as_advanced(LLVM_STATIC) +option(WITH_CLANG "Use Clang" OFF) # disable for now, but plan to support on all platforms eventually option(WITH_MEM_JEMALLOC "Enable malloc replacement (http://www.canonware.com/jemalloc)" ON) @@ -614,6 +614,7 @@ endif() if(UNIX) # See WITH_WINDOWS_SCCACHE for Windows. option(WITH_COMPILER_CCACHE "Use ccache to improve rebuild times (Works with Ninja, Makefiles and Xcode)" OFF) + mark_as_advanced(WITH_COMPILER_CCACHE) endif() # The following only works with the Ninja generator in CMake >= 3.0. @@ -728,8 +729,9 @@ set_and_warn_dependency(WITH_TBB WITH_MOD_FLUID OFF) # NanoVDB requires OpenVDB to convert the data structure set_and_warn_dependency(WITH_OPENVDB WITH_NANOVDB OFF) -# OpenVDB uses 'half' type from OpenEXR & fails to link without OpenEXR enabled. +# OpenVDB and OpenColorIO uses 'half' type from OpenEXR set_and_warn_dependency(WITH_IMAGE_OPENEXR WITH_OPENVDB OFF) +set_and_warn_dependency(WITH_IMAGE_OPENEXR WITH_OPENCOLORIO OFF) # Haru needs `TIFFFaxBlackCodes` & `TIFFFaxWhiteCodes` symbols from TIFF. set_and_warn_dependency(WITH_IMAGE_TIFF WITH_HARU OFF) @@ -741,6 +743,7 @@ if(WITH_CYCLES) # auto enable llvm for cycles_osl if(WITH_CYCLES_OSL) set(WITH_LLVM ON CACHE BOOL "" FORCE) + set(WITH_CLANG ON CACHE BOOL "" FORCE) endif() else() set(WITH_CYCLES_OSL OFF) @@ -774,14 +777,6 @@ if(WITH_GHOST_SDL OR WITH_HEADLESS) set(WITH_XR_OPENXR OFF) endif() -if(WITH_CPU_SSE) - TEST_SSE_SUPPORT(COMPILER_SSE_FLAG COMPILER_SSE2_FLAG) -else() - message(STATUS "SSE and SSE2 optimizations are DISABLED!") - set(COMPILER_SSE_FLAG) - set(COMPILER_SSE2_FLAG) -endif() - if(WITH_BUILDINFO) find_package(Git) if(NOT GIT_FOUND) @@ -830,8 +825,8 @@ if(WITH_PYTHON) # Do this before main 'platform_*' checks, # because UNIX will search for the old Python paths which may not exist. # giving errors about missing paths before this case is met. - if(DEFINED PYTHON_VERSION AND "${PYTHON_VERSION}" VERSION_LESS "3.7") - message(FATAL_ERROR "At least Python 3.7 is required to build") + if(DEFINED PYTHON_VERSION AND "${PYTHON_VERSION}" VERSION_LESS "3.9") + message(FATAL_ERROR "At least Python 3.9 is required to build") endif() file(GLOB RESULT "${CMAKE_SOURCE_DIR}/release/scripts/addons") @@ -961,22 +956,55 @@ if(WITH_INTERNATIONAL) endif() endif() -# See TEST_SSE_SUPPORT() for how this is defined. +# See TEST_SSE_SUPPORT() and TEST_NEON_SUPPORT() for how these are defined. +# +# This is done globally, so that all modules can use it if available, and +# because these are used in headers used by many modules. +if(WITH_CPU_SIMD) + set(COMPILER_SSE_FLAG) + set(COMPILER_SSE2_FLAG) -# Do it globally, SSE2 is required for quite some time now. -# Doing it now allows to use SSE/SSE2 in inline headers. -if(SUPPORT_SSE_BUILD) - string(PREPEND PLATFORM_CFLAGS "${COMPILER_SSE_FLAG} ") - add_definitions(-D__SSE__ -D__MMX__) -endif() -if(SUPPORT_SSE2_BUILD) - string(APPEND PLATFORM_CFLAGS " ${COMPILER_SSE2_FLAG}") - add_definitions(-D__SSE2__) - if(NOT SUPPORT_SSE_BUILD) # don't double up - add_definitions(-D__MMX__) + # Test Neon first since macOS Arm can compile and run x86-64 SSE binaries. + TEST_NEON_SUPPORT() + if(SUPPORT_NEON_BUILD) + # Neon + if(SSE2NEON_FOUND) + blender_include_dirs_sys("${SSE2NEON_INCLUDE_DIRS}") + add_definitions(-DWITH_SSE2NEON) + endif() + else() + # SSE + TEST_SSE_SUPPORT(COMPILER_SSE_FLAG COMPILER_SSE2_FLAG) + if(SUPPORT_SSE_BUILD) + string(PREPEND PLATFORM_CFLAGS "${COMPILER_SSE_FLAG} ") + add_definitions(-D__SSE__ -D__MMX__) + endif() + if(SUPPORT_SSE2_BUILD) + string(APPEND PLATFORM_CFLAGS " ${COMPILER_SSE2_FLAG}") + add_definitions(-D__SSE2__) + if(NOT SUPPORT_SSE_BUILD) # don't double up + add_definitions(-D__MMX__) + endif() + endif() endif() -endif() + # Print instructions used + if(SUPPORT_NEON_BUILD) + if(SSE2NEON_FOUND) + message(STATUS "Neon SIMD instructions enabled") + else() + message(STATUS "Neon SIMD instructions detected but unused, requires sse2neon") + endif() + elseif(SUPPORT_SSE2_BUILD) + message(STATUS "SSE2 SIMD instructions enabled") + elseif(SUPPORT_SSE_BUILD) + message(STATUS "SSE SIMD instructions enabled") + else() + message(STATUS "No SIMD instructions detected") + endif() +else() + message(STATUS "SIMD instructions disabled") +endif() # set the endian define if(MSVC) @@ -1022,6 +1050,9 @@ if(WITH_OPENVDB) list(APPEND OPENVDB_DEFINITIONS -DOPENVDB_3_ABI_COMPATIBLE) endif() + # OpenVDB headers use deprecated TBB headers, silence warning. + list(APPEND OPENVDB_DEFINITIONS -DTBB_SUPPRESS_DEPRECATED_MESSAGES=1) + list(APPEND OPENVDB_INCLUDE_DIRS ${BOOST_INCLUDE_DIR} ${TBB_INCLUDE_DIRS} @@ -1184,6 +1215,7 @@ if(WITH_OPENMP) if(NOT WITH_OPENMP_STATIC) string(APPEND CMAKE_C_FLAGS " ${OpenMP_C_FLAGS}") string(APPEND CMAKE_CXX_FLAGS " ${OpenMP_CXX_FLAGS}") + string(APPEND CMAKE_EXE_LINKER_FLAGS " ${OpenMP_LINKER_FLAGS}") else() # Typically avoid adding flags as defines but we can't # pass OpenMP flags to the linker for static builds, meaning @@ -1437,6 +1469,7 @@ if(CMAKE_COMPILER_IS_GNUCC) # gcc 4.2 gives annoying warnings on every file with this if(NOT "${CMAKE_C_COMPILER_VERSION}" VERSION_LESS "4.3") ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_UNINITIALIZED -Wuninitialized) + ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_UNINITIALIZED -Wuninitialized) endif() # versions before gcc4.6 give many BLI_math warnings @@ -1501,11 +1534,13 @@ if(CMAKE_COMPILER_IS_GNUCC) ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_FORMAT -Wno-format) ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_SWITCH -Wno-switch) ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_UNUSED_VARIABLE -Wno-unused-variable) + ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_UNUSED_VARIABLE -Wno-uninitialized) ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_CLASS_MEMACCESS -Wno-class-memaccess) ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_COMMENT -Wno-comment) ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_UNUSED_TYPEDEFS -Wno-unused-local-typedefs) ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_UNUSED_VARIABLE -Wno-unused-variable) + ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_UNUSED_VARIABLE -Wno-uninitialized) if(CMAKE_COMPILER_IS_GNUCC AND (NOT "${CMAKE_C_COMPILER_VERSION}" VERSION_LESS "7.0")) ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_IMPLICIT_FALLTHROUGH -Wno-implicit-fallthrough) @@ -1849,6 +1884,7 @@ if(FIRST_RUN) info_cfg_text("Build Options:") info_cfg_option(WITH_ALEMBIC) info_cfg_option(WITH_BULLET) + info_cfg_option(WITH_CLANG) info_cfg_option(WITH_CYCLES) info_cfg_option(WITH_FFTW3) info_cfg_option(WITH_FREESTYLE) diff --git a/GNUmakefile b/GNUmakefile index 98463891407..41902809e30 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -26,26 +26,31 @@ define HELP_TEXT -Convenience Targets +Blender Convenience Targets Provided for building Blender, (multiple at once can be used). * debug: Build a debug binary. * full: Enable all supported dependencies & options. * lite: Disable non essential features for a smaller binary and faster build. - * release Complete build with all options enabled including CUDA and Optix, matching the releases on blender.org + * release: Complete build with all options enabled including CUDA and Optix, matching the releases on blender.org * headless: Build without an interface (renderfarm or server automation). * cycles: Build Cycles standalone only, without Blender. * bpy: Build as a python module which can be loaded from python directly. - * deps: Build library dependencies (intended only for platform maintainers). - * developer: Enable faster builds, error checking and tests, recommended for developers. - * config: Run cmake configuration tool to set build options. * ninja: Use ninja build tool for faster builds. * ccache: Use ccache for faster rebuilds. Note: passing the argument 'BUILD_DIR=path' when calling make will override the default build dir. Note: passing the argument 'BUILD_CMAKE_ARGS=args' lets you add cmake arguments. +Other Convenience Targets + Provided for other building operations. + + * config: Run cmake configuration tool to set build options. + * deps: Build library dependencies (intended only for platform maintainers). + + The existance of locally build dependancies overrides the pre-built dependencies from subversion. + These must be manually removed from '../lib/' to go back to using the pre-compiled libraries. Project Files Generate project files for development environments. @@ -85,12 +90,15 @@ Static Source Code Checking * check_descriptions: Check for duplicate/invalid descriptions. Spell Checkers + This runs the spell checker from the developer tools repositor. * check_spelling_c: Check for spelling errors (C/C++ only), * check_spelling_osl: Check for spelling errors (OSL only). * check_spelling_py: Check for spelling errors (Python only). - Note that spell checkers can take a 'CHECK_SPELLING_CACHE' filepath argument, + Note: an additional word-list is maintained at: 'source/tools/check_source/check_spelling_c_config.py' + + Note: that spell checkers can take a 'CHECK_SPELLING_CACHE' filepath argument, so re-running does not need to re-check unchanged files. Example: @@ -123,7 +131,7 @@ Utilities * update: updates git and all submodules - * format + * format: Format source code using clang (uses PATHS if passed in). For example:: make format PATHS="source/blender/blenlib source/blender/blenkernel" diff --git a/build_files/build_environment/CMakeLists.txt b/build_files/build_environment/CMakeLists.txt index 672f5820a16..aa6b1cbe539 100644 --- a/build_files/build_environment/CMakeLists.txt +++ b/build_files/build_environment/CMakeLists.txt @@ -70,9 +70,7 @@ include(cmake/cuew.cmake) include(cmake/opensubdiv.cmake) include(cmake/sdl.cmake) include(cmake/opencollada.cmake) -include(cmake/opencolorio.cmake) include(cmake/llvm.cmake) -include(cmake/clang.cmake) if(APPLE) include(cmake/openmp.cmake) endif() @@ -87,34 +85,38 @@ include(cmake/tbb.cmake) include(cmake/openvdb.cmake) include(cmake/nanovdb.cmake) include(cmake/python.cmake) +option(USE_PIP_NUMPY "Install NumPy using pip wheel instead of building from source" OFF) +if(APPLE AND ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "x86_64")) + set(USE_PIP_NUMPY ON) +else() + include(cmake/numpy.cmake) +endif() include(cmake/python_site_packages.cmake) include(cmake/package_python.cmake) -include(cmake/numpy.cmake) include(cmake/usd.cmake) include(cmake/potrace.cmake) include(cmake/haru.cmake) # Boost needs to be included after python.cmake due to the PYTHON_BINARY variable being needed. include(cmake/boost.cmake) include(cmake/pugixml.cmake) -if((NOT APPLE) OR ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "x86_64")) - include(cmake/ispc.cmake) - include(cmake/openimagedenoise.cmake) - include(cmake/embree.cmake) -endif() +include(cmake/ispc.cmake) +include(cmake/openimagedenoise.cmake) +include(cmake/embree.cmake) if(NOT APPLE) include(cmake/xr_openxr.cmake) endif() -if(WITH_WEBP) - include(cmake/webp.cmake) +# OpenColorIO and dependencies. +include(cmake/expat.cmake) +include(cmake/yamlcpp.cmake) +include(cmake/opencolorio.cmake) + +if(APPLE AND ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")) + include(cmake/sse2neon.cmake) endif() -if(WIN32) - # OCIO deps - include(cmake/tinyxml.cmake) - include(cmake/yamlcpp.cmake) - # LCMS is an OCIO dep, but only if you build the apps, leaving it here for convenience - # include(cmake/lcms.cmake) +if(WITH_WEBP) + include(cmake/webp.cmake) endif() if(NOT WIN32 OR ENABLE_MINGW64) diff --git a/build_files/build_environment/cmake/alembic.cmake b/build_files/build_environment/cmake/alembic.cmake index 94b7b56d58f..d865382eff3 100644 --- a/build_files/build_environment/cmake/alembic.cmake +++ b/build_files/build_environment/cmake/alembic.cmake @@ -19,16 +19,6 @@ set(ALEMBIC_EXTRA_ARGS -DBUILDSTATIC=ON -DLINKSTATIC=ON - -DALEMBIC_LIB_USES_BOOST=ON - -DBoost_COMPILER:STRING=${BOOST_COMPILER_STRING} - -DBoost_USE_MULTITHREADED=ON - -DUSE_STATIC_BOOST=On - -DBoost_USE_STATIC_LIBS=ON - -DBoost_USE_STATIC_RUNTIME=OFF - -DBoost_DEBUG=ON - -DBOOST_ROOT=${LIBDIR}/boost - -DBoost_NO_SYSTEM_PATHS=ON - -DBoost_NO_BOOST_CMAKE=ON -DILMBASE_ROOT=${LIBDIR}/openexr -DALEMBIC_ILMBASE_INCLUDE_DIRECTORY=${LIBDIR}/openexr/include/OpenEXR -DALEMBIC_ILMBASE_HALF_LIB=${LIBDIR}/openexr/lib/${LIBPREFIX}Half${OPENEXR_VERSION_POSTFIX}${LIBEXT} @@ -81,7 +71,6 @@ endif() add_dependencies( external_alembic - external_boost external_zlib external_openexr ) diff --git a/build_files/build_environment/cmake/boost.cmake b/build_files/build_environment/cmake/boost.cmake index d01c62b679c..3a90add9539 100644 --- a/build_files/build_environment/cmake/boost.cmake +++ b/build_files/build_environment/cmake/boost.cmake @@ -23,7 +23,7 @@ if(WIN32) set(BOOST_COMPILER_STRING -vc141) set(BOOST_CONFIGURE_COMMAND bootstrap.bat) - set(BOOST_BUILD_COMMAND bjam) + set(BOOST_BUILD_COMMAND b2) set(BOOST_BUILD_OPTIONS runtime-link=shared ) set(BOOST_HARVEST_CMD ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/boost/lib/ ${HARVEST_TARGET}/boost/lib/ ) if(BUILD_MODE STREQUAL Release) diff --git a/build_files/build_environment/cmake/check_software.cmake b/build_files/build_environment/cmake/check_software.cmake index 50b98ac447c..b942e32c8b7 100644 --- a/build_files/build_environment/cmake/check_software.cmake +++ b/build_files/build_environment/cmake/check_software.cmake @@ -33,6 +33,16 @@ if(UNIX) yasm ) + if(NOT APPLE) + set(_required_software + ${_required_software} + + # Needed for Mesa. + meson + ninja + ) + endif() + foreach(_software ${_required_software}) find_program(_software_find NAMES ${_software}) if(NOT _software_find) @@ -60,7 +70,7 @@ if(UNIX) " ${_software_missing}\n" "\n" "On Debian and Ubuntu:\n" - " apt install autoconf automake libtool yasm tcl\n" + " apt install autoconf automake libtool yasm tcl ninja-build meson python3-mako\n" "\n" "On macOS (with homebrew):\n" " brew install autoconf automake bison libtool pkg-config yasm\n" diff --git a/build_files/build_environment/cmake/clang.cmake b/build_files/build_environment/cmake/clang.cmake deleted file mode 100644 index d8d83619e1a..00000000000 --- a/build_files/build_environment/cmake/clang.cmake +++ /dev/null @@ -1,104 +0,0 @@ -# ***** BEGIN GPL LICENSE BLOCK ***** -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# ***** END GPL LICENSE BLOCK ***** - -set(CLANG_EXTRA_ARGS - -DLLVM_DIR="${LIBDIR}/llvm/lib/cmake/llvm/" - -DLLVM_USE_CRT_RELEASE=MD - -DLLVM_USE_CRT_DEBUG=MDd - -DLLVM_CONFIG=${LIBDIR}/llvm/bin/llvm-config -) - -set(BUILD_CLANG_TOOLS OFF) - -if(WIN32) - set(CLANG_GENERATOR "Ninja") -else() - set(CLANG_GENERATOR "Unix Makefiles") -endif() - -if(APPLE) - set(BUILD_CLANG_TOOLS ON) - set(CLANG_EXTRA_ARGS ${CLANG_EXTRA_ARGS} - -DLIBXML2_LIBRARY=${LIBDIR}/xml2/lib/libxml2.a - ) -endif() - -if(BUILD_CLANG_TOOLS) - # ExternalProject_Add does not allow multiple tarballs to be - # downloaded. Work around this by having an empty build action - # for the extra tools, and referring the clang build to the location - # of the clang-tools-extra source. - ExternalProject_Add(external_clang_tools - URL ${CLANG_TOOLS_URI} - DOWNLOAD_DIR ${DOWNLOAD_DIR} - URL_HASH MD5=${CLANG_TOOLS_HASH} - INSTALL_DIR ${LIBDIR}/clang_tools - PREFIX ${BUILD_DIR}/clang_tools - CONFIGURE_COMMAND echo "." - BUILD_COMMAND echo "." - INSTALL_COMMAND echo "." - ) - list(APPEND CLANG_EXTRA_ARGS - -DLLVM_EXTERNAL_CLANG_TOOLS_EXTRA_SOURCE_DIR=${BUILD_DIR}/clang_tools/src/external_clang_tools/ - ) -endif() - -ExternalProject_Add(external_clang - URL ${CLANG_URI} - DOWNLOAD_DIR ${DOWNLOAD_DIR} - URL_HASH MD5=${CLANG_HASH} - PREFIX ${BUILD_DIR}/clang - CMAKE_GENERATOR ${CLANG_GENERATOR} - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/clang ${DEFAULT_CMAKE_FLAGS} ${CLANG_EXTRA_ARGS} - INSTALL_DIR ${LIBDIR}/clang -) - -if(MSVC) - if(BUILD_MODE STREQUAL Release) - set(CLANG_HARVEST_COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/clang/ ${HARVEST_TARGET}/llvm/) - else() - set(CLANG_HARVEST_COMMAND - ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/clang/lib/ ${HARVEST_TARGET}/llvm/debug/lib/ - ) - endif() - ExternalProject_Add_Step(external_clang after_install - COMMAND ${CLANG_HARVEST_COMMAND} - DEPENDEES mkdir update patch download configure build install - ) -endif() - -add_dependencies( - external_clang - ll -) - -if(BUILD_CLANG_TOOLS) - # `external_clang_tools` is for downloading the source, not compiling it. - add_dependencies( - external_clang - external_clang_tools - ) -endif() - -# We currently do not build libxml2 on Windows. -if(NOT WIN32) - add_dependencies( - external_clang - external_xml2 - ) -endif() diff --git a/build_files/build_environment/cmake/embree.cmake b/build_files/build_environment/cmake/embree.cmake index 66a86cd5dbd..86b8256f98f 100644 --- a/build_files/build_environment/cmake/embree.cmake +++ b/build_files/build_environment/cmake/embree.cmake @@ -29,6 +29,7 @@ set(EMBREE_EXTRA_ARGS -DEMBREE_MAX_ISA=AVX2 -DEMBREE_TASKING_SYSTEM=TBB -DEMBREE_TBB_ROOT=${LIBDIR}/tbb + -DTBB_ROOT=${LIBDIR}/tbb -DTBB_STATIC_LIB=${TBB_STATIC_LIBRARY} ) @@ -46,15 +47,26 @@ else() set(EMBREE_BUILD_DIR) endif() -ExternalProject_Add(external_embree - URL ${EMBREE_URI} - DOWNLOAD_DIR ${DOWNLOAD_DIR} - URL_HASH MD5=${EMBREE_HASH} - PREFIX ${BUILD_DIR}/embree - PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/embree/src/external_embree < ${PATCH_DIR}/embree.diff - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/embree ${DEFAULT_CMAKE_FLAGS} ${EMBREE_EXTRA_ARGS} - INSTALL_DIR ${LIBDIR}/embree -) +if(APPLE AND ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")) + ExternalProject_Add(external_embree + GIT_REPOSITORY ${EMBREE_ARM_GIT} + GIT_TAG "blender-arm" + DOWNLOAD_DIR ${DOWNLOAD_DIR} + PREFIX ${BUILD_DIR}/embree + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/embree ${DEFAULT_CMAKE_FLAGS} ${EMBREE_EXTRA_ARGS} + INSTALL_DIR ${LIBDIR}/embree + ) +else() + ExternalProject_Add(external_embree + URL ${EMBREE_URI} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + URL_HASH MD5=${EMBREE_HASH} + PREFIX ${BUILD_DIR}/embree + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/embree/src/external_embree < ${PATCH_DIR}/embree.diff + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/embree ${DEFAULT_CMAKE_FLAGS} ${EMBREE_EXTRA_ARGS} + INSTALL_DIR ${LIBDIR}/embree + ) +endif() add_dependencies( external_embree diff --git a/build_files/build_environment/cmake/lcms.cmake b/build_files/build_environment/cmake/expat.cmake similarity index 66% rename from build_files/build_environment/cmake/lcms.cmake rename to build_files/build_environment/cmake/expat.cmake index c7019bc645e..001f3941de1 100644 --- a/build_files/build_environment/cmake/lcms.cmake +++ b/build_files/build_environment/cmake/expat.cmake @@ -16,16 +16,20 @@ # # ***** END GPL LICENSE BLOCK ***** -set(LCMS_EXTRA_ARGS +set(EXPAT_EXTRA_ARGS + -DEXPAT_BUILD_DOCS=OFF + -DEXPAT_BUILD_EXAMPLES=OFF + -DEXPAT_BUILD_TESTS=OFF + -DEXPAT_BUILD_TOOLS=OFF + -DEXPAT_SHARED_LIBS=OFF ) -ExternalProject_Add(external_lcms - URL ${LCMS_URI} +ExternalProject_Add(external_expat + URL ${EXPAT_URI} DOWNLOAD_DIR ${DOWNLOAD_DIR} - URL_HASH MD5=${LCMS_HASH} - PREFIX ${BUILD_DIR}/lcms - # Patch taken from ocio. - PATCH_COMMAND ${CMAKE_COMMAND} -E copy ${PATCH_DIR}/cmakelists_lcms.txt ${BUILD_DIR}/lcms/src/external_lcms/CMakeLists.txt - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/lcms ${DEFAULT_CMAKE_FLAGS} ${LCMS_EXTRA_ARGS} - INSTALL_DIR ${LIBDIR}/lcms + URL_HASH MD5=${EXPAT_HASH} + PREFIX ${BUILD_DIR}/expat + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/expat ${DEFAULT_CMAKE_FLAGS} ${EXPAT_EXTRA_ARGS} + INSTALL_DIR ${LIBDIR}/expat + SOURCE_SUBDIR expat ) diff --git a/build_files/build_environment/cmake/harvest.cmake b/build_files/build_environment/cmake/harvest.cmake index 6785b727a69..23d0dcbab7b 100644 --- a/build_files/build_environment/cmake/harvest.cmake +++ b/build_files/build_environment/cmake/harvest.cmake @@ -97,18 +97,21 @@ harvest(jemalloc/lib jemalloc/lib "*.a") harvest(jpg/include jpeg/include "*.h") harvest(jpg/lib jpeg/lib "libjpeg.a") harvest(lame/lib ffmpeg/lib "*.a") -harvest(clang/bin llvm/bin "clang-format") +harvest(llvm/bin llvm/bin "clang-format") if(BUILD_CLANG_TOOLS) - harvest(clang/bin llvm/bin "clang-tidy") - harvest(clang/share/clang llvm/share "run-clang-tidy.py") + harvest(llvm/bin llvm/bin "clang-tidy") + harvest(llvm/share/clang llvm/share "run-clang-tidy.py") endif() -harvest(clang/include llvm/include "*") harvest(llvm/include llvm/include "*") harvest(llvm/bin llvm/bin "llvm-config") harvest(llvm/lib llvm/lib "libLLVM*.a") +harvest(llvm/lib llvm/lib "libclang*.a") if(APPLE) harvest(openmp/lib openmp/lib "*") harvest(openmp/include openmp/include "*.h") + if("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64") + harvest(sse2neon sse2neon "*.h") + endif() endif() harvest(ogg/lib ffmpeg/lib "*.a") harvest(openal/include openal/include "*.h") @@ -139,12 +142,10 @@ harvest(openimageio/bin openimageio/bin "maketx") harvest(openimageio/bin openimageio/bin "oiiotool") harvest(openimageio/include openimageio/include "*") harvest(openimageio/lib openimageio/lib "*.a") -if((NOT APPLE) OR ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "x86_64")) - harvest(openimagedenoise/include openimagedenoise/include "*") - harvest(openimagedenoise/lib openimagedenoise/lib "*.a") - harvest(embree/include embree/include "*.h") - harvest(embree/lib embree/lib "*.a") -endif() +harvest(openimagedenoise/include openimagedenoise/include "*") +harvest(openimagedenoise/lib openimagedenoise/lib "*.a") +harvest(embree/include embree/include "*.h") +harvest(embree/lib embree/lib "*.a") harvest(openjpeg/include/openjpeg-2.3 openjpeg/include "*.h") harvest(openjpeg/lib openjpeg/lib "*.a") harvest(opensubdiv/include opensubdiv/include "*.h") @@ -157,12 +158,12 @@ harvest(xr_openxr_sdk/lib xr_openxr_sdk/lib "*.a") harvest(osl/bin osl/bin "oslc") harvest(osl/include osl/include "*.h") harvest(osl/lib osl/lib "*.a") -harvest(osl/shaders osl/shaders "*.h") +harvest(osl/share/OSL/shaders osl/share/OSL/shaders "*.h") harvest(png/include png/include "*.h") harvest(png/lib png/lib "*.a") harvest(pugixml/include pugixml/include "*.hpp") harvest(pugixml/lib pugixml/lib "*.a") -harvest(python/bin python/bin "python${PYTHON_SHORT_VERSION}m") +harvest(python/bin python/bin "python${PYTHON_SHORT_VERSION}") harvest(python/include python/include "*h") harvest(python/lib python/lib "*") harvest(sdl/include/SDL2 sdl/include "*.h") @@ -192,7 +193,7 @@ harvest(haru/lib haru/lib "*.a") if(UNIX AND NOT APPLE) harvest(libglu/lib mesa/lib "*.so*") - harvest(mesa/lib mesa/lib "*.so*") + harvest(mesa/lib64 mesa/lib "*.so*") endif() endif() diff --git a/build_files/build_environment/cmake/ispc.cmake b/build_files/build_environment/cmake/ispc.cmake index 56c3cecae17..dd6cf5a7d40 100644 --- a/build_files/build_environment/cmake/ispc.cmake +++ b/build_files/build_environment/cmake/ispc.cmake @@ -21,37 +21,42 @@ if(WIN32) -DFLEX_EXECUTABLE=${LIBDIR}/flexbison/win_flex.exe -DBISON_EXECUTABLE=${LIBDIR}/flexbison/win_bison.exe -DM4_EXECUTABLE=${DOWNLOAD_DIR}/mingw/mingw64/msys/1.0/bin/m4.exe + -DARM_ENABLED=Off ) elseif(APPLE) - # Use bison installed via Homebrew. - # The one which comes which Xcode toolset is too old. + # Use bison and flex installed via Homebrew. + # The ones that come with Xcode toolset are too old. if("${CMAKE_HOST_SYSTEM_PROCESSOR}" STREQUAL "arm64") - set(HOMEBREW_LOCATION "/opt/homebrew") + set(ISPC_EXTRA_ARGS_APPLE + -DBISON_EXECUTABLE=/opt/homebrew/opt/bison/bin/bison + -DFLEX_EXECUTABLE=/opt/homebrew/opt/flex/bin/flex + -DARM_ENABLED=On + ) else() - set(HOMEBREW_LOCATION "/usr/local") + set(ISPC_EXTRA_ARGS_APPLE + -DBISON_EXECUTABLE=/usr/local/opt/bison/bin/bison + -DARM_ENABLED=Off + ) endif() - set(ISPC_EXTRA_ARGS_APPLE - -DBISON_EXECUTABLE=${HOMEBREW_LOCATION}/opt/bison/bin/bison - ) elseif(UNIX) set(ISPC_EXTRA_ARGS_UNIX - -DCMAKE_C_COMPILER=${LIBDIR}/clang/bin/clang - -DCMAKE_CXX_COMPILER=${LIBDIR}/clang/bin/clang++ + -DCMAKE_C_COMPILER=${LIBDIR}/llvm/bin/clang + -DCMAKE_CXX_COMPILER=${LIBDIR}/llvm/bin/clang++ + -DARM_ENABLED=Off ) endif() set(ISPC_EXTRA_ARGS - -DARM_ENABLED=Off -DISPC_NO_DUMPS=On -DISPC_INCLUDE_EXAMPLES=Off -DISPC_INCLUDE_TESTS=Off -DLLVM_ROOT=${LIBDIR}/llvm/lib/cmake/llvm -DLLVM_LIBRARY_DIR=${LIBDIR}/llvm/lib - -DCLANG_EXECUTABLE=${LIBDIR}/clang/bin/clang - -DCLANGPP_EXECUTABLE=${LIBDIR}/clang/bin/clang++ + -DCLANG_EXECUTABLE=${LIBDIR}/llvm/bin/clang + -DCLANGPP_EXECUTABLE=${LIBDIR}/llvm/bin/clang++ -DISPC_INCLUDE_TESTS=Off - -DCLANG_LIBRARY_DIR=${LIBDIR}/clang/lib - -DCLANG_INCLUDE_DIRS=${LIBDIR}/clang/include + -DCLANG_LIBRARY_DIR=${LIBDIR}/llvm/lib + -DCLANG_INCLUDE_DIRS=${LIBDIR}/llvm/include ${ISPC_EXTRA_ARGS_WIN} ${ISPC_EXTRA_ARGS_APPLE} ${ISPC_EXTRA_ARGS_UNIX} @@ -70,7 +75,6 @@ ExternalProject_Add(external_ispc add_dependencies( external_ispc ll - external_clang ) if(WIN32) diff --git a/build_files/build_environment/cmake/llvm.cmake b/build_files/build_environment/cmake/llvm.cmake index 8c9a6076068..da2f7364e4a 100644 --- a/build_files/build_environment/cmake/llvm.cmake +++ b/build_files/build_environment/cmake/llvm.cmake @@ -17,11 +17,20 @@ # ***** END GPL LICENSE BLOCK ***** if(APPLE AND "${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64") - set(LLVM_TARGETS AArch64) + set(LLVM_TARGETS AArch64$ARM) else() set(LLVM_TARGETS X86) endif() +if(APPLE) + set(LLVM_XML2_ARGS + -DLIBXML2_LIBRARY=${LIBDIR}/xml2/lib/libxml2.a + ) + set(LLVM_BUILD_CLANG_TOOLS_EXTRA ^^clang-tools-extra) + set(BUILD_CLANG_TOOLS ON) +endif() + + set(LLVM_EXTRA_ARGS -DLLVM_USE_CRT_RELEASE=MD -DLLVM_USE_CRT_DEBUG=MDd @@ -31,6 +40,8 @@ set(LLVM_EXTRA_ARGS -DLLVM_ENABLE_TERMINFO=OFF -DLLVM_BUILD_LLVM_C_DYLIB=OFF -DLLVM_ENABLE_UNWIND_TABLES=OFF + -DLLVM_ENABLE_PROJECTS=clang${LLVM_BUILD_CLANG_TOOLS_EXTRA} + ${LLVM_XML2_ARGS} ) if(WIN32) @@ -45,7 +56,9 @@ ExternalProject_Add(ll DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH MD5=${LLVM_HASH} CMAKE_GENERATOR ${LLVM_GENERATOR} + LIST_SEPARATOR ^^ PREFIX ${BUILD_DIR}/ll + SOURCE_SUBDIR llvm PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/ll/src/ll < ${PATCH_DIR}/llvm.diff CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/llvm ${DEFAULT_CMAKE_FLAGS} ${LLVM_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/llvm @@ -65,3 +78,11 @@ if(MSVC) DEPENDEES mkdir update patch download configure build install ) endif() + +# We currently do not build libxml2 on Windows. +if(APPLE) + add_dependencies( + ll + external_xml2 + ) +endif() diff --git a/build_files/build_environment/cmake/mesa.cmake b/build_files/build_environment/cmake/mesa.cmake index 6994d1c5813..e9782a0976f 100644 --- a/build_files/build_environment/cmake/mesa.cmake +++ b/build_files/build_environment/cmake/mesa.cmake @@ -20,19 +20,36 @@ set(MESA_CFLAGS "-static-libgcc") set(MESA_CXXFLAGS "-static-libgcc -static-libstdc++ -Bstatic -lstdc++ -Bdynamic -l:libstdc++.a") set(MESA_LDFLAGS "-L${LIBDIR}/zlib/lib -pthread -static-libgcc -static-libstdc++ -Bstatic -lstdc++ -Bdynamic -l:libstdc++.a -l:libz_pic.a") +# The 'native-file', used for overrides with the meson build system. +# meson does not provide a way to do this using command line arguments. +# +# Note that we can't output to "${BUILD_DIR}/mesa/src/external_mesa" as +# it doesn't exist when CMake first executes. +file(WRITE ${BUILD_DIR}/mesa/tmp/native-file.ini "\ +[binaries] +llvm-config = '${LIBDIR}/llvm/bin/llvm-config'" +) + set(MESA_EXTRA_FLAGS - CFLAGS=${MESA_CFLAGS} - CXXFLAGS=${MESA_CXXFLAGS} - LDFLAGS=${MESA_LDFLAGS} - --enable-glx=gallium-xlib - --with-gallium-drivers=swrast - --disable-dri - --disable-gbm - --disable-egl - --disable-gles1 - --disable-gles2 - --disable-llvm-shared-libs - --with-llvm-prefix=${LIBDIR}/llvm + -Dbuildtype=release + -Dc_args=${MESA_CFLAGS} + -Dcpp_args=${MESA_CXXFLAGS} + -Dc_link_args=${MESA_LDFLAGS} + -Dcpp_link_args=${MESA_LDFLAGS} + -Dglx=gallium-xlib + -Dgallium-drivers=swrast + -Ddri-drivers= + -Dvulkan-drivers= + -Dgbm=disabled + -Degl=disabled + -Dgles1=disabled + -Dgles2=disabled + -Dshared-llvm=disabled + # Without this, the build fails when: `wayland-scanner` is not found. + # At some point we will likely want to support Wayland. + # Disable for now since it's not officially supported. + -Dplatforms=x11 + --native-file ${BUILD_DIR}/mesa/tmp/native-file.ini ) ExternalProject_Add(external_mesa @@ -42,9 +59,9 @@ ExternalProject_Add(external_mesa PREFIX ${BUILD_DIR}/mesa CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/mesa/src/external_mesa/ && - ${CONFIGURE_COMMAND_NO_TARGET} --prefix=${LIBDIR}/mesa ${MESA_EXTRA_FLAGS} - BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/mesa/src/external_mesa/ && make -j${MAKE_THREADS} - INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/mesa/src/external_mesa/ && make install + meson ${BUILD_DIR}/mesa/src/external_mesa-build --prefix=${LIBDIR}/mesa ${MESA_EXTRA_FLAGS} + BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/mesa/src/external_mesa-build && ninja -j${MAKE_THREADS} + INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/mesa/src/external_mesa-build && ninja install INSTALL_DIR ${LIBDIR}/mesa ) diff --git a/build_files/build_environment/cmake/nasm.cmake b/build_files/build_environment/cmake/nasm.cmake index 51d7ebd8830..37a57273bfe 100644 --- a/build_files/build_environment/cmake/nasm.cmake +++ b/build_files/build_environment/cmake/nasm.cmake @@ -22,8 +22,17 @@ ExternalProject_Add(external_nasm URL_HASH SHA256=${NASM_HASH} PREFIX ${BUILD_DIR}/nasm PATCH_COMMAND ${PATCH_CMD} --verbose -p 1 -N -d ${BUILD_DIR}/nasm/src/external_nasm < ${PATCH_DIR}/nasm.diff - CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/nasm/src/external_nasm/ && ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/nasm - BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/nasm/src/external_nasm/ && make -j${MAKE_THREADS} + CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/nasm/src/external_nasm/ && ./autogen.sh && ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/nasm + BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/nasm/src/external_nasm/ && make -j${MAKE_THREADS} && make manpages INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/nasm/src/external_nasm/ && make install INSTALL_DIR ${LIBDIR}/nasm ) + +if(UNIX) + # `touch nasm.1 ndisasm.1` helps to create the manual pages files, even when + # local `asciidoc` and `xmlto` packages are not installed. + ExternalProject_Add_Step(external_nasm after_configure + COMMAND ${CMAKE_COMMAND} -E touch ${BUILD_DIR}/nasm/src/external_nasm/nasm.1 ${BUILD_DIR}/nasm/src/external_nasm/ndisasm.1 + DEPENDEES configure + ) +endif() diff --git a/build_files/build_environment/cmake/numpy.cmake b/build_files/build_environment/cmake/numpy.cmake index 03316a8fc63..7a1b00895f4 100644 --- a/build_files/build_environment/cmake/numpy.cmake +++ b/build_files/build_environment/cmake/numpy.cmake @@ -47,4 +47,5 @@ ExternalProject_Add(external_numpy add_dependencies( external_numpy external_python + external_python_site_packages ) diff --git a/build_files/build_environment/cmake/opencolorio.cmake b/build_files/build_environment/cmake/opencolorio.cmake index 4ad401800d0..87099a06d17 100644 --- a/build_files/build_environment/cmake/opencolorio.cmake +++ b/build_files/build_environment/cmake/opencolorio.cmake @@ -18,16 +18,22 @@ set(OPENCOLORIO_EXTRA_ARGS -DOCIO_BUILD_APPS=OFF - -DOCIO_BUILD_PYGLUE=OFF + -DOCIO_BUILD_PYTHON=OFF -DOCIO_BUILD_NUKE=OFF - -DOCIO_USE_BOOST_PTR=OFF - -DOCIO_BUILD_STATIC=ON - -DOCIO_BUILD_SHARED=OFF - -DOCIO_BUILD_TRUELIGHT=OFF + -DOCIO_BUILD_JAVA=OFF + -DBUILD_SHARED_LIBS=OFF -DOCIO_BUILD_DOCS=OFF - -DOCIO_BUILD_PYGLUE=OFF - -DOCIO_BUILD_JNIGLUE=OFF - -DOCIO_STATIC_JNIGLUE=OFF + -DOCIO_BUILD_TESTS=OFF + -DOCIO_BUILD_GPU_TESTS=OFF + -DOCIO_USE_SSE=ON + + # Manually build ext packages except for pystring, which does not have + # a CMake or autotools build system that we can easily use. + -DOCIO_INSTALL_EXT_PACKAGES=MISSING + -DHalf_ROOT=${LIBDIR}/openexr + -DHalf_STATIC_LIBRARY=ON + -Dexpat_ROOT=${LIBDIR}/expat + -Dyaml-cpp_ROOT=${LIBDIR}/yamlcpp ) if(APPLE AND NOT("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "x86_64")) @@ -38,30 +44,11 @@ if(APPLE AND NOT("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "x86_64")) endif() if(WIN32) - set(OCIO_PATCH opencolorio_win.diff) set(OPENCOLORIO_EXTRA_ARGS ${OPENCOLORIO_EXTRA_ARGS} - -DOCIO_BUILD_TESTS=OFF - -DOCIO_USE_SSE=ON -DOCIO_INLINES_HIDDEN=OFF - -DOCIO_PYGLUE_LINK=OFF - -DOCIO_PYGLUE_RESPECT_ABI=OFF - -DOCIO_PYGLUE_SONAME=OFF - -DOCIO_PYGLUE_LIB_PREFIX=OFF - -DUSE_EXTERNAL_TINYXML=ON - -DTINYXML_INCLUDE_DIR=${LIBDIR}/tinyxml/include - -DTINYXML_LIBRARY=${LIBDIR}/tinyxml/lib/tinyxml${libext} - -DUSE_EXTERNAL_YAML=ON - -DYAML_CPP_FOUND=ON - -DYAML_CPP_VERSION=${YAMLCPP_VERSION} - -DUSE_EXTERNAL_LCMS=ON - -DINC_1=${LIBDIR}/tinyxml/include - -DINC_2=${LIBDIR}/yamlcpp/include - # Lie because ocio cmake is demanding boost even though it is not needed. - -DYAML_CPP_VERSION=0.5.0 ) else() - set(OCIO_PATCH opencolorio.diff) set(OPENCOLORIO_EXTRA_ARGS ${OPENCOLORIO_EXTRA_ARGS} ) @@ -72,48 +59,43 @@ ExternalProject_Add(external_opencolorio DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH MD5=${OPENCOLORIO_HASH} PREFIX ${BUILD_DIR}/opencolorio - PATCH_COMMAND ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/opencolorio/src/external_opencolorio < ${PATCH_DIR}/${OCIO_PATCH} + PATCH_COMMAND ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/opencolorio/src/external_opencolorio < ${PATCH_DIR}/opencolorio.diff CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/opencolorio ${DEFAULT_CMAKE_FLAGS} ${OPENCOLORIO_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/opencolorio ) -if(NOT WIN32) - add_custom_command( - OUTPUT ${LIBDIR}/opencolorio/lib/libtinyxml.a - COMMAND cp ${BUILD_DIR}/opencolorio/src/external_opencolorio-build/ext/dist/lib/libtinyxml.a ${LIBDIR}/opencolorio/lib/libtinyxml.a - COMMAND cp ${BUILD_DIR}/opencolorio/src/external_opencolorio-build/ext/dist/lib/libyaml-cpp.a ${LIBDIR}/opencolorio/lib/libyaml-cpp.a - ) - add_custom_target(external_opencolorio_extra ALL DEPENDS external_opencolorio ${LIBDIR}/opencolorio/lib/libtinyxml.a) -endif() - add_dependencies( external_opencolorio - external_boost + external_yamlcpp + external_expat + external_openexr ) if(WIN32) - add_dependencies( - external_opencolorio - external_tinyxml - external_yamlcpp - - ) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_opencolorio after_install COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/opencolorio/include ${HARVEST_TARGET}/opencolorio/include - COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/opencolorio/lib/static ${HARVEST_TARGET}/opencolorio/lib + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/opencolorio/lib ${HARVEST_TARGET}/opencolorio/lib COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/yamlcpp/lib/libyaml-cppmd.lib ${HARVEST_TARGET}/opencolorio/lib/libyaml-cpp.lib - COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tinyxml/lib/tinyxml.lib ${HARVEST_TARGET}/opencolorio/lib/tinyxml.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/expat/lib/libexpatMD.lib ${HARVEST_TARGET}/opencolorio/lib/libexpatMD.lib + COMMAND ${CMAKE_COMMAND} -E copy ${BUILD_DIR}/opencolorio/src/external_opencolorio-build/ext/dist/lib/pystring.lib ${HARVEST_TARGET}/opencolorio/lib/pystring.lib DEPENDEES install ) endif() if(BUILD_MODE STREQUAL Debug) ExternalProject_Add_Step(external_opencolorio after_install - COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/opencolorio/lib/static/Opencolorio.lib ${HARVEST_TARGET}/opencolorio/lib/OpencolorIO_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/opencolorio/lib/Opencolorio.lib ${HARVEST_TARGET}/opencolorio/lib/OpencolorIO_d.lib COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/yamlcpp/lib/libyaml-cppmdd.lib ${HARVEST_TARGET}/opencolorio/lib/libyaml-cpp_d.lib - COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tinyxml/lib/tinyxml.lib ${HARVEST_TARGET}/opencolorio/lib/tinyxml_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/expat/lib/libexpatdMD.lib ${HARVEST_TARGET}/opencolorio/lib/libexpatdMD.lib + COMMAND ${CMAKE_COMMAND} -E copy ${BUILD_DIR}/opencolorio/src/external_opencolorio-build/ext/dist/lib/pystring.lib ${HARVEST_TARGET}/opencolorio/lib/pystring_d.lib DEPENDEES install ) endif() - +else() + ExternalProject_Add_Step(external_opencolorio after_install + COMMAND cp ${LIBDIR}/yamlcpp/lib/libyaml-cpp.a ${LIBDIR}/opencolorio/lib/ + COMMAND cp ${LIBDIR}/expat/lib/libexpat.a ${LIBDIR}/opencolorio/lib/ + COMMAND cp ${BUILD_DIR}/opencolorio/src/external_opencolorio-build/ext/dist/lib/libpystring.a ${LIBDIR}/opencolorio/lib/ + DEPENDEES install + ) endif() diff --git a/build_files/build_environment/cmake/openimagedenoise.cmake b/build_files/build_environment/cmake/openimagedenoise.cmake index 65f12199952..7947fc31470 100644 --- a/build_files/build_environment/cmake/openimagedenoise.cmake +++ b/build_files/build_environment/cmake/openimagedenoise.cmake @@ -45,6 +45,7 @@ ExternalProject_Add(external_openimagedenoise DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH MD5=${OIDN_HASH} PREFIX ${BUILD_DIR}/openimagedenoise + PATCH_COMMAND ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/openimagedenoise/src/external_openimagedenoise < ${PATCH_DIR}/oidn.diff CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openimagedenoise ${DEFAULT_CMAKE_FLAGS} ${OIDN_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/openimagedenoise ) diff --git a/build_files/build_environment/cmake/openmp.cmake b/build_files/build_environment/cmake/openmp.cmake index ec0756a6693..92a96b4dd8b 100644 --- a/build_files/build_environment/cmake/openmp.cmake +++ b/build_files/build_environment/cmake/openmp.cmake @@ -30,5 +30,5 @@ ExternalProject_Add(external_openmp add_dependencies( external_openmp - external_clang + ll ) diff --git a/build_files/build_environment/cmake/openvdb.cmake b/build_files/build_environment/cmake/openvdb.cmake index 2962f085e1b..704a8269c22 100644 --- a/build_files/build_environment/cmake/openvdb.cmake +++ b/build_files/build_environment/cmake/openvdb.cmake @@ -54,6 +54,8 @@ set(OPENVDB_EXTRA_ARGS -DOPENVDB_CORE_STATIC=${OPENVDB_STATIC} -DOPENVDB_BUILD_BINARIES=Off -DCMAKE_DEBUG_POSTFIX=_d + -DILMBASE_USE_STATIC_LIBS=On + -DOPENEXR_USE_STATIC_LIBS=On ) if(WIN32) diff --git a/build_files/build_environment/cmake/osl.cmake b/build_files/build_environment/cmake/osl.cmake index 118657461fe..0628130134b 100644 --- a/build_files/build_environment/cmake/osl.cmake +++ b/build_files/build_environment/cmake/osl.cmake @@ -19,12 +19,7 @@ if(WIN32) set(OSL_CMAKE_CXX_STANDARD_LIBRARIES "kernel32${LIBEXT} user32${LIBEXT} gdi32${LIBEXT} winspool${LIBEXT} shell32${LIBEXT} ole32${LIBEXT} oleaut32${LIBEXT} uuid${LIBEXT} comdlg32${LIBEXT} advapi32${LIBEXT} psapi${LIBEXT}") set(OSL_FLEX_BISON -DFLEX_EXECUTABLE=${LIBDIR}/flexbison/win_flex.exe -DBISON_EXECUTABLE=${LIBDIR}/flexbison/win_bison.exe) - set(OSL_OPENIMAGEIO_LIBRARY "${LIBDIR}/openimageio/lib/${LIBPREFIX}OpenImageIO${LIBEXT};${LIBDIR}/openimageio/lib/${LIBPREFIX}OpenImageIO_Util${LIBEXT};${LIBDIR}/png/lib/libpng16${LIBEXT};${LIBDIR}/jpg/lib/${LIBPREFIX}jpeg${LIBEXT};${LIBDIR}/tiff/lib/${LIBPREFIX}tiff${LIBEXT};${LIBDIR}/openexr/lib/${LIBPREFIX}IlmImf${OPENEXR_VERSION_POSTFIX}${LIBEXT}") - if("${CMAKE_SIZEOF_VOID_P}" EQUAL "4") - set(OSL_SIMD_FLAGS -DOIIO_NOSIMD=1 -DOIIO_SIMD=0) - else() - set(OSL_SIMD_FLAGS -DOIIO_NOSIMD=1 -DOIIO_SIMD=sse2) - endif() + set(OSL_SIMD_FLAGS -DOIIO_NOSIMD=1 -DOIIO_SIMD=sse2) SET(OSL_PLATFORM_FLAGS -DLINKSTATIC=ON) else() set(OSL_CMAKE_CXX_STANDARD_LIBRARIES) @@ -34,7 +29,6 @@ else() endif() set(OSL_ILMBASE_CUSTOM_LIBRARIES "${LIBDIR}/openexr/lib/Imath${OPENEXR_VERSION_POSTFIX}.lib^^${LIBDIR}/openexr/lib/Half{OPENEXR_VERSION_POSTFIX}.lib^^${LIBDIR}/openexr/lib/IlmThread${OPENEXR_VERSION_POSTFIX}.lib^^${LIBDIR}/openexr/lib/Iex${OPENEXR_VERSION_POSTFIX}.lib") -set(OSL_LLVM_LIBRARY "${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMAnalysis${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMAsmParser${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMAsmPrinter${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMBitReader${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMBitWriter${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMCodeGen${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMCore${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMDebugInfo${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMExecutionEngine${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMInstCombine${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMInstrumentation${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMInterpreter${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMJIT${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMLinker${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMMC${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMMCDisassembler${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMMCJIT${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMMCParser${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMObject${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMRuntimeDyld${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMScalarOpts${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMSelectionDAG${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMSupport${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMTableGen${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMTarget${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMTransformUtils${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMVectorize${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMX86AsmParser${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMX86AsmPrinter${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMX86CodeGen${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMX86Desc${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMX86Disassembler${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMX86Info${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMX86Utils${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMipa${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMipo${LIBEXT}") set(OSL_EXTRA_ARGS -DBoost_COMPILER:STRING=${BOOST_COMPILER_STRING} @@ -45,13 +39,8 @@ set(OSL_EXTRA_ARGS -DBOOST_LIBRARYDIR=${LIBDIR}/boost/lib/ -DBoost_NO_SYSTEM_PATHS=ON -DBoost_NO_BOOST_CMAKE=ON - -DLLVM_DIRECTORY=${LIBDIR}/llvm - -DLLVM_INCLUDES=${LIBDIR}/llvm/include - -DLLVM_LIB_DIR=${LIBDIR}/llvm/lib - -DLLVM_VERSION=3.4 - -DLLVM_LIBRARY=${OSL_LLVM_LIBRARY} - -DOPENEXR_HOME=${LIBDIR}/openexr/ - -DILMBASE_HOME=${LIBDIR}/openexr/ + -DOpenEXR_ROOT=${LIBDIR}/openexr/ + -DIlmBase_ROOT=${LIBDIR}/openexr/ -DILMBASE_INCLUDE_DIR=${LIBDIR}/openexr/include/ -DOPENEXR_HALF_LIBRARY=${LIBDIR}/openexr/lib/${LIBPREFIX}Half${OPENEXR_VERSION_POSTFIX}${LIBEXT} -DOPENEXR_IMATH_LIBRARY=${LIBDIR}/openexr/lib/${LIBPREFIX}Imath${OPENEXR_VERSION_POSTFIX}${LIBEXT} @@ -59,35 +48,32 @@ set(OSL_EXTRA_ARGS -DOPENEXR_IEX_LIBRARY=${LIBDIR}/openexr/lib/${LIBPREFIX}Iex${OPENEXR_VERSION_POSTFIX}${LIBEXT} -DOPENEXR_INCLUDE_DIR=${LIBDIR}/openexr/include/ -DOPENEXR_ILMIMF_LIBRARY=${LIBDIR}/openexr/lib/${LIBPREFIX}IlmImf${OPENEXR_VERSION_POSTFIX}${LIBEXT} + -DOpenImageIO_ROOT=${LIBDIR}/openimageio/ -DOSL_BUILD_TESTS=OFF -DOSL_BUILD_MATERIALX=OFF -DZLIB_LIBRARY=${LIBDIR}/zlib/lib/${ZLIB_LIBRARY} -DZLIB_INCLUDE_DIR=${LIBDIR}/zlib/include/ - -DOPENIMAGEIOHOME=${LIBDIR}/openimageio/ - -DOPENIMAGEIO_INCLUDE_DIR=${LIBDIR}/openimageio/include - -DOPENIMAGEIO_LIBRARY=${OSL_OPENIMAGEIO_LIBRARY} ${OSL_FLEX_BISON} -DCMAKE_CXX_STANDARD_LIBRARIES=${OSL_CMAKE_CXX_STANDARD_LIBRARIES} - -DBUILDSTATIC=ON + -DBUILD_SHARED_LIBS=OFF ${OSL_PLATFORM_FLAGS} - -DOSL_BUILD_PLUGINS=Off + -DOSL_BUILD_PLUGINS=OFF -DSTOP_ON_WARNING=OFF -DUSE_LLVM_BITCODE=OFF + -DLLVM_ROOT=${LIBDIR}/llvm/ + -DLLVM_DIRECTORY=${LIBDIR}/llvm/ -DUSE_PARTIO=OFF -DUSE_QT=OFF + -DUSE_Qt5=OFF -DINSTALL_DOCS=OFF ${OSL_SIMD_FLAGS} - -DPARTIO_LIBRARIES= - -DPUGIXML_HOME=${LIBDIR}/pugixml + -Dpugixml_ROOT=${LIBDIR}/pugixml + -DUSE_PYTHON=OFF ) -if(APPLE) - # Make symbol hiding consistent with OIIO which defaults to OFF, - # avoids linker warnings on macOS - set(OSL_EXTRA_ARGS - ${OSL_EXTRA_ARGS} - -DHIDE_SYMBOLS=OFF - ) +# Apple arm64 uses LLVM 11, LLVM 10+ requires C++14 +if (APPLE AND "${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64") + list(APPEND OSL_EXTRA_ARGS -DCMAKE_CXX_STANDARD=14) endif() ExternalProject_Add(external_osl @@ -105,7 +91,6 @@ add_dependencies( external_osl external_boost ll - external_clang external_openexr external_zlib external_flexbison diff --git a/build_files/build_environment/cmake/python.cmake b/build_files/build_environment/cmake/python.cmake index dfb2437d3cb..fa1498dda82 100644 --- a/build_files/build_environment/cmake/python.cmake +++ b/build_files/build_environment/cmake/python.cmake @@ -43,7 +43,7 @@ if(WIN32) PREFIX ${BUILD_DIR}/python CONFIGURE_COMMAND "" BUILD_COMMAND cd ${BUILD_DIR}/python/src/external_python/pcbuild/ && set IncludeTkinter=false && call build.bat -e -p x64 -c ${BUILD_MODE} - INSTALL_COMMAND ${PYTHON_BINARY_INTERNAL} ${PYTHON_SRC}/PC/layout/main.py -b ${PYTHON_SRC}/PCbuild/amd64 -s ${PYTHON_SRC} -t ${PYTHON_SRC}/tmp/ --include-underpth --include-stable --include-pip --include-dev --include-launchers --include-venv --include-symbols ${PYTHON_EXTRA_INSTLAL_FLAGS} --copy ${LIBDIR}/python + INSTALL_COMMAND ${PYTHON_BINARY_INTERNAL} ${PYTHON_SRC}/PC/layout/main.py -b ${PYTHON_SRC}/PCbuild/amd64 -s ${PYTHON_SRC} -t ${PYTHON_SRC}/tmp/ --include-stable --include-pip --include-dev --include-launchers --include-venv --include-symbols ${PYTHON_EXTRA_INSTLAL_FLAGS} --copy ${LIBDIR}/python ) else() @@ -74,13 +74,12 @@ else() endif() set(PYTHON_CONFIGURE_ENV ${CONFIGURE_ENV} && ${PYTHON_FUNC_CONFIGS}) set(PYTHON_BINARY ${BUILD_DIR}/python/src/external_python/python.exe) - set(PYTHON_PATCH ${PATCH_CMD} --verbose -p1 -d ${BUILD_DIR}/python/src/external_python < ${PATCH_DIR}/python_macos.diff) else() set(PYTHON_CONFIGURE_ENV ${CONFIGURE_ENV}) set(PYTHON_BINARY ${BUILD_DIR}/python/src/external_python/python) - set(PYTHON_PATCH ${PATCH_CMD} --verbose -p1 -d ${BUILD_DIR}/python/src/external_python < ${PATCH_DIR}/python_linux.diff) endif() - + # Link against zlib statically (Unix). Avoid rpath issues (macOS). + set(PYTHON_PATCH ${PATCH_CMD} --verbose -p1 -d ${BUILD_DIR}/python/src/external_python < ${PATCH_DIR}/python_unix.diff) set(PYTHON_CONFIGURE_EXTRA_ARGS "--with-openssl=${LIBDIR}/ssl") set(PYTHON_CFLAGS "-I${LIBDIR}/sqlite/include -I${LIBDIR}/bzip2/include -I${LIBDIR}/lzma/include -I${LIBDIR}/zlib/include") set(PYTHON_LDFLAGS "-L${LIBDIR}/ffi/lib -L${LIBDIR}/sqlite/lib -L${LIBDIR}/bzip2/lib -L${LIBDIR}/lzma/lib -L${LIBDIR}/zlib/lib") diff --git a/build_files/build_environment/cmake/python_site_packages.cmake b/build_files/build_environment/cmake/python_site_packages.cmake index d17f65a152b..2b75a6a244f 100644 --- a/build_files/build_environment/cmake/python_site_packages.cmake +++ b/build_files/build_environment/cmake/python_site_packages.cmake @@ -16,14 +16,27 @@ # # ***** END GPL LICENSE BLOCK ***** +if(WIN32 AND BUILD_MODE STREQUAL Debug) + set(SITE_PACKAGES_EXTRA --global-option build --global-option --debug) +endif() + ExternalProject_Add(external_python_site_packages DOWNLOAD_COMMAND "" CONFIGURE_COMMAND "" BUILD_COMMAND "" PREFIX ${BUILD_DIR}/site_packages - INSTALL_COMMAND ${PYTHON_BINARY} -m pip install idna==${IDNA_VERSION} chardet==${CHARDET_VERSION} urllib3==${URLLIB3_VERSION} certifi==${CERTIFI_VERSION} requests==${REQUESTS_VERSION} --no-binary :all: + INSTALL_COMMAND ${PYTHON_BINARY} -m pip install ${SITE_PACKAGES_EXTRA} cython==${CYTHON_VERSION} idna==${IDNA_VERSION} chardet==${CHARDET_VERSION} urllib3==${URLLIB3_VERSION} certifi==${CERTIFI_VERSION} requests==${REQUESTS_VERSION} --no-binary :all: ) +if(USE_PIP_NUMPY) + # Use only wheel (and not build from source) to stop NumPy from linking against buggy + # Accelerate framework backend on macOS. Official wheels are built with OpenBLAS. + ExternalProject_Add_Step(external_python_site_packages after_install + COMMAND ${PYTHON_BINARY} -m pip install --no-cache-dir numpy==${NUMPY_VERSION} --only-binary :all: + DEPENDEES install + ) +endif() + add_dependencies( external_python_site_packages external_python diff --git a/build_files/build_environment/cmake/sqlite.cmake b/build_files/build_environment/cmake/sqlite.cmake index 002be924a50..a77d3830b45 100644 --- a/build_files/build_environment/cmake/sqlite.cmake +++ b/build_files/build_environment/cmake/sqlite.cmake @@ -42,8 +42,21 @@ if(UNIX) -DSQLITE_MAX_VARIABLE_NUMBER=250000 \ -fPIC") set(SQLITE_CONFIGURE_ENV ${SQLITE_CONFIGURE_ENV} && export LDFLAGS=${SQLITE_LDFLAGS} && export CFLAGS=${SQLITE_CFLAGS}) - set(SQLITE_CONFIGURATION_ARGS ${SQLITE_CONFIGURATION_ARGS} --enable-threadsafe --enable-load-extension --enable-json1 --enable-fts4 --enable-fts5 --disable-tcl - --enable-shared=no) + set(SQLITE_CONFIGURATION_ARGS + ${SQLITE_CONFIGURATION_ARGS} + --enable-threadsafe + --enable-load-extension + --enable-json1 + --enable-fts4 + --enable-fts5 + # While building `tcl` is harmless, it causes problems when the install step + # tries to copy the files into the system path. + # Since this isn't required by Python or Blender this can be disabled. + # Note that Debian (for example), splits this off into a separate package, + # so it's safe to turn off. + --disable-tcl + --enable-shared=no + ) endif() ExternalProject_Add(external_sqlite diff --git a/build_files/build_environment/cmake/tinyxml.cmake b/build_files/build_environment/cmake/sse2neon.cmake similarity index 60% rename from build_files/build_environment/cmake/tinyxml.cmake rename to build_files/build_environment/cmake/sse2neon.cmake index 763fd959d24..dca2d94f913 100644 --- a/build_files/build_environment/cmake/tinyxml.cmake +++ b/build_files/build_environment/cmake/sse2neon.cmake @@ -16,16 +16,15 @@ # # ***** END GPL LICENSE BLOCK ***** -set(TINYXML_EXTRA_ARGS -) - -ExternalProject_Add(external_tinyxml - URL ${TINYXML_URI} - DOWNLOAD_DIR ${DOWNLOAD_DIR} - URL_HASH MD5=${TINYXML_HASH} - PREFIX ${BUILD_DIR}/tinyxml - # patch taken from ocio - PATCH_COMMAND ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/tinyxml/src/external_tinyxml < ${PATCH_DIR}/tinyxml.diff - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/tinyxml ${DEFAULT_CMAKE_FLAGS} ${TINYXML_EXTRA_ARGS} - INSTALL_DIR ${LIBDIR}/tinyxml -) +if(APPLE AND ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")) + ExternalProject_Add(external_sse2neon + GIT_REPOSITORY ${SSE2NEON_GIT} + GIT_TAG ${SSE2NEON_GIT_HASH} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + PREFIX ${BUILD_DIR}/sse2neon + CONFIGURE_COMMAND echo sse2neon - Nothing to configure + BUILD_COMMAND echo sse2neon - nothing to build + INSTALL_COMMAND mkdir -p ${LIBDIR}/sse2neon && cp ${BUILD_DIR}/sse2neon/src/external_sse2neon/sse2neon.h ${LIBDIR}/sse2neon + INSTALL_DIR ${LIBDIR}/sse2neon + ) +endif() diff --git a/build_files/build_environment/cmake/tbb.cmake b/build_files/build_environment/cmake/tbb.cmake index 82cd9291ddf..99614f18d83 100644 --- a/build_files/build_environment/cmake/tbb.cmake +++ b/build_files/build_environment/cmake/tbb.cmake @@ -42,7 +42,8 @@ ExternalProject_Add(external_tbb URL_HASH MD5=${TBB_HASH} PREFIX ${BUILD_DIR}/tbb PATCH_COMMAND COMMAND ${CMAKE_COMMAND} -E copy ${PATCH_DIR}/cmakelists_tbb.txt ${BUILD_DIR}/tbb/src/external_tbb/CMakeLists.txt && - ${CMAKE_COMMAND} -E copy ${BUILD_DIR}/tbb/src/external_tbb/build/vs2013/version_string.ver ${BUILD_DIR}/tbb/src/external_tbb/src/tbb/version_string.ver + ${CMAKE_COMMAND} -E copy ${BUILD_DIR}/tbb/src/external_tbb/build/vs2013/version_string.ver ${BUILD_DIR}/tbb/src/external_tbb/src/tbb/version_string.ver && + ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/tbb/src/external_tbb < ${PATCH_DIR}/tbb.diff CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/tbb ${DEFAULT_CMAKE_FLAGS} ${TBB_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/tbb ) diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index 98558721cb3..96cffe6f3c2 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -32,11 +32,11 @@ set(JPEG_VERSION 2.0.4) set(JPEG_URI https://github.com/libjpeg-turbo/libjpeg-turbo/archive/${JPEG_VERSION}.tar.gz) set(JPEG_HASH 44c43e4a9fb352f47090804529317c88) -set(BOOST_VERSION 1.70.0) -set(BOOST_VERSION_NODOTS 1_70_0) -set(BOOST_VERSION_NODOTS_SHORT 1_70) +set(BOOST_VERSION 1.73.0) +set(BOOST_VERSION_NODOTS 1_73_0) +set(BOOST_VERSION_NODOTS_SHORT 1_73) set(BOOST_URI https://dl.bintray.com/boostorg/release/${BOOST_VERSION}/source/boost_${BOOST_VERSION_NODOTS}.tar.gz) -set(BOOST_HASH fea771fe8176828fabf9c09242ee8c26) +set(BOOST_HASH 4036cd27ef7548b8d29c30ea10956196) # Using old version as recommended by OpenVDB build documentation. set(BLOSC_VERSION 1.5.0) @@ -47,9 +47,9 @@ set(PTHREADS_VERSION 3.0.0) set(PTHREADS_URI http://sourceforge.mirrorservice.org/p/pt/pthreads4w/pthreads4w-code-v${PTHREADS_VERSION}.zip) set(PTHREADS_HASH f3bf81bb395840b3446197bcf4ecd653) -set(OPENEXR_VERSION 2.4.0) +set(OPENEXR_VERSION 2.5.5) set(OPENEXR_URI https://github.com/AcademySoftwareFoundation/openexr/archive/v${OPENEXR_VERSION}.tar.gz) -set(OPENEXR_HASH 9e4d69cf2a12c6fb19b98af7c5e0eaee) +set(OPENEXR_HASH 85e8a979092c9055d10ed103062d31a0) if(WIN32) # Openexr started appending _d on its own so now # we need to tell the build the postfix is _s while @@ -78,9 +78,9 @@ set(FREEGLUT_VERSION 3.0.0) set(FREEGLUT_URI http://pilotfiber.dl.sourceforge.net/project/freeglut/freeglut/${FREEGLUT_VERSION}/freeglut-${FREEGLUT_VERSION}.tar.gz) set(FREEGLUT_HASH 90c3ca4dd9d51cf32276bc5344ec9754) -set(ALEMBIC_VERSION 1.7.12) +set(ALEMBIC_VERSION 1.7.16) set(ALEMBIC_URI https://github.com/alembic/alembic/archive/${ALEMBIC_VERSION}.tar.gz) -set(ALEMBIC_MD5 e2b3777f23c5c09481a008cc6f0f8a40) +set(ALEMBIC_MD5 effcc86e42fe6605588e3de57bde6677) # hash is for 3.1.2 set(GLFW_GIT_UID 30306e54705c3adae9fe082c816a3be71963485c) @@ -109,22 +109,27 @@ set(OPENCOLLADA_VERSION v1.6.68) set(OPENCOLLADA_URI https://github.com/KhronosGroup/OpenCOLLADA/archive/${OPENCOLLADA_VERSION}.tar.gz) set(OPENCOLLADA_HASH ee7dae874019fea7be11613d07567493) -set(OPENCOLORIO_VERSION 1.1.1) +set(OPENCOLORIO_VERSION 2.0.0) set(OPENCOLORIO_URI https://github.com/AcademySoftwareFoundation/OpenColorIO/archive/v${OPENCOLORIO_VERSION}.tar.gz) -set(OPENCOLORIO_HASH 23d8b9ac81599305539a5a8674b94a3d) +set(OPENCOLORIO_HASH 1a2e3478b6cd9a1549f24e1b2205e3f0) -set(LLVM_VERSION 9.0.1) -set(LLVM_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/llvm-${LLVM_VERSION}.src.tar.xz) -set(LLVM_HASH 31eb9ce73dd2a0f8dcab8319fb03f8fc) +if(APPLE AND ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")) + # Newer version required by ISPC with arm support. + set(LLVM_VERSION 11.0.1) + set(LLVM_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/llvm-project-${LLVM_VERSION}.src.tar.xz) + set(LLVM_HASH e700af40ab83463e4e9ab0ba3708312e) -set(CLANG_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/clang-${LLVM_VERSION}.src.tar.xz) -set(CLANG_HASH 13468e4a44940efef1b75e8641752f90) + set(OPENMP_VERSION 9.0.1) + set(OPENMP_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${OPENMP_VERSION}/openmp-${OPENMP_VERSION}.src.tar.xz) + set(OPENMP_HASH 6eade16057edbdecb3c4eef9daa2bfcf) +else() + set(LLVM_VERSION 9.0.1) + set(LLVM_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/llvm-project-${LLVM_VERSION}.tar.xz) + set(LLVM_HASH b4268e733dfe352960140dc07ef2efcb) -set(CLANG_TOOLS_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/clang-tools-extra-${LLVM_VERSION}.src.tar.xz) -set(CLANG_TOOLS_HASH c76293870b564c6a7968622b475b7646) - -set(OPENMP_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/openmp-${LLVM_VERSION}.src.tar.xz) -set(OPENMP_HASH 6eade16057edbdecb3c4eef9daa2bfcf) + set(OPENMP_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/openmp-${LLVM_VERSION}.src.tar.xz) + set(OPENMP_HASH 6eade16057edbdecb3c4eef9daa2bfcf) +endif() set(OPENIMAGEIO_VERSION 2.1.15.0) set(OPENIMAGEIO_URI https://github.com/OpenImageIO/oiio/archive/Release-${OPENIMAGEIO_VERSION}.tar.gz) @@ -134,38 +139,39 @@ set(TIFF_VERSION 4.1.0) set(TIFF_URI http://download.osgeo.org/libtiff/tiff-${TIFF_VERSION}.tar.gz) set(TIFF_HASH 2165e7aba557463acc0664e71a3ed424) -set(OSL_VERSION 1.10.10) +set(OSL_VERSION 1.11.10.0) set(OSL_URI https://github.com/imageworks/OpenShadingLanguage/archive/Release-${OSL_VERSION}.tar.gz) -set(OSL_HASH 00dec08a93c8084e53848b9ad047889f) +set(OSL_HASH dfdc23597aeef083832cbada62211756) -set(PYTHON_VERSION 3.7.7) -set(PYTHON_SHORT_VERSION 3.7) -set(PYTHON_SHORT_VERSION_NO_DOTS 37) +set(PYTHON_VERSION 3.9.2) +set(PYTHON_SHORT_VERSION 3.9) +set(PYTHON_SHORT_VERSION_NO_DOTS 39) set(PYTHON_URI https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tar.xz) -set(PYTHON_HASH 172c650156f7bea68ce31b2fd01fa766) +set(PYTHON_HASH f0dc9000312abeb16de4eccce9a870ab) -set(TBB_VERSION 2019_U9) +set(TBB_VERSION 2020_U2) set(TBB_URI https://github.com/oneapi-src/oneTBB/archive/${TBB_VERSION}.tar.gz) -set(TBB_HASH 26263622e9187212ec240dcf01b66207) +set(TBB_HASH 1b711ae956524855088df3bbf5ec65dc) -set(OPENVDB_VERSION 7.0.0) +set(OPENVDB_VERSION 8.0.1) set(OPENVDB_URI https://github.com/AcademySoftwareFoundation/openvdb/archive/v${OPENVDB_VERSION}.tar.gz) -set(OPENVDB_HASH fd6c4f168282f7e0e494d290cd531fa8) +set(OPENVDB_HASH 01b490be16cc0e15c690f9a153c21461) set(NANOVDB_GIT_UID e62f7a0bf1e27397223c61ddeaaf57edf111b77f) set(NANOVDB_URI https://github.com/AcademySoftwareFoundation/openvdb/archive/${NANOVDB_GIT_UID}.tar.gz) set(NANOVDB_HASH 90919510bc6ccd630fedc56f748cb199) -set(IDNA_VERSION 2.9) -set(CHARDET_VERSION 3.0.4) -set(URLLIB3_VERSION 1.25.9) -set(CERTIFI_VERSION 2020.4.5.2) -set(REQUESTS_VERSION 2.23.0) +set(IDNA_VERSION 2.10) +set(CHARDET_VERSION 4.0.0) +set(URLLIB3_VERSION 1.26.3) +set(CERTIFI_VERSION 2020.12.5) +set(REQUESTS_VERSION 2.25.1) +set(CYTHON_VERSION 0.29.21) -set(NUMPY_VERSION 1.17.5) -set(NUMPY_SHORT_VERSION 1.17) +set(NUMPY_VERSION 1.19.5) +set(NUMPY_SHORT_VERSION 1.19) set(NUMPY_URI https://github.com/numpy/numpy/releases/download/v${NUMPY_VERSION}/numpy-${NUMPY_VERSION}.zip) -set(NUMPY_HASH 763a5646fa6eef7a22f4895bca0524f2) +set(NUMPY_HASH f6a1b48717c552bbc18f1adc3cc1fe0e) set(LAME_VERSION 3.100) set(LAME_URI http://downloads.sourceforge.net/project/lame/lame/3.100/lame-${LAME_VERSION}.tar.gz) @@ -256,9 +262,9 @@ set(YAMLCPP_VERSION 0.6.3) set(YAMLCPP_URI https://codeload.github.com/jbeder/yaml-cpp/tar.gz/yaml-cpp-${YAMLCPP_VERSION}) set(YAMLCPP_HASH b45bf1089a382e81f6b661062c10d0c2) -set(LCMS_VERSION 2.9) -set(LCMS_URI https://nchc.dl.sourceforge.net/project/lcms/lcms/${LCMS_VERSION}/lcms2-${LCMS_VERSION}.tar.gz) -set(LCMS_HASH 8de1b7724f578d2995c8fdfa35c3ad0e) +set(EXPAT_VERSION 2_2_10) +set(EXPAT_URI https://github.com/libexpat/libexpat/archive/R_${EXPAT_VERSION}.tar.gz) +set(EXPAT_HASH 7ca5f09959fcb9a57618368deb627b9f) set(PUGIXML_VERSION 1.10) set(PUGIXML_URI https://github.com/zeux/pugixml/archive/v${PUGIXML_VERSION}.tar.gz) @@ -295,34 +301,41 @@ set(SQLITE_HASH fb558c49ee21a837713c4f1e7e413309aabdd9c7) set(EMBREE_VERSION 3.10.0) set(EMBREE_URI https://github.com/embree/embree/archive/v${EMBREE_VERSION}.zip) set(EMBREE_HASH 4bbe29e7eaa46417efc75fc5f1e8eb87) +set(EMBREE_ARM_GIT https://github.com/brechtvl/embree.git) -set(USD_VERSION 20.05) +set(USD_VERSION 21.02) set(USD_URI https://github.com/PixarAnimationStudios/USD/archive/v${USD_VERSION}.tar.gz) -set(USD_HASH 6d679e739e7f65725d9c029e37dda9fc) +set(USD_HASH 1dd1e2092d085ed393c1f7c450a4155a) -set(OIDN_VERSION 1.2.3) +set(OIDN_VERSION 1.3.0) set(OIDN_URI https://github.com/OpenImageDenoise/oidn/releases/download/v${OIDN_VERSION}/oidn-${OIDN_VERSION}.src.tar.gz) -set(OIDN_HASH 1f11466c2c3efc27faba5ec7078d12b2) +set(OIDN_HASH 301a5a0958d375a942014df0679b9270) set(LIBGLU_VERSION 9.0.1) set(LIBGLU_URI ftp://ftp.freedesktop.org/pub/mesa/glu/glu-${LIBGLU_VERSION}.tar.xz) set(LIBGLU_HASH 151aef599b8259efe9acd599c96ea2a3) -set(MESA_VERSION 18.3.1) +set(MESA_VERSION 20.3.4) set(MESA_URI ftp://ftp.freedesktop.org/pub/mesa/mesa-${MESA_VERSION}.tar.xz) -set(MESA_HASH d60828056d77bfdbae0970f9b15fb1be) +set(MESA_HASH 556338446aef8ae947a789b3e0b5e056) set(NASM_VERSION 2.15.02) -set(NASM_URI https://www.nasm.us/pub/nasm/releasebuilds/${NASM_VERSION}/nasm-${NASM_VERSION}.tar.xz) -set(NASM_HASH f4fd1329b1713e1ccd34b2fc121c4bcd278c9f91cc4cb205ae8fcd2e4728dd14) +set(NASM_URI https://github.com/netwide-assembler/nasm/archive/nasm-${NASM_VERSION}.tar.gz) +set(NASM_HASH aded8b796c996a486a56e0515c83e414116decc3b184d88043480b32eb0a8589) -set(XR_OPENXR_SDK_VERSION 1.0.8) +set(XR_OPENXR_SDK_VERSION 1.0.14) set(XR_OPENXR_SDK_URI https://github.com/KhronosGroup/OpenXR-SDK/archive/release-${XR_OPENXR_SDK_VERSION}.tar.gz) -set(XR_OPENXR_SDK_HASH c6de63d2e0f9029aa58dfa97cad8ce07) +set(XR_OPENXR_SDK_HASH 0df6b2fd6045423451a77ff6bc3e1a75) -set(ISPC_VERSION v1.14.1) -set(ISPC_URI https://github.com/ispc/ispc/archive/${ISPC_VERSION}.tar.gz) -set(ISPC_HASH 968fbc8dfd16a60ba4e32d2e0e03ea7a) +if(APPLE AND ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")) + # Unreleased version with macOS arm support. + set(ISPC_URI https://github.com/ispc/ispc/archive/f5949c055eb9eeb93696978a3da4bfb3a6a30b35.zip) + set(ISPC_HASH d382fea18d01dbd0cd05d9e1ede36d7d) +else() + set(ISPC_VERSION v1.14.1) + set(ISPC_URI https://github.com/ispc/ispc/archive/${ISPC_VERSION}.tar.gz) + set(ISPC_HASH 968fbc8dfd16a60ba4e32d2e0e03ea7a) +endif() set(GMP_VERSION 6.2.0) set(GMP_URI https://gmplib.org/download/gmp/gmp-${GMP_VERSION}.tar.xz) @@ -335,3 +348,6 @@ set(POTRACE_HASH 5f0bd87ddd9a620b0c4e65652ef93d69) set(HARU_VERSION 2_3_0) set(HARU_URI https://github.com/libharu/libharu/archive/RELEASE_${HARU_VERSION}.tar.gz) set(HARU_HASH 4f916aa49c3069b3a10850013c507460) + +set(SSE2NEON_GIT https://github.com/DLTcollab/sse2neon.git) +set(SSE2NEON_GIT_HASH fe5ff00bb8d19b327714a3c290f3e2ce81ba3525) diff --git a/build_files/build_environment/cmake/xr_openxr.cmake b/build_files/build_environment/cmake/xr_openxr.cmake index 16da266c3d2..0ab685f8da8 100644 --- a/build_files/build_environment/cmake/xr_openxr.cmake +++ b/build_files/build_environment/cmake/xr_openxr.cmake @@ -53,7 +53,7 @@ if(WIN32) endif() if(BUILD_MODE STREQUAL Debug) ExternalProject_Add_Step(external_xr_openxr_sdk after_install - COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/xr_openxr_sdk/lib/openxr_loader.lib ${HARVEST_TARGET}/xr_openxr_sdk/lib/openxr_loader_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/xr_openxr_sdk/lib/openxr_loaderd.lib ${HARVEST_TARGET}/xr_openxr_sdk/lib/openxr_loaderd.lib DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/yamlcpp.cmake b/build_files/build_environment/cmake/yamlcpp.cmake index 3d3639593ad..d56a3e4a63a 100644 --- a/build_files/build_environment/cmake/yamlcpp.cmake +++ b/build_files/build_environment/cmake/yamlcpp.cmake @@ -17,13 +17,18 @@ # ***** END GPL LICENSE BLOCK ***** set(YAMLCPP_EXTRA_ARGS - -DBUILD_GMOCK=OFF -DYAML_CPP_BUILD_TESTS=OFF -DYAML_CPP_BUILD_TOOLS=OFF -DYAML_CPP_BUILD_CONTRIB=OFF - -DYAML_MSVC_SHARED_RT=ON ) +if(WIN32) + set(YAMLCPP_EXTRA_ARGS + ${YAMLCPP_EXTRA_ARGS} + -DBUILD_GMOCK=OFF + -DYAML_MSVC_SHARED_RT=ON) +endif() + ExternalProject_Add(external_yamlcpp URL ${YAMLCPP_URI} DOWNLOAD_DIR ${DOWNLOAD_DIR} diff --git a/build_files/build_environment/install_deps.sh b/build_files/build_environment/install_deps.sh index 9c898a04d55..3b364c21f7d 100755 --- a/build_files/build_environment/install_deps.sh +++ b/build_files/build_environment/install_deps.sh @@ -376,10 +376,10 @@ USE_CXX11=true CLANG_FORMAT_VERSION_MIN="6.0" CLANG_FORMAT_VERSION_MAX="10.0" -PYTHON_VERSION="3.9.1" +PYTHON_VERSION="3.9.2" PYTHON_VERSION_SHORT="3.9" PYTHON_VERSION_MIN="3.7" -PYTHON_VERSION_MAX="3.10" +PYTHON_VERSION_MAX="3.11" PYTHON_VERSION_INSTALLED=$PYTHON_VERSION_SHORT PYTHON_FORCE_BUILD=false PYTHON_FORCE_REBUILD=false @@ -445,26 +445,26 @@ BOOST_FORCE_BUILD=false BOOST_FORCE_REBUILD=false BOOST_SKIP=false -TBB_VERSION="2019" -TBB_VERSION_SHORT="2019" -TBB_VERSION_UPDATE="_U9" # Used for source packages... +TBB_VERSION="2020" +TBB_VERSION_SHORT="2020" +TBB_VERSION_UPDATE="_U2" # Used for source packages... TBB_VERSION_MIN="2018" -TBB_VERSION_MAX="2021" +TBB_VERSION_MAX="2022" TBB_FORCE_BUILD=false TBB_FORCE_REBUILD=false TBB_SKIP=false -OCIO_VERSION="1.1.1" -OCIO_VERSION_SHORT="1.1" -OCIO_VERSION_MIN="1.0" -OCIO_VERSION_MAX="1.2" +OCIO_VERSION="2.0.0" +OCIO_VERSION_SHORT="2.0" +OCIO_VERSION_MIN="2.0" +OCIO_VERSION_MAX="3.0" OCIO_FORCE_BUILD=false OCIO_FORCE_REBUILD=false OCIO_SKIP=false -OPENEXR_VERSION="2.4.0" -OPENEXR_VERSION_SHORT="2.4" -OPENEXR_VERSION_MIN="2.3" +OPENEXR_VERSION="2.5.5" +OPENEXR_VERSION_SHORT="2.5" +OPENEXR_VERSION_MIN="2.4" OPENEXR_VERSION_MAX="3.0" OPENEXR_FORCE_BUILD=false OPENEXR_FORCE_REBUILD=false @@ -509,10 +509,10 @@ OSD_SKIP=false # OpenVDB needs to be compiled for now OPENVDB_BLOSC_VERSION="1.5.0" -OPENVDB_VERSION="7.0.0" -OPENVDB_VERSION_SHORT="7.0" -OPENVDB_VERSION_MIN="7.0" -OPENVDB_VERSION_MAX="7.1" +OPENVDB_VERSION="8.0.1" +OPENVDB_VERSION_SHORT="8.0" +OPENVDB_VERSION_MIN="8.0" +OPENVDB_VERSION_MAX="8.1" OPENVDB_FORCE_BUILD=false OPENVDB_FORCE_REBUILD=false OPENVDB_SKIP=false @@ -526,10 +526,10 @@ ALEMBIC_FORCE_BUILD=false ALEMBIC_FORCE_REBUILD=false ALEMBIC_SKIP=false -USD_VERSION="20.08" -USD_VERSION_SHORT="20.08" +USD_VERSION="21.02" +USD_VERSION_SHORT="21.02" USD_VERSION_MIN="20.05" -USD_VERSION_MAX="21.00" +USD_VERSION_MAX="22.00" USD_FORCE_BUILD=false USD_FORCE_REBUILD=false USD_SKIP=false @@ -550,10 +550,10 @@ EMBREE_FORCE_BUILD=false EMBREE_FORCE_REBUILD=false EMBREE_SKIP=false -OIDN_VERSION="1.2.3" -OIDN_VERSION_SHORT="1.2" -OIDN_VERSION_MIN="1.2.0" -OIDN_VERSION_MAX="1.3" +OIDN_VERSION="1.3.0" +OIDN_VERSION_SHORT="1.3" +OIDN_VERSION_MIN="1.3.0" +OIDN_VERSION_MAX="1.4" OIDN_FORCE_BUILD=false OIDN_FORCE_REBUILD=false OIDN_SKIP=false @@ -569,7 +569,7 @@ FFMPEG_FORCE_REBUILD=false FFMPEG_SKIP=false _ffmpeg_list_sep=";" -XR_OPENXR_VERSION="1.0.8" +XR_OPENXR_VERSION="1.0.14" XR_OPENXR_VERSION_SHORT="1.0" XR_OPENXR_VERSION_MIN="1.0.8" XR_OPENXR_VERSION_MAX="2.0" @@ -1101,8 +1101,8 @@ FFMPEG_SOURCE=( "http://ffmpeg.org/releases/ffmpeg-$FFMPEG_VERSION.tar.bz2" ) XR_OPENXR_USE_REPO=false XR_OPENXR_SOURCE=("https://github.com/KhronosGroup/OpenXR-SDK/archive/release-${XR_OPENXR_VERSION}.tar.gz") -#~ XR_OPENXR_SOURCE_REPO=("https://github.com/KhronosGroup/OpenXR-SDK-Source.git") -#~ XR_OPENXR_REPO_UID="5292e57fda47561e672fba0a4b6e545c0f25dd8d" +#~ XR_OPENXR_SOURCE_REPO=("https://github.com/KhronosGroup/OpenXR-SDK.git") +#~ XR_OPENXR_REPO_UID="5900c51562769b03bea699dc0352cae56acb6419d" #~ XR_OPENXR_REPO_BRANCH="master" # C++11 is required now @@ -1732,7 +1732,7 @@ compile_OCIO() { fi # To be changed each time we make edits that would modify the compiled result! - ocio_magic=2 + ocio_magic=3 _init_ocio # Force having own builds for the dependencies. @@ -1787,8 +1787,8 @@ compile_OCIO() { cmake_d="$cmake_d -D CMAKE_PREFIX_PATH=$_inst" cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst" cmake_d="$cmake_d -D OCIO_BUILD_APPS=OFF" - cmake_d="$cmake_d -D OCIO_BUILD_PYGLUE=OFF" - cmake_d="$cmake_d -D STOP_ON_WARNING=OFF" + cmake_d="$cmake_d -D OCIO_BUILD_PYTHON=OFF" + cmake_d="$cmake_d -D OCIO_BUILD_GPU_TESTS=OFF" if file /bin/cp | grep -q '32-bit'; then cflags="-fPIC -m32 -march=i686" @@ -1802,11 +1802,11 @@ compile_OCIO() { make -j$THREADS && make install # Force linking against static libs - rm -f $_inst/lib/*.so* + #rm -f $_inst/lib/*.so* # Additional depencencies - cp ext/dist/lib/libtinyxml.a $_inst/lib - cp ext/dist/lib/libyaml-cpp.a $_inst/lib + #cp ext/dist/lib/libtinyxml.a $_inst/lib + #cp ext/dist/lib/libyaml-cpp.a $_inst/lib make clean diff --git a/build_files/build_environment/patches/cmakelists_tbb.txt b/build_files/build_environment/patches/cmakelists_tbb.txt index 7edf3aa2785..4032e5d6f83 100644 --- a/build_files/build_environment/patches/cmakelists_tbb.txt +++ b/build_files/build_environment/patches/cmakelists_tbb.txt @@ -20,6 +20,7 @@ if(APPLE) endif() file(GLOB tbb_src "${CMAKE_CURRENT_SOURCE_DIR}/src/tbb/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/src/old/*.cpp") +list(REMOVE_ITEM tbb_src ${CMAKE_CURRENT_SOURCE_DIR}/src/tbb/tbb_bind.cpp) list(APPEND tbb_src ${CMAKE_CURRENT_SOURCE_DIR}/src/rml/client/rml_tbb.cpp) file(GLOB to_remove "${CMAKE_CURRENT_SOURCE_DIR}/src/old/test*.cpp") list(REMOVE_ITEM tbb_src ${to_remove}) diff --git a/build_files/build_environment/patches/llvm.diff b/build_files/build_environment/patches/llvm.diff index b797bb030ee..5f89816292b 100644 --- a/build_files/build_environment/patches/llvm.diff +++ b/build_files/build_environment/patches/llvm.diff @@ -1,5 +1,5 @@ ---- a/lib/Support/Unix/Path.inc 2020-02-17 09:24:26.000000000 +0100 -+++ b/lib/Support/Unix/Path.inc 2020-02-17 09:26:25.000000000 +0100 +--- a/llvm/lib/Support/Unix/Path.inc 2020-02-17 09:24:26.000000000 +0100 ++++ b/llvm/lib/Support/Unix/Path.inc 2020-02-17 09:26:25.000000000 +0100 @@ -1200,7 +1200,9 @@ /// implementation. std::error_code copy_file(const Twine &From, const Twine &To) { diff --git a/build_files/build_environment/patches/oidn.diff b/build_files/build_environment/patches/oidn.diff new file mode 100644 index 00000000000..10d21d7764b --- /dev/null +++ b/build_files/build_environment/patches/oidn.diff @@ -0,0 +1,40 @@ +diff -Naur oidn-1.3.0/cmake/FindTBB.cmake external_openimagedenoise/cmake/FindTBB.cmake +--- oidn-1.3.0/cmake/FindTBB.cmake 2021-02-04 16:20:26 -0700 ++++ external_openimagedenoise/cmake/FindTBB.cmake 2021-02-12 09:35:53 -0700 +@@ -332,20 +332,22 @@ + ${TBB_ROOT}/lib/${TBB_ARCH}/${TBB_VCVER} + ${TBB_ROOT}/lib + ) +- + # On Windows, also search the DLL so that the client may install it. + file(GLOB DLL_NAMES + ${TBB_ROOT}/bin/${TBB_ARCH}/${TBB_VCVER}/${LIB_NAME}.dll + ${TBB_ROOT}/bin/${LIB_NAME}.dll ++ ${TBB_ROOT}/lib/${LIB_NAME}.dll + ${TBB_ROOT}/redist/${TBB_ARCH}/${TBB_VCVER}/${LIB_NAME}.dll + ${TBB_ROOT}/redist/${TBB_ARCH}/${TBB_VCVER}/${LIB_NAME_GLOB1}.dll + ${TBB_ROOT}/redist/${TBB_ARCH}/${TBB_VCVER}/${LIB_NAME_GLOB2}.dll + ${TBB_ROOT}/../redist/${TBB_ARCH}/tbb/${TBB_VCVER}/${LIB_NAME}.dll + ${TBB_ROOT}/../redist/${TBB_ARCH}_win/tbb/${TBB_VCVER}/${LIB_NAME}.dll + ) +- list(GET DLL_NAMES 0 DLL_NAME) +- get_filename_component(${BIN_DIR_VAR} "${DLL_NAME}" DIRECTORY) +- set(${DLL_VAR} "${DLL_NAME}" CACHE PATH "${COMPONENT_NAME} ${BUILD_CONFIG} dll path") ++ if (DLL_NAMES) ++ list(GET DLL_NAMES 0 DLL_NAME) ++ get_filename_component(${BIN_DIR_VAR} "${DLL_NAME}" DIRECTORY) ++ set(${DLL_VAR} "${DLL_NAME}" CACHE PATH "${COMPONENT_NAME} ${BUILD_CONFIG} dll path") ++ endif() + elseif(APPLE) + set(LIB_PATHS ${TBB_ROOT}/lib) + else() +--- external_openimagedenoise/cmake/oidn_ispc.cmake 2021-02-15 17:29:34.000000000 +0100 ++++ external_openimagedenoise/cmake/oidn_ispc.cmake2 2021-02-15 17:29:28.000000000 +0100 +@@ -98,7 +98,7 @@ + elseif(OIDN_ARCH STREQUAL "ARM64") + set(ISPC_ARCHITECTURE "aarch64") + if(APPLE) +- set(ISPC_TARGET_OS "--target-os=ios") ++ set(ISPC_TARGET_OS "--target-os=macos") + endif() + endif() diff --git a/build_files/build_environment/patches/opencolorio.diff b/build_files/build_environment/patches/opencolorio.diff index c76c62c1057..2255cbc02ed 100644 --- a/build_files/build_environment/patches/opencolorio.diff +++ b/build_files/build_environment/patches/opencolorio.diff @@ -1,33 +1,16 @@ -diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt -index 1eb691b..cff9bd8 100644 ---- a/src/core/CMakeLists.txt -+++ b/src/core/CMakeLists.txt -@@ -23,8 +23,6 @@ if(WIN32) - if("${CMAKE_BUILD_TYPE}" STREQUAL "Release") - set(EXTERNAL_COMPILE_FLAGS "${EXTERNAL_COMPILE_FLAGS} /WX") - endif() --else() -- set(EXTERNAL_COMPILE_FLAGS "${EXTERNAL_COMPILE_FLAGS} -Werror") - endif() - - # SHARED ---- a/CMakeLists.txt 2018-09-10 22:15:29.000000000 +0200 -+++ b/CMakeLists.txt 2018-09-10 22:17:40.000000000 +0200 -@@ -229,7 +229,7 @@ - PATCH_COMMAND ${GIT_EXECUTABLE} apply --ignore-whitespace ${TINYXML_PATCHFILE} - BINARY_DIR ext/build/tinyxml - INSTALL_DIR ext/dist -- CMAKE_ARGS ${TINYXML_CMAKE_ARGS} -+ CMAKE_ARGS ${TINYXML_CMAKE_ARGS} -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} -DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG} -DCMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE} -DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG} -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE} -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} +diff --git a/share/cmake/modules/Findpystring.cmake b/share/cmake/modules/Findpystring.cmake +index 7b894a45..92618215 100644 +--- a/share/cmake/modules/Findpystring.cmake ++++ b/share/cmake/modules/Findpystring.cmake +@@ -113,6 +113,11 @@ if(NOT pystring_FOUND) + -DCMAKE_INSTALL_MESSAGE=${CMAKE_INSTALL_MESSAGE} + -DCMAKE_INSTALL_PREFIX=${_EXT_DIST_ROOT} + -DCMAKE_OBJECT_PATH_MAX=${CMAKE_OBJECT_PATH_MAX} ++ -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} ++ -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} ++ -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} ++ -DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG} ++ -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE} ) - if(WIN32) - set(TINYXML_STATIC_LIBRARIES ${PROJECT_BINARY_DIR}/ext/dist/lib/tinyxml.lib) -@@ -343,7 +343,7 @@ - PATCH_COMMAND ${GIT_EXECUTABLE} apply --ignore-whitespace ${YAML_CPP_PATCHFILE} - BINARY_DIR ext/build/yaml-cpp - INSTALL_DIR ext/dist -- CMAKE_ARGS ${YAML_CPP_CMAKE_ARGS} -+ CMAKE_ARGS ${YAML_CPP_CMAKE_ARGS} -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} -DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG} -DCMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE} -DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG} -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE} -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} - ) - set(YAML_CPP_INCLUDE_DIRS ${PROJECT_BINARY_DIR}/ext/dist/include) - set(YAML_CPP_LIBRARY_DIRS ${PROJECT_BINARY_DIR}/ext/dist/lib) + if(CMAKE_TOOLCHAIN_FILE) + set(pystring_CMAKE_ARGS diff --git a/build_files/build_environment/patches/opencolorio_win.diff b/build_files/build_environment/patches/opencolorio_win.diff deleted file mode 100644 index eb65411b61a..00000000000 --- a/build_files/build_environment/patches/opencolorio_win.diff +++ /dev/null @@ -1,51 +0,0 @@ -diff -Naur external_opencolorio/CMakeLists.txt external_opencolorio.patched/CMakeLists.txt ---- external_opencolorio/CMakeLists.txt 2018-01-04 18:38:27 -0700 -+++ external_opencolorio.patched/CMakeLists.txt 2018-08-15 11:46:53 -0600 -@@ -251,25 +251,30 @@ - if(USE_EXTERNAL_YAML) - # Set minimum yaml version for non-patched sources. - set(YAML_VERSION_MIN "0.3.0") -- include(FindPkgConfig) -- pkg_check_modules(PC_YAML_CPP REQUIRED QUIET yaml-cpp) -- find_path(YAML_CPP_INCLUDE_DIR yaml-cpp/yaml.h -- HINTS ${PC_YAML_CPP_INCLUDEDIR} ${PC_YAML_CPP_INCLUDE_DIRS} ) -- find_library(YAML_CPP_LIBRARY LIBRARY_NAMES yaml-cpp libyaml-cpp -- HINTS ${PC_YAML_CPP_LIBRARY_DIRS} ) -- set(YAML_CPP_LIBRARIES ${YAML_CPP_LIBRARY}) -- set(YAML_CPP_INCLUDE_DIRS ${YAML_CPP_INCLUDE_DIR}) -- set(YAML_CPP_VERSION ${PC_YAML_CPP_VERSION}) -+ if(NOT WIN32) -+ include(FindPkgConfig) -+ pkg_check_modules(PC_YAML_CPP REQUIRED QUIET yaml-cpp) -+ find_path(YAML_CPP_INCLUDE_DIR yaml-cpp/yaml.h -+ HINTS ${PC_YAML_CPP_INCLUDEDIR} ${PC_YAML_CPP_INCLUDE_DIRS} ) -+ find_library(YAML_CPP_LIBRARY LIBRARY_NAMES yaml-cpp libyaml-cpp -+ HINTS ${PC_YAML_CPP_LIBRARY_DIRS} ) -+ set(YAML_CPP_LIBRARIES ${YAML_CPP_LIBRARY}) -+ set(YAML_CPP_INCLUDE_DIRS ${YAML_CPP_INCLUDE_DIR}) -+ set(YAML_CPP_VERSION ${PC_YAML_CPP_VERSION}) - -- if(YAML_CPP_VERSION VERSION_LESS ${YAML_VERSION_MIN}) -- message(FATAL_ERROR "ERROR: yaml-cpp ${YAML_VERSION_MIN} or greater is required.") -- endif() -- -- find_package_handle_standard_args(yaml-cpp -- REQUIRED_VARS YAML_CPP_LIBRARIES YAML_CPP_INCLUDE_DIRS ) -- set(YAML_CPP_FOUND ${YAML-CPP_FOUND}) -- mark_as_advanced(YAML_CPP_INCLUDE_DIR YAML_CPP_LIBRARY YAML-CPP_FOUND) -+ if(YAML_CPP_VERSION VERSION_LESS ${YAML_VERSION_MIN}) -+ message(FATAL_ERROR "ERROR: yaml-cpp ${YAML_VERSION_MIN} or greater is required.") -+ endif() - -+ find_package_handle_standard_args(yaml-cpp -+ REQUIRED_VARS YAML_CPP_LIBRARIES YAML_CPP_INCLUDE_DIRS ) -+ set(YAML_CPP_FOUND ${YAML-CPP_FOUND}) -+ mark_as_advanced(YAML_CPP_INCLUDE_DIR YAML_CPP_LIBRARY YAML-CPP_FOUND) -+ else() -+ set(EXTERNAL_INCLUDE_DIRS ${EXTERNAL_INCLUDE_DIRS} ${INC_1}) -+ set(EXTERNAL_INCLUDE_DIRS ${EXTERNAL_INCLUDE_DIRS} ${INC_2}) -+ message("INCLUDE DIRS = i:${EXTERNAL_INCLUDE_DIRS} |1:${INC_1} |2:${INC_2}") -+ endif() - if(YAML_CPP_FOUND) - if(YAML_CPP_VERSION VERSION_GREATER "0.5.0") - # Need to also get the boost headers here, as yaml-cpp 0.5.0+ requires them. diff --git a/build_files/build_environment/patches/openvdb.diff b/build_files/build_environment/patches/openvdb.diff index db4506025ea..2f6f735946b 100644 --- a/build_files/build_environment/patches/openvdb.diff +++ b/build_files/build_environment/patches/openvdb.diff @@ -1,10 +1,10 @@ -diff -Naur orig/cmake/FindIlmBase.cmake openvdb/cmake/FindIlmBase.cmake ---- orig/cmake/FindIlmBase.cmake 2019-12-06 12:11:33 -0700 -+++ openvdb/cmake/FindIlmBase.cmake 2020-08-12 12:48:44 -0600 -@@ -225,6 +225,12 @@ - list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES - "-${IlmBase_VERSION_MAJOR}_${IlmBase_VERSION_MINOR}.lib" - ) +diff -Naur openvdb-8.0.0/cmake/FindIlmBase.cmake openvdb/cmake/FindIlmBase.cmake +--- openvdb-8.0.0/cmake/FindIlmBase.cmake 2020-12-24 10:13:14 -0700 ++++ openvdb/cmake/FindIlmBase.cmake 2021-02-05 12:07:49 -0700 +@@ -217,6 +217,12 @@ + set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib") + endif() + list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "${_IlmBase_Version_Suffix}.lib") + list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES + "_s.lib" + ) @@ -13,14 +13,14 @@ diff -Naur orig/cmake/FindIlmBase.cmake openvdb/cmake/FindIlmBase.cmake + ) else() if(ILMBASE_USE_STATIC_LIBS) - list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES -diff -Naur orig/cmake/FindOpenEXR.cmake openvdb/cmake/FindOpenEXR.cmake ---- orig/cmake/FindOpenEXR.cmake 2019-12-06 12:11:33 -0700 -+++ openvdb/cmake/FindOpenEXR.cmake 2020-08-12 12:48:44 -0600 -@@ -218,6 +218,12 @@ - list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES - "-${OpenEXR_VERSION_MAJOR}_${OpenEXR_VERSION_MINOR}.lib" - ) + set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") +diff -Naur openvdb-8.0.0/cmake/FindOpenEXR.cmake openvdb/cmake/FindOpenEXR.cmake +--- openvdb-8.0.0/cmake/FindOpenEXR.cmake 2020-12-24 10:13:14 -0700 ++++ openvdb/cmake/FindOpenEXR.cmake 2021-02-05 12:23:39 -0700 +@@ -210,6 +210,12 @@ + set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib") + endif() + list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "${_OpenEXR_Version_Suffix}.lib") + list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES + "_s.lib" + ) @@ -29,11 +29,11 @@ diff -Naur orig/cmake/FindOpenEXR.cmake openvdb/cmake/FindOpenEXR.cmake + ) else() if(OPENEXR_USE_STATIC_LIBS) - list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES -diff -Naur orig/openvdb/CMakeLists.txt openvdb/openvdb/CMakeLists.txt ---- orig/openvdb/CMakeLists.txt 2019-12-06 12:11:33 -0700 -+++ openvdb/openvdb/CMakeLists.txt 2020-08-12 14:12:26 -0600 -@@ -105,7 +105,9 @@ + set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") +diff -Naur openvdb-8.0.0/openvdb/openvdb/CMakeLists.txt openvdb/openvdb/openvdb/CMakeLists.txt +--- openvdb-8.0.0/openvdb/openvdb/CMakeLists.txt 2020-12-24 10:13:14 -0700 ++++ openvdb/openvdb/openvdb/CMakeLists.txt 2021-02-05 11:18:33 -0700 +@@ -107,7 +107,9 @@ # http://boost.2283326.n4.nabble.com/CMake-config-scripts-broken-in-1-70-td4708957.html # https://github.com/boostorg/boost_install/commit/160c7cb2b2c720e74463865ef0454d4c4cd9ae7c set(BUILD_SHARED_LIBS ON) @@ -44,15 +44,15 @@ diff -Naur orig/openvdb/CMakeLists.txt openvdb/openvdb/CMakeLists.txt endif() find_package(Boost ${MINIMUM_BOOST_VERSION} REQUIRED COMPONENTS iostreams system) -@@ -193,6 +195,7 @@ - if(OPENVDB_DISABLE_BOOST_IMPLICIT_LINKING) - add_definitions(-DBOOST_ALL_NO_LIB) +@@ -146,6 +148,7 @@ + Boost::disable_autolinking # add -DBOOST_ALL_NO_LIB + ) endif() + add_definitions(-D__TBB_NO_IMPLICIT_LINKAGE -DOPENVDB_OPENEXR_STATICLIB) endif() - # @todo Should be target definitions -@@ -383,7 +386,12 @@ + if(USE_EXR) +@@ -379,7 +382,12 @@ # imported targets. if(OPENVDB_CORE_SHARED) @@ -66,9 +66,9 @@ diff -Naur orig/openvdb/CMakeLists.txt openvdb/openvdb/CMakeLists.txt endif() if(OPENVDB_CORE_STATIC) -diff -Naur orig/openvdb/version.rc.in openvdb/openvdb/version.rc.in ---- orig/openvdb/version.rc.in 1969-12-31 17:00:00 -0700 -+++ openvdb/openvdb/version.rc.in 2020-08-12 14:15:01 -0600 +diff -Naur openvdb-8.0.0/openvdb/openvdb/version.rc.in openvdb/openvdb/openvdb/version.rc.in +--- openvdb-8.0.0/openvdb/openvdb/version.rc.in 1969-12-31 17:00:00 -0700 ++++ openvdb/openvdb/openvdb/version.rc.in 2021-02-05 11:18:33 -0700 @@ -0,0 +1,48 @@ +#include + diff --git a/build_files/build_environment/patches/osl.diff b/build_files/build_environment/patches/osl.diff index 989800174e2..badb6c0d9b3 100644 --- a/build_files/build_environment/patches/osl.diff +++ b/build_files/build_environment/patches/osl.diff @@ -43,27 +43,23 @@ diff -Naur OpenShadingLanguage-Release-1.9.9/src/liboslexec/llvm_util.cpp extern - +void LLVM_Util::Cleanup () +{ -+ jitmm_hold.clear(); ++ if(jitmm_hold) jitmm_hold->clear(); +} size_t LLVM_Util::total_jit_memory_held () -diff -Naur OpenShadingLanguage-Release-1.9.9/CMakeLists.txt external_osl/CMakeLists.txt - --- orig/CMakeLists.txt 2020-01-27 16:22:31 -0700 -+++ external_osl/CMakeLists.txt 2020-05-13 18:04:52 -0600 -@@ -102,10 +102,11 @@ - set (OPTIX_EXTRA_LIBS CACHE STRING "Extra lib targets needed for OptiX") - set (CUDA_TARGET_ARCH "sm_35" CACHE STRING "CUDA GPU architecture (e.g. sm_35)") - --# set (USE_OIIO_STATIC ON CACHE BOOL "If OIIO is built static") --# if (USE_OIIO_STATIC) --# add_definitions ("-DOIIO_STATIC_BUILD=1") --# endif () +diff -Naur org/CMakeLists.txt external_osl/CMakeLists.txt +--- org/CMakeLists.txt 2020-12-01 12:37:15 -0700 ++++ external_osl/CMakeLists.txt 2021-01-20 13:26:50 -0700 +@@ -84,6 +84,11 @@ + CACHE STRING "Directory where OptiX PTX files will be installed") + set (CMAKE_DEBUG_POSTFIX "" CACHE STRING "Library naming postfix for Debug builds (e.g., '_debug')") + +set (USE_OIIO_STATIC ON CACHE BOOL "If OIIO is built static") +if (USE_OIIO_STATIC) + add_definitions ("-DOIIO_STATIC_BUILD=1") + add_definitions ("-DOIIO_STATIC_DEFINE=1") +endif () - + set (OSL_NO_DEFAULT_TEXTURESYSTEM OFF CACHE BOOL "Do not use create a raw OIIO::TextureSystem") - if (OSL_NO_DEFAULT_TEXTURESYSTEM) \ No newline at end of file + if (OSL_NO_DEFAULT_TEXTURESYSTEM) diff --git a/build_files/build_environment/patches/python_macos.diff b/build_files/build_environment/patches/python_macos.diff deleted file mode 100644 index 22ccbebee2f..00000000000 --- a/build_files/build_environment/patches/python_macos.diff +++ /dev/null @@ -1,289 +0,0 @@ -diff -ru a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst ---- a/Doc/library/ctypes.rst 2020-03-10 07:11:12.000000000 +0100 -+++ b/Doc/library/ctypes.rst 2020-07-14 08:10:10.000000000 +0200 -@@ -1551,6 +1551,13 @@ - value usable as argument (integer, string, ctypes instance). This allows - defining adapters that can adapt custom objects as function parameters. - -+ .. attribute:: variadic -+ -+ Assign a boolean to specify that the function takes a variable number of -+ arguments. This does not matter on most platforms, but for Apple arm64 -+ platforms variadic functions have a different calling convention than -+ normal functions. -+ - .. attribute:: errcheck - - Assign a Python function or another callable to this attribute. The -diff -ru a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c ---- a/Modules/_ctypes/_ctypes.c 2020-03-10 07:11:12.000000000 +0100 -+++ b/Modules/_ctypes/_ctypes.c 2020-07-14 08:14:41.000000000 +0200 -@@ -3175,6 +3175,35 @@ - } - - static int -+PyCFuncPtr_set_variadic(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored)) -+{ -+ StgDictObject *dict = PyObject_stgdict((PyObject *)self); -+ assert(dict); -+ int r = PyObject_IsTrue(ob); -+ if (r == 1) { -+ dict->flags |= FUNCFLAG_VARIADIC; -+ return 0; -+ } else if (r == 0) { -+ dict->flags &= ~FUNCFLAG_VARIADIC; -+ return 0; -+ } else { -+ return -1; -+ } -+} -+ -+static PyObject * -+PyCFuncPtr_get_variadic(PyCFuncPtrObject *self, void *Py_UNUSED(ignored)) -+{ -+ StgDictObject *dict = PyObject_stgdict((PyObject *)self); -+ assert(dict); /* Cannot be NULL for PyCFuncPtrObject instances */ -+ if (dict->flags & FUNCFLAG_VARIADIC) -+ Py_RETURN_TRUE; -+ else -+ Py_RETURN_FALSE; -+} -+ -+ -+static int - PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored)) - { - PyObject *converters; -@@ -5632,6 +5661,7 @@ - PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyLong_FromLong(FUNCFLAG_USE_ERRNO)); - PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyLong_FromLong(FUNCFLAG_USE_LASTERROR)); - PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyLong_FromLong(FUNCFLAG_PYTHONAPI)); -+ PyModule_AddObject(m, "FUNCFLAG_VARIADIC", PyLong_FromLong(FUNCFLAG_VARIADIC)); - PyModule_AddStringConstant(m, "__version__", "1.1.0"); - - PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove)); -diff -ru a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c ---- a/Modules/_ctypes/callproc.c 2020-03-10 07:11:12.000000000 +0100 -+++ b/Modules/_ctypes/callproc.c 2020-07-14 08:18:33.000000000 +0200 -@@ -767,7 +767,8 @@ - ffi_type **atypes, - ffi_type *restype, - void *resmem, -- int argcount) -+ int argcount, -+ int argtypecount) - { - PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */ - PyObject *error_object = NULL; -@@ -793,15 +794,38 @@ - if ((flags & FUNCFLAG_CDECL) == 0) - cc = FFI_STDCALL; - #endif -- if (FFI_OK != ffi_prep_cif(&cif, -- cc, -- argcount, -- restype, -- atypes)) { -- PyErr_SetString(PyExc_RuntimeError, -- "ffi_prep_cif failed"); -- return -1; -- } -+#if HAVE_FFI_PREP_CIF_VAR -+ /* Everyone SHOULD set f.variadic=True on variadic function pointers, but -+ * lots of existing code will not. If there's at least one arg and more -+ * args are passed than are defined in the prototype, then it must be a -+ * variadic function. */ -+ if ((flags & FUNCFLAG_VARIADIC) || -+ (argtypecount != 0 && argcount > argtypecount)) -+ { -+ if (FFI_OK != ffi_prep_cif_var(&cif, -+ cc, -+ argtypecount, -+ argcount, -+ restype, -+ atypes)) { -+ PyErr_SetString(PyExc_RuntimeError, -+ "ffi_prep_cif_var failed"); -+ return -1; -+ } -+ } else { -+#endif -+ if (FFI_OK != ffi_prep_cif(&cif, -+ cc, -+ argcount, -+ restype, -+ atypes)) { -+ PyErr_SetString(PyExc_RuntimeError, -+ "ffi_prep_cif failed"); -+ return -1; -+ } -+#if HAVE_FFI_PREP_CIF_VAR -+ } -+#endif - - if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) { - error_object = _ctypes_get_errobj(&space); -@@ -1185,9 +1209,8 @@ - - if (-1 == _call_function_pointer(flags, pProc, avalues, atypes, - rtype, resbuf, -- Py_SAFE_DOWNCAST(argcount, -- Py_ssize_t, -- int))) -+ Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int), -+ Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int))) - goto cleanup; - - #ifdef WORDS_BIGENDIAN -diff -ru a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h ---- a/Modules/_ctypes/ctypes.h 2020-03-10 07:11:12.000000000 +0100 -+++ b/Modules/_ctypes/ctypes.h 2020-07-14 08:30:53.000000000 +0200 -@@ -285,6 +285,7 @@ - #define FUNCFLAG_PYTHONAPI 0x4 - #define FUNCFLAG_USE_ERRNO 0x8 - #define FUNCFLAG_USE_LASTERROR 0x10 -+#define FUNCFLAG_VARIADIC 0x20 - - #define TYPEFLAG_ISPOINTER 0x100 - #define TYPEFLAG_HASPOINTER 0x200 -diff -ru a/configure b/configure ---- a/configure 2020-03-10 07:11:12.000000000 +0100 -+++ b/configure 2020-07-14 08:03:27.000000000 +0200 -@@ -3374,7 +3374,7 @@ - # has no effect, don't bother defining them - Darwin/[6789].*) - define_xopen_source=no;; -- Darwin/1[0-9].*) -+ Darwin/[12][0-9].*) - define_xopen_source=no;; - # On AIX 4 and 5.1, mbstate_t is defined only when _XOPEN_SOURCE == 500 but - # used in wcsnrtombs() and mbsnrtowcs() even if _XOPEN_SOURCE is not defined -@@ -9251,6 +9251,9 @@ - ppc) - MACOSX_DEFAULT_ARCH="ppc64" - ;; -+ arm64) -+ MACOSX_DEFAULT_ARCH="arm64" -+ ;; - *) - as_fn_error $? "Unexpected output of 'arch' on OSX" "$LINENO" 5 - ;; -diff -ru a/configure.ac b/configure.ac ---- a/configure.ac 2020-03-10 07:11:12.000000000 +0100 -+++ b/configure.ac 2020-07-14 08:03:27.000000000 +0200 -@@ -2456,6 +2456,9 @@ - ppc) - MACOSX_DEFAULT_ARCH="ppc64" - ;; -+ arm64) -+ MACOSX_DEFAULT_ARCH="arm64" -+ ;; - *) - AC_MSG_ERROR([Unexpected output of 'arch' on OSX]) - ;; -diff -ru a/setup.py b/setup.py ---- a/setup.py 2020-03-10 07:11:12.000000000 +0100 -+++ b/setup.py 2020-07-14 08:28:12.000000000 +0200 -@@ -141,6 +141,13 @@ - os.unlink(tmpfile) - - return MACOS_SDK_ROOT -+ -+def is_macosx_at_least(vers): -+ if host_platform == 'darwin': -+ dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') -+ if dep_target: -+ return tuple(map(int, dep_target.split('.'))) >= vers -+ return False - - def is_macosx_sdk_path(path): - """ -@@ -150,6 +157,13 @@ - or path.startswith('/System/') - or path.startswith('/Library/') ) - -+def grep_headers_for(function, headers): -+ for header in headers: -+ with open(header, 'r') as f: -+ if function in f.read(): -+ return True -+ return False -+ - def find_file(filename, std_dirs, paths): - """Searches for the directory where a given file is located, - and returns a possibly-empty list of additional directories, or None -@@ -1972,7 +1986,11 @@ - return True - - def detect_ctypes(self, inc_dirs, lib_dirs): -- self.use_system_libffi = False -+ if not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and is_macosx_at_least((10,15)): -+ self.use_system_libffi = True -+ else: -+ self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") -+ - include_dirs = [] - extra_compile_args = [] - extra_link_args = [] -@@ -2016,32 +2034,48 @@ - ext_test = Extension('_ctypes_test', - sources=['_ctypes/_ctypes_test.c'], - libraries=['m']) -+ ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") -+ ffi_lib = None -+ - self.extensions.extend([ext, ext_test]) - - if host_platform == 'darwin': -- if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"): -+ if not self.use_system_libffi: - return -- # OS X 10.5 comes with libffi.dylib; the include files are -- # in /usr/include/ffi -- inc_dirs.append('/usr/include/ffi') -- -- ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] -- if not ffi_inc or ffi_inc[0] == '': -- ffi_inc = find_file('ffi.h', [], inc_dirs) -- if ffi_inc is not None: -- ffi_h = ffi_inc[0] + '/ffi.h' -+ ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") -+ if os.path.exists(ffi_in_sdk): -+ ffi_inc = ffi_in_sdk -+ ffi_lib = 'ffi' -+ else: -+ # OS X 10.5 comes with libffi.dylib; the include files are -+ # in /usr/include/ffi -+ ffi_inc_dirs.append('/usr/include/ffi') -+ -+ if not ffi_inc: -+ found = find_file('ffi.h', [], ffi_inc_dirs) -+ if found: -+ ffi_inc = found[0] -+ if ffi_inc: -+ ffi_h = ffi_inc + '/ffi.h' - if not os.path.exists(ffi_h): - ffi_inc = None - print('Header file {} does not exist'.format(ffi_h)) -- ffi_lib = None -- if ffi_inc is not None: -+ if ffi_lib is None and ffi_inc: - for lib_name in ('ffi', 'ffi_pic'): - if (self.compiler.find_library_file(lib_dirs, lib_name)): - ffi_lib = lib_name - break - - if ffi_inc and ffi_lib: -- ext.include_dirs.extend(ffi_inc) -+ ffi_headers = glob(os.path.join(ffi_inc, '*.h')) -+ if grep_headers_for('ffi_closure_alloc', ffi_headers): -+ try: -+ sources.remove('_ctypes/malloc_closure.c') -+ except ValueError: -+ pass -+ if grep_headers_for('ffi_prep_cif_var', ffi_headers): -+ ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") -+ ext.include_dirs.append(ffi_inc) - ext.libraries.append(ffi_lib) - self.use_system_libffi = True - diff --git a/build_files/build_environment/patches/python_linux.diff b/build_files/build_environment/patches/python_unix.diff similarity index 56% rename from build_files/build_environment/patches/python_linux.diff rename to build_files/build_environment/patches/python_unix.diff index 24d625c7ceb..a9baae8ce32 100644 --- a/build_files/build_environment/patches/python_linux.diff +++ b/build_files/build_environment/patches/python_unix.diff @@ -2,23 +2,23 @@ diff --git a/setup.py.orig b/setup.py index a97a755..07ce853 100644 --- a/setup.py.orig +++ b/setup.py -@@ -1422,13 +1422,13 @@ class PyBuildExt(build_ext): +@@ -1603,13 +1603,13 @@ version = line.split()[2] break if version >= version_req: -- if (self.compiler.find_library_file(lib_dirs, 'z')): -+ if (self.compiler.find_library_file(lib_dirs, 'z_pic')): - if host_platform == "darwin": +- if (self.compiler.find_library_file(self.lib_dirs, 'z')): ++ if (self.compiler.find_library_file(self.lib_dirs, 'z_pic')): + if MACOS: zlib_extra_link_args = ('-Wl,-search_paths_first',) else: zlib_extra_link_args = () - exts.append( Extension('zlib', ['zlibmodule.c'], -- libraries = ['z'], -+ libraries = ['z_pic'], - extra_link_args = zlib_extra_link_args)) + self.add(Extension('zlib', ['zlibmodule.c'], +- libraries=['z'], ++ libraries=['z_pic'], + extra_link_args=zlib_extra_link_args)) have_zlib = True else: -@@ -1442,7 +1442,7 @@ class PyBuildExt(build_ext): +@@ -1623,7 +1623,7 @@ # crc32 if we have it. Otherwise binascii uses its own. if have_zlib: extra_compile_args = ['-DUSE_ZLIB_CRC32'] @@ -27,12 +27,12 @@ index a97a755..07ce853 100644 extra_link_args = zlib_extra_link_args else: extra_compile_args = [] -@@ -1991,7 +1991,7 @@ class PyBuildExt(build_ext): +@@ -2168,7 +2168,7 @@ + ffi_inc = None print('Header file {} does not exist'.format(ffi_h)) - ffi_lib = None - if ffi_inc is not None: + if ffi_lib is None and ffi_inc: - for lib_name in ('ffi', 'ffi_pic'): + for lib_name in ('ffi_pic', ): - if (self.compiler.find_library_file(lib_dirs, lib_name)): + if (self.compiler.find_library_file(self.lib_dirs, lib_name)): ffi_lib = lib_name break diff --git a/build_files/build_environment/patches/tbb.diff b/build_files/build_environment/patches/tbb.diff new file mode 100644 index 00000000000..c05c35bca95 --- /dev/null +++ b/build_files/build_environment/patches/tbb.diff @@ -0,0 +1,13 @@ +diff --git a/include/tbb/tbb_config.h b/include/tbb/tbb_config.h +index 7a8d06a0..886699d8 100644 +--- a/include/tbb/tbb_config.h ++++ b/include/tbb/tbb_config.h +@@ -620,7 +620,7 @@ There are four cases that are supported: + // instantiation site, which is too late for suppression of the corresponding messages for internal + // stuff. + #if !defined(__INTEL_COMPILER) && (!defined(TBB_SUPPRESS_DEPRECATED_MESSAGES) || (TBB_SUPPRESS_DEPRECATED_MESSAGES == 0)) +- #if (__cplusplus >= 201402L) ++ #if (__cplusplus >= 201402L && (!defined(_MSC_VER) || _MSC_VER >= 1920)) + #define __TBB_DEPRECATED [[deprecated]] + #define __TBB_DEPRECATED_MSG(msg) [[deprecated(msg)]] + #elif _MSC_VER \ No newline at end of file diff --git a/build_files/build_environment/patches/usd.diff b/build_files/build_environment/patches/usd.diff index 27b4955f849..42527a4f443 100644 --- a/build_files/build_environment/patches/usd.diff +++ b/build_files/build_environment/patches/usd.diff @@ -26,36 +26,30 @@ diff -Naur external_usd_base/cmake/macros/Public.cmake external_usd/cmake/macros endforeach() foreach(lib ${PXR_OBJECT_LIBS}) set(objects "${objects};\$") - -diff --git a/pxr/base/arch/align.h b/pxr/base/arch/align.h -index f3cabf4..ebc8a69 100644 ---- a/pxr/base/arch/align.h -+++ b/pxr/base/arch/align.h -@@ -77,7 +77,11 @@ ArchAlignMemory(void *base) - /// The size of a CPU cache line on the current processor architecture in bytes. - /// - /// \hideinitializer -+#if defined(ARCH_OS_DARWIN) && defined(ARCH_CPU_ARM) -+#define ARCH_CACHE_LINE_SIZE 128 -+#else - #define ARCH_CACHE_LINE_SIZE 64 -+#endif +diff -ru USD-20.11/pxr/base/tf/pxrLZ4/lz4.cpp external_usd/pxr/base/tf/pxrLZ4/lz4.cpp +--- USD-20.11/pxr/base/tf/pxrLZ4/lz4.cpp 2020-10-14 19:25:19.000000000 +0100 ++++ external_usd/pxr/base/tf/pxrLZ4/lz4.cpp 2021-02-09 09:28:51.496190085 +0000 +@@ -614,6 +614,15 @@ + /*-************************************ + * Internal Definitions used in Tests + **************************************/ ++ ++/******************************************************************* ++ * Disabled in Blender. The BLOSC library also exposes these ++ * functions, and this causes 'duplicate symbol' linker errors. ++ * ++ * This problem has been reported upstream at ++ * https://github.com/PixarAnimationStudios/USD/issues/1447 ++ * ++ ******************************************************************* + #if defined (__cplusplus) + extern "C" { + #endif +@@ -627,6 +636,7 @@ + #if defined (__cplusplus) + } + #endif ++********************************************************************/ - ///@} - -diff --git a/pxr/base/arch/math.h b/pxr/base/arch/math.h -index 3e66c37..64a052c 100644 ---- a/pxr/base/arch/math.h -+++ b/pxr/base/arch/math.h -@@ -42,7 +42,7 @@ PXR_NAMESPACE_OPEN_SCOPE - /// \addtogroup group_arch_Math - ///@{ - --#if defined (ARCH_CPU_INTEL) || defined(doxygen) -+#if defined (ARCH_CPU_INTEL) || defined(ARCH_CPU_ARM) || defined(doxygen) - - /// This is the smallest value e such that 1+e^2 == 1, using floats. - /// True for all IEEE754 chipsets. - - - + /*-****************************** + * Compression functions diff --git a/build_files/build_environment/windows/build_deps.cmd b/build_files/build_environment/windows/build_deps.cmd index ea8bfdaa3d2..2552b74711f 100644 --- a/build_files/build_environment/windows/build_deps.cmd +++ b/build_files/build_environment/windows/build_deps.cmd @@ -117,7 +117,7 @@ set path=%BUILD_DIR%\downloads\mingw\mingw64\msys\1.0\bin\;%BUILD_DIR%\downloads mkdir %STAGING%\%BuildDir%%ARCH%R cd %Staging%\%BuildDir%%ARCH%R echo %DATE% %TIME% : Start > %StatusFile% -cmake -G "%CMAKE_BUILDER%" %SOURCE_DIR% -DDOWNLOAD_DIR=%BUILD_DIR%/downloads -DBUILD_MODE=Release -DHARVEST_TARGET=%HARVEST_DIR%/%HARVESTROOT%%VSVER_SHORT%/ +cmake -G "%CMAKE_BUILDER%" -Thost=x64 %SOURCE_DIR% -DDOWNLOAD_DIR=%BUILD_DIR%/downloads -DBUILD_MODE=Release -DHARVEST_TARGET=%HARVEST_DIR%/%HARVESTROOT%%VSVER_SHORT%/ echo %DATE% %TIME% : Release Configuration done >> %StatusFile% if "%dobuild%" == "1" ( msbuild /m "ll.vcxproj" /p:Configuration=Release /fl /flp:logfile=BlenderDeps_llvm.log;Verbosity=normal @@ -130,7 +130,7 @@ if "%NODEBUG%" == "1" goto exit cd %BUILD_DIR% mkdir %STAGING%\%BuildDir%%ARCH%D cd %Staging%\%BuildDir%%ARCH%D -cmake -G "%CMAKE_BUILDER%" %SOURCE_DIR% -DDOWNLOAD_DIR=%BUILD_DIR%/downloads -DCMAKE_BUILD_TYPE=Debug -DBUILD_MODE=Debug -DHARVEST_TARGET=%HARVEST_DIR%/%HARVESTROOT%%VSVER_SHORT%/ %CMAKE_DEBUG_OPTIONS% +cmake -G "%CMAKE_BUILDER%" -Thost=x64 %SOURCE_DIR% -DDOWNLOAD_DIR=%BUILD_DIR%/downloads -DCMAKE_BUILD_TYPE=Debug -DBUILD_MODE=Debug -DHARVEST_TARGET=%HARVEST_DIR%/%HARVESTROOT%%VSVER_SHORT%/ %CMAKE_DEBUG_OPTIONS% echo %DATE% %TIME% : Debug Configuration done >> %StatusFile% if "%dobuild%" == "1" ( msbuild /m "ll.vcxproj" /p:Configuration=Debug /fl /flp:logfile=BlenderDeps_llvm.log;;Verbosity=normal diff --git a/build_files/cmake/Modules/FindClang.cmake b/build_files/cmake/Modules/FindClang.cmake new file mode 100644 index 00000000000..b5c2cfbc28d --- /dev/null +++ b/build_files/cmake/Modules/FindClang.cmake @@ -0,0 +1,111 @@ +# - Find Clang library +# Find the native Clang includes and library +# This module defines +# CLANG_INCLUDE_DIRS, where to find AST/AST.h, Set when +# CLANG_INCLUDE_DIR is found. +# CLANG_LIBRARIES, libraries to link against to use Clang. +# CLANG_ROOT_DIR, The base directory to search for Clang. +# This can also be an environment variable. +# CLANG_FOUND, If false, do not try to use Clang. + +#============================================================================= +# Copyright 2021 Blender Foundation. +# +# Distributed under the OSI-approved BSD 3-Clause License, +# see accompanying file BSD-3-Clause-license.txt for details. +#============================================================================= + +# If CLANG_ROOT_DIR was defined in the environment, use it. +if(NOT CLANG_ROOT_DIR AND NOT $ENV{CLANG_ROOT_DIR} STREQUAL "") + set(CLANG_ROOT_DIR $ENV{CLANG_ROOT_DIR}) +endif() + +set(_CLANG_SEARCH_DIRS + ${CLANG_ROOT_DIR} + /opt/lib/clang +) + +find_path(CLANG_INCLUDE_DIR + NAMES + AST/AST.h + HINTS + ${_CLANG_SEARCH_DIRS} + PATH_SUFFIXES + include + include/clang +) + + +set(_CLANG_FIND_COMPONENTS + clangDependencyScanning + clangDynamicASTMatchers + clangFrontendTool + clangStaticAnalyzerFrontend + clangHandleCXX + clangStaticAnalyzerCheckers + clangStaticAnalyzerCore + clangToolingASTDiff + clangToolingRefactoring + clangToolingSyntax + clangARCMigrate + clangCodeGen + clangCrossTU + clangIndex + clangTooling + clangFormat + clangToolingInclusions + clangRewriteFrontend + clangFrontend + clangSerialization + clangDriver + clangToolingCore + clangParse + clangRewrite + clangSema + clangEdit + clangAnalysis + clangASTMatchers + clangAST + clangLex + clangBasic +) + +set(_CLANG_LIBRARIES) +foreach(COMPONENT ${_CLANG_FIND_COMPONENTS}) + string(TOUPPER ${COMPONENT} UPPERCOMPONENT) + + find_library(CLANG_${UPPERCOMPONENT}_LIBRARY + NAMES + ${COMPONENT} + HINTS + ${_CLANG_SEARCH_DIRS} + PATH_SUFFIXES + lib64 lib + ) + list(APPEND _CLANG_LIBRARIES "${CLANG_${UPPERCOMPONENT}_LIBRARY}") +endforeach() + + +# Handle the QUIETLY and REQUIRED arguments and set CLANG_FOUND to TRUE if +# all listed variables are TRUE. +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Clang DEFAULT_MSG + _CLANG_LIBRARIES CLANG_INCLUDE_DIR) + +if(CLANG_FOUND) + set(CLANG_LIBRARIES ${_CLANG_LIBRARIES}) + set(CLANG_INCLUDE_DIRS ${CLANG_INCLUDE_DIR}) +endif() + +mark_as_advanced( + CLANG_INCLUDE_DIR +) + +foreach(COMPONENT ${_CLANG_FIND_COMPONENTS}) + string(TOUPPER ${COMPONENT} UPPERCOMPONENT) + mark_as_advanced(CLANG_${UPPERCOMPONENT}_LIBRARY) +endforeach() + +unset(_CLANG_SEARCH_DIRS) +unset(_CLANG_FIND_COMPONENTS) +unset(_CLANG_LIBRARIES) diff --git a/build_files/cmake/Modules/FindEmbree.cmake b/build_files/cmake/Modules/FindEmbree.cmake index af545cee00c..7f7f2ae0fb3 100644 --- a/build_files/cmake/Modules/FindEmbree.cmake +++ b/build_files/cmake/Modules/FindEmbree.cmake @@ -34,12 +34,17 @@ FIND_PATH(EMBREE_INCLUDE_DIR include ) +IF(NOT (APPLE AND ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64"))) + SET(_embree_SIMD_COMPONENTS + embree_sse42 + embree_avx + embree_avx2 + ) +ENDIF() SET(_embree_FIND_COMPONENTS embree3 - embree_sse42 - embree_avx - embree_avx2 + ${_embree_SIMD_COMPONENTS} lexers math simd diff --git a/build_files/cmake/Modules/FindHaru.cmake b/build_files/cmake/Modules/FindHaru.cmake index 5774f83b8c5..7db57a6adfb 100644 --- a/build_files/cmake/Modules/FindHaru.cmake +++ b/build_files/cmake/Modules/FindHaru.cmake @@ -35,11 +35,13 @@ find_path(HARU_INCLUDE_DIR ${_haru_SEARCH_DIRS} PATH_SUFFIXES include/haru + include ) find_library(HARU_LIBRARY NAMES hpdfs + hpdf HINTS ${_haru_SEARCH_DIRS} PATH_SUFFIXES diff --git a/build_files/cmake/Modules/FindOpenColorIO.cmake b/build_files/cmake/Modules/FindOpenColorIO.cmake index 5c0ad89a0b7..21118533ebe 100644 --- a/build_files/cmake/Modules/FindOpenColorIO.cmake +++ b/build_files/cmake/Modules/FindOpenColorIO.cmake @@ -26,7 +26,8 @@ ENDIF() SET(_opencolorio_FIND_COMPONENTS OpenColorIO yaml-cpp - tinyxml + expat + pystring ) SET(_opencolorio_SEARCH_DIRS @@ -60,12 +61,23 @@ FOREACH(COMPONENT ${_opencolorio_FIND_COMPONENTS}) ENDIF() ENDFOREACH() +IF(EXISTS "${OPENCOLORIO_INCLUDE_DIR}/OpenColorIO/OpenColorABI.h") + # Search twice, because this symbol changed between OCIO 1.x and 2.x + FILE(STRINGS "${OPENCOLORIO_INCLUDE_DIR}/OpenColorIO/OpenColorABI.h" _opencolorio_version + REGEX "^#define OCIO_VERSION_STR[ \t].*$") + IF(NOT _opencolorio_version) + file(STRINGS "${OPENCOLORIO_INCLUDE_DIR}/OpenColorIO/OpenColorABI.h" _opencolorio_version + REGEX "^#define OCIO_VERSION[ \t].*$") + ENDIF() + STRING(REGEX MATCHALL "[0-9]+[.0-9]+" OPENCOLORIO_VERSION ${_opencolorio_version}) +ENDIF() # handle the QUIETLY and REQUIRED arguments and set OPENCOLORIO_FOUND to TRUE if # all listed variables are TRUE INCLUDE(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenColorIO DEFAULT_MSG - _opencolorio_LIBRARIES OPENCOLORIO_INCLUDE_DIR) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenColorIO + REQUIRED_VARS _opencolorio_LIBRARIES OPENCOLORIO_INCLUDE_DIR + VERSION_VAR OPENCOLORIO_VERSION) IF(OPENCOLORIO_FOUND) SET(OPENCOLORIO_LIBRARIES ${_opencolorio_LIBRARIES}) @@ -78,6 +90,7 @@ MARK_AS_ADVANCED( OPENCOLORIO_OPENCOLORIO_LIBRARY OPENCOLORIO_TINYXML_LIBRARY OPENCOLORIO_YAML-CPP_LIBRARY + OPENCOLORIO_VERSION ) UNSET(COMPONENT) diff --git a/build_files/cmake/Modules/FindPythonLibsUnix.cmake b/build_files/cmake/Modules/FindPythonLibsUnix.cmake index 5b3f2e52256..78f8e03807f 100644 --- a/build_files/cmake/Modules/FindPythonLibsUnix.cmake +++ b/build_files/cmake/Modules/FindPythonLibsUnix.cmake @@ -34,7 +34,7 @@ IF(NOT PYTHON_ROOT_DIR AND NOT $ENV{PYTHON_ROOT_DIR} STREQUAL "") SET(PYTHON_ROOT_DIR $ENV{PYTHON_ROOT_DIR}) ENDIF() -SET(PYTHON_VERSION 3.7 CACHE STRING "Python Version (major and minor only)") +SET(PYTHON_VERSION 3.9 CACHE STRING "Python Version (major and minor only)") MARK_AS_ADVANCED(PYTHON_VERSION) @@ -73,8 +73,8 @@ SET(_python_SEARCH_DIRS # only search for the dirs if we haven't already IF((NOT _IS_INC_DEF) OR (NOT _IS_INC_CONF_DEF) OR (NOT _IS_LIB_DEF) OR (NOT _IS_LIB_PATH_DEF)) SET(_PYTHON_ABI_FLAGS_TEST - "m;mu;u; " # release - "dm;dmu;du;d" # debug + "u; " # release + "du;d" # debug ) FOREACH(_CURRENT_ABI_FLAGS ${_PYTHON_ABI_FLAGS_TEST}) diff --git a/build_files/cmake/Modules/Findsse2neon.cmake b/build_files/cmake/Modules/Findsse2neon.cmake new file mode 100644 index 00000000000..2159dfac114 --- /dev/null +++ b/build_files/cmake/Modules/Findsse2neon.cmake @@ -0,0 +1,49 @@ +# - Find sse2neon library +# Find the native sse2neon includes and library +# This module defines +# SSE2NEON_INCLUDE_DIRS, where to find sse2neon.h, Set when +# SSE2NEON_INCLUDE_DIR is found. +# SSE2NEON_ROOT_DIR, The base directory to search for sse2neon. +# This can also be an environment variable. +# SSE2NEON_FOUND, If false, do not try to use sse2neon. + +#============================================================================= +# Copyright 2020 Blender Foundation. +# +# Distributed under the OSI-approved BSD 3-Clause License, +# see accompanying file BSD-3-Clause-license.txt for details. +#============================================================================= + +# If SSE2NEON_ROOT_DIR was defined in the environment, use it. +IF(NOT SSE2NEON_ROOT_DIR AND NOT $ENV{SSE2NEON_ROOT_DIR} STREQUAL "") + SET(SSE2NEON_ROOT_DIR $ENV{SSE2NEON_ROOT_DIR}) +ENDIF() + +SET(_sse2neon_SEARCH_DIRS + ${SSE2NEON_ROOT_DIR} +) + +FIND_PATH(SSE2NEON_INCLUDE_DIR + NAMES + sse2neon.h + HINTS + ${_sse2neon_SEARCH_DIRS} + PATH_SUFFIXES + include +) + +# handle the QUIETLY and REQUIRED arguments and set SSE2NEON_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(sse2neon DEFAULT_MSG + SSE2NEON_INCLUDE_DIR) + +IF(SSE2NEON_FOUND) + SET(SSE2NEON_INCLUDE_DIRS ${SSE2NEON_INCLUDE_DIR}) +ENDIF(SSE2NEON_FOUND) + +MARK_AS_ADVANCED( + SSE2NEON_INCLUDE_DIR +) + +UNSET(_sse2neon_SEARCH_DIRS) diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake index aebcd25e3b6..b8f92a10761 100644 --- a/build_files/cmake/macros.cmake +++ b/build_files/cmake/macros.cmake @@ -668,12 +668,6 @@ macro(TEST_SSE_SUPPORT #include int main(void) { __m128 v = _mm_setzero_ps(); return 0; }" SUPPORT_SSE_BUILD) - - if(SUPPORT_SSE_BUILD) - message(STATUS "SSE Support: detected.") - else() - message(STATUS "SSE Support: missing.") - endif() endif() if(NOT DEFINED SUPPORT_SSE2_BUILD) @@ -682,17 +676,19 @@ macro(TEST_SSE_SUPPORT #include int main(void) { __m128d v = _mm_setzero_pd(); return 0; }" SUPPORT_SSE2_BUILD) - - if(SUPPORT_SSE2_BUILD) - message(STATUS "SSE2 Support: detected.") - else() - message(STATUS "SSE2 Support: missing.") - endif() endif() unset(CMAKE_REQUIRED_FLAGS) endmacro() +macro(TEST_NEON_SUPPORT) + include(CheckCXXSourceCompiles) + check_cxx_source_compiles( + "#include + int main() {return vaddvq_s32(vdupq_n_s32(1));}" + SUPPORT_NEON_BUILD) +endmacro() + # Only print message if running CMake first time macro(message_first_run) if(FIRST_RUN) diff --git a/build_files/cmake/platform/platform_apple.cmake b/build_files/cmake/platform/platform_apple.cmake index 8a7792bd886..12a7a6c504f 100644 --- a/build_files/cmake/platform/platform_apple.cmake +++ b/build_files/cmake/platform/platform_apple.cmake @@ -131,22 +131,22 @@ if(WITH_CODEC_SNDFILE) endif() if(WITH_PYTHON) - # we use precompiled libraries for py 3.7 and up by default - set(PYTHON_VERSION 3.7) + # we use precompiled libraries for py 3.9 and up by default + set(PYTHON_VERSION 3.9) if(NOT WITH_PYTHON_MODULE AND NOT WITH_PYTHON_FRAMEWORK) # normally cached but not since we include them with blender - set(PYTHON_INCLUDE_DIR "${LIBDIR}/python/include/python${PYTHON_VERSION}m") - set(PYTHON_EXECUTABLE "${LIBDIR}/python/bin/python${PYTHON_VERSION}m") - set(PYTHON_LIBRARY ${LIBDIR}/python/lib/libpython${PYTHON_VERSION}m.a) + set(PYTHON_INCLUDE_DIR "${LIBDIR}/python/include/python${PYTHON_VERSION}") + set(PYTHON_EXECUTABLE "${LIBDIR}/python/bin/python${PYTHON_VERSION}") + set(PYTHON_LIBRARY ${LIBDIR}/python/lib/libpython${PYTHON_VERSION}.a) set(PYTHON_LIBPATH "${LIBDIR}/python/lib/python${PYTHON_VERSION}") # set(PYTHON_LINKFLAGS "-u _PyMac_Error") # won't build with this enabled else() # module must be compiled against Python framework set(_py_framework "/Library/Frameworks/Python.framework/Versions/${PYTHON_VERSION}") - set(PYTHON_INCLUDE_DIR "${_py_framework}/include/python${PYTHON_VERSION}m") - set(PYTHON_EXECUTABLE "${_py_framework}/bin/python${PYTHON_VERSION}m") - set(PYTHON_LIBPATH "${_py_framework}/lib/python${PYTHON_VERSION}/config-${PYTHON_VERSION}m") + set(PYTHON_INCLUDE_DIR "${_py_framework}/include/python${PYTHON_VERSION}") + set(PYTHON_EXECUTABLE "${_py_framework}/bin/python${PYTHON_VERSION}") + set(PYTHON_LIBPATH "${_py_framework}/lib/python${PYTHON_VERSION}/config-${PYTHON_VERSION}") # set(PYTHON_LIBRARY python${PYTHON_VERSION}) # set(PYTHON_LINKFLAGS "-u _PyMac_Error -framework Python") # won't build with this enabled @@ -206,6 +206,13 @@ set(PLATFORM_LINKFLAGS list(APPEND PLATFORM_LINKLIBS c++) +if(WITH_OPENIMAGEDENOISE) + if("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64") + # OpenImageDenoise uses BNNS from the Accelerate framework. + string(APPEND PLATFORM_LINKFLAGS " -framework Accelerate") + endif() +endif() + if(WITH_JACK) string(APPEND PLATFORM_LINKFLAGS " -F/Library/Frameworks -weak_framework jackmp") endif() @@ -297,7 +304,12 @@ if(WITH_OPENIMAGEIO) endif() if(WITH_OPENCOLORIO) - find_package(OpenColorIO) + find_package(OpenColorIO 2.0.0) + + if(NOT OPENCOLORIO_FOUND) + set(WITH_OPENCOLORIO OFF) + message(STATUS "OpenColorIO not found") + endif() endif() if(WITH_OPENVDB) @@ -309,8 +321,11 @@ if(WITH_OPENVDB) endif() if(WITH_NANOVDB) - set(NANOVDB ${LIBDIR}/nanovdb) - set(NANOVDB_INCLUDE_DIR ${NANOVDB}/include) + find_package(NanoVDB) +endif() + +if(WITH_CPU_SIMD) + find_package(sse2neon) endif() if(WITH_LLVM) @@ -318,6 +333,13 @@ if(WITH_LLVM) if(NOT LLVM_FOUND) message(FATAL_ERROR "LLVM not found.") endif() + if(WITH_CLANG) + find_package(Clang) + if(NOT CLANG_FOUND) + message(FATAL_ERROR "Clang not found.") + endif() + endif() + endif() if(WITH_CYCLES_OSL) @@ -330,7 +352,7 @@ if(WITH_CYCLES_OSL) list(APPEND OSL_LIBRARIES ${OSL_LIB_COMP} -force_load ${OSL_LIB_EXEC} ${OSL_LIB_QUERY}) find_path(OSL_INCLUDE_DIR OSL/oslclosure.h PATHS ${CYCLES_OSL}/include) find_program(OSL_COMPILER NAMES oslc PATHS ${CYCLES_OSL}/bin) - find_path(OSL_SHADER_DIR NAMES stdosl.h PATHS ${CYCLES_OSL}/shaders) + find_path(OSL_SHADER_DIR NAMES stdosl.h PATHS ${CYCLES_OSL}/share/OSL/shaders) if(OSL_INCLUDE_DIR AND OSL_LIBRARIES AND OSL_COMPILER AND OSL_SHADER_DIR) set(OSL_FOUND TRUE) @@ -340,12 +362,6 @@ if(WITH_CYCLES_OSL) endif() endif() -if("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64") - set(WITH_CYCLES_EMBREE OFF) - set(WITH_OPENIMAGEDENOISE OFF) - set(WITH_CPU_SSE OFF) -endif() - if(WITH_CYCLES_EMBREE) find_package(Embree 3.8.0 REQUIRED) # Increase stack size for Embree, only works for executables. @@ -394,7 +410,7 @@ if(WITH_OPENMP) set(OPENMP_FOUND ON) set(OpenMP_C_FLAGS "-Xclang -fopenmp -I'${LIBDIR}/openmp/include'") set(OpenMP_CXX_FLAGS "-Xclang -fopenmp -I'${LIBDIR}/openmp/include'") - string(APPEND CMAKE_EXE_LINKER_FLAGS " -L'${LIBDIR}/openmp/lib' -lomp") + set(OpenMP_LINKER_FLAGS "-L'${LIBDIR}/openmp/lib' -lomp") # Copy libomp.dylib to allow executables like datatoc and tests to work. # `@executable_path/../Resources/lib/` is a default dylib search path. diff --git a/build_files/cmake/platform/platform_apple_xcode.cmake b/build_files/cmake/platform/platform_apple_xcode.cmake index f12de540353..43bdafb8ce2 100644 --- a/build_files/cmake/platform/platform_apple_xcode.cmake +++ b/build_files/cmake/platform/platform_apple_xcode.cmake @@ -20,6 +20,7 @@ # Xcode and system configuration for Apple. +# Detect processor architecture. if(NOT CMAKE_OSX_ARCHITECTURES) execute_process(COMMAND uname -m OUTPUT_VARIABLE ARCHITECTURE OUTPUT_STRIP_TRAILING_WHITESPACE) message(STATUS "Detected native architecture ${ARCHITECTURE}.") @@ -28,56 +29,93 @@ if(NOT CMAKE_OSX_ARCHITECTURES) FORCE) endif() -if(NOT DEFINED OSX_SYSTEM) - execute_process( - COMMAND xcodebuild -version -sdk macosx SDKVersion - OUTPUT_VARIABLE OSX_SYSTEM - OUTPUT_STRIP_TRAILING_WHITESPACE) -endif() - -# workaround for incorrect cmake xcode lookup for developer previews - XCODE_VERSION does not -# take xcode-select path into account but would always look into /Applications/Xcode.app -# while dev versions are named Xcode-DP +# Detect developer directory. Depending on configuration this may be either +# an Xcode or Command Line Tools installation. execute_process( COMMAND xcode-select --print-path - OUTPUT_VARIABLE XCODE_CHECK OUTPUT_STRIP_TRAILING_WHITESPACE) -string(REPLACE "/Contents/Developer" "" XCODE_BUNDLE ${XCODE_CHECK}) # truncate to bundlepath in any case + OUTPUT_VARIABLE XCODE_DEVELOPER_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) +# Detect Xcode version. It is provided by the Xcode generator but not +# Unix Makefiles or Ninja. if(NOT ${CMAKE_GENERATOR} MATCHES "Xcode") - # Unix makefile generator does not fill XCODE_VERSION var, so we get it with a command. # Note that `xcodebuild -version` gives output in two lines: first line will include # Xcode version, second one will include build number. We are only interested in the - # former one. Here is an example of the output: + # first line. Here is an example of the output: # Xcode 11.4 # Build version 11E146 # The expected XCODE_VERSION in this case is 11.4. + execute_process( + COMMAND xcodebuild -version + OUTPUT_VARIABLE _xcode_vers_build_nr + RESULT_VARIABLE _xcode_vers_result + ERROR_QUIET) - execute_process(COMMAND xcodebuild -version OUTPUT_VARIABLE XCODE_VERS_BUILD_NR) + if(_xcode_vers_result EQUAL 0) + # Convert output to a single line by replacing newlines with spaces. + # This is needed because regex replace can not operate through the newline character + # and applies substitutions for each individual lines. + string(REPLACE "\n" " " _xcode_vers_build_nr_single_line "${_xcode_vers_build_nr}") + string(REGEX REPLACE "(.*)Xcode ([0-9\\.]+).*" "\\2" XCODE_VERSION "${_xcode_vers_build_nr_single_line}") + unset(_xcode_vers_build_nr_single_line) + endif() - # Convert output to a single line by replacling newlines with spaces. - # This is needed because regex replace can not operate through the newline character - # and applies substitutions for each individual lines. - string(REPLACE "\n" " " XCODE_VERS_BUILD_NR_SINGLE_LINE "${XCODE_VERS_BUILD_NR}") - - string(REGEX REPLACE "(.*)Xcode ([0-9\\.]+).*" "\\2" XCODE_VERSION "${XCODE_VERS_BUILD_NR_SINGLE_LINE}") - - unset(XCODE_VERS_BUILD_NR) - unset(XCODE_VERS_BUILD_NR_SINGLE_LINE) + unset(_xcode_vers_build_nr) + unset(_xcode_vers_result) endif() -message(STATUS "Detected OS X ${OSX_SYSTEM} and Xcode ${XCODE_VERSION} at ${XCODE_BUNDLE}") +if(XCODE_VERSION) + # Construct SDKs path ourselves, because xcode-select path could be ambiguous. + # Both /Applications/Xcode.app/Contents/Developer or /Applications/Xcode.app would be allowed. + set(XCODE_SDK_DIR ${XCODE_DEVELOPER_DIR}/Platforms/MacOSX.platform//Developer/SDKs) + + # Detect SDK version to use + if(NOT DEFINED OSX_SYSTEM) + execute_process( + COMMAND xcodebuild -version -sdk macosx SDKVersion + OUTPUT_VARIABLE OSX_SYSTEM + OUTPUT_STRIP_TRAILING_WHITESPACE) + endif() + + message(STATUS "Detected OS X ${OSX_SYSTEM} and Xcode ${XCODE_VERSION} at ${XCODE_DEVELOPER_DIR}") + message(STATUS "SDKs Directory: " ${XCODE_SDK_DIR}) +else() + # If no Xcode version found, try detecting command line tools. + execute_process( + COMMAND pkgutil --pkg-info=com.apple.pkg.CLTools_Executables + OUTPUT_VARIABLE _cltools_pkg_info + OUTPUT_STRIP_TRAILING_WHITESPACE + RESULT_VARIABLE _cltools_pkg_info_result + ERROR_QUIET) + + if(_cltools_pkg_info_result EQUAL 0) + # Extract version. + string(REGEX REPLACE ".*version: ([0-9]+)\\.([0-9]+).*" "\\1.\\2" XCODE_VERSION "${_cltools_pkg_info}") + # SDK directory. + set(XCODE_SDK_DIR "${XCODE_DEVELOPER_DIR}/SDKs") + + # Detect SDK version to use. + if(NOT DEFINED OSX_SYSTEM) + execute_process( + COMMAND xcrun --show-sdk-version + OUTPUT_VARIABLE OSX_SYSTEM + OUTPUT_STRIP_TRAILING_WHITESPACE) + endif() + + message(STATUS "Detected OS X ${OSX_SYSTEM} and Command Line Tools ${XCODE_VERSION} at ${XCODE_DEVELOPER_DIR}") + message(STATUS "SDKs Directory: " ${XCODE_SDK_DIR}) + else() + message(FATAL_ERROR "No Xcode or Command Line Tools detected") + endif() + + unset( _cltools_pkg_info) + unset(__cltools_pkg_info_result) +endif() # Require a relatively recent Xcode version. if(${XCODE_VERSION} VERSION_LESS 10.0) message(FATAL_ERROR "Only Xcode version 10.0 and newer is supported") endif() -# note: xcode-select path could be ambiguous, -# cause /Applications/Xcode.app/Contents/Developer or /Applications/Xcode.app would be allowed -# so i use a selfcomposed bundlepath here -set(OSX_SYSROOT_PREFIX ${XCODE_BUNDLE}/Contents/Developer/Platforms/MacOSX.platform) -message(STATUS "OSX_SYSROOT_PREFIX: " ${OSX_SYSROOT_PREFIX}) - # Collect list of OSX system versions which will be used to detect path to corresponding SDK. # Start with macOS SDK version reported by xcodebuild and include possible extra ones. # @@ -101,10 +139,9 @@ endif() # Loop through all possible versions and pick the first one which resolves to a valid SDK path. set(OSX_SDK_PATH) set(OSX_SDK_FOUND FALSE) -set(OSX_SDK_PREFIX ${OSX_SYSROOT_PREFIX}/Developer/SDKs) set(OSX_SDKROOT) foreach(OSX_SDK_VERSION ${OSX_SDK_TEST_VERSIONS}) - set(CURRENT_OSX_SDK_PATH "${OSX_SDK_PREFIX}/MacOSX${OSX_SDK_VERSION}.sdk") + set(CURRENT_OSX_SDK_PATH "${XCODE_SDK_DIR}/MacOSX${OSX_SDK_VERSION}.sdk") if(EXISTS ${CURRENT_OSX_SDK_PATH}) set(OSX_SDK_PATH "${CURRENT_OSX_SDK_PATH}") set(OSX_SDKROOT macosx${OSX_SDK_VERSION}) @@ -112,7 +149,6 @@ foreach(OSX_SDK_VERSION ${OSX_SDK_TEST_VERSIONS}) break() endif() endforeach() -unset(OSX_SDK_PREFIX) unset(OSX_SDK_TEST_VERSIONS) if(NOT OSX_SDK_FOUND) diff --git a/build_files/cmake/platform/platform_unix.cmake b/build_files/cmake/platform/platform_unix.cmake index 7ded075e8e3..ef73ef40ac3 100644 --- a/build_files/cmake/platform/platform_unix.cmake +++ b/build_files/cmake/platform/platform_unix.cmake @@ -70,6 +70,7 @@ if(EXISTS ${LIBDIR}) set(BOOST_LIBRARYDIR ${LIBDIR}/boost/lib) set(Boost_NO_SYSTEM_PATHS ON) set(OPENEXR_ROOT_DIR ${LIBDIR}/openexr) + set(CLANG_ROOT_DIR ${LIBDIR}/llvm) endif() if(WITH_STATIC_LIBS) @@ -284,6 +285,10 @@ if(WITH_NANOVDB) endif() endif() +if(WITH_CPU_SIMD) + find_package_wrapper(sse2neon) +endif() + if(WITH_ALEMBIC) find_package_wrapper(Alembic) @@ -385,7 +390,7 @@ if(WITH_OPENIMAGEIO) endif() if(WITH_OPENCOLORIO) - find_package_wrapper(OpenColorIO) + find_package_wrapper(OpenColorIO 2.0.0) set(OPENCOLORIO_LIBRARIES ${OPENCOLORIO_LIBRARIES}) set(OPENCOLORIO_LIBPATH) # TODO, remove and reference the absolute path everywhere @@ -416,7 +421,9 @@ if(WITH_LLVM) endif() find_package_wrapper(LLVM) - + if(WITH_CLANG) + find_package_wrapper(Clang) + endif() # Symbol conflicts with same UTF library used by OpenCollada if(EXISTS ${LIBDIR}) if(WITH_OPENCOLLADA AND (${LLVM_VERSION} VERSION_LESS "4.0.0")) @@ -426,7 +433,13 @@ if(WITH_LLVM) if(NOT LLVM_FOUND) set(WITH_LLVM OFF) + set(WITH_CLANG OFF) message(STATUS "LLVM not found") + else() + if(NOT CLANG_FOUND) + set(WITH_CLANG OFF) + message(STATUS "Clang not found") + endif() endif() endif() @@ -470,6 +483,14 @@ if(WITH_POTRACE) endif() endif() +if(WITH_HARU) + find_package_wrapper(Haru) + if(NOT HARU_FOUND) + message(WARNING "Haru not found, disabling WITH_HARU") + set(WITH_HARU OFF) + endif() +endif() + if(EXISTS ${LIBDIR}) without_system_libs_end() endif() diff --git a/build_files/cmake/platform/platform_win32.cmake b/build_files/cmake/platform/platform_win32.cmake index 69a78ba7ca6..acd6028e2ae 100644 --- a/build_files/cmake/platform/platform_win32.cmake +++ b/build_files/cmake/platform/platform_win32.cmake @@ -49,7 +49,7 @@ if(CMAKE_C_COMPILER_ID MATCHES "Clang") if(NOT EXISTS "${CLANG_OPENMP_DLL}") message(FATAL_ERROR "Clang OpenMP library (${CLANG_OPENMP_DLL}) not found.") endif() - string(APPEND CMAKE_EXE_LINKER_FLAGS " \"${CLANG_OPENMP_LIB}\"") + set(OpenMP_LINKER_FLAGS "\"${CLANG_OPENMP_LIB}\"") endif() if(WITH_WINDOWS_STRIPPED_PDB) message(WARNING "stripped pdb not supported with clang, disabling..") @@ -119,6 +119,7 @@ string(APPEND CMAKE_MODULE_LINKER_FLAGS " /SAFESEH:NO /ignore:4099") list(APPEND PLATFORM_LINKLIBS ws2_32 vfw32 winmm kernel32 user32 gdi32 comdlg32 Comctl32 version advapi32 shfolder shell32 ole32 oleaut32 uuid psapi Dbghelp Shlwapi + pathcch ) if(WITH_INPUT_IME) @@ -421,7 +422,7 @@ if(WITH_JACK) endif() if(WITH_PYTHON) - set(PYTHON_VERSION 3.7) # CACHE STRING) + set(PYTHON_VERSION 3.9) # CACHE STRING) string(REPLACE "." "" _PYTHON_VERSION_NO_DOTS ${PYTHON_VERSION}) set(PYTHON_LIBRARY ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/libs/python${_PYTHON_VERSION_NO_DOTS}.lib) @@ -454,10 +455,18 @@ if(WITH_BOOST) set(BOOST ${LIBDIR}/boost) set(BOOST_INCLUDE_DIR ${BOOST}/include) set(BOOST_LIBPATH ${BOOST}/lib) - if(CMAKE_CL_64) - set(BOOST_POSTFIX "vc141-mt-x64-1_70.lib") - set(BOOST_DEBUG_POSTFIX "vc141-mt-gd-x64-1_70.lib") + set(BOOST_VERSION_HEADER ${BOOST_INCLUDE_DIR}/boost/version.hpp) + if(EXISTS ${BOOST_VERSION_HEADER}) + file(STRINGS "${BOOST_VERSION_HEADER}" BOOST_LIB_VERSION REGEX "#define BOOST_LIB_VERSION ") + if(BOOST_LIB_VERSION MATCHES "#define BOOST_LIB_VERSION \"([0-9_]+)\"") + set(BOOST_VERSION "${CMAKE_MATCH_1}") + endif() endif() + if(NOT BOOST_VERSION) + message(FATAL_ERROR "Unable to determine Boost version") + endif() + set(BOOST_POSTFIX "vc141-mt-x64-${BOOST_VERSION}.lib") + set(BOOST_DEBUG_POSTFIX "vc141-mt-gd-x64-${BOOST_VERSION}.lib") set(BOOST_LIBRARIES optimized ${BOOST_LIBPATH}/libboost_date_time-${BOOST_POSTFIX} optimized ${BOOST_LIBPATH}/libboost_filesystem-${BOOST_POSTFIX} @@ -500,7 +509,7 @@ if(WITH_OPENIMAGEIO) set(OPENIMAGEIO_LIBRARIES ${OIIO_OPTIMIZED} ${OIIO_DEBUG}) set(OPENIMAGEIO_DEFINITIONS "-DUSE_TBB=0") - set(OPENCOLORIO_DEFINITIONS "-DOCIO_STATIC_BUILD") + set(OPENCOLORIO_DEFINITIONS "-DDOpenColorIO_SKIP_IMPORTS") set(OPENIMAGEIO_IDIFF "${OPENIMAGEIO}/bin/idiff.exe") add_definitions(-DOIIO_STATIC_DEFINE) add_definitions(-DOIIO_NO_SSE=1) @@ -538,11 +547,13 @@ if(WITH_OPENCOLORIO) set(OPENCOLORIO_LIBPATH ${OPENCOLORIO}/lib) set(OPENCOLORIO_LIBRARIES optimized ${OPENCOLORIO_LIBPATH}/OpenColorIO.lib - optimized ${OPENCOLORIO_LIBPATH}/tinyxml.lib optimized ${OPENCOLORIO_LIBPATH}/libyaml-cpp.lib + optimized ${OPENCOLORIO_LIBPATH}/libexpatMD.lib + optimized ${OPENCOLORIO_LIBPATH}/pystring.lib debug ${OPENCOLORIO_LIBPATH}/OpencolorIO_d.lib - debug ${OPENCOLORIO_LIBPATH}/tinyxml_d.lib debug ${OPENCOLORIO_LIBPATH}/libyaml-cpp_d.lib + debug ${OPENCOLORIO_LIBPATH}/libexpatdMD.lib + debug ${OPENCOLORIO_LIBPATH}/pystring_d.lib ) set(OPENCOLORIO_DEFINITIONS) endif() @@ -661,6 +672,10 @@ endif() if(WITH_CYCLES_OSL) set(CYCLES_OSL ${LIBDIR}/osl CACHE PATH "Path to OpenShadingLanguage installation") set(OSL_SHADER_DIR ${CYCLES_OSL}/shaders) + # Shaders have moved around a bit between OSL versions, check multiple locations + if(NOT EXISTS "${OSL_SHADER_DIR}") + set(OSL_SHADER_DIR ${CYCLES_OSL}/share/OSL/shaders) + endif() find_library(OSL_LIB_EXEC NAMES oslexec PATHS ${CYCLES_OSL}/lib) find_library(OSL_LIB_COMP NAMES oslcomp PATHS ${CYCLES_OSL}/lib) find_library(OSL_LIB_QUERY NAMES oslquery PATHS ${CYCLES_OSL}/lib) @@ -781,7 +796,14 @@ if(WITH_XR_OPENXR) set(XR_OPENXR_SDK ${LIBDIR}/xr_openxr_sdk) set(XR_OPENXR_SDK_LIBPATH ${LIBDIR}/xr_openxr_sdk/lib) set(XR_OPENXR_SDK_INCLUDE_DIR ${XR_OPENXR_SDK}/include) - set(XR_OPENXR_SDK_LIBRARIES optimized ${XR_OPENXR_SDK_LIBPATH}/openxr_loader.lib debug ${XR_OPENXR_SDK_LIBPATH}/openxr_loader_d.lib) + # This is the old name of this library, it is checked to + # support the transition between the old and new lib versions + # this can be removed after the next lib update. + if(EXISTS ${XR_OPENXR_SDK_LIBPATH}/openxr_loader_d.lib) + set(XR_OPENXR_SDK_LIBRARIES optimized ${XR_OPENXR_SDK_LIBPATH}/openxr_loader.lib debug ${XR_OPENXR_SDK_LIBPATH}/openxr_loader_d.lib) + else() + set(XR_OPENXR_SDK_LIBRARIES optimized ${XR_OPENXR_SDK_LIBPATH}/openxr_loader.lib debug ${XR_OPENXR_SDK_LIBPATH}/openxr_loaderd.lib) + endif() else() message(WARNING "OpenXR-SDK was not found, disabling WITH_XR_OPENXR") set(WITH_XR_OPENXR OFF) diff --git a/build_files/cmake/project_info.py b/build_files/cmake/project_info.py index 5980d48f85d..dd81602630e 100755 --- a/build_files/cmake/project_info.py +++ b/build_files/cmake/project_info.py @@ -220,14 +220,12 @@ def cmake_advanced_info(): def cmake_cache_var(var): - cache_file = open(join(CMAKE_DIR, "CMakeCache.txt"), encoding='utf-8') - lines = [ - l_strip for l in cache_file - for l_strip in (l.strip(),) - if l_strip - if not l_strip.startswith(("//", "#")) - ] - cache_file.close() + with open(os.path.join(CMAKE_DIR, "CMakeCache.txt"), encoding='utf-8') as cache_file: + lines = [ + l_strip for l in cache_file + if (l_strip := l.strip()) + if not l_strip.startswith(("//", "#")) + ] for l in lines: if l.split(":")[0] == var: diff --git a/doc/python_api/examples/bpy.types.Depsgraph.7.py b/doc/python_api/examples/bpy.types.Depsgraph.7.py new file mode 100644 index 00000000000..61209a6b9d2 --- /dev/null +++ b/doc/python_api/examples/bpy.types.Depsgraph.7.py @@ -0,0 +1,64 @@ +""" +Dependency graph: Object.to_curve() ++++++++++++++++++++++++++++++++++++ + +Function to get a curve from text and curve objects. It is typically used by exporters, render +engines, and tools that need to access the curve representing the object. + +The function takes the evaluated dependency graph as a required parameter and optionally a boolean +apply_modifiers which defaults to false. If apply_modifiers is true and the object is a curve object, +the spline deform modifiers are applied on the control points. Note that constructive modifiers and +modifiers that are not spline-enabled will not be applied. So modifiers like Array will not be applied +and deform modifiers that have Apply On Spline disabled will not be applied. + +If the object is a text object. The text will be converted into a 3D curve and returned. Modifiers are +never applied on text objects and apply_modifiers will be ignored. If the object is neither a curve nor +a text object, an error will be reported. + +.. note:: The resulting curve is owned by the object. It can be freed by calling `object.to_curve_clear()`. +.. note:: + The resulting curve must be treated as temporary, and can not be referenced from objects in the main + database. +""" +import bpy + + +class OBJECT_OT_object_to_curve(bpy.types.Operator): + """Convert selected object to curve and show number of splines""" + bl_label = "DEG Object to Curve" + bl_idname = "object.object_to_curve" + + def execute(self, context): + # Access input original object. + obj = context.object + if obj is None: + self.report({'INFO'}, "No active object to convert to curve") + return {'CANCELLED'} + if obj.type not in {'CURVE', 'FONT'}: + self.report({'INFO'}, "Object can not be converted to curve") + return {'CANCELLED'} + depsgraph = context.evaluated_depsgraph_get() + # Invoke to_curve() without applying modifiers. + curve_without_modifiers = obj.to_curve(depsgraph) + self.report({'INFO'}, f"{len(curve_without_modifiers.splines)} splines in a new curve without modifiers.") + # Remove temporary curve. + obj.to_curve_clear() + # Invoke to_curve() with applying modifiers. + curve_with_modifiers = obj.to_curve(depsgraph, apply_modifiers = True) + self.report({'INFO'}, f"{len(curve_with_modifiers.splines)} splines in new curve with modifiers.") + # Remove temporary curve. + obj.to_curve_clear() + return {'FINISHED'} + + +def register(): + bpy.utils.register_class(OBJECT_OT_object_to_curve) + + +def unregister(): + bpy.utils.unregister_class(OBJECT_OT_object_to_curve) + + +if __name__ == "__main__": + register() + diff --git a/doc/python_api/requirements.txt b/doc/python_api/requirements.txt index 1e538f83b31..11423966f06 100644 --- a/doc/python_api/requirements.txt +++ b/doc/python_api/requirements.txt @@ -1,2 +1,2 @@ -Sphinx==3.1.1 -sphinx_rtd_theme==0.5.0 +Sphinx==3.5.1 +sphinx_rtd_theme==0.5.1 diff --git a/doc/python_api/rst/info_api_reference.rst b/doc/python_api/rst/info_api_reference.rst index fb53fb1a992..19d09aee66c 100644 --- a/doc/python_api/rst/info_api_reference.rst +++ b/doc/python_api/rst/info_api_reference.rst @@ -186,7 +186,7 @@ For example, if you want to access the texture of a brush via Python to adjust i #. From the Sidebar expand the Brush Settings panel's *Texture* subpanel and add a new texture. *Notice the texture data-block menu itself doesn't have very useful links (you can check the tooltips).* #. The contrast setting isn't exposed in the Sidebar, so view the texture in the - :ref:`Properties Editor `. #. Open the context menu of the contrast field and select *Online Python Reference*. This takes you to ``bpy.types.Texture.contrast``. Now you can see that ``contrast`` is a property of texture. #. To find out how to access the texture from the brush check on the references at the bottom of the page. diff --git a/doc/python_api/rst/info_quickstart.rst b/doc/python_api/rst/info_quickstart.rst index 2b5bb451e62..1053a982faa 100644 --- a/doc/python_api/rst/info_quickstart.rst +++ b/doc/python_api/rst/info_quickstart.rst @@ -35,7 +35,7 @@ but not to fully cover each topic. A quick list of helpful things to know before starting: -- Enable :ref:`Developer Extra ` and :ref:`Python Tooltips `. - The :ref:`Python Console ` is great for testing one-liners; it has autocompletion so you can inspect the API quickly. diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py index 930e5b88911..2b659de1cf8 100644 --- a/doc/python_api/sphinx_doc_gen.py +++ b/doc/python_api/sphinx_doc_gen.py @@ -75,12 +75,12 @@ def rna_info_BuildRNAInfo_cache(): rna_info_BuildRNAInfo_cache.ret = None # --- end rna_info cache -# import rpdb2; rpdb2.start_embedded_debugger('test') import os import sys import inspect import shutil import logging +import warnings from textwrap import indent @@ -227,6 +227,7 @@ else: "blf", "bl_math", "imbuf", + "imbuf.types", "bmesh", "bmesh.ops", "bmesh.types", @@ -250,6 +251,8 @@ else: "gpu.types", "gpu.matrix", "gpu.select", + "gpu.shader", + "gpu.state", "gpu_extras", "idprop.types", "mathutils", @@ -1204,7 +1207,7 @@ def pycontext2sphinx(basepath): # for member in sorted(unique): # print(' "%s": ("", False),' % member) if len(context_type_map) > len(unique): - raise Exception( + warnings.warn( "Some types are not used: %s" % str([member for member in context_type_map if member not in unique])) else: @@ -1714,7 +1717,6 @@ except ModuleNotFoundError: fw("if html_theme == 'sphinx_rtd_theme':\n") fw(" html_theme_options = {\n") - fw(" 'canonical_url': 'https://docs.blender.org/api/current/',\n") # fw(" 'analytics_id': '',\n") # fw(" 'collapse_navigation': True,\n") fw(" 'sticky_navigation': False,\n") @@ -1726,6 +1728,7 @@ except ModuleNotFoundError: # not helpful since the source is generated, adds to upload size. fw("html_copy_source = False\n") fw("html_show_sphinx = False\n") + fw("html_baseurl = 'https://docs.blender.org/api/current/'\n") fw("html_use_opensearch = 'https://docs.blender.org/api/current'\n") fw("html_split_index = True\n") fw("html_static_path = ['static']\n") @@ -1975,11 +1978,13 @@ def write_rst_importable_modules(basepath): "aud": "Audio System", "blf": "Font Drawing", "imbuf": "Image Buffer", + "imbuf.types": "Image Buffer Types", "gpu": "GPU Shader Module", "gpu.types": "GPU Types", "gpu.matrix": "GPU Matrix", "gpu.select": "GPU Select", "gpu.shader": "GPU Shader", + "gpu.state": "GPU State", "bmesh": "BMesh Module", "bmesh.ops": "BMesh Operators", "bmesh.types": "BMesh Types", diff --git a/doc/python_api/sphinx_doc_gen.sh b/doc/python_api/sphinx_doc_gen.sh deleted file mode 100755 index 26c3701f3e0..00000000000 --- a/doc/python_api/sphinx_doc_gen.sh +++ /dev/null @@ -1,156 +0,0 @@ -#!/bin/sh -# run from the blender source dir -# bash doc/python_api/sphinx_doc_gen.sh -# ssh upload means you need an account on the server - -# ---------------------------------------------------------------------------- -# Upload vars - -# disable for testing -DO_UPLOAD=true -DO_EXE_BLENDER=true -DO_OUT_HTML=true -DO_OUT_HTML_ZIP=true -DO_OUT_PDF=false - -if [ -z $BLENDER_BIN ] ; then - BLENDER_BIN="./blender.bin" -fi - -if [ "$1" == "" ] ; then - echo "Expected a single argument for the username on blender.org, skipping upload step!" - DO_UPLOAD=false -else - SSH_USER=$1 - SSH_HOST=$SSH_USER"@blender.org" - SSH_UPLOAD="/data/www/vhosts/www.blender.org/api" # blender_python_api_VERSION, added after -fi - - -# ---------------------------------------------------------------------------- -# Blender Version & Info - -# 'Blender 2.53 (sub 1) Build' --> '2_53_1' as a shell script. -# "_".join(str(v) for v in bpy.app.version) -# custom blender vars -blender_srcdir=$(dirname -- $0)/../.. -blender_version_header="$blender_srcdir/source/blender/blenkernel/BKE_blender_version.h" -blender_version=$(grep "BLENDER_VERSION\s" "$blender_version_header" | awk '{print $3}') -blender_version_cycle=$(grep "BLENDER_VERSION_CYCLE\s" "$blender_version_header" | awk '{print $3}') -unset blender_version_header - -BLENDER_VERSION=$(expr $blender_version / 100)_$(expr $blender_version % 100) - -SSH_UPLOAD_FULL=$SSH_UPLOAD/"blender_python_api_"$BLENDER_VERSION - -SPHINXBASE=doc/python_api - -SPHINX_WORKDIR="$(mktemp --directory --suffix=.sphinx)" - - -# ---------------------------------------------------------------------------- -# Generate reStructuredText (blender/python only) - -if $DO_EXE_BLENDER ; then - # Don't delete existing docs, now partial updates are used for quick builds. - # - # Disable ASAN error halt since it results in nonzero exit code on any minor issue. - ASAN_OPTIONS=halt_on_error=0:${ASAN_OPTIONS} \ - $BLENDER_BIN \ - --background \ - -noaudio \ - --factory-startup \ - --python-exit-code 1 \ - --python $SPHINXBASE/sphinx_doc_gen.py \ - -- \ - --output=$SPHINX_WORKDIR - - - if (($? != 0)) ; then - echo "Generating documentation failed, aborting" - exit 1 - fi -fi - -# ---------------------------------------------------------------------------- -# Generate HTML (sphinx) - -if $DO_OUT_HTML ; then - sphinx-build -b html -j auto $SPHINX_WORKDIR/sphinx-in $SPHINX_WORKDIR/sphinx-out - - # XXX, saves space on upload and zip, should move HTML outside - # and zip up there, for now this is OK - rm -rf sphinx-out/.doctrees - - # in case we have a zip already - rm -f blender_python_reference_$BLENDER_VERSION.zip - - # ------------------------------------------------------------------------ - # ZIP the HTML dir for upload - - if $DO_OUT_HTML_ZIP ; then - # lame, temp rename dir - mv sphinx-out blender_python_reference_$BLENDER_VERSION - zip -r -9 blender_python_reference_$BLENDER_VERSION.zip blender_python_reference_$BLENDER_VERSION - mv blender_python_reference_$BLENDER_VERSION sphinx-out - fi - - cd - -fi - - -# ---------------------------------------------------------------------------- -# Generate PDF (sphinx/laytex) - -if $DO_OUT_PDF ; then - sphinx-build -n -b latex -j auto $SPHINX_WORKDIR/sphinx-in $SPHINX_WORKDIR/sphinx-out - make -C $SPHINX_WORKDIR/sphinx-out - mv $SPHINX_WORKDIR/sphinx-out/contents.pdf \ - $SPHINX_WORKDIR/sphinx-out/blender_python_reference_$BLENDER_VERSION.pdf -fi - -# ---------------------------------------------------------------------------- -# Upload to blender servers, comment this section for testing - -if $DO_UPLOAD ; then - - ssh $SSH_USER@blender.org 'rm -rf '$SSH_UPLOAD_FULL'/*' - rsync --progress -ave "ssh -p 22" $SPHINX_WORKDIR/sphinx-out/* $SSH_HOST:$SSH_UPLOAD_FULL/ - - ## symlink the dir to a static URL - #ssh $SSH_USER@blender.org 'rm '$SSH_UPLOAD'/250PythonDoc && ln -s '$SSH_UPLOAD_FULL' '$SSH_UPLOAD'/250PythonDoc' - if [ "$blender_version_cycle" = "release" ] ; then - ssh $SSH_USER@blender.org 'rm '$SSH_UPLOAD'/blender_python_api_current && ln -s '$SSH_UPLOAD_FULL' '$SSH_UPLOAD'/blender_python_api_current' - fi - - # better redirect - ssh $SSH_USER@blender.org 'echo "Redirecting...Redirecting..." > '$SSH_UPLOAD'/250PythonDoc/index.html' - - # redirect for release only so wiki can point here - if [ "$blender_version_cycle" = "release" ] ; then - ssh $SSH_USER@blender.org 'echo "Redirecting...Redirecting..." > '$SSH_UPLOAD'/blender_python_api/index.html' - fi - - if $DO_OUT_PDF ; then - # rename so local PDF has matching name. - rsync --progress -ave "ssh -p 22" \ - $SPHINX_WORKDIR/sphinx-out/blender_python_reference_$BLENDER_VERSION.pdf \ - $SSH_HOST:$SSH_UPLOAD_FULL/blender_python_reference_$BLENDER_VERSION.pdf - fi - - if $DO_OUT_HTML_ZIP ; then - rsync --progress -ave "ssh -p 22" \ - $SPHINX_WORKDIR/blender_python_reference_$BLENDER_VERSION.zip \ - $SSH_HOST:$SSH_UPLOAD_FULL/blender_python_reference_$BLENDER_VERSION.zip - fi - -fi - - -# ---------------------------------------------------------------------------- -# Print some useful text - -echo "" -echo "Finished! view the docs from: " -if $DO_OUT_HTML ; then echo " html:" $SPHINX_WORKDIR/sphinx-out/index.html ; fi -if $DO_OUT_PDF ; then echo " pdf:" $SPHINX_WORKDIR/sphinx-out/blender_python_reference_$BLENDER_VERSION.pdf ; fi diff --git a/doc/python_api/sphinx_doc_update.py b/doc/python_api/sphinx_doc_update.py deleted file mode 100755 index 71b49d4949d..00000000000 --- a/doc/python_api/sphinx_doc_update.py +++ /dev/null @@ -1,216 +0,0 @@ -#!/usr/bin/env python3 - -# ##### BEGIN GPL LICENSE BLOCK ##### -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# ##### END GPL LICENSE BLOCK ##### - -# - -""" -This is a helper script to generate Blender Python API documentation (using Sphinx), and update server data using rsync. - -You'll need to specify your user login and password, obviously. - -Example usage: - - ./sphinx_doc_update.py --jobs 16 --mirror ../../../docs/remote_api_backup/ --source ../.. --blender ../../../build_cmake/bin/blender --user foobar --password barfoo - -""" - -import os -import shutil -import subprocess -import sys -import tempfile -import zipfile - - -DEFAULT_RSYNC_SERVER = "docs.blender.org" -DEFAULT_RSYNC_ROOT = "/api/" -DEFAULT_SYMLINK_ROOT = "/data/www/vhosts/docs.blender.org/api" - - -def argparse_create(): - import argparse - global __doc__ - - # When --help or no args are given, print this help - usage_text = __doc__ - - parser = argparse.ArgumentParser(description=usage_text, - formatter_class=argparse.RawDescriptionHelpFormatter) - - parser.add_argument( - "--mirror", dest="mirror_dir", - metavar='PATH', required=True, - help="Path to local rsync mirror of api doc server") - parser.add_argument( - "--source", dest="source_dir", - metavar='PATH', required=True, - help="Path to Blender git repository") - parser.add_argument( - "--blender", dest="blender", - metavar='PATH', required=True, - help="Path to Blender executable") - parser.add_argument( - "--rsync-server", dest="rsync_server", default=DEFAULT_RSYNC_SERVER, - metavar='RSYNCSERVER', type=str, required=False, - help=("rsync server address")) - parser.add_argument( - "--rsync-root", dest="rsync_root", default=DEFAULT_RSYNC_ROOT, - metavar='RSYNCROOT', type=str, required=False, - help=("Root path of API doc on rsync server")) - parser.add_argument( - "--user", dest="user", - metavar='USER', type=str, required=True, - help=("User to login on rsync server")) - parser.add_argument( - "--password", dest="password", - metavar='PASSWORD', type=str, required=True, - help=("Password to login on rsync server")) - parser.add_argument( - "--jobs", dest="jobs_nr", - metavar='NR', type=int, required=False, default=1, - help="Number of sphinx building jobs to launch in parallel") - - return parser - - -def main(): - # ---------- - # Parse Args - - args = argparse_create().parse_args() - - rsync_base = "rsync://%s@%s:%s" % (args.user, args.rsync_server, args.rsync_root) - - blenver = api_blenver = api_blenver_zip = "" - api_name = "" - branch = "" - is_release = is_beta = False - - # I) Update local mirror using rsync. - rsync_mirror_cmd = ("rsync", "--delete-after", "-avzz", rsync_base, args.mirror_dir) - subprocess.run(rsync_mirror_cmd, env=dict(os.environ, RSYNC_PASSWORD=args.password)) - - with tempfile.TemporaryDirectory() as tmp_dir: - # II) Generate doc source in temp dir. - doc_gen_cmd = ( - args.blender, "--background", "-noaudio", "--factory-startup", "--python-exit-code", "1", - "--python", "%s/doc/python_api/sphinx_doc_gen.py" % args.source_dir, "--", - "--output", tmp_dir - ) - subprocess.run(doc_gen_cmd) - - # III) Get Blender version info. - getver_file = os.path.join(tmp_dir, "blendver.txt") - getver_script = (r"""import sys, bpy -with open(sys.argv[-1], 'w') as f: - is_release = bpy.app.version_cycle in {'rc', 'release'} - is_beta = bpy.app.version_cycle in {'beta'} - branch = bpy.app.build_branch.split()[0].decode() - f.write('%d\n' % is_release) - f.write('%d\n' % is_beta) - f.write('%s\n' % branch) - f.write('%d.%d\n' % (bpy.app.version[0], bpy.app.version[1])) - f.write('%d.%d\n' % (bpy.app.version[0], bpy.app.version[1]) - if (is_release or is_beta) else '%s\n' % branch) - f.write('%d_%d' % (bpy.app.version[0], bpy.app.version[1])) -""") - get_ver_cmd = (args.blender, "--background", "-noaudio", "--factory-startup", "--python-exit-code", "1", - "--python-expr", getver_script, "--", getver_file) - subprocess.run(get_ver_cmd) - with open(getver_file) as f: - is_release, is_beta, branch, blenver, api_blenver, api_blenver_zip = f.read().split("\n") - is_release = bool(int(is_release)) - is_beta = bool(int(is_beta)) - os.remove(getver_file) - - # IV) Build doc. - curr_dir = os.getcwd() - os.chdir(tmp_dir) - sphinx_cmd = ("sphinx-build", "-j", str(args.jobs_nr), "-b", "html", "sphinx-in", "sphinx-out") - subprocess.run(sphinx_cmd) - shutil.rmtree(os.path.join("sphinx-out", ".doctrees")) - os.chdir(curr_dir) - - # V) Cleanup existing matching dir in server mirror (if any), and copy new doc. - api_name = api_blenver - api_dir = os.path.join(args.mirror_dir, api_name) - if os.path.exists(api_dir): - if os.path.islink(api_dir): - os.remove(api_dir) - else: - shutil.rmtree(api_dir) - os.rename(os.path.join(tmp_dir, "sphinx-out"), api_dir) - - # VI) Create zip archive. - zip_name = "blender_python_reference_%s" % api_blenver_zip # We can't use 'release' postfix here... - zip_path = os.path.join(args.mirror_dir, zip_name) - with zipfile.ZipFile(zip_path, 'w') as zf: - for dirname, _, filenames in os.walk(api_dir): - for filename in filenames: - filepath = os.path.join(dirname, filename) - zip_filepath = os.path.join(zip_name, os.path.relpath(filepath, api_dir)) - zf.write(filepath, arcname=zip_filepath) - os.rename(zip_path, os.path.join(api_dir, "%s.zip" % zip_name)) - - # VII) Create symlinks and html redirects. - if is_release: - symlink = os.path.join(args.mirror_dir, "current") - if os.path.exists(symlink): - if os.path.islink(symlink): - os.remove(symlink) - else: - shutil.rmtree(symlink) - os.symlink("./%s" % api_name, symlink) - with open(os.path.join(args.mirror_dir, "250PythonDoc/index.html"), 'w') as f: - f.write("Redirecting...Redirecting..." % api_name) - elif is_beta: - # We do not have any particular symlink for that stage. - pass - elif branch == "master": - # Also create a symlink from version number to actual master api doc. - symlink = os.path.join(args.mirror_dir, blenver) - if os.path.exists(symlink): - if os.path.islink(symlink): - os.remove(symlink) - else: - shutil.rmtree(symlink) - os.symlink("./%s" % api_name, symlink) - with open(os.path.join(args.mirror_dir, "blender_python_api/index.html"), 'w') as f: - f.write("Redirecting...Redirecting..." % api_name) - - # VIII) Upload (first do a dry-run so user can ensure everything is OK). - print("Doc generated in local mirror %s, please check it before uploading " - "(hit [Enter] to continue, [Ctrl-C] to exit):" % api_dir) - sys.stdin.read(1) - - rsync_mirror_cmd = ("rsync", "--dry-run", "--delete-after", "-avzz", args.mirror_dir, rsync_base) - subprocess.run(rsync_mirror_cmd, env=dict(os.environ, RSYNC_PASSWORD=args.password)) - - print("Rsync upload simulated, please check every thing is OK (hit [Enter] to continue, [Ctrl-C] to exit):") - sys.stdin.read(1) - - rsync_mirror_cmd = ("rsync", "--delete-after", "-avzz", args.mirror_dir, rsync_base) - subprocess.run(rsync_mirror_cmd, env=dict(os.environ, RSYNC_PASSWORD=args.password)) - - -if __name__ == "__main__": - main() diff --git a/extern/mantaflow/CMakeLists.txt b/extern/mantaflow/CMakeLists.txt index 82bf95a9742..3220a45bef4 100644 --- a/extern/mantaflow/CMakeLists.txt +++ b/extern/mantaflow/CMakeLists.txt @@ -75,6 +75,8 @@ endif() if(WITH_OPENVDB) add_definitions(-DOPENVDB=1) + # OpenVDB headers use deprecated TBB headers, silence warning. + add_definitions(-DTBB_SUPPRESS_DEPRECATED_MESSAGES=1) endif() if(WITH_OPENVDB_BLOSC) @@ -131,6 +133,14 @@ if(WITH_OPENVDB) list(APPEND LIB ${OPENVDB_LIBRARIES} ) + if(WIN32) + # OpenVDB emits lots of these, they should be suppressed through other + # means but MSVC 16.8/16.9 has broken this functionality, so C4251 is + # suppressed here explicitly. See + # https://developercommunity.visualstudio.com/content/problem/1167590/bug.html + # for details. + string(APPEND CMAKE_CXX_FLAGS " /wd4251") + endif() endif() set(SRC diff --git a/intern/cycles/CMakeLists.txt b/intern/cycles/CMakeLists.txt index 2a28d905144..b01bf1bd1e2 100644 --- a/intern/cycles/CMakeLists.txt +++ b/intern/cycles/CMakeLists.txt @@ -64,7 +64,7 @@ if(WITH_CYCLES_NATIVE_ONLY) endif() set(CYCLES_KERNEL_FLAGS "${MSVC_NATIVE_ARCH_FLAGS}") endif() -elseif(NOT WITH_CPU_SSE) +elseif(NOT WITH_CPU_SIMD OR (SUPPORT_NEON_BUILD AND SSE2NEON_FOUND)) set(CXX_HAS_SSE FALSE) set(CXX_HAS_AVX FALSE) set(CXX_HAS_AVX2 FALSE) diff --git a/intern/cycles/app/cycles_xml.cpp b/intern/cycles/app/cycles_xml.cpp index 272d509585e..d2aecf75121 100644 --- a/intern/cycles/app/cycles_xml.cpp +++ b/intern/cycles/app/cycles_xml.cpp @@ -564,19 +564,19 @@ static void xml_read_transform(xml_node node, Transform &tfm) } if (node.attribute("translate")) { - float3 translate = make_float3(0.0f, 0.0f, 0.0f); + float3 translate = zero_float3(); xml_read_float3(&translate, node, "translate"); tfm = tfm * transform_translate(translate); } if (node.attribute("rotate")) { - float4 rotate = make_float4(0.0f, 0.0f, 0.0f, 0.0f); + float4 rotate = zero_float4(); xml_read_float4(&rotate, node, "rotate"); tfm = tfm * transform_rotate(DEG2RADF(rotate.x), make_float3(rotate.y, rotate.z, rotate.w)); } if (node.attribute("scale")) { - float3 scale = make_float3(0.0f, 0.0f, 0.0f); + float3 scale = zero_float3(); xml_read_float3(&scale, node, "scale"); tfm = tfm * transform_scale(scale); } diff --git a/intern/cycles/blender/addon/__init__.py b/intern/cycles/blender/addon/__init__.py index b1deb5cb64e..10b95133912 100644 --- a/intern/cycles/blender/addon/__init__.py +++ b/intern/cycles/blender/addon/__init__.py @@ -15,6 +15,7 @@ # # +from __future__ import annotations bl_info = { "name": "Cycles Render Engine", diff --git a/intern/cycles/blender/addon/engine.py b/intern/cycles/blender/addon/engine.py index 179eea6461c..dfa696714fb 100644 --- a/intern/cycles/blender/addon/engine.py +++ b/intern/cycles/blender/addon/engine.py @@ -15,6 +15,7 @@ # # +from __future__ import annotations def _is_using_buggy_driver(): @@ -301,7 +302,7 @@ def list_render_passes(scene, srl): yield ("Denoising Clean", "RGB", 'COLOR') # Custom AOV passes. - for aov in crl.aovs: + for aov in srl.aovs: if aov.type == 'VALUE': yield (aov.name, "X", 'VALUE') else: @@ -309,22 +310,5 @@ def list_render_passes(scene, srl): def register_passes(engine, scene, view_layer): - # Detect duplicate render pass names, first one wins. - listed = set() for name, channelids, channeltype in list_render_passes(scene, view_layer): - if name not in listed: - engine.register_pass(scene, view_layer, name, len(channelids), channelids, channeltype) - listed.add(name) - - -def detect_conflicting_passes(scene, view_layer): - # Detect conflicting render pass names for UI. - counter = {} - for name, _, _ in list_render_passes(scene, view_layer): - counter[name] = counter.get(name, 0) + 1 - - for aov in view_layer.cycles.aovs: - if counter[aov.name] > 1: - aov.conflict = "Conflicts with another render pass with the same name" - else: - aov.conflict = "" + engine.register_pass(scene, view_layer, name, len(channelids), channelids, channeltype) diff --git a/intern/cycles/blender/addon/operators.py b/intern/cycles/blender/addon/operators.py index 2045f6ab780..dca727e316e 100644 --- a/intern/cycles/blender/addon/operators.py +++ b/intern/cycles/blender/addon/operators.py @@ -15,6 +15,7 @@ # # +from __future__ import annotations import bpy from bpy.types import Operator @@ -44,36 +45,6 @@ class CYCLES_OT_use_shading_nodes(Operator): return {'FINISHED'} -class CYCLES_OT_add_aov(bpy.types.Operator): - """Add an AOV pass""" - bl_idname = "cycles.add_aov" - bl_label = "Add AOV" - - def execute(self, context): - view_layer = context.view_layer - cycles_view_layer = view_layer.cycles - - cycles_view_layer.aovs.add() - - view_layer.update_render_passes() - return {'FINISHED'} - - -class CYCLES_OT_remove_aov(bpy.types.Operator): - """Remove an AOV pass""" - bl_idname = "cycles.remove_aov" - bl_label = "Remove AOV" - - def execute(self, context): - view_layer = context.view_layer - cycles_view_layer = view_layer.cycles - - cycles_view_layer.aovs.remove(cycles_view_layer.active_aov) - - view_layer.update_render_passes() - return {'FINISHED'} - - class CYCLES_OT_denoise_animation(Operator): "Denoise rendered animation sequence using current scene and view " \ "layer settings. Requires denoising data passes and output to " \ @@ -197,8 +168,6 @@ class CYCLES_OT_merge_images(Operator): classes = ( CYCLES_OT_use_shading_nodes, - CYCLES_OT_add_aov, - CYCLES_OT_remove_aov, CYCLES_OT_denoise_animation, CYCLES_OT_merge_images ) diff --git a/intern/cycles/blender/addon/osl.py b/intern/cycles/blender/addon/osl.py index 4c6e7952491..d4c3c447951 100644 --- a/intern/cycles/blender/addon/osl.py +++ b/intern/cycles/blender/addon/osl.py @@ -15,6 +15,7 @@ # # +from __future__ import annotations import bpy import _cycles diff --git a/intern/cycles/blender/addon/presets.py b/intern/cycles/blender/addon/presets.py index 78a8605e93f..04b18b38927 100644 --- a/intern/cycles/blender/addon/presets.py +++ b/intern/cycles/blender/addon/presets.py @@ -15,6 +15,7 @@ # # +from __future__ import annotations from bl_operators.presets import AddPresetBase from bpy.types import Operator diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index 2f204b2c658..dc4437bdc52 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -15,6 +15,7 @@ # # +from __future__ import annotations import bpy from bpy.props import ( @@ -178,11 +179,6 @@ enum_view3d_shading_render_pass = ( ('MIST', "Mist", "Show the Mist render pass", 32), ) -enum_aov_types = ( - ('VALUE', "Value", "Write a Value pass", 0), - ('COLOR', "Color", "Write a Color pass", 1), -) - def enum_openimagedenoise_denoiser(self, context): import _cycles @@ -229,7 +225,6 @@ def update_render_passes(self, context): scene = context.scene view_layer = context.view_layer view_layer.update_render_passes() - engine.detect_conflicting_passes(scene, view_layer) class CyclesRenderSettings(bpy.types.PropertyGroup): @@ -651,6 +646,12 @@ class CyclesRenderSettings(bpy.types.PropertyGroup): min=0, max=(1 << 24), default=1, ) + preview_denoising_input_passes: EnumProperty( + name="Viewport Input Passes", + description="Passes used by the denoiser to distinguish noise from shader and geometry detail", + items=enum_denoising_input_passes, + default='RGB_ALBEDO', + ) debug_reset_timeout: FloatProperty( name="Reset timeout", @@ -847,7 +848,7 @@ class CyclesRenderSettings(bpy.types.PropertyGroup): ('MEGA', "Mega", ""), ('SPLIT', "Split", ""), ), - update=_devices_update_callback + update=CyclesRenderSettings._devices_update_callback ) debug_opencl_device_type: EnumProperty( @@ -861,11 +862,9 @@ class CyclesRenderSettings(bpy.types.PropertyGroup): ('GPU', "GPU", ""), ('ACCELERATOR', "Accelerator", ""), ), - update=_devices_update_callback + update=CyclesRenderSettings._devices_update_callback ) - del _devices_update_callback - debug_use_opencl_debug: BoolProperty(name="Debug OpenCL", default=False) debug_opencl_mem_limit: IntProperty( @@ -1311,27 +1310,6 @@ class CyclesCurveRenderSettings(bpy.types.PropertyGroup): del bpy.types.Scene.cycles_curves -class CyclesAOVPass(bpy.types.PropertyGroup): - name: StringProperty( - name="Name", - description="Name of the pass, to use in the AOV Output shader node", - update=update_render_passes, - default="AOV" - ) - type: EnumProperty( - name="Type", - description="Pass data type", - update=update_render_passes, - items=enum_aov_types, - default='COLOR' - ) - conflict: StringProperty( - name="Conflict", - description="If there is a conflict with another render passes, message explaining why", - default="" - ) - - class CyclesRenderLayerSettings(bpy.types.PropertyGroup): pass_debug_bvh_traversed_nodes: BoolProperty( @@ -1462,7 +1440,6 @@ class CyclesRenderLayerSettings(bpy.types.PropertyGroup): items=enum_denoising_input_passes, default='RGB_ALBEDO', ) - denoising_openimagedenoise_input_passes: EnumProperty( name="Input Passes", description="Passes used by the denoiser to distinguish noise from shader and geometry detail", @@ -1470,15 +1447,6 @@ class CyclesRenderLayerSettings(bpy.types.PropertyGroup): default='RGB_ALBEDO_NORMAL', ) - aovs: CollectionProperty( - type=CyclesAOVPass, - description="Custom render passes that can be output by shader nodes", - ) - active_aov: IntProperty( - default=0, - min=0 - ) - @classmethod def register(cls): bpy.types.ViewLayer.cycles = PointerProperty( @@ -1517,7 +1485,7 @@ class CyclesPreferences(bpy.types.AddonPreferences): compute_device_type: EnumProperty( name="Compute Device Type", description="Device to use for computation (rendering with Cycles)", - items=get_device_types, + items=CyclesPreferences.get_device_types, ) devices: bpy.props.CollectionProperty(type=CyclesDeviceSettings) @@ -1665,7 +1633,6 @@ def register(): bpy.utils.register_class(CyclesCurveRenderSettings) bpy.utils.register_class(CyclesDeviceSettings) bpy.utils.register_class(CyclesPreferences) - bpy.utils.register_class(CyclesAOVPass) bpy.utils.register_class(CyclesRenderLayerSettings) bpy.utils.register_class(CyclesView3DShadingSettings) @@ -1687,6 +1654,5 @@ def unregister(): bpy.utils.unregister_class(CyclesCurveRenderSettings) bpy.utils.unregister_class(CyclesDeviceSettings) bpy.utils.unregister_class(CyclesPreferences) - bpy.utils.unregister_class(CyclesAOVPass) bpy.utils.unregister_class(CyclesRenderLayerSettings) bpy.utils.unregister_class(CyclesView3DShadingSettings) diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index aa009c15b10..c9b4dc25cf2 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -15,6 +15,7 @@ # # +from __future__ import annotations import bpy from bpy_extras.node_utils import find_node_input @@ -23,7 +24,7 @@ from bl_ui.utils import PresetPanel from bpy.types import Panel from bl_ui.properties_grease_pencil_common import GreasePencilSimplifyPanel -from bl_ui.properties_view_layer import ViewLayerCryptomattePanel +from bl_ui.properties_view_layer import ViewLayerCryptomattePanel, ViewLayerAOVPanel class CYCLES_PT_sampling_presets(PresetPanel, Panel): @@ -274,6 +275,8 @@ class CYCLES_RENDER_PT_sampling_denoising(CyclesButtonsPanel, Panel): sub.prop(cscene, "denoiser", text="") + layout.separator() + heading = layout.column(align=False, heading="Viewport") row = heading.row(align=True) row.prop(cscene, "use_preview_denoising", text="") @@ -284,6 +287,9 @@ class CYCLES_RENDER_PT_sampling_denoising(CyclesButtonsPanel, Panel): sub = heading.row(align=True) sub.active = cscene.use_preview_denoising sub.prop(cscene, "preview_denoising_start_sample", text="Start Sample") + sub = heading.row(align=True) + sub.active = cscene.use_preview_denoising + sub.prop(cscene, "preview_denoising_input_passes", text="Input Passes") class CYCLES_RENDER_PT_sampling_advanced(CyclesButtonsPanel, Panel): @@ -886,7 +892,7 @@ class CYCLES_RENDER_PT_passes_light(CyclesButtonsPanel, Panel): col.prop(view_layer, "use_pass_ambient_occlusion", text="Ambient Occlusion") -class CYCLES_RENDER_PT_passes_crypto(CyclesButtonsPanel, ViewLayerCryptomattePanel): +class CYCLES_RENDER_PT_passes_crypto(CyclesButtonsPanel, ViewLayerCryptomattePanel, Panel): bl_label = "Cryptomatte" bl_context = "view_layer" bl_parent_id = "CYCLES_RENDER_PT_passes" @@ -915,49 +921,11 @@ class CYCLES_RENDER_PT_passes_debug(CyclesButtonsPanel, Panel): layout.prop(cycles_view_layer, "pass_debug_ray_bounces") -class CYCLES_RENDER_UL_aov(bpy.types.UIList): - def draw_item(self, context, layout, data, item, icon, active_data, active_propname): - row = layout.row() - split = row.split(factor=0.65) - icon = 'ERROR' if item.conflict else 'NONE' - split.row().prop(item, "name", text="", icon=icon, emboss=False) - split.row().prop(item, "type", text="", emboss=False) - - -class CYCLES_RENDER_PT_passes_aov(CyclesButtonsPanel, Panel): +class CYCLES_RENDER_PT_passes_aov(CyclesButtonsPanel, ViewLayerAOVPanel): bl_label = "Shader AOV" bl_context = "view_layer" bl_parent_id = "CYCLES_RENDER_PT_passes" - def draw(self, context): - layout = self.layout - layout.use_property_split = True - layout.use_property_decorate = False - - cycles_view_layer = context.view_layer.cycles - - row = layout.row() - col = row.column() - col.template_list( - "CYCLES_RENDER_UL_aov", - "aovs", - cycles_view_layer, - "aovs", - cycles_view_layer, - "active_aov", - rows=2, - ) - - col = row.column() - sub = col.column(align=True) - sub.operator("cycles.add_aov", icon='ADD', text="") - sub.operator("cycles.remove_aov", icon='REMOVE', text="") - - if cycles_view_layer.active_aov < len(cycles_view_layer.aovs): - active_aov = cycles_view_layer.aovs[cycles_view_layer.active_aov] - if active_aov.conflict: - layout.label(text=active_aov.conflict, icon='ERROR') - class CYCLES_RENDER_PT_denoising(CyclesButtonsPanel, Panel): bl_label = "Denoising" @@ -2300,7 +2268,6 @@ classes = ( CYCLES_RENDER_PT_passes_light, CYCLES_RENDER_PT_passes_crypto, CYCLES_RENDER_PT_passes_debug, - CYCLES_RENDER_UL_aov, CYCLES_RENDER_PT_passes_aov, CYCLES_RENDER_PT_filter, CYCLES_RENDER_PT_override, diff --git a/intern/cycles/blender/addon/version_update.py b/intern/cycles/blender/addon/version_update.py index 5dae88d60c7..aeecc265399 100644 --- a/intern/cycles/blender/addon/version_update.py +++ b/intern/cycles/blender/addon/version_update.py @@ -15,6 +15,7 @@ # # +from __future__ import annotations import bpy import math @@ -108,7 +109,7 @@ def do_versions(self): library_versions.setdefault(library.version, []).append(library) # Do versioning per library, since they might have different versions. - max_need_versioning = (2, 92, 4) + max_need_versioning = (2, 93, 7) for version, libraries in library_versions.items(): if version > max_need_versioning: continue @@ -204,6 +205,18 @@ def do_versions(self): view_layer.pass_cryptomatte_depth = cview_layer.get("pass_crypto_depth", 6) view_layer.use_pass_cryptomatte_accurate = cview_layer.get("pass_crypto_accurate", True) + if version <= (2, 93, 7): + if scene.render.engine == 'CYCLES': + for view_layer in scene.view_layers: + cview_layer = view_layer.cycles + for caov in cview_layer.get("aovs", []): + aov_name = caov.get("name", "AOV") + if aov_name in view_layer.aovs: + continue + baov = view_layer.aovs.add() + baov.name = caov.get("name", "AOV") + baov.type = "COLOR" if caov.get("type", 1) == 1 else "VALUE" + # Lamps for light in bpy.data.lights: if light.library not in libraries: diff --git a/intern/cycles/blender/blender_camera.cpp b/intern/cycles/blender/blender_camera.cpp index c1da9f1983f..b31841801d8 100644 --- a/intern/cycles/blender/blender_camera.cpp +++ b/intern/cycles/blender/blender_camera.cpp @@ -112,7 +112,7 @@ static void blender_camera_init(BlenderCamera *bcam, BL::RenderSettings &b_rende bcam->focaldistance = 10.0f; bcam->zoom = 1.0f; - bcam->pixelaspect = make_float2(1.0f, 1.0f); + bcam->pixelaspect = one_float2(); bcam->aperture_ratio = 1.0f; bcam->sensor_width = 36.0f; diff --git a/intern/cycles/blender/blender_curves.cpp b/intern/cycles/blender/blender_curves.cpp index 4fb5c7f57d1..7fe49a6c63b 100644 --- a/intern/cycles/blender/blender_curves.cpp +++ b/intern/cycles/blender/blender_curves.cpp @@ -121,8 +121,8 @@ static bool ObtainCacheParticleData( CData->curve_firstkey.push_back_slow(keyno); float curve_length = 0.0f; - float3 prev_co_world = make_float3(0.0f, 0.0f, 0.0f); - float3 prev_co_object = make_float3(0.0f, 0.0f, 0.0f); + float3 prev_co_world = zero_float3(); + float3 prev_co_object = zero_float3(); for (int step_no = 0; step_no < ren_step; step_no++) { float3 co_world = prev_co_world; b_psys.co_hair(*b_ob, pa_no, step_no, &co_world.x); @@ -197,7 +197,7 @@ static bool ObtainCacheParticleUV(Hair *hair, BL::Mesh::uv_layers_iterator l; b_mesh->uv_layers.begin(l); - float2 uv = make_float2(0.0f, 0.0f); + float2 uv = zero_float2(); if (b_mesh->uv_layers.length()) b_psys.uv_on_emitter(psmd, *b_pa, pa_no, uv_num, &uv.x); CData->curve_uv.push_back_slow(uv); @@ -678,7 +678,7 @@ static void export_hair_curves(Scene *scene, Hair *hair, BL::Hair b_hair) const int first_point_index = b_curve.first_point_index(); const int num_points = b_curve.num_points(); - float3 prev_co = make_float3(0.0f, 0.0f, 0.0f); + float3 prev_co = zero_float3(); float length = 0.0f; if (attr_intercept) { points_length.clear(); diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp index 7edf797e096..c7b49354d53 100644 --- a/intern/cycles/blender/blender_mesh.cpp +++ b/intern/cycles/blender/blender_mesh.cpp @@ -310,6 +310,143 @@ static void attr_create_sculpt_vertex_color(Scene *scene, } } +template +static void fill_generic_attribute(BL::Mesh &b_mesh, + TypeInCycles *data, + const AttributeElement element, + const GetValueAtIndex &get_value_at_index) +{ + switch (element) { + case ATTR_ELEMENT_CORNER: { + for (BL::MeshLoopTriangle &t : b_mesh.loop_triangles) { + const int index = t.index() * 3; + BL::Array loops = t.loops(); + data[index] = get_value_at_index(loops[0]); + data[index + 1] = get_value_at_index(loops[1]); + data[index + 2] = get_value_at_index(loops[2]); + } + break; + } + case ATTR_ELEMENT_VERTEX: { + const int num_verts = b_mesh.vertices.length(); + for (int i = 0; i < num_verts; i++) { + data[i] = get_value_at_index(i); + } + break; + } + case ATTR_ELEMENT_FACE: { + for (BL::MeshLoopTriangle &t : b_mesh.loop_triangles) { + data[t.index()] = get_value_at_index(t.polygon_index()); + } + break; + } + default: { + assert(false); + break; + } + } +} + +static void attr_create_generic(Scene *scene, Mesh *mesh, BL::Mesh &b_mesh, bool subdivision) +{ + if (subdivision) { + /* TODO: Handle subdivision correctly. */ + return; + } + AttributeSet &attributes = mesh->attributes; + + for (BL::Attribute &b_attribute : b_mesh.attributes) { + const ustring name{b_attribute.name().c_str()}; + if (!mesh->need_attribute(scene, name)) { + continue; + } + if (attributes.find(name)) { + continue; + } + + const BL::Attribute::domain_enum b_domain = b_attribute.domain(); + const BL::Attribute::data_type_enum b_data_type = b_attribute.data_type(); + + AttributeElement element = ATTR_ELEMENT_NONE; + switch (b_domain) { + case BL::Attribute::domain_CORNER: + element = ATTR_ELEMENT_CORNER; + break; + case BL::Attribute::domain_POINT: + element = ATTR_ELEMENT_VERTEX; + break; + case BL::Attribute::domain_POLYGON: + element = ATTR_ELEMENT_FACE; + break; + default: + break; + } + if (element == ATTR_ELEMENT_NONE) { + /* Not supported. */ + continue; + } + switch (b_data_type) { + case BL::Attribute::data_type_FLOAT: { + BL::FloatAttribute b_float_attribute{b_attribute}; + Attribute *attr = attributes.add(name, TypeFloat, element); + float *data = attr->data_float(); + fill_generic_attribute( + b_mesh, data, element, [&](int i) { return b_float_attribute.data[i].value(); }); + break; + } + case BL::Attribute::data_type_BOOLEAN: { + BL::BoolAttribute b_bool_attribute{b_attribute}; + Attribute *attr = attributes.add(name, TypeFloat, element); + float *data = attr->data_float(); + fill_generic_attribute( + b_mesh, data, element, [&](int i) { return (float)b_bool_attribute.data[i].value(); }); + break; + } + case BL::Attribute::data_type_INT: { + BL::IntAttribute b_int_attribute{b_attribute}; + Attribute *attr = attributes.add(name, TypeFloat, element); + float *data = attr->data_float(); + fill_generic_attribute( + b_mesh, data, element, [&](int i) { return (float)b_int_attribute.data[i].value(); }); + break; + } + case BL::Attribute::data_type_FLOAT_VECTOR: { + BL::FloatVectorAttribute b_vector_attribute{b_attribute}; + Attribute *attr = attributes.add(name, TypeVector, element); + float3 *data = attr->data_float3(); + fill_generic_attribute(b_mesh, data, element, [&](int i) { + BL::Array v = b_vector_attribute.data[i].vector(); + return make_float3(v[0], v[1], v[2]); + }); + break; + } + case BL::Attribute::data_type_FLOAT_COLOR: { + BL::FloatColorAttribute b_color_attribute{b_attribute}; + Attribute *attr = attributes.add(name, TypeRGBA, element); + float4 *data = attr->data_float4(); + fill_generic_attribute(b_mesh, data, element, [&](int i) { + BL::Array v = b_color_attribute.data[i].color(); + return make_float4(v[0], v[1], v[2], v[3]); + }); + break; + } + case BL::Attribute::data_type_FLOAT2: { + BL::Float2Attribute b_float2_attribute{b_attribute}; + Attribute *attr = attributes.add(name, TypeFloat2, element); + float2 *data = attr->data_float2(); + fill_generic_attribute(b_mesh, data, element, [&](int i) { + BL::Array v = b_float2_attribute.data[i].vector(); + return make_float2(v[0], v[1]); + }); + break; + } + default: + /* Not supported. */ + break; + } + } +} + /* Create vertex color attributes. */ static void attr_create_vertex_color(Scene *scene, Mesh *mesh, BL::Mesh &b_mesh, bool subdivision) { @@ -589,7 +726,7 @@ static void attr_create_pointiness(Scene *scene, Mesh *mesh, BL::Mesh &b_mesh, b /* STEP 2: Calculate vertex normals taking into account their possible * duplicates which gets "welded" together. */ - vector vert_normal(num_verts, make_float3(0.0f, 0.0f, 0.0f)); + vector vert_normal(num_verts, zero_float3()); /* First we accumulate all vertex normals in the original index. */ for (int vert_index = 0; vert_index < num_verts; ++vert_index) { const float3 normal = get_float3(b_mesh.vertices[vert_index].normal()); @@ -606,7 +743,7 @@ static void attr_create_pointiness(Scene *scene, Mesh *mesh, BL::Mesh &b_mesh, b /* STEP 3: Calculate pointiness using single ring neighborhood. */ vector counter(num_verts, 0); vector raw_data(num_verts, 0.0f); - vector edge_accum(num_verts, make_float3(0.0f, 0.0f, 0.0f)); + vector edge_accum(num_verts, zero_float3()); BL::Mesh::edges_iterator e; EdgeMap visited_edges; int edge_index = 0; @@ -837,6 +974,7 @@ static void create_mesh(Scene *scene, attr_create_vertex_color(scene, mesh, b_mesh, subdivision); attr_create_sculpt_vertex_color(scene, mesh, b_mesh, subdivision); attr_create_random_per_island(scene, mesh, b_mesh, subdivision); + attr_create_generic(scene, mesh, b_mesh, subdivision); if (subdivision) { attr_create_subd_uv_map(scene, mesh, b_mesh, subdivide_uvs); diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp index f0460b129c2..54128cf82fc 100644 --- a/intern/cycles/blender/blender_object.cpp +++ b/intern/cycles/blender/blender_object.cpp @@ -323,8 +323,8 @@ Object *BlenderSync::sync_object(BL::Depsgraph &b_depsgraph, object->set_random_id(b_instance.random_id()); } else { - object->set_dupli_generated(make_float3(0.0f, 0.0f, 0.0f)); - object->set_dupli_uv(make_float2(0.0f, 0.0f)); + object->set_dupli_generated(zero_float3()); + object->set_dupli_uv(zero_float2()); object->set_random_id(hash_uint2(hash_string(object->name.c_str()), 0)); } diff --git a/intern/cycles/blender/blender_python.cpp b/intern/cycles/blender/blender_python.cpp index 5646bd5b2eb..0daad310543 100644 --- a/intern/cycles/blender/blender_python.cpp +++ b/intern/cycles/blender/blender_python.cpp @@ -147,7 +147,7 @@ void python_thread_state_restore(void **python_thread_state) static const char *PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce) { - const char *result = _PyUnicode_AsString(py_str); + const char *result = PyUnicode_AsUTF8(py_str); if (result) { /* 99% of the time this is enough but we better support non unicode * chars since blender doesn't limit this. diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp index 02a6638b083..a1ab5277744 100644 --- a/intern/cycles/blender/blender_shader.cpp +++ b/intern/cycles/blender/blender_shader.cpp @@ -1404,7 +1404,7 @@ void BlenderSync::sync_world(BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d, world_color = get_float3(b_world.color()); } else { - world_color = make_float3(0.0f, 0.0f, 0.0f); + world_color = zero_float3(); } BackgroundNode *background = graph->create_node(); @@ -1535,7 +1535,7 @@ void BlenderSync::sync_lights(BL::Depsgraph &b_depsgraph, bool update_all) } else { EmissionNode *emission = graph->create_node(); - emission->set_color(make_float3(1.0f, 1.0f, 1.0f)); + emission->set_color(one_float3()); emission->set_strength(1.0f); graph->add(emission); diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp index aea601480bf..0e61f4f2615 100644 --- a/intern/cycles/blender/blender_sync.cpp +++ b/intern/cycles/blender/blender_sync.cpp @@ -697,9 +697,15 @@ vector BlenderSync::sync_render_passes(BL::RenderLayer &b_rlay, } } - RNA_BEGIN (&crl, b_aov, "aovs") { - bool is_color = (get_enum(b_aov, "type") == 1); - string name = get_string(b_aov, "name"); + BL::ViewLayer::aovs_iterator b_aov_iter; + for (b_view_layer.aovs.begin(b_aov_iter); b_aov_iter != b_view_layer.aovs.end(); ++b_aov_iter) { + BL::AOV b_aov(*b_aov_iter); + if (!b_aov.is_valid()) { + continue; + } + + string name = b_aov.name(); + bool is_color = b_aov.type() == BL::AOV::type_COLOR; if (is_color) { b_engine.add_pass(name.c_str(), 4, "RGBA", b_view_layer.name().c_str()); @@ -710,7 +716,6 @@ vector BlenderSync::sync_render_passes(BL::RenderLayer &b_rlay, Pass::add(PASS_AOV_VALUE, passes, name.c_str()); } } - RNA_END; scene->film->set_denoising_data_pass(denoising.use || denoising.store_passes); scene->film->set_denoising_clean_pass(scene->film->get_denoising_flags() & @@ -1000,6 +1005,9 @@ DenoiseParams BlenderSync::get_denoise_params(BL::Scene &b_scene, cscene, "preview_denoiser", DENOISER_NUM, DENOISER_NONE); denoising.start_sample = get_int(cscene, "preview_denoising_start_sample"); + denoising.input_passes = (DenoiserInput)get_enum( + cscene, "preview_denoising_input_passes", DENOISER_INPUT_NUM, (int)denoising.input_passes); + /* Auto select fastest denoiser. */ if (denoising.type == DENOISER_NONE) { if (!Device::available_devices(DEVICE_MASK_OPTIX).empty()) { diff --git a/intern/cycles/blender/blender_texture.cpp b/intern/cycles/blender/blender_texture.cpp index 7b05f361a29..0d593f2b385 100644 --- a/intern/cycles/blender/blender_texture.cpp +++ b/intern/cycles/blender/blender_texture.cpp @@ -43,8 +43,8 @@ void point_density_texture_space(BL::Depsgraph &b_depsgraph, { BL::Object b_ob(b_point_density_node.object()); if (!b_ob) { - loc = make_float3(0.0f, 0.0f, 0.0f); - size = make_float3(0.0f, 0.0f, 0.0f); + loc = zero_float3(); + size = zero_float3(); return; } float3 min, max; diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp index 256382e63ba..050e090bddf 100644 --- a/intern/cycles/bvh/bvh.cpp +++ b/intern/cycles/bvh/bvh.cpp @@ -69,7 +69,7 @@ BVHLayout BVHParams::best_bvh_layout(BVHLayout requested_layout, BVHLayoutMask s allowed_layouts_mask = supported_layouts; } /* We get widest from allowed ones and convert mask to actual layout. */ - const BVHLayoutMask widest_allowed_layout_mask = __bsr(allowed_layouts_mask); + const BVHLayoutMask widest_allowed_layout_mask = __bsr((uint32_t)allowed_layouts_mask); return (BVHLayout)(1 << widest_allowed_layout_mask); } diff --git a/intern/cycles/bvh/bvh_build.cpp b/intern/cycles/bvh/bvh_build.cpp index 296f9130f43..048c2b95e40 100644 --- a/intern/cycles/bvh/bvh_build.cpp +++ b/intern/cycles/bvh/bvh_build.cpp @@ -360,7 +360,7 @@ void BVHBuild::add_references(BVHRange &root) /* happens mostly on empty meshes */ if (!bounds.valid()) - bounds.grow(make_float3(0.0f, 0.0f, 0.0f)); + bounds.grow(zero_float3()); root = BVHRange(bounds, center, 0, references.size()); } @@ -851,7 +851,7 @@ BVHNode *BVHBuild::create_leaf_node(const BVHRange &range, const vector -# include -# include # include "bvh/bvh_embree.h" @@ -306,8 +304,7 @@ BVHEmbree::BVHEmbree(const BVHParams ¶ms_, rtc_device(NULL), build_quality(RTC_BUILD_QUALITY_REFIT) { - _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); - _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON); + SIMD_SET_FLUSH_TO_ZERO; } BVHEmbree::~BVHEmbree() diff --git a/intern/cycles/graph/node_type.cpp b/intern/cycles/graph/node_type.cpp index 2b11af70d71..d1eadf21b1b 100644 --- a/intern/cycles/graph/node_type.cpp +++ b/intern/cycles/graph/node_type.cpp @@ -102,7 +102,7 @@ size_t SocketType::max_size() void *SocketType::zero_default_value() { - static Transform zero_transform = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}; + static Transform zero_transform = transform_zero(); return &zero_transform; } diff --git a/intern/cycles/kernel/closure/bsdf_microfacet.h b/intern/cycles/kernel/closure/bsdf_microfacet.h index 32639ba24ec..aed4b849aca 100644 --- a/intern/cycles/kernel/closure/bsdf_microfacet.h +++ b/intern/cycles/kernel/closure/bsdf_microfacet.h @@ -487,11 +487,11 @@ ccl_device float3 bsdf_microfacet_ggx_eval_reflect(const ShaderClosure *sc, float3 out = F * G * common; /* eq. 2 in distribution of visible normals sampling - * pm = Dw = G1o * dot(m, I) * D / dot(N, I); */ + * `pm = Dw = G1o * dot(m, I) * D / dot(N, I);` */ /* eq. 38 - but see also: * eq. 17 in http://www.graphics.cornell.edu/~bjw/wardnotes.pdf - * pdf = pm * 0.25 / dot(m, I); */ + * `pdf = pm * 0.25 / dot(m, I);` */ *pdf = G1o * common; return out; diff --git a/intern/cycles/kernel/kernel_accumulate.h b/intern/cycles/kernel/kernel_accumulate.h index 7a57a2f33ff..76e0f2be02c 100644 --- a/intern/cycles/kernel/kernel_accumulate.h +++ b/intern/cycles/kernel/kernel_accumulate.h @@ -32,11 +32,11 @@ ccl_device_inline void bsdf_eval_init(BsdfEval *eval, eval->use_light_pass = use_light_pass; if (eval->use_light_pass) { - eval->diffuse = make_float3(0.0f, 0.0f, 0.0f); - eval->glossy = make_float3(0.0f, 0.0f, 0.0f); - eval->transmission = make_float3(0.0f, 0.0f, 0.0f); - eval->transparent = make_float3(0.0f, 0.0f, 0.0f); - eval->volume = make_float3(0.0f, 0.0f, 0.0f); + eval->diffuse = zero_float3(); + eval->glossy = zero_float3(); + eval->transmission = zero_float3(); + eval->transparent = zero_float3(); + eval->volume = zero_float3(); if (type == CLOSURE_BSDF_TRANSPARENT_ID) eval->transparent = value; @@ -55,7 +55,7 @@ ccl_device_inline void bsdf_eval_init(BsdfEval *eval, eval->diffuse = value; } #ifdef __SHADOW_TRICKS__ - eval->sum_no_mis = make_float3(0.0f, 0.0f, 0.0f); + eval->sum_no_mis = zero_float3(); #endif } @@ -174,55 +174,55 @@ ccl_device_inline void path_radiance_init(KernelGlobals *kg, PathRadiance *L) L->use_light_pass = kernel_data.film.use_light_pass; if (kernel_data.film.use_light_pass) { - L->indirect = make_float3(0.0f, 0.0f, 0.0f); - L->direct_emission = make_float3(0.0f, 0.0f, 0.0f); + L->indirect = zero_float3(); + L->direct_emission = zero_float3(); - L->color_diffuse = make_float3(0.0f, 0.0f, 0.0f); - L->color_glossy = make_float3(0.0f, 0.0f, 0.0f); - L->color_transmission = make_float3(0.0f, 0.0f, 0.0f); + L->color_diffuse = zero_float3(); + L->color_glossy = zero_float3(); + L->color_transmission = zero_float3(); - L->direct_diffuse = make_float3(0.0f, 0.0f, 0.0f); - L->direct_glossy = make_float3(0.0f, 0.0f, 0.0f); - L->direct_transmission = make_float3(0.0f, 0.0f, 0.0f); - L->direct_volume = make_float3(0.0f, 0.0f, 0.0f); + L->direct_diffuse = zero_float3(); + L->direct_glossy = zero_float3(); + L->direct_transmission = zero_float3(); + L->direct_volume = zero_float3(); - L->indirect_diffuse = make_float3(0.0f, 0.0f, 0.0f); - L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f); - L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f); - L->indirect_volume = make_float3(0.0f, 0.0f, 0.0f); + L->indirect_diffuse = zero_float3(); + L->indirect_glossy = zero_float3(); + L->indirect_transmission = zero_float3(); + L->indirect_volume = zero_float3(); L->transparent = 0.0f; - L->emission = make_float3(0.0f, 0.0f, 0.0f); - L->background = make_float3(0.0f, 0.0f, 0.0f); - L->ao = make_float3(0.0f, 0.0f, 0.0f); - L->shadow = make_float3(0.0f, 0.0f, 0.0f); + L->emission = zero_float3(); + L->background = zero_float3(); + L->ao = zero_float3(); + L->shadow = zero_float3(); L->mist = 0.0f; - L->state.diffuse = make_float3(0.0f, 0.0f, 0.0f); - L->state.glossy = make_float3(0.0f, 0.0f, 0.0f); - L->state.transmission = make_float3(0.0f, 0.0f, 0.0f); - L->state.volume = make_float3(0.0f, 0.0f, 0.0f); - L->state.direct = make_float3(0.0f, 0.0f, 0.0f); + L->state.diffuse = zero_float3(); + L->state.glossy = zero_float3(); + L->state.transmission = zero_float3(); + L->state.volume = zero_float3(); + L->state.direct = zero_float3(); } else #endif { L->transparent = 0.0f; - L->emission = make_float3(0.0f, 0.0f, 0.0f); + L->emission = zero_float3(); } #ifdef __SHADOW_TRICKS__ - L->path_total = make_float3(0.0f, 0.0f, 0.0f); - L->path_total_shaded = make_float3(0.0f, 0.0f, 0.0f); - L->shadow_background_color = make_float3(0.0f, 0.0f, 0.0f); + L->path_total = zero_float3(); + L->path_total_shaded = zero_float3(); + L->shadow_background_color = zero_float3(); L->shadow_throughput = 0.0f; L->shadow_transparency = 1.0f; L->has_shadow_catcher = 0; #endif #ifdef __DENOISING_FEATURES__ - L->denoising_normal = make_float3(0.0f, 0.0f, 0.0f); - L->denoising_albedo = make_float3(0.0f, 0.0f, 0.0f); + L->denoising_normal = zero_float3(); + L->denoising_albedo = zero_float3(); L->denoising_depth = 0.0f; #endif @@ -561,13 +561,13 @@ ccl_device_inline void path_radiance_reset_indirect(PathRadiance *L) { #ifdef __PASSES__ if (L->use_light_pass) { - L->state.diffuse = make_float3(0.0f, 0.0f, 0.0f); - L->state.glossy = make_float3(0.0f, 0.0f, 0.0f); - L->state.transmission = make_float3(0.0f, 0.0f, 0.0f); - L->state.volume = make_float3(0.0f, 0.0f, 0.0f); + L->state.diffuse = zero_float3(); + L->state.glossy = zero_float3(); + L->state.transmission = zero_float3(); + L->state.volume = zero_float3(); - L->direct_emission = make_float3(0.0f, 0.0f, 0.0f); - L->indirect = make_float3(0.0f, 0.0f, 0.0f); + L->direct_emission = zero_float3(); + L->indirect = zero_float3(); } #endif } @@ -642,19 +642,19 @@ ccl_device_inline float3 path_radiance_clamp_and_sum(KernelGlobals *kg, /* Reject invalid value */ if (!isfinite_safe(sum)) { kernel_assert(!"Non-finite sum in path_radiance_clamp_and_sum!"); - L_sum = make_float3(0.0f, 0.0f, 0.0f); + L_sum = zero_float3(); - L->direct_diffuse = make_float3(0.0f, 0.0f, 0.0f); - L->direct_glossy = make_float3(0.0f, 0.0f, 0.0f); - L->direct_transmission = make_float3(0.0f, 0.0f, 0.0f); - L->direct_volume = make_float3(0.0f, 0.0f, 0.0f); + L->direct_diffuse = zero_float3(); + L->direct_glossy = zero_float3(); + L->direct_transmission = zero_float3(); + L->direct_volume = zero_float3(); - L->indirect_diffuse = make_float3(0.0f, 0.0f, 0.0f); - L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f); - L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f); - L->indirect_volume = make_float3(0.0f, 0.0f, 0.0f); + L->indirect_diffuse = zero_float3(); + L->indirect_glossy = zero_float3(); + L->indirect_transmission = zero_float3(); + L->indirect_volume = zero_float3(); - L->emission = make_float3(0.0f, 0.0f, 0.0f); + L->emission = zero_float3(); } } @@ -668,7 +668,7 @@ ccl_device_inline float3 path_radiance_clamp_and_sum(KernelGlobals *kg, float sum = fabsf((L_sum).x) + fabsf((L_sum).y) + fabsf((L_sum).z); if (!isfinite_safe(sum)) { kernel_assert(!"Non-finite final sum in path_radiance_clamp_and_sum!"); - L_sum = make_float3(0.0f, 0.0f, 0.0f); + L_sum = zero_float3(); } } @@ -711,7 +711,7 @@ ccl_device_inline void path_radiance_split_denoising(KernelGlobals *kg, # undef ADD_COMPONENT #else *noisy = L->emission; - *clean = make_float3(0.0f, 0.0f, 0.0f); + *clean = zero_float3(); #endif #ifdef __SHADOW_TRICKS__ diff --git a/intern/cycles/kernel/kernel_bake.h b/intern/cycles/kernel/kernel_bake.h index ddcf94be1de..bdedf0c20a8 100644 --- a/intern/cycles/kernel/kernel_bake.h +++ b/intern/cycles/kernel/kernel_bake.h @@ -23,7 +23,7 @@ ccl_device_noinline void compute_light_pass( { kernel_assert(kernel_data.film.use_light_pass); - float3 throughput = make_float3(1.0f, 1.0f, 1.0f); + float3 throughput = one_float3(); /* Emission and indirect shader data memory used by various functions. */ ShaderDataTinyStorage emission_sd_storage; @@ -176,7 +176,7 @@ ccl_device_inline float3 kernel_bake_shader_bsdf(KernelGlobals *kg, return shader_bsdf_transmission(kg, sd); default: kernel_assert(!"Unknown bake type passed to BSDF evaluate"); - return make_float3(0.0f, 0.0f, 0.0f); + return zero_float3(); } } @@ -192,12 +192,12 @@ ccl_device float3 kernel_bake_evaluate_direct_indirect(KernelGlobals *kg, const bool is_color = (pass_filter & BAKE_FILTER_COLOR) != 0; const bool is_direct = (pass_filter & BAKE_FILTER_DIRECT) != 0; const bool is_indirect = (pass_filter & BAKE_FILTER_INDIRECT) != 0; - float3 out = make_float3(0.0f, 0.0f, 0.0f); + float3 out = zero_float3(); if (is_color) { if (is_direct || is_indirect) { /* Leave direct and diffuse channel colored. */ - color = make_float3(1.0f, 1.0f, 1.0f); + color = one_float3(); } else { /* surface color of the pass only */ @@ -233,6 +233,7 @@ ccl_device void kernel_bake_evaluate( ccl_global float *differential = buffer + kernel_data.film.pass_bake_differential; ccl_global float *output = buffer + kernel_data.film.pass_combined; + int seed = __float_as_uint(primitive[0]); int prim = __float_as_uint(primitive[1]); if (prim == -1) return; @@ -240,7 +241,7 @@ ccl_device void kernel_bake_evaluate( prim += kernel_data.bake.tri_offset; /* Random number generator. */ - uint rng_hash = hash_uint2(x, y) ^ kernel_data.integrator.seed; + uint rng_hash = hash_uint(seed) ^ kernel_data.integrator.seed; int num_samples = kernel_data.integrator.aa_samples; float filter_x, filter_y; @@ -314,7 +315,7 @@ ccl_device void kernel_bake_evaluate( if (kernel_data.bake.pass_filter & ~BAKE_FILTER_COLOR) compute_light_pass(kg, &sd, &L, rng_hash, pass_filter, sample); - float3 out = make_float3(0.0f, 0.0f, 0.0f); + float3 out = zero_float3(); ShaderEvalType type = (ShaderEvalType)kernel_data.bake.type; switch (type) { @@ -408,7 +409,7 @@ ccl_device void kernel_bake_evaluate( /* setup ray */ Ray ray; - ray.P = make_float3(0.0f, 0.0f, 0.0f); + ray.P = zero_float3(); ray.D = normalize(P); ray.t = 0.0f; # ifdef __CAMERA_MOTION__ @@ -485,7 +486,7 @@ ccl_device void kernel_background_evaluate(KernelGlobals *kg, float u = __uint_as_float(in.x); float v = __uint_as_float(in.y); - ray.P = make_float3(0.0f, 0.0f, 0.0f); + ray.P = zero_float3(); ray.D = equirectangular_to_direction(u, v); ray.t = 0.0f; #ifdef __CAMERA_MOTION__ diff --git a/intern/cycles/kernel/kernel_camera.h b/intern/cycles/kernel/kernel_camera.h index efe46d5b0dd..1bfac37158d 100644 --- a/intern/cycles/kernel/kernel_camera.h +++ b/intern/cycles/kernel/kernel_camera.h @@ -71,7 +71,7 @@ ccl_device void camera_sample_perspective(KernelGlobals *kg, } #endif - float3 P = make_float3(0.0f, 0.0f, 0.0f); + float3 P = zero_float3(); float3 D = Pcamera; /* modify ray for depth of field */ @@ -130,7 +130,7 @@ ccl_device void camera_sample_perspective(KernelGlobals *kg, * because we don't want to be affected by depth of field. We compute * ray origin and direction for the center and two neighboring pixels * and simply take their differences. */ - float3 Pnostereo = transform_point(&cameratoworld, make_float3(0.0f, 0.0f, 0.0f)); + float3 Pnostereo = transform_point(&cameratoworld, zero_float3()); float3 Pcenter = Pnostereo; float3 Dcenter = Pcamera; @@ -250,7 +250,7 @@ ccl_device_inline void camera_sample_panorama(ccl_constant KernelCamera *cam, float3 Pcamera = transform_perspective(&rastertocamera, make_float3(raster_x, raster_y, 0.0f)); /* create ray form raster position */ - float3 P = make_float3(0.0f, 0.0f, 0.0f); + float3 P = zero_float3(); float3 D = panorama_to_direction(cam, Pcamera.x, Pcamera.y); /* indicates ray should not receive any light, outside of the lens */ diff --git a/intern/cycles/kernel/kernel_differential.h b/intern/cycles/kernel/kernel_differential.h index 8513de0d843..3ec0cdbaccc 100644 --- a/intern/cycles/kernel/kernel_differential.h +++ b/intern/cycles/kernel/kernel_differential.h @@ -106,8 +106,8 @@ ccl_device differential differential_zero() ccl_device differential3 differential3_zero() { differential3 d; - d.dx = make_float3(0.0f, 0.0f, 0.0f); - d.dy = make_float3(0.0f, 0.0f, 0.0f); + d.dx = zero_float3(); + d.dy = zero_float3(); return d; } diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h index 4ac07d86dda..96ecc624067 100644 --- a/intern/cycles/kernel/kernel_emission.h +++ b/intern/cycles/kernel/kernel_emission.h @@ -27,7 +27,7 @@ ccl_device_noinline_cpu float3 direct_emissive_eval(KernelGlobals *kg, float time) { /* setup shading at emitter */ - float3 eval = make_float3(0.0f, 0.0f, 0.0f); + float3 eval = zero_float3(); if (shader_constant_emission_eval(kg, ls->shader, &eval)) { if ((ls->prim != PRIM_NONE) && dot(ls->Ng, I) < 0.0f) { @@ -146,13 +146,13 @@ ccl_device_noinline_cpu bool direct_emission(KernelGlobals *kg, /* use visibility flag to skip lights */ if (ls->shader & SHADER_EXCLUDE_ANY) { if (ls->shader & SHADER_EXCLUDE_DIFFUSE) - eval->diffuse = make_float3(0.0f, 0.0f, 0.0f); + eval->diffuse = zero_float3(); if (ls->shader & SHADER_EXCLUDE_GLOSSY) - eval->glossy = make_float3(0.0f, 0.0f, 0.0f); + eval->glossy = zero_float3(); if (ls->shader & SHADER_EXCLUDE_TRANSMIT) - eval->transmission = make_float3(0.0f, 0.0f, 0.0f); + eval->transmission = zero_float3(); if (ls->shader & SHADER_EXCLUDE_SCATTER) - eval->volume = make_float3(0.0f, 0.0f, 0.0f); + eval->volume = zero_float3(); } #endif @@ -266,7 +266,7 @@ ccl_device_noinline_cpu void indirect_lamp_emission(KernelGlobals *kg, /* shadow attenuation */ Ray volume_ray = *ray; volume_ray.t = ls.t; - float3 volume_tp = make_float3(1.0f, 1.0f, 1.0f); + float3 volume_tp = one_float3(); kernel_volume_shadow(kg, emission_sd, state, &volume_ray, &volume_tp); lamp_L *= volume_tp; } @@ -303,11 +303,11 @@ ccl_device_noinline_cpu float3 indirect_background(KernelGlobals *kg, ((shader & SHADER_EXCLUDE_TRANSMIT) && (state->flag & PATH_RAY_TRANSMIT)) || ((shader & SHADER_EXCLUDE_CAMERA) && (state->flag & PATH_RAY_CAMERA)) || ((shader & SHADER_EXCLUDE_SCATTER) && (state->flag & PATH_RAY_VOLUME_SCATTER))) - return make_float3(0.0f, 0.0f, 0.0f); + return zero_float3(); } /* Evaluate background shader. */ - float3 L = make_float3(0.0f, 0.0f, 0.0f); + float3 L = zero_float3(); if (!shader_constant_emission_eval(kg, shader, &L)) { # ifdef __SPLIT_KERNEL__ Ray priv_ray = *ray; diff --git a/intern/cycles/kernel/kernel_light_background.h b/intern/cycles/kernel/kernel_light_background.h index 2a685c0adfa..f0f64ce8704 100644 --- a/intern/cycles/kernel/kernel_light_background.h +++ b/intern/cycles/kernel/kernel_light_background.h @@ -277,7 +277,7 @@ ccl_device float3 background_portal_sample(KernelGlobals *kg, portal--; } - return make_float3(0.0f, 0.0f, 0.0f); + return zero_float3(); } ccl_device_inline float3 background_sun_sample(KernelGlobals *kg, diff --git a/intern/cycles/kernel/kernel_montecarlo.h b/intern/cycles/kernel/kernel_montecarlo.h index 0edcc1a5a14..ce37bd0b15e 100644 --- a/intern/cycles/kernel/kernel_montecarlo.h +++ b/intern/cycles/kernel/kernel_montecarlo.h @@ -154,7 +154,7 @@ ccl_device float2 concentric_sample_disk(float u1, float u2) float b = 2.0f * u2 - 1.0f; if (a == 0.0f && b == 0.0f) { - return make_float2(0.0f, 0.0f); + return zero_float2(); } else if (a * a > b * b) { r = a; diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h index 239c01fc57a..52be2ed87b7 100644 --- a/intern/cycles/kernel/kernel_passes.h +++ b/intern/cycles/kernel/kernel_passes.h @@ -59,9 +59,9 @@ ccl_device_inline void kernel_update_denoising_features(KernelGlobals *kg, return; } - float3 normal = make_float3(0.0f, 0.0f, 0.0f); - float3 diffuse_albedo = make_float3(0.0f, 0.0f, 0.0f); - float3 specular_albedo = make_float3(0.0f, 0.0f, 0.0f); + float3 normal = zero_float3(); + float3 diffuse_albedo = zero_float3(); + float3 specular_albedo = zero_float3(); float sum_weight = 0.0f, sum_nonspecular_weight = 0.0f; for (int i = 0; i < sd->num_closure; i++) { diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h index c332d5ad3ec..5681510fc25 100644 --- a/intern/cycles/kernel/kernel_path.h +++ b/intern/cycles/kernel/kernel_path.h @@ -267,7 +267,7 @@ ccl_device_forceinline bool kernel_path_shader_apply(KernelGlobals *kg, if (state->flag & PATH_RAY_TRANSPARENT_BACKGROUND) { state->flag |= (PATH_RAY_SHADOW_CATCHER | PATH_RAY_STORE_SHADOW_INFO); - float3 bg = make_float3(0.0f, 0.0f, 0.0f); + float3 bg = zero_float3(); if (!kernel_data.background.transparent) { bg = indirect_background(kg, emission_sd, state, NULL, ray); } @@ -288,7 +288,7 @@ ccl_device_forceinline bool kernel_path_shader_apply(KernelGlobals *kg, if (kernel_data.background.transparent) { L->transparent += average(holdout_weight * throughput); } - if (isequal_float3(holdout_weight, make_float3(1.0f, 1.0f, 1.0f))) { + if (isequal_float3(holdout_weight, one_float3())) { return false; } } @@ -460,7 +460,7 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, # ifdef __AO__ /* ambient occlusion */ if (kernel_data.integrator.use_ambient_occlusion) { - kernel_path_ao(kg, sd, emission_sd, L, state, throughput, make_float3(0.0f, 0.0f, 0.0f)); + kernel_path_ao(kg, sd, emission_sd, L, state, throughput, zero_float3()); } # endif /* __AO__ */ @@ -670,7 +670,7 @@ ccl_device void kernel_path_trace( } /* Initialize state. */ - float3 throughput = make_float3(1.0f, 1.0f, 1.0f); + float3 throughput = one_float3(); PathRadiance L; path_radiance_init(kg, &L); diff --git a/intern/cycles/kernel/kernel_path_branched.h b/intern/cycles/kernel/kernel_path_branched.h index 9ce7a147369..5ea7687ec3b 100644 --- a/intern/cycles/kernel/kernel_path_branched.h +++ b/intern/cycles/kernel/kernel_path_branched.h @@ -374,7 +374,7 @@ ccl_device void kernel_branched_path_integrate(KernelGlobals *kg, PathRadiance *L) { /* initialize */ - float3 throughput = make_float3(1.0f, 1.0f, 1.0f); + float3 throughput = one_float3(); path_radiance_init(kg, L); diff --git a/intern/cycles/kernel/kernel_path_state.h b/intern/cycles/kernel/kernel_path_state.h index c389c815ae2..bf601580cd0 100644 --- a/intern/cycles/kernel/kernel_path_state.h +++ b/intern/cycles/kernel/kernel_path_state.h @@ -41,11 +41,11 @@ ccl_device_inline void path_state_init(KernelGlobals *kg, if (kernel_data.film.pass_denoising_data) { state->flag |= PATH_RAY_STORE_SHADOW_INFO; state->denoising_feature_weight = 1.0f; - state->denoising_feature_throughput = make_float3(1.0f, 1.0f, 1.0f); + state->denoising_feature_throughput = one_float3(); } else { state->denoising_feature_weight = 0.0f; - state->denoising_feature_throughput = make_float3(0.0f, 0.0f, 0.0f); + state->denoising_feature_throughput = zero_float3(); } #endif /* __DENOISING_FEATURES__ */ diff --git a/intern/cycles/kernel/kernel_projection.h b/intern/cycles/kernel/kernel_projection.h index f74ced45fd5..387af54cf27 100644 --- a/intern/cycles/kernel/kernel_projection.h +++ b/intern/cycles/kernel/kernel_projection.h @@ -56,7 +56,7 @@ ccl_device float3 spherical_to_direction(float theta, float phi) ccl_device float2 direction_to_equirectangular_range(float3 dir, float4 range) { if (is_zero(dir)) - return make_float2(0.0f, 0.0f); + return zero_float2(); float u = (atan2f(dir.y, dir.x) - range.y) / range.x; float v = (acosf(dir.z / len(dir)) - range.w) / range.z; @@ -103,7 +103,7 @@ ccl_device float3 fisheye_to_direction(float u, float v, float fov) float r = sqrtf(u * u + v * v); if (r > 1.0f) - return make_float3(0.0f, 0.0f, 0.0f); + return zero_float3(); float phi = safe_acosf((r != 0.0f) ? u / r : 0.0f); float theta = r * fov * 0.5f; @@ -136,7 +136,7 @@ fisheye_equisolid_to_direction(float u, float v, float lens, float fov, float wi float r = sqrtf(u * u + v * v); if (r > rmax) - return make_float3(0.0f, 0.0f, 0.0f); + return zero_float3(); float phi = safe_acosf((r != 0.0f) ? u / r : 0.0f); float theta = 2.0f * asinf(r / (2.0f * lens)); @@ -158,7 +158,7 @@ ccl_device float3 mirrorball_to_direction(float u, float v) dir.z = 2.0f * v - 1.0f; if (dir.x * dir.x + dir.z * dir.z > 1.0f) - return make_float3(0.0f, 0.0f, 0.0f); + return zero_float3(); dir.y = -sqrtf(max(1.0f - dir.x * dir.x - dir.z * dir.z, 0.0f)); diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h index e461e1642b6..e6bd99414cc 100644 --- a/intern/cycles/kernel/kernel_shader.h +++ b/intern/cycles/kernel/kernel_shader.h @@ -330,8 +330,8 @@ ccl_device_inline void shader_setup_from_sample(KernelGlobals *kg, } else { #ifdef __DPDU__ - sd->dPdu = make_float3(0.0f, 0.0f, 0.0f); - sd->dPdv = make_float3(0.0f, 0.0f, 0.0f); + sd->dPdu = zero_float3(); + sd->dPdv = zero_float3(); #endif } @@ -367,7 +367,7 @@ ccl_device_inline void shader_setup_from_sample(KernelGlobals *kg, ccl_device void shader_setup_from_displace( KernelGlobals *kg, ShaderData *sd, int object, int prim, float u, float v) { - float3 P, Ng, I = make_float3(0.0f, 0.0f, 0.0f); + float3 P, Ng, I = zero_float3(); int shader; triangle_point_normal(kg, object, prim, u, v, &P, &Ng, &shader); @@ -419,8 +419,8 @@ ccl_device_inline void shader_setup_from_background(KernelGlobals *kg, #ifdef __DPDU__ /* dPdu/dPdv */ - sd->dPdu = make_float3(0.0f, 0.0f, 0.0f); - sd->dPdv = make_float3(0.0f, 0.0f, 0.0f); + sd->dPdu = zero_float3(); + sd->dPdv = zero_float3(); #endif #ifdef __RAY_DIFFERENTIALS__ @@ -466,8 +466,8 @@ ccl_device_inline void shader_setup_from_volume(KernelGlobals *kg, ShaderData *s # ifdef __DPDU__ /* dPdu/dPdv */ - sd->dPdu = make_float3(0.0f, 0.0f, 0.0f); - sd->dPdv = make_float3(0.0f, 0.0f, 0.0f); + sd->dPdu = zero_float3(); + sd->dPdv = zero_float3(); # endif # ifdef __RAY_DIFFERENTIALS__ @@ -617,8 +617,7 @@ ccl_device_inline { PROFILING_INIT(kg, PROFILING_CLOSURE_EVAL); - bsdf_eval_init( - eval, NBUILTIN_CLOSURES, make_float3(0.0f, 0.0f, 0.0f), kernel_data.film.use_light_pass); + bsdf_eval_init(eval, NBUILTIN_CLOSURES, zero_float3(), kernel_data.film.use_light_pass); #ifdef __BRANCHED_PATH__ if (kernel_data.integrator.branched) @@ -757,7 +756,7 @@ ccl_device_inline int shader_bsdf_sample(KernelGlobals *kg, kernel_assert(CLOSURE_IS_BSDF(sc->type)); int label; - float3 eval = make_float3(0.0f, 0.0f, 0.0f); + float3 eval = zero_float3(); *pdf = 0.0f; label = bsdf_sample(kg, sd, sc, randu, randv, &eval, omega_in, domega_in, pdf); @@ -787,7 +786,7 @@ ccl_device int shader_bsdf_sample_closure(KernelGlobals *kg, PROFILING_INIT(kg, PROFILING_CLOSURE_SAMPLE); int label; - float3 eval = make_float3(0.0f, 0.0f, 0.0f); + float3 eval = zero_float3(); *pdf = 0.0f; label = bsdf_sample(kg, sd, sc, randu, randv, &eval, omega_in, domega_in, pdf); @@ -831,13 +830,13 @@ ccl_device void shader_bsdf_blur(KernelGlobals *kg, ShaderData *sd, float roughn ccl_device float3 shader_bsdf_transparency(KernelGlobals *kg, const ShaderData *sd) { if (sd->flag & SD_HAS_ONLY_VOLUME) { - return make_float3(1.0f, 1.0f, 1.0f); + return one_float3(); } else if (sd->flag & SD_TRANSPARENT) { return sd->closure_transparent_extinction; } else { - return make_float3(0.0f, 0.0f, 0.0f); + return zero_float3(); } } @@ -849,7 +848,7 @@ ccl_device void shader_bsdf_disable_transparency(KernelGlobals *kg, ShaderData * if (sc->type == CLOSURE_BSDF_TRANSPARENT_ID) { sc->sample_weight = 0.0f; - sc->weight = make_float3(0.0f, 0.0f, 0.0f); + sc->weight = zero_float3(); } } @@ -859,17 +858,17 @@ ccl_device void shader_bsdf_disable_transparency(KernelGlobals *kg, ShaderData * ccl_device float3 shader_bsdf_alpha(KernelGlobals *kg, ShaderData *sd) { - float3 alpha = make_float3(1.0f, 1.0f, 1.0f) - shader_bsdf_transparency(kg, sd); + float3 alpha = one_float3() - shader_bsdf_transparency(kg, sd); - alpha = max(alpha, make_float3(0.0f, 0.0f, 0.0f)); - alpha = min(alpha, make_float3(1.0f, 1.0f, 1.0f)); + alpha = max(alpha, zero_float3()); + alpha = min(alpha, one_float3()); return alpha; } ccl_device float3 shader_bsdf_diffuse(KernelGlobals *kg, ShaderData *sd) { - float3 eval = make_float3(0.0f, 0.0f, 0.0f); + float3 eval = zero_float3(); for (int i = 0; i < sd->num_closure; i++) { ShaderClosure *sc = &sd->closure[i]; @@ -884,7 +883,7 @@ ccl_device float3 shader_bsdf_diffuse(KernelGlobals *kg, ShaderData *sd) ccl_device float3 shader_bsdf_glossy(KernelGlobals *kg, ShaderData *sd) { - float3 eval = make_float3(0.0f, 0.0f, 0.0f); + float3 eval = zero_float3(); for (int i = 0; i < sd->num_closure; i++) { ShaderClosure *sc = &sd->closure[i]; @@ -898,7 +897,7 @@ ccl_device float3 shader_bsdf_glossy(KernelGlobals *kg, ShaderData *sd) ccl_device float3 shader_bsdf_transmission(KernelGlobals *kg, ShaderData *sd) { - float3 eval = make_float3(0.0f, 0.0f, 0.0f); + float3 eval = zero_float3(); for (int i = 0; i < sd->num_closure; i++) { ShaderClosure *sc = &sd->closure[i]; @@ -912,7 +911,7 @@ ccl_device float3 shader_bsdf_transmission(KernelGlobals *kg, ShaderData *sd) ccl_device float3 shader_bsdf_average_normal(KernelGlobals *kg, ShaderData *sd) { - float3 N = make_float3(0.0f, 0.0f, 0.0f); + float3 N = zero_float3(); for (int i = 0; i < sd->num_closure; i++) { ShaderClosure *sc = &sd->closure[i]; @@ -925,8 +924,8 @@ ccl_device float3 shader_bsdf_average_normal(KernelGlobals *kg, ShaderData *sd) ccl_device float3 shader_bsdf_ao(KernelGlobals *kg, ShaderData *sd, float ao_factor, float3 *N_) { - float3 eval = make_float3(0.0f, 0.0f, 0.0f); - float3 N = make_float3(0.0f, 0.0f, 0.0f); + float3 eval = zero_float3(); + float3 N = zero_float3(); for (int i = 0; i < sd->num_closure; i++) { ShaderClosure *sc = &sd->closure[i]; @@ -945,8 +944,8 @@ ccl_device float3 shader_bsdf_ao(KernelGlobals *kg, ShaderData *sd, float ao_fac #ifdef __SUBSURFACE__ ccl_device float3 shader_bssrdf_sum(ShaderData *sd, float3 *N_, float *texture_blur_) { - float3 eval = make_float3(0.0f, 0.0f, 0.0f); - float3 N = make_float3(0.0f, 0.0f, 0.0f); + float3 eval = zero_float3(); + float3 N = zero_float3(); float texture_blur = 0.0f, weight_sum = 0.0f; for (int i = 0; i < sd->num_closure; i++) { @@ -999,7 +998,7 @@ ccl_device float3 shader_background_eval(ShaderData *sd) return sd->closure_emission_background; } else { - return make_float3(0.0f, 0.0f, 0.0f); + return zero_float3(); } } @@ -1011,7 +1010,7 @@ ccl_device float3 shader_emissive_eval(ShaderData *sd) return emissive_simple_eval(sd->Ng, sd->I) * sd->closure_emission_background; } else { - return make_float3(0.0f, 0.0f, 0.0f); + return zero_float3(); } } @@ -1019,13 +1018,13 @@ ccl_device float3 shader_emissive_eval(ShaderData *sd) ccl_device float3 shader_holdout_apply(KernelGlobals *kg, ShaderData *sd) { - float3 weight = make_float3(0.0f, 0.0f, 0.0f); + float3 weight = zero_float3(); /* For objects marked as holdout, preserve transparency and remove all other * closures, replacing them with a holdout weight. */ if (sd->object_flag & SD_OBJECT_HOLDOUT_MASK) { if ((sd->flag & SD_TRANSPARENT) && !(sd->flag & SD_HAS_ONLY_VOLUME)) { - weight = make_float3(1.0f, 1.0f, 1.0f) - sd->closure_transparent_extinction; + weight = one_float3() - sd->closure_transparent_extinction; for (int i = 0; i < sd->num_closure; i++) { ShaderClosure *sc = &sd->closure[i]; @@ -1037,7 +1036,7 @@ ccl_device float3 shader_holdout_apply(KernelGlobals *kg, ShaderData *sd) sd->flag &= ~(SD_CLOSURE_FLAGS - (SD_TRANSPARENT | SD_BSDF)); } else { - weight = make_float3(1.0f, 1.0f, 1.0f); + weight = one_float3(); } } else { @@ -1150,8 +1149,7 @@ ccl_device void shader_volume_phase_eval( { PROFILING_INIT(kg, PROFILING_CLOSURE_VOLUME_EVAL); - bsdf_eval_init( - eval, NBUILTIN_CLOSURES, make_float3(0.0f, 0.0f, 0.0f), kernel_data.film.use_light_pass); + bsdf_eval_init(eval, NBUILTIN_CLOSURES, zero_float3(), kernel_data.film.use_light_pass); _shader_volume_phase_multi_eval(sd, omega_in, pdf, -1, eval, 0.0f, 0.0f); } @@ -1209,7 +1207,7 @@ ccl_device int shader_volume_phase_sample(KernelGlobals *kg, * depending on color channels, even if this is perhaps not a common case */ const ShaderClosure *sc = &sd->closure[sampled]; int label; - float3 eval = make_float3(0.0f, 0.0f, 0.0f); + float3 eval = zero_float3(); *pdf = 0.0f; label = volume_phase_sample(sd, sc, randu, randv, &eval, omega_in, domega_in, pdf); @@ -1234,7 +1232,7 @@ ccl_device int shader_phase_sample_closure(KernelGlobals *kg, PROFILING_INIT(kg, PROFILING_CLOSURE_VOLUME_SAMPLE); int label; - float3 eval = make_float3(0.0f, 0.0f, 0.0f); + float3 eval = zero_float3(); *pdf = 0.0f; label = volume_phase_sample(sd, sc, randu, randv, &eval, omega_in, domega_in, pdf); diff --git a/intern/cycles/kernel/kernel_shadow.h b/intern/cycles/kernel/kernel_shadow.h index 07043e6a769..3b124122fba 100644 --- a/intern/cycles/kernel/kernel_shadow.h +++ b/intern/cycles/kernel/kernel_shadow.h @@ -165,7 +165,7 @@ ccl_device bool shadow_blocked_transparent_all_loop(KernelGlobals *kg, * shade them. */ if (!blocked && num_hits > 0) { - float3 throughput = make_float3(1.0f, 1.0f, 1.0f); + float3 throughput = one_float3(); float3 Pend = ray->P + ray->D * ray->t; float last_t = 0.0f; int bounce = state->transparent_bounce; @@ -305,7 +305,7 @@ ccl_device bool shadow_blocked_transparent_stepped_loop(KernelGlobals *kg, # endif # endif if (blocked && is_transparent_isect) { - float3 throughput = make_float3(1.0f, 1.0f, 1.0f); + float3 throughput = one_float3(); float3 Pend = ray->P + ray->D * ray->t; int bounce = state->transparent_bounce; # ifdef __VOLUME__ @@ -390,7 +390,7 @@ ccl_device_inline bool shadow_blocked(KernelGlobals *kg, Ray *ray, float3 *shadow) { - *shadow = make_float3(1.0f, 1.0f, 1.0f); + *shadow = one_float3(); #if !defined(__KERNEL_OPTIX__) /* Some common early checks. * Avoid conditional trace call in OptiX though, since those hurt performance there. diff --git a/intern/cycles/kernel/kernel_subsurface.h b/intern/cycles/kernel/kernel_subsurface.h index 917f35d37dc..55bbe7f95db 100644 --- a/intern/cycles/kernel/kernel_subsurface.h +++ b/intern/cycles/kernel/kernel_subsurface.h @@ -27,7 +27,7 @@ subsurface_scatter_eval(ShaderData *sd, const ShaderClosure *sc, float disk_r, f { /* this is the veach one-sample model with balance heuristic, some pdf * factors drop out when using balance heuristic weighting */ - float3 eval_sum = make_float3(0.0f, 0.0f, 0.0f); + float3 eval_sum = zero_float3(); float pdf_sum = 0.0f; float sample_weight_inv = 0.0f; @@ -62,7 +62,7 @@ subsurface_scatter_eval(ShaderData *sd, const ShaderClosure *sc, float disk_r, f } } - return (pdf_sum > 0.0f) ? eval_sum / pdf_sum : make_float3(0.0f, 0.0f, 0.0f); + return (pdf_sum > 0.0f) ? eval_sum / pdf_sum : zero_float3(); } /* replace closures with a single diffuse bsdf closure after scatter step */ @@ -107,7 +107,7 @@ ccl_device void subsurface_scatter_setup_diffuse_bsdf( /* optionally do blurring of color and/or bump mapping, at the cost of a shader evaluation */ ccl_device float3 subsurface_color_pow(float3 color, float exponent) { - color = max(color, make_float3(0.0f, 0.0f, 0.0f)); + color = max(color, zero_float3()); if (exponent == 1.0f) { /* nothing to do */ @@ -243,7 +243,7 @@ ccl_device_inline int subsurface_scatter_disk(KernelGlobals *kg, } #endif /* __OBJECT_MOTION__ */ else { - ss_isect->weight[hit] = make_float3(0.0f, 0.0f, 0.0f); + ss_isect->weight[hit] = zero_float3(); continue; } @@ -336,38 +336,95 @@ ccl_device_noinline void subsurface_scatter_multi_setup( ccl_device void subsurface_random_walk_remap(const float A, const float d, float *sigma_t, - float *sigma_s) + float *alpha) { /* Compute attenuation and scattering coefficients from albedo. */ - const float a = 1.0f - expf(A * (-5.09406f + A * (2.61188f - A * 4.31805f))); + *alpha = 1.0f - expf(A * (-5.09406f + A * (2.61188f - A * 4.31805f))); const float s = 1.9f - A + 3.5f * sqr(A - 0.8f); *sigma_t = 1.0f / fmaxf(d * s, 1e-16f); - *sigma_s = *sigma_t * a; } ccl_device void subsurface_random_walk_coefficients(const ShaderClosure *sc, float3 *sigma_t, - float3 *sigma_s, + float3 *alpha, float3 *weight) { const Bssrdf *bssrdf = (const Bssrdf *)sc; const float3 A = bssrdf->albedo; const float3 d = bssrdf->radius; float sigma_t_x, sigma_t_y, sigma_t_z; - float sigma_s_x, sigma_s_y, sigma_s_z; + float alpha_x, alpha_y, alpha_z; - subsurface_random_walk_remap(A.x, d.x, &sigma_t_x, &sigma_s_x); - subsurface_random_walk_remap(A.y, d.y, &sigma_t_y, &sigma_s_y); - subsurface_random_walk_remap(A.z, d.z, &sigma_t_z, &sigma_s_z); + subsurface_random_walk_remap(A.x, d.x, &sigma_t_x, &alpha_x); + subsurface_random_walk_remap(A.y, d.y, &sigma_t_y, &alpha_y); + subsurface_random_walk_remap(A.z, d.z, &sigma_t_z, &alpha_z); *sigma_t = make_float3(sigma_t_x, sigma_t_y, sigma_t_z); - *sigma_s = make_float3(sigma_s_x, sigma_s_y, sigma_s_z); + *alpha = make_float3(alpha_x, alpha_y, alpha_z); /* Closure mixing and Fresnel weights separate from albedo. */ *weight = safe_divide_color(bssrdf->weight, A); } +/* References for Dwivedi sampling: + * + * [1] "A Zero-variance-based Sampling Scheme for Monte Carlo Subsurface Scattering" + * by Jaroslav KÅ™ivánek and Eugene d'Eon (SIGGRAPH 2014) + * https://cgg.mff.cuni.cz/~jaroslav/papers/2014-zerovar/ + * + * [2] "Improving the Dwivedi Sampling Scheme" + * by Johannes Meng, Johannes Hanika, and Carsten Dachsbacher (EGSR 2016) + * https://cg.ivd.kit.edu/1951.php + * + * [3] "Zero-Variance Theory for Efficient Subsurface Scattering" + * by Eugene d'Eon and Jaroslav KÅ™ivánek (SIGGRAPH 2020) + * https://iliyan.com/publications/RenderingCourse2020 + */ + +ccl_device_forceinline float eval_phase_dwivedi(float v, float phase_log, float cos_theta) +{ + /* Eq. 9 from [2] using precomputed log((v + 1) / (v - 1))*/ + return 1.0f / ((v - cos_theta) * phase_log); +} + +ccl_device_forceinline float sample_phase_dwivedi(float v, float phase_log, float rand) +{ + /* Based on Eq. 10 from [2]: `v - (v + 1) * pow((v - 1) / (v + 1), rand)` + * Since we're already pre-computing `phase_log = log((v + 1) / (v - 1))` for the evaluation, + * we can implement the power function like this. */ + return v - (v + 1) * expf(-rand * phase_log); +} + +ccl_device_forceinline float diffusion_length_dwivedi(float alpha) +{ + /* Eq. 67 from [3] */ + return 1.0f / sqrtf(1.0f - powf(alpha, 2.44294f - 0.0215813f * alpha + 0.578637f / alpha)); +} + +ccl_device_forceinline float3 direction_from_cosine(float3 D, float cos_theta, float randv) +{ + float sin_theta = safe_sqrtf(1.0f - cos_theta * cos_theta); + float phi = M_2PI_F * randv; + float3 dir = make_float3(sin_theta * cosf(phi), sin_theta * sinf(phi), cos_theta); + + float3 T, B; + make_orthonormals(D, &T, &B); + return dir.x * T + dir.y * B + dir.z * D; +} + +ccl_device_forceinline float3 subsurface_random_walk_pdf(float3 sigma_t, + float t, + bool hit, + float3 *transmittance) +{ + float3 T = volume_color_transmittance(sigma_t, t); + if (transmittance) { + *transmittance = T; + } + return hit ? T : sigma_t * T; +} + #ifdef __KERNEL_OPTIX__ ccl_device_inline /* inline trace calls */ #else @@ -390,10 +447,24 @@ ccl_device_noinline return 0; } - /* Convert subsurface to volume coefficients. */ - float3 sigma_t, sigma_s; - float3 throughput = make_float3(1.0f, 1.0f, 1.0f); - subsurface_random_walk_coefficients(sc, &sigma_t, &sigma_s, &throughput); + /* Convert subsurface to volume coefficients. + * The single-scattering albedo is named alpha to avoid confusion with the surface albedo. */ + float3 sigma_t, alpha; + float3 throughput = one_float3(); + subsurface_random_walk_coefficients(sc, &sigma_t, &alpha, &throughput); + float3 sigma_s = sigma_t * alpha; + + /* Theoretically it should be better to use the exact alpha for the channel we're sampling at + * each bounce, but in practice there doesn't seem to be a noticeable difference in exchange + * for making the code significantly more complex and slower (if direction sampling depends on + * the sampled channel, we need to compute its PDF per-channel and consider it for MIS later on). + * + * Since the strength of the guided sampling increases as alpha gets lower, using a value that + * is too low results in fireflies while one that's too high just gives a bit more noise. + * Therefore, the code here uses the highest of the three albedos to be safe. */ + float diffusion_length = diffusion_length_dwivedi(max3(alpha)); + /* Precompute term for phase sampling. */ + float phase_log = logf((diffusion_length + 1) / (diffusion_length - 1)); /* Setup ray. */ #ifdef __SPLIT_KERNEL__ @@ -414,68 +485,161 @@ ccl_device_noinline /* Random walk until we hit the surface again. */ bool hit = false; + bool have_opposite_interface = false; + float opposite_distance = 0.0f; + + /* Todo: Disable for alpha>0.999 or so? */ + const float guided_fraction = 0.75f; for (int bounce = 0; bounce < BSSRDF_MAX_BOUNCES; bounce++) { /* Advance random number offset. */ state->rng_offset += PRNG_BOUNCE_NUM; - if (bounce > 0) { - /* Sample scattering direction. */ - const float anisotropy = 0.0f; - float scatter_u, scatter_v; - path_state_rng_2D(kg, state, PRNG_BSDF_U, &scatter_u, &scatter_v); - ray->D = henyey_greenstrein_sample(ray->D, anisotropy, scatter_u, scatter_v, NULL); - } - /* Sample color channel, use MIS with balance heuristic. */ float rphase = path_state_rng_1D(kg, state, PRNG_PHASE_CHANNEL); - float3 albedo = safe_divide_color(sigma_s, sigma_t); float3 channel_pdf; - int channel = kernel_volume_sample_channel(albedo, throughput, rphase, &channel_pdf); - - /* Distance sampling. */ - float rdist = path_state_rng_1D(kg, state, PRNG_SCATTER_DISTANCE); + int channel = kernel_volume_sample_channel(alpha, throughput, rphase, &channel_pdf); float sample_sigma_t = kernel_volume_channel_get(sigma_t, channel); - float t = -logf(1.0f - rdist) / sample_sigma_t; + float randt = path_state_rng_1D(kg, state, PRNG_SCATTER_DISTANCE); - ray->t = t; + /* We need the result of the raycast to compute the full guided PDF, so just remember the + * relevant terms to avoid recomputing them later. */ + float backward_fraction = 0.0f; + float forward_pdf_factor = 0.0f; + float forward_stretching = 1.0f; + float backward_pdf_factor = 0.0f; + float backward_stretching = 1.0f; + + /* For the initial ray, we already know the direction, so just do classic distance sampling. */ + if (bounce > 0) { + /* Decide whether we should use guided or classic sampling. */ + bool guided = (path_state_rng_1D(kg, state, PRNG_LIGHT_TERMINATE) < guided_fraction); + + /* Determine if we want to sample away from the incoming interface. + * This only happens if we found a nearby opposite interface, and the probability for it + * depends on how close we are to it already. + * This probability term comes from the recorded presentation of [3]. */ + bool guide_backward = false; + if (have_opposite_interface) { + /* Compute distance of the random walk between the tangent plane at the starting point + * and the assumed opposite interface (the parallel plane that contains the point we + * found in our ray query for the opposite side). */ + float x = clamp(dot(ray->P - sd->P, -sd->N), 0.0f, opposite_distance); + backward_fraction = 1.0f / (1.0f + expf((opposite_distance - 2 * x) / diffusion_length)); + guide_backward = path_state_rng_1D(kg, state, PRNG_TERMINATE) < backward_fraction; + } + + /* Sample scattering direction. */ + float scatter_u, scatter_v; + path_state_rng_2D(kg, state, PRNG_BSDF_U, &scatter_u, &scatter_v); + float cos_theta; + if (guided) { + cos_theta = sample_phase_dwivedi(diffusion_length, phase_log, scatter_u); + /* The backwards guiding distribution is just mirrored along sd->N, so swapping the + * sign here is enough to sample from that instead. */ + if (guide_backward) { + cos_theta = -cos_theta; + } + } + else { + cos_theta = 2.0f * scatter_u - 1.0f; + } + ray->D = direction_from_cosine(sd->N, cos_theta, scatter_v); + + /* Compute PDF factor caused by phase sampling (as the ratio of guided / classic). + * Since phase sampling is channel-independent, we can get away with applying a factor + * to the guided PDF, which implicitly means pulling out the classic PDF term and letting + * it cancel with an equivalent term in the numerator of the full estimator. + * For the backward PDF, we again reuse the same probability distribution with a sign swap. + */ + forward_pdf_factor = 2.0f * eval_phase_dwivedi(diffusion_length, phase_log, cos_theta); + backward_pdf_factor = 2.0f * eval_phase_dwivedi(diffusion_length, phase_log, -cos_theta); + + /* Prepare distance sampling. + * For the backwards case, this also needs the sign swapped since now directions against + * sd->N (and therefore with negative cos_theta) are preferred. */ + forward_stretching = (1.0f - cos_theta / diffusion_length); + backward_stretching = (1.0f + cos_theta / diffusion_length); + if (guided) { + sample_sigma_t *= guide_backward ? backward_stretching : forward_stretching; + } + } + + /* Sample direction along ray. */ + float t = -logf(1.0f - randt) / sample_sigma_t; + + /* On the first bounce, we use the raycast to check if the opposite side is nearby. + * If yes, we will later use backwards guided sampling in order to have a decent + * chance of connecting to it. + * Todo: Maybe use less than 10 times the mean free path? */ + ray->t = (bounce == 0) ? max(t, 10.0f / (min3(sigma_t))) : t; scene_intersect_local(kg, ray, ss_isect, sd->object, NULL, 1); hit = (ss_isect->num_hits > 0); if (hit) { #ifdef __KERNEL_OPTIX__ /* t is always in world space with OptiX. */ - t = ss_isect->hits[0].t; + ray->t = ss_isect->hits[0].t; #else /* Compute world space distance to surface hit. */ float3 D = ray->D; object_inverse_dir_transform(kg, sd, &D); D = normalize(D) * ss_isect->hits[0].t; object_dir_transform(kg, sd, &D); - t = len(D); + ray->t = len(D); #endif } + if (bounce == 0) { + /* Check if we hit the opposite side. */ + if (hit) { + have_opposite_interface = true; + opposite_distance = dot(ray->P + ray->t * ray->D - sd->P, -sd->N); + } + /* Apart from the opposite side check, we were supposed to only trace up to distance t, + * so check if there would have been a hit in that case. */ + hit = ray->t < t; + } + + /* Use the distance to the exit point for the throughput update if we found one. */ + if (hit) { + t = ray->t; + } + /* Advance to new scatter location. */ ray->P += t * ray->D; - /* Update throughput. */ - float3 transmittance = volume_color_transmittance(sigma_t, t); - float pdf = dot(channel_pdf, (hit) ? transmittance : sigma_t * transmittance); - throughput *= ((hit) ? transmittance : sigma_s * transmittance) / pdf; + float3 transmittance; + float3 pdf = subsurface_random_walk_pdf(sigma_t, t, hit, &transmittance); + if (bounce > 0) { + /* Compute PDF just like we do for classic sampling, but with the stretched sigma_t. */ + float3 guided_pdf = subsurface_random_walk_pdf(forward_stretching * sigma_t, t, hit, NULL); + + if (have_opposite_interface) { + /* First step of MIS: Depending on geometry we might have two methods for guided + * sampling, so perform MIS between them. */ + float3 back_pdf = subsurface_random_walk_pdf(backward_stretching * sigma_t, t, hit, NULL); + guided_pdf = mix( + guided_pdf * forward_pdf_factor, back_pdf * backward_pdf_factor, backward_fraction); + } + else { + /* Just include phase sampling factor otherwise. */ + guided_pdf *= forward_pdf_factor; + } + + /* Now we apply the MIS balance heuristic between the classic and guided sampling. */ + pdf = mix(pdf, guided_pdf, guided_fraction); + } + + /* Finally, we're applying MIS again to combine the three color channels. + * Altogether, the MIS computation combines up to nine different estimators: + * {classic, guided, backward_guided} x {r, g, b} */ + throughput *= (hit ? transmittance : sigma_s * transmittance) / dot(channel_pdf, pdf); if (hit) { /* If we hit the surface, we are done. */ break; } - - /* Russian roulette. */ - float terminate = path_state_rng_1D(kg, state, PRNG_TERMINATE); - float probability = min(max3(fabs(throughput)), 1.0f); - if (terminate >= probability) { - break; - } - throughput /= probability; } kernel_assert(isfinite_safe(throughput.x) && isfinite_safe(throughput.y) && diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 82cc11922e0..df56360b1df 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -1700,7 +1700,7 @@ typedef struct WorkTile { } WorkTile; /* Pre-computed sample table sizes for PMJ02 sampler. */ -#define NUM_PMJ_SAMPLES 64 * 64 +#define NUM_PMJ_SAMPLES (64 * 64) #define NUM_PMJ_PATTERNS 48 CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/kernel_volume.h b/intern/cycles/kernel/kernel_volume.h index fdf712293e7..e46b0436107 100644 --- a/intern/cycles/kernel/kernel_volume.h +++ b/intern/cycles/kernel/kernel_volume.h @@ -70,11 +70,9 @@ ccl_device_inline bool volume_shader_sample(KernelGlobals *kg, if (!(sd->flag & (SD_EXTINCTION | SD_SCATTER | SD_EMISSION))) return false; - coeff->sigma_s = make_float3(0.0f, 0.0f, 0.0f); - coeff->sigma_t = (sd->flag & SD_EXTINCTION) ? sd->closure_transparent_extinction : - make_float3(0.0f, 0.0f, 0.0f); - coeff->emission = (sd->flag & SD_EMISSION) ? sd->closure_emission_background : - make_float3(0.0f, 0.0f, 0.0f); + coeff->sigma_s = zero_float3(); + coeff->sigma_t = (sd->flag & SD_EXTINCTION) ? sd->closure_transparent_extinction : zero_float3(); + coeff->emission = (sd->flag & SD_EMISSION) ? sd->closure_emission_background : zero_float3(); if (sd->flag & SD_SCATTER) { for (int i = 0; i < sd->num_closure; i++) { @@ -204,7 +202,7 @@ ccl_device void kernel_volume_shadow_homogeneous(KernelGlobals *kg, ShaderData *sd, float3 *throughput) { - float3 sigma_t = make_float3(0.0f, 0.0f, 0.0f); + float3 sigma_t = zero_float3(); if (volume_shader_extinction_sample(kg, sd, state, ray->P, &sigma_t)) *throughput *= volume_color_transmittance(sigma_t, ray->t); @@ -230,7 +228,7 @@ ccl_device void kernel_volume_shadow_heterogeneous(KernelGlobals *kg, /* compute extinction at the start */ float t = 0.0f; - float3 sum = make_float3(0.0f, 0.0f, 0.0f); + float3 sum = zero_float3(); for (int i = 0; i < max_steps; i++) { /* advance to new position */ @@ -243,7 +241,7 @@ ccl_device void kernel_volume_shadow_heterogeneous(KernelGlobals *kg, } float3 new_P = ray->P + ray->D * (t + step_offset); - float3 sigma_t = make_float3(0.0f, 0.0f, 0.0f); + float3 sigma_t = zero_float3(); /* compute attenuation over segment */ if (volume_shader_extinction_sample(kg, sd, state, new_P, &sigma_t)) { @@ -365,8 +363,7 @@ ccl_device float kernel_volume_distance_sample( float sample_t = min(max_t, -logf(1.0f - xi * (1.0f - sample_transmittance)) / sample_sigma_t); *transmittance = volume_color_transmittance(sigma_t, sample_t); - *pdf = safe_divide_color(sigma_t * *transmittance, - make_float3(1.0f, 1.0f, 1.0f) - full_transmittance); + *pdf = safe_divide_color(sigma_t * *transmittance, one_float3() - full_transmittance); /* todo: optimization: when taken together with hit/miss decision, * the full_transmittance cancels out drops out and xi does not @@ -380,8 +377,7 @@ ccl_device float3 kernel_volume_distance_pdf(float max_t, float3 sigma_t, float float3 full_transmittance = volume_color_transmittance(sigma_t, max_t); float3 transmittance = volume_color_transmittance(sigma_t, sample_t); - return safe_divide_color(sigma_t * transmittance, - make_float3(1.0f, 1.0f, 1.0f) - full_transmittance); + return safe_divide_color(sigma_t * transmittance, one_float3() - full_transmittance); } /* Emission */ @@ -508,7 +504,7 @@ kernel_volume_integrate_homogeneous(KernelGlobals *kg, /* modify pdf for hit/miss decision */ if (probalistic_scatter) - pdf *= make_float3(1.0f, 1.0f, 1.0f) - volume_color_transmittance(coeff.sigma_t, t); + pdf *= one_float3() - volume_color_transmittance(coeff.sigma_t, t); new_tp = *throughput * coeff.sigma_s * transmittance / dot(channel_pdf, pdf); t = sample_t; @@ -578,7 +574,7 @@ kernel_volume_integrate_heterogeneous_distance(KernelGlobals *kg, /* compute coefficients at the start */ float t = 0.0f; - float3 accum_transmittance = make_float3(1.0f, 1.0f, 1.0f); + float3 accum_transmittance = one_float3(); /* pick random color channel, we use the Veach one-sample * model with balance heuristic for the channels */ @@ -654,7 +650,7 @@ kernel_volume_integrate_heterogeneous_distance(KernelGlobals *kg, new_tp = tp * transmittance; } else { - transmittance = make_float3(0.0f, 0.0f, 0.0f); + transmittance = zero_float3(); new_tp = tp; } @@ -671,7 +667,7 @@ kernel_volume_integrate_heterogeneous_distance(KernelGlobals *kg, /* stop if nearly all light blocked */ if (tp.x < tp_eps && tp.y < tp_eps && tp.z < tp_eps) { - tp = make_float3(0.0f, 0.0f, 0.0f); + tp = zero_float3(); break; } } @@ -811,10 +807,10 @@ ccl_device void kernel_volume_decoupled_record(KernelGlobals *kg, } /* init accumulation variables */ - float3 accum_emission = make_float3(0.0f, 0.0f, 0.0f); - float3 accum_transmittance = make_float3(1.0f, 1.0f, 1.0f); - float3 accum_albedo = make_float3(0.0f, 0.0f, 0.0f); - float3 cdf_distance = make_float3(0.0f, 0.0f, 0.0f); + float3 accum_emission = zero_float3(); + float3 accum_transmittance = one_float3(); + float3 accum_albedo = zero_float3(); + float3 cdf_distance = zero_float3(); float t = 0.0f; segment->numsteps = 0; @@ -844,7 +840,7 @@ ccl_device void kernel_volume_decoupled_record(KernelGlobals *kg, /* compute average albedo for channel sampling */ if (closure_flag & SD_SCATTER) { - accum_albedo += dt * safe_divide_color(coeff.sigma_s, sigma_t); + accum_albedo += (dt / ray->t) * safe_divide_color(coeff.sigma_s, sigma_t); } /* compute accumulated transmittance */ @@ -880,8 +876,8 @@ ccl_device void kernel_volume_decoupled_record(KernelGlobals *kg, } else { /* store empty step */ - step->sigma_t = make_float3(0.0f, 0.0f, 0.0f); - step->sigma_s = make_float3(0.0f, 0.0f, 0.0f); + step->sigma_t = zero_float3(); + step->sigma_s = zero_float3(); step->closure_flag = 0; segment->numsteps++; @@ -1011,12 +1007,12 @@ ccl_device VolumeIntegrateResult kernel_volume_decoupled_scatter(KernelGlobals * step = segment->steps; float prev_t = 0.0f; - float3 step_pdf_distance = make_float3(1.0f, 1.0f, 1.0f); + float3 step_pdf_distance = one_float3(); if (segment->numsteps > 1) { float prev_cdf = 0.0f; float step_cdf = 1.0f; - float3 prev_cdf_distance = make_float3(0.0f, 0.0f, 0.0f); + float3 prev_cdf_distance = zero_float3(); for (int i = 0;; i++, step++) { /* todo: optimize using binary search */ @@ -1047,7 +1043,7 @@ ccl_device VolumeIntegrateResult kernel_volume_decoupled_scatter(KernelGlobals * /* modify pdf for hit/miss decision */ if (probalistic_scatter) - distance_pdf *= make_float3(1.0f, 1.0f, 1.0f) - segment->accum_transmittance; + distance_pdf *= one_float3() - segment->accum_transmittance; pdf = dot(channel_pdf, distance_pdf * step_pdf_distance); @@ -1066,10 +1062,10 @@ ccl_device VolumeIntegrateResult kernel_volume_decoupled_scatter(KernelGlobals * step = segment->steps; float prev_t = 0.0f; - float3 step_pdf_distance = make_float3(1.0f, 1.0f, 1.0f); + float3 step_pdf_distance = one_float3(); if (segment->numsteps > 1) { - float3 prev_cdf_distance = make_float3(0.0f, 0.0f, 0.0f); + float3 prev_cdf_distance = zero_float3(); int numsteps = segment->numsteps; int high = numsteps - 1; diff --git a/intern/cycles/kernel/osl/CMakeLists.txt b/intern/cycles/kernel/osl/CMakeLists.txt index cdd3b24be86..6cdc7367fbb 100644 --- a/intern/cycles/kernel/osl/CMakeLists.txt +++ b/intern/cycles/kernel/osl/CMakeLists.txt @@ -44,6 +44,7 @@ set(LIB ${OSL_LIBRARIES} ${OPENIMAGEIO_LIBRARIES} ${PUGIXML_LIBRARIES} + ${CLANG_LIBRARIES} ${LLVM_LIBRARY} ) diff --git a/intern/cycles/kernel/shaders/node_math.h b/intern/cycles/kernel/shaders/node_math.h index 4b1a6c5bc16..3a008721d5e 100644 --- a/intern/cycles/kernel/shaders/node_math.h +++ b/intern/cycles/kernel/shaders/node_math.h @@ -74,7 +74,7 @@ vector snap(vector a, vector b) return floor(safe_divide(a, b)) * b; } -/* Adapted from godotengine math_funcs.h. */ +/* Adapted from GODOT-engine math_funcs.h. */ float wrap(float value, float max, float min) { float range = max - min; diff --git a/intern/cycles/kernel/shaders/node_principled_bsdf.osl b/intern/cycles/kernel/shaders/node_principled_bsdf.osl index 1711811ac65..23949f406c7 100644 --- a/intern/cycles/kernel/shaders/node_principled_bsdf.osl +++ b/intern/cycles/kernel/shaders/node_principled_bsdf.osl @@ -50,7 +50,7 @@ shader node_principled_bsdf(string distribution = "Multiscatter GGX", float m_cdlum = luminance(BaseColor); color m_ctint = m_cdlum > 0.0 ? BaseColor / m_cdlum : - color(0.0, 0.0, 0.0); // normalize lum. to isolate hue+sat + color(1.0, 1.0, 1.0); // normalize lum. to isolate hue+sat /* rotate tangent */ if (AnisotropicRotation != 0.0) diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h index 1ae94f1d766..f6bf860631e 100644 --- a/intern/cycles/kernel/svm/svm_closure.h +++ b/intern/cycles/kernel/svm/svm_closure.h @@ -308,7 +308,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, float3 m_ctint = m_cdlum > 0.0f ? base_color / m_cdlum : make_float3( - 0.0f, 0.0f, 0.0f); // normalize lum. to isolate hue+sat + 1.0f, 1.0f, 1.0f); // normalize lum. to isolate hue+sat float3 tmp_col = make_float3(1.0f, 1.0f, 1.0f) * (1.0f - specular_tint) + m_ctint * specular_tint; diff --git a/intern/cycles/kernel/svm/svm_noise.h b/intern/cycles/kernel/svm/svm_noise.h index 7ad61f23cc1..94d8bfde555 100644 --- a/intern/cycles/kernel/svm/svm_noise.h +++ b/intern/cycles/kernel/svm/svm_noise.h @@ -616,7 +616,7 @@ ccl_device_noinline float perlin_3d(float x, float y, float z) * Point Offset from v0 * v0 (0, 0, 0, 0) * v1 (0, 0, 1, 0) The full AVX type is computed by inserting the following - * v2 (0, 1, 0, 0) sse types into both the low and high parts of the AVX. + * v2 (0, 1, 0, 0) SSE types into both the low and high parts of the AVX. * v3 (0, 1, 1, 0) * v4 (1, 0, 0, 0) * v5 (1, 0, 1, 0) (0, 1, 0, 1) = shuffle<0, 2, 0, 2>(shuffle<2, 2, 2, 2>(V, V + 1)) diff --git a/intern/cycles/render/CMakeLists.txt b/intern/cycles/render/CMakeLists.txt index 389f913b145..c67919b375a 100644 --- a/intern/cycles/render/CMakeLists.txt +++ b/intern/cycles/render/CMakeLists.txt @@ -133,8 +133,11 @@ if(WITH_OPENCOLORIO) SYSTEM ${OPENCOLORIO_INCLUDE_DIRS} ) + list(APPEND LIB + ${OPENCOLORIO_LIBRARIES} + ) if(WIN32) - add_definitions(-DOpenColorIO_STATIC) + add_definitions(-DOpenColorIO_SKIP_IMPORTS) endif() endif() diff --git a/intern/cycles/render/alembic.cpp b/intern/cycles/render/alembic.cpp index 5942e512e60..627ffe2318a 100644 --- a/intern/cycles/render/alembic.cpp +++ b/intern/cycles/render/alembic.cpp @@ -609,6 +609,7 @@ NODE_DEFINE(AlembicObject) AlembicObject::AlembicObject() : Node(node_type) { + schema_type = INVALID; } AlembicObject::~AlembicObject() @@ -965,6 +966,8 @@ void AlembicObject::load_all_data(AlembicProcedural *proc, array curve_first_key; array curve_shader; + const bool is_homogenous = schema.getTopologyVariance() == kHomogenousTopology; + curve_keys.reserve(position->size()); curve_radius.reserve(position->size()); curve_first_key.reserve(curves_num_vertices->size()); @@ -985,16 +988,21 @@ void AlembicObject::load_all_data(AlembicProcedural *proc, curve_radius.push_back_reserved(radius * radius_scale); } - curve_first_key.push_back_reserved(offset); - curve_shader.push_back_reserved(0); + if (!is_homogenous || cached_data.curve_first_key.size() == 0) { + curve_first_key.push_back_reserved(offset); + curve_shader.push_back_reserved(0); + } offset += num_vertices; } cached_data.curve_keys.add_data(curve_keys, time); cached_data.curve_radius.add_data(curve_radius, time); - cached_data.curve_first_key.add_data(curve_first_key, time); - cached_data.curve_shader.add_data(curve_shader, time); + + if (!is_homogenous || cached_data.curve_first_key.size() == 0) { + cached_data.curve_first_key.add_data(curve_first_key, time); + cached_data.curve_shader.add_data(curve_shader, time); + } } // TODO(@kevindietrich): attributes, need example files @@ -1344,6 +1352,11 @@ void AlembicProcedural::generate(Scene *scene, Progress &progress) assert(scene_ == nullptr || scene_ == scene); scene_ = scene; + if (frame < start_frame || frame > end_frame) { + clear_modified(); + return; + } + bool need_shader_updates = false; /* Check for changes in shaders (newly requested attributes). */ @@ -1397,13 +1410,13 @@ void AlembicProcedural::generate(Scene *scene, Progress &progress) continue; } - if (IPolyMesh::matches(object->iobject.getHeader())) { + if (object->schema_type == AlembicObject::POLY_MESH) { read_mesh(scene, object, frame_time, progress); } - else if (ICurves::matches(object->iobject.getHeader())) { + else if (object->schema_type == AlembicObject::CURVES) { read_curves(scene, object, frame_time, progress); } - else if (ISubD::matches(object->iobject.getHeader())) { + else if (object->schema_type == AlembicObject::SUBD) { read_subd(scene, object, frame_time, progress); } @@ -1460,6 +1473,37 @@ void AlembicProcedural::load_objects(Progress &progress) for (size_t i = 0; i < root.getNumChildren(); ++i) { walk_hierarchy(root, root.getChildHeader(i), nullptr, object_map, progress); } + + /* Create nodes in the scene. */ + for (std::pair pair : object_map) { + AlembicObject *abc_object = pair.second; + + Geometry *geometry = nullptr; + + if (abc_object->schema_type == AlembicObject::CURVES) { + geometry = scene_->create_node(); + } + else if (abc_object->schema_type == AlembicObject::POLY_MESH || + abc_object->schema_type == AlembicObject::SUBD) { + geometry = scene_->create_node(); + } + else { + continue; + } + + geometry->set_owner(this); + geometry->name = abc_object->iobject.getName(); + + array used_shaders = abc_object->get_used_shaders(); + geometry->set_used_shaders(used_shaders); + + Object *object = scene_->create_node(); + object->set_owner(this); + object->set_geometry(geometry); + object->name = abc_object->iobject.getName(); + + abc_object->set_object(object); + } } void AlembicProcedural::read_mesh(Scene *scene, @@ -1469,29 +1513,7 @@ void AlembicProcedural::read_mesh(Scene *scene, { IPolyMesh polymesh(abc_object->iobject, Alembic::Abc::kWrapExisting); - Mesh *mesh = nullptr; - - /* create a mesh node in the scene if not already done */ - if (!abc_object->get_object()) { - mesh = scene->create_node(); - mesh->set_owner(this); - mesh->name = abc_object->iobject.getName(); - - array used_shaders = abc_object->get_used_shaders(); - mesh->set_used_shaders(used_shaders); - - /* create object*/ - Object *object = scene->create_node(); - object->set_owner(this); - object->set_geometry(mesh); - object->set_tfm(abc_object->xform); - object->name = abc_object->iobject.getName(); - - abc_object->set_object(object); - } - else { - mesh = static_cast(abc_object->get_object()->get_geometry()); - } + Mesh *mesh = static_cast(abc_object->get_object()->get_geometry()); CachedData &cached_data = abc_object->get_cached_data(); IPolyMeshSchema schema = polymesh.getSchema(); @@ -1564,32 +1586,10 @@ void AlembicProcedural::read_subd(Scene *scene, ISubD subd_mesh(abc_object->iobject, Alembic::Abc::kWrapExisting); ISubDSchema schema = subd_mesh.getSchema(); - Mesh *mesh = nullptr; + Mesh *mesh = static_cast(abc_object->get_object()->get_geometry()); - /* create a mesh node in the scene if not already done */ - if (!abc_object->get_object()) { - mesh = scene->create_node(); - mesh->set_owner(this); - mesh->name = abc_object->iobject.getName(); - - array used_shaders = abc_object->get_used_shaders(); - mesh->set_used_shaders(used_shaders); - - /* Alembic is OpenSubDiv compliant, there is no option to set another subdivision type. */ - mesh->set_subdivision_type(Mesh::SubdivisionType::SUBDIVISION_CATMULL_CLARK); - - /* create object*/ - Object *object = scene->create_node(); - object->set_owner(this); - object->set_geometry(mesh); - object->set_tfm(abc_object->xform); - object->name = abc_object->iobject.getName(); - - abc_object->set_object(object); - } - else { - mesh = static_cast(abc_object->get_object()->get_geometry()); - } + /* Alembic is OpenSubDiv compliant, there is no option to set another subdivision type. */ + mesh->set_subdivision_type(Mesh::SubdivisionType::SUBDIVISION_CATMULL_CLARK); if (!abc_object->has_data_loaded()) { abc_object->load_all_data(this, schema, scale, progress); @@ -1690,29 +1690,7 @@ void AlembicProcedural::read_curves(Scene *scene, Progress &progress) { ICurves curves(abc_object->iobject, Alembic::Abc::kWrapExisting); - Hair *hair; - - /* create a hair node in the scene if not already done */ - if (!abc_object->get_object()) { - hair = scene->create_node(); - hair->set_owner(this); - hair->name = abc_object->iobject.getName(); - - array used_shaders = abc_object->get_used_shaders(); - hair->set_used_shaders(used_shaders); - - /* create object*/ - Object *object = scene->create_node(); - object->set_owner(this); - object->set_geometry(hair); - object->set_tfm(abc_object->xform); - object->name = abc_object->iobject.getName(); - - abc_object->set_object(object); - } - else { - hair = static_cast(abc_object->get_object()->get_geometry()); - } + Hair *hair = static_cast(abc_object->get_object()->get_geometry()); ICurvesSchema schema = curves.getSchema(); @@ -1818,6 +1796,7 @@ void AlembicProcedural::walk_hierarchy( if (iter != object_map.end()) { AlembicObject *abc_object = iter->second; abc_object->iobject = subd; + abc_object->schema_type = AlembicObject::SUBD; if (xform_samples) { abc_object->xform_samples = *xform_samples; @@ -1835,6 +1814,7 @@ void AlembicProcedural::walk_hierarchy( if (iter != object_map.end()) { AlembicObject *abc_object = iter->second; abc_object->iobject = mesh; + abc_object->schema_type = AlembicObject::POLY_MESH; if (xform_samples) { abc_object->xform_samples = *xform_samples; @@ -1852,6 +1832,7 @@ void AlembicProcedural::walk_hierarchy( if (iter != object_map.end()) { AlembicObject *abc_object = iter->second; abc_object->iobject = curves; + abc_object->schema_type = AlembicObject::CURVES; if (xform_samples) { abc_object->xform_samples = *xform_samples; diff --git a/intern/cycles/render/alembic.h b/intern/cycles/render/alembic.h index 6b0d32fb3ab..b986f46bc8a 100644 --- a/intern/cycles/render/alembic.h +++ b/intern/cycles/render/alembic.h @@ -263,11 +263,22 @@ class AlembicObject : public Node { bool has_data_loaded() const; + /* Enumeration used to speed up the discrimination of an IObject as IObject::matches() methods + * are too expensive and show up in profiles. */ + enum AbcSchemaType { + INVALID, + POLY_MESH, + SUBD, + CURVES, + }; + bool need_shader_update = true; MatrixSampleMap xform_samples; Alembic::AbcGeom::IObject iobject; - Transform xform; + + /* Set if the path points to a valid IObject whose type is supported. */ + AbcSchemaType schema_type; CachedData &get_cached_data() { diff --git a/intern/cycles/render/attribute.cpp b/intern/cycles/render/attribute.cpp index ce4ae6e4295..331d30802f1 100644 --- a/intern/cycles/render/attribute.cpp +++ b/intern/cycles/render/attribute.cpp @@ -440,6 +440,7 @@ Attribute *AttributeSet::add(ustring name, TypeDesc type, AttributeElement eleme Attribute new_attr(name, type, element, geometry, prim); attributes.emplace_back(std::move(new_attr)); + modified = true; return &attributes.back(); } @@ -461,6 +462,7 @@ void AttributeSet::remove(ustring name) for (it = attributes.begin(); it != attributes.end(); it++) { if (&*it == attr) { + modified = true; attributes.erase(it); return; } @@ -606,6 +608,7 @@ void AttributeSet::remove(AttributeStandard std) for (it = attributes.begin(); it != attributes.end(); it++) { if (&*it == attr) { + modified = true; attributes.erase(it); return; } @@ -671,12 +674,14 @@ void AttributeSet::update(AttributeSet &&new_attributes) for (it = attributes.begin(); it != attributes.end();) { if (it->std != ATTR_STD_NONE) { if (new_attributes.find(it->std) == nullptr) { + modified = true; attributes.erase(it++); continue; } } else if (it->name != "") { if (new_attributes.find(it->name) == nullptr) { + modified = true; attributes.erase(it++); continue; } @@ -691,6 +696,7 @@ void AttributeSet::clear_modified() foreach (Attribute &attr, attributes) { attr.modified = false; } + modified = false; } /* AttributeRequest */ diff --git a/intern/cycles/render/attribute.h b/intern/cycles/render/attribute.h index f9997d3c422..18c9e5ab83a 100644 --- a/intern/cycles/render/attribute.h +++ b/intern/cycles/render/attribute.h @@ -179,6 +179,7 @@ class AttributeSet { Geometry *geometry; AttributePrimitive prim; list attributes; + bool modified = true; AttributeSet(Geometry *geometry, AttributePrimitive prim); AttributeSet(AttributeSet &&) = default; diff --git a/intern/cycles/render/camera.cpp b/intern/cycles/render/camera.cpp index 30bf6c4241a..afe788eb4be 100644 --- a/intern/cycles/render/camera.cpp +++ b/intern/cycles/render/camera.cpp @@ -189,8 +189,8 @@ Camera::Camera() : Node(node_type) full_rastertocamera = projection_identity(); - dx = make_float3(0.0f, 0.0f, 0.0f); - dy = make_float3(0.0f, 0.0f, 0.0f); + dx = zero_float3(); + dy = zero_float3(); need_device_update = true; need_flags_update = true; @@ -310,8 +310,8 @@ void Camera::update(Scene *scene) transform_perspective(&full_rastertocamera, make_float3(0, 0, 0)); } else { - dx = make_float3(0.0f, 0.0f, 0.0f); - dy = make_float3(0.0f, 0.0f, 0.0f); + dx = zero_float3(); + dy = zero_float3(); } dx = transform_direction(&cameratoworld, dx); @@ -568,7 +568,7 @@ float3 Camera::transform_raster_to_world(float raster_x, float raster_y) if (camera_type == CAMERA_PERSPECTIVE) { D = transform_perspective(&rastertocamera, make_float3(raster_x, raster_y, 0.0f)); float3 Pclip = normalize(D); - P = make_float3(0.0f, 0.0f, 0.0f); + P = zero_float3(); /* TODO(sergey): Aperture support? */ P = transform_point(&cameratoworld, P); D = normalize(transform_direction(&cameratoworld, D)); @@ -643,7 +643,7 @@ float Camera::world_to_raster_size(float3 P) float3 p = transform_point(&worldtocamera, P); float3 v1 = transform_perspective(&full_rastertocamera, make_float3(full_width, full_height, 0.0f)); - float3 v2 = transform_perspective(&full_rastertocamera, make_float3(0.0f, 0.0f, 0.0f)); + float3 v2 = transform_perspective(&full_rastertocamera, zero_float3()); /* Create point clamped to frustum */ float3 c; @@ -741,7 +741,8 @@ float Camera::world_to_raster_size(float3 P) float3 D = transform_point(&worldtocamera, P); float dist = len(D); - Ray ray = {{0}}; + Ray ray; + memset(&ray, 0, sizeof(ray)); /* Distortion can become so great that the results become meaningless, there * may be a better way to do this, but calculating differentials from the diff --git a/intern/cycles/render/colorspace.cpp b/intern/cycles/render/colorspace.cpp index 4c9e86ea278..4540793f78d 100644 --- a/intern/cycles/render/colorspace.cpp +++ b/intern/cycles/render/colorspace.cpp @@ -192,6 +192,7 @@ void ColorSpaceManager::is_builtin_colorspace(ustring colorspace, return; } + OCIO::ConstCPUProcessorRcPtr device_processor = processor->getDefaultCPUProcessor(); is_scene_linear = true; is_srgb = true; for (int i = 0; i < 256; i++) { @@ -201,10 +202,10 @@ void ColorSpaceManager::is_builtin_colorspace(ustring colorspace, float cG[3] = {0, v, 0}; float cB[3] = {0, 0, v}; float cW[3] = {v, v, v}; - processor->applyRGB(cR); - processor->applyRGB(cG); - processor->applyRGB(cB); - processor->applyRGB(cW); + device_processor->applyRGB(cR); + device_processor->applyRGB(cG); + device_processor->applyRGB(cB); + device_processor->applyRGB(cW); /* Make sure that there is no channel crosstalk. */ if (fabsf(cR[1]) > 1e-5f || fabsf(cR[2]) > 1e-5f || fabsf(cG[0]) > 1e-5f || @@ -267,6 +268,7 @@ inline void processor_apply_pixels(const OCIO::Processor *processor, T *pixels, /* TODO: implement faster version for when we know the conversion * is a simple matrix transform between linear spaces. In that case * un-premultiply is not needed. */ + OCIO::ConstCPUProcessorRcPtr device_processor = processor->getDefaultCPUProcessor(); /* Process large images in chunks to keep temporary memory requirement down. */ const size_t chunk_size = std::min((size_t)(16 * 1024 * 1024), num_pixels); @@ -289,7 +291,7 @@ inline void processor_apply_pixels(const OCIO::Processor *processor, T *pixels, } OCIO::PackedImageDesc desc((float *)float_pixels.data(), width, 1, 4); - processor->apply(desc); + device_processor->apply(desc); for (size_t i = 0; i < width; i++) { float4 value = float_pixels[i]; @@ -345,13 +347,14 @@ void ColorSpaceManager::to_scene_linear(ColorSpaceProcessor *processor_, const OCIO::Processor *processor = (const OCIO::Processor *)processor_; if (processor) { + OCIO::ConstCPUProcessorRcPtr device_processor = processor->getDefaultCPUProcessor(); if (channels == 3) { - processor->applyRGB(pixel); + device_processor->applyRGB(pixel); } else if (channels == 4) { if (pixel[3] == 1.0f || pixel[3] == 0.0f) { /* Fast path for RGBA. */ - processor->applyRGB(pixel); + device_processor->applyRGB(pixel); } else { /* Un-associate and associate alpha since color management should not @@ -363,7 +366,7 @@ void ColorSpaceManager::to_scene_linear(ColorSpaceProcessor *processor_, pixel[1] *= inv_alpha; pixel[2] *= inv_alpha; - processor->applyRGB(pixel); + device_processor->applyRGB(pixel); pixel[0] *= alpha; pixel[1] *= alpha; diff --git a/intern/cycles/render/constant_fold.cpp b/intern/cycles/render/constant_fold.cpp index f3809ee8d80..800056d2899 100644 --- a/intern/cycles/render/constant_fold.cpp +++ b/intern/cycles/render/constant_fold.cpp @@ -86,7 +86,7 @@ void ConstantFolder::make_zero() const make_constant(0.0f); } else if (SocketType::is_float3(output->type())) { - make_constant(make_float3(0.0f, 0.0f, 0.0f)); + make_constant(zero_float3()); } else { assert(0); @@ -99,7 +99,7 @@ void ConstantFolder::make_one() const make_constant(1.0f); } else if (SocketType::is_float3(output->type())) { - make_constant(make_float3(1.0f, 1.0f, 1.0f)); + make_constant(one_float3()); } else { assert(0); @@ -184,7 +184,7 @@ bool ConstantFolder::is_zero(ShaderInput *input) const return node->get_float(input->socket_type) == 0.0f; } else if (SocketType::is_float3(input->type())) { - return node->get_float3(input->socket_type) == make_float3(0.0f, 0.0f, 0.0f); + return node->get_float3(input->socket_type) == zero_float3(); } } @@ -198,7 +198,7 @@ bool ConstantFolder::is_one(ShaderInput *input) const return node->get_float(input->socket_type) == 1.0f; } else if (SocketType::is_float3(input->type())) { - return node->get_float3(input->socket_type) == make_float3(1.0f, 1.0f, 1.0f); + return node->get_float3(input->socket_type) == one_float3(); } } diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp index 9ea56b30ffa..9f8bf68dadf 100644 --- a/intern/cycles/render/geometry.cpp +++ b/intern/cycles/render/geometry.cpp @@ -61,6 +61,7 @@ Geometry::Geometry(const NodeType *node_type, const Type type) : Node(node_type), geometry_type(type), attributes(this, ATTR_PRIM_GEOMETRY) { need_update_rebuild = false; + need_update_bvh_for_offset = false; transform_applied = false; transform_negative_scaled = false; @@ -241,6 +242,7 @@ void Geometry::compute_bvh( } need_update_rebuild = false; + need_update_bvh_for_offset = false; } bool Geometry::has_motion_blur() const @@ -964,7 +966,8 @@ void GeometryManager::mesh_calc_offset(Scene *scene, BVHLayout bvh_layout) const bool has_optix_bvh = bvh_layout == BVH_LAYOUT_OPTIX || bvh_layout == BVH_LAYOUT_MULTI_OPTIX || bvh_layout == BVH_LAYOUT_MULTI_OPTIX_EMBREE; - geom->tag_bvh_update(has_optix_bvh); + geom->need_update_rebuild |= has_optix_bvh; + geom->need_update_bvh_for_offset = true; } if (geom->geometry_type == Geometry::MESH || geom->geometry_type == Geometry::VOLUME) { @@ -1388,8 +1391,8 @@ enum { ATTRS_NEED_REALLOC = (ATTR_FLOAT_NEEDS_REALLOC | ATTR_FLOAT2_NEEDS_REALLOC | ATTR_FLOAT3_NEEDS_REALLOC | ATTR_UCHAR4_NEEDS_REALLOC), - DEVICE_MESH_DATA_NEEDS_REALLOC = (CURVE_DATA_NEED_REALLOC | ATTRS_NEED_REALLOC), - DEVICE_CURVE_DATA_NEEDS_REALLOC = (MESH_DATA_NEED_REALLOC | ATTRS_NEED_REALLOC), + DEVICE_MESH_DATA_NEEDS_REALLOC = (MESH_DATA_NEED_REALLOC | ATTRS_NEED_REALLOC), + DEVICE_CURVE_DATA_NEEDS_REALLOC = (CURVE_DATA_NEED_REALLOC | ATTRS_NEED_REALLOC), }; static void update_device_flags_attribute(uint32_t &device_update_flags, @@ -1440,6 +1443,18 @@ void GeometryManager::device_update_preprocess(Device *device, Scene *scene, Pro foreach (Geometry *geom, scene->geometry) { geom->has_volume = false; + if (geom->attributes.modified) { + device_update_flags |= ATTRS_NEED_REALLOC; + } + + if (geom->is_mesh()) { + Mesh *mesh = static_cast(geom); + + if (mesh->subd_attributes.modified) { + device_update_flags |= ATTRS_NEED_REALLOC; + } + } + foreach (Node *node, geom->get_used_shaders()) { Shader *shader = static_cast(node); if (shader->has_volume) { @@ -1570,6 +1585,7 @@ void GeometryManager::device_update_preprocess(Device *device, Scene *scene, Pro dscene->tri_patch.tag_realloc(); dscene->tri_vnormal.tag_realloc(); dscene->tri_patch_uv.tag_realloc(); + dscene->tri_shader.tag_realloc(); dscene->patches.tag_realloc(); } @@ -1591,16 +1607,16 @@ void GeometryManager::device_update_preprocess(Device *device, Scene *scene, Pro dscene->attributes_map.tag_realloc(); dscene->attributes_float2.tag_realloc(); } - else if (device_update_flags & ATTR_FLOAT_MODIFIED) { - dscene->attributes_float.tag_modified(); + else if (device_update_flags & ATTR_FLOAT2_MODIFIED) { + dscene->attributes_float2.tag_modified(); } if (device_update_flags & ATTR_FLOAT3_NEEDS_REALLOC) { dscene->attributes_map.tag_realloc(); dscene->attributes_float3.tag_realloc(); } - else if (device_update_flags & ATTR_FLOAT_MODIFIED) { - dscene->attributes_float.tag_modified(); + else if (device_update_flags & ATTR_FLOAT3_MODIFIED) { + dscene->attributes_float3.tag_modified(); } if (device_update_flags & ATTR_UCHAR4_NEEDS_REALLOC) { @@ -1866,7 +1882,9 @@ void GeometryManager::device_update(Device *device, displacement_done = true; } } + } + if (geom->is_modified() || geom->need_update_bvh_for_offset) { if (geom->need_build_bvh(bvh_layout)) { num_bvh++; } @@ -1911,7 +1929,7 @@ void GeometryManager::device_update(Device *device, size_t i = 0; foreach (Geometry *geom, scene->geometry) { - if (geom->is_modified()) { + if (geom->is_modified() || geom->need_update_bvh_for_offset) { need_update_scene_bvh = true; pool.push(function_bind( &Geometry::compute_bvh, geom, device, dscene, &scene->params, &progress, i, num_bvh)); diff --git a/intern/cycles/render/geometry.h b/intern/cycles/render/geometry.h index 88388f31a9b..fe30f3a807c 100644 --- a/intern/cycles/render/geometry.h +++ b/intern/cycles/render/geometry.h @@ -90,6 +90,7 @@ class Geometry : public Node { /* Update Flags */ bool need_update_rebuild; + bool need_update_bvh_for_offset; /* Index into scene->geometry (only valid during update) */ size_t index; diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp index 5e068e74ce0..cdaa878e830 100644 --- a/intern/cycles/render/graph.cpp +++ b/intern/cycles/render/graph.cpp @@ -273,7 +273,7 @@ void ShaderGraph::connect(ShaderOutput *from, ShaderInput *to) if (to->type() == SocketType::CLOSURE) { EmissionNode *emission = create_node(); - emission->set_color(make_float3(1.0f, 1.0f, 1.0f)); + emission->set_color(one_float3()); emission->set_strength(1.0f); convert = add(emission); /* Connect float inputs to Strength to save an additional Value->Color conversion. */ diff --git a/intern/cycles/render/hair.cpp b/intern/cycles/render/hair.cpp index e94cad6b32e..28ad8a1461a 100644 --- a/intern/cycles/render/hair.cpp +++ b/intern/cycles/render/hair.cpp @@ -416,7 +416,7 @@ void Hair::compute_bounds() if (!bnds.valid()) { /* empty mesh */ - bnds.grow(make_float3(0.0f, 0.0f, 0.0f)); + bnds.grow(zero_float3()); } bounds = bnds; diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp index 1e54a237816..d1e64e2ac14 100644 --- a/intern/cycles/render/light.cpp +++ b/intern/cycles/render/light.cpp @@ -116,17 +116,17 @@ NODE_DEFINE(Light) type_enum.insert("spot", LIGHT_SPOT); SOCKET_ENUM(light_type, "Type", type_enum, LIGHT_POINT); - SOCKET_COLOR(strength, "Strength", make_float3(1.0f, 1.0f, 1.0f)); + SOCKET_COLOR(strength, "Strength", one_float3()); - SOCKET_POINT(co, "Co", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_POINT(co, "Co", zero_float3()); - SOCKET_VECTOR(dir, "Dir", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_VECTOR(dir, "Dir", zero_float3()); SOCKET_FLOAT(size, "Size", 0.0f); SOCKET_FLOAT(angle, "Angle", 0.0f); - SOCKET_VECTOR(axisu, "Axis U", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_VECTOR(axisu, "Axis U", zero_float3()); SOCKET_FLOAT(sizeu, "Size U", 1.0f); - SOCKET_VECTOR(axisv, "Axis V", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_VECTOR(axisv, "Axis V", zero_float3()); SOCKET_FLOAT(sizev, "Size V", 1.0f); SOCKET_BOOLEAN(round, "Round", false); @@ -173,7 +173,7 @@ void Light::tag_update(Scene *scene) bool Light::has_contribution(Scene *scene) { - if (strength == make_float3(0.0f, 0.0f, 0.0f)) { + if (strength == zero_float3()) { return false; } if (is_portal) { diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp index 5f62da8f18b..1f6fcdd0abe 100644 --- a/intern/cycles/render/mesh.cpp +++ b/intern/cycles/render/mesh.cpp @@ -333,7 +333,7 @@ void Mesh::add_vertex(float3 P) tag_verts_modified(); if (get_num_subd_faces()) { - vert_patch_uv.push_back_reserved(make_float2(0.0f, 0.0f)); + vert_patch_uv.push_back_reserved(zero_float2()); tag_vert_patch_uv_modified(); } } @@ -344,7 +344,7 @@ void Mesh::add_vertex_slow(float3 P) tag_verts_modified(); if (get_num_subd_faces()) { - vert_patch_uv.push_back_slow(make_float2(0.0f, 0.0f)); + vert_patch_uv.push_back_slow(zero_float2()); tag_vert_patch_uv_modified(); } } @@ -494,7 +494,7 @@ void Mesh::compute_bounds() if (!bnds.valid()) { /* empty mesh */ - bnds.grow(make_float3(0.0f, 0.0f, 0.0f)); + bnds.grow(zero_float3()); } bounds = bnds; diff --git a/intern/cycles/render/mesh_displace.cpp b/intern/cycles/render/mesh_displace.cpp index b4fb5dcdea2..b39d81023d9 100644 --- a/intern/cycles/render/mesh_displace.cpp +++ b/intern/cycles/render/mesh_displace.cpp @@ -197,7 +197,7 @@ bool GeometryManager::displace( for (int key : stitch_keys) { pair verts = mesh->vert_stitching_map.equal_range(key); - float3 pos = make_float3(0.0f, 0.0f, 0.0f); + float3 pos = zero_float3(); int num = 0; for (map_it_t v = verts.first; v != verts.second; ++v) { @@ -264,7 +264,7 @@ bool GeometryManager::displace( for (size_t i = 0; i < num_triangles; i++) { if (tri_has_true_disp[i]) { for (size_t j = 0; j < 3; j++) { - vN[mesh->get_triangle(i).v[j]] = make_float3(0.0f, 0.0f, 0.0f); + vN[mesh->get_triangle(i).v[j]] = zero_float3(); } } } @@ -333,7 +333,7 @@ bool GeometryManager::displace( for (size_t i = 0; i < num_triangles; i++) { if (tri_has_true_disp[i]) { for (size_t j = 0; j < 3; j++) { - mN[mesh->get_triangle(i).v[j]] = make_float3(0.0f, 0.0f, 0.0f); + mN[mesh->get_triangle(i).v[j]] = zero_float3(); } } } diff --git a/intern/cycles/render/mesh_subdivision.cpp b/intern/cycles/render/mesh_subdivision.cpp index 7408ee2dbdf..575dbef8ec2 100644 --- a/intern/cycles/render/mesh_subdivision.cpp +++ b/intern/cycles/render/mesh_subdivision.cpp @@ -341,9 +341,9 @@ struct OsdPatch : Patch { float3 du, dv; if (P) - *P = make_float3(0.0f, 0.0f, 0.0f); - du = make_float3(0.0f, 0.0f, 0.0f); - dv = make_float3(0.0f, 0.0f, 0.0f); + *P = zero_float3(); + du = zero_float3(); + dv = zero_float3(); for (int i = 0; i < cv.size(); i++) { float3 p = osd_data->verts[cv[i]].value; @@ -484,8 +484,8 @@ void Mesh::tessellate(DiagSplit *split) } else { /* ngon */ - float3 center_vert = make_float3(0.0f, 0.0f, 0.0f); - float3 center_normal = make_float3(0.0f, 0.0f, 0.0f); + float3 center_vert = zero_float3(); + float3 center_normal = zero_float3(); float inv_num_corners = 1.0f / float(face.num_corners); for (int corner = 0; corner < face.num_corners; corner++) { @@ -613,7 +613,7 @@ void Mesh::tessellate(DiagSplit *split) uchar *center = (uchar *)data + (subd_face_corners.size() + ngons) * stride; float inv_num_corners = 1.0f / float(face.num_corners); - float4 val = make_float4(0.0f, 0.0f, 0.0f, 0.0f); + float4 val = zero_float4(); for (int corner = 0; corner < face.num_corners; corner++) { for (int i = 0; i < 4; i++) { diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index b59dd124040..b17f1ec0b2f 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -43,9 +43,9 @@ CCL_NAMESPACE_BEGIN /* Texture Mapping */ #define TEXTURE_MAPPING_DEFINE(TextureNode) \ - SOCKET_POINT(tex_mapping.translation, "Translation", make_float3(0.0f, 0.0f, 0.0f)); \ - SOCKET_VECTOR(tex_mapping.rotation, "Rotation", make_float3(0.0f, 0.0f, 0.0f)); \ - SOCKET_VECTOR(tex_mapping.scale, "Scale", make_float3(1.0f, 1.0f, 1.0f)); \ + SOCKET_POINT(tex_mapping.translation, "Translation", zero_float3()); \ + SOCKET_VECTOR(tex_mapping.rotation, "Rotation", zero_float3()); \ + SOCKET_VECTOR(tex_mapping.scale, "Scale", one_float3()); \ \ SOCKET_VECTOR(tex_mapping.min, "Min", make_float3(-FLT_MAX, -FLT_MAX, -FLT_MAX)); \ SOCKET_VECTOR(tex_mapping.max, "Max", make_float3(FLT_MAX, FLT_MAX, FLT_MAX)); \ @@ -80,7 +80,7 @@ TextureMapping::TextureMapping() Transform TextureMapping::compute_transform() { - Transform mmat = transform_scale(make_float3(0.0f, 0.0f, 0.0f)); + Transform mmat = transform_scale(zero_float3()); if (x_mapping != NONE) mmat[0][x_mapping - 1] = 1.0f; @@ -137,11 +137,11 @@ Transform TextureMapping::compute_transform() bool TextureMapping::skip() { - if (translation != make_float3(0.0f, 0.0f, 0.0f)) + if (translation != zero_float3()) return false; - if (rotation != make_float3(0.0f, 0.0f, 0.0f)) + if (rotation != zero_float3()) return false; - if (scale != make_float3(1.0f, 1.0f, 1.0f)) + if (scale != one_float3()) return false; if (x_mapping != X || y_mapping != Y || z_mapping != Z) @@ -250,7 +250,7 @@ NODE_DEFINE(ImageTextureNode) SOCKET_INT_ARRAY(tiles, "Tiles", array()); SOCKET_BOOLEAN(animated, "Animated", false); - SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_UV); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_UV); SOCKET_OUT_COLOR(color, "Color"); SOCKET_OUT_FLOAT(alpha, "Alpha"); @@ -517,7 +517,7 @@ NODE_DEFINE(EnvironmentTextureNode) SOCKET_BOOLEAN(animated, "Animated", false); - SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_POSITION); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_POSITION); SOCKET_OUT_COLOR(color, "Color"); SOCKET_OUT_FLOAT(alpha, "Alpha"); @@ -811,8 +811,7 @@ NODE_DEFINE(SkyTextureNode) SOCKET_FLOAT(dust_density, "Dust", 1.0f); SOCKET_FLOAT(ozone_density, "Ozone", 1.0f); - SOCKET_IN_POINT( - vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED); SOCKET_OUT_COLOR(color, "Color"); @@ -993,8 +992,7 @@ NODE_DEFINE(GradientTextureNode) type_enum.insert("spherical", NODE_BLEND_SPHERICAL); SOCKET_ENUM(gradient_type, "Type", type_enum, NODE_BLEND_LINEAR); - SOCKET_IN_POINT( - vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED); SOCKET_OUT_COLOR(color, "Color"); SOCKET_OUT_FLOAT(fac, "Fac"); @@ -1046,8 +1044,7 @@ NODE_DEFINE(NoiseTextureNode) dimensions_enum.insert("4D", 4); SOCKET_ENUM(dimensions, "Dimensions", dimensions_enum, 3); - SOCKET_IN_POINT( - vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED); SOCKET_IN_FLOAT(w, "W", 0.0f); SOCKET_IN_FLOAT(scale, "Scale", 1.0f); SOCKET_IN_FLOAT(detail, "Detail", 2.0f); @@ -1137,8 +1134,7 @@ NODE_DEFINE(VoronoiTextureNode) feature_enum.insert("n_sphere_radius", NODE_VORONOI_N_SPHERE_RADIUS); SOCKET_ENUM(feature, "Feature", feature_enum, NODE_VORONOI_F1); - SOCKET_IN_POINT( - vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED); SOCKET_IN_FLOAT(w, "W", 0.0f); SOCKET_IN_FLOAT(scale, "Scale", 5.0f); SOCKET_IN_FLOAT(smoothness, "Smoothness", 5.0f); @@ -1226,8 +1222,7 @@ NODE_DEFINE(IESLightNode) SOCKET_STRING(filename, "File Name", ustring()); SOCKET_IN_FLOAT(strength, "Strength", 1.0f); - SOCKET_IN_POINT( - vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_NORMAL); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_NORMAL); SOCKET_OUT_FLOAT(fac, "Fac"); @@ -1317,7 +1312,7 @@ NODE_DEFINE(WhiteNoiseTextureNode) dimensions_enum.insert("4D", 4); SOCKET_ENUM(dimensions, "Dimensions", dimensions_enum, 3); - SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_POINT(vector, "Vector", zero_float3()); SOCKET_IN_FLOAT(w, "W", 0.0f); SOCKET_OUT_FLOAT(value, "Value"); @@ -1377,8 +1372,7 @@ NODE_DEFINE(MusgraveTextureNode) type_enum.insert("hetero_terrain", NODE_MUSGRAVE_HETERO_TERRAIN); SOCKET_ENUM(musgrave_type, "Type", type_enum, NODE_MUSGRAVE_FBM); - SOCKET_IN_POINT( - vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED); SOCKET_IN_FLOAT(w, "W", 0.0f); SOCKET_IN_FLOAT(scale, "Scale", 1.0f); SOCKET_IN_FLOAT(detail, "Detail", 2.0f); @@ -1477,8 +1471,7 @@ NODE_DEFINE(WaveTextureNode) profile_enum.insert("tri", NODE_WAVE_PROFILE_TRI); SOCKET_ENUM(profile, "Profile", profile_enum, NODE_WAVE_PROFILE_SIN); - SOCKET_IN_POINT( - vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED); SOCKET_IN_FLOAT(scale, "Scale", 1.0f); SOCKET_IN_FLOAT(distortion, "Distortion", 0.0f); SOCKET_IN_FLOAT(detail, "Detail", 2.0f); @@ -1555,8 +1548,7 @@ NODE_DEFINE(MagicTextureNode) SOCKET_INT(depth, "Depth", 2); - SOCKET_IN_POINT( - vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED); SOCKET_IN_FLOAT(scale, "Scale", 5.0f); SOCKET_IN_FLOAT(distortion, "Distortion", 1.0f); @@ -1608,10 +1600,9 @@ NODE_DEFINE(CheckerTextureNode) TEXTURE_MAPPING_DEFINE(CheckerTextureNode); - SOCKET_IN_POINT( - vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED); - SOCKET_IN_COLOR(color1, "Color1", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_COLOR(color2, "Color2", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED); + SOCKET_IN_COLOR(color1, "Color1", zero_float3()); + SOCKET_IN_COLOR(color2, "Color2", zero_float3()); SOCKET_IN_FLOAT(scale, "Scale", 1.0f); SOCKET_OUT_COLOR(color, "Color"); @@ -1668,12 +1659,11 @@ NODE_DEFINE(BrickTextureNode) SOCKET_FLOAT(squash, "Squash", 1.0f); SOCKET_INT(squash_frequency, "Squash Frequency", 2); - SOCKET_IN_POINT( - vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED); - SOCKET_IN_COLOR(color1, "Color1", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_COLOR(color2, "Color2", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_COLOR(mortar, "Mortar", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(color1, "Color1", zero_float3()); + SOCKET_IN_COLOR(color2, "Color2", zero_float3()); + SOCKET_IN_COLOR(mortar, "Mortar", zero_float3()); SOCKET_IN_FLOAT(scale, "Scale", 5.0f); SOCKET_IN_FLOAT(mortar_size, "Mortar Size", 0.02f); SOCKET_IN_FLOAT(mortar_smooth, "Mortar Smooth", 0.0f); @@ -1772,7 +1762,7 @@ NODE_DEFINE(PointDensityTextureNode) SOCKET_TRANSFORM(tfm, "Transform", transform_identity()); - SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_POSITION); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_POSITION); SOCKET_OUT_FLOAT(density, "Density"); SOCKET_OUT_COLOR(color, "Color"); @@ -1887,9 +1877,9 @@ NODE_DEFINE(NormalNode) { NodeType *type = NodeType::add("normal", create, NodeType::SHADER); - SOCKET_VECTOR(direction, "direction", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_VECTOR(direction, "direction", zero_float3()); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3()); SOCKET_OUT_NORMAL(normal, "Normal"); SOCKET_OUT_FLOAT(dot, "Dot"); @@ -1934,10 +1924,10 @@ NODE_DEFINE(MappingNode) type_enum.insert("normal", NODE_MAPPING_TYPE_NORMAL); SOCKET_ENUM(mapping_type, "Type", type_enum, NODE_MAPPING_TYPE_POINT); - SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_POINT(location, "Location", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_POINT(rotation, "Rotation", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_POINT(scale, "Scale", make_float3(1.0f, 1.0f, 1.0f)); + SOCKET_IN_POINT(vector, "Vector", zero_float3()); + SOCKET_IN_POINT(location, "Location", zero_float3()); + SOCKET_IN_POINT(rotation, "Rotation", zero_float3()); + SOCKET_IN_POINT(scale, "Scale", one_float3()); SOCKET_OUT_POINT(vector, "Vector"); @@ -1993,7 +1983,7 @@ NODE_DEFINE(RGBToBWNode) { NodeType *type = NodeType::add("rgb_to_bw", create, NodeType::SHADER); - SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(color, "Color", zero_float3()); SOCKET_OUT_FLOAT(val, "Val"); return type; @@ -2091,6 +2081,16 @@ ConvertNode::ConvertNode(SocketType::Type from_, SocketType::Type to_, bool auto special_type = SHADER_SPECIAL_TYPE_AUTOCONVERT; } +/* Union usage requires a manual copy constructor. */ +ConvertNode::ConvertNode(const ConvertNode &other) + : ShaderNode(other), + from(other.from), + to(other.to), + value_color(other.value_color), + value_string(other.value_string) +{ +} + void ConvertNode::constant_fold(const ConstantFolder &folder) { /* proxy nodes should have been removed at this point */ @@ -2291,7 +2291,7 @@ NODE_DEFINE(AnisotropicBsdfNode) NodeType *type = NodeType::add("anisotropic_bsdf", create, NodeType::SHADER); SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); static NodeEnum distribution_enum; @@ -2301,7 +2301,7 @@ NODE_DEFINE(AnisotropicBsdfNode) distribution_enum.insert("ashikhmin_shirley", CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID); SOCKET_ENUM(distribution, "Distribution", distribution_enum, CLOSURE_BSDF_MICROFACET_GGX_ID); - SOCKET_IN_VECTOR(tangent, "Tangent", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TANGENT); + SOCKET_IN_VECTOR(tangent, "Tangent", zero_float3(), SocketType::LINK_TANGENT); SOCKET_IN_FLOAT(roughness, "Roughness", 0.5f); SOCKET_IN_FLOAT(anisotropy, "Anisotropy", 0.5f); @@ -2353,7 +2353,7 @@ NODE_DEFINE(GlossyBsdfNode) NodeType *type = NodeType::add("glossy_bsdf", create, NodeType::SHADER); SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); static NodeEnum distribution_enum; @@ -2445,7 +2445,7 @@ NODE_DEFINE(GlassBsdfNode) NodeType *type = NodeType::add("glass_bsdf", create, NodeType::SHADER); SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); static NodeEnum distribution_enum; @@ -2538,7 +2538,7 @@ NODE_DEFINE(RefractionBsdfNode) NodeType *type = NodeType::add("refraction_bsdf", create, NodeType::SHADER); SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); static NodeEnum distribution_enum; @@ -2629,7 +2629,7 @@ NODE_DEFINE(ToonBsdfNode) NodeType *type = NodeType::add("toon_bsdf", create, NodeType::SHADER); SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); static NodeEnum component_enum; @@ -2669,7 +2669,7 @@ NODE_DEFINE(VelvetBsdfNode) NodeType *type = NodeType::add("velvet_bsdf", create, NodeType::SHADER); SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); SOCKET_IN_FLOAT(sigma, "Sigma", 1.0f); @@ -2700,7 +2700,7 @@ NODE_DEFINE(DiffuseBsdfNode) NodeType *type = NodeType::add("diffuse_bsdf", create, NodeType::SHADER); SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); SOCKET_IN_FLOAT(roughness, "Roughness", 0.0f); @@ -2760,15 +2760,12 @@ NODE_DEFINE(PrincipledBsdfNode) SOCKET_IN_FLOAT(transmission, "Transmission", 0.0f); SOCKET_IN_FLOAT(transmission_roughness, "Transmission Roughness", 0.0f); SOCKET_IN_FLOAT(anisotropic_rotation, "Anisotropic Rotation", 0.0f); - SOCKET_IN_COLOR(emission, "Emission", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(emission, "Emission", zero_float3()); SOCKET_IN_FLOAT(emission_strength, "Emission Strength", 1.0f); SOCKET_IN_FLOAT(alpha, "Alpha", 1.0f); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); - SOCKET_IN_NORMAL(clearcoat_normal, - "Clearcoat Normal", - make_float3(0.0f, 0.0f, 0.0f), - SocketType::LINK_NORMAL); - SOCKET_IN_NORMAL(tangent, "Tangent", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TANGENT); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(clearcoat_normal, "Clearcoat Normal", zero_float3(), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(tangent, "Tangent", zero_float3(), SocketType::LINK_TANGENT); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); SOCKET_OUT_CLOSURE(BSDF, "BSDF"); @@ -2789,7 +2786,7 @@ void PrincipledBsdfNode::expand(ShaderGraph *graph) ShaderInput *emission_in = input("Emission"); ShaderInput *emission_strength_in = input("Emission Strength"); - if ((emission_in->link || emission != make_float3(0.0f, 0.0f, 0.0f)) && + if ((emission_in->link || emission != zero_float3()) && (emission_strength_in->link || emission_strength != 0.0f)) { /* Create add closure and emission, and relink inputs. */ AddClosureNode *add = graph->create_node(); @@ -2879,7 +2876,7 @@ void PrincipledBsdfNode::compile(SVMCompiler &compiler, ShaderInput *clearcoat_normal_in = input("Clearcoat Normal"); ShaderInput *tangent_in = input("Tangent"); - float3 weight = make_float3(1.0f, 1.0f, 1.0f); + float3 weight = one_float3(); compiler.add_node(NODE_CLOSURE_SET_WEIGHT, weight); @@ -2989,7 +2986,7 @@ NODE_DEFINE(TranslucentBsdfNode) NodeType *type = NodeType::add("translucent_bsdf", create, NodeType::SHADER); SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); SOCKET_OUT_CLOSURE(BSDF, "BSDF"); @@ -3018,7 +3015,7 @@ NODE_DEFINE(TransparentBsdfNode) { NodeType *type = NodeType::add("transparent_bsdf", create, NodeType::SHADER); - SOCKET_IN_COLOR(color, "Color", make_float3(1.0f, 1.0f, 1.0f)); + SOCKET_IN_COLOR(color, "Color", one_float3()); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); SOCKET_OUT_CLOSURE(BSDF, "BSDF"); @@ -3048,7 +3045,7 @@ NODE_DEFINE(SubsurfaceScatteringNode) NodeType *type = NodeType::add("subsurface_scattering", create, NodeType::SHADER); SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); static NodeEnum falloff_enum; @@ -3138,8 +3135,7 @@ void EmissionNode::constant_fold(const ConstantFolder &folder) ShaderInput *color_in = input("Color"); ShaderInput *strength_in = input("Strength"); - if ((!color_in->link && color == make_float3(0.0f, 0.0f, 0.0f)) || - (!strength_in->link && strength == 0.0f)) { + if ((!color_in->link && color == zero_float3()) || (!strength_in->link && strength == 0.0f)) { folder.discard(); } } @@ -3188,8 +3184,7 @@ void BackgroundNode::constant_fold(const ConstantFolder &folder) ShaderInput *color_in = input("Color"); ShaderInput *strength_in = input("Strength"); - if ((!color_in->link && color == make_float3(0.0f, 0.0f, 0.0f)) || - (!strength_in->link && strength == 0.0f)) { + if ((!color_in->link && color == zero_float3()) || (!strength_in->link && strength == 0.0f)) { folder.discard(); } } @@ -3214,7 +3209,7 @@ HoldoutNode::HoldoutNode() : ShaderNode(node_type) void HoldoutNode::compile(SVMCompiler &compiler) { - float3 value = make_float3(1.0f, 1.0f, 1.0f); + float3 value = one_float3(); compiler.add_node(NODE_CLOSURE_SET_WEIGHT, value); compiler.add_node(NODE_CLOSURE_HOLDOUT, compiler.closure_mix_weight_offset()); @@ -3233,9 +3228,9 @@ NODE_DEFINE(AmbientOcclusionNode) SOCKET_INT(samples, "Samples", 16); - SOCKET_IN_COLOR(color, "Color", make_float3(1.0f, 1.0f, 1.0f)); + SOCKET_IN_COLOR(color, "Color", one_float3()); SOCKET_IN_FLOAT(distance, "Distance", 1.0f); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_BOOLEAN(inside, "Inside", false); SOCKET_BOOLEAN(only_local, "Only Local", false); @@ -3393,11 +3388,11 @@ NODE_DEFINE(PrincipledVolumeNode) SOCKET_IN_COLOR(color, "Color", make_float3(0.5f, 0.5f, 0.5f)); SOCKET_IN_FLOAT(density, "Density", 1.0f); SOCKET_IN_FLOAT(anisotropy, "Anisotropy", 0.0f); - SOCKET_IN_COLOR(absorption_color, "Absorption Color", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(absorption_color, "Absorption Color", zero_float3()); SOCKET_IN_FLOAT(emission_strength, "Emission Strength", 0.0f); - SOCKET_IN_COLOR(emission_color, "Emission Color", make_float3(1.0f, 1.0f, 1.0f)); + SOCKET_IN_COLOR(emission_color, "Emission Color", one_float3()); SOCKET_IN_FLOAT(blackbody_intensity, "Blackbody Intensity", 0.0f); - SOCKET_IN_COLOR(blackbody_tint, "Blackbody Tint", make_float3(1.0f, 1.0f, 1.0f)); + SOCKET_IN_COLOR(blackbody_tint, "Blackbody Tint", one_float3()); SOCKET_IN_FLOAT(temperature, "Temperature", 1000.0f); SOCKET_IN_FLOAT(volume_mix_weight, "VolumeMixWeight", 0.0f, SocketType::SVM_INTERNAL); @@ -3523,7 +3518,7 @@ NODE_DEFINE(PrincipledHairBsdfNode) SOCKET_IN_FLOAT(random_color, "Random Color", 0.0f); SOCKET_IN_FLOAT(random, "Random", 0.0f); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); SOCKET_OUT_CLOSURE(BSDF, "BSDF"); @@ -3548,7 +3543,7 @@ void PrincipledHairBsdfNode::attributes(Shader *shader, AttributeRequestSet *att /* Prepares the input data for the SVM shader. */ void PrincipledHairBsdfNode::compile(SVMCompiler &compiler) { - compiler.add_node(NODE_CLOSURE_SET_WEIGHT, make_float3(1.0f, 1.0f, 1.0f)); + compiler.add_node(NODE_CLOSURE_SET_WEIGHT, one_float3()); ShaderInput *roughness_in = input("Roughness"); ShaderInput *radial_roughness_in = input("Radial Roughness"); @@ -3625,7 +3620,7 @@ NODE_DEFINE(HairBsdfNode) NodeType *type = NodeType::add("hair_bsdf", create, NodeType::SHADER); SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); static NodeEnum component_enum; @@ -3635,7 +3630,7 @@ NODE_DEFINE(HairBsdfNode) SOCKET_IN_FLOAT(offset, "Offset", 0.0f); SOCKET_IN_FLOAT(roughness_u, "RoughnessU", 0.2f); SOCKET_IN_FLOAT(roughness_v, "RoughnessV", 0.2f); - SOCKET_IN_VECTOR(tangent, "Tangent", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_VECTOR(tangent, "Tangent", zero_float3()); SOCKET_OUT_CLOSURE(BSDF, "BSDF"); @@ -3666,10 +3661,8 @@ NODE_DEFINE(GeometryNode) { NodeType *type = NodeType::add("geometry", create, NodeType::SHADER); - SOCKET_IN_NORMAL(normal_osl, - "NormalIn", - make_float3(0.0f, 0.0f, 0.0f), - SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); + SOCKET_IN_NORMAL( + normal_osl, "NormalIn", zero_float3(), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); SOCKET_OUT_POINT(position, "Position"); SOCKET_OUT_NORMAL(normal, "Normal"); @@ -3817,10 +3810,8 @@ NODE_DEFINE(TextureCoordinateNode) SOCKET_BOOLEAN(use_transform, "Use Transform", false); SOCKET_TRANSFORM(ob_tfm, "Object Transform", transform_identity()); - SOCKET_IN_NORMAL(normal_osl, - "NormalIn", - make_float3(0.0f, 0.0f, 0.0f), - SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); + SOCKET_IN_NORMAL( + normal_osl, "NormalIn", zero_float3(), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); SOCKET_OUT_POINT(generated, "Generated"); SOCKET_OUT_NORMAL(normal, "Normal"); @@ -4656,7 +4647,7 @@ NODE_DEFINE(ColorNode) { NodeType *type = NodeType::add("color", create, NodeType::SHADER); - SOCKET_COLOR(value, "Value", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_COLOR(value, "Value", zero_float3()); SOCKET_OUT_COLOR(color, "Color"); return type; @@ -4829,7 +4820,7 @@ NODE_DEFINE(InvertNode) NodeType *type = NodeType::add("invert", create, NodeType::SHADER); SOCKET_IN_FLOAT(fac, "Fac", 1.0f); - SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(color, "Color", zero_float3()); SOCKET_OUT_COLOR(color, "Color"); @@ -4848,7 +4839,7 @@ void InvertNode::constant_fold(const ConstantFolder &folder) if (!fac_in->link) { /* evaluate fully constant node */ if (!color_in->link) { - folder.make_constant(interp(color, make_float3(1.0f, 1.0f, 1.0f) - color, fac)); + folder.make_constant(interp(color, one_float3() - color, fac)); } /* remove no-op node */ else if (fac == 0.0f) { @@ -4904,8 +4895,8 @@ NODE_DEFINE(MixNode) SOCKET_BOOLEAN(use_clamp, "Use Clamp", false); SOCKET_IN_FLOAT(fac, "Fac", 0.5f); - SOCKET_IN_COLOR(color1, "Color1", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_COLOR(color2, "Color2", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(color1, "Color1", zero_float3()); + SOCKET_IN_COLOR(color2, "Color2", zero_float3()); SOCKET_OUT_COLOR(color, "Color"); @@ -5099,7 +5090,7 @@ NODE_DEFINE(GammaNode) { NodeType *type = NodeType::add("gamma", create, NodeType::SHADER); - SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(color, "Color", zero_float3()); SOCKET_IN_FLOAT(gamma, "Gamma", 1.0f); SOCKET_OUT_COLOR(color, "Color"); @@ -5153,7 +5144,7 @@ NODE_DEFINE(BrightContrastNode) { NodeType *type = NodeType::add("brightness_contrast", create, NodeType::SHADER); - SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(color, "Color", zero_float3()); SOCKET_IN_FLOAT(bright, "Bright", 0.0f); SOCKET_IN_FLOAT(contrast, "Contrast", 0.0f); @@ -5198,7 +5189,7 @@ NODE_DEFINE(SeparateRGBNode) { NodeType *type = NodeType::add("separate_rgb", create, NodeType::SHADER); - SOCKET_IN_COLOR(color, "Image", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(color, "Image", zero_float3()); SOCKET_OUT_FLOAT(r, "R"); SOCKET_OUT_FLOAT(g, "G"); @@ -5251,7 +5242,7 @@ NODE_DEFINE(SeparateXYZNode) { NodeType *type = NodeType::add("separate_xyz", create, NodeType::SHADER); - SOCKET_IN_COLOR(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(vector, "Vector", zero_float3()); SOCKET_OUT_FLOAT(x, "X"); SOCKET_OUT_FLOAT(y, "Y"); @@ -5304,7 +5295,7 @@ NODE_DEFINE(SeparateHSVNode) { NodeType *type = NodeType::add("separate_hsv", create, NodeType::SHADER); - SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(color, "Color", zero_float3()); SOCKET_OUT_FLOAT(h, "H"); SOCKET_OUT_FLOAT(s, "S"); @@ -5360,7 +5351,7 @@ NODE_DEFINE(HSVNode) SOCKET_IN_FLOAT(saturation, "Saturation", 1.0f); SOCKET_IN_FLOAT(value, "Value", 1.0f); SOCKET_IN_FLOAT(fac, "Fac", 1.0f); - SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(color, "Color", zero_float3()); SOCKET_OUT_COLOR(color, "Color"); @@ -5525,10 +5516,8 @@ NODE_DEFINE(FresnelNode) { NodeType *type = NodeType::add("fresnel", create, NodeType::SHADER); - SOCKET_IN_NORMAL(normal, - "Normal", - make_float3(0.0f, 0.0f, 0.0f), - SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); + SOCKET_IN_NORMAL( + normal, "Normal", zero_float3(), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); SOCKET_IN_FLOAT(IOR, "IOR", 1.45f); SOCKET_OUT_FLOAT(fac, "Fac"); @@ -5564,10 +5553,8 @@ NODE_DEFINE(LayerWeightNode) { NodeType *type = NodeType::add("layer_weight", create, NodeType::SHADER); - SOCKET_IN_NORMAL(normal, - "Normal", - make_float3(0.0f, 0.0f, 0.0f), - SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); + SOCKET_IN_NORMAL( + normal, "Normal", zero_float3(), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); SOCKET_IN_FLOAT(blend, "Blend", 0.5f); SOCKET_OUT_FLOAT(fresnel, "Fresnel"); @@ -5735,8 +5722,8 @@ NODE_DEFINE(OutputNode) SOCKET_IN_CLOSURE(surface, "Surface"); SOCKET_IN_CLOSURE(volume, "Volume"); - SOCKET_IN_VECTOR(displacement, "Displacement", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_VECTOR(displacement, "Displacement", zero_float3()); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3()); return type; } @@ -5928,7 +5915,7 @@ NODE_DEFINE(OutputAOVNode) { NodeType *type = NodeType::add("aov_output", create, NodeType::SHADER); - SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(color, "Color", zero_float3()); SOCKET_IN_FLOAT(value, "Value", 0.0f); SOCKET_STRING(name, "AOV Name", ustring("")); @@ -6126,9 +6113,9 @@ NODE_DEFINE(VectorMathNode) type_enum.insert("tangent", NODE_VECTOR_MATH_TANGENT); SOCKET_ENUM(math_type, "Type", type_enum, NODE_VECTOR_MATH_ADD); - SOCKET_IN_VECTOR(vector1, "Vector1", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_VECTOR(vector2, "Vector2", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_VECTOR(vector3, "Vector3", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_VECTOR(vector1, "Vector1", zero_float3()); + SOCKET_IN_VECTOR(vector2, "Vector2", zero_float3()); + SOCKET_IN_VECTOR(vector3, "Vector3", zero_float3()); SOCKET_IN_FLOAT(scale, "Scale", 1.0f); SOCKET_OUT_FLOAT(value, "Value"); @@ -6144,7 +6131,7 @@ VectorMathNode::VectorMathNode() : ShaderNode(node_type) void VectorMathNode::constant_fold(const ConstantFolder &folder) { float value = 0.0f; - float3 vector = make_float3(0.0f, 0.0f, 0.0f); + float3 vector = zero_float3(); if (folder.all_inputs_constant()) { svm_vector_math(&value, &vector, math_type, vector1, vector2, vector3, scale); @@ -6216,9 +6203,9 @@ NODE_DEFINE(VectorRotateNode) SOCKET_BOOLEAN(invert, "Invert", false); - SOCKET_IN_VECTOR(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_POINT(rotation, "Rotation", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_POINT(center, "Center", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_VECTOR(vector, "Vector", zero_float3()); + SOCKET_IN_POINT(rotation, "Rotation", zero_float3()); + SOCKET_IN_POINT(center, "Center", zero_float3()); SOCKET_IN_VECTOR(axis, "Axis", make_float3(0.0f, 0.0f, 1.0f)); SOCKET_IN_FLOAT(angle, "Angle", 0.0f); SOCKET_OUT_VECTOR(vector, "Vector"); @@ -6276,7 +6263,7 @@ NODE_DEFINE(VectorTransformNode) SOCKET_ENUM(convert_from, "Convert From", space_enum, NODE_VECTOR_TRANSFORM_CONVERT_SPACE_WORLD); SOCKET_ENUM(convert_to, "Convert To", space_enum, NODE_VECTOR_TRANSFORM_CONVERT_SPACE_OBJECT); - SOCKET_IN_VECTOR(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_VECTOR(vector, "Vector", zero_float3()); SOCKET_OUT_VECTOR(vector, "Vector"); return type; @@ -6321,7 +6308,7 @@ NODE_DEFINE(BumpNode) SOCKET_IN_FLOAT(sample_center, "SampleCenter", 0.0f); SOCKET_IN_FLOAT(sample_x, "SampleX", 0.0f); SOCKET_IN_FLOAT(sample_y, "SampleY", 0.0f); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(strength, "Strength", 1.0f); SOCKET_IN_FLOAT(distance, "Distance", 0.1f); @@ -6470,7 +6457,7 @@ NODE_DEFINE(RGBCurvesNode) SOCKET_FLOAT(max_x, "Max X", 1.0f); SOCKET_IN_FLOAT(fac, "Fac", 0.0f); - SOCKET_IN_COLOR(value, "Color", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(value, "Color", zero_float3()); SOCKET_OUT_COLOR(value, "Color"); @@ -6507,7 +6494,7 @@ NODE_DEFINE(VectorCurvesNode) SOCKET_FLOAT(max_x, "Max X", 1.0f); SOCKET_IN_FLOAT(fac, "Fac", 0.0f); - SOCKET_IN_VECTOR(value, "Vector", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_VECTOR(value, "Vector", zero_float3()); SOCKET_OUT_VECTOR(value, "Vector"); @@ -6618,7 +6605,7 @@ NODE_DEFINE(SetNormalNode) { NodeType *type = NodeType::add("set_normal", create, NodeType::SHADER); - SOCKET_IN_VECTOR(direction, "Direction", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_VECTOR(direction, "Direction", zero_float3()); SOCKET_OUT_NORMAL(normal, "Normal"); return type; @@ -6736,10 +6723,8 @@ NODE_DEFINE(NormalMapNode) SOCKET_STRING(attribute, "Attribute", ustring()); - SOCKET_IN_NORMAL(normal_osl, - "NormalIn", - make_float3(0.0f, 0.0f, 0.0f), - SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); + SOCKET_IN_NORMAL( + normal_osl, "NormalIn", zero_float3(), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); SOCKET_IN_FLOAT(strength, "Strength", 1.0f); SOCKET_IN_COLOR(color, "Color", make_float3(0.5f, 0.5f, 1.0f)); @@ -6835,10 +6820,8 @@ NODE_DEFINE(TangentNode) SOCKET_STRING(attribute, "Attribute", ustring()); - SOCKET_IN_NORMAL(normal_osl, - "NormalIn", - make_float3(0.0f, 0.0f, 0.0f), - SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); + SOCKET_IN_NORMAL( + normal_osl, "NormalIn", zero_float3(), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); SOCKET_OUT_NORMAL(tangent, "Tangent"); return type; @@ -6907,7 +6890,7 @@ NODE_DEFINE(BevelNode) SOCKET_INT(samples, "Samples", 4); SOCKET_IN_FLOAT(radius, "Radius", 0.05f); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_OUT_NORMAL(bevel, "Normal"); @@ -6952,7 +6935,7 @@ NODE_DEFINE(DisplacementNode) SOCKET_IN_FLOAT(height, "Height", 0.0f); SOCKET_IN_FLOAT(midlevel, "Midlevel", 0.5f); SOCKET_IN_FLOAT(scale, "Scale", 1.0f); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_OUT_VECTOR(displacement, "Displacement"); @@ -7009,7 +6992,7 @@ NODE_DEFINE(VectorDisplacementNode) SOCKET_ENUM(space, "Space", space_enum, NODE_NORMAL_MAP_TANGENT); SOCKET_STRING(attribute, "Attribute", ustring()); - SOCKET_IN_COLOR(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(vector, "Vector", zero_float3()); SOCKET_IN_FLOAT(midlevel, "Midlevel", 0.0f); SOCKET_IN_FLOAT(scale, "Scale", 1.0f); @@ -7025,7 +7008,7 @@ VectorDisplacementNode::VectorDisplacementNode() : ShaderNode(node_type) void VectorDisplacementNode::constant_fold(const ConstantFolder &folder) { if (folder.all_inputs_constant()) { - if ((vector == make_float3(0.0f, 0.0f, 0.0f) && midlevel == 0.0f) || (scale == 0.0f)) { + if ((vector == zero_float3() && midlevel == 0.0f) || (scale == 0.0f)) { folder.make_zero(); } } diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h index d4603143ef4..fb9cf0c9836 100644 --- a/intern/cycles/render/nodes.h +++ b/intern/cycles/render/nodes.h @@ -501,6 +501,7 @@ class RGBToBWNode : public ShaderNode { class ConvertNode : public ShaderNode { public: ConvertNode(SocketType::Type from, SocketType::Type to, bool autoconvert = false); + ConvertNode(const ConvertNode &other); SHADER_NODE_BASE_CLASS(ConvertNode) void constant_fold(const ConstantFolder &folder); diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp index 0f16a4fc12c..ebbfc789329 100644 --- a/intern/cycles/render/object.cpp +++ b/intern/cycles/render/object.cpp @@ -85,13 +85,13 @@ NODE_DEFINE(Object) SOCKET_NODE(geometry, "Geometry", &Geometry::node_base_type); SOCKET_TRANSFORM(tfm, "Transform", transform_identity()); SOCKET_UINT(visibility, "Visibility", ~0); - SOCKET_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_COLOR(color, "Color", zero_float3()); SOCKET_UINT(random_id, "Random ID", 0); SOCKET_INT(pass_id, "Pass ID", 0); SOCKET_BOOLEAN(use_holdout, "Use Holdout", false); SOCKET_BOOLEAN(hide_on_missing_motion, "Hide on Missing Motion", false); - SOCKET_POINT(dupli_generated, "Dupli Generated", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_POINT2(dupli_uv, "Dupli UV", make_float2(0.0f, 0.0f)); + SOCKET_POINT(dupli_generated, "Dupli Generated", zero_float3()); + SOCKET_POINT2(dupli_uv, "Dupli UV", zero_float2()); SOCKET_TRANSFORM_ARRAY(motion, "Motion", array()); SOCKET_FLOAT(shadow_terminator_offset, "Terminator Offset", 0.0f); SOCKET_STRING(asset_name, "Asset Name", ustring()); @@ -270,7 +270,7 @@ int Object::motion_step(float time) const bool Object::is_traceable() const { /* Mesh itself can be empty,can skip all such objects. */ - if (!bounds.valid() || bounds.size() == make_float3(0.0f, 0.0f, 0.0f)) { + if (!bounds.valid() || bounds.size() == zero_float3()) { return false; } /* TODO(sergey): Check for mesh vertices/curves. visibility flags. */ @@ -337,7 +337,7 @@ float Object::compute_volume_step_size() const if (voxel_step_size == 0.0f) { /* Auto detect step size. */ - float3 size = make_float3(1.0f, 1.0f, 1.0f); + float3 size = one_float3(); #ifdef WITH_NANOVDB /* Dimensions were not applied to image transform with NanOVDB (see image_vdb.cpp) */ if (metadata.type != IMAGE_DATA_TYPE_NANOVDB_FLOAT && @@ -397,7 +397,7 @@ static float object_volume_density(const Transform &tfm, Geometry *geom) if (geom->geometry_type == Geometry::VOLUME) { /* Volume density automatically adjust to object scale. */ if (static_cast(geom)->get_object_space()) { - const float3 unit = normalize(make_float3(1.0f, 1.0f, 1.0f)); + const float3 unit = normalize(one_float3()); return 1.0f / len(transform_direction(&tfm, unit)); } } @@ -915,7 +915,15 @@ void ObjectManager::tag_update(Scene *scene, uint32_t flag) /* avoid infinite loops if the geometry manager tagged us for an update */ if ((flag & GEOMETRY_MANAGER) == 0) { - scene->geometry_manager->tag_update(scene, GeometryManager::OBJECT_MANAGER); + uint32_t geometry_flag = GeometryManager::OBJECT_MANAGER; + + /* Also notify in case added or removed objects were instances, as no Geometry might have been + * added or removed, but the BVH still needs to updated. */ + if ((flag & (OBJECT_ADDED | OBJECT_REMOVED)) != 0) { + geometry_flag |= (GeometryManager::GEOMETRY_ADDED | GeometryManager::GEOMETRY_REMOVED); + } + + scene->geometry_manager->tag_update(scene, geometry_flag); } scene->light_manager->tag_update(scene, LightManager::OBJECT_MANAGER); diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp index 332599be708..ea83073d5ce 100644 --- a/intern/cycles/render/shader.cpp +++ b/intern/cycles/render/shader.cpp @@ -35,6 +35,7 @@ #include "util/util_foreach.h" #include "util/util_murmurhash.h" #include "util/util_task.h" +#include "util/util_transform.h" #ifdef WITH_OCIO # include @@ -399,39 +400,7 @@ ShaderManager::ShaderManager() update_flags = UPDATE_ALL; beckmann_table_offset = TABLE_OFFSET_INVALID; - xyz_to_r = make_float3(3.2404542f, -1.5371385f, -0.4985314f); - xyz_to_g = make_float3(-0.9692660f, 1.8760108f, 0.0415560f); - xyz_to_b = make_float3(0.0556434f, -0.2040259f, 1.0572252f); - rgb_to_y = make_float3(0.2126729f, 0.7151522f, 0.0721750f); - -#ifdef WITH_OCIO - OCIO::ConstConfigRcPtr config = OCIO::GetCurrentConfig(); - if (config) { - if (config->hasRole("XYZ") && config->hasRole("scene_linear")) { - OCIO::ConstProcessorRcPtr to_rgb_processor = config->getProcessor("XYZ", "scene_linear"); - OCIO::ConstProcessorRcPtr to_xyz_processor = config->getProcessor("scene_linear", "XYZ"); - if (to_rgb_processor && to_xyz_processor) { - float r[] = {1.0f, 0.0f, 0.0f}; - float g[] = {0.0f, 1.0f, 0.0f}; - float b[] = {0.0f, 0.0f, 1.0f}; - to_xyz_processor->applyRGB(r); - to_xyz_processor->applyRGB(g); - to_xyz_processor->applyRGB(b); - rgb_to_y = make_float3(r[1], g[1], b[1]); - - float x[] = {1.0f, 0.0f, 0.0f}; - float y[] = {0.0f, 1.0f, 0.0f}; - float z[] = {0.0f, 0.0f, 1.0f}; - to_rgb_processor->applyRGB(x); - to_rgb_processor->applyRGB(y); - to_rgb_processor->applyRGB(z); - xyz_to_r = make_float3(x[0], y[0], z[0]); - xyz_to_g = make_float3(x[1], y[1], z[1]); - xyz_to_b = make_float3(x[2], y[2], z[2]); - } - } - } -#endif + init_xyz_transforms(); } ShaderManager::~ShaderManager() @@ -595,7 +564,7 @@ void ShaderManager::device_update_common(Device *device, flag |= SD_HAS_DISPLACEMENT; /* constant emission check */ - float3 constant_emission = make_float3(0.0f, 0.0f, 0.0f); + float3 constant_emission = zero_float3(); if (shader->is_constant_emission(&constant_emission)) flag |= SD_HAS_CONSTANT_EMISSION; @@ -829,4 +798,93 @@ bool ShaderManager::need_update() const return update_flags != UPDATE_NONE; } +#ifdef WITH_OCIO +static bool to_scene_linear_transform(OCIO::ConstConfigRcPtr &config, + const char *colorspace, + Transform &to_scene_linear) +{ + OCIO::ConstProcessorRcPtr processor; + try { + processor = config->getProcessor(OCIO::ROLE_SCENE_LINEAR, colorspace); + } + catch (OCIO::Exception &) { + return false; + } + + if (!processor) { + return false; + } + + OCIO::ConstCPUProcessorRcPtr device_processor = processor->getDefaultCPUProcessor(); + if (!device_processor) { + return false; + } + + to_scene_linear = transform_identity(); + device_processor->applyRGB(&to_scene_linear.x.x); + device_processor->applyRGB(&to_scene_linear.y.x); + device_processor->applyRGB(&to_scene_linear.z.x); + to_scene_linear = transform_transposed_inverse(to_scene_linear); + return true; +} +#endif + +void ShaderManager::init_xyz_transforms() +{ + /* Default to ITU-BT.709 in case no appropriate transform found. */ + xyz_to_r = make_float3(3.2404542f, -1.5371385f, -0.4985314f); + xyz_to_g = make_float3(-0.9692660f, 1.8760108f, 0.0415560f); + xyz_to_b = make_float3(0.0556434f, -0.2040259f, 1.0572252f); + rgb_to_y = make_float3(0.2126729f, 0.7151522f, 0.0721750f); + +#ifdef WITH_OCIO + /* Get from OpenColorO config if it has the required roles. */ + OCIO::ConstConfigRcPtr config = OCIO::GetCurrentConfig(); + if (!(config && config->hasRole(OCIO::ROLE_SCENE_LINEAR))) { + return; + } + + Transform xyz_to_rgb; + + if (config->hasRole("aces_interchange")) { + /* Standard OpenColorIO role, defined as ACES2065-1. */ + const Transform xyz_to_aces = make_transform(1.0498110175f, + 0.0f, + -0.0000974845f, + 0.0f, + -0.4959030231f, + 1.3733130458f, + 0.0982400361f, + 0.0f, + 0.0f, + 0.0f, + 0.9912520182f, + 0.0f); + Transform aces_to_rgb; + if (!to_scene_linear_transform(config, "aces_interchange", aces_to_rgb)) { + return; + } + + xyz_to_rgb = aces_to_rgb * xyz_to_aces; + } + else if (config->hasRole("XYZ")) { + /* Custom role used before the standard existed. */ + if (!to_scene_linear_transform(config, "XYZ", xyz_to_rgb)) { + return; + } + } + else { + /* No reference role found to determine XYZ. */ + return; + } + + xyz_to_r = float4_to_float3(xyz_to_rgb.x); + xyz_to_g = float4_to_float3(xyz_to_rgb.y); + xyz_to_b = float4_to_float3(xyz_to_rgb.z); + + const Transform rgb_to_xyz = transform_inverse(xyz_to_rgb); + rgb_to_y = float4_to_float3(rgb_to_xyz.y); +#endif +} + CCL_NAMESPACE_END diff --git a/intern/cycles/render/shader.h b/intern/cycles/render/shader.h index 4375ef9e978..f47d64f346c 100644 --- a/intern/cycles/render/shader.h +++ b/intern/cycles/render/shader.h @@ -221,6 +221,8 @@ class ShaderManager { bool need_update() const; + void init_xyz_transforms(); + protected: ShaderManager(); diff --git a/intern/cycles/subd/subd_subpatch.h b/intern/cycles/subd/subd_subpatch.h index 1a32b763cb8..cdaa310916a 100644 --- a/intern/cycles/subd/subd_subpatch.h +++ b/intern/cycles/subd/subd_subpatch.h @@ -68,9 +68,9 @@ class Subpatch { explicit Subpatch(Patch *patch = nullptr) : patch(patch), - c00(make_float2(0.0f, 0.0f)), + c00(zero_float2()), c01(make_float2(0.0f, 1.0f)), - c11(make_float2(1.0f, 1.0f)), + c11(one_float2()), c10(make_float2(1.0f, 0.0f)) { } diff --git a/intern/cycles/test/render_graph_finalize_test.cpp b/intern/cycles/test/render_graph_finalize_test.cpp index 3eaec982d09..da9b29314a7 100644 --- a/intern/cycles/test/render_graph_finalize_test.cpp +++ b/intern/cycles/test/render_graph_finalize_test.cpp @@ -259,9 +259,7 @@ TEST_F(RenderGraph, constant_fold_emission1) EXPECT_ANY_MESSAGE(log); CORRECT_INFO_MESSAGE(log, "Discarding closure Emission."); - builder - .add_node(ShaderNodeBuilder(graph, "Emission") - .set("Color", make_float3(0.0f, 0.0f, 0.0f))) + builder.add_node(ShaderNodeBuilder(graph, "Emission").set("Color", zero_float3())) .output_closure("Emission::Emission"); graph.finalize(scene); @@ -288,8 +286,7 @@ TEST_F(RenderGraph, constant_fold_background1) CORRECT_INFO_MESSAGE(log, "Discarding closure Background."); builder - .add_node(ShaderNodeBuilder(graph, "Background") - .set("Color", make_float3(0.0f, 0.0f, 0.0f))) + .add_node(ShaderNodeBuilder(graph, "Background").set("Color", zero_float3())) .output_closure("Background::Background"); graph.finalize(scene); @@ -892,8 +889,7 @@ TEST_F(RenderGraph, constant_fold_gamma_part_0) builder .add_attribute("Attribute") /* constant on the left */ - .add_node(ShaderNodeBuilder(graph, "Gamma_Cx") - .set("Color", make_float3(0.0f, 0.0f, 0.0f))) + .add_node(ShaderNodeBuilder(graph, "Gamma_Cx").set("Color", zero_float3())) .add_connection("Attribute::Fac", "Gamma_Cx::Gamma") /* constant on the right */ .add_node(ShaderNodeBuilder(graph, "Gamma_xC").set("Gamma", 0.0f)) @@ -922,8 +918,7 @@ TEST_F(RenderGraph, constant_fold_gamma_part_1) builder .add_attribute("Attribute") /* constant on the left */ - .add_node(ShaderNodeBuilder(graph, "Gamma_Cx") - .set("Color", make_float3(1.0f, 1.0f, 1.0f))) + .add_node(ShaderNodeBuilder(graph, "Gamma_Cx").set("Color", one_float3())) .add_connection("Attribute::Fac", "Gamma_Cx::Gamma") /* constant on the right */ .add_node(ShaderNodeBuilder(graph, "Gamma_xC").set("Gamma", 1.0f)) diff --git a/intern/cycles/test/util_transform_test.cpp b/intern/cycles/test/util_transform_test.cpp index 58ce0fdfee4..a5267df9fb7 100644 --- a/intern/cycles/test/util_transform_test.cpp +++ b/intern/cycles/test/util_transform_test.cpp @@ -33,7 +33,7 @@ TEST(transform_motion_decompose, Degenerated) // Copy from previous to current. { - vector motion = {transform_rotate(M_PI_4_F, make_float3(1.0f, 1.0f, 1.0f)), + vector motion = {transform_rotate(M_PI_4_F, one_float3()), transform_scale(0.0f, 0.0f, 0.0f)}; vector decomp(motion.size()); transform_motion_decompose(decomp.data(), motion.data(), motion.size()); @@ -43,7 +43,7 @@ TEST(transform_motion_decompose, Degenerated) // Copy from next to current. { vector motion = {transform_scale(0.0f, 0.0f, 0.0f), - transform_rotate(M_PI_4_F, make_float3(1.0f, 1.0f, 1.0f))}; + transform_rotate(M_PI_4_F, one_float3())}; vector decomp(motion.size()); transform_motion_decompose(decomp.data(), motion.data(), motion.size()); EXPECT_NEAR(len(decomp[0].x - decomp[1].x), 0.0f, 1e-6f); diff --git a/intern/cycles/util/util_avxb.h b/intern/cycles/util/util_avxb.h index 34fafd188de..17d505c077a 100644 --- a/intern/cycles/util/util_avxb.h +++ b/intern/cycles/util/util_avxb.h @@ -191,12 +191,12 @@ __forceinline const avxb unpackhi(const avxb &a, const avxb &b) //////////////////////////////////////////////////////////////////////////////// #if defined(__KERNEL_SSE41__) -__forceinline size_t popcnt(const avxb &a) +__forceinline uint32_t popcnt(const avxb &a) { - return __popcnt(_mm256_movemask_ps(a)); + return _mm_popcnt_u32(_mm256_movemask_ps(a)); } #else -__forceinline size_t popcnt(const avxb &a) +__forceinline uint32_t popcnt(const avxb &a) { return bool(a[0]) + bool(a[1]) + bool(a[2]) + bool(a[3]) + bool(a[4]) + bool(a[5]) + bool(a[6]) + bool(a[7]); @@ -224,7 +224,7 @@ __forceinline bool none(const avxb &b) return _mm256_movemask_ps(b) == 0x0; } -__forceinline size_t movemask(const avxb &a) +__forceinline uint32_t movemask(const avxb &a) { return _mm256_movemask_ps(a); } diff --git a/intern/cycles/util/util_avxi.h b/intern/cycles/util/util_avxi.h index e658a4f848f..3db646e61f4 100644 --- a/intern/cycles/util/util_avxi.h +++ b/intern/cycles/util/util_avxi.h @@ -711,21 +711,21 @@ __forceinline int reduce_add(const avxi &v) return extract<0>(extract<0>(vreduce_add(v))); } -__forceinline size_t select_min(const avxi &v) +__forceinline uint32_t select_min(const avxi &v) { return __bsf(movemask(v == vreduce_min(v))); } -__forceinline size_t select_max(const avxi &v) +__forceinline uint32_t select_max(const avxi &v) { return __bsf(movemask(v == vreduce_max(v))); } -__forceinline size_t select_min(const avxb &valid, const avxi &v) +__forceinline uint32_t select_min(const avxb &valid, const avxi &v) { const avxi a = select(valid, v, avxi(pos_inf)); return __bsf(movemask(valid & (a == vreduce_min(a)))); } -__forceinline size_t select_max(const avxb &valid, const avxi &v) +__forceinline uint32_t select_max(const avxb &valid, const avxi &v) { const avxi a = select(valid, v, avxi(neg_inf)); return __bsf(movemask(valid & (a == vreduce_max(a)))); diff --git a/intern/cycles/util/util_color.h b/intern/cycles/util/util_color.h index c6937ca78fe..203c0b289f6 100644 --- a/intern/cycles/util/util_color.h +++ b/intern/cycles/util/util_color.h @@ -20,7 +20,7 @@ #include "util/util_math.h" #include "util/util_types.h" -#ifdef __KERNEL_SSE2__ +#if !defined(__KERNEL_GPU__) && defined(__KERNEL_SSE2__) # include "util/util_simd.h" #endif @@ -277,16 +277,16 @@ ccl_device float4 color_srgb_to_linear_v4(float4 c) ccl_device float3 color_highlight_compress(float3 color, float3 *variance) { - color += make_float3(1.0f, 1.0f, 1.0f); + color += one_float3(); if (variance) { - *variance *= sqr3(make_float3(1.0f, 1.0f, 1.0f) / color); + *variance *= sqr3(one_float3() / color); } return log3(color); } ccl_device float3 color_highlight_uncompress(float3 color) { - return exp3(color) - make_float3(1.0f, 1.0f, 1.0f); + return exp3(color) - one_float3(); } CCL_NAMESPACE_END diff --git a/intern/cycles/util/util_defines.h b/intern/cycles/util/util_defines.h index e8e414587fb..0a239a944a5 100644 --- a/intern/cycles/util/util_defines.h +++ b/intern/cycles/util/util_defines.h @@ -26,7 +26,7 @@ /* Bitness */ #if defined(__ppc64__) || defined(__PPC64__) || defined(__x86_64__) || defined(__ia64__) || \ - defined(_M_X64) + defined(_M_X64) || defined(__aarch64__) # define __KERNEL_64_BIT__ #endif diff --git a/intern/cycles/util/util_half.h b/intern/cycles/util/util_half.h index 3bac7008905..a8d4ee75e20 100644 --- a/intern/cycles/util/util_half.h +++ b/intern/cycles/util/util_half.h @@ -20,7 +20,7 @@ #include "util/util_math.h" #include "util/util_types.h" -#ifdef __KERNEL_SSE2__ +#if !defined(__KERNEL_GPU__) && defined(__KERNEL_SSE2__) # include "util/util_simd.h" #endif diff --git a/intern/cycles/util/util_math_float2.h b/intern/cycles/util/util_math_float2.h index bf21430af3c..17f6f3c9382 100644 --- a/intern/cycles/util/util_math_float2.h +++ b/intern/cycles/util/util_math_float2.h @@ -72,6 +72,16 @@ ccl_device_inline float2 safe_divide_float2_float(const float2 a, const float b) * Definition. */ +ccl_device_inline float2 zero_float2() +{ + return make_float2(0.0f, 0.0f); +} + +ccl_device_inline float2 one_float2() +{ + return make_float2(1.0f, 1.0f); +} + #ifndef __KERNEL_OPENCL__ ccl_device_inline float2 operator-(const float2 &a) { @@ -256,7 +266,7 @@ ccl_device_inline float2 floor(const float2 &a) ccl_device_inline float2 safe_divide_float2_float(const float2 a, const float b) { - return (b != 0.0f) ? a / b : make_float2(0.0f, 0.0f); + return (b != 0.0f) ? a / b : zero_float2(); } CCL_NAMESPACE_END diff --git a/intern/cycles/util/util_math_float3.h b/intern/cycles/util/util_math_float3.h index dd2010715ba..67c5c61e4c0 100644 --- a/intern/cycles/util/util_math_float3.h +++ b/intern/cycles/util/util_math_float3.h @@ -91,6 +91,20 @@ ccl_device_inline bool isequal_float3(const float3 a, const float3 b); * Definition. */ +ccl_device_inline float3 zero_float3() +{ +#ifdef __KERNEL_SSE__ + return float3(_mm_setzero_ps()); +#else + return make_float3(0.0f, 0.0f, 0.0f); +#endif +} + +ccl_device_inline float3 one_float3() +{ + return make_float3(1.0f, 1.0f, 1.0f); +} + #ifndef __KERNEL_OPENCL__ ccl_device_inline float3 operator-(const float3 &a) { @@ -290,8 +304,12 @@ ccl_device_inline float3 clamp(const float3 &a, const float3 &mn, const float3 & ccl_device_inline float3 fabs(const float3 &a) { # ifdef __KERNEL_SSE__ +# ifdef __KERNEL_NEON__ + return float3(vabsq_f32(a.m128)); +# else __m128 mask = _mm_castsi128_ps(_mm_set1_epi32(0x7fffffff)); return float3(_mm_and_ps(a.m128, mask)); +# endif # else return make_float3(fabsf(a.x), fabsf(a.y), fabsf(a.z)); # endif @@ -373,8 +391,7 @@ ccl_device_inline float3 reflect(const float3 incident, const float3 normal) ccl_device_inline float3 project(const float3 v, const float3 v_proj) { float len_squared = dot(v_proj, v_proj); - return (len_squared != 0.0f) ? (dot(v, v_proj) / len_squared) * v_proj : - make_float3(0.0f, 0.0f, 0.0f); + return (len_squared != 0.0f) ? (dot(v, v_proj) / len_squared) * v_proj : zero_float3(); } ccl_device_inline float3 saturate3(float3 a) @@ -410,7 +427,7 @@ ccl_device_inline float3 safe_divide_float3_float3(const float3 a, const float3 ccl_device_inline float3 safe_divide_float3_float(const float3 a, const float b) { - return (b != 0.0f) ? a / b : make_float3(0.0f, 0.0f, 0.0f); + return (b != 0.0f) ? a / b : zero_float3(); } ccl_device_inline float3 interp(float3 a, float3 b, float t) @@ -434,7 +451,13 @@ ccl_device_inline bool is_zero(const float3 a) ccl_device_inline float reduce_add(const float3 a) { +#if defined(__KERNEL_SSE__) && defined(__KERNEL_NEON__) + __m128 t = a.m128; + t[3] = 0.0f; + return vaddvq_f32(t); +#else return (a.x + a.y + a.z); +#endif } ccl_device_inline float average(const float3 a) diff --git a/intern/cycles/util/util_math_float4.h b/intern/cycles/util/util_math_float4.h index ec5328adb31..0ba2bafa2f0 100644 --- a/intern/cycles/util/util_math_float4.h +++ b/intern/cycles/util/util_math_float4.h @@ -98,6 +98,20 @@ ccl_device_inline float4 reduce_add(const float4 &a); * Definition. */ +ccl_device_inline float4 zero_float4() +{ +#ifdef __KERNEL_SSE__ + return float4(_mm_setzero_ps()); +#else + return make_float4(0.0f, 0.0f, 0.0f, 0.0f); +#endif +} + +ccl_device_inline float4 one_float4() +{ + return make_float4(1.0f, 1.0f, 1.0f, 1.0f); +} + #ifndef __KERNEL_OPENCL__ ccl_device_inline float4 operator-(const float4 &a) { @@ -243,7 +257,12 @@ ccl_device_inline float distance(const float4 &a, const float4 &b) ccl_device_inline float dot(const float4 &a, const float4 &b) { # if defined(__KERNEL_SSE41__) && defined(__KERNEL_SSE__) +# if defined(__KERNEL_NEON__) + __m128 t = vmulq_f32(a, b); + return vaddvq_f32(t); +# else return _mm_cvtss_f32(_mm_dp_ps(a, b, 0xFF)); +# endif # else return (a.x * b.x + a.y * b.y) + (a.z * b.z + a.w * b.w); # endif @@ -299,8 +318,10 @@ ccl_device_inline bool is_zero(const float4 &a) ccl_device_inline float4 reduce_add(const float4 &a) { -# ifdef __KERNEL_SSE__ -# ifdef __KERNEL_SSE3__ +# if defined(__KERNEL_SSE__) +# if defined(__KERNEL_NEON__) + return float4(vdupq_n_f32(vaddvq_f32(a))); +# elif defined(__KERNEL_SSE3__) float4 h(_mm_hadd_ps(a.m128, a.m128)); return float4(_mm_hadd_ps(h.m128, h.m128)); # else @@ -359,8 +380,12 @@ ccl_device_inline float4 clamp(const float4 &a, const float4 &mn, const float4 & ccl_device_inline float4 fabs(const float4 &a) { -# ifdef __KERNEL_SSE__ +# if defined(__KERNEL_SSE__) +# if defined(__KERNEL_NEON__) + return float4(vabsq_f32(a)); +# else return float4(_mm_and_ps(a.m128, _mm_castsi128_ps(_mm_set1_epi32(0x7fffffff)))); +# endif # else return make_float4(fabsf(a.x), fabsf(a.y), fabsf(a.z), fabsf(a.w)); # endif @@ -386,14 +411,22 @@ ccl_device_inline float4 mix(const float4 &a, const float4 &b, float t) template __forceinline const float4 shuffle(const float4 &b) { +# if defined(__KERNEL_NEON__) + return float4(shuffle_neon<__m128, index_0, index_1, index_2, index_3>(b.m128)); +# else return float4(_mm_castsi128_ps( _mm_shuffle_epi32(_mm_castps_si128(b), _MM_SHUFFLE(index_3, index_2, index_1, index_0)))); +# endif } template __forceinline const float4 shuffle(const float4 &a, const float4 &b) { +# if defined(__KERNEL_NEON__) + return float4(shuffle_neon<__m128, index_0, index_1, index_2, index_3>(a.m128, b.m128)); +# else return float4(_mm_shuffle_ps(a.m128, b.m128, _MM_SHUFFLE(index_3, index_2, index_1, index_0))); +# endif } template<> __forceinline const float4 shuffle<0, 1, 0, 1>(const float4 &b) @@ -443,9 +476,13 @@ ccl_device_inline float4 mask(const int4 &mask, const float4 &a) ccl_device_inline float4 reduce_min(const float4 &a) { -# ifdef __KERNEL_SSE__ +# if defined(__KERNEL_SSE__) +# if defined(__KERNEL_NEON__) + return float4(vdupq_n_f32(vminvq_f32(a))); +# else float4 h = min(shuffle<1, 0, 3, 2>(a), a); return min(shuffle<2, 3, 0, 1>(h), h); +# endif # else return make_float4(min(min(a.x, a.y), min(a.z, a.w))); # endif @@ -453,9 +490,13 @@ ccl_device_inline float4 reduce_min(const float4 &a) ccl_device_inline float4 reduce_max(const float4 &a) { -# ifdef __KERNEL_SSE__ +# if defined(__KERNEL_SSE__) +# if defined(__KERNEL_NEON__) + return float4(vdupq_n_f32(vmaxvq_f32(a))); +# else float4 h = max(shuffle<1, 0, 3, 2>(a), a); return max(shuffle<2, 3, 0, 1>(h), h); +# endif # else return make_float4(max(max(a.x, a.y), max(a.z, a.w))); # endif @@ -474,7 +515,7 @@ ccl_device_inline float4 load_float4(const float *v) ccl_device_inline float4 safe_divide_float4_float(const float4 a, const float b) { - return (b != 0.0f) ? a / b : make_float4(0.0f, 0.0f, 0.0f, 0.0f); + return (b != 0.0f) ? a / b : zero_float4(); } ccl_device_inline bool isfinite4_safe(float4 v) diff --git a/intern/cycles/util/util_openimagedenoise.h b/intern/cycles/util/util_openimagedenoise.h index aafa69cb530..898c634141e 100644 --- a/intern/cycles/util/util_openimagedenoise.h +++ b/intern/cycles/util/util_openimagedenoise.h @@ -28,7 +28,12 @@ CCL_NAMESPACE_BEGIN static inline bool openimagedenoise_supported() { #ifdef WITH_OPENIMAGEDENOISE +# ifdef __APPLE__ + /* Always supported through Accelerate framework BNNS. */ + return true; +# else return system_cpu_support_sse41(); +# endif #else return false; #endif diff --git a/intern/cycles/util/util_optimization.h b/intern/cycles/util/util_optimization.h index 46dd883282a..7ecd3893cf4 100644 --- a/intern/cycles/util/util_optimization.h +++ b/intern/cycles/util/util_optimization.h @@ -27,44 +27,50 @@ /* We require minimum SSE2 support on x86, so auto enable. */ # define __KERNEL_SSE2__ - # ifdef WITH_KERNEL_SSE2 # define WITH_CYCLES_OPTIMIZED_KERNEL_SSE2 # endif - # ifdef WITH_KERNEL_SSE3 # define WITH_CYCLES_OPTIMIZED_KERNEL_SSE3 # endif -# endif /* defined(i386) || defined(_M_IX86) */ - /* x86-64 * * Compile a regular (includes SSE2), SSE3, SSE 4.1, AVX and AVX2 kernel. */ -# if defined(__x86_64__) || defined(_M_X64) +# elif defined(__x86_64__) || defined(_M_X64) /* SSE2 is always available on x86-64 CPUs, so auto enable */ # define __KERNEL_SSE2__ - /* no SSE2 kernel on x86-64, part of regular kernel */ # ifdef WITH_KERNEL_SSE3 # define WITH_CYCLES_OPTIMIZED_KERNEL_SSE3 # endif - # ifdef WITH_KERNEL_SSE41 # define WITH_CYCLES_OPTIMIZED_KERNEL_SSE41 # endif - # ifdef WITH_KERNEL_AVX # define WITH_CYCLES_OPTIMIZED_KERNEL_AVX # endif - # ifdef WITH_KERNEL_AVX2 # define WITH_CYCLES_OPTIMIZED_KERNEL_AVX2 # endif -# endif /* defined(__x86_64__) || defined(_M_X64) */ +/* Arm Neon + * + * Compile a SSE4 kernel emulated with Neon. Most code is shared with + * SSE, some specializations for performance and compatibility are made + * made testing for __KERNEL_NEON__. */ + +# elif defined(__ARM_NEON) && defined(WITH_SSE2NEON) + +# define __KERNEL_NEON__ +# define __KERNEL_SSE__ +# define __KERNEL_SSE2__ +# define __KERNEL_SSE3__ +# define __KERNEL_SSE41__ + +# endif #endif diff --git a/intern/cycles/util/util_projection.h b/intern/cycles/util/util_projection.h index 416af18b53e..9c7e0061c82 100644 --- a/intern/cycles/util/util_projection.h +++ b/intern/cycles/util/util_projection.h @@ -51,7 +51,7 @@ ccl_device_inline float3 transform_perspective(const ProjectionTransform *t, con float3 c = make_float3(dot(t->x, b), dot(t->y, b), dot(t->z, b)); float w = dot(t->w, b); - return (w != 0.0f) ? c / w : make_float3(0.0f, 0.0f, 0.0f); + return (w != 0.0f) ? c / w : zero_float3(); } ccl_device_inline float3 transform_perspective_direction(const ProjectionTransform *t, diff --git a/intern/cycles/util/util_simd.h b/intern/cycles/util/util_simd.h index de0e3c39f30..718ec9266b1 100644 --- a/intern/cycles/util/util_simd.h +++ b/intern/cycles/util/util_simd.h @@ -18,49 +18,44 @@ #ifndef __UTIL_SIMD_TYPES_H__ #define __UTIL_SIMD_TYPES_H__ -#ifndef __KERNEL_GPU__ +#include +#include -# include - -# include "util/util_defines.h" +#include "util/util_defines.h" /* SSE Intrinsics includes * - * We assume __KERNEL_SSEX__ flags to have been defined at this point */ - -/* SSE intrinsics headers */ -# ifndef FREE_WINDOWS64 - -# ifdef _MSC_VER -# include -# elif (defined(__x86_64__) || defined(__i386__)) -# include -# endif - -# else - -/* MinGW64 has conflicting declarations for these SSE headers in . + * We assume __KERNEL_SSEX__ flags to have been defined at this point. + * + * MinGW64 has conflicting declarations for these SSE headers in . * Since we can't avoid including , better only include that */ -# include "util/util_windows.h" +#if defined(FREE_WINDOWS64) +# include "util/util_windows.h" +#elif defined(_MSC_VER) +# include +#elif (defined(__x86_64__) || defined(__i386__)) +# include +#elif defined(__KERNEL_NEON__) +# define SSE2NEON_PRECISE_MINMAX 1 +# include +#endif -# endif - -# if defined(__x86_64__) || defined(_M_X64) -# define SIMD_SET_FLUSH_TO_ZERO \ - _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); \ - _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON); -# else -# define SIMD_SET_FLUSH_TO_ZERO -# endif +/* Floating Point Control, for Embree. */ +#if defined(__x86_64__) || defined(_M_X64) +# define SIMD_SET_FLUSH_TO_ZERO \ + _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); \ + _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON); +#else +# define SIMD_SET_FLUSH_TO_ZERO +#endif CCL_NAMESPACE_BEGIN -# ifdef __KERNEL_SSE2__ +/* Data structures used by SSE classes. */ +#ifdef __KERNEL_SSE2__ extern const __m128 _mm_lookupmask_ps[16]; -/* Special Types */ - static struct TrueTy { __forceinline operator bool() const { @@ -122,377 +117,344 @@ static struct PosInfTy { static struct StepTy { } step ccl_maybe_unused; -/* Intrinsics Functions */ +#endif -# if defined(__BMI__) && defined(__GNUC__) -# ifndef _tzcnt_u32 -# define _tzcnt_u32 __tzcnt_u32 -# endif -# ifndef _tzcnt_u64 -# define _tzcnt_u64 __tzcnt_u64 -# endif -# endif - -# if defined(__LZCNT__) -# define _lzcnt_u32 __lzcnt32 -# define _lzcnt_u64 __lzcnt64 -# endif - -# if defined(_WIN32) && !defined(__MINGW32__) && !defined(__clang__) - -__forceinline int __popcnt(int in) +/* Utilities used by Neon */ +#if defined(__KERNEL_NEON__) +template type shuffle_neon(const type &a) { - return _mm_popcnt_u32(in); + if (i0 == i1 && i0 == i2 && i0 == i3) { + return vdupq_laneq_s32(a, i0); + } + static const uint8_t tbl[16] = {(i0 * 4) + 0, + (i0 * 4) + 1, + (i0 * 4) + 2, + (i0 * 4) + 3, + (i1 * 4) + 0, + (i1 * 4) + 1, + (i1 * 4) + 2, + (i1 * 4) + 3, + (i2 * 4) + 0, + (i2 * 4) + 1, + (i2 * 4) + 2, + (i2 * 4) + 3, + (i3 * 4) + 0, + (i3 * 4) + 1, + (i3 * 4) + 2, + (i3 * 4) + 3}; + + return vqtbl1q_s8(int8x16_t(a), *(int8x16_t *)tbl); } -# if !defined(_MSC_VER) -__forceinline unsigned int __popcnt(unsigned int in) +template +type shuffle_neon(const type &a, const type &b) { - return _mm_popcnt_u32(in); -} -# endif + if (&a == &b) { + static const uint8_t tbl[16] = {(i0 * 4) + 0, + (i0 * 4) + 1, + (i0 * 4) + 2, + (i0 * 4) + 3, + (i1 * 4) + 0, + (i1 * 4) + 1, + (i1 * 4) + 2, + (i1 * 4) + 3, + (i2 * 4) + 0, + (i2 * 4) + 1, + (i2 * 4) + 2, + (i2 * 4) + 3, + (i3 * 4) + 0, + (i3 * 4) + 1, + (i3 * 4) + 2, + (i3 * 4) + 3}; -# if defined(__KERNEL_64_BIT__) -__forceinline long long __popcnt(long long in) -{ - return _mm_popcnt_u64(in); -} -__forceinline size_t __popcnt(size_t in) -{ - return _mm_popcnt_u64(in); -} -# endif + return vqtbl1q_s8(int8x16_t(b), *(int8x16_t *)tbl); + } + else { -__forceinline int __bsf(int v) + static const uint8_t tbl[16] = {(i0 * 4) + 0, + (i0 * 4) + 1, + (i0 * 4) + 2, + (i0 * 4) + 3, + (i1 * 4) + 0, + (i1 * 4) + 1, + (i1 * 4) + 2, + (i1 * 4) + 3, + (i2 * 4) + 0 + 16, + (i2 * 4) + 1 + 16, + (i2 * 4) + 2 + 16, + (i2 * 4) + 3 + 16, + (i3 * 4) + 0 + 16, + (i3 * 4) + 1 + 16, + (i3 * 4) + 2 + 16, + (i3 * 4) + 3 + 16}; + + return vqtbl2q_s8((int8x16x2_t){a, b}, *(int8x16_t *)tbl); + } +} +#endif /* __KERNEL_NEON */ + +/* Intrinsics Functions + * + * For fast bit operations. */ + +#if defined(__BMI__) && defined(__GNUC__) +# ifndef _tzcnt_u32 +# define _tzcnt_u32 __tzcnt_u32 +# endif +# ifndef _tzcnt_u64 +# define _tzcnt_u64 __tzcnt_u64 +# endif +#endif + +#if defined(__LZCNT__) +# define _lzcnt_u32 __lzcnt32 +# define _lzcnt_u64 __lzcnt64 +#endif + +#if defined(_WIN32) && !defined(__MINGW32__) && !defined(__clang__) +/* Intrinsic functions on Windows. */ +__forceinline uint32_t __bsf(uint32_t v) { -# if defined(__KERNEL_AVX2__) +# if defined(__KERNEL_AVX2__) return _tzcnt_u32(v); -# else +# else unsigned long r = 0; _BitScanForward(&r, v); return r; -# endif +# endif } -__forceinline unsigned int __bsf(unsigned int v) -{ -# if defined(__KERNEL_AVX2__) - return _tzcnt_u32(v); -# else - unsigned long r = 0; - _BitScanForward(&r, v); - return r; -# endif -} - -__forceinline int __bsr(int v) +__forceinline uint32_t __bsr(uint32_t v) { unsigned long r = 0; _BitScanReverse(&r, v); return r; } -__forceinline int __btc(int v, int i) +__forceinline uint32_t __btc(uint32_t v, uint32_t i) { long r = v; _bittestandcomplement(&r, i); return r; } -__forceinline int __bts(int v, int i) +__forceinline uint32_t bitscan(uint32_t v) { - long r = v; - _bittestandset(&r, i); - return r; -} - -__forceinline int __btr(int v, int i) -{ - long r = v; - _bittestandreset(&r, i); - return r; -} - -__forceinline int bitscan(int v) -{ -# if defined(__KERNEL_AVX2__) +# if defined(__KERNEL_AVX2__) return _tzcnt_u32(v); -# else +# else return __bsf(v); -# endif +# endif } -__forceinline int clz(const int x) -{ -# if defined(__KERNEL_AVX2__) - return _lzcnt_u32(x); -# else - if (UNLIKELY(x == 0)) - return 32; - return 31 - __bsr(x); -# endif -} +# if defined(__KERNEL_64_BIT__) -__forceinline int __bscf(int &v) +__forceinline uint64_t __bsf(uint64_t v) { - int i = __bsf(v); - v &= v - 1; - return i; -} - -__forceinline unsigned int __bscf(unsigned int &v) -{ - unsigned int i = __bsf(v); - v &= v - 1; - return i; -} - -# if defined(__KERNEL_64_BIT__) - -__forceinline size_t __bsf(size_t v) -{ -# if defined(__KERNEL_AVX2__) +# if defined(__KERNEL_AVX2__) return _tzcnt_u64(v); -# else +# else unsigned long r = 0; _BitScanForward64(&r, v); return r; -# endif +# endif } -__forceinline size_t __bsr(size_t v) +__forceinline uint64_t __bsr(uint64_t v) { unsigned long r = 0; _BitScanReverse64(&r, v); return r; } -__forceinline size_t __btc(size_t v, size_t i) +__forceinline uint64_t __btc(uint64_t v, uint64_t i) { - size_t r = v; + uint64_t r = v; _bittestandcomplement64((__int64 *)&r, i); return r; } -__forceinline size_t __bts(size_t v, size_t i) +__forceinline uint64_t bitscan(uint64_t v) { - __int64 r = v; - _bittestandset64(&r, i); - return r; -} - -__forceinline size_t __btr(size_t v, size_t i) -{ - __int64 r = v; - _bittestandreset64(&r, i); - return r; -} - -__forceinline size_t bitscan(size_t v) -{ -# if defined(__KERNEL_AVX2__) -# if defined(__KERNEL_64_BIT__) +# if defined(__KERNEL_AVX2__) +# if defined(__KERNEL_64_BIT__) return _tzcnt_u64(v); -# else +# else return _tzcnt_u32(v); -# endif -# else +# endif +# else return __bsf(v); -# endif +# endif } -__forceinline size_t __bscf(size_t &v) +# endif /* __KERNEL_64_BIT__ */ + +#elif (defined(__x86_64__) || defined(__i386__)) && defined(__KERNEL_SSE2__) +/* Intrinsic functions with x86 SSE. */ + +__forceinline uint32_t __bsf(const uint32_t v) { - size_t i = __bsf(v); - v &= v - 1; - return i; -} - -# endif /* __KERNEL_64_BIT__ */ - -# else /* _WIN32 */ - -__forceinline unsigned int __popcnt(unsigned int in) -{ - int r = 0; - asm("popcnt %1,%0" : "=r"(r) : "r"(in)); - return r; -} - -__forceinline int __bsf(int v) -{ - int r = 0; + uint32_t r = 0; asm("bsf %1,%0" : "=r"(r) : "r"(v)); return r; } -__forceinline int __bsr(int v) +__forceinline uint32_t __bsr(const uint32_t v) { - int r = 0; + uint32_t r = 0; asm("bsr %1,%0" : "=r"(r) : "r"(v)); return r; } -__forceinline int __btc(int v, int i) +__forceinline uint32_t __btc(const uint32_t v, uint32_t i) { - int r = 0; + uint32_t r = 0; asm("btc %1,%0" : "=r"(r) : "r"(i), "0"(v) : "flags"); return r; } -__forceinline int __bts(int v, int i) +# if (defined(__KERNEL_64_BIT__) || defined(__APPLE__)) && \ + !(defined(__ILP32__) && defined(__x86_64__)) +__forceinline uint64_t __bsf(const uint64_t v) { - int r = 0; - asm("bts %1,%0" : "=r"(r) : "r"(i), "0"(v) : "flags"); - return r; -} - -__forceinline int __btr(int v, int i) -{ - int r = 0; - asm("btr %1,%0" : "=r"(r) : "r"(i), "0"(v) : "flags"); - return r; -} - -# if (defined(__KERNEL_64_BIT__) || defined(__APPLE__)) && \ - !(defined(__ILP32__) && defined(__x86_64__)) -__forceinline size_t __bsf(size_t v) -{ - size_t r = 0; + uint64_t r = 0; asm("bsf %1,%0" : "=r"(r) : "r"(v)); return r; } -# endif +# endif -__forceinline unsigned int __bsf(unsigned int v) +__forceinline uint64_t __bsr(const uint64_t v) { - unsigned int r = 0; - asm("bsf %1,%0" : "=r"(r) : "r"(v)); - return r; -} - -__forceinline size_t __bsr(size_t v) -{ - size_t r = 0; + uint64_t r = 0; asm("bsr %1,%0" : "=r"(r) : "r"(v)); return r; } -__forceinline size_t __btc(size_t v, size_t i) +__forceinline uint64_t __btc(const uint64_t v, const uint64_t i) { - size_t r = 0; + uint64_t r = 0; asm("btc %1,%0" : "=r"(r) : "r"(i), "0"(v) : "flags"); return r; } -__forceinline size_t __bts(size_t v, size_t i) +__forceinline uint32_t bitscan(uint32_t v) { - size_t r = 0; - asm("bts %1,%0" : "=r"(r) : "r"(i), "0"(v) : "flags"); - return r; -} - -__forceinline size_t __btr(size_t v, size_t i) -{ - size_t r = 0; - asm("btr %1,%0" : "=r"(r) : "r"(i), "0"(v) : "flags"); - return r; -} - -__forceinline int bitscan(int v) -{ -# if defined(__KERNEL_AVX2__) +# if defined(__KERNEL_AVX2__) return _tzcnt_u32(v); -# else +# else return __bsf(v); -# endif +# endif } -__forceinline unsigned int bitscan(unsigned int v) +# if (defined(__KERNEL_64_BIT__) || defined(__APPLE__)) && \ + !(defined(__ILP32__) && defined(__x86_64__)) +__forceinline uint64_t bitscan(uint64_t v) { -# if defined(__KERNEL_AVX2__) - return _tzcnt_u32(v); -# else - return __bsf(v); -# endif -} - -# if (defined(__KERNEL_64_BIT__) || defined(__APPLE__)) && \ - !(defined(__ILP32__) && defined(__x86_64__)) -__forceinline size_t bitscan(size_t v) -{ -# if defined(__KERNEL_AVX2__) -# if defined(__KERNEL_64_BIT__) +# if defined(__KERNEL_AVX2__) +# if defined(__KERNEL_64_BIT__) return _tzcnt_u64(v); -# else +# else return _tzcnt_u32(v); -# endif -# else +# endif +# else return __bsf(v); -# endif +# endif } -# endif +# endif -__forceinline int clz(const int x) +#else +/* Intrinsic functions fallback for arbitrary processor. */ +__forceinline uint32_t __bsf(const uint32_t x) { -# if defined(__KERNEL_AVX2__) - return _lzcnt_u32(x); -# else - if (UNLIKELY(x == 0)) - return 32; - return 31 - __bsr(x); -# endif + for (int i = 0; i < 32; i++) { + if (x & (1U << i)) + return i; + } + return 32; } -__forceinline int __bscf(int &v) +__forceinline uint32_t __bsr(const uint32_t x) { - int i = bitscan(v); -# if defined(__KERNEL_AVX2__) - v &= v - 1; -# else - v = __btc(v, i); -# endif - return i; + for (int i = 0; i < 32; i++) { + if (x & (1U << (31 - i))) + return (31 - i); + } + return 32; } -__forceinline unsigned int __bscf(unsigned int &v) +__forceinline uint32_t __btc(const uint32_t x, const uint32_t bit) { - unsigned int i = bitscan(v); - v &= v - 1; - return i; + uint32_t mask = 1U << bit; + return x & (~mask); } -# if (defined(__KERNEL_64_BIT__) || defined(__APPLE__)) && \ - !(defined(__ILP32__) && defined(__x86_64__)) -__forceinline size_t __bscf(size_t &v) +__forceinline uint32_t __bsf(const uint64_t x) { - size_t i = bitscan(v); -# if defined(__KERNEL_AVX2__) - v &= v - 1; -# else - v = __btc(v, i); -# endif - return i; + for (int i = 0; i < 64; i++) { + if (x & (1UL << i)) + return i; + } + return 64; } -# endif -# endif /* _WIN32 */ +__forceinline uint32_t __bsr(const uint64_t x) +{ + for (int i = 0; i < 64; i++) { + if (x & (1UL << (63 - i))) + return (63 - i); + } + return 64; +} + +__forceinline uint64_t __btc(const uint64_t x, const uint32_t bit) +{ + uint64_t mask = 1UL << bit; + return x & (~mask); +} + +__forceinline uint32_t bitscan(uint32_t value) +{ + assert(value != 0); + uint32_t bit = 0; + while ((value & (1 << bit)) == 0) { + ++bit; + } + return bit; +} + +__forceinline uint64_t bitscan(uint64_t value) +{ + assert(value != 0); + uint64_t bit = 0; + while ((value & (1 << bit)) == 0) { + ++bit; + } + return bit; +} + +#endif /* Intrinsics */ + +/* SSE compatibility. + * + * Various utilities to smooth over differences between SSE versions and + * implementations. */ +#ifdef __KERNEL_SSE2__ /* Test __KERNEL_SSE41__ for MSVC which does not define __SSE4_1__, and test * __SSE4_1__ to avoid OpenImageIO conflicts with our emulation macros on other * platforms when compiling code outside the kernel. */ -# if !(defined(__KERNEL_SSE41__) || defined(__SSE4_1__) || defined(__SSE4_2__)) +# if !(defined(__KERNEL_SSE41__) || defined(__SSE4_1__) || defined(__SSE4_2__)) /* Emulation of SSE4 functions with SSE2 */ -# define _MM_FROUND_TO_NEAREST_INT 0x00 -# define _MM_FROUND_TO_NEG_INF 0x01 -# define _MM_FROUND_TO_POS_INF 0x02 -# define _MM_FROUND_TO_ZERO 0x03 -# define _MM_FROUND_CUR_DIRECTION 0x04 +# define _MM_FROUND_TO_NEAREST_INT 0x00 +# define _MM_FROUND_TO_NEG_INF 0x01 +# define _MM_FROUND_TO_POS_INF 0x02 +# define _MM_FROUND_TO_ZERO 0x03 +# define _MM_FROUND_CUR_DIRECTION 0x04 -# undef _mm_blendv_ps -# define _mm_blendv_ps _mm_blendv_ps_emu +# undef _mm_blendv_ps +# define _mm_blendv_ps _mm_blendv_ps_emu __forceinline __m128 _mm_blendv_ps_emu(__m128 value, __m128 input, __m128 mask) { __m128i isignmask = _mm_set1_epi32(0x80000000); @@ -503,35 +465,36 @@ __forceinline __m128 _mm_blendv_ps_emu(__m128 value, __m128 input, __m128 mask) return _mm_or_ps(_mm_and_ps(cmpmask, input), _mm_andnot_ps(cmpmask, value)); } -# undef _mm_blend_ps -# define _mm_blend_ps _mm_blend_ps_emu +# undef _mm_blend_ps +# define _mm_blend_ps _mm_blend_ps_emu __forceinline __m128 _mm_blend_ps_emu(__m128 value, __m128 input, const int mask) { assert(mask < 0x10); return _mm_blendv_ps(value, input, _mm_lookupmask_ps[mask]); } -# undef _mm_blendv_epi8 -# define _mm_blendv_epi8 _mm_blendv_epi8_emu +# undef _mm_blendv_epi8 +# define _mm_blendv_epi8 _mm_blendv_epi8_emu __forceinline __m128i _mm_blendv_epi8_emu(__m128i value, __m128i input, __m128i mask) { return _mm_or_si128(_mm_and_si128(mask, input), _mm_andnot_si128(mask, value)); } -# undef _mm_min_epi32 -# define _mm_min_epi32 _mm_min_epi32_emu +# undef _mm_min_epi32 +# define _mm_min_epi32 _mm_min_epi32_emu __forceinline __m128i _mm_min_epi32_emu(__m128i value, __m128i input) { return _mm_blendv_epi8(input, value, _mm_cmplt_epi32(value, input)); } -# undef _mm_max_epi32 -# define _mm_max_epi32 _mm_max_epi32_emu +# undef _mm_max_epi32 +# define _mm_max_epi32 _mm_max_epi32_emu __forceinline __m128i _mm_max_epi32_emu(__m128i value, __m128i input) { return _mm_blendv_epi8(value, input, _mm_cmplt_epi32(value, input)); } +# ifndef __KERNEL_NEON__ # undef _mm_extract_epi32 # define _mm_extract_epi32 _mm_extract_epi32_emu __forceinline int _mm_extract_epi32_emu(__m128i input, const int index) @@ -550,9 +513,10 @@ __forceinline int _mm_extract_epi32_emu(__m128i input, const int index) return 0; } } +# endif -# undef _mm_insert_epi32 -# define _mm_insert_epi32 _mm_insert_epi32_emu +# undef _mm_insert_epi32 +# define _mm_insert_epi32 _mm_insert_epi32_emu __forceinline __m128i _mm_insert_epi32_emu(__m128i value, int input, const int index) { assert(index >= 0 && index < 4); @@ -560,8 +524,8 @@ __forceinline __m128i _mm_insert_epi32_emu(__m128i value, int input, const int i return value; } -# undef _mm_insert_ps -# define _mm_insert_ps _mm_insert_ps_emu +# undef _mm_insert_ps +# define _mm_insert_ps _mm_insert_ps_emu __forceinline __m128 _mm_insert_ps_emu(__m128 value, __m128 input, const int index) { assert(index < 0x100); @@ -569,8 +533,8 @@ __forceinline __m128 _mm_insert_ps_emu(__m128 value, __m128 input, const int ind return _mm_andnot_ps(_mm_lookupmask_ps[index & 0xf], value); } -# undef _mm_round_ps -# define _mm_round_ps _mm_round_ps_emu +# undef _mm_round_ps +# define _mm_round_ps _mm_round_ps_emu __forceinline __m128 _mm_round_ps_emu(__m128 value, const int flags) { switch (flags) { @@ -586,51 +550,23 @@ __forceinline __m128 _mm_round_ps_emu(__m128 value, const int flags) return value; } -# endif /* !(defined(__KERNEL_SSE41__) || defined(__SSE4_1__) || defined(__SSE4_2__)) */ +# endif /* !(defined(__KERNEL_SSE41__) || defined(__SSE4_1__) || defined(__SSE4_2__)) */ /* Older GCC versions do not have _mm256_cvtss_f32 yet, so define it ourselves. * _mm256_castps256_ps128 generates no instructions so this is just as efficient. */ -# if defined(__KERNEL_AVX__) || defined(__KERNEL_AVX2__) -# undef _mm256_cvtss_f32 -# define _mm256_cvtss_f32(a) (_mm_cvtss_f32(_mm256_castps256_ps128(a))) -# endif +# if defined(__KERNEL_AVX__) || defined(__KERNEL_AVX2__) +# undef _mm256_cvtss_f32 +# define _mm256_cvtss_f32(a) (_mm_cvtss_f32(_mm256_castps256_ps128(a))) +# endif -# else /* __KERNEL_SSE2__ */ - -/* This section is for utility functions which operates on non-register data - * which might be used from a non-vectorized code. - */ - -ccl_device_inline int bitscan(int value) -{ - assert(value != 0); - int bit = 0; - while ((value & (1 << bit)) == 0) { - ++bit; - } - return bit; -} - -ccl_device_inline int __bsr(int value) -{ - assert(value != 0); - int bit = 0; - while (value >>= 1) { - ++bit; - } - return bit; -} - -# endif /* __KERNEL_SSE2__ */ +#endif /* __KERNEL_SSE2__ */ /* quiet unused define warnings */ -# if defined(__KERNEL_SSE2__) || defined(__KERNEL_SSE3__) || defined(__KERNEL_SSSE3__) || \ - defined(__KERNEL_SSE41__) || defined(__KERNEL_AVX__) || defined(__KERNEL_AVX2__) +#if defined(__KERNEL_SSE2__) || defined(__KERNEL_SSE3__) || defined(__KERNEL_SSSE3__) || \ + defined(__KERNEL_SSE41__) || defined(__KERNEL_AVX__) || defined(__KERNEL_AVX2__) /* do nothing */ -# endif +#endif CCL_NAMESPACE_END -#endif /* __KERNEL_GPU__ */ - #endif /* __UTIL_SIMD_TYPES_H__ */ diff --git a/intern/cycles/util/util_sseb.h b/intern/cycles/util/util_sseb.h index 56f8f676ba1..1488da46b09 100644 --- a/intern/cycles/util/util_sseb.h +++ b/intern/cycles/util/util_sseb.h @@ -197,9 +197,14 @@ __forceinline const sseb unpackhi(const sseb &a, const sseb &b) template __forceinline const sseb shuffle(const sseb &a) { +# ifdef __KERNEL_NEON__ + return shuffle_neon(a); +# else return _mm_castsi128_ps(_mm_shuffle_epi32(a, _MM_SHUFFLE(i3, i2, i1, i0))); +# endif } +# ifndef __KERNEL_NEON__ template<> __forceinline const sseb shuffle<0, 1, 0, 1>(const sseb &a) { return _mm_movelh_ps(a, a); @@ -209,13 +214,19 @@ template<> __forceinline const sseb shuffle<2, 3, 2, 3>(const sseb &a) { return _mm_movehl_ps(a, a); } +# endif template __forceinline const sseb shuffle(const sseb &a, const sseb &b) { +# ifdef __KERNEL_NEON__ + return shuffle_neon(a, b); +# else return _mm_shuffle_ps(a, b, _MM_SHUFFLE(i3, i2, i1, i0)); +# endif } +# ifndef __KERNEL_NEON__ template<> __forceinline const sseb shuffle<0, 1, 0, 1>(const sseb &a, const sseb &b) { return _mm_movelh_ps(a, b); @@ -225,8 +236,9 @@ template<> __forceinline const sseb shuffle<2, 3, 2, 3>(const sseb &a, const sse { return _mm_movehl_ps(b, a); } +# endif -# if defined(__KERNEL_SSE3__) +# if defined(__KERNEL_SSE3__) && !defined(__KERNEL_NEON__) template<> __forceinline const sseb shuffle<0, 0, 2, 2>(const sseb &a) { return _mm_moveldup_ps(a); @@ -241,7 +253,16 @@ template<> __forceinline const sseb shuffle<1, 1, 3, 3>(const sseb &a) template __forceinline const sseb insert(const sseb &a, const sseb &b) { +# ifdef __KERNEL_NEON__ + sseb res = a; + if (clr) + res[dst] = 0; + else + res[dst] = b[src]; + return res; +# else return _mm_insert_ps(a, b, (dst << 4) | (src << 6) | clr); +# endif } template __forceinline const sseb insert(const sseb &a, const sseb &b) { @@ -258,12 +279,18 @@ template __forceinline const sseb insert(const sseb &a, const bool b //////////////////////////////////////////////////////////////////////////////// # if defined(__KERNEL_SSE41__) -__forceinline size_t popcnt(const sseb &a) +__forceinline uint32_t popcnt(const sseb &a) { - return __popcnt(_mm_movemask_ps(a)); +# if defined(__KERNEL_NEON__) + const int32x4_t mask = {1, 1, 1, 1}; + int32x4_t t = vandq_s32(a.m128, mask); + return vaddvq_s32(t); +# else + return _mm_popcnt_u32(_mm_movemask_ps(a)); +# endif } # else -__forceinline size_t popcnt(const sseb &a) +__forceinline uint32_t popcnt(const sseb &a) { return bool(a[0]) + bool(a[1]) + bool(a[2]) + bool(a[3]); } @@ -271,26 +298,46 @@ __forceinline size_t popcnt(const sseb &a) __forceinline bool reduce_and(const sseb &a) { +# if defined(__KERNEL_NEON__) + return vaddvq_s32(a.m128) == -4; +# else return _mm_movemask_ps(a) == 0xf; +# endif } __forceinline bool reduce_or(const sseb &a) { +# if defined(__KERNEL_NEON__) + return vaddvq_s32(a.m128) != 0x0; +# else return _mm_movemask_ps(a) != 0x0; +# endif } __forceinline bool all(const sseb &b) { +# if defined(__KERNEL_NEON__) + return vaddvq_s32(b.m128) == -4; +# else return _mm_movemask_ps(b) == 0xf; +# endif } __forceinline bool any(const sseb &b) { +# if defined(__KERNEL_NEON__) + return vaddvq_s32(b.m128) != 0x0; +# else return _mm_movemask_ps(b) != 0x0; +# endif } __forceinline bool none(const sseb &b) { +# if defined(__KERNEL_NEON__) + return vaddvq_s32(b.m128) == 0x0; +# else return _mm_movemask_ps(b) == 0x0; +# endif } -__forceinline size_t movemask(const sseb &a) +__forceinline uint32_t movemask(const sseb &a) { return _mm_movemask_ps(a); } diff --git a/intern/cycles/util/util_ssef.h b/intern/cycles/util/util_ssef.h index e9f0efb4efb..d039b50a7d2 100644 --- a/intern/cycles/util/util_ssef.h +++ b/intern/cycles/util/util_ssef.h @@ -303,41 +303,46 @@ __forceinline ssef maxi(const ssef &a, const ssef &b) /// Ternary Operators //////////////////////////////////////////////////////////////////////////////// -# if defined(__KERNEL_AVX2__) __forceinline const ssef madd(const ssef &a, const ssef &b, const ssef &c) { +# if defined(__KERNEL_NEON__) + return vfmaq_f32(c, a, b); +# elif defined(__KERNEL_AVX2__) return _mm_fmadd_ps(a, b, c); -} -__forceinline const ssef msub(const ssef &a, const ssef &b, const ssef &c) -{ - return _mm_fmsub_ps(a, b, c); -} -__forceinline const ssef nmadd(const ssef &a, const ssef &b, const ssef &c) -{ - return _mm_fnmadd_ps(a, b, c); -} -__forceinline const ssef nmsub(const ssef &a, const ssef &b, const ssef &c) -{ - return _mm_fnmsub_ps(a, b, c); -} # else -__forceinline const ssef madd(const ssef &a, const ssef &b, const ssef &c) -{ return a * b + c; +# endif } __forceinline const ssef msub(const ssef &a, const ssef &b, const ssef &c) { +# if defined(__KERNEL_NEON__) + return vfmaq_f32(vnegq_f32(c), a, b); +# elif defined(__KERNEL_AVX2__) + return _mm_fmsub_ps(a, b, c); +# else return a * b - c; +# endif } __forceinline const ssef nmadd(const ssef &a, const ssef &b, const ssef &c) { +# if defined(__KERNEL_NEON__) + return vfmsq_f32(c, a, b); +# elif defined(__KERNEL_AVX2__) + return _mm_fnmadd_ps(a, b, c); +# else return c - a * b; +# endif } __forceinline const ssef nmsub(const ssef &a, const ssef &b, const ssef &c) { +# if defined(__KERNEL_NEON__) + return vfmsq_f32(vnegq_f32(c), a, b); +# elif defined(__KERNEL_AVX2__) + return _mm_fnmsub_ps(a, b, c); +# else return -a * b - c; -} # endif +} //////////////////////////////////////////////////////////////////////////////// /// Assignment Operators @@ -496,27 +501,51 @@ __forceinline const ssef select(const int mask, const ssef &t, const ssef &f) # if defined(__KERNEL_SSE41__) __forceinline const ssef round_even(const ssef &a) { +# ifdef __KERNEL_NEON__ + return vrndnq_f32(a); +# else return _mm_round_ps(a, _MM_FROUND_TO_NEAREST_INT); +# endif } __forceinline const ssef round_down(const ssef &a) { +# ifdef __KERNEL_NEON__ + return vrndmq_f32(a); +# else return _mm_round_ps(a, _MM_FROUND_TO_NEG_INF); +# endif } __forceinline const ssef round_up(const ssef &a) { +# ifdef __KERNEL_NEON__ + return vrndpq_f32(a); +# else return _mm_round_ps(a, _MM_FROUND_TO_POS_INF); +# endif } __forceinline const ssef round_zero(const ssef &a) { +# ifdef __KERNEL_NEON__ + return vrndq_f32(a); +# else return _mm_round_ps(a, _MM_FROUND_TO_ZERO); +# endif } __forceinline const ssef floor(const ssef &a) { +# ifdef __KERNEL_NEON__ + return vrndnq_f32(a); +# else return _mm_round_ps(a, _MM_FROUND_TO_NEG_INF); +# endif } __forceinline const ssef ceil(const ssef &a) { +# ifdef __KERNEL_NEON__ + return vrndpq_f32(a); +# else return _mm_round_ps(a, _MM_FROUND_TO_POS_INF); +# endif } # endif @@ -566,7 +595,11 @@ __forceinline ssef unpackhi(const ssef &a, const ssef &b) template __forceinline const ssef shuffle(const ssef &b) { +# ifdef __KERNEL_NEON__ + return shuffle_neon(b.m128); +# else return _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(b), _MM_SHUFFLE(i3, i2, i1, i0))); +# endif } template<> __forceinline const ssef shuffle<0, 1, 0, 1>(const ssef &a) @@ -582,14 +615,23 @@ template<> __forceinline const ssef shuffle<2, 3, 2, 3>(const ssef &a) template __forceinline const ssef shuffle(const ssef &a, const ssef &b) { +# ifdef __KERNEL_NEON__ + return shuffle_neon(a, b); +# else return _mm_shuffle_ps(a, b, _MM_SHUFFLE(i3, i2, i1, i0)); +# endif } template __forceinline const ssef shuffle(const ssef &a, const ssef &b) { +# ifdef __KERNEL_NEON__ + return shuffle(a, b); +# else return _mm_shuffle_ps(a, b, _MM_SHUFFLE(i0, i0, i0, i0)); +# endif } +# ifndef __KERNEL_NEON__ template<> __forceinline const ssef shuffle<0, 1, 0, 1>(const ssef &a, const ssef &b) { return _mm_movelh_ps(a, b); @@ -599,6 +641,7 @@ template<> __forceinline const ssef shuffle<2, 3, 2, 3>(const ssef &a, const sse { return _mm_movehl_ps(b, a); } +# endif # if defined(__KERNEL_SSSE3__) __forceinline const ssef shuffle8(const ssef &a, const ssei &shuf) @@ -643,7 +686,16 @@ template<> __forceinline float extract<0>(const ssef &a) template __forceinline const ssef insert(const ssef &a, const ssef &b) { +# ifdef __KERNEL_NEON__ + ssef res = a; + if (clr) + res[dst] = 0; + else + res[dst] = b[src]; + return res; +# else return _mm_insert_ps(a, b, (dst << 4) | (src << 6) | clr); +# endif } template __forceinline const ssef insert(const ssef &a, const ssef &b) { @@ -703,54 +755,78 @@ __forceinline void transpose( __forceinline const ssef vreduce_min(const ssef &v) { +# ifdef __KERNEL_NEON__ + return vdupq_n_f32(vminvq_f32(v)); +# else ssef h = min(shuffle<1, 0, 3, 2>(v), v); return min(shuffle<2, 3, 0, 1>(h), h); +# endif } __forceinline const ssef vreduce_max(const ssef &v) { +# ifdef __KERNEL_NEON__ + return vdupq_n_f32(vmaxvq_f32(v)); +# else ssef h = max(shuffle<1, 0, 3, 2>(v), v); return max(shuffle<2, 3, 0, 1>(h), h); +# endif } __forceinline const ssef vreduce_add(const ssef &v) { +# ifdef __KERNEL_NEON__ + return vdupq_n_f32(vaddvq_f32(v)); +# else ssef h = shuffle<1, 0, 3, 2>(v) + v; return shuffle<2, 3, 0, 1>(h) + h; +# endif } __forceinline float reduce_min(const ssef &v) { +# ifdef __KERNEL_NEON__ + return vminvq_f32(v); +# else return _mm_cvtss_f32(vreduce_min(v)); +# endif } __forceinline float reduce_max(const ssef &v) { +# ifdef __KERNEL_NEON__ + return vmaxvq_f32(v); +# else return _mm_cvtss_f32(vreduce_max(v)); +# endif } __forceinline float reduce_add(const ssef &v) { +# ifdef __KERNEL_NEON__ + return vaddvq_f32(v); +# else return _mm_cvtss_f32(vreduce_add(v)); +# endif } -__forceinline size_t select_min(const ssef &v) +__forceinline uint32_t select_min(const ssef &v) { return __bsf(movemask(v == vreduce_min(v))); } -__forceinline size_t select_max(const ssef &v) +__forceinline uint32_t select_max(const ssef &v) { return __bsf(movemask(v == vreduce_max(v))); } -__forceinline size_t select_min(const sseb &valid, const ssef &v) +__forceinline uint32_t select_min(const sseb &valid, const ssef &v) { const ssef a = select(valid, v, ssef(pos_inf)); return __bsf(movemask(valid & (a == vreduce_min(a)))); } -__forceinline size_t select_max(const sseb &valid, const ssef &v) +__forceinline uint32_t select_max(const sseb &valid, const ssef &v) { const ssef a = select(valid, v, ssef(neg_inf)); return __bsf(movemask(valid & (a == vreduce_max(a)))); } -__forceinline size_t movemask(const ssef &a) +__forceinline uint32_t movemask(const ssef &a) { return _mm_movemask_ps(a); } @@ -942,14 +1018,14 @@ ccl_device_inline const ssef shuffle_swap(const ssef &a, shuffle_swap_t shuf) { /* shuffle value must be a constant, so we need to branch */ if (shuf) - return ssef(_mm_shuffle_ps(a.m128, a.m128, _MM_SHUFFLE(1, 0, 3, 2))); + return shuffle<1, 0, 3, 2>(a); else - return ssef(_mm_shuffle_ps(a.m128, a.m128, _MM_SHUFFLE(3, 2, 1, 0))); + return shuffle<3, 2, 1, 0>(a); } # endif -# ifdef __KERNEL_SSE41__ +# if defined(__KERNEL_SSE41__) && !defined(__KERNEL_NEON__) ccl_device_inline void gen_idirsplat_swap(const ssef &pn, const shuffle_swap_t &shuf_identity, diff --git a/intern/cycles/util/util_ssei.h b/intern/cycles/util/util_ssei.h index e2bf81310cc..3ec69ab3700 100644 --- a/intern/cycles/util/util_ssei.h +++ b/intern/cycles/util/util_ssei.h @@ -445,14 +445,22 @@ __forceinline ssei unpackhi(const ssei &a, const ssei &b) template __forceinline const ssei shuffle(const ssei &a) { +# ifdef __KERNEL_NEON__ + return shuffle_neon(a); +# else return _mm_shuffle_epi32(a, _MM_SHUFFLE(i3, i2, i1, i0)); +# endif } template __forceinline const ssei shuffle(const ssei &a, const ssei &b) { +# ifdef __KERNEL_NEON__ + return shuffle_neon(a, b); +# else return _mm_castps_si128( _mm_shuffle_ps(_mm_castsi128_ps(a), _mm_castsi128_ps(b), _MM_SHUFFLE(i3, i2, i1, i0))); +# endif } template __forceinline const ssei shuffle(const ssei &b) @@ -505,32 +513,44 @@ __forceinline const ssei vreduce_add(const ssei &v) __forceinline int reduce_min(const ssei &v) { +# ifdef __KERNEL_NEON__ + return vminvq_s32(v); +# else return extract<0>(vreduce_min(v)); +# endif } __forceinline int reduce_max(const ssei &v) { +# ifdef __KERNEL_NEON__ + return vmaxvq_s32(v); +# else return extract<0>(vreduce_max(v)); +# endif } __forceinline int reduce_add(const ssei &v) { +# ifdef __KERNEL_NEON__ + return vaddvq_s32(v); +# else return extract<0>(vreduce_add(v)); +# endif } -__forceinline size_t select_min(const ssei &v) +__forceinline uint32_t select_min(const ssei &v) { return __bsf(movemask(v == vreduce_min(v))); } -__forceinline size_t select_max(const ssei &v) +__forceinline uint32_t select_max(const ssei &v) { return __bsf(movemask(v == vreduce_max(v))); } -__forceinline size_t select_min(const sseb &valid, const ssei &v) +__forceinline uint32_t select_min(const sseb &valid, const ssei &v) { const ssei a = select(valid, v, ssei((int)pos_inf)); return __bsf(movemask(valid & (a == vreduce_min(a)))); } -__forceinline size_t select_max(const sseb &valid, const ssei &v) +__forceinline uint32_t select_max(const sseb &valid, const ssei &v) { const ssei a = select(valid, v, ssei((int)neg_inf)); return __bsf(movemask(valid & (a == vreduce_max(a)))); diff --git a/intern/cycles/util/util_string.h b/intern/cycles/util/util_string.h index 6b6f493bd94..f2272819b2f 100644 --- a/intern/cycles/util/util_string.h +++ b/intern/cycles/util/util_string.h @@ -52,7 +52,7 @@ string string_remove_trademark(const string &s); string string_from_bool(const bool var); string to_string(const char *str); -/* Wide char strings are only used on Windows to deal with non-ascii +/* Wide char strings are only used on Windows to deal with non-ASCII * characters in file names and such. No reason to use such strings * for something else at this moment. * diff --git a/intern/cycles/util/util_tbb.h b/intern/cycles/util/util_tbb.h index 168bd5db961..73e0f92d19c 100644 --- a/intern/cycles/util/util_tbb.h +++ b/intern/cycles/util/util_tbb.h @@ -21,11 +21,14 @@ * WIN32_LEAN_AND_MEAN and similar are defined beforehand. */ #include "util_windows.h" -#define TBB_SUPPRESS_DEPRECATED_MESSAGES 1 -#include +#include +#include +#include +#include #if TBB_INTERFACE_VERSION_MAJOR >= 10 # define WITH_TBB_GLOBAL_CONTROL +# include #endif CCL_NAMESPACE_BEGIN diff --git a/intern/cycles/util/util_transform.h b/intern/cycles/util/util_transform.h index d8bbd389aa6..f79eac4cbcf 100644 --- a/intern/cycles/util/util_transform.h +++ b/intern/cycles/util/util_transform.h @@ -186,6 +186,12 @@ ccl_device_inline Transform make_transform_frame(float3 N) #ifndef __KERNEL_GPU__ +ccl_device_inline Transform transform_zero() +{ + Transform zero = {zero_float4(), zero_float4(), zero_float4()}; + return zero; +} + ccl_device_inline Transform operator*(const Transform a, const Transform b) { float4 c_x = make_float4(b.x.x, b.y.x, b.z.x, 0.0f); diff --git a/intern/cycles/util/util_types.h b/intern/cycles/util/util_types.h index fc80fa9696c..87358877e3c 100644 --- a/intern/cycles/util/util_types.h +++ b/intern/cycles/util/util_types.h @@ -23,7 +23,7 @@ /* Standard Integer Types */ -#if !defined(__KERNEL_GPU__) && !defined(_WIN32) +#if !defined(__KERNEL_GPU__) # include #endif @@ -57,25 +57,6 @@ typedef unsigned long uint64_t; #endif #ifndef __KERNEL_GPU__ -# ifdef _WIN32 -typedef signed char int8_t; -typedef unsigned char uint8_t; - -typedef signed short int16_t; -typedef unsigned short uint16_t; - -typedef signed int int32_t; -typedef unsigned int uint32_t; - -typedef long long int64_t; -typedef unsigned long long uint64_t; -# ifdef __KERNEL_64_BIT__ -typedef int64_t ssize_t; -# else -typedef int32_t ssize_t; -# endif -# endif /* _WIN32 */ - /* Generic Memory Pointer */ typedef uint64_t device_ptr; diff --git a/intern/ghost/GHOST_C-api.h b/intern/ghost/GHOST_C-api.h index 2bc73f7eb22..d79111b742f 100644 --- a/intern/ghost/GHOST_C-api.h +++ b/intern/ghost/GHOST_C-api.h @@ -25,6 +25,8 @@ #include "GHOST_Types.h" +#include + #ifdef __cplusplus extern "C" { #endif @@ -160,6 +162,7 @@ extern void GHOST_GetAllDisplayDimensions(GHOST_SystemHandle systemhandle, * The new window is added to the list of windows managed. * Never explicitly delete the window, use disposeWindow() instead. * \param systemhandle: The handle to the system. + * \param parentWindow: Handle of parent (or owner) window, or NULL * \param title: The name of the window. * (displayed in the title bar of the window if the OS supports it). * \param left: The coordinate of the left edge of the window. @@ -167,31 +170,23 @@ extern void GHOST_GetAllDisplayDimensions(GHOST_SystemHandle systemhandle, * \param width: The width the window. * \param height: The height the window. * \param state: The state of the window when opened. + * \param is_dialog: Stay on top of parent window, no icon in taskbar, can't be minimized. * \param type: The type of drawing context installed in this window. * \param glSettings: Misc OpenGL options. * \return A handle to the new window ( == NULL if creation failed). */ extern GHOST_WindowHandle GHOST_CreateWindow(GHOST_SystemHandle systemhandle, + GHOST_WindowHandle parent_windowhandle, const char *title, GHOST_TInt32 left, GHOST_TInt32 top, GHOST_TUns32 width, GHOST_TUns32 height, GHOST_TWindowState state, + bool is_dialog, GHOST_TDrawingContextType type, GHOST_GLSettings glSettings); -extern GHOST_WindowHandle GHOST_CreateDialogWindow(GHOST_SystemHandle systemhandle, - GHOST_WindowHandle parent_windowhandle, - const char *title, - GHOST_TInt32 left, - GHOST_TInt32 top, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - GHOST_TDrawingContextType type, - GHOST_GLSettings glSettings); - /** * Create a new offscreen context. * Never explicitly delete the context, use disposeContext() instead. diff --git a/intern/ghost/intern/GHOST_C-api.cpp b/intern/ghost/intern/GHOST_C-api.cpp index e4bb908fec8..af65e1cd4d2 100644 --- a/intern/ghost/intern/GHOST_C-api.cpp +++ b/intern/ghost/intern/GHOST_C-api.cpp @@ -153,34 +153,19 @@ GHOST_TSuccess GHOST_DisposeOpenGLContext(GHOST_SystemHandle systemhandle, } GHOST_WindowHandle GHOST_CreateWindow(GHOST_SystemHandle systemhandle, + GHOST_WindowHandle parent_windowhandle, const char *title, GHOST_TInt32 left, GHOST_TInt32 top, GHOST_TUns32 width, GHOST_TUns32 height, GHOST_TWindowState state, + bool is_dialog, GHOST_TDrawingContextType type, GHOST_GLSettings glSettings) { GHOST_ISystem *system = (GHOST_ISystem *)systemhandle; - return (GHOST_WindowHandle)system->createWindow( - title, left, top, width, height, state, type, glSettings, false, false); -} - -GHOST_WindowHandle GHOST_CreateDialogWindow(GHOST_SystemHandle systemhandle, - GHOST_WindowHandle parent_windowhandle, - const char *title, - GHOST_TInt32 left, - GHOST_TInt32 top, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - GHOST_TDrawingContextType type, - GHOST_GLSettings glSettings) -{ - GHOST_ISystem *system = (GHOST_ISystem *)systemhandle; - return (GHOST_WindowHandle)system->createWindow(title, left, top, @@ -190,7 +175,7 @@ GHOST_WindowHandle GHOST_CreateDialogWindow(GHOST_SystemHandle systemhandle, type, glSettings, false, - true, + is_dialog, (GHOST_IWindow *)parent_windowhandle); } diff --git a/intern/ghost/intern/GHOST_ImeWin32.h b/intern/ghost/intern/GHOST_ImeWin32.h index cbef0f0edc4..cd13ee1a8ae 100644 --- a/intern/ghost/intern/GHOST_ImeWin32.h +++ b/intern/ghost/intern/GHOST_ImeWin32.h @@ -365,7 +365,7 @@ class GHOST_ImeWin32 { * MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED); * * "ja-JP" (0x0411) * MAKELANGID(LANG_JAPANESE, SUBLANG_JAPANESE_JAPAN), etc. - * (See for other available values.) + * (See `winnt.h` for other available values.) * This Language ID is used for processing language-specific operations in * IME functions. */ diff --git a/intern/ghost/intern/GHOST_System.h b/intern/ghost/intern/GHOST_System.h index 279f90b9641..2a7123b293e 100644 --- a/intern/ghost/intern/GHOST_System.h +++ b/intern/ghost/intern/GHOST_System.h @@ -239,7 +239,7 @@ class GHOST_System : public GHOST_ISystem { * Set which tablet API to use. Only affects Windows, other platforms have a single API. * \param api: Enum indicating which API to use. */ - virtual void setTabletAPI(GHOST_TTabletAPI api); + void setTabletAPI(GHOST_TTabletAPI api); GHOST_TTabletAPI getTabletAPI(void); #ifdef WITH_INPUT_NDOF diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm index d7dbfbe8813..f42d4af109a 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.mm +++ b/intern/ghost/intern/GHOST_SystemCocoa.mm @@ -1286,7 +1286,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleDraggingEvent(GHOST_TEventType eventType return GHOST_kFailure; } - /* Then get Alpha values by getting the RGBA image (that is premultiplied btw) */ + /* Then get Alpha values by getting the RGBA image (that is pre-multiplied BTW) */ blBitmapFormatImageRGBA = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:imgSize.width diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index b71b6b9e170..430e8216ae3 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -225,9 +225,6 @@ GHOST_SystemWin32::GHOST_SystemWin32() #ifdef WITH_INPUT_NDOF m_ndofManager = new GHOST_NDOFManagerWin32(*this); #endif - - getCursorPosition(m_mousePosX, m_mousePosY); - m_mouseTimestamp = ::GetTickCount(); } GHOST_SystemWin32::~GHOST_SystemWin32() @@ -237,11 +234,6 @@ GHOST_SystemWin32::~GHOST_SystemWin32() toggleConsole(1); } -GHOST_TUns64 GHOST_SystemWin32::millisSinceStart(__int64 ms) const -{ - return (GHOST_TUns64)(ms - m_start * 1000 / m_freq); -} - GHOST_TUns64 GHOST_SystemWin32::performanceCounterToMillis(__int64 perf_ticks) const { // Calculate the time passed since system initialization. @@ -536,20 +528,7 @@ GHOST_TSuccess GHOST_SystemWin32::setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 { if (!::GetActiveWindow()) return GHOST_kFailure; - - INPUT input; - input.type = INPUT_MOUSE; - input.mi.mouseData = 0; - input.mi.time = ::GetTickCount(); - /* Map from virtual screen to 0-65535 inclusive. */ - input.mi.dx = (x - GetSystemMetrics(SM_XVIRTUALSCREEN)) * 65535 / - (GetSystemMetrics(SM_CXVIRTUALSCREEN) - 1); - input.mi.dy = (y - GetSystemMetrics(SM_YVIRTUALSCREEN)) * 65535 / - (GetSystemMetrics(SM_CYVIRTUALSCREEN) - 1); - input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_VIRTUALDESK; - SendInput(1, &input, sizeof(input)); - - return GHOST_kSuccess; + return ::SetCursorPos(x, y) == TRUE ? GHOST_kSuccess : GHOST_kFailure; } GHOST_TSuccess GHOST_SystemWin32::getModifierKeys(GHOST_ModifierKeys &keys) const @@ -955,99 +934,15 @@ GHOST_EventButton *GHOST_SystemWin32::processButtonEvent(GHOST_TEventType type, { GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem(); - GHOST_TabletData td = window->m_tabletInRange ? window->getLastTabletData() : - GHOST_TABLET_DATA_NONE; - - /* Move mouse to button event position. */ - if (!window->m_tabletInRange) { - processCursorEvent(window); + if (type == GHOST_kEventButtonDown) { + window->updateMouseCapture(MousePressed); } - else { - /* Tablet should be handling in between mouse moves, only move to event position. */ - DWORD msgPos = ::GetMessagePos(); - int msgPosX = GET_X_LPARAM(msgPos); - int msgPosY = GET_Y_LPARAM(msgPos); - system->pushEvent(new GHOST_EventCursor( - ::GetMessageTime(), GHOST_kEventCursorMove, window, msgPosX, msgPosY, td)); + else if (type == GHOST_kEventButtonUp) { + window->updateMouseCapture(MouseReleased); } - window->updateMouseCapture(type == GHOST_kEventButtonDown ? MousePressed : MouseReleased); - return new GHOST_EventButton(system->getMilliSeconds(), type, window, mask, td); -} - -void GHOST_SystemWin32::processWintabEvent(GHOST_WindowWin32 *window) -{ - GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem(); - - std::vector wintabInfo; - if (!window->getWintabInfo(wintabInfo)) { - return; - } - - for (auto info : wintabInfo) { - switch (info.type) { - case GHOST_kEventCursorMove: { - system->pushEvent(new GHOST_EventCursor( - info.time, GHOST_kEventCursorMove, window, info.x, info.y, info.tabletData)); - break; - } - case GHOST_kEventButtonDown: { - system->pushEvent(new GHOST_EventCursor( - info.time, GHOST_kEventCursorMove, window, info.x, info.y, info.tabletData)); - - UINT message; - switch (info.button) { - case GHOST_kButtonMaskLeft: - message = WM_LBUTTONDOWN; - break; - case GHOST_kButtonMaskRight: - message = WM_RBUTTONDOWN; - break; - case GHOST_kButtonMaskMiddle: - message = WM_MBUTTONDOWN; - break; - default: - continue; - } - - MSG msg; - if (PeekMessage(&msg, window->getHWND(), message, message, PM_REMOVE | PM_NOYIELD) && - WM_QUIT != msg.message) { - window->updateMouseCapture(MousePressed); - system->pushEvent( - new GHOST_EventButton(info.time, info.type, window, info.button, info.tabletData)); - } - break; - } - case GHOST_kEventButtonUp: { - UINT message; - switch (info.button) { - case GHOST_kButtonMaskLeft: - message = WM_LBUTTONUP; - break; - case GHOST_kButtonMaskRight: - message = WM_RBUTTONUP; - break; - case GHOST_kButtonMaskMiddle: - message = WM_MBUTTONUP; - break; - default: - continue; - } - - MSG msg; - if (PeekMessage(&msg, window->getHWND(), message, message, PM_REMOVE | PM_NOYIELD) && - WM_QUIT != msg.message) { - window->updateMouseCapture(MouseReleased); - system->pushEvent( - new GHOST_EventButton(info.time, info.type, window, info.button, info.tabletData)); - } - break; - } - default: - break; - } - } + return new GHOST_EventButton( + system->getMilliSeconds(), type, window, mask, window->getTabletData()); } void GHOST_SystemWin32::processPointerEvent( @@ -1127,79 +1022,26 @@ void GHOST_SystemWin32::processPointerEvent( system->setCursorPosition(pointerInfo[0].pixelLocation.x, pointerInfo[0].pixelLocation.y); } -void GHOST_SystemWin32::processCursorEvent(GHOST_WindowWin32 *window) +GHOST_EventCursor *GHOST_SystemWin32::processCursorEvent(GHOST_WindowWin32 *window) { - /* Cursor moves handled by tablets while active. */ - if (window->m_tabletInRange) { - return; - } - + GHOST_TInt32 x_screen, y_screen; GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem(); - DWORD msgPos = ::GetMessagePos(); - LONG msgTime = ::GetMessageTime(); - - /* GetMessagePointsEx processes points as 16 bit integers and can fail or return erroneous values - * if negative input is not truncated. */ - int msgPosX = GET_X_LPARAM(msgPos) & 0x0000FFFF; - int msgPosY = GET_Y_LPARAM(msgPos) & 0x0000FFFF; - - const int maxPoints = 64; - MOUSEMOVEPOINT currentPoint = {msgPosX, msgPosY, (DWORD)msgTime, 0}; - MOUSEMOVEPOINT points[maxPoints] = {0}; - /* GetMouseMovePointsEx returns the number of points returned that are less than or equal to the - * requested point. If the requested point is the most recent, this returns up to 64 requested - * points. */ - int numPoints = ::GetMouseMovePointsEx( - sizeof(MOUSEMOVEPOINT), ¤tPoint, points, maxPoints, GMMP_USE_DISPLAY_POINTS); - - if (numPoints == -1) { - /* Points at edge of screen are often not in the queue, use the message's point instead. */ - numPoints = 1; - points[0] = currentPoint; - } - - GHOST_TInt32 x_accum = 0, y_accum = 0; - window->getCursorGrabAccum(x_accum, y_accum); - - /* Points are in reverse chronological order. Find least recent, unprocessed mouse move. */ - int i; - for (i = 0; i < numPoints; i++) { - if (points[i].time < system->m_mouseTimestamp) { - break; - } - - /* GetMouseMovePointsEx returns 16 bit number as 32 bit. If negative, we need to sign extend. - */ - points[i].x = points[i].x > 32767 ? points[i].x | 0xFFFF0000 : points[i].x; - points[i].y = points[i].y > 32767 ? points[i].y | 0xFFFF0000 : points[i].y; - - if (points[i].time == system->m_mouseTimestamp && points[i].x == system->m_mousePosX && - points[i].y == system->m_mousePosY) { - break; + if (window->m_tabletInRange) { + if (window->useTabletAPI(GHOST_kTabletNative)) { + /* Tablet input handled in WM_POINTER* events. WM_MOUSEMOVE events in response to tablet + * input aren't normally generated when using WM_POINTER events, but manually moving the + * system cursor as we do in WM_POINTER handling does. */ + return NULL; } } - while (--i >= 0) { - system->pushEvent(new GHOST_EventCursor(system->getMilliSeconds(), - GHOST_kEventCursorMove, - window, - points[i].x + x_accum, - points[i].y + y_accum, - GHOST_TABLET_DATA_NONE)); - } - DWORD lastTimestamp = points[0].time; + system->getCursorPosition(x_screen, y_screen); - /* Check if we need to wrap the cursor. */ - if (window->getCursorGrabModeIsWarp()) { - /* Wrap based on current cursor position in case Win32 mouse move queue is out of order due to - * prior wrap. */ - POINT point; - ::GetCursorPos(&point); - GHOST_TInt32 x_current = point.x; - GHOST_TInt32 y_current = point.y; - GHOST_TInt32 x_wrap = point.x; - GHOST_TInt32 y_wrap = point.y; + if (window->getCursorGrabModeIsWarp() && !window->m_tabletInRange) { + GHOST_TInt32 x_new = x_screen; + GHOST_TInt32 y_new = y_screen; + GHOST_TInt32 x_accum, y_accum; GHOST_Rect bounds; /* Fallback to window bounds. */ @@ -1209,24 +1051,33 @@ void GHOST_SystemWin32::processCursorEvent(GHOST_WindowWin32 *window) /* Could also clamp to screen bounds wrap with a window outside the view will fail atm. * Use offset of 8 in case the window is at screen bounds. */ - bounds.wrapPoint(x_wrap, y_wrap, 2, window->getCursorGrabAxis()); + bounds.wrapPoint(x_new, y_new, 2, window->getCursorGrabAxis()); - if (x_wrap != x_current || y_wrap != y_current) { - system->setCursorPosition(x_wrap, y_wrap); - window->setCursorGrabAccum(x_accum + (x_current - x_wrap), y_accum + (y_current - y_wrap)); - - /* First message after SendInput wrap is invalid for unknown reasons, skip events until one - * tick after SendInput event time. */ - lastTimestamp = ::GetTickCount() + 1; + window->getCursorGrabAccum(x_accum, y_accum); + if (x_new != x_screen || y_new != y_screen) { + /* When wrapping we don't need to add an event because the setCursorPosition call will cause + * a new event after. */ + system->setCursorPosition(x_new, y_new); /* wrap */ + window->setCursorGrabAccum(x_accum + (x_screen - x_new), y_accum + (y_screen - y_new)); + } + else { + return new GHOST_EventCursor(system->getMilliSeconds(), + GHOST_kEventCursorMove, + window, + x_screen + x_accum, + y_screen + y_accum, + window->getTabletData()); } } - - system->m_mousePosX = points[0].x; - system->m_mousePosY = points[0].y; - /* Use latest time, checking for overflow. */ - if (lastTimestamp > system->m_mouseTimestamp || ::GetTickCount() < system->m_mouseTimestamp) { - system->m_mouseTimestamp = lastTimestamp; + else { + return new GHOST_EventCursor(system->getMilliSeconds(), + GHOST_kEventCursorMove, + window, + x_screen, + y_screen, + window->getTabletData()); } + return NULL; } void GHOST_SystemWin32::processWheelEvent(GHOST_WindowWin32 *window, WPARAM wParam, LPARAM lParam) @@ -1334,23 +1185,6 @@ GHOST_EventKey *GHOST_SystemWin32::processKeyEvent(GHOST_WindowWin32 *window, RA return event; } -GHOST_Event *GHOST_SystemWin32::processWindowSizeEvent(GHOST_WindowWin32 *window) -{ - GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem(); - GHOST_Event *sizeEvent = new GHOST_Event( - system->getMilliSeconds(), GHOST_kEventWindowSize, window); - - /* We get WM_SIZE before we fully init. Do not dispatch before we are continuously resizing. */ - if (window->m_inLiveResize) { - system->pushEvent(sizeEvent); - system->dispatchEvents(); - return NULL; - } - else { - return sizeEvent; - } -} - GHOST_Event *GHOST_SystemWin32::processWindowEvent(GHOST_TEventType type, GHOST_WindowWin32 *window) { @@ -1358,6 +1192,7 @@ GHOST_Event *GHOST_SystemWin32::processWindowEvent(GHOST_TEventType type, if (type == GHOST_kEventWindowActivate) { system->getWindowManager()->setActiveWindow(window); + window->bringTabletContextToFront(); } return new GHOST_Event(system->getMilliSeconds(), type, window); @@ -1385,18 +1220,6 @@ GHOST_TSuccess GHOST_SystemWin32::pushDragDropEvent(GHOST_TEventType eventType, system->getMilliSeconds(), eventType, draggedObjectType, window, mouseX, mouseY, data)); } -void GHOST_SystemWin32::setTabletAPI(GHOST_TTabletAPI api) -{ - GHOST_System::setTabletAPI(api); - - GHOST_WindowManager *wm = getWindowManager(); - - for (GHOST_IWindow *win : wm->getWindows()) { - GHOST_WindowWin32 *windowWin32 = (GHOST_WindowWin32 *)win; - windowWin32->setWintabEnabled(windowWin32->useTabletAPI(GHOST_kTabletWintab)); - } -} - void GHOST_SystemWin32::processMinMaxInfo(MINMAXINFO *minmax) { minmax->ptMinTrackSize.x = 320; @@ -1511,12 +1334,6 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, // Keyboard events, processed //////////////////////////////////////////////////////////////////////// case WM_INPUT: { - // check WM_INPUT from input sink when ghost window is not in the foreground - if (wParam == RIM_INPUTSINK) { - if (GetFocus() != hwnd) // WM_INPUT message not for this window - return 0; - } // else wParam == RIM_INPUT - RAWINPUT raw; RAWINPUT *raw_ptr = &raw; UINT rawSize = sizeof(RAWINPUT); @@ -1636,30 +1453,12 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, //////////////////////////////////////////////////////////////////////// // Wintab events, processed //////////////////////////////////////////////////////////////////////// - case WT_INFOCHANGE: { - window->processWintabInfoChangeEvent(lParam); - eventHandled = true; - break; - } - case WT_CSRCHANGE: - window->updateWintabCursorInfo(); - eventHandled = true; - break; - case WT_PROXIMITY: { - if (window->useTabletAPI(GHOST_kTabletWintab)) { - if (LOWORD(lParam)) { - window->m_tabletInRange = true; - } - else { - window->processWintabLeave(); - } - } - eventHandled = true; - break; - } case WT_PACKET: - processWintabEvent(window); - eventHandled = true; + window->processWin32TabletEvent(wParam, lParam); + break; + case WT_CSRCHANGE: + case WT_PROXIMITY: + window->processWin32TabletInitEvent(); break; //////////////////////////////////////////////////////////////////////// // Pointer events, processed @@ -1709,19 +1508,7 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, } break; case WM_MOUSEMOVE: - if (!window->m_mousePresent) { - TRACKMOUSEEVENT tme = {sizeof(tme)}; - tme.dwFlags = TME_LEAVE; - tme.hwndTrack = hwnd; - TrackMouseEvent(&tme); - window->m_mousePresent = true; - window->setWintabOverlap(true); - } - - if (!window->m_tabletInRange) { - processCursorEvent(window); - eventHandled = true; - } + event = processCursorEvent(window); break; case WM_MOUSEWHEEL: { /* The WM_MOUSEWHEEL message is sent to the focus window @@ -1763,13 +1550,7 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, window->loadCursor(true, GHOST_kStandardCursorDefault); } break; - case WM_MOUSELEAVE: - window->m_mousePresent = false; - window->setWintabOverlap(false); - if (!window->m_tabletInRange) { - processCursorEvent(window); - } - break; + //////////////////////////////////////////////////////////////////////// // Mouse events, ignored //////////////////////////////////////////////////////////////////////// @@ -1785,6 +1566,7 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, * is sent to the window that has captured the mouse. */ break; + //////////////////////////////////////////////////////////////////////// // Window events, processed //////////////////////////////////////////////////////////////////////// @@ -1816,7 +1598,7 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, * will not be dispatched to OUR active window if we minimize one of OUR windows. */ if (LOWORD(wParam) == WA_INACTIVE) window->lostMouseCapture(); - + window->processWin32TabletActivateEvent(GET_WM_ACTIVATE_STATE(wParam, lParam)); lResult = ::DefWindowProc(hwnd, msg, wParam, lParam); break; } @@ -1858,8 +1640,6 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, /* Let DefWindowProc handle it. */ break; case WM_SIZING: - event = processWindowSizeEvent(window); - break; case WM_SIZE: /* The WM_SIZE message is sent to a window after its size has changed. * The WM_SIZE and WM_MOVE messages are not sent if an application handles the @@ -1867,15 +1647,15 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, * to perform any move or size change processing during the WM_WINDOWPOSCHANGED * message without calling DefWindowProc. */ - event = processWindowSizeEvent(window); - - if (wParam == SIZE_MINIMIZED) { - window->setWintabEnabled(false); + /* we get first WM_SIZE before we fully init. + * So, do not dispatch before we continuously resizing. */ + if (window->m_inLiveResize) { + system->pushEvent(processWindowEvent(GHOST_kEventWindowSize, window)); + system->dispatchEvents(); } - else if (wParam == SIZE_MAXIMIZED || wParam == SIZE_RESTORED) { - window->setWintabEnabled(true); + else { + event = processWindowEvent(GHOST_kEventWindowSize, window); } - break; case WM_CAPTURECHANGED: window->lostMouseCapture(); @@ -1926,12 +1706,6 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, SWP_NOZORDER | SWP_NOACTIVATE); } break; - case WM_DISPLAYCHANGE: - for (GHOST_IWindow *iter_win : system->getWindowManager()->getWindows()) { - GHOST_WindowWin32 *iter_win32win = (GHOST_WindowWin32 *)iter_win; - iter_win32win->processWintabDisplayChangeEvent(); - } - break; //////////////////////////////////////////////////////////////////////// // Window events, ignored //////////////////////////////////////////////////////////////////////// @@ -2128,6 +1902,7 @@ void GHOST_SystemWin32::putClipboard(GHOST_TInt8 *buffer, bool selection) const /* -------------------------------------------------------------------- */ /** \name Message Box * \{ */ + GHOST_TSuccess GHOST_SystemWin32::showMessageBox(const char *title, const char *message, const char *help_label, @@ -2175,7 +1950,8 @@ GHOST_TSuccess GHOST_SystemWin32::showMessageBox(const char *title, return GHOST_kSuccess; } -/* \} */ + +/** \} */ static DWORD GetParentProcessID(void) { diff --git a/intern/ghost/intern/GHOST_SystemWin32.h b/intern/ghost/intern/GHOST_SystemWin32.h index 8ae0b0927c3..51c0c984710 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.h +++ b/intern/ghost/intern/GHOST_SystemWin32.h @@ -64,8 +64,6 @@ class GHOST_SystemWin32 : public GHOST_System { ** Time(r) functionality ***************************************************************************************/ - GHOST_TUns64 millisSinceStart(__int64 ms) const; - /** * This method converts performance counter measurements into milliseconds since the start of the * system process. @@ -267,16 +265,6 @@ class GHOST_SystemWin32 : public GHOST_System { int mouseY, void *data); - /*************************************************************************************** - ** Modify tablet API - ***************************************************************************************/ - - /** - * Set which tablet API to use. - * \param api: Enum indicating which API to use. - */ - void setTabletAPI(GHOST_TTabletAPI api) override; - protected: /** * Initializes the system. @@ -320,12 +308,6 @@ class GHOST_SystemWin32 : public GHOST_System { GHOST_WindowWin32 *window, GHOST_TButtonMask mask); - /** - * Creates tablet events from Wintab events. - * \param window: The window receiving the event (the active window). - */ - static void processWintabEvent(GHOST_WindowWin32 *window); - /** * Creates tablet events from pointer events. * \param type: The type of pointer event. @@ -340,8 +322,9 @@ class GHOST_SystemWin32 : public GHOST_System { /** * Creates cursor event. * \param window: The window receiving the event (the active window). + * \return The event created. */ - static void processCursorEvent(GHOST_WindowWin32 *window); + static GHOST_EventCursor *processCursorEvent(GHOST_WindowWin32 *window); /** * Handles a mouse wheel event. @@ -368,13 +351,6 @@ class GHOST_SystemWin32 : public GHOST_System { */ GHOST_TKey processSpecialKey(short vKey, short scanCode) const; - /** - * Creates a window size event. - * \param window: The window receiving the event (the active window). - * \return The event created. - */ - static GHOST_Event *processWindowSizeEvent(GHOST_WindowWin32 *window); - /** * Creates a window event. * \param type: The type of event to create. @@ -472,13 +448,6 @@ class GHOST_SystemWin32 : public GHOST_System { /** Wheel delta accumulator. */ int m_wheelDeltaAccum; - - /** Last mouse x position. */ - int m_mousePosX; - /** Last mouse y position. */ - int m_mousePosY; - /** Last mouse timestamp. */ - DWORD m_mouseTimestamp; }; inline void GHOST_SystemWin32::retrieveModifierKeys(GHOST_ModifierKeys &keys) const diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp index 9152aa22495..df7e8ba59df 100644 --- a/intern/ghost/intern/GHOST_SystemX11.cpp +++ b/intern/ghost/intern/GHOST_SystemX11.cpp @@ -1061,7 +1061,7 @@ void GHOST_SystemX11::processEvent(XEvent *xe) * Note that: * - This effectively 'lock' main number keys to always output number events * (except when using alt-gr). - * - This enforces users to use an ascii-compatible keymap with Blender - + * - This enforces users to use an ASCII-compatible keymap with Blender - * but at least it gives predictable and consistent results. * * Also, note that nothing in XLib sources [1] makes it obvious why those two functions give @@ -2494,7 +2494,8 @@ GHOST_TSuccess GHOST_SystemX11::showMessageBox(const char *title, XFreeGC(m_display, buttonGC); return GHOST_kSuccess; } -/* \} */ + +/** \} */ #ifdef WITH_XDND GHOST_TSuccess GHOST_SystemX11::pushDragDropEvent(GHOST_TEventType eventType, diff --git a/intern/ghost/intern/GHOST_WindowWin32.cpp b/intern/ghost/intern/GHOST_WindowWin32.cpp index c82663635ea..32672461873 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.cpp +++ b/intern/ghost/intern/GHOST_WindowWin32.cpp @@ -104,17 +104,16 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system, bool is_debug, bool dialog) : GHOST_Window(width, height, state, wantStereoVisual, false), - m_mousePresent(false), m_tabletInRange(false), m_inLiveResize(false), m_system(system), m_hDC(0), + m_isDialog(dialog), m_hasMouseCaptured(false), m_hasGrabMouse(false), m_nPressedButtons(0), m_customCursor(0), m_wantAlphaBackground(alphaBackground), - m_wintab(), m_normal_state(GHOST_kWindowStateNormal), m_user32(NULL), m_fpGetPointerInfoHistory(NULL), @@ -124,8 +123,13 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system, m_debug_context(is_debug) { wchar_t *title_16 = alloc_utf16_from_8((char *)title, 0); - RECT win_rect = {left, top, left + width, top + height}; + RECT win_rect = {left, top, (long)(left + width), (long)(top + height)}; RECT parent_rect = {0, 0, 0, 0}; + + // Initialize tablet variables + memset(&m_wintab, 0, sizeof(m_wintab)); + m_tabletData = GHOST_TABLET_DATA_NONE; + if (parentwindow) { GetWindowRect(m_parentWindowHwnd, &parent_rect); } @@ -141,6 +145,13 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system, /* Forces owned windows onto taskbar and allows minimization. */ DWORD extended_style = parentwindow ? WS_EX_APPWINDOW : 0; + if (dialog) { + /* When we are ready to make windows of this type: + * style = WS_POPUPWINDOW | WS_CAPTION + * extended_style = WS_EX_DLGMODALFRAME | WS_EX_TOPMOST + */ + } + /* Monitor details. */ MONITORINFOEX monitor; monitor.cbSize = sizeof(MONITORINFOEX); @@ -252,16 +263,6 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system, } } - if (parentwindow && !dialog) { - RAWINPUTDEVICE device = {0}; - device.usUsagePage = 0x01; /* usUsagePage & usUsage for keyboard*/ - device.usUsage = 0x06; /* http://msdn.microsoft.com/en-us/windows/hardware/gg487473.aspx */ - device.dwFlags |= - RIDEV_INPUTSINK; // makes WM_INPUT is visible for ghost when has parent window - device.hwndTarget = m_hWnd; - RegisterRawInputDevices(&device, 1, sizeof(device)); - } - // Initialize Windows Ink if (m_user32) { m_fpGetPointerInfoHistory = (GHOST_WIN32_GetPointerInfoHistory)::GetProcAddress( @@ -272,24 +273,66 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system, m_user32, "GetPointerTouchInfoHistory"); } - if ((m_wintab.handle = ::LoadLibrary("Wintab32.dll")) && - (m_wintab.info = (GHOST_WIN32_WTInfo)::GetProcAddress(m_wintab.handle, "WTInfoA")) && - (m_wintab.open = (GHOST_WIN32_WTOpen)::GetProcAddress(m_wintab.handle, "WTOpenA")) && - (m_wintab.get = (GHOST_WIN32_WTGet)::GetProcAddress(m_wintab.handle, "WTGetA")) && - (m_wintab.set = (GHOST_WIN32_WTSet)::GetProcAddress(m_wintab.handle, "WTSetA")) && - (m_wintab.close = (GHOST_WIN32_WTClose)::GetProcAddress(m_wintab.handle, "WTClose")) && - (m_wintab.packetsGet = (GHOST_WIN32_WTPacketsGet)::GetProcAddress(m_wintab.handle, - "WTPacketsGet")) && - (m_wintab.queueSizeGet = (GHOST_WIN32_WTQueueSizeGet)::GetProcAddress(m_wintab.handle, - "WTQueueSizeGet")) && - (m_wintab.queueSizeSet = (GHOST_WIN32_WTQueueSizeSet)::GetProcAddress(m_wintab.handle, - "WTQueueSizeSet")) && - (m_wintab.enable = (GHOST_WIN32_WTEnable)::GetProcAddress(m_wintab.handle, "WTEnable")) && - (m_wintab.overlap = (GHOST_WIN32_WTOverlap)::GetProcAddress(m_wintab.handle, "WTOverlap"))) { - initializeWintab(); - setWintabEnabled(true); - } + // Initialize Wintab + m_wintab.handle = ::LoadLibrary("Wintab32.dll"); + if (m_wintab.handle && m_system->getTabletAPI() != GHOST_kTabletNative) { + // Get API functions + m_wintab.info = (GHOST_WIN32_WTInfo)::GetProcAddress(m_wintab.handle, "WTInfoA"); + m_wintab.open = (GHOST_WIN32_WTOpen)::GetProcAddress(m_wintab.handle, "WTOpenA"); + m_wintab.close = (GHOST_WIN32_WTClose)::GetProcAddress(m_wintab.handle, "WTClose"); + m_wintab.packet = (GHOST_WIN32_WTPacket)::GetProcAddress(m_wintab.handle, "WTPacket"); + m_wintab.enable = (GHOST_WIN32_WTEnable)::GetProcAddress(m_wintab.handle, "WTEnable"); + m_wintab.overlap = (GHOST_WIN32_WTOverlap)::GetProcAddress(m_wintab.handle, "WTOverlap"); + // Let's see if we can initialize tablet here. + // Check if WinTab available by getting system context info. + LOGCONTEXT lc = {0}; + lc.lcOptions |= CXO_SYSTEM; + if (m_wintab.open && m_wintab.info && m_wintab.info(WTI_DEFSYSCTX, 0, &lc)) { + // Now init the tablet + /* The maximum tablet size, pressure and orientation (tilt) */ + AXIS TabletX, TabletY, Pressure, Orientation[3]; + + // Open a Wintab context + + // Open the context + lc.lcPktData = PACKETDATA; + lc.lcPktMode = PACKETMODE; + lc.lcOptions |= CXO_MESSAGES; + lc.lcMoveMask = PACKETDATA; + + /* Set the entire tablet as active */ + m_wintab.info(WTI_DEVICES, DVC_X, &TabletX); + m_wintab.info(WTI_DEVICES, DVC_Y, &TabletY); + + /* get the max pressure, to divide into a float */ + BOOL pressureSupport = m_wintab.info(WTI_DEVICES, DVC_NPRESSURE, &Pressure); + if (pressureSupport) + m_wintab.maxPressure = Pressure.axMax; + else + m_wintab.maxPressure = 0; + + /* get the max tilt axes, to divide into floats */ + BOOL tiltSupport = m_wintab.info(WTI_DEVICES, DVC_ORIENTATION, &Orientation); + if (tiltSupport) { + /* does the tablet support azimuth ([0]) and altitude ([1]) */ + if (Orientation[0].axResolution && Orientation[1].axResolution) { + /* all this assumes the minimum is 0 */ + m_wintab.maxAzimuth = Orientation[0].axMax; + m_wintab.maxAltitude = Orientation[1].axMax; + } + else { /* no so dont do tilt stuff */ + m_wintab.maxAzimuth = m_wintab.maxAltitude = 0; + } + } + + // The Wintab spec says we must open the context disabled if we are using cursor masks. + m_wintab.tablet = m_wintab.open(m_hWnd, &lc, FALSE); + if (m_wintab.enable && m_wintab.tablet) { + m_wintab.enable(m_wintab.tablet, TRUE); + } + } + } CoCreateInstance( CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList3, (LPVOID *)&m_Bar); } @@ -303,12 +346,12 @@ GHOST_WindowWin32::~GHOST_WindowWin32() } if (m_wintab.handle) { - setWintabEnabled(false); - if (m_wintab.close && m_wintab.context) { - m_wintab.close(m_wintab.context); + if (m_wintab.close && m_wintab.tablet) { + m_wintab.close(m_wintab.tablet); } FreeLibrary(m_wintab.handle); + memset(&m_wintab, 0, sizeof(m_wintab)); } if (m_user32) { @@ -475,31 +518,14 @@ GHOST_TSuccess GHOST_WindowWin32::setClientSize(GHOST_TUns32 width, GHOST_TUns32 GHOST_TWindowState GHOST_WindowWin32::getState() const { - GHOST_TWindowState state; - - // XXX 27.04.2011 - // we need to find a way to combine parented windows + resizing if we simply set the - // state as GHOST_kWindowStateEmbedded we will need to check for them somewhere else. - // It's also strange that in Windows is the only platform we need to make this separation. - if ((m_parentWindowHwnd != 0) && !isDialog()) { - state = GHOST_kWindowStateEmbedded; - return state; - } - if (::IsIconic(m_hWnd)) { - state = GHOST_kWindowStateMinimized; + return GHOST_kWindowStateMinimized; } else if (::IsZoomed(m_hWnd)) { LONG_PTR result = ::GetWindowLongPtr(m_hWnd, GWL_STYLE); - if ((result & (WS_DLGFRAME | WS_MAXIMIZE)) == (WS_DLGFRAME | WS_MAXIMIZE)) - state = GHOST_kWindowStateMaximized; - else - state = GHOST_kWindowStateFullScreen; + return (result & WS_CAPTION) ? GHOST_kWindowStateMaximized : GHOST_kWindowStateFullScreen; } - else { - state = GHOST_kWindowStateNormal; - } - return state; + return GHOST_kWindowStateNormal; } void GHOST_WindowWin32::screenToClient(GHOST_TInt32 inX, @@ -527,46 +553,33 @@ void GHOST_WindowWin32::clientToScreen(GHOST_TInt32 inX, GHOST_TSuccess GHOST_WindowWin32::setState(GHOST_TWindowState state) { GHOST_TWindowState curstate = getState(); - LONG_PTR newstyle = -1; + LONG_PTR style = GetWindowLongPtr(m_hWnd, GWL_STYLE) | WS_CAPTION; WINDOWPLACEMENT wp; wp.length = sizeof(WINDOWPLACEMENT); ::GetWindowPlacement(m_hWnd, &wp); - if (state == GHOST_kWindowStateNormal) - state = m_normal_state; - switch (state) { case GHOST_kWindowStateMinimized: wp.showCmd = SW_SHOWMINIMIZED; break; case GHOST_kWindowStateMaximized: wp.showCmd = SW_SHOWMAXIMIZED; - newstyle = WS_OVERLAPPEDWINDOW; break; case GHOST_kWindowStateFullScreen: - if (curstate != state && curstate != GHOST_kWindowStateMinimized) + if (curstate != state && curstate != GHOST_kWindowStateMinimized) { m_normal_state = curstate; + } wp.showCmd = SW_SHOWMAXIMIZED; wp.ptMaxPosition.x = 0; wp.ptMaxPosition.y = 0; - newstyle = WS_MAXIMIZE; - break; - case GHOST_kWindowStateEmbedded: - newstyle = WS_CHILD; + style &= ~WS_CAPTION; break; case GHOST_kWindowStateNormal: default: wp.showCmd = SW_SHOWNORMAL; - newstyle = WS_OVERLAPPEDWINDOW; break; } - if ((newstyle >= 0) && !isDialog()) { - ::SetWindowLongPtr(m_hWnd, GWL_STYLE, newstyle); - } - - /* Clears window cache for SetWindowLongPtr */ - ::SetWindowPos(m_hWnd, 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); - + ::SetWindowLongPtr(m_hWnd, GWL_STYLE, style); return ::SetWindowPlacement(m_hWnd, &wp) == TRUE ? GHOST_kSuccess : GHOST_kFailure; } @@ -713,10 +726,7 @@ void GHOST_WindowWin32::lostMouseCapture() bool GHOST_WindowWin32::isDialog() const { - HWND parent = (HWND)::GetWindowLongPtr(m_hWnd, GWLP_HWNDPARENT); - long int style = (long int)::GetWindowLongPtr(m_hWnd, GWL_STYLE); - - return (parent != 0) && (style & WS_POPUPWINDOW); + return m_isDialog; } void GHOST_WindowWin32::updateMouseCapture(GHOST_MouseCaptureEventWin32 event) @@ -950,62 +960,6 @@ GHOST_TSuccess GHOST_WindowWin32::hasCursorShape(GHOST_TStandardCursor cursorSha return (getStandardCursor(cursorShape)) ? GHOST_kSuccess : GHOST_kFailure; } -void GHOST_WindowWin32::initializeWintab() -{ - /* Return if wintab library handle doesn't exist or wintab is already initialized. */ - if (!m_wintab.handle || m_wintab.context) { - return; - } - - /* Check if WinTab available by getting system context info. */ - LOGCONTEXT lc = {0}; - if (m_wintab.open && m_wintab.info && m_wintab.queueSizeGet && m_wintab.queueSizeSet && - call_wt_info(m_wintab.info, WTI_DEFSYSCTX, 0, &lc)) { - - lc.lcPktData = PACKETDATA; - lc.lcPktMode = PACKETMODE; - lc.lcMoveMask = PACKETDATA; - lc.lcOptions |= CXO_CSRMESSAGES | CXO_MESSAGES; - /* Wacom maps y origin to the tablet's bottom. Invert to match Windows y origin mapping to the - * screen top. */ - lc.lcOutExtY = -lc.lcOutExtY; - - m_wintab.info(WTI_INTERFACE, IFC_NDEVICES, &m_wintab.numDevices); - - updateWintabCursorInfo(); - - /* The Wintab spec says we must open the context disabled if we are using cursor masks. */ - m_wintab.context = m_wintab.open(m_hWnd, &lc, FALSE); - - /* Wintab provides no way to determine the maximum queue size aside from checking if attempts - * to change the queue size are successful. */ - const int maxQueue = 500; - int queueSize = m_wintab.queueSizeGet(m_wintab.context); - - while (queueSize < maxQueue) { - int testSize = min(queueSize + 16, maxQueue); - if (m_wintab.queueSizeSet(m_wintab.context, testSize)) { - queueSize = testSize; - } - else { - /* From Windows Wintab Documentation for WTQueueSizeSet: - * "If the return value is zero, the context has no queue because the function deletes the - * original queue before attempting to create a new one. The application must continue - * calling the function with a smaller queue size until the function returns a non - zero - * value." - * - * In our case we start with a known valid queue size and in the event of failure roll - * back to the last valid queue size. The Wintab spec dates back to 16 bit Windows, thus - * assumes memory recently deallocated may not be available, which is no longer a practical - * concern. */ - m_wintab.queueSizeSet(m_wintab.context, queueSize); - break; - } - } - m_wintab.pkts.resize(queueSize); - } -} - GHOST_TSuccess GHOST_WindowWin32::getPointerInfo( std::vector &outPointerInfo, WPARAM wParam, LPARAM lParam) { @@ -1085,92 +1039,31 @@ GHOST_TSuccess GHOST_WindowWin32::getPointerInfo( } } - if (!outPointerInfo.empty()) { - lastTabletData = outPointerInfo.back().tabletData; - } - return GHOST_kSuccess; } -void GHOST_WindowWin32::setWintabEnabled(bool enable) +void GHOST_WindowWin32::processWin32TabletActivateEvent(WORD state) { - if (m_wintab.enable && m_wintab.get && m_wintab.context) { - LOGCONTEXT context = {0}; - - if (m_wintab.get(m_wintab.context, &context)) { - if (enable && context.lcStatus & CXS_DISABLED && useTabletAPI(GHOST_kTabletWintab)) { - m_wintab.enable(m_wintab.context, true); - - POINT cursorPos; - ::GetCursorPos(&cursorPos); - GHOST_Rect bounds; - getClientBounds(bounds); - if (bounds.isInside(cursorPos.x, cursorPos.y)) { - setWintabOverlap(true); - } - } - else if (!enable && !(context.lcStatus & CXS_DISABLED)) { - setWintabOverlap(false); - m_wintab.enable(m_wintab.context, false); - } - } + if (!useTabletAPI(GHOST_kTabletWintab)) { + return; } -} -void GHOST_WindowWin32::setWintabOverlap(bool overlap) -{ - if (m_wintab.overlap && m_wintab.get && m_wintab.packetsGet && m_wintab.context) { - LOGCONTEXT context = {0}; + if (m_wintab.enable && m_wintab.tablet) { + m_wintab.enable(m_wintab.tablet, state); - if (m_wintab.get(m_wintab.context, &context)) { - if (overlap && context.lcStatus & CXS_OBSCURED && useTabletAPI(GHOST_kTabletWintab)) { - m_wintab.overlap(m_wintab.context, true); - } - else if (!overlap && context.lcStatus & CXS_ONTOP) { - m_wintab.overlap(m_wintab.context, false); - - /* If context is disabled, Windows Ink may be active and managing m_tabletInRange. Don't - * modify it. */ - if (!(context.lcStatus & CXS_DISABLED)) { - processWintabLeave(); - } - } + if (m_wintab.overlap && state) { + m_wintab.overlap(m_wintab.tablet, TRUE); } } } -void GHOST_WindowWin32::processWintabLeave() -{ - m_tabletInRange = false; - m_wintab.buttons = 0; - /* Clear the packet queue. */ - m_wintab.packetsGet(m_wintab.context, m_wintab.pkts.size(), m_wintab.pkts.data()); -} - -void GHOST_WindowWin32::processWintabDisplayChangeEvent() -{ - LOGCONTEXT lc_sys = {0}, lc_curr = {0}; - - if (m_wintab.info && m_wintab.get && m_wintab.set && m_wintab.info(WTI_DEFSYSCTX, 0, &lc_sys)) { - - m_wintab.get(m_wintab.context, &lc_curr); - - lc_curr.lcOutOrgX = lc_sys.lcOutOrgX; - lc_curr.lcOutOrgY = lc_sys.lcOutOrgY; - lc_curr.lcOutExtX = lc_sys.lcOutExtX; - lc_curr.lcOutExtY = -lc_sys.lcOutExtY; - - m_wintab.set(m_wintab.context, &lc_curr); - } -} - bool GHOST_WindowWin32::useTabletAPI(GHOST_TTabletAPI api) const { if (m_system->getTabletAPI() == api) { return true; } else if (m_system->getTabletAPI() == GHOST_kTabletAutomatic) { - if (m_wintab.numDevices) + if (m_wintab.tablet) return api == GHOST_kTabletWintab; else return api == GHOST_kTabletNative; @@ -1180,176 +1073,115 @@ bool GHOST_WindowWin32::useTabletAPI(GHOST_TTabletAPI api) const } } -void GHOST_WindowWin32::updateWintabCursorInfo() +void GHOST_WindowWin32::processWin32TabletInitEvent() { - if (m_wintab.info && m_wintab.context) { - AXIS Pressure, Orientation[3]; + if (!useTabletAPI(GHOST_kTabletWintab)) { + return; + } + + // Let's see if we can initialize tablet here + if (m_wintab.info && m_wintab.tablet) { + AXIS Pressure, Orientation[3]; /* The maximum tablet size */ BOOL pressureSupport = m_wintab.info(WTI_DEVICES, DVC_NPRESSURE, &Pressure); - m_wintab.maxPressure = pressureSupport ? Pressure.axMax : 0; + if (pressureSupport) + m_wintab.maxPressure = Pressure.axMax; + else + m_wintab.maxPressure = 0; BOOL tiltSupport = m_wintab.info(WTI_DEVICES, DVC_ORIENTATION, &Orientation); - /* Does the tablet support azimuth ([0]) and altitude ([1]). */ - if (tiltSupport && Orientation[0].axResolution && Orientation[1].axResolution) { - m_wintab.maxAzimuth = Orientation[0].axMax; - m_wintab.maxAltitude = Orientation[1].axMax; - } - else { - m_wintab.maxAzimuth = m_wintab.maxAltitude = 0; + if (tiltSupport) { + /* does the tablet support azimuth ([0]) and altitude ([1]) */ + if (Orientation[0].axResolution && Orientation[1].axResolution) { + m_wintab.maxAzimuth = Orientation[0].axMax; + m_wintab.maxAltitude = Orientation[1].axMax; + } + else { /* no so dont do tilt stuff */ + m_wintab.maxAzimuth = m_wintab.maxAltitude = 0; + } } } + + m_tabletData.Active = GHOST_kTabletModeNone; } -void GHOST_WindowWin32::processWintabInfoChangeEvent(LPARAM lParam) +void GHOST_WindowWin32::processWin32TabletEvent(WPARAM wParam, LPARAM lParam) { - /* Update number of connected Wintab digitizers */ - if (LOWORD(lParam) == WTI_INTERFACE && HIWORD(lParam) == IFC_NDEVICES) { - m_wintab.info(WTI_INTERFACE, IFC_NDEVICES, &m_wintab.numDevices); - if (useTabletAPI(GHOST_kTabletWintab)) { - setWintabEnabled(true); - } - } -} - -GHOST_TButtonMask GHOST_WindowWin32::wintabMouseToGhost(UINT cursor, WORD physicalButton) -{ - const WORD numButtons = 32; - BYTE logicalButtons[numButtons] = {0}; - BYTE systemButtons[numButtons] = {0}; - - m_wintab.info(WTI_CURSORS + cursor, CSR_BUTTONMAP, &logicalButtons); - m_wintab.info(WTI_CURSORS + cursor, CSR_SYSBTNMAP, &systemButtons); - - if (physicalButton >= numButtons) { - return GHOST_kButtonMaskNone; - } - BYTE lb = logicalButtons[physicalButton]; - - if (lb >= numButtons) { - return GHOST_kButtonMaskNone; - } - switch (systemButtons[lb]) { - case SBN_LCLICK: - return GHOST_kButtonMaskLeft; - case SBN_RCLICK: - return GHOST_kButtonMaskRight; - case SBN_MCLICK: - return GHOST_kButtonMaskMiddle; - default: - return GHOST_kButtonMaskNone; - } -} - -GHOST_TSuccess GHOST_WindowWin32::getWintabInfo(std::vector &outWintabInfo) -{ - if (!(useTabletAPI(GHOST_kTabletWintab) && m_wintab.packetsGet && m_wintab.context)) { - return GHOST_kFailure; + if (!useTabletAPI(GHOST_kTabletWintab)) { + return; } - GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)GHOST_System::getSystem(); - - const int numPackets = m_wintab.packetsGet( - m_wintab.context, m_wintab.pkts.size(), m_wintab.pkts.data()); - outWintabInfo.resize(numPackets); - - for (int i = 0; i < numPackets; i++) { - PACKET pkt = m_wintab.pkts[i]; - GHOST_WintabInfoWin32 &out = outWintabInfo[i]; - - out.tabletData = GHOST_TABLET_DATA_NONE; - /* % 3 for multiple devices ("DualTrack"). */ - switch (pkt.pkCursor % 3) { - case 0: - /* Puck - processed as mouse. */ - out.tabletData.Active = GHOST_kTabletModeNone; - break; - case 1: - out.tabletData.Active = GHOST_kTabletModeStylus; - break; - case 2: - out.tabletData.Active = GHOST_kTabletModeEraser; - break; - } - - out.x = pkt.pkX; - out.y = pkt.pkY; - - if (m_wintab.maxPressure > 0) { - out.tabletData.Pressure = (float)pkt.pkNormalPressure / (float)m_wintab.maxPressure; - } - - if ((m_wintab.maxAzimuth > 0) && (m_wintab.maxAltitude > 0)) { - ORIENTATION ort = pkt.pkOrientation; - float vecLen; - float altRad, azmRad; /* In radians. */ - - /* - * From the wintab spec: - * orAzimuth: Specifies the clockwise rotation of the cursor about the z axis through a - * full circular range. - * orAltitude: Specifies the angle with the x-y plane through a signed, semicircular range. - * Positive values specify an angle upward toward the positive z axis; negative values - * specify an angle downward toward the negative z axis. - * - * wintab.h defines orAltitude as a UINT but documents orAltitude as positive for upward - * angles and negative for downward angles. WACOM uses negative altitude values to show that - * the pen is inverted; therefore we cast orAltitude as an (int) and then use the absolute - * value. - */ - - /* Convert raw fixed point data to radians. */ - altRad = (float)((fabs((float)ort.orAltitude) / (float)m_wintab.maxAltitude) * M_PI / 2.0); - azmRad = (float)(((float)ort.orAzimuth / (float)m_wintab.maxAzimuth) * M_PI * 2.0); - - /* Find length of the stylus' projected vector on the XY plane. */ - vecLen = cos(altRad); - - /* From there calculate X and Y components based on azimuth. */ - out.tabletData.Xtilt = sin(azmRad) * vecLen; - out.tabletData.Ytilt = (float)(sin(M_PI / 2.0 - azmRad) * vecLen); - } - - /* Some Wintab libraries don't handle relative button input, so we track button presses - * manually. */ - out.button = GHOST_kButtonMaskNone; - out.type = GHOST_kEventCursorMove; - - DWORD buttonsChanged = m_wintab.buttons ^ pkt.pkButtons; - if (buttonsChanged) { - /* Find the index for the changed button from the button map. */ - WORD physicalButton = 0; - for (DWORD diff = (unsigned)buttonsChanged >> 1; diff > 0; diff = (unsigned)diff >> 1) { - physicalButton++; + if (m_wintab.packet && m_wintab.tablet) { + PACKET pkt; + if (m_wintab.packet((HCTX)lParam, wParam, &pkt)) { + switch (pkt.pkCursor % 3) { /* % 3 for multiple devices ("DualTrack") */ + case 0: + m_tabletData.Active = GHOST_kTabletModeNone; /* puck - not yet supported */ + break; + case 1: + m_tabletData.Active = GHOST_kTabletModeStylus; /* stylus */ + break; + case 2: + m_tabletData.Active = GHOST_kTabletModeEraser; /* eraser */ + break; } - out.button = wintabMouseToGhost(pkt.pkCursor, physicalButton); - - if (out.button != GHOST_kButtonMaskNone) { - if (buttonsChanged & pkt.pkButtons) { - out.type = GHOST_kEventButtonDown; - } - else { - out.type = GHOST_kEventButtonUp; - } + if (m_wintab.maxPressure > 0) { + m_tabletData.Pressure = (float)pkt.pkNormalPressure / (float)m_wintab.maxPressure; + } + else { + m_tabletData.Pressure = 1.0f; } - /* Only update handled button, in case multiple button events arrived simultaneously. */ - m_wintab.buttons ^= 1 << physicalButton; + if ((m_wintab.maxAzimuth > 0) && (m_wintab.maxAltitude > 0)) { + ORIENTATION ort = pkt.pkOrientation; + float vecLen; + float altRad, azmRad; /* in radians */ + + /* + * from the wintab spec: + * orAzimuth Specifies the clockwise rotation of the + * cursor about the z axis through a full circular range. + * + * orAltitude Specifies the angle with the x-y plane + * through a signed, semicircular range. Positive values + * specify an angle upward toward the positive z axis; + * negative values specify an angle downward toward the negative z axis. + * + * wintab.h defines .orAltitude as a UINT but documents .orAltitude + * as positive for upward angles and negative for downward angles. + * WACOM uses negative altitude values to show that the pen is inverted; + * therefore we cast .orAltitude as an (int) and then use the absolute value. + */ + + /* convert raw fixed point data to radians */ + altRad = (float)((fabs((float)ort.orAltitude) / (float)m_wintab.maxAltitude) * M_PI / 2.0); + azmRad = (float)(((float)ort.orAzimuth / (float)m_wintab.maxAzimuth) * M_PI * 2.0); + + /* find length of the stylus' projected vector on the XY plane */ + vecLen = cos(altRad); + + /* from there calculate X and Y components based on azimuth */ + m_tabletData.Xtilt = sin(azmRad) * vecLen; + m_tabletData.Ytilt = (float)(sin(M_PI / 2.0 - azmRad) * vecLen); + } + else { + m_tabletData.Xtilt = 0.0f; + m_tabletData.Ytilt = 0.0f; + } } - - out.time = system->tickCountToMillis(pkt.pkTime); } - - if (!outWintabInfo.empty()) { - lastTabletData = outWintabInfo.back().tabletData; - } - - return GHOST_kSuccess; } -GHOST_TabletData GHOST_WindowWin32::getLastTabletData() +void GHOST_WindowWin32::bringTabletContextToFront() { - return lastTabletData; + if (!useTabletAPI(GHOST_kTabletWintab)) { + return; + } + + if (m_wintab.overlap && m_wintab.tablet) { + m_wintab.overlap(m_wintab.tablet, TRUE); + } } GHOST_TUns16 GHOST_WindowWin32::getDPIHint() diff --git a/intern/ghost/intern/GHOST_WindowWin32.h b/intern/ghost/intern/GHOST_WindowWin32.h index 661d80c02aa..d86a5c12040 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.h +++ b/intern/ghost/intern/GHOST_WindowWin32.h @@ -34,14 +34,12 @@ # include "GHOST_ImeWin32.h" #endif -#include #include #include // PACKETDATA and PACKETMODE modify structs in pktdef.h, so make sure they come first -#define PACKETDATA \ - (PK_BUTTONS | PK_NORMAL_PRESSURE | PK_ORIENTATION | PK_CURSOR | PK_X | PK_Y | PK_TIME) -#define PACKETMODE 0 +#define PACKETDATA (PK_BUTTONS | PK_NORMAL_PRESSURE | PK_ORIENTATION | PK_CURSOR) +#define PACKETMODE PK_BUTTONS #include class GHOST_SystemWin32; @@ -49,13 +47,9 @@ class GHOST_DropTargetWin32; // typedefs for WinTab functions to allow dynamic loading typedef UINT(API *GHOST_WIN32_WTInfo)(UINT, UINT, LPVOID); -typedef BOOL(API *GHOST_WIN32_WTGet)(HCTX, LPLOGCONTEXTA); -typedef BOOL(API *GHOST_WIN32_WTSet)(HCTX, LPLOGCONTEXTA); typedef HCTX(API *GHOST_WIN32_WTOpen)(HWND, LPLOGCONTEXTA, BOOL); typedef BOOL(API *GHOST_WIN32_WTClose)(HCTX); -typedef int(API *GHOST_WIN32_WTPacketsGet)(HCTX, int, LPVOID); -typedef int(API *GHOST_WIN32_WTQueueSizeGet)(HCTX); -typedef BOOL(API *GHOST_WIN32_WTQueueSizeSet)(HCTX, int); +typedef BOOL(API *GHOST_WIN32_WTPacket)(HCTX, UINT, LPVOID); typedef BOOL(API *GHOST_WIN32_WTEnable)(HCTX, BOOL); typedef BOOL(API *GHOST_WIN32_WTOverlap)(HCTX, BOOL); @@ -236,14 +230,7 @@ struct GHOST_PointerInfoWin32 { GHOST_TButtonMask buttonMask; POINT pixelLocation; GHOST_TUns64 time; - GHOST_TabletData tabletData; -}; -struct GHOST_WintabInfoWin32 { - GHOST_TInt32 x, y; - GHOST_TEventType type; - GHOST_TButtonMask button; - GHOST_TUns64 time; GHOST_TabletData tabletData; }; @@ -437,6 +424,11 @@ class GHOST_WindowWin32 : public GHOST_Window { HCURSOR getStandardCursor(GHOST_TStandardCursor shape) const; void loadCursor(bool visible, GHOST_TStandardCursor cursorShape) const; + const GHOST_TabletData &getTabletData() + { + return m_tabletData; + } + /** * Query whether given tablet API should be used. * \param api: Tablet API to test. @@ -454,51 +446,10 @@ class GHOST_WindowWin32 : public GHOST_Window { WPARAM wParam, LPARAM lParam); - /** - * Enables or disables Wintab context. - * \param enable: Whether the context should be enabled. - */ - void setWintabEnabled(bool enable); - - /** - * Changes Wintab context overlap. - * \param overlap: Whether context should be brought to top of overlap order. - */ - void setWintabOverlap(bool overlap); - - /** - * Resets Wintab state. - */ - void processWintabLeave(); - - /** - * Handle Wintab coordinate changes when DisplayChange events occur. - */ - void processWintabDisplayChangeEvent(); - - /** - * Updates cached Wintab properties for current cursor. - */ - void updateWintabCursorInfo(); - - /** - * Handle Wintab info changes such as change in number of connected tablets. - * \param lParam: LPARAM of the event. - */ - void processWintabInfoChangeEvent(LPARAM lParam); - - /** - * Translate Wintab packets into GHOST_WintabInfoWin32 structs. - * \param outWintabInfo: Storage to return resulting GHOST_WintabInfoWin32 structs. - * \return Success if able to read packets, even if there are none. - */ - GHOST_TSuccess getWintabInfo(std::vector &outWintabInfo); - - /** - * Get the most recent tablet data. - * \return Most recent tablet data. - */ - GHOST_TabletData getLastTabletData(); + void processWin32TabletActivateEvent(WORD state); + void processWin32TabletInitEvent(); + void processWin32TabletEvent(WPARAM wParam, LPARAM lParam); + void bringTabletContextToFront(); GHOST_TSuccess beginFullScreen() const { @@ -512,9 +463,6 @@ class GHOST_WindowWin32 : public GHOST_Window { GHOST_TUns16 getDPIHint() override; - /** Whether the mouse is either over or captured by the window. */ - bool m_mousePresent; - /** Whether a tablet stylus is being tracked. */ bool m_tabletInRange; @@ -580,6 +528,8 @@ class GHOST_WindowWin32 : public GHOST_Window { /** Device context handle. */ HDC m_hDC; + bool m_isDialog; + /** Flag for if window has captured the mouse. */ bool m_hasMouseCaptured; /** @@ -600,51 +550,28 @@ class GHOST_WindowWin32 : public GHOST_Window { static const wchar_t *s_windowClassName; static const int s_maxTitleLength; + /** Tablet data for GHOST */ + GHOST_TabletData m_tabletData; + /* Wintab API */ struct { - /** WinTab dll handle */ + /** WinTab DLL handle. */ HMODULE handle = NULL; /** API functions */ - GHOST_WIN32_WTInfo info = NULL; - GHOST_WIN32_WTGet get = NULL; - GHOST_WIN32_WTSet set = NULL; - GHOST_WIN32_WTOpen open = NULL; - GHOST_WIN32_WTClose close = NULL; - GHOST_WIN32_WTPacketsGet packetsGet = NULL; - GHOST_WIN32_WTQueueSizeGet queueSizeGet = NULL; - GHOST_WIN32_WTQueueSizeSet queueSizeSet = NULL; - GHOST_WIN32_WTEnable enable = NULL; - GHOST_WIN32_WTOverlap overlap = NULL; + GHOST_WIN32_WTInfo info; + GHOST_WIN32_WTOpen open; + GHOST_WIN32_WTClose close; + GHOST_WIN32_WTPacket packet; + GHOST_WIN32_WTEnable enable; + GHOST_WIN32_WTOverlap overlap; - /** Stores the Tablet context if detected Tablet features using WinTab.dll. */ - HCTX context = NULL; - /** Number of connected Wintab digitizers. */ - UINT numDevices = 0; - /** Pressed button map. */ - GHOST_TUns8 buttons = 0; - LONG maxPressure = 0; - LONG maxAzimuth = 0, maxAltitude = 0; - /** Reusable buffer to read in Wintab Packets. */ - std::vector pkts; + /** Stores the Tablet context if detected Tablet features using `WinTab.dll` */ + HCTX tablet; + LONG maxPressure; + LONG maxAzimuth, maxAltitude; } m_wintab; - /** Most recent tablet data. */ - GHOST_TabletData lastTabletData = GHOST_TABLET_DATA_NONE; - - /** - * Wintab setup. - */ - void initializeWintab(); - - /** - * Convert Wintab system mapped (mouse) buttons into Ghost button mask. - * \param cursor: The Wintab cursor associated to the button. - * \param physicalButton: The physical button ID to inspect. - * \return The system mapped button. - */ - GHOST_TButtonMask wintabMouseToGhost(UINT cursor, WORD physicalButton); - GHOST_TWindowState m_normal_state; /** user32 dll handle*/ diff --git a/intern/ghost/intern/GHOST_WindowX11.cpp b/intern/ghost/intern/GHOST_WindowX11.cpp index 86a7246a284..fc006c62803 100644 --- a/intern/ghost/intern/GHOST_WindowX11.cpp +++ b/intern/ghost/intern/GHOST_WindowX11.cpp @@ -293,55 +293,18 @@ GHOST_WindowX11::GHOST_WindowX11(GHOST_SystemX11 *system, m_display, RootWindow(m_display, m_visualInfo->screen), m_visualInfo->visual, AllocNone); /* create the window! */ - if ((parentWindow == 0) || is_dialog) { - m_window = XCreateWindow(m_display, - RootWindow(m_display, m_visualInfo->screen), - left, - top, - width, - height, - 0, /* no border. */ - m_visualInfo->depth, - InputOutput, - m_visualInfo->visual, - xattributes_valuemask, - &xattributes); - } - else { - Window root_return; - int x_return, y_return; - unsigned int w_return, h_return, border_w_return, depth_return; - - XGetGeometry(m_display, - parentWindow->m_window, - &root_return, - &x_return, - &y_return, - &w_return, - &h_return, - &border_w_return, - &depth_return); - - left = 0; - top = 0; - width = w_return; - height = h_return; - - m_window = XCreateWindow(m_display, - parentWindow->m_window, /* reparent against embedder */ - left, - top, - width, - height, - 0, /* no border. */ - m_visualInfo->depth, - InputOutput, - m_visualInfo->visual, - xattributes_valuemask, - &xattributes); - - XSelectInput(m_display, parentWindow->m_window, SubstructureNotifyMask); - } + m_window = XCreateWindow(m_display, + RootWindow(m_display, m_visualInfo->screen), + left, + top, + width, + height, + 0, /* no border. */ + m_visualInfo->depth, + InputOutput, + m_visualInfo->visual, + xattributes_valuemask, + &xattributes); #ifdef WITH_XDND /* initialize drop target for newly created window */ diff --git a/intern/ghost/test/gears/GHOST_C-Test.c b/intern/ghost/test/gears/GHOST_C-Test.c index 3419f70dfcf..4283f990cfb 100644 --- a/intern/ghost/test/gears/GHOST_C-Test.c +++ b/intern/ghost/test/gears/GHOST_C-Test.c @@ -440,12 +440,14 @@ int main(int argc, char **argv) if (shSystem) { /* Create the main window */ sMainWindow = GHOST_CreateWindow(shSystem, + NULL, title1, 10, 64, 320, 200, GHOST_kWindowStateNormal, + false, GHOST_kDrawingContextTypeOpenGL, glSettings); if (!sMainWindow) { @@ -455,12 +457,14 @@ int main(int argc, char **argv) /* Create a secondary window */ sSecondaryWindow = GHOST_CreateWindow(shSystem, + NULL, title2, 340, 64, 320, 200, GHOST_kWindowStateNormal, + false, GHOST_kDrawingContextTypeOpenGL, glSettings); if (!sSecondaryWindow) { diff --git a/intern/ghost/test/multitest/MultiTest.c b/intern/ghost/test/multitest/MultiTest.c index b6b83f2a47d..8c8858fc6d8 100644 --- a/intern/ghost/test/multitest/MultiTest.c +++ b/intern/ghost/test/multitest/MultiTest.c @@ -318,12 +318,14 @@ MainWindow *mainwindow_new(MultiTestApp *app) GHOST_GLSettings glSettings = {0}; win = GHOST_CreateWindow(sys, + NULL, "MultiTest:Main", 40, 40, 400, 400, GHOST_kWindowStateNormal, + false, GHOST_kDrawingContextTypeOpenGL, glSettings); @@ -573,12 +575,14 @@ LoggerWindow *loggerwindow_new(MultiTestApp *app) GHOST_GetMainDisplayDimensions(sys, &screensize[0], &screensize[1]); win = GHOST_CreateWindow(sys, + NULL, "MultiTest:Logger", 40, screensize[1] - 432, 800, 300, GHOST_kWindowStateNormal, + false, GHOST_kDrawingContextTypeOpenGL, glSettings); @@ -773,12 +777,14 @@ ExtraWindow *extrawindow_new(MultiTestApp *app) GHOST_WindowHandle win; win = GHOST_CreateWindow(sys, + NULL, "MultiTest:Extra", 500, 40, 400, 400, GHOST_kWindowStateNormal, + false, GHOST_kDrawingContextTypeOpenGL, glSettings); diff --git a/intern/opencolorio/fallback_impl.cc b/intern/opencolorio/fallback_impl.cc index a6b93ac4959..9bbc9843e9d 100644 --- a/intern/opencolorio/fallback_impl.cc +++ b/intern/opencolorio/fallback_impl.cc @@ -34,7 +34,7 @@ using std::max; enum TransformType { TRANSFORM_LINEAR_TO_SRGB, TRANSFORM_SRGB_TO_LINEAR, - TRANSFORM_MATRIX, + TRANSFORM_SCALE, TRANSFORM_EXPONENT, TRANSFORM_UNKNOWN, }; @@ -53,147 +53,72 @@ typedef struct OCIO_PackedImageDescription { } OCIO_PackedImageDescription; struct FallbackTransform { - FallbackTransform() : type(TRANSFORM_UNKNOWN), linear_transform(NULL), display_transform(NULL) + FallbackTransform() : type(TRANSFORM_UNKNOWN), scale(1.0f), exponent(1.0f) { } virtual ~FallbackTransform() { - delete linear_transform; - delete display_transform; } void applyRGB(float *pixel) { if (type == TRANSFORM_LINEAR_TO_SRGB) { - applyLinearRGB(pixel); + pixel[0] *= scale; + pixel[1] *= scale; + pixel[2] *= scale; + linearrgb_to_srgb_v3_v3(pixel, pixel); - applyDisplayRGB(pixel); + + pixel[0] = powf(max(0.0f, pixel[0]), exponent); + pixel[1] = powf(max(0.0f, pixel[1]), exponent); + pixel[2] = powf(max(0.0f, pixel[2]), exponent); } else if (type == TRANSFORM_SRGB_TO_LINEAR) { srgb_to_linearrgb_v3_v3(pixel, pixel); } else if (type == TRANSFORM_EXPONENT) { - pixel[0] = powf(max(0.0f, pixel[0]), exponent[0]); - pixel[1] = powf(max(0.0f, pixel[1]), exponent[1]); - pixel[2] = powf(max(0.0f, pixel[2]), exponent[2]); + pixel[0] = powf(max(0.0f, pixel[0]), exponent); + pixel[1] = powf(max(0.0f, pixel[1]), exponent); + pixel[2] = powf(max(0.0f, pixel[2]), exponent); } - else if (type == TRANSFORM_MATRIX) { - float r = pixel[0]; - float g = pixel[1]; - float b = pixel[2]; - pixel[0] = r * matrix[0] + g * matrix[1] + b * matrix[2]; - pixel[1] = r * matrix[4] + g * matrix[5] + b * matrix[6]; - pixel[2] = r * matrix[8] + g * matrix[9] + b * matrix[10]; - pixel[0] += offset[0]; - pixel[1] += offset[1]; - pixel[2] += offset[2]; + else if (type == TRANSFORM_SCALE) { + pixel[0] *= scale; + pixel[1] *= scale; + pixel[2] *= scale; } } void applyRGBA(float *pixel) { - if (type == TRANSFORM_LINEAR_TO_SRGB) { - applyLinearRGBA(pixel); - linearrgb_to_srgb_v4(pixel, pixel); - applyDisplayRGBA(pixel); - } - else if (type == TRANSFORM_SRGB_TO_LINEAR) { - srgb_to_linearrgb_v4(pixel, pixel); - } - else if (type == TRANSFORM_EXPONENT) { - pixel[0] = powf(max(0.0f, pixel[0]), exponent[0]); - pixel[1] = powf(max(0.0f, pixel[1]), exponent[1]); - pixel[2] = powf(max(0.0f, pixel[2]), exponent[2]); - pixel[3] = powf(max(0.0f, pixel[3]), exponent[3]); - } - else if (type == TRANSFORM_MATRIX) { - float r = pixel[0]; - float g = pixel[1]; - float b = pixel[2]; - float a = pixel[3]; - pixel[0] = r * matrix[0] + g * matrix[1] + b * matrix[2] + a * matrix[3]; - pixel[1] = r * matrix[4] + g * matrix[5] + b * matrix[6] + a * matrix[7]; - pixel[2] = r * matrix[8] + g * matrix[9] + b * matrix[10] + a * matrix[11]; - pixel[3] = r * matrix[12] + g * matrix[13] + b * matrix[14] + a * matrix[15]; - pixel[0] += offset[0]; - pixel[1] += offset[1]; - pixel[2] += offset[2]; - pixel[3] += offset[3]; - } - } - - void applyLinearRGB(float *pixel) - { - if (linear_transform != NULL) { - linear_transform->applyRGB(pixel); - } - } - - void applyLinearRGBA(float *pixel) - { - if (linear_transform != NULL) { - linear_transform->applyRGBA(pixel); - } - } - - void applyDisplayRGB(float *pixel) - { - if (display_transform != NULL) { - display_transform->applyRGB(pixel); - } - } - - void applyDisplayRGBA(float *pixel) - { - if (display_transform != NULL) { - display_transform->applyRGBA(pixel); - } + applyRGB(pixel); } TransformType type; - FallbackTransform *linear_transform; - FallbackTransform *display_transform; + /* Scale transform. */ + float scale; /* Exponent transform. */ - float exponent[4]; - /* Matrix transform. */ - float matrix[16]; - float offset[4]; + float exponent; MEM_CXX_CLASS_ALLOC_FUNCS("FallbackTransform"); }; -struct FallbackGroupTransform : FallbackTransform { - ~FallbackGroupTransform() - { - for (auto transform : list) { - delete transform; - } - } - std::vector list; -}; - struct FallbackProcessor { - FallbackProcessor() : transform(NULL) + FallbackProcessor(const FallbackTransform &transform) : transform(transform) { } - ~FallbackProcessor() - { - delete transform; - } - void applyRGB(float *pixel) { - transform->applyRGB(pixel); + transform.applyRGB(pixel); } void applyRGBA(float *pixel) { - transform->applyRGBA(pixel); + transform.applyRGBA(pixel); } - FallbackTransform *transform; + FallbackTransform transform; MEM_CXX_CLASS_ALLOC_FUNCS("FallbackProcessor"); }; @@ -403,30 +328,35 @@ OCIO_ConstProcessorRcPtr *FallbackImpl::configGetProcessorWithNames(OCIO_ConstCo { OCIO_ConstColorSpaceRcPtr *cs_src = configGetColorSpace(config, srcName); OCIO_ConstColorSpaceRcPtr *cs_dst = configGetColorSpace(config, dstName); - FallbackTransform *transform = new FallbackTransform(); + FallbackTransform transform; if (cs_src == COLORSPACE_LINEAR && cs_dst == COLORSPACE_SRGB) { - transform->type = TRANSFORM_LINEAR_TO_SRGB; + transform.type = TRANSFORM_LINEAR_TO_SRGB; } else if (cs_src == COLORSPACE_SRGB && cs_dst == COLORSPACE_LINEAR) { - transform->type = TRANSFORM_SRGB_TO_LINEAR; + transform.type = TRANSFORM_SRGB_TO_LINEAR; } else { - transform->type = TRANSFORM_UNKNOWN; + transform.type = TRANSFORM_UNKNOWN; } - FallbackProcessor *processor = new FallbackProcessor(); - processor->transform = transform; - return (OCIO_ConstProcessorRcPtr *)processor; + return (OCIO_ConstProcessorRcPtr *)new FallbackProcessor(transform); } -OCIO_ConstProcessorRcPtr *FallbackImpl::configGetProcessor(OCIO_ConstConfigRcPtr * /*config*/, - OCIO_ConstTransformRcPtr *transform) +OCIO_ConstCPUProcessorRcPtr *FallbackImpl::processorGetCPUProcessor( + OCIO_ConstProcessorRcPtr *processor) { - FallbackProcessor *processor = new FallbackProcessor(); - processor->transform = (FallbackTransform *)transform; - return (OCIO_ConstProcessorRcPtr *)processor; + /* Just make a copy of the processor so that we are compatible with OCIO + * which does need it as a separate object. */ + FallbackProcessor *fallback_processor = (FallbackProcessor *)processor; + return (OCIO_ConstCPUProcessorRcPtr *)new FallbackProcessor(*fallback_processor); } -void FallbackImpl::processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img) +void FallbackImpl::processorRelease(OCIO_ConstProcessorRcPtr *processor) +{ + delete (FallbackProcessor *)(processor); +} + +void FallbackImpl::cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img) { /* OCIO_TODO stride not respected, channels must be 3 or 4 */ OCIO_PackedImageDescription *desc = (OCIO_PackedImageDescription *)img; @@ -441,15 +371,15 @@ void FallbackImpl::processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_Pack float *pixel = pixels + channels * (y * width + x); if (channels == 4) - processorApplyRGBA(processor, pixel); + cpuProcessorApplyRGBA(cpu_processor, pixel); else if (channels == 3) - processorApplyRGB(processor, pixel); + cpuProcessorApplyRGB(cpu_processor, pixel); } } } -void FallbackImpl::processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, - OCIO_PackedImageDesc *img) +void FallbackImpl::cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img) { /* OCIO_TODO stride not respected, channels must be 3 or 4 */ OCIO_PackedImageDescription *desc = (OCIO_PackedImageDescription *)img; @@ -464,27 +394,28 @@ void FallbackImpl::processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel = pixels + channels * (y * width + x); if (channels == 4) - processorApplyRGBA_predivide(processor, pixel); + cpuProcessorApplyRGBA_predivide(cpu_processor, pixel); else if (channels == 3) - processorApplyRGB(processor, pixel); + cpuProcessorApplyRGB(cpu_processor, pixel); } } } -void FallbackImpl::processorApplyRGB(OCIO_ConstProcessorRcPtr *processor, float *pixel) +void FallbackImpl::cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel) { - ((FallbackProcessor *)processor)->applyRGB(pixel); + ((FallbackProcessor *)cpu_processor)->applyRGB(pixel); } -void FallbackImpl::processorApplyRGBA(OCIO_ConstProcessorRcPtr *processor, float *pixel) +void FallbackImpl::cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel) { - ((FallbackProcessor *)processor)->applyRGBA(pixel); + ((FallbackProcessor *)cpu_processor)->applyRGBA(pixel); } -void FallbackImpl::processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel) +void FallbackImpl::cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + float *pixel) { if (pixel[3] == 1.0f || pixel[3] == 0.0f) { - processorApplyRGBA(processor, pixel); + cpuProcessorApplyRGBA(cpu_processor, pixel); } else { float alpha, inv_alpha; @@ -496,7 +427,7 @@ void FallbackImpl::processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *proces pixel[1] *= inv_alpha; pixel[2] *= inv_alpha; - processorApplyRGBA(processor, pixel); + cpuProcessorApplyRGBA(cpu_processor, pixel); pixel[0] *= alpha; pixel[1] *= alpha; @@ -504,9 +435,9 @@ void FallbackImpl::processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *proces } } -void FallbackImpl::processorRelease(OCIO_ConstProcessorRcPtr *processor) +void FallbackImpl::cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *cpu_processor) { - delete (FallbackProcessor *)(processor); + delete (FallbackProcessor *)(cpu_processor); } const char *FallbackImpl::colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs) @@ -530,54 +461,20 @@ const char *FallbackImpl::colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr * /*cs*/ return ""; } -OCIO_DisplayTransformRcPtr *FallbackImpl::createDisplayTransform(void) +OCIO_ConstProcessorRcPtr *FallbackImpl::createDisplayProcessor(OCIO_ConstConfigRcPtr * /*config*/, + const char * /*input*/, + const char * /*view*/, + const char * /*display*/, + const char * /*look*/, + const float scale, + const float exponent) { - FallbackTransform *transform = new FallbackTransform(); - transform->type = TRANSFORM_LINEAR_TO_SRGB; - return (OCIO_DisplayTransformRcPtr *)transform; -} + FallbackTransform transform; + transform.type = TRANSFORM_LINEAR_TO_SRGB; + transform.scale = scale; + transform.exponent = exponent; -void FallbackImpl::displayTransformSetInputColorSpaceName(OCIO_DisplayTransformRcPtr * /*dt*/, - const char * /*name*/) -{ -} - -void FallbackImpl::displayTransformSetDisplay(OCIO_DisplayTransformRcPtr * /*dt*/, - const char * /*name*/) -{ -} - -void FallbackImpl::displayTransformSetView(OCIO_DisplayTransformRcPtr * /*dt*/, - const char * /*name*/) -{ -} - -void FallbackImpl::displayTransformSetDisplayCC(OCIO_DisplayTransformRcPtr *dt, - OCIO_ConstTransformRcPtr *et) -{ - FallbackTransform *transform = (FallbackTransform *)dt; - transform->display_transform = (FallbackTransform *)et; -} - -void FallbackImpl::displayTransformSetLinearCC(OCIO_DisplayTransformRcPtr *dt, - OCIO_ConstTransformRcPtr *et) -{ - FallbackTransform *transform = (FallbackTransform *)dt; - transform->linear_transform = (FallbackTransform *)et; -} - -void FallbackImpl::displayTransformSetLooksOverride(OCIO_DisplayTransformRcPtr * /*dt*/, - const char * /*looks*/) -{ -} - -void FallbackImpl::displayTransformSetLooksOverrideEnabled(OCIO_DisplayTransformRcPtr * /*dt*/, - bool /*enabled*/) -{ -} - -void FallbackImpl::displayTransformRelease(OCIO_DisplayTransformRcPtr * /*dt*/) -{ + return (OCIO_ConstProcessorRcPtr *)new FallbackProcessor(transform); } OCIO_PackedImageDesc *FallbackImpl::createOCIO_PackedImageDesc(float *data, @@ -605,127 +502,6 @@ void FallbackImpl::OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *id) MEM_freeN(id); } -OCIO_GroupTransformRcPtr *FallbackImpl::createGroupTransform(void) -{ - FallbackTransform *transform = new FallbackGroupTransform(); - transform->type = TRANSFORM_UNKNOWN; - return (OCIO_GroupTransformRcPtr *)transform; -} - -void FallbackImpl::groupTransformSetDirection(OCIO_GroupTransformRcPtr * /*gt*/, - const bool /*forward */) -{ -} - -void FallbackImpl::groupTransformPushBack(OCIO_GroupTransformRcPtr *gt, - OCIO_ConstTransformRcPtr *transform) -{ - FallbackGroupTransform *group = (FallbackGroupTransform *)gt; - group->list.push_back((FallbackTransform *)transform); -} - -void FallbackImpl::groupTransformRelease(OCIO_GroupTransformRcPtr * /*gt*/) -{ -} - -OCIO_ColorSpaceTransformRcPtr *FallbackImpl::createColorSpaceTransform(void) -{ - FallbackTransform *transform = new FallbackTransform(); - transform->type = TRANSFORM_UNKNOWN; - return (OCIO_ColorSpaceTransformRcPtr *)transform; -} - -void FallbackImpl::colorSpaceTransformSetSrc(OCIO_ColorSpaceTransformRcPtr * /*ct*/, - const char * /*name*/) -{ -} - -void FallbackImpl::colorSpaceTransformRelease(OCIO_ColorSpaceTransformRcPtr * /*ct*/) -{ -} - -OCIO_ExponentTransformRcPtr *FallbackImpl::createExponentTransform(void) -{ - FallbackTransform *transform = new FallbackTransform(); - transform->type = TRANSFORM_EXPONENT; - return (OCIO_ExponentTransformRcPtr *)transform; -} - -void FallbackImpl::exponentTransformSetValue(OCIO_ExponentTransformRcPtr *et, - const float *exponent) -{ - FallbackTransform *transform = (FallbackTransform *)et; - copy_v4_v4(transform->exponent, exponent); -} - -void FallbackImpl::exponentTransformRelease(OCIO_ExponentTransformRcPtr * /*et*/) -{ -} - -OCIO_MatrixTransformRcPtr *FallbackImpl::createMatrixTransform(void) -{ - FallbackTransform *transform = new FallbackTransform(); - transform->type = TRANSFORM_MATRIX; - return (OCIO_MatrixTransformRcPtr *)transform; -} - -void FallbackImpl::matrixTransformSetValue(OCIO_MatrixTransformRcPtr *mt, - const float *m44, - const float *offset4) -{ - FallbackTransform *transform = (FallbackTransform *)mt; - copy_m4_m4((float(*)[4])transform->matrix, (float(*)[4])m44); - copy_v4_v4(transform->offset, offset4); -} - -void FallbackImpl::matrixTransformRelease(OCIO_MatrixTransformRcPtr * /*mt*/) -{ -} - -void FallbackImpl::matrixTransformScale(float *m44, float *offset4, const float *scale4) -{ - if (scale4 == NULL) { - return; - } - if (m44 != NULL) { - memset(m44, 0, 16 * sizeof(float)); - m44[0] = scale4[0]; - m44[5] = scale4[1]; - m44[10] = scale4[2]; - m44[15] = scale4[3]; - } - if (offset4 != NULL) { - offset4[0] = 0.0f; - offset4[1] = 0.0f; - offset4[2] = 0.0f; - offset4[3] = 0.0f; - } -} - -bool FallbackImpl::supportGLSLDraw(void) -{ - return false; -} - -bool FallbackImpl::setupGLSLDraw(struct OCIO_GLSLDrawState ** /*state_r*/, - OCIO_ConstProcessorRcPtr * /*ocio_processor_scene_to_ui*/, - OCIO_ConstProcessorRcPtr * /*ocio_processor_ui_to_display*/, - OCIO_CurveMappingSettings * /*curve_mapping_settings*/, - float /*dither*/, - bool /*predivide*/, - bool /*overlay*/) -{ - return false; -} - -void FallbackImpl::finishGLSLDraw(OCIO_GLSLDrawState * /*state*/) -{ -} - -void FallbackImpl::freeGLState(struct OCIO_GLSLDrawState * /*state_r*/) -{ -} - const char *FallbackImpl::getVersionString(void) { return "fallback"; diff --git a/intern/opencolorio/gpu_shader_display_transform.glsl b/intern/opencolorio/gpu_shader_display_transform.glsl index 61da755f02f..ca0d2566ed1 100644 --- a/intern/opencolorio/gpu_shader_display_transform.glsl +++ b/intern/opencolorio/gpu_shader_display_transform.glsl @@ -1,17 +1,18 @@ /* Blender OpenColorIO implementation */ -uniform sampler1D curve_mapping_texture; uniform sampler2D image_texture; uniform sampler2D overlay_texture; -uniform sampler3D lut3d_texture; -uniform sampler3D lut3d_display_texture; uniform float dither; +uniform float scale; +uniform float exponent; uniform bool predivide; -uniform bool curve_mapping; uniform bool overlay; -layout(std140) uniform OCIO_GLSLCurveMappingParameters +#ifdef USE_CURVE_MAPPING +uniform sampler1D curve_mapping_texture; + +layout(std140) uniform OCIO_GPUCurveMappingParameters { /* Curve mapping parameters * @@ -114,6 +115,7 @@ vec4 curvemapping_evaluate_premulRGBF(vec4 col) result.a = col.a; return result; } +#endif /* USE_CURVE_MAPPING */ /* Using a triangle distribution which gives a more final uniform noise. * See Banding in Games:A Noisy Rant(revision 5) Mikkel Gjøl, Playdead (slide 27) */ @@ -145,9 +147,9 @@ vec4 apply_dither(vec4 col, vec2 uv) vec4 OCIO_ProcessColor(vec4 col, vec4 col_overlay, vec2 noise_uv) { - if (curve_mapping) { - col = curvemapping_evaluate_premulRGBF(col); - } +#ifdef USE_CURVE_MAPPING + col = curvemapping_evaluate_premulRGBF(col); +#endif if (predivide) { if (col.a > 0.0 && col.a < 1.0) { @@ -160,15 +162,31 @@ vec4 OCIO_ProcessColor(vec4 col, vec4 col_overlay, vec2 noise_uv) * for straight alpha at this moment */ - col = OCIO_to_display_linear_with_look(col, lut3d_texture); + /* Convert to scene linear (usually a no-op). */ + col = OCIO_to_scene_linear(col); + /* Apply exposure in scene linear. */ + col.rgb *= scale; + + /* Convert to display space. */ + col = OCIO_to_display(col); + + /* Blend with overlay in UI colorspace. + * + * UI colorspace here refers to the display linear color space, + * i.e: The linear color space w.r.t. display chromaticity and radiometry. + * We separate the colormanagement process into two steps to be able to + * merge UI using alpha blending in the correct color space. */ if (overlay) { + col.rgb = pow(col.rgb, vec3(exponent * 2.2)); col = clamp(col, 0.0, 1.0); col *= 1.0 - col_overlay.a; col += col_overlay; /* Assumed unassociated alpha. */ + col.rgb = pow(col.rgb, vec3(1.0 / 2.2)); + } + else { + col.rgb = pow(col.rgb, vec3(exponent)); } - - col = OCIO_to_display_encoded(col, lut3d_display_texture); if (dither > 0.0) { col = apply_dither(col, noise_uv); @@ -189,4 +207,4 @@ void main() vec2 noise_uv = round_to_pixel(image_texture, texCoord_interp.st); fragColor = OCIO_ProcessColor(col, col_overlay, noise_uv); -} \ No newline at end of file +} diff --git a/intern/opencolorio/ocio_capi.cc b/intern/opencolorio/ocio_capi.cc index 84c36de364c..49231dee501 100644 --- a/intern/opencolorio/ocio_capi.cc +++ b/intern/opencolorio/ocio_capi.cc @@ -194,40 +194,45 @@ OCIO_ConstProcessorRcPtr *OCIO_configGetProcessorWithNames(OCIO_ConstConfigRcPtr return impl->configGetProcessorWithNames(config, srcName, dstName); } -OCIO_ConstProcessorRcPtr *OCIO_configGetProcessor(OCIO_ConstConfigRcPtr *config, - OCIO_ConstTransformRcPtr *transform) +void OCIO_processorRelease(OCIO_ConstProcessorRcPtr *processor) { - return impl->configGetProcessor(config, transform); + impl->processorRelease(processor); } -void OCIO_processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img) +OCIO_ConstCPUProcessorRcPtr *OCIO_processorGetCPUProcessor(OCIO_ConstProcessorRcPtr *processor) { - impl->processorApply(processor, img); + return impl->processorGetCPUProcessor(processor); } -void OCIO_processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img) +void OCIO_cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, OCIO_PackedImageDesc *img) { - impl->processorApply_predivide(processor, img); + impl->cpuProcessorApply(cpu_processor, img); } -void OCIO_processorApplyRGB(OCIO_ConstProcessorRcPtr *processor, float *pixel) +void OCIO_cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img) { - impl->processorApplyRGB(processor, pixel); + impl->cpuProcessorApply_predivide(cpu_processor, img); } -void OCIO_processorApplyRGBA(OCIO_ConstProcessorRcPtr *processor, float *pixel) +void OCIO_cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel) { - impl->processorApplyRGBA(processor, pixel); + impl->cpuProcessorApplyRGB(cpu_processor, pixel); } -void OCIO_processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel) +void OCIO_cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel) { - impl->processorApplyRGBA_predivide(processor, pixel); + impl->cpuProcessorApplyRGBA(cpu_processor, pixel); } -void OCIO_processorRelease(OCIO_ConstProcessorRcPtr *p) +void OCIO_cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *processor, float *pixel) { - impl->processorRelease(p); + impl->cpuProcessorApplyRGBA_predivide(processor, pixel); +} + +void OCIO_cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *cpu_processor) +{ + impl->cpuProcessorRelease(cpu_processor); } const char *OCIO_colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs) @@ -245,49 +250,15 @@ const char *OCIO_colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs) return impl->colorSpaceGetFamily(cs); } -OCIO_DisplayTransformRcPtr *OCIO_createDisplayTransform(void) +OCIO_ConstProcessorRcPtr *OCIO_createDisplayProcessor(OCIO_ConstConfigRcPtr *config, + const char *input, + const char *view, + const char *display, + const char *look, + const float scale, + const float exponent) { - return impl->createDisplayTransform(); -} - -void OCIO_displayTransformSetInputColorSpaceName(OCIO_DisplayTransformRcPtr *dt, const char *name) -{ - impl->displayTransformSetInputColorSpaceName(dt, name); -} - -void OCIO_displayTransformSetDisplay(OCIO_DisplayTransformRcPtr *dt, const char *name) -{ - impl->displayTransformSetDisplay(dt, name); -} - -void OCIO_displayTransformSetView(OCIO_DisplayTransformRcPtr *dt, const char *name) -{ - impl->displayTransformSetView(dt, name); -} - -void OCIO_displayTransformSetDisplayCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *t) -{ - impl->displayTransformSetDisplayCC(dt, t); -} - -void OCIO_displayTransformSetLinearCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *t) -{ - impl->displayTransformSetLinearCC(dt, t); -} - -void OCIO_displayTransformSetLooksOverride(OCIO_DisplayTransformRcPtr *dt, const char *looks) -{ - impl->displayTransformSetLooksOverride(dt, looks); -} - -void OCIO_displayTransformSetLooksOverrideEnabled(OCIO_DisplayTransformRcPtr *dt, bool enabled) -{ - impl->displayTransformSetLooksOverrideEnabled(dt, enabled); -} - -void OCIO_displayTransformRelease(OCIO_DisplayTransformRcPtr *dt) -{ - impl->displayTransformRelease(dt); + return impl->createDisplayProcessor(config, input, view, display, look, scale, exponent); } OCIO_PackedImageDesc *OCIO_createOCIO_PackedImageDesc(float *data, @@ -307,108 +278,44 @@ void OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *id) impl->OCIO_PackedImageDescRelease(id); } -OCIO_GroupTransformRcPtr *OCIO_createGroupTransform(void) +bool OCIO_supportGPUShader() { - return impl->createGroupTransform(); + return impl->supportGPUShader(); } -void OCIO_groupTransformSetDirection(OCIO_GroupTransformRcPtr *gt, const bool forward) +bool OCIO_gpuDisplayShaderBind(OCIO_ConstConfigRcPtr *config, + const char *input, + const char *view, + const char *display, + const char *look, + OCIO_CurveMappingSettings *curve_mapping_settings, + const float scale, + const float exponent, + const float dither, + const bool use_predivide, + const bool use_overlay) { - impl->groupTransformSetDirection(gt, forward); + return impl->gpuDisplayShaderBind(config, + input, + view, + display, + look, + curve_mapping_settings, + scale, + exponent, + dither, + use_predivide, + use_overlay); } -void OCIO_groupTransformPushBack(OCIO_GroupTransformRcPtr *gt, OCIO_ConstTransformRcPtr *tr) +void OCIO_gpuDisplayShaderUnbind(void) { - impl->groupTransformPushBack(gt, tr); + impl->gpuDisplayShaderUnbind(); } -void OCIO_groupTransformRelease(OCIO_GroupTransformRcPtr *gt) +void OCIO_gpuCacheFree(void) { - impl->groupTransformRelease(gt); -} - -OCIO_ColorSpaceTransformRcPtr *OCIO_createColorSpaceTransform(void) -{ - return impl->createColorSpaceTransform(); -} - -void OCIO_colorSpaceTransformSetSrc(OCIO_ColorSpaceTransformRcPtr *ct, const char *name) -{ - impl->colorSpaceTransformSetSrc(ct, name); -} - -void OCIO_colorSpaceTransformRelease(OCIO_ColorSpaceTransformRcPtr *ct) -{ - impl->colorSpaceTransformRelease(ct); -} - -OCIO_ExponentTransformRcPtr *OCIO_createExponentTransform(void) -{ - return impl->createExponentTransform(); -} - -void OCIO_exponentTransformSetValue(OCIO_ExponentTransformRcPtr *et, const float *exponent) -{ - impl->exponentTransformSetValue(et, exponent); -} - -void OCIO_exponentTransformRelease(OCIO_ExponentTransformRcPtr *et) -{ - impl->exponentTransformRelease(et); -} - -OCIO_MatrixTransformRcPtr *OCIO_createMatrixTransform(void) -{ - return impl->createMatrixTransform(); -} - -void OCIO_matrixTransformSetValue(OCIO_MatrixTransformRcPtr *mt, - const float *m44, - const float *offset4) -{ - impl->matrixTransformSetValue(mt, m44, offset4); -} - -void OCIO_matrixTransformRelease(OCIO_MatrixTransformRcPtr *mt) -{ - impl->matrixTransformRelease(mt); -} - -void OCIO_matrixTransformScale(float *m44, float *offset4, const float *scale4f) -{ - impl->matrixTransformScale(m44, offset4, scale4f); -} - -int OCIO_supportGLSLDraw(void) -{ - return (int)impl->supportGLSLDraw(); -} - -int OCIO_setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, - OCIO_ConstProcessorRcPtr *ocio_processor_scene_to_ui, - OCIO_ConstProcessorRcPtr *ocio_processor_ui_to_display, - OCIO_CurveMappingSettings *curve_mapping_settings, - float dither, - bool predivide, - bool overlay) -{ - return (int)impl->setupGLSLDraw(state_r, - ocio_processor_scene_to_ui, - ocio_processor_ui_to_display, - curve_mapping_settings, - dither, - predivide, - overlay); -} - -void OCIO_finishGLSLDraw(struct OCIO_GLSLDrawState *state) -{ - impl->finishGLSLDraw(state); -} - -void OCIO_freeOGLState(struct OCIO_GLSLDrawState *state) -{ - impl->freeGLState(state); + impl->gpuCacheFree(); } const char *OCIO_getVersionString(void) diff --git a/intern/opencolorio/ocio_capi.h b/intern/opencolorio/ocio_capi.h index 57799222788..404154064b4 100644 --- a/intern/opencolorio/ocio_capi.h +++ b/intern/opencolorio/ocio_capi.h @@ -24,7 +24,7 @@ extern "C" { #endif -struct OCIO_GLSLDrawState; +typedef struct OCIO_GPUShader OCIO_GPUShader; #define OCIO_DECLARE_HANDLE(name) \ typedef struct name##__ { \ @@ -42,14 +42,9 @@ struct OCIO_GLSLDrawState; OCIO_DECLARE_HANDLE(OCIO_ConstConfigRcPtr); OCIO_DECLARE_HANDLE(OCIO_ConstColorSpaceRcPtr); OCIO_DECLARE_HANDLE(OCIO_ConstProcessorRcPtr); +OCIO_DECLARE_HANDLE(OCIO_ConstCPUProcessorRcPtr); OCIO_DECLARE_HANDLE(OCIO_ConstContextRcPtr); OCIO_DECLARE_HANDLE(OCIO_PackedImageDesc); -OCIO_DECLARE_HANDLE(OCIO_DisplayTransformRcPtr); -OCIO_DECLARE_HANDLE(OCIO_ConstTransformRcPtr); -OCIO_DECLARE_HANDLE(OCIO_ColorSpaceTransformRcPtr); -OCIO_DECLARE_HANDLE(OCIO_ExponentTransformRcPtr); -OCIO_DECLARE_HANDLE(OCIO_MatrixTransformRcPtr); -OCIO_DECLARE_HANDLE(OCIO_GroupTransformRcPtr); OCIO_DECLARE_HANDLE(OCIO_ConstLookRcPtr); /* Standard XYZ to linear sRGB transform, for fallback. */ @@ -163,32 +158,29 @@ void OCIO_lookRelease(OCIO_ConstLookRcPtr *look); OCIO_ConstProcessorRcPtr *OCIO_configGetProcessorWithNames(OCIO_ConstConfigRcPtr *config, const char *srcName, const char *dstName); -OCIO_ConstProcessorRcPtr *OCIO_configGetProcessor(OCIO_ConstConfigRcPtr *config, - OCIO_ConstTransformRcPtr *transform); +void OCIO_processorRelease(OCIO_ConstProcessorRcPtr *cpu_processor); -void OCIO_processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img); -void OCIO_processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img); -void OCIO_processorApplyRGB(OCIO_ConstProcessorRcPtr *processor, float *pixel); -void OCIO_processorApplyRGBA(OCIO_ConstProcessorRcPtr *processor, float *pixel); -void OCIO_processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel); - -void OCIO_processorRelease(OCIO_ConstProcessorRcPtr *p); +OCIO_ConstCPUProcessorRcPtr *OCIO_processorGetCPUProcessor(OCIO_ConstProcessorRcPtr *processor); +void OCIO_cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, OCIO_PackedImageDesc *img); +void OCIO_cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img); +void OCIO_cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel); +void OCIO_cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel); +void OCIO_cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + float *pixel); +void OCIO_cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *processor); const char *OCIO_colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs); const char *OCIO_colorSpaceGetDescription(OCIO_ConstColorSpaceRcPtr *cs); const char *OCIO_colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs); -OCIO_DisplayTransformRcPtr *OCIO_createDisplayTransform(void); -void OCIO_displayTransformSetInputColorSpaceName(OCIO_DisplayTransformRcPtr *dt, const char *name); -void OCIO_displayTransformSetDisplay(OCIO_DisplayTransformRcPtr *dt, const char *name); -void OCIO_displayTransformSetView(OCIO_DisplayTransformRcPtr *dt, const char *name); -void OCIO_displayTransformSetDisplayCC(OCIO_DisplayTransformRcPtr *dt, - OCIO_ConstTransformRcPtr *et); -void OCIO_displayTransformSetLinearCC(OCIO_DisplayTransformRcPtr *dt, - OCIO_ConstTransformRcPtr *et); -void OCIO_displayTransformSetLooksOverride(OCIO_DisplayTransformRcPtr *dt, const char *looks); -void OCIO_displayTransformSetLooksOverrideEnabled(OCIO_DisplayTransformRcPtr *dt, bool enabled); -void OCIO_displayTransformRelease(OCIO_DisplayTransformRcPtr *dt); +OCIO_ConstProcessorRcPtr *OCIO_createDisplayProcessor(OCIO_ConstConfigRcPtr *config, + const char *input, + const char *view, + const char *display, + const char *look, + const float scale, + const float exponent); OCIO_PackedImageDesc *OCIO_createOCIO_PackedImageDesc(float *data, long width, @@ -200,37 +192,20 @@ OCIO_PackedImageDesc *OCIO_createOCIO_PackedImageDesc(float *data, void OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *p); -OCIO_GroupTransformRcPtr *OCIO_createGroupTransform(void); -void OCIO_groupTransformSetDirection(OCIO_GroupTransformRcPtr *gt, const bool forward); -void OCIO_groupTransformPushBack(OCIO_GroupTransformRcPtr *gt, OCIO_ConstTransformRcPtr *tr); -void OCIO_groupTransformRelease(OCIO_GroupTransformRcPtr *gt); - -OCIO_ColorSpaceTransformRcPtr *OCIO_createColorSpaceTransform(void); -void OCIO_colorSpaceTransformSetSrc(OCIO_ColorSpaceTransformRcPtr *ct, const char *name); -void OCIO_colorSpaceTransformRelease(OCIO_ColorSpaceTransformRcPtr *ct); - -OCIO_ExponentTransformRcPtr *OCIO_createExponentTransform(void); -void OCIO_exponentTransformSetValue(OCIO_ExponentTransformRcPtr *et, const float *exponent); -void OCIO_exponentTransformRelease(OCIO_ExponentTransformRcPtr *et); - -OCIO_MatrixTransformRcPtr *OCIO_createMatrixTransform(void); -void OCIO_matrixTransformSetValue(OCIO_MatrixTransformRcPtr *mt, - const float *m44, - const float *offset4); -void OCIO_matrixTransformRelease(OCIO_MatrixTransformRcPtr *mt); - -void OCIO_matrixTransformScale(float *m44, float *offset4, const float *scale4); - -int OCIO_supportGLSLDraw(void); -int OCIO_setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, - OCIO_ConstProcessorRcPtr *ocio_processor_scene_to_ui, - OCIO_ConstProcessorRcPtr *ocio_processor_ui_to_display, - OCIO_CurveMappingSettings *curve_mapping_settings, - float dither, - bool predivide, - bool overlay); -void OCIO_finishGLSLDraw(struct OCIO_GLSLDrawState *state); -void OCIO_freeOGLState(struct OCIO_GLSLDrawState *state); +bool OCIO_supportGPUShader(void); +bool OCIO_gpuDisplayShaderBind(OCIO_ConstConfigRcPtr *config, + const char *input, + const char *view, + const char *display, + const char *look, + OCIO_CurveMappingSettings *curve_mapping_settings, + const float scale, + const float exponent, + const float dither, + const bool use_predivide, + const bool use_overlay); +void OCIO_gpuDisplayShaderUnbind(void); +void OCIO_gpuCacheFree(void); const char *OCIO_getVersionString(void); int OCIO_getVersionHex(void); diff --git a/intern/opencolorio/ocio_impl.cc b/intern/opencolorio/ocio_impl.cc index 0e25c89f5d7..c4d7a0c4fe9 100644 --- a/intern/opencolorio/ocio_impl.cc +++ b/intern/opencolorio/ocio_impl.cc @@ -17,6 +17,7 @@ * All rights reserved. */ +#include #include #include #include @@ -35,7 +36,9 @@ using namespace OCIO_NAMESPACE; #include "MEM_guardedalloc.h" +#include "BLI_math.h" #include "BLI_math_color.h" +#include "BLI_math_matrix.h" #include "ocio_impl.h" @@ -50,27 +53,6 @@ using namespace OCIO_NAMESPACE; # define __func__ __FUNCTION__ #endif -/* NOTE: This is because OCIO 1.1.0 has a bug which makes default - * display to be the one which is first alphabetically. - * - * Fix has been submitted as a patch - * https://github.com/imageworks/OpenColorIO/pull/638 - * - * For until then we use first usable display instead. */ -#define DEFAULT_DISPLAY_WORKAROUND -#ifdef DEFAULT_DISPLAY_WORKAROUND -# include -# include -# include -# include -# include -# include -using std::map; -using std::set; -using std::string; -using std::vector; -#endif - static void OCIO_reportError(const char *err) { std::cerr << "OpenColorIO Error: " << err << std::endl; @@ -213,30 +195,6 @@ int OCIOImpl::configGetIndexForColorSpace(OCIO_ConstConfigRcPtr *config, const c const char *OCIOImpl::configGetDefaultDisplay(OCIO_ConstConfigRcPtr *config) { -#ifdef DEFAULT_DISPLAY_WORKAROUND - if (getenv("OCIO_ACTIVE_DISPLAYS") == NULL) { - const char *active_displays = (*(ConstConfigRcPtr *)config)->getActiveDisplays(); - if (active_displays[0] != '\0') { - const char *separator_pos = strchr(active_displays, ','); - if (separator_pos == NULL) { - return active_displays; - } - static std::string active_display; - /* NOTE: Configuration is shared and is never changed during - * runtime, so we only guarantee two threads don't initialize at the - * same. */ - static std::mutex mutex; - mutex.lock(); - if (active_display.empty()) { - active_display = active_displays; - active_display[separator_pos - active_displays] = '\0'; - } - mutex.unlock(); - return active_display.c_str(); - } - } -#endif - try { return (*(ConstConfigRcPtr *)config)->getDefaultDisplay(); } @@ -271,90 +229,8 @@ const char *OCIOImpl::configGetDisplay(OCIO_ConstConfigRcPtr *config, int index) return NULL; } -#ifdef DEFAULT_DISPLAY_WORKAROUND -namespace { - -void splitStringEnvStyle(vector *tokens, const string &str) -{ - tokens->clear(); - const int len = str.length(); - int token_start = 0, token_length = 0; - for (int i = 0; i < len; ++i) { - const char ch = str[i]; - if (ch != ',' && ch != ':') { - /* Append non-separator char to a token. */ - ++token_length; - } - else { - /* Append current token to the list (if any). */ - if (token_length > 0) { - string token = str.substr(token_start, token_length); - tokens->push_back(token); - } - /* Re-set token pointers. */ - token_start = i + 1; - token_length = 0; - } - } - /* Append token which might be at the end of the string. */ - if (token_length != 0) { - string token = str.substr(token_start, token_length); - tokens->push_back(token); - } -} - -string stringToLower(const string &str) -{ - string lower = str; - std::transform(lower.begin(), lower.end(), lower.begin(), tolower); - return lower; -} - -} // namespace -#endif - const char *OCIOImpl::configGetDefaultView(OCIO_ConstConfigRcPtr *config, const char *display) { -#ifdef DEFAULT_DISPLAY_WORKAROUND - /* NOTE: We assume that first active view always exists for a default - * display. */ - if (getenv("OCIO_ACTIVE_VIEWS") == NULL) { - ConstConfigRcPtr config_ptr = *((ConstConfigRcPtr *)config); - const char *active_views_encoded = config_ptr->getActiveViews(); - if (active_views_encoded[0] != '\0') { - const string display_lower = stringToLower(display); - static map default_display_views; - static std::mutex mutex; - mutex.lock(); - /* Check if the view is already known. */ - map::const_iterator it = default_display_views.find(display_lower); - if (it != default_display_views.end()) { - mutex.unlock(); - return it->second.c_str(); - } - /* Active views. */ - vector active_views; - splitStringEnvStyle(&active_views, active_views_encoded); - /* Get all views supported by tge display. */ - set display_views; - const int num_display_views = config_ptr->getNumViews(display); - for (int view_index = 0; view_index < num_display_views; ++view_index) { - const char *view = config_ptr->getView(display, view_index); - display_views.insert(stringToLower(view)); - } - /* Get first view which is supported by tge display. */ - for (const string &view : active_views) { - const string view_lower = stringToLower(view); - if (display_views.find(view_lower) != display_views.end()) { - default_display_views[display_lower] = view; - mutex.unlock(); - return default_display_views[display_lower].c_str(); - } - } - mutex.unlock(); - } - } -#endif try { return (*(ConstConfigRcPtr *)config)->getDefaultView(display); } @@ -394,7 +270,7 @@ const char *OCIOImpl::configGetDisplayColorSpaceName(OCIO_ConstConfigRcPtr *conf const char *view) { try { - return (*(ConstConfigRcPtr *)config)->getDisplayColorSpaceName(display, view); + return (*(ConstConfigRcPtr *)config)->getDisplayViewColorSpaceName(display, view); } catch (Exception &exception) { OCIO_reportException(exception); @@ -406,13 +282,46 @@ const char *OCIOImpl::configGetDisplayColorSpaceName(OCIO_ConstConfigRcPtr *conf void OCIOImpl::configGetDefaultLumaCoefs(OCIO_ConstConfigRcPtr *config, float *rgb) { try { - (*(ConstConfigRcPtr *)config)->getDefaultLumaCoefs(rgb); + double rgb_double[3]; + (*(ConstConfigRcPtr *)config)->getDefaultLumaCoefs(rgb_double); + rgb[0] = rgb_double[0]; + rgb[1] = rgb_double[1]; + rgb[2] = rgb_double[2]; } catch (Exception &exception) { OCIO_reportException(exception); } } +static bool to_scene_linear_matrix(ConstConfigRcPtr &config, + const char *colorspace, + float to_scene_linear[3][3]) +{ + ConstProcessorRcPtr processor; + try { + processor = config->getProcessor(colorspace, ROLE_SCENE_LINEAR); + } + catch (Exception &exception) { + OCIO_reportException(exception); + return false; + } + + if (!processor) { + return false; + } + + ConstCPUProcessorRcPtr cpu_processor = processor->getDefaultCPUProcessor(); + if (!cpu_processor) { + return false; + } + + unit_m3(to_scene_linear); + cpu_processor->applyRGB(to_scene_linear[0]); + cpu_processor->applyRGB(to_scene_linear[1]); + cpu_processor->applyRGB(to_scene_linear[2]); + return true; +} + void OCIOImpl::configGetXYZtoRGB(OCIO_ConstConfigRcPtr *config_, float xyz_to_rgb[3][3]) { ConstConfigRcPtr config = (*(ConstConfigRcPtr *)config_); @@ -420,24 +329,25 @@ void OCIOImpl::configGetXYZtoRGB(OCIO_ConstConfigRcPtr *config_, float xyz_to_rg /* Default to ITU-BT.709 in case no appropriate transform found. */ memcpy(xyz_to_rgb, OCIO_XYZ_TO_LINEAR_SRGB, sizeof(OCIO_XYZ_TO_LINEAR_SRGB)); - /* Auto estimate from XYZ and scene_linear roles, assumed to be a linear transform. */ - if (config->hasRole("XYZ") && config->hasRole("scene_linear")) { - ConstProcessorRcPtr to_rgb_processor = config->getProcessor("XYZ", "scene_linear"); - if (to_rgb_processor) { - xyz_to_rgb[0][0] = 1.0f; - xyz_to_rgb[0][1] = 0.0f; - xyz_to_rgb[0][2] = 0.0f; - xyz_to_rgb[1][0] = 0.0f; - xyz_to_rgb[1][1] = 1.0f; - xyz_to_rgb[1][2] = 0.0f; - xyz_to_rgb[2][0] = 0.0f; - xyz_to_rgb[2][1] = 0.0f; - xyz_to_rgb[2][2] = 1.0f; - to_rgb_processor->applyRGB(xyz_to_rgb[0]); - to_rgb_processor->applyRGB(xyz_to_rgb[1]); - to_rgb_processor->applyRGB(xyz_to_rgb[2]); + /* Get from OpenColorO config if it has the required roles. */ + if (!config->hasRole(ROLE_SCENE_LINEAR)) { + return; + } + + if (config->hasRole("aces_interchange")) { + /* Standard OpenColorIO role, defined as ACES2065-1. */ + const float xyz_to_aces[3][3] = {{1.0498110175f, -0.4959030231f, 0.0f}, + {0.0f, 1.3733130458f, 0.0f}, + {-0.0000974845f, 0.0982400361f, 0.9912520182f}}; + float aces_to_rgb[3][3]; + if (to_scene_linear_matrix(config, "aces_interchange", aces_to_rgb)) { + mul_m3_m3m3(xyz_to_rgb, aces_to_rgb, xyz_to_aces); } } + else if (config->hasRole("XYZ")) { + /* Custom role used before the standard existed. */ + to_scene_linear_matrix(config, "XYZ", xyz_to_rgb); + } } int OCIOImpl::configGetNumLooks(OCIO_ConstConfigRcPtr *config) @@ -558,6 +468,8 @@ void OCIOImpl::colorSpaceIsBuiltin(OCIO_ConstConfigRcPtr *config_, return; } + ConstCPUProcessorRcPtr cpu_processor = processor->getDefaultCPUProcessor(); + is_scene_linear = true; is_srgb = true; for (int i = 0; i < 256; i++) { @@ -567,10 +479,10 @@ void OCIOImpl::colorSpaceIsBuiltin(OCIO_ConstConfigRcPtr *config_, float cG[3] = {0, v, 0}; float cB[3] = {0, 0, v}; float cW[3] = {v, v, v}; - processor->applyRGB(cR); - processor->applyRGB(cG); - processor->applyRGB(cB); - processor->applyRGB(cW); + cpu_processor->applyRGB(cR); + cpu_processor->applyRGB(cG); + cpu_processor->applyRGB(cB); + cpu_processor->applyRGB(cW); /* Make sure that there is no channel crosstalk. */ if (fabsf(cR[1]) > 1e-5f || fabsf(cR[2]) > 1e-5f || fabsf(cG[0]) > 1e-5f || @@ -612,62 +524,57 @@ OCIO_ConstProcessorRcPtr *OCIOImpl::configGetProcessorWithNames(OCIO_ConstConfig const char *srcName, const char *dstName) { - ConstProcessorRcPtr *p = OBJECT_GUARDED_NEW(ConstProcessorRcPtr); + ConstProcessorRcPtr *processor = OBJECT_GUARDED_NEW(ConstProcessorRcPtr); try { - *p = (*(ConstConfigRcPtr *)config)->getProcessor(srcName, dstName); + *processor = (*(ConstConfigRcPtr *)config)->getProcessor(srcName, dstName); - if (*p) - return (OCIO_ConstProcessorRcPtr *)p; + if (*processor) + return (OCIO_ConstProcessorRcPtr *)processor; } catch (Exception &exception) { OCIO_reportException(exception); } - OBJECT_GUARDED_DELETE(p, ConstProcessorRcPtr); + OBJECT_GUARDED_DELETE(processor, ConstProcessorRcPtr); return 0; } -OCIO_ConstProcessorRcPtr *OCIOImpl::configGetProcessor(OCIO_ConstConfigRcPtr *config, - OCIO_ConstTransformRcPtr *transform) +void OCIOImpl::processorRelease(OCIO_ConstProcessorRcPtr *processor) { - ConstProcessorRcPtr *p = OBJECT_GUARDED_NEW(ConstProcessorRcPtr); - - try { - *p = (*(ConstConfigRcPtr *)config)->getProcessor(*(ConstTransformRcPtr *)transform); - - if (*p) - return (OCIO_ConstProcessorRcPtr *)p; - } - catch (Exception &exception) { - OCIO_reportException(exception); - } - - OBJECT_GUARDED_DELETE(p, ConstProcessorRcPtr); - - return NULL; + OBJECT_GUARDED_DELETE(processor, ConstProcessorRcPtr); } -void OCIOImpl::processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img) +OCIO_ConstCPUProcessorRcPtr *OCIOImpl::processorGetCPUProcessor( + OCIO_ConstProcessorRcPtr *processor) +{ + ConstCPUProcessorRcPtr *cpu_processor = OBJECT_GUARDED_NEW(ConstCPUProcessorRcPtr); + *cpu_processor = (*(ConstProcessorRcPtr *)processor)->getDefaultCPUProcessor(); + return (OCIO_ConstCPUProcessorRcPtr *)cpu_processor; +} + +void OCIOImpl::cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img) { try { - (*(ConstProcessorRcPtr *)processor)->apply(*(PackedImageDesc *)img); + (*(ConstCPUProcessorRcPtr *)cpu_processor)->apply(*(PackedImageDesc *)img); } catch (Exception &exception) { OCIO_reportException(exception); } } -void OCIOImpl::processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, - OCIO_PackedImageDesc *img_) +void OCIOImpl::cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img_) { try { PackedImageDesc *img = (PackedImageDesc *)img_; int channels = img->getNumChannels(); if (channels == 4) { - float *pixels = img->getData(); + assert(img->isFloat()); + float *pixels = (float *)img->getData(); int width = img->getWidth(); int height = img->getHeight(); @@ -676,12 +583,12 @@ void OCIOImpl::processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, for (int x = 0; x < width; x++) { float *pixel = pixels + 4 * (y * width + x); - processorApplyRGBA_predivide(processor, pixel); + cpuProcessorApplyRGBA_predivide(cpu_processor, pixel); } } } else { - (*(ConstProcessorRcPtr *)processor)->apply(*img); + (*(ConstCPUProcessorRcPtr *)cpu_processor)->apply(*img); } } catch (Exception &exception) { @@ -689,20 +596,21 @@ void OCIOImpl::processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, } } -void OCIOImpl::processorApplyRGB(OCIO_ConstProcessorRcPtr *processor, float *pixel) +void OCIOImpl::cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel) { - (*(ConstProcessorRcPtr *)processor)->applyRGB(pixel); + (*(ConstCPUProcessorRcPtr *)cpu_processor)->applyRGB(pixel); } -void OCIOImpl::processorApplyRGBA(OCIO_ConstProcessorRcPtr *processor, float *pixel) +void OCIOImpl::cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel) { - (*(ConstProcessorRcPtr *)processor)->applyRGBA(pixel); + (*(ConstCPUProcessorRcPtr *)cpu_processor)->applyRGBA(pixel); } -void OCIOImpl::processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel) +void OCIOImpl::cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + float *pixel) { if (pixel[3] == 1.0f || pixel[3] == 0.0f) { - (*(ConstProcessorRcPtr *)processor)->applyRGBA(pixel); + (*(ConstCPUProcessorRcPtr *)cpu_processor)->applyRGBA(pixel); } else { float alpha, inv_alpha; @@ -714,7 +622,7 @@ void OCIOImpl::processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, pixel[1] *= inv_alpha; pixel[2] *= inv_alpha; - (*(ConstProcessorRcPtr *)processor)->applyRGBA(pixel); + (*(ConstCPUProcessorRcPtr *)cpu_processor)->applyRGBA(pixel); pixel[0] *= alpha; pixel[1] *= alpha; @@ -722,9 +630,9 @@ void OCIOImpl::processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, } } -void OCIOImpl::processorRelease(OCIO_ConstProcessorRcPtr *p) +void OCIOImpl::cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *cpu_processor) { - OBJECT_GUARDED_DELETE(p, ConstProcessorRcPtr); + OBJECT_GUARDED_DELETE(cpu_processor, ConstCPUProcessorRcPtr); } const char *OCIOImpl::colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs) @@ -742,57 +650,91 @@ const char *OCIOImpl::colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs) return (*(ConstColorSpaceRcPtr *)cs)->getFamily(); } -OCIO_DisplayTransformRcPtr *OCIOImpl::createDisplayTransform(void) +OCIO_ConstProcessorRcPtr *OCIOImpl::createDisplayProcessor(OCIO_ConstConfigRcPtr *config_, + const char *input, + const char *view, + const char *display, + const char *look, + const float scale, + const float exponent) + { - DisplayTransformRcPtr *dt = OBJECT_GUARDED_NEW(DisplayTransformRcPtr); + ConstConfigRcPtr config = *(ConstConfigRcPtr *)config_; + GroupTransformRcPtr group = GroupTransform::Create(); - *dt = DisplayTransform::Create(); + /* Exposure. */ + if (scale != 1.0f) { + /* Always apply exposure in scene linear. */ + ColorSpaceTransformRcPtr ct = ColorSpaceTransform::Create(); + ct->setSrc(input); + ct->setDst(ROLE_SCENE_LINEAR); + group->appendTransform(ct); - return (OCIO_DisplayTransformRcPtr *)dt; -} + /* Make further transforms aware of the color space change. */ + input = ROLE_SCENE_LINEAR; -void OCIOImpl::displayTransformSetInputColorSpaceName(OCIO_DisplayTransformRcPtr *dt, - const char *name) -{ - (*(DisplayTransformRcPtr *)dt)->setInputColorSpaceName(name); -} + /* Apply scale. */ + MatrixTransformRcPtr mt = MatrixTransform::Create(); + const double matrix[16] = { + scale, 0.0, 0.0, 0.0, 0.0, scale, 0.0, 0.0, 0.0, 0.0, scale, 0.0, 0.0, 0.0, 0.0, 1.0}; + mt->setMatrix(matrix); + group->appendTransform(mt); + } -void OCIOImpl::displayTransformSetDisplay(OCIO_DisplayTransformRcPtr *dt, const char *name) -{ - (*(DisplayTransformRcPtr *)dt)->setDisplay(name); -} + /* Add look transform. */ + bool use_look = (look != nullptr && look[0] != 0); + if (use_look) { + const char *look_output = LookTransform::GetLooksResultColorSpace( + config, config->getCurrentContext(), look); -void OCIOImpl::displayTransformSetView(OCIO_DisplayTransformRcPtr *dt, const char *name) -{ - (*(DisplayTransformRcPtr *)dt)->setView(name); -} + if (look_output != nullptr && look_output[0] != 0) { + LookTransformRcPtr lt = LookTransform::Create(); + lt->setSrc(input); + lt->setDst(look_output); + lt->setLooks(look); + group->appendTransform(lt); -void OCIOImpl::displayTransformSetDisplayCC(OCIO_DisplayTransformRcPtr *dt, - OCIO_ConstTransformRcPtr *t) -{ - (*(DisplayTransformRcPtr *)dt)->setDisplayCC(*(ConstTransformRcPtr *)t); -} + /* Make further transforms aware of the color space change. */ + input = look_output; + } + else { + /* For empty looks, no output color space is returned. */ + use_look = false; + } + } -void OCIOImpl::displayTransformSetLinearCC(OCIO_DisplayTransformRcPtr *dt, - OCIO_ConstTransformRcPtr *t) -{ - (*(DisplayTransformRcPtr *)dt)->setLinearCC(*(ConstTransformRcPtr *)t); -} + /* Add view and display transform. */ + DisplayViewTransformRcPtr dvt = DisplayViewTransform::Create(); + dvt->setSrc(input); + dvt->setLooksBypass(use_look); + dvt->setView(view); + dvt->setDisplay(display); + group->appendTransform(dvt); -void OCIOImpl::displayTransformSetLooksOverride(OCIO_DisplayTransformRcPtr *dt, const char *looks) -{ - (*(DisplayTransformRcPtr *)dt)->setLooksOverride(looks); -} + /* Gamma. */ + if (exponent != 1.0f) { + ExponentTransformRcPtr et = ExponentTransform::Create(); + const double value[4] = {exponent, exponent, exponent, 1.0}; + et->setValue(value); + group->appendTransform(et); + } -void OCIOImpl::displayTransformSetLooksOverrideEnabled(OCIO_DisplayTransformRcPtr *dt, - bool enabled) -{ - (*(DisplayTransformRcPtr *)dt)->setLooksOverrideEnabled(enabled); -} + /* Create processor from transform. This is the moment were OCIO validates + * the entire transform, no need to check for the validity of inputs above. */ + ConstProcessorRcPtr *p = OBJECT_GUARDED_NEW(ConstProcessorRcPtr); -void OCIOImpl::displayTransformRelease(OCIO_DisplayTransformRcPtr *dt) -{ - OBJECT_GUARDED_DELETE((DisplayTransformRcPtr *)dt, DisplayTransformRcPtr); + try { + *p = config->getProcessor(group); + + if (*p) + return (OCIO_ConstProcessorRcPtr *)p; + } + catch (Exception &exception) { + OCIO_reportException(exception); + } + + OBJECT_GUARDED_DELETE(p, ConstProcessorRcPtr); + return NULL; } OCIO_PackedImageDesc *OCIOImpl::createOCIO_PackedImageDesc(float *data, @@ -805,8 +747,14 @@ OCIO_PackedImageDesc *OCIOImpl::createOCIO_PackedImageDesc(float *data, { try { void *mem = MEM_mallocN(sizeof(PackedImageDesc), __func__); - PackedImageDesc *id = new (mem) PackedImageDesc( - data, width, height, numChannels, chanStrideBytes, xStrideBytes, yStrideBytes); + PackedImageDesc *id = new (mem) PackedImageDesc(data, + width, + height, + numChannels, + BIT_DEPTH_F32, + chanStrideBytes, + xStrideBytes, + yStrideBytes); return (OCIO_PackedImageDesc *)id; } @@ -822,96 +770,6 @@ void OCIOImpl::OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *id) OBJECT_GUARDED_DELETE((PackedImageDesc *)id, PackedImageDesc); } -OCIO_GroupTransformRcPtr *OCIOImpl::createGroupTransform(void) -{ - GroupTransformRcPtr *gt = OBJECT_GUARDED_NEW(GroupTransformRcPtr); - - *gt = GroupTransform::Create(); - - return (OCIO_GroupTransformRcPtr *)gt; -} - -void OCIOImpl::groupTransformSetDirection(OCIO_GroupTransformRcPtr *gt, const bool forward) -{ - TransformDirection dir = forward ? TRANSFORM_DIR_FORWARD : TRANSFORM_DIR_INVERSE; - (*(GroupTransformRcPtr *)gt)->setDirection(dir); -} - -void OCIOImpl::groupTransformPushBack(OCIO_GroupTransformRcPtr *gt, OCIO_ConstTransformRcPtr *tr) -{ - (*(GroupTransformRcPtr *)gt)->push_back(*(ConstTransformRcPtr *)tr); -} - -void OCIOImpl::groupTransformRelease(OCIO_GroupTransformRcPtr *gt) -{ - OBJECT_GUARDED_DELETE((GroupTransformRcPtr *)gt, GroupTransformRcPtr); -} - -OCIO_ColorSpaceTransformRcPtr *OCIOImpl::createColorSpaceTransform(void) -{ - ColorSpaceTransformRcPtr *ct = OBJECT_GUARDED_NEW(ColorSpaceTransformRcPtr); - - *ct = ColorSpaceTransform::Create(); - (*ct)->setDirection(TRANSFORM_DIR_FORWARD); - - return (OCIO_ColorSpaceTransformRcPtr *)ct; -} - -void OCIOImpl::colorSpaceTransformSetSrc(OCIO_ColorSpaceTransformRcPtr *ct, const char *name) -{ - (*(ColorSpaceTransformRcPtr *)ct)->setSrc(name); -} - -void OCIOImpl::colorSpaceTransformRelease(OCIO_ColorSpaceTransformRcPtr *ct) -{ - OBJECT_GUARDED_DELETE((ColorSpaceTransformRcPtr *)ct, ColorSpaceTransformRcPtr); -} - -OCIO_ExponentTransformRcPtr *OCIOImpl::createExponentTransform(void) -{ - ExponentTransformRcPtr *et = OBJECT_GUARDED_NEW(ExponentTransformRcPtr); - - *et = ExponentTransform::Create(); - - return (OCIO_ExponentTransformRcPtr *)et; -} - -void OCIOImpl::exponentTransformSetValue(OCIO_ExponentTransformRcPtr *et, const float *exponent) -{ - (*(ExponentTransformRcPtr *)et)->setValue(exponent); -} - -void OCIOImpl::exponentTransformRelease(OCIO_ExponentTransformRcPtr *et) -{ - OBJECT_GUARDED_DELETE((ExponentTransformRcPtr *)et, ExponentTransformRcPtr); -} - -OCIO_MatrixTransformRcPtr *OCIOImpl::createMatrixTransform(void) -{ - MatrixTransformRcPtr *mt = OBJECT_GUARDED_NEW(MatrixTransformRcPtr); - - *mt = MatrixTransform::Create(); - - return (OCIO_MatrixTransformRcPtr *)mt; -} - -void OCIOImpl::matrixTransformSetValue(OCIO_MatrixTransformRcPtr *mt, - const float *m44, - const float *offset4) -{ - (*(MatrixTransformRcPtr *)mt)->setValue(m44, offset4); -} - -void OCIOImpl::matrixTransformRelease(OCIO_MatrixTransformRcPtr *mt) -{ - OBJECT_GUARDED_DELETE((MatrixTransformRcPtr *)mt, MatrixTransformRcPtr); -} - -void OCIOImpl::matrixTransformScale(float *m44, float *offset4, const float *scale4f) -{ - MatrixTransform::Scale(m44, offset4, scale4f); -} - const char *OCIOImpl::getVersionString(void) { return GetVersion(); diff --git a/intern/opencolorio/ocio_impl.h b/intern/opencolorio/ocio_impl.h index 3ffc0a4a475..0c759a35e15 100644 --- a/intern/opencolorio/ocio_impl.h +++ b/intern/opencolorio/ocio_impl.h @@ -76,36 +76,30 @@ class IOCIOImpl { virtual OCIO_ConstProcessorRcPtr *configGetProcessorWithNames(OCIO_ConstConfigRcPtr *config, const char *srcName, const char *dstName) = 0; - virtual OCIO_ConstProcessorRcPtr *configGetProcessor(OCIO_ConstConfigRcPtr *config, - OCIO_ConstTransformRcPtr *transform) = 0; + virtual void processorRelease(OCIO_ConstProcessorRcPtr *processor) = 0; - virtual void processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img) = 0; - virtual void processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, - OCIO_PackedImageDesc *img) = 0; - virtual void processorApplyRGB(OCIO_ConstProcessorRcPtr *processor, float *pixel) = 0; - virtual void processorApplyRGBA(OCIO_ConstProcessorRcPtr *processor, float *pixel) = 0; - virtual void processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel) = 0; - - virtual void processorRelease(OCIO_ConstProcessorRcPtr *p) = 0; + virtual OCIO_ConstCPUProcessorRcPtr *processorGetCPUProcessor(OCIO_ConstProcessorRcPtr *p) = 0; + virtual void cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img) = 0; + virtual void cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img) = 0; + virtual void cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel) = 0; + virtual void cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel) = 0; + virtual void cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + float *pixel) = 0; + virtual void cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *cpu_processor) = 0; virtual const char *colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs) = 0; virtual const char *colorSpaceGetDescription(OCIO_ConstColorSpaceRcPtr *cs) = 0; virtual const char *colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs) = 0; - virtual OCIO_DisplayTransformRcPtr *createDisplayTransform(void) = 0; - virtual void displayTransformSetInputColorSpaceName(OCIO_DisplayTransformRcPtr *dt, - const char *name) = 0; - virtual void displayTransformSetDisplay(OCIO_DisplayTransformRcPtr *dt, const char *name) = 0; - virtual void displayTransformSetView(OCIO_DisplayTransformRcPtr *dt, const char *name) = 0; - virtual void displayTransformSetDisplayCC(OCIO_DisplayTransformRcPtr *dt, - OCIO_ConstTransformRcPtr *et) = 0; - virtual void displayTransformSetLinearCC(OCIO_DisplayTransformRcPtr *dt, - OCIO_ConstTransformRcPtr *et) = 0; - virtual void displayTransformSetLooksOverride(OCIO_DisplayTransformRcPtr *dt, - const char *looks) = 0; - virtual void displayTransformSetLooksOverrideEnabled(OCIO_DisplayTransformRcPtr *dt, - bool enabled) = 0; - virtual void displayTransformRelease(OCIO_DisplayTransformRcPtr *dt) = 0; + virtual OCIO_ConstProcessorRcPtr *createDisplayProcessor(OCIO_ConstConfigRcPtr *config, + const char *input, + const char *view, + const char *display, + const char *look, + const float scale, + const float exponent) = 0; virtual OCIO_PackedImageDesc *createOCIO_PackedImageDesc(float *data, long width, @@ -117,39 +111,31 @@ class IOCIOImpl { virtual void OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *p) = 0; - virtual OCIO_GroupTransformRcPtr *createGroupTransform(void) = 0; - virtual void groupTransformSetDirection(OCIO_GroupTransformRcPtr *gt, const bool forward) = 0; - virtual void groupTransformPushBack(OCIO_GroupTransformRcPtr *gt, - OCIO_ConstTransformRcPtr *transform) = 0; - virtual void groupTransformRelease(OCIO_GroupTransformRcPtr *gt) = 0; - - virtual OCIO_ColorSpaceTransformRcPtr *createColorSpaceTransform(void) = 0; - virtual void colorSpaceTransformSetSrc(OCIO_ColorSpaceTransformRcPtr *ct, const char *name) = 0; - virtual void colorSpaceTransformRelease(OCIO_ColorSpaceTransformRcPtr *ct) = 0; - - virtual OCIO_ExponentTransformRcPtr *createExponentTransform(void) = 0; - virtual void exponentTransformSetValue(OCIO_ExponentTransformRcPtr *et, - const float *exponent) = 0; - virtual void exponentTransformRelease(OCIO_ExponentTransformRcPtr *et) = 0; - - virtual OCIO_MatrixTransformRcPtr *createMatrixTransform(void) = 0; - virtual void matrixTransformSetValue(OCIO_MatrixTransformRcPtr *mt, - const float *m44, - const float *offset4) = 0; - virtual void matrixTransformRelease(OCIO_MatrixTransformRcPtr *mt) = 0; - - virtual void matrixTransformScale(float *m44, float *offset4, const float *scale4) = 0; - - virtual bool supportGLSLDraw(void) = 0; - virtual bool setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, - OCIO_ConstProcessorRcPtr *ocio_processor_scene_to_ui, - OCIO_ConstProcessorRcPtr *ocio_processor_ui_to_display, - OCIO_CurveMappingSettings *curve_mapping_settings, - float dither, - bool predivide, - bool overlay) = 0; - virtual void finishGLSLDraw(struct OCIO_GLSLDrawState *state) = 0; - virtual void freeGLState(struct OCIO_GLSLDrawState *state_r) = 0; + /* Optional GPU support. */ + virtual bool supportGPUShader() + { + return false; + } + virtual bool gpuDisplayShaderBind(OCIO_ConstConfigRcPtr * /*config*/, + const char * /*input*/, + const char * /*view*/, + const char * /*display*/, + const char * /*look*/, + OCIO_CurveMappingSettings * /*curve_mapping_settings*/, + const float /*scale*/, + const float /*exponent*/, + const float /*dither*/, + const bool /*use_predivide*/, + const bool /*use_overlay*/) + { + return false; + } + virtual void gpuDisplayShaderUnbind(void) + { + } + virtual void gpuCacheFree(void) + { + } virtual const char *getVersionString(void) = 0; virtual int getVersionHex(void) = 0; @@ -206,30 +192,28 @@ class FallbackImpl : public IOCIOImpl { OCIO_ConstProcessorRcPtr *configGetProcessorWithNames(OCIO_ConstConfigRcPtr *config, const char *srcName, const char *dstName); - OCIO_ConstProcessorRcPtr *configGetProcessor(OCIO_ConstConfigRcPtr *config, - OCIO_ConstTransformRcPtr *transform); + void processorRelease(OCIO_ConstProcessorRcPtr *processor); - void processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img); - void processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img); - void processorApplyRGB(OCIO_ConstProcessorRcPtr *processor, float *pixel); - void processorApplyRGBA(OCIO_ConstProcessorRcPtr *processor, float *pixel); - void processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel); - - void processorRelease(OCIO_ConstProcessorRcPtr *p); + OCIO_ConstCPUProcessorRcPtr *processorGetCPUProcessor(OCIO_ConstProcessorRcPtr *processor); + void cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, OCIO_PackedImageDesc *img); + void cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img); + void cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel); + void cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel); + void cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel); + void cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *cpu_processor); const char *colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs); const char *colorSpaceGetDescription(OCIO_ConstColorSpaceRcPtr *cs); const char *colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs); - OCIO_DisplayTransformRcPtr *createDisplayTransform(void); - void displayTransformSetInputColorSpaceName(OCIO_DisplayTransformRcPtr *dt, const char *name); - void displayTransformSetDisplay(OCIO_DisplayTransformRcPtr *dt, const char *name); - void displayTransformSetView(OCIO_DisplayTransformRcPtr *dt, const char *name); - void displayTransformSetDisplayCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *et); - void displayTransformSetLinearCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *et); - void displayTransformSetLooksOverride(OCIO_DisplayTransformRcPtr *dt, const char *looks); - void displayTransformSetLooksOverrideEnabled(OCIO_DisplayTransformRcPtr *dt, bool enabled); - void displayTransformRelease(OCIO_DisplayTransformRcPtr *dt); + OCIO_ConstProcessorRcPtr *createDisplayProcessor(OCIO_ConstConfigRcPtr *config, + const char *input, + const char *view, + const char *display, + const char *look, + const float scale, + const float exponent); OCIO_PackedImageDesc *createOCIO_PackedImageDesc(float *data, long width, @@ -241,38 +225,6 @@ class FallbackImpl : public IOCIOImpl { void OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *p); - OCIO_GroupTransformRcPtr *createGroupTransform(void); - void groupTransformSetDirection(OCIO_GroupTransformRcPtr *gt, const bool forward); - void groupTransformPushBack(OCIO_GroupTransformRcPtr *gt, OCIO_ConstTransformRcPtr *transform); - void groupTransformRelease(OCIO_GroupTransformRcPtr *gt); - - OCIO_ColorSpaceTransformRcPtr *createColorSpaceTransform(void); - void colorSpaceTransformSetSrc(OCIO_ColorSpaceTransformRcPtr *ct, const char *name); - void colorSpaceTransformRelease(OCIO_ColorSpaceTransformRcPtr *ct); - - OCIO_ExponentTransformRcPtr *createExponentTransform(void); - void exponentTransformSetValue(OCIO_ExponentTransformRcPtr *et, const float *exponent); - void exponentTransformRelease(OCIO_ExponentTransformRcPtr *et); - - OCIO_MatrixTransformRcPtr *createMatrixTransform(void); - void matrixTransformSetValue(OCIO_MatrixTransformRcPtr *mt, - const float *m44, - const float *offset4); - void matrixTransformRelease(OCIO_MatrixTransformRcPtr *mt); - - void matrixTransformScale(float *m44, float *offset4, const float *scale4); - - bool supportGLSLDraw(void); - bool setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, - OCIO_ConstProcessorRcPtr *ocio_processor_scene_to_ui, - OCIO_ConstProcessorRcPtr *ocio_processor_ui_to_display, - OCIO_CurveMappingSettings *curve_mapping_settings, - float dither, - bool predivide, - bool overlay); - void finishGLSLDraw(struct OCIO_GLSLDrawState *state); - void freeGLState(struct OCIO_GLSLDrawState *state_r); - const char *getVersionString(void); int getVersionHex(void); }; @@ -327,30 +279,28 @@ class OCIOImpl : public IOCIOImpl { OCIO_ConstProcessorRcPtr *configGetProcessorWithNames(OCIO_ConstConfigRcPtr *config, const char *srcName, const char *dstName); - OCIO_ConstProcessorRcPtr *configGetProcessor(OCIO_ConstConfigRcPtr *config, - OCIO_ConstTransformRcPtr *transform); + void processorRelease(OCIO_ConstProcessorRcPtr *processor); - void processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img); - void processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img); - void processorApplyRGB(OCIO_ConstProcessorRcPtr *processor, float *pixel); - void processorApplyRGBA(OCIO_ConstProcessorRcPtr *processor, float *pixel); - void processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel); - - void processorRelease(OCIO_ConstProcessorRcPtr *p); + OCIO_ConstCPUProcessorRcPtr *processorGetCPUProcessor(OCIO_ConstProcessorRcPtr *processor); + void cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, OCIO_PackedImageDesc *img); + void cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img); + void cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel); + void cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel); + void cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel); + void cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *cpu_processor); const char *colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs); const char *colorSpaceGetDescription(OCIO_ConstColorSpaceRcPtr *cs); const char *colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs); - OCIO_DisplayTransformRcPtr *createDisplayTransform(void); - void displayTransformSetInputColorSpaceName(OCIO_DisplayTransformRcPtr *dt, const char *name); - void displayTransformSetDisplay(OCIO_DisplayTransformRcPtr *dt, const char *name); - void displayTransformSetView(OCIO_DisplayTransformRcPtr *dt, const char *name); - void displayTransformSetDisplayCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *et); - void displayTransformSetLinearCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *et); - void displayTransformSetLooksOverride(OCIO_DisplayTransformRcPtr *dt, const char *looks); - void displayTransformSetLooksOverrideEnabled(OCIO_DisplayTransformRcPtr *dt, bool enabled); - void displayTransformRelease(OCIO_DisplayTransformRcPtr *dt); + OCIO_ConstProcessorRcPtr *createDisplayProcessor(OCIO_ConstConfigRcPtr *config, + const char *input, + const char *view, + const char *display, + const char *look, + const float scale, + const float exponent); OCIO_PackedImageDesc *createOCIO_PackedImageDesc(float *data, long width, @@ -362,37 +312,20 @@ class OCIOImpl : public IOCIOImpl { void OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *p); - OCIO_GroupTransformRcPtr *createGroupTransform(void); - void groupTransformSetDirection(OCIO_GroupTransformRcPtr *gt, const bool forward); - void groupTransformPushBack(OCIO_GroupTransformRcPtr *gt, OCIO_ConstTransformRcPtr *transform); - void groupTransformRelease(OCIO_GroupTransformRcPtr *gt); - - OCIO_ColorSpaceTransformRcPtr *createColorSpaceTransform(void); - void colorSpaceTransformSetSrc(OCIO_ColorSpaceTransformRcPtr *ct, const char *name); - void colorSpaceTransformRelease(OCIO_ColorSpaceTransformRcPtr *ct); - - OCIO_ExponentTransformRcPtr *createExponentTransform(void); - void exponentTransformSetValue(OCIO_ExponentTransformRcPtr *et, const float *exponent); - void exponentTransformRelease(OCIO_ExponentTransformRcPtr *et); - - OCIO_MatrixTransformRcPtr *createMatrixTransform(void); - void matrixTransformSetValue(OCIO_MatrixTransformRcPtr *mt, - const float *m44, - const float *offset4); - void matrixTransformRelease(OCIO_MatrixTransformRcPtr *mt); - - void matrixTransformScale(float *m44, float *offset4, const float *scale4); - - bool supportGLSLDraw(void); - bool setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, - OCIO_ConstProcessorRcPtr *ocio_processor_scene_to_ui, - OCIO_ConstProcessorRcPtr *ocio_processor_ui_to_display, - OCIO_CurveMappingSettings *curve_mapping_settings, - float dither, - bool predivide, - bool overlay); - void finishGLSLDraw(struct OCIO_GLSLDrawState *state); - void freeGLState(struct OCIO_GLSLDrawState *state_r); + bool supportGPUShader(); + bool gpuDisplayShaderBind(OCIO_ConstConfigRcPtr *config, + const char *input, + const char *view, + const char *display, + const char *look, + OCIO_CurveMappingSettings *curve_mapping_settings, + const float scale, + const float exponent, + const float dither, + const bool use_predivide, + const bool use_overlay); + void gpuDisplayShaderUnbind(void); + void gpuCacheFree(void); const char *getVersionString(void); int getVersionHex(void); diff --git a/intern/opencolorio/ocio_impl_glsl.cc b/intern/opencolorio/ocio_impl_glsl.cc index 0213646345c..590d7c07002 100644 --- a/intern/opencolorio/ocio_impl_glsl.cc +++ b/intern/opencolorio/ocio_impl_glsl.cc @@ -31,8 +31,10 @@ */ #include +#include #include #include +#include #ifdef _MSC_VER # pragma warning(push) @@ -53,24 +55,24 @@ using namespace OCIO_NAMESPACE; #include "ocio_impl.h" -static const int LUT3D_EDGE_SIZE = 64; -static const int LUT3D_TEXTURE_SIZE = sizeof(float) * 3 * LUT3D_EDGE_SIZE * LUT3D_EDGE_SIZE * - LUT3D_EDGE_SIZE; -static const int SHADER_CACHE_SIZE = 4; - -#define UBO_BIND_LOC 0 - extern "C" char datatoc_gpu_shader_display_transform_glsl[]; extern "C" char datatoc_gpu_shader_display_transform_vertex_glsl[]; /* **** OpenGL drawing routines using GLSL for color space transform ***** */ +enum OCIO_GPUTextureSlots { + TEXTURE_SLOT_IMAGE = 0, + TEXTURE_SLOT_OVERLAY = 1, + TEXTURE_SLOT_CURVE_MAPPING = 2, + TEXTURE_SLOT_LUTS_OFFSET = 3, +}; + /* Curve mapping parameters * * See documentation for OCIO_CurveMappingSettings to get fields descriptions. * (this ones pretty much copies stuff from C structure.) */ -struct OCIO_GLSLCurveMappingParameters { +struct OCIO_GPUCurveMappingParameters { float curve_mapping_mintable[4]; float curve_mapping_range[4]; float curve_mapping_ext_in_x[4]; @@ -89,79 +91,108 @@ struct OCIO_GLSLCurveMappingParameters { /** WARNING: Needs to be 16byte aligned. Used as UBO data. */ }; -struct OCIO_GLSLShader { - /** Cache IDs */ - std::string cacheId; +struct OCIO_GPUShader { + /* GPU shader. */ + struct GPUShader *shader = nullptr; - struct GPUShader *shader; /** Uniform locations. */ - int dither_loc; - int overlay_loc; - int predivide_loc; - int curve_mapping_loc; - int ubo_bind; - /** Error checking. */ - bool valid; + int scale_loc = 0; + int exponent_loc = 0; + int dither_loc = 0; + int overlay_loc = 0; + int predivide_loc = 0; + int ubo_bind = 0; + + /* Destructor. */ + ~OCIO_GPUShader() + { + if (shader) { + GPU_shader_free(shader); + } + } }; -struct OCIO_GLSLLut3d { - /** Cache IDs */ - std::string cacheId; - /** OpenGL Texture handles. NULL if not allocated. */ - GPUTexture *texture; - GPUTexture *texture_display; - GPUTexture *texture_dummy; - /** Error checking. */ - bool valid; +struct OCIO_GPULutTexture { + GPUTexture *texture = nullptr; + std::string sampler_name; }; -struct OCIO_GLSLCurveMappping { - /** Cache IDs */ - size_t cacheId; +struct OCIO_GPUUniform { + GpuShaderDesc::UniformData data; + std::string name; +}; + +struct OCIO_GPUTextures { + /** LUT Textures */ + std::vector luts; + + /* Dummy in case of no overlay. */ + GPUTexture *dummy = nullptr; + + /* Uniforms */ + std::vector uniforms; + + /* Destructor. */ + ~OCIO_GPUTextures() + { + for (OCIO_GPULutTexture &lut : luts) { + GPU_texture_free(lut.texture); + } + if (dummy) { + GPU_texture_free(dummy); + } + } +}; + +struct OCIO_GPUCurveMappping { /** GPU Uniform Buffer handle. 0 if not allocated. */ - GPUUniformBuf *buffer; + GPUUniformBuf *buffer = nullptr; /** OpenGL Texture handles. 0 if not allocated. */ - GPUTexture *texture; + GPUTexture *texture = nullptr; + /* To detect when to update the uniforms and textures. */ + size_t cache_id = 0; + + /* Destructor. */ + ~OCIO_GPUCurveMappping() + { + if (texture) { + GPU_texture_free(texture); + } + if (buffer) { + GPU_uniformbuf_free(buffer); + } + } +}; + +struct OCIO_GPUDisplayShader { + OCIO_GPUShader shader; + OCIO_GPUTextures textures; + OCIO_GPUCurveMappping curvemap; + + /* Cache variables. */ + std::string input; + std::string view; + std::string display; + std::string look; + bool use_curve_mapping = false; + /** Error checking. */ - bool valid; + bool valid = false; }; -struct OCIO_GLSLCacheHandle { - size_t cache_id; - void *data; -}; - -struct OCIO_GLSLDrawState { - /* Shader Cache */ - OCIO_GLSLCacheHandle shader_cache[SHADER_CACHE_SIZE]; - OCIO_GLSLCacheHandle lut3d_cache[SHADER_CACHE_SIZE]; - OCIO_GLSLCacheHandle curvemap_cache[SHADER_CACHE_SIZE]; -}; - -static OCIO_GLSLDrawState *allocateOpenGLState(void) -{ - return (OCIO_GLSLDrawState *)MEM_callocN(sizeof(OCIO_GLSLDrawState), "OCIO OpenGL State struct"); -} +static const int SHADER_CACHE_MAX_SIZE = 4; +std::list SHADER_CACHE; /* -------------------------------------------------------------------- */ /** \name Shader * \{ */ -static void updateGLSLShader(OCIO_GLSLShader *shader, - ConstProcessorRcPtr *processor_scene_to_ui, - ConstProcessorRcPtr *processpr_ui_to_display, - GpuShaderDesc *shader_desc, - const std::string &cache_id) +static bool createGPUShader(OCIO_GPUShader &shader, + OCIO_GPUTextures &textures, + const GpuShaderDescRcPtr &shaderdesc_to_scene_linear, + const GpuShaderDescRcPtr &shaderdesc_to_display, + const bool use_curve_mapping) { - if (shader->cacheId == cache_id) { - return; - } - - /* Delete any previous shader. */ - if (shader->shader) { - GPU_shader_free(shader->shader); - } - std::ostringstream os; { /* Fragment shader */ @@ -170,146 +201,222 @@ static void updateGLSLShader(OCIO_GLSLShader *shader, os << "#define texture2D texture\n"; os << "#define texture3D texture\n"; - shader_desc->setFunctionName("OCIO_to_display_linear_with_look"); - os << (*processor_scene_to_ui)->getGpuShaderText(*shader_desc) << "\n"; + if (use_curve_mapping) { + os << "#define USE_CURVE_MAPPING\n"; + } - shader_desc->setFunctionName("OCIO_to_display_encoded"); - os << (*processpr_ui_to_display)->getGpuShaderText(*shader_desc) << "\n"; + os << shaderdesc_to_scene_linear->getShaderText() << "\n"; + os << shaderdesc_to_display->getShaderText() << "\n"; os << datatoc_gpu_shader_display_transform_glsl; } - shader->shader = GPU_shader_create(datatoc_gpu_shader_display_transform_vertex_glsl, - os.str().c_str(), - NULL, - NULL, - NULL, - "OCIOShader"); + shader.shader = GPU_shader_create(datatoc_gpu_shader_display_transform_vertex_glsl, + os.str().c_str(), + nullptr, + nullptr, + nullptr, + "OCIOShader"); - if (shader->shader) { - shader->dither_loc = GPU_shader_get_uniform(shader->shader, "dither"); - shader->overlay_loc = GPU_shader_get_uniform(shader->shader, "overlay"); - shader->predivide_loc = GPU_shader_get_uniform(shader->shader, "predivide"); - shader->curve_mapping_loc = GPU_shader_get_uniform(shader->shader, "curve_mapping"); - shader->ubo_bind = GPU_shader_get_uniform_block_binding(shader->shader, - "OCIO_GLSLCurveMappingParameters"); - - GPU_shader_bind(shader->shader); - - /* Set texture bind point uniform once. This is saved by the shader. */ - GPUShader *sh = shader->shader; - GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "image_texture"), 0); - GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "overlay_texture"), 1); - GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "lut3d_texture"), 2); - GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "lut3d_display_texture"), 3); - GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "curve_mapping_texture"), 4); + if (shader.shader == nullptr) { + return false; } - shader->cacheId = cache_id; - shader->valid = (shader->shader != NULL); -} + shader.scale_loc = GPU_shader_get_uniform(shader.shader, "scale"); + shader.exponent_loc = GPU_shader_get_uniform(shader.shader, "exponent"); + shader.dither_loc = GPU_shader_get_uniform(shader.shader, "dither"); + shader.overlay_loc = GPU_shader_get_uniform(shader.shader, "overlay"); + shader.predivide_loc = GPU_shader_get_uniform(shader.shader, "predivide"); + shader.ubo_bind = GPU_shader_get_uniform_block_binding(shader.shader, + "OCIO_GPUCurveMappingParameters"); -static void ensureGLSLShader(OCIO_GLSLShader **shader_ptr, - ConstProcessorRcPtr *processor_scene_to_ui, - ConstProcessorRcPtr *processpr_ui_to_display, - GpuShaderDesc *shader_desc, - const std::string &cache_id) -{ - if (*shader_ptr != NULL) { - return; + GPU_shader_bind(shader.shader); + + /* Set texture bind point uniform once. This is saved by the shader. */ + GPUShader *sh = shader.shader; + GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "image_texture"), TEXTURE_SLOT_IMAGE); + GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "overlay_texture"), TEXTURE_SLOT_OVERLAY); + + if (use_curve_mapping) { + GPU_shader_uniform_int( + sh, GPU_shader_get_uniform(sh, "curve_mapping_texture"), TEXTURE_SLOT_CURVE_MAPPING); } - OCIO_GLSLShader *shader = OBJECT_GUARDED_NEW(OCIO_GLSLShader); - - updateGLSLShader(shader, processor_scene_to_ui, processpr_ui_to_display, shader_desc, cache_id); - - *shader_ptr = shader; -} - -static void freeGLSLShader(OCIO_GLSLShader *shader) -{ - if (shader->shader) { - GPU_shader_free(shader->shader); + /* Set LUT textures. */ + for (int i = 0; i < textures.luts.size(); i++) { + GPU_shader_uniform_int(sh, + GPU_shader_get_uniform(sh, textures.luts[i].sampler_name.c_str()), + TEXTURE_SLOT_LUTS_OFFSET + i); } - OBJECT_GUARDED_DELETE(shader, OCIO_GLSLShader); + /* Set uniforms. */ + for (OCIO_GPUUniform &uniform : textures.uniforms) { + const GpuShaderDesc::UniformData &data = uniform.data; + const char *name = uniform.name.c_str(); + + if (data.m_getDouble) { + GPU_shader_uniform_1f(sh, name, (float)data.m_getDouble()); + } + else if (data.m_getBool) { + GPU_shader_uniform_1f(sh, name, (float)(data.m_getBool() ? 1.0f : 0.0f)); + } + else if (data.m_getFloat3) { + GPU_shader_uniform_3f(sh, + name, + (float)data.m_getFloat3()[0], + (float)data.m_getFloat3()[1], + (float)data.m_getFloat3()[2]); + } + else if (data.m_vectorFloat.m_getSize && data.m_vectorFloat.m_getVector) { + GPU_shader_uniform_vector(sh, + GPU_shader_get_uniform(sh, name), + (int)data.m_vectorFloat.m_getSize(), + 1, + (float *)data.m_vectorFloat.m_getVector()); + } + else if (data.m_vectorInt.m_getSize && data.m_vectorInt.m_getVector) { + GPU_shader_uniform_vector_int(sh, + GPU_shader_get_uniform(sh, name), + (int)data.m_vectorInt.m_getSize(), + 1, + (int *)data.m_vectorInt.m_getVector()); + } + } + + return true; } /** \} */ /* -------------------------------------------------------------------- */ -/** \name Lut3D +/** \name Textures * \{ */ -static void updateGLSLLut3d(OCIO_GLSLLut3d *lut3d, - ConstProcessorRcPtr *processor_scene_to_ui, - ConstProcessorRcPtr *processpr_ui_to_display, - GpuShaderDesc *shader_desc, - const std::string &cache_id) +static bool addGPUUniform(OCIO_GPUTextures &textures, + const GpuShaderDescRcPtr &shader_desc, + int index) { - if (lut3d->cacheId == cache_id) - return; - - float *lut_data = (float *)MEM_mallocN(LUT3D_TEXTURE_SIZE, __func__); - - ConstProcessorRcPtr *ocio_processors[2] = {processor_scene_to_ui, processpr_ui_to_display}; - - for (int i = 0; i < 2; i++) { - ConstProcessorRcPtr *processor = ocio_processors[i]; - GPUTexture *texture = (&lut3d->texture)[i]; - - (*processor)->getGpuLut3D(lut_data, *shader_desc); - - int offset[3] = {0, 0, 0}; - int extent[3] = {LUT3D_EDGE_SIZE, LUT3D_EDGE_SIZE, LUT3D_EDGE_SIZE}; - GPU_texture_update_sub(texture, GPU_DATA_FLOAT, lut_data, UNPACK3(offset), UNPACK3(extent)); + OCIO_GPUUniform uniform; + uniform.name = shader_desc->getUniform(index, uniform.data); + if (uniform.data.m_type == UNIFORM_UNKNOWN) { + return false; } - MEM_freeN(lut_data); - - lut3d->cacheId = cache_id; + textures.uniforms.push_back(uniform); + return true; } -static void ensureGLSLLut3d(OCIO_GLSLLut3d **lut3d_ptr, - ConstProcessorRcPtr *processor_scene_to_ui, - ConstProcessorRcPtr *processpr_ui_to_display, - GpuShaderDesc *shaderDesc, - const std::string &cache_id) +static bool addGPULut2D(OCIO_GPUTextures &textures, + const GpuShaderDescRcPtr &shader_desc, + int index) { - if (*lut3d_ptr != NULL) { - return; + const char *texture_name = nullptr; + const char *sampler_name = nullptr; + unsigned int width = 0; + unsigned int height = 0; + GpuShaderCreator::TextureType channel = GpuShaderCreator::TEXTURE_RGB_CHANNEL; + Interpolation interpolation = INTERP_LINEAR; + shader_desc->getTexture( + index, texture_name, sampler_name, width, height, channel, interpolation); + + const float *values; + shader_desc->getTextureValues(index, values); + if (texture_name == nullptr || sampler_name == nullptr || width == 0 || height == 0 || + values == nullptr) { + return false; } - OCIO_GLSLLut3d *lut3d = OBJECT_GUARDED_NEW(OCIO_GLSLLut3d); + eGPUTextureFormat format = (channel == GpuShaderCreator::TEXTURE_RGB_CHANNEL) ? GPU_RGB16F : + GPU_R16F; - int extent[3] = {LUT3D_EDGE_SIZE, LUT3D_EDGE_SIZE, LUT3D_EDGE_SIZE}; + OCIO_GPULutTexture lut; + lut.texture = GPU_texture_create_2d(texture_name, width, height, 0, format, values); + if (lut.texture == nullptr) { + return false; + } - lut3d->texture = GPU_texture_create_3d( - "OCIOLut", UNPACK3(extent), 1, GPU_RGB16F, GPU_DATA_FLOAT, NULL); - GPU_texture_filter_mode(lut3d->texture, true); - GPU_texture_wrap_mode(lut3d->texture, false, true); + GPU_texture_filter_mode(lut.texture, interpolation != INTERP_NEAREST); + GPU_texture_wrap_mode(lut.texture, false, true); - lut3d->texture_display = GPU_texture_create_3d( - "OCIOLutDisplay", UNPACK3(extent), 1, GPU_RGB16F, GPU_DATA_FLOAT, NULL); - GPU_texture_filter_mode(lut3d->texture_display, true); - GPU_texture_wrap_mode(lut3d->texture_display, false, true); + lut.sampler_name = sampler_name; - lut3d->texture_dummy = GPU_texture_create_error(2, false); - - updateGLSLLut3d(lut3d, processor_scene_to_ui, processpr_ui_to_display, shaderDesc, cache_id); - - lut3d->valid = (lut3d->texture && lut3d->texture_display); - - *lut3d_ptr = lut3d; + textures.luts.push_back(lut); + return true; } -static void freeGLSLLut3d(OCIO_GLSLLut3d *lut3d) +static bool addGPULut3D(OCIO_GPUTextures &textures, + const GpuShaderDescRcPtr &shader_desc, + int index) { - GPU_texture_free(lut3d->texture); - GPU_texture_free(lut3d->texture_display); - GPU_texture_free(lut3d->texture_dummy); + const char *texture_name = nullptr; + const char *sampler_name = nullptr; + unsigned int edgelen = 0; + Interpolation interpolation = INTERP_LINEAR; + shader_desc->get3DTexture(index, texture_name, sampler_name, edgelen, interpolation); - OBJECT_GUARDED_DELETE(lut3d, OCIO_GLSLLut3d); + const float *values; + shader_desc->get3DTextureValues(index, values); + if (texture_name == nullptr || sampler_name == nullptr || edgelen == 0 || values == nullptr) { + return false; + } + + OCIO_GPULutTexture lut; + lut.texture = GPU_texture_create_3d( + texture_name, edgelen, edgelen, edgelen, 0, GPU_RGB16F, GPU_DATA_FLOAT, values); + if (lut.texture == nullptr) { + return false; + } + + GPU_texture_filter_mode(lut.texture, interpolation != INTERP_NEAREST); + GPU_texture_wrap_mode(lut.texture, false, true); + + lut.sampler_name = sampler_name; + + textures.luts.push_back(lut); + return true; +} + +static bool createGPUTextures(OCIO_GPUTextures &textures, + const GpuShaderDescRcPtr &shaderdesc_to_scene_linear, + const GpuShaderDescRcPtr &shaderdesc_to_display) +{ + textures.dummy = GPU_texture_create_error(2, false); + + textures.luts.clear(); + textures.uniforms.clear(); + + for (int index = 0; index < shaderdesc_to_scene_linear->getNumUniforms(); index++) { + if (!addGPUUniform(textures, shaderdesc_to_scene_linear, index)) { + return false; + } + } + for (int index = 0; index < shaderdesc_to_scene_linear->getNumTextures(); index++) { + if (!addGPULut2D(textures, shaderdesc_to_scene_linear, index)) { + return false; + } + } + for (int index = 0; index < shaderdesc_to_scene_linear->getNum3DTextures(); index++) { + if (!addGPULut3D(textures, shaderdesc_to_scene_linear, index)) { + return false; + } + } + for (int index = 0; index < shaderdesc_to_display->getNumUniforms(); index++) { + if (!addGPUUniform(textures, shaderdesc_to_display, index)) { + return false; + } + } + for (int index = 0; index < shaderdesc_to_display->getNumTextures(); index++) { + if (!addGPULut2D(textures, shaderdesc_to_display, index)) { + return false; + } + } + for (int index = 0; index < shaderdesc_to_display->getNum3DTextures(); index++) { + if (!addGPULut3D(textures, shaderdesc_to_display, index)) { + return false; + } + } + + return true; } /** \} */ @@ -317,72 +424,47 @@ static void freeGLSLLut3d(OCIO_GLSLLut3d *lut3d) /* -------------------------------------------------------------------- */ /** \name Curve Mapping * \{ */ -static void allocateCurveMappingTexture(OCIO_GLSLCurveMappping *curvemap, - OCIO_CurveMappingSettings *curve_mapping_settings) + +static bool createGPUCurveMapping(OCIO_GPUCurveMappping &curvemap, + OCIO_CurveMappingSettings *curve_mapping_settings) { - int lut_size = curve_mapping_settings ? curve_mapping_settings->lut_size : 1; - /* Do not initialize. Only if used. */ - curvemap->texture = GPU_texture_create_1d("OCIOCurveMap", lut_size, 1, GPU_RGBA16F, NULL); - GPU_texture_filter_mode(curvemap->texture, false); - GPU_texture_wrap_mode(curvemap->texture, false, true); + if (curve_mapping_settings) { + int lut_size = curve_mapping_settings->lut_size; + + curvemap.texture = GPU_texture_create_1d("OCIOCurveMap", lut_size, 1, GPU_RGBA16F, nullptr); + GPU_texture_filter_mode(curvemap.texture, false); + GPU_texture_wrap_mode(curvemap.texture, false, true); + + curvemap.buffer = GPU_uniformbuf_create(sizeof(OCIO_GPUCurveMappingParameters)); + + if (curvemap.texture == nullptr || curvemap.buffer == nullptr) { + return false; + } + } + + return true; } -/* curve_mapping_settings can be null. In this case we alloc a dummy curvemap. */ -static void ensureGLSLCurveMapping(OCIO_GLSLCurveMappping **curvemap_ptr, - OCIO_CurveMappingSettings *curve_mapping_settings) +static void updateGPUCurveMapping(OCIO_GPUCurveMappping &curvemap, + OCIO_CurveMappingSettings *curve_mapping_settings) { - if (*curvemap_ptr != NULL) { + /* Test if we need to update. The caller ensures the curve_mapping_settings + * changes when its contents changes. */ + if (curve_mapping_settings == nullptr || curvemap.cache_id == curve_mapping_settings->cache_id) { return; } - OCIO_GLSLCurveMappping *curvemap = OBJECT_GUARDED_NEW(OCIO_GLSLCurveMappping); - - /* Texture. */ - allocateCurveMappingTexture(curvemap, curve_mapping_settings); - - /* Uniform buffer object. */ - curvemap->buffer = GPU_uniformbuf_create(sizeof(OCIO_GLSLCurveMappingParameters)); - - curvemap->valid = (curvemap->texture != 0); - curvemap->cacheId = 0; - - *curvemap_ptr = curvemap; -} - -static void freeGLSLCurveMapping(OCIO_GLSLCurveMappping *curvemap) -{ - GPU_texture_free(curvemap->texture); - GPU_uniformbuf_free(curvemap->buffer); - - OBJECT_GUARDED_DELETE(curvemap, OCIO_GLSLCurveMappping); -} - -static void updateGLSLCurveMapping(OCIO_GLSLCurveMappping *curvemap, - OCIO_CurveMappingSettings *curve_mapping_settings, - size_t cacheId) -{ - /* No need to continue if curvemapping is not used. Just use whatever is in this cache. */ - if (curve_mapping_settings == NULL) - return; - - if (curvemap->cacheId == cacheId) - return; - - if (curvemap->cacheId == 0) { - /* This cache was previously used as dummy. Recreate the texture. */ - GPU_texture_free(curvemap->texture); - allocateCurveMappingTexture(curvemap, curve_mapping_settings); - } + curvemap.cache_id = curve_mapping_settings->cache_id; /* Update texture. */ int offset[3] = {0, 0, 0}; int extent[3] = {curve_mapping_settings->lut_size, 0, 0}; const float *pixels = curve_mapping_settings->lut; GPU_texture_update_sub( - curvemap->texture, GPU_DATA_FLOAT, pixels, UNPACK3(offset), UNPACK3(extent)); + curvemap.texture, GPU_DATA_FLOAT, pixels, UNPACK3(offset), UNPACK3(extent)); /* Update uniforms. */ - OCIO_GLSLCurveMappingParameters data; + OCIO_GPUCurveMappingParameters data; for (int i = 0; i < 4; i++) { data.curve_mapping_range[i] = curve_mapping_settings->range[i]; data.curve_mapping_mintable[i] = curve_mapping_settings->mintable[i]; @@ -402,198 +484,193 @@ static void updateGLSLCurveMapping(OCIO_GLSLCurveMappping *curvemap, data.curve_mapping_lut_size = curve_mapping_settings->lut_size; data.curve_mapping_use_extend_extrapolate = curve_mapping_settings->use_extend_extrapolate; - GPU_uniformbuf_update(curvemap->buffer, &data); - - curvemap->cacheId = cacheId; + GPU_uniformbuf_update(curvemap.buffer, &data); } /** \} */ /* -------------------------------------------------------------------- */ -/** \name LRU cache +/** \name OCIO GPU Shader Implementation * \{ */ -static size_t hash_string(const char *str) -{ - size_t i = 0, c; - while ((c = *str++)) { - i = i * 37 + c; - } - return i; -} - -static OCIO_GLSLCacheHandle *cacheSearch(OCIO_GLSLCacheHandle cache[SHADER_CACHE_SIZE], - size_t cache_id) -{ - OCIO_GLSLCacheHandle *cached_item = &cache[0]; - for (int i = 0; i < SHADER_CACHE_SIZE; i++, cached_item++) { - if (cached_item->data == NULL) { - continue; - } - else if (cached_item->cache_id == cache_id) { - /* LRU cache, so move to front. */ - OCIO_GLSLCacheHandle found_item = *cached_item; - for (int j = i; j > 0; j--) { - cache[j] = cache[j - 1]; - } - cache[0] = found_item; - return &cache[0]; - } - } - /* LRU cache, shift other items back so we can insert at the front. */ - OCIO_GLSLCacheHandle last_item = cache[SHADER_CACHE_SIZE - 1]; - for (int j = SHADER_CACHE_SIZE - 1; j > 0; j--) { - cache[j] = cache[j - 1]; - } - /* Copy last to front and let the caller initialize it. */ - cache[0] = last_item; - return &cache[0]; -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name OCIO GLSL Implementation - * \{ */ - -/* Detect if we can support GLSL drawing */ -bool OCIOImpl::supportGLSLDraw() +bool OCIOImpl::supportGPUShader() { /* Minimum supported version 3.3 does meet all requirements. */ return true; } +static OCIO_GPUDisplayShader &getGPUDisplayShader( + OCIO_ConstConfigRcPtr *config, + const char *input, + const char *view, + const char *display, + const char *look, + OCIO_CurveMappingSettings *curve_mapping_settings) +{ + /* Find existing shader in cache. */ + const bool use_curve_mapping = (curve_mapping_settings != nullptr); + for (std::list::iterator it = SHADER_CACHE.begin(); + it != SHADER_CACHE.end(); + it++) { + if (it->input == input && it->view == view && it->display == display && it->look == look && + it->use_curve_mapping == use_curve_mapping) { + /* Move to front of the cache to mark as most recently used. */ + if (it != SHADER_CACHE.begin()) { + SHADER_CACHE.splice(SHADER_CACHE.begin(), SHADER_CACHE, it); + } + + return *it; + } + } + + /* Remove least recently used element from cache. */ + if (SHADER_CACHE.size() >= SHADER_CACHE_MAX_SIZE) { + SHADER_CACHE.pop_back(); + } + + /* Create GPU shader. */ + SHADER_CACHE.emplace_front(); + OCIO_GPUDisplayShader &display_shader = SHADER_CACHE.front(); + + display_shader.input = input; + display_shader.view = view; + display_shader.display = display; + display_shader.look = look; + display_shader.use_curve_mapping = use_curve_mapping; + display_shader.valid = false; + + /* Create Processors. + * + * Scale and exponent are handled outside of OCIO shader so we can handle them + * as uniforms at the binding stage. OCIO would otherwise bake them into the + * shader code, requiring slow recompiles when interactively adjusting them. + * + * Note that OCIO does have the concept of dynamic properties, however there + * is no dynamic gamma and exposure is part of more expensive operations only. + * + * Since exposure must happen in scene linear, we use two processors. The input + * is usually scene linear already and so that conversion is often a no-op. + */ + OCIO_ConstProcessorRcPtr *processor_to_scene_linear = OCIO_configGetProcessorWithNames( + config, input, ROLE_SCENE_LINEAR); + OCIO_ConstProcessorRcPtr *processor_to_display = OCIO_createDisplayProcessor( + config, ROLE_SCENE_LINEAR, view, display, look, 1.0f, 1.0f); + + /* Create shader descriptions. */ + if (processor_to_scene_linear && processor_to_display) { + GpuShaderDescRcPtr shaderdesc_to_scene_linear = GpuShaderDesc::CreateShaderDesc(); + shaderdesc_to_scene_linear->setLanguage(GPU_LANGUAGE_GLSL_1_3); + shaderdesc_to_scene_linear->setFunctionName("OCIO_to_scene_linear"); + (*(ConstProcessorRcPtr *)processor_to_scene_linear) + ->getDefaultGPUProcessor() + ->extractGpuShaderInfo(shaderdesc_to_scene_linear); + shaderdesc_to_scene_linear->finalize(); + + GpuShaderDescRcPtr shaderdesc_to_display = GpuShaderDesc::CreateShaderDesc(); + shaderdesc_to_display->setLanguage(GPU_LANGUAGE_GLSL_1_3); + shaderdesc_to_display->setFunctionName("OCIO_to_display"); + (*(ConstProcessorRcPtr *)processor_to_display) + ->getDefaultGPUProcessor() + ->extractGpuShaderInfo(shaderdesc_to_display); + shaderdesc_to_display->finalize(); + + /* Create GPU shader and textures. */ + if (createGPUTextures( + display_shader.textures, shaderdesc_to_scene_linear, shaderdesc_to_display) && + createGPUCurveMapping(display_shader.curvemap, curve_mapping_settings) && + createGPUShader(display_shader.shader, + display_shader.textures, + shaderdesc_to_scene_linear, + shaderdesc_to_display, + use_curve_mapping)) { + display_shader.valid = true; + } + } + + /* Free processors. */ + if (processor_to_scene_linear) { + OCIO_processorRelease(processor_to_scene_linear); + } + if (processor_to_display) { + OCIO_processorRelease(processor_to_display); + } + + return display_shader; +} + /** - * Setup OpenGL contexts for a transform defined by processor using GLSL + * Setup GPU contexts for a transform defined by processor using GLSL. * All LUT allocating baking and shader compilation happens here. * * Once this function is called, callee could start drawing images * using regular 2D texture. * - * When all drawing is finished, finishGLSLDraw shall be called to - * restore OpenGL context to its pre-GLSL draw state. + * When all drawing is finished, gpuDisplayShaderUnbind must be called to + * restore GPU context to its previous state. */ -bool OCIOImpl::setupGLSLDraw(OCIO_GLSLDrawState **state_r, - OCIO_ConstProcessorRcPtr *ocio_processor_scene_to_ui, - OCIO_ConstProcessorRcPtr *ocio_processor_ui_to_display, - OCIO_CurveMappingSettings *curve_mapping_settings, - float dither, - bool use_predivide, - bool use_overlay) +bool OCIOImpl::gpuDisplayShaderBind(OCIO_ConstConfigRcPtr *config, + const char *input, + const char *view, + const char *display, + const char *look, + OCIO_CurveMappingSettings *curve_mapping_settings, + const float scale, + const float exponent, + const float dither, + const bool use_predivide, + const bool use_overlay) { - ConstProcessorRcPtr processor_scene_to_ui = *(ConstProcessorRcPtr *)ocio_processor_scene_to_ui; - ConstProcessorRcPtr processpr_ui_to_display = *( - ConstProcessorRcPtr *)ocio_processor_ui_to_display; - bool use_curve_mapping = curve_mapping_settings != NULL; - - if (!processor_scene_to_ui || !processor_scene_to_ui) { + /* Get GPU shader from cache or create new one. */ + OCIO_GPUDisplayShader &display_shader = getGPUDisplayShader( + config, input, view, display, look, curve_mapping_settings); + if (!display_shader.valid) { return false; } - /* Create state if needed. */ - OCIO_GLSLDrawState *state; - if (!*state_r) - *state_r = allocateOpenGLState(); - state = *state_r; + /* Verify the shader is valid. */ + OCIO_GPUTextures &textures = display_shader.textures; + OCIO_GPUShader &shader = display_shader.shader; + OCIO_GPUCurveMappping &curvemap = display_shader.curvemap; - /* Compute cache IDs. */ - GpuShaderDesc shaderDesc; - shaderDesc.setLanguage(GPU_LANGUAGE_GLSL_1_3); - shaderDesc.setFunctionName("OCIODisplay"); - shaderDesc.setLut3DEdgeLen(LUT3D_EDGE_SIZE); - - const char *shader_cache_str = processor_scene_to_ui->getGpuShaderTextCacheID(shaderDesc); - const char *lut3d_cache_str = processor_scene_to_ui->getGpuLut3DCacheID(shaderDesc); - /* Used for comparison. */ - std::string shaderCacheID = shader_cache_str; - std::string lut3dCacheID = lut3d_cache_str; - - size_t shader_cache_id = hash_string(shader_cache_str); - size_t lut3d_cache_id = hash_string(lut3d_cache_str); - size_t curvemap_cache_id = curve_mapping_settings ? curve_mapping_settings->cache_id : 0; - - OCIO_GLSLCacheHandle *shader_handle = cacheSearch(state->shader_cache, shader_cache_id); - OCIO_GLSLCacheHandle *lut3d_handle = cacheSearch(state->lut3d_cache, lut3d_cache_id); - /* We cannot keep more than one cache for curvemap because their cache id is a pointer. - * The pointer cannot be the same for one update but can be the same after a second update. */ - OCIO_GLSLCacheHandle *curvemap_handle = &state->curvemap_cache[0]; - - OCIO_GLSLShader **shader_ptr = (OCIO_GLSLShader **)&shader_handle->data; - OCIO_GLSLLut3d **lut3d_ptr = (OCIO_GLSLLut3d **)&lut3d_handle->data; - OCIO_GLSLCurveMappping **curvemap_ptr = (OCIO_GLSLCurveMappping **)&curvemap_handle->data; - - ensureGLSLShader( - shader_ptr, &processor_scene_to_ui, &processpr_ui_to_display, &shaderDesc, shaderCacheID); - ensureGLSLLut3d( - lut3d_ptr, &processor_scene_to_ui, &processpr_ui_to_display, &shaderDesc, shaderCacheID); - ensureGLSLCurveMapping(curvemap_ptr, curve_mapping_settings); - - OCIO_GLSLShader *shader = (OCIO_GLSLShader *)shader_handle->data; - OCIO_GLSLLut3d *shader_lut = (OCIO_GLSLLut3d *)lut3d_handle->data; - OCIO_GLSLCurveMappping *shader_curvemap = (OCIO_GLSLCurveMappping *)curvemap_handle->data; - - updateGLSLShader( - shader, &processor_scene_to_ui, &processpr_ui_to_display, &shaderDesc, shaderCacheID); - updateGLSLLut3d( - shader_lut, &processor_scene_to_ui, &processpr_ui_to_display, &shaderDesc, lut3dCacheID); - updateGLSLCurveMapping(shader_curvemap, curve_mapping_settings, curvemap_cache_id); - - /* Update handles cache keys. */ - shader_handle->cache_id = shader_cache_id; - lut3d_handle->cache_id = lut3d_cache_id; - curvemap_handle->cache_id = curvemap_cache_id; - - if (shader->valid && shader_lut->valid && shader_curvemap->valid) { - /* Bind textures to sampler units. Texture 0 is set by caller. - * Uniforms have already been set for texture bind points.*/ - - if (!use_overlay) { - /* Avoid missing binds. */ - GPU_texture_bind(shader_lut->texture_dummy, 1); - } - GPU_texture_bind(shader_lut->texture, 2); - GPU_texture_bind(shader_lut->texture_display, 3); - GPU_texture_bind(shader_curvemap->texture, 4); - - /* Bind UBO. */ - GPU_uniformbuf_bind(shader_curvemap->buffer, shader->ubo_bind); - - /* TODO(fclem): remove remains of IMM. */ - immBindShader(shader->shader); - - /* Bind Shader and set uniforms. */ - // GPU_shader_bind(shader->shader); - GPU_shader_uniform_float(shader->shader, shader->dither_loc, dither); - GPU_shader_uniform_int(shader->shader, shader->overlay_loc, use_overlay); - GPU_shader_uniform_int(shader->shader, shader->predivide_loc, use_predivide); - GPU_shader_uniform_int(shader->shader, shader->curve_mapping_loc, use_curve_mapping); - - return true; + /* Update and bind curve mapping data. */ + if (curve_mapping_settings) { + updateGPUCurveMapping(curvemap, curve_mapping_settings); + GPU_uniformbuf_bind(curvemap.buffer, shader.ubo_bind); + GPU_texture_bind(curvemap.texture, TEXTURE_SLOT_CURVE_MAPPING); } - return false; + /* Bind textures to sampler units. Texture 0 is set by caller. + * Uniforms have already been set for texture bind points.*/ + if (!use_overlay) { + /* Avoid missing binds. */ + GPU_texture_bind(textures.dummy, TEXTURE_SLOT_OVERLAY); + } + for (int i = 0; i < textures.luts.size(); i++) { + GPU_texture_bind(textures.luts[i].texture, TEXTURE_SLOT_LUTS_OFFSET + i); + } + + /* TODO(fclem): remove remains of IMM. */ + immBindShader(shader.shader); + + /* Bind Shader and set uniforms. */ + // GPU_shader_bind(shader.shader); + GPU_shader_uniform_float(shader.shader, shader.scale_loc, scale); + GPU_shader_uniform_float(shader.shader, shader.exponent_loc, exponent); + GPU_shader_uniform_float(shader.shader, shader.dither_loc, dither); + GPU_shader_uniform_int(shader.shader, shader.overlay_loc, use_overlay); + GPU_shader_uniform_int(shader.shader, shader.predivide_loc, use_predivide); + + return true; } -void OCIOImpl::finishGLSLDraw(OCIO_GLSLDrawState * /*state*/) +void OCIOImpl::gpuDisplayShaderUnbind() { immUnbindProgram(); } -void OCIOImpl::freeGLState(OCIO_GLSLDrawState *state) +void OCIOImpl::gpuCacheFree() { - for (int i = 0; i < SHADER_CACHE_SIZE; i++) { - if (state->shader_cache[i].data) { - freeGLSLShader((OCIO_GLSLShader *)state->shader_cache[i].data); - } - if (state->lut3d_cache[i].data) { - freeGLSLLut3d((OCIO_GLSLLut3d *)state->lut3d_cache[i].data); - } - if (state->curvemap_cache[i].data) { - freeGLSLCurveMapping((OCIO_GLSLCurveMappping *)state->curvemap_cache[i].data); - } - } - - MEM_freeN(state); + SHADER_CACHE.clear(); } /** \} */ diff --git a/intern/utfconv/utfconv.h b/intern/utfconv/utfconv.h index 6470802bedf..36dff288966 100644 --- a/intern/utfconv/utfconv.h +++ b/intern/utfconv/utfconv.h @@ -46,11 +46,11 @@ size_t count_utf_16_from_8(const char *string8); /** * conv_utf_*** errors */ -#define UTF_ERROR_NULL_IN 1 << 0 /* Error occures when requered parameter is missing*/ -#define UTF_ERROR_ILLCHAR 1 << 1 /* Error if character is in illigal UTF rage*/ +#define UTF_ERROR_NULL_IN (1 << 0) /* Error occures when requered parameter is missing*/ +#define UTF_ERROR_ILLCHAR (1 << 1) /* Error if character is in illigal UTF rage*/ #define UTF_ERROR_SMALL \ - 1 << 2 /* Passed size is to small. It gives legal string with character missing at the end*/ -#define UTF_ERROR_ILLSEQ 1 << 3 /* Error if sequence is broken and doesn't finish*/ + (1 << 2) /* Passed size is to small. It gives legal string with character missing at the end */ +#define UTF_ERROR_ILLSEQ (1 << 3) /* Error if sequence is broken and doesn't finish*/ /** * Converts utf-16 string to allocated utf-8 string diff --git a/release/datafiles/blender_icons.svg b/release/datafiles/blender_icons.svg index 16d50623fa4..f894ca3f298 100644 --- a/release/datafiles/blender_icons.svg +++ b/release/datafiles/blender_icons.svg @@ -1,5439 +1,17128 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - + + + + + - - - - - - + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - + + + + + - - - - - - + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - + + - - - - - - - - + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - + - - - + + + - - - - - + + + + + - - - - + + + + - - + + - - - - - + + + + + - - - - - - - - + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - + + + - - - + + + - - - - + + + + - - - + + + - - - + + + - - + + - - - - - - + + + + + + - - - - + + + + - - - + + + - - - - + + + + - - - + + + - - - - + + + + - - - - + + + + - - - + + + - - - + + + - - - + + + - - + + - - + + + - - - - + + + + - - - + + + - - - + + + - - - - - - + + + + + + - - + + - - - - - - - + + + + + + + - - - - + + + + - - - + + + - - - + + + - - - - - - + + + + + + - - - + + + - - - - + + + + - + - - - - + + + + - - - - - - - - + + + + + + + + - - + + - - - - - + + + + + - - - - - + + + + + - - - + + + - - - - + + + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - + - - - + + + - - - + + + - - + + - - + + - - + + - - - - + + + + - - - + + + - - - - - + + + + + - + - - - + + + - - + + - - - + + + - - + + - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - - - + + + + + - - - + + + - - - - + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - + + - - - + + + - - - + + + - - + + - - - - - + + + + + - - - + + + - - + + - - + + - - - + + + - - - - + + + + - - + + - - + + - - - - + + + + - - + + - - - - - - - - + + + + + + + + - - - + + + - - + + - - - - + + + + - - - + + + - - - + + + - - - + + + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - + - - - - + + + + - - - + + + - - - - - - - - - - - + + + + + + + + + + + - + - - - + + + - - - + + + - + - - - + + + - + - - - + + + - - - + + + - + - - - - - - - - - - + + + + + + + + + + - - - - - - + + + + + + - - - - + + + + - - - + + + - - - - - + + + + + - - - - - - - - + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - + + + + + + - - - - - + + + + + - + - - - - + + + + - - - - - + + + + + - - - - + + + + - - - - + + + + - - - + + + - - - - + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - + + + + + + - - - - - - + + + + + + - - + + - - - - - + + + + + - - - + + + - - - - + + + + - - + + - - - + + + - + - - - + + + - - - + + + - - + + - - - - - - + + + + + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - - + + + + - - - + + + - - - - + + + + - - - - + + + + - + - - - + + + - + - - - - + + + + - - - - - + + + + + - - - + + + - - + + - - - - - + + + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - + + + + + - - + + - - + + - - - + + + - - - + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - + + + - - + + - - - - + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - - - - - + + + + + - - + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - + - - - + + + - - + + - - - - + + + + - - - + + + - - - + + + - - - - + + + + - - - + + + - - - + + + - - + + - - - - - + + + + + - - - + + + - + - - - - + + + + - - - + + + - - - - + + + + - - - + + + - - - + + + - + - - - + + + - - - + + + - - - + + + - + - - - - + + + + - - - + + + - - - - - - - - - + + + + + + + + + - - - - + + + + - - - - + + + + - - - + + + - - - - + + + + - - - + + + - - - - - - - + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - + + + + + + - + - - - + + + - - - + + + - - - - - - - + + + + + + + - - - + + + - - - - + + + + - + - - - + + + - - - + + + - - - - + + + + - - - - - + + + + + - - - - - - - + + + + + + + - - - - + + + + - - - - + + + + - - + + - - - + + + - - - - + + + + - + - - - - - + + + + + - + - - + + - - + + - - - - + + + + - - + + - - - - - + + + + + - + - - - + + + - - + + - - - + + + - - - - + + + + - - - + + + - - - - - + + + + + - - - - + + + + - - - + + + - - + + - - - - + + + + - + - - - + + + - - - + + + - - - - - + + + + + - + - - - - + + + + - + - + - - + + - - - - + + + + - - - + + + - + - - - - + + + + - - - + + + - - - + + + - - - + + + - - - - + + + + - - - + + + - - - + + + - - + + - - + + - - + + - - - + + + - - - - + + + + - - - + + + - - + + - - - - + + + + - - - + + + - - + + - - - + + + - - - - + + + + - - - + + + - - + + - - - + + + - - - + + + - - - - + + + + - - - - - + + + + + - - - - + + + + - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - - - + + + + - - - + + + - - - + + + - - + + - - - - - - + + + + + + - - - - + + + + - - - + + + - - - + + + - + - - - + + + - - - + + + - - - - + + + + - - - + + + - - - + + + - - - + + + - - - - - - + + + + + + - - - - - + + + + + - - - + + + - - + + - - - + + + - - - - - - + + + + + + - - - + + + - - - - - + + + + + - - - - + + + + - - + + - - - - - - - + + + + + + + - - - - + + + + - - - + + + - - - - + + + + - - + + - - + + - - - - - + + + + + - - + + - - + + - - - + + + - - - + + + - - + + - - - - + + + + - - - - - + + + + + - - - - + + + + - - - + + + - - + + - - - + + + - + - - - + + + - - - + + + - - - - - - + + + + + + - - - + + + - - - - + + + + - - - - - + + + + + - - - - - + + + + + - - - - - - - - - + + + + + + + + + - - - + + + - - - - - + + + + + - - - + + + - - - + + + - - - - - + + + + + - - - - + + + + - - - - - - - + + + + + + + - - - + + + - - - + + + - - - - + + + + - - + + - - - - + + + + - - - + + + - - - - + + + + - - - + + + - - - - + + + + - - - + + + - - - + + + - - - - + + + + - - - + + + - - - + + + - - - - - - + + + + + + - - - - + + + + - - - - + + + + - - - + + + - - - + + + - - - + + + - - - - + + + + - - - - - - - - - + + + + + + + + + - - - - - + + + + + - + - - - - + + + + - - - - - + + + + + - - - - + + + + - - - - - + + + + + - - - + + + - - - + + + - + - - - + + + - - - + + + - - - + + + - + - - - + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - - + + + + - - - + + + - - - + + + - + - - - - - + + + + + - - - - + + + + - - - + + + - - - - - - - - + + + + + + + + - - - - - - + + + + + + - - - + + + - - - - - + + + + + - - - - + + + + - - - + + + - - - - + + + + - - - - - + + + + + - - - - + + + + - + - - - - + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - - + + + + - - - + + + - - - - - + + + + + - - - - + + + + - + - - - - - - + + + + + + - - - - + + + + - - + + - - - + + + - - - + + + - - - - + + + + - - - - + + + + - - - + + + - - - + + + - - - + + + - + - - - + + + - - - - - - + + + + + + - - + + - - - + + + - - - - - + + + + + - - + + - - - - - - - - - - + + + + + + + + + + - - + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - - - + + + + - - + + - - - - + + + + - - - + + + - - - + + + - - - + + + - + - - - + + + - - + + - - - - - - + + + + + + - + - - - + + + - - - - + + + + - - + + - - - - + + + + - - - + + + - - - + + + - - - - + + + + - - - - - + + + + + - - + + - - - + + + - - - - - - - - + + + + + + + + - - + + - - + + - - - - - - - - - + + + + + + + + + - + - - - + + + - - - + + + - + - - - + + + - - - + + + - - - + + + - - - + + - - - - - - + + + + + + - - - + + + + + + + - diff --git a/release/datafiles/blender_icons16/icon16_brush_blob.dat b/release/datafiles/blender_icons16/icon16_brush_blob.dat deleted file mode 100644 index 4f57ce5ef27..00000000000 Binary files a/release/datafiles/blender_icons16/icon16_brush_blob.dat and /dev/null differ diff --git a/release/datafiles/blender_icons16/icon16_clip.dat b/release/datafiles/blender_icons16/icon16_clip.dat deleted file mode 100644 index 75a39fc0bdf..00000000000 Binary files a/release/datafiles/blender_icons16/icon16_clip.dat and /dev/null differ diff --git a/release/datafiles/blender_icons16/icon16_sculpt_dyntopo.dat b/release/datafiles/blender_icons16/icon16_sculpt_dyntopo.dat deleted file mode 100644 index 08fc3aba73c..00000000000 Binary files a/release/datafiles/blender_icons16/icon16_sculpt_dyntopo.dat and /dev/null differ diff --git a/release/datafiles/blender_icons16/icon16_sealed.dat b/release/datafiles/blender_icons16/icon16_sealed.dat deleted file mode 100644 index 2c6e3bac48f..00000000000 Binary files a/release/datafiles/blender_icons16/icon16_sealed.dat and /dev/null differ diff --git a/release/datafiles/blender_icons16/icon16_spreadsheet.dat b/release/datafiles/blender_icons16/icon16_spreadsheet.dat new file mode 100644 index 00000000000..28f8f7b8f1e Binary files /dev/null and b/release/datafiles/blender_icons16/icon16_spreadsheet.dat differ diff --git a/release/datafiles/blender_icons32/icon32_axis_front.dat b/release/datafiles/blender_icons32/icon32_axis_front.dat index afcc15da233..ca9a0efd467 100644 Binary files a/release/datafiles/blender_icons32/icon32_axis_front.dat and b/release/datafiles/blender_icons32/icon32_axis_front.dat differ diff --git a/release/datafiles/blender_icons32/icon32_brush_blob.dat b/release/datafiles/blender_icons32/icon32_brush_blob.dat deleted file mode 100644 index 5f43c0e3943..00000000000 Binary files a/release/datafiles/blender_icons32/icon32_brush_blob.dat and /dev/null differ diff --git a/release/datafiles/blender_icons32/icon32_clip.dat b/release/datafiles/blender_icons32/icon32_clip.dat deleted file mode 100644 index 00fec392e77..00000000000 Binary files a/release/datafiles/blender_icons32/icon32_clip.dat and /dev/null differ diff --git a/release/datafiles/blender_icons32/icon32_mod_offset.dat b/release/datafiles/blender_icons32/icon32_mod_offset.dat index 232c79c0c59..eb767471c25 100644 Binary files a/release/datafiles/blender_icons32/icon32_mod_offset.dat and b/release/datafiles/blender_icons32/icon32_mod_offset.dat differ diff --git a/release/datafiles/blender_icons32/icon32_sculpt_dyntopo.dat b/release/datafiles/blender_icons32/icon32_sculpt_dyntopo.dat deleted file mode 100644 index 41e3c0c4fcc..00000000000 Binary files a/release/datafiles/blender_icons32/icon32_sculpt_dyntopo.dat and /dev/null differ diff --git a/release/datafiles/blender_icons32/icon32_sealed.dat b/release/datafiles/blender_icons32/icon32_sealed.dat deleted file mode 100644 index 37d48608be2..00000000000 Binary files a/release/datafiles/blender_icons32/icon32_sealed.dat and /dev/null differ diff --git a/release/datafiles/blender_icons32/icon32_spreadsheet.dat b/release/datafiles/blender_icons32/icon32_spreadsheet.dat new file mode 100644 index 00000000000..ec9486929f4 Binary files /dev/null and b/release/datafiles/blender_icons32/icon32_spreadsheet.dat differ diff --git a/release/datafiles/colormanagement/config.ocio b/release/datafiles/colormanagement/config.ocio index 5ad937e3efb..156ca960e88 100644 --- a/release/datafiles/colormanagement/config.ocio +++ b/release/datafiles/colormanagement/config.ocio @@ -39,8 +39,8 @@ roles: # Non-color data data: Non-Color - # CIE XYZ color space - XYZ: XYZ + # For interop between configs, and to determine XYZ for rendering + aces_interchange: Linear ACES # Specifed by OCIO, not used in Blender color_timing: Filmic Log @@ -64,7 +64,7 @@ displays: - ! {name: Standard, colorspace: Raw} active_displays: [sRGB, XYZ, None] -active_views: [Standard, Filmic, Filmic Log, Raw] +active_views: [Standard, Filmic, Filmic Log, Raw, False Color] colorspaces: - ! @@ -97,7 +97,10 @@ colorspaces: isdata: false allocation: lg2 allocationvars: [-8.5, 5] - to_reference: ! {src: rec709_to_aces.spimtx, interpolation: linear, direction: inverse} + from_reference: ! + children: + - ! {src: srgb_to_xyz.spimtx, interpolation: linear} + - ! {src: xyz_to_aces.spimtx, interpolation: linear} - ! name: nuke_rec709 diff --git a/release/datafiles/colormanagement/luts/aces_to_xyz.spimtx b/release/datafiles/colormanagement/luts/aces_to_xyz.spimtx deleted file mode 100644 index fbf52e63555..00000000000 --- a/release/datafiles/colormanagement/luts/aces_to_xyz.spimtx +++ /dev/null @@ -1,3 +0,0 @@ -0.9525523959 0.0000000000 0.0000936786 0 -0.3439664498 0.7281660966 -0.072132546 0 -0.0000000000 0.0000000000 1.0088251844 0 diff --git a/release/datafiles/colormanagement/luts/rec709_to_aces.spimtx b/release/datafiles/colormanagement/luts/rec709_to_aces.spimtx deleted file mode 100644 index 0f4f6bd68b4..00000000000 --- a/release/datafiles/colormanagement/luts/rec709_to_aces.spimtx +++ /dev/null @@ -1,3 +0,0 @@ -0.4395770431 0.3839148879 0.1765103489 0.0 -0.0895979404 0.8147120476 0.0956883803 0.0 -0.0174174830 0.1087378338 0.8738504052 0.0 diff --git a/release/datafiles/colormanagement/luts/xyz_to_aces.spimtx b/release/datafiles/colormanagement/luts/xyz_to_aces.spimtx new file mode 100644 index 00000000000..18bc78f5e63 --- /dev/null +++ b/release/datafiles/colormanagement/luts/xyz_to_aces.spimtx @@ -0,0 +1,3 @@ + 1.0498110175 0.0000000000 -0.0000974845 0 +-0.4959030231 1.3733130458 0.0982400361 0 + 0.0000000000 0.0000000000 0.9912520182 0 diff --git a/release/datafiles/locale b/release/datafiles/locale index 6c693b5b0b2..aafea2abb18 160000 --- a/release/datafiles/locale +++ b/release/datafiles/locale @@ -1 +1 @@ -Subproject commit 6c693b5b0b27468d4fd2d2c47ea023eebbb0dbc0 +Subproject commit aafea2abb18bb42e7d31a6926b2caba90f4e0316 diff --git a/release/datafiles/prvicons.png b/release/datafiles/prvicons.png index 4b7b23aa006..e97e2ae330e 100644 Binary files a/release/datafiles/prvicons.png and b/release/datafiles/prvicons.png differ diff --git a/release/datafiles/userdef/userdef_default_theme.c b/release/datafiles/userdef/userdef_default_theme.c index 2754b7f06f8..0477b0c9f23 100644 --- a/release/datafiles/userdef/userdef_default_theme.c +++ b/release/datafiles/userdef/userdef_default_theme.c @@ -489,16 +489,17 @@ const bTheme U_theme_default = { .facedot_size = 4, .info_selected = RGBA(0x3b5689ff), .info_selected_text = RGBA(0xffffffff), - .info_error = RGBA(0xff613dff), + .info_error = RGBA(0xb34c34ff), .info_error_text = RGBA(0xffffffff), - .info_warning = RGBA(0xf5bc41ff), + .info_warning = RGBA(0xac8737ff), .info_warning_text = RGBA(0xffffffff), - .info_info = RGBA(0x1d4383ff), + .info_info = RGBA(0x1f3862ff), .info_info_text = RGBA(0xffffffff), - .info_debug = RGBA(0xd3d3d3ff), - .info_property = RGBA(0x3ace87ff), + .info_debug = RGBA(0x6b3293ff), + .info_debug_text = RGBA(0xffffffff), + .info_property = RGBA(0x329364ff), .info_property_text = RGBA(0xffffffff), - .info_operator = RGBA(0x3ace87ff), + .info_operator = RGBA(0x329364ff), .info_operator_text = RGBA(0xffffffff), }, .space_action = { diff --git a/release/freedesktop/org.blender.Blender.appdata.xml b/release/freedesktop/org.blender.Blender.appdata.xml index edadf9d7438..f6d17834150 100644 --- a/release/freedesktop/org.blender.Blender.appdata.xml +++ b/release/freedesktop/org.blender.Blender.appdata.xml @@ -40,6 +40,50 @@ + + +

New features:

+
    +
  • Geometry nodes
  • +
  • EEVEE AOV and Cryptomatte support
  • +
  • Grease pencil Bézier curves edit
  • +
  • APIC fluid simulation method
  • +
  • Add primitive tool
  • +
+

Enhancements:

+
    +
  • Silhouette, elastic snake and smearing for sculpting
  • +
  • Grease pencil tracing image sequences support
  • +
  • Sparse NanoVDB grid for volume
  • +
  • OptiX hybrid rendering and new AO and bevel
  • +
  • Viscosity settings for fluid simulation
  • +
+ + + + +

New features:

+
    +
  • Volume modifiers
  • +
  • Precise boolean
  • +
  • Cloth brush collision
  • +
  • Custom curve bevels
  • +
  • Grease Pencil image tracer
  • +
  • Property search and fuzzy search
  • +
+

Enhancements:

+
    +
  • Boundary and pose cloth brushes
  • +
  • Material holdout for Grease Pencil
  • +
  • Sculpting gestures
  • +
  • Overrides resync and transform support
  • +
  • Animation proxy conversion
  • +
  • Compound shape collision
  • +
  • Outliner collection colors
  • +
  • Snappier F-Curves and seamless keyframe insertion
  • +
+
+

New features:

diff --git a/release/scripts/addons b/release/scripts/addons index dd01ddbe345..8adb0dce852 160000 --- a/release/scripts/addons +++ b/release/scripts/addons @@ -1 +1 @@ -Subproject commit dd01ddbe34518b8eeec5596c593c3f1d12fa0337 +Subproject commit 8adb0dce852d84bfe1f9e81399681fa615b5aa8e diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib index eae381b6982..a140f066ac9 160000 --- a/release/scripts/addons_contrib +++ b/release/scripts/addons_contrib @@ -1 +1 @@ -Subproject commit eae381b698248e70e4a3c62bdf239f9d5a0470a9 +Subproject commit a140f066ac99e1860af38080f008507029a34706 diff --git a/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py b/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py index 8e0832fe8da..180f9f0a01c 100644 --- a/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py +++ b/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py @@ -735,7 +735,9 @@ def dump_src_messages(msgs, reports, settings): _clean_str = re.compile(settings.str_clean_re).finditer def clean_str(s): - return "".join(m.group("clean") for m in _clean_str(s)) + # The encode/decode to/from 'raw_unicode_escape' allows to transform the C-type unicode hexadecimal escapes + # (like '\u2715' for the '×' symbol) back into a proper unicode character. + return "".join(m.group("clean") for m in _clean_str(s)).encode('raw_unicode_escape').decode('raw_unicode_escape') def dump_src_file(path, rel_path, msgs, reports, settings): def process_entry(_msgctxt, _msgid): @@ -862,7 +864,7 @@ def dump_messages(do_messages, do_checks, settings): dump_src_messages(msgs, reports, settings) # Get strings from addons' categories. - for uid, label, tip in bpy.types.WindowManager.addon_filter[1]['items'](bpy.context.window_manager, bpy.context): + for uid, label, tip in bpy.types.WindowManager.addon_filter.keywords['items'](bpy.context.window_manager, bpy.context): process_msg(msgs, settings.DEFAULT_CONTEXT, label, "Add-ons' categories", reports, None, settings) if tip: process_msg(msgs, settings.DEFAULT_CONTEXT, tip, "Add-ons' categories", reports, None, settings) diff --git a/release/scripts/modules/bl_i18n_utils/settings.py b/release/scripts/modules/bl_i18n_utils/settings.py index 86070262e56..51b326fb338 100644 --- a/release/scripts/modules/bl_i18n_utils/settings.py +++ b/release/scripts/modules/bl_i18n_utils/settings.py @@ -353,6 +353,7 @@ WARN_MSGID_NOT_CAPITALIZED_ALLOWED = { "wav", "wmOwnerID '%s' not in workspace '%s'", "y", + "y = (Ax + B)", # Sub-strings. "available with", "brown fox", diff --git a/release/scripts/modules/bl_i18n_utils/utils_spell_check.py b/release/scripts/modules/bl_i18n_utils/utils_spell_check.py index 49dadd422ca..6046e8e74d8 100644 --- a/release/scripts/modules/bl_i18n_utils/utils_spell_check.py +++ b/release/scripts/modules/bl_i18n_utils/utils_spell_check.py @@ -645,6 +645,7 @@ class SpellChecker: # Acronyms "aa", "msaa", "ao", + "aov", "aovs", "api", "apic", # Affine Particle-In-Cell "asc", "cdl", diff --git a/release/scripts/modules/bpy/utils/__init__.py b/release/scripts/modules/bpy/utils/__init__.py index 7f39cc5d422..2b19d23a367 100644 --- a/release/scripts/modules/bpy/utils/__init__.py +++ b/release/scripts/modules/bpy/utils/__init__.py @@ -82,14 +82,39 @@ _is_factory_startup = _bpy.app.factory_startup def execfile(filepath, mod=None): - # module name isn't used or added to 'sys.modules'. - # passing in 'mod' allows re-execution without having to reload. + """ + Execute a file path as a Python script. + + :arg filepath: Path of the script to execute. + :type filepath: string + :arg mod: Optional cached module, the result of a previous execution. + :type mod: Module or None + :return: The module which can be passed back in as ``mod``. + :rtype: ModuleType + """ import importlib.util - mod_spec = importlib.util.spec_from_file_location("__main__", filepath) + mod_name = "__main__" + mod_spec = importlib.util.spec_from_file_location(mod_name, filepath) if mod is None: mod = importlib.util.module_from_spec(mod_spec) - mod_spec.loader.exec_module(mod) + + # While the module name is not added to `sys.modules`, it's important to temporarily + # include this so statements such as `sys.modules[cls.__module__].__dict__` behave as expected. + # See: https://bugs.python.org/issue9499 for details. + modules = _sys.modules + mod_orig = modules.get(mod_name, None) + modules[mod_name] = mod + + # No error supression, just ensure `sys.modules[mod_name]` is properly restored in the case of an error. + try: + mod_spec.loader.exec_module(mod) + finally: + if mod_orig is None: + modules.pop(mod_name, None) + else: + modules[mod_name] = mod_orig + return mod @@ -121,15 +146,25 @@ def _test_import(module_name, loaded_modules): return mod -# Reloading would add twice. +# Check before adding paths as reloading would add twice. + +# Storing and restoring the full `sys.path` is risky as this may be intentionally modified +# by technical users/developers. +# +# Instead, track which paths have been added, clearing them before refreshing. +# This supports the case of loading a new preferences file which may reset scripts path. +_sys_path_ensure_paths = set() + def _sys_path_ensure_prepend(path): if path not in _sys.path: _sys.path.insert(0, path) + _sys_path_ensure_paths.add(path) def _sys_path_ensure_append(path): if path not in _sys.path: _sys.path.append(path) + _sys_path_ensure_paths.add(path) def modules_from_path(path, loaded_modules): @@ -391,6 +426,13 @@ def refresh_script_paths(): Run this after creating new script paths to update sys.path """ + for path in _sys_path_ensure_paths: + try: + _sys.path.remove(path) + except ValueError: + pass + _sys_path_ensure_paths.clear() + for base_path in script_paths(): for path_subdir in _script_module_dirs: path = _os.path.join(base_path, path_subdir) diff --git a/release/scripts/modules/bpy_extras/object_utils.py b/release/scripts/modules/bpy_extras/object_utils.py index 8d85c19d066..8afb09882fd 100644 --- a/release/scripts/modules/bpy_extras/object_utils.py +++ b/release/scripts/modules/bpy_extras/object_utils.py @@ -17,6 +17,7 @@ # ##### END GPL LICENSE BLOCK ##### # +from __future__ import annotations __all__ = ( "add_object_align_init", @@ -172,16 +173,15 @@ class AddObjectHelper: if self.align == 'WORLD': self.rotation.zero() - align_items = ( - ('WORLD', "World", "Align the new object to the world"), - ('VIEW', "View", "Align the new object to the view"), - ('CURSOR', "3D Cursor", "Use the 3D cursor orientation for the new object") - ) align: EnumProperty( name="Align", - items=align_items, + items=( + ('WORLD', "World", "Align the new object to the world"), + ('VIEW', "View", "Align the new object to the view"), + ('CURSOR', "3D Cursor", "Use the 3D cursor orientation for the new object"), + ), default='WORLD', - update=align_update_callback, + update=AddObjectHelper.align_update_callback, ) location: FloatVectorProperty( name="Location", diff --git a/release/scripts/modules/rna_manual_reference.py b/release/scripts/modules/rna_manual_reference.py index 3f5b31f8cfd..b2f1cfe23e9 100644 --- a/release/scripts/modules/rna_manual_reference.py +++ b/release/scripts/modules/rna_manual_reference.py @@ -77,7 +77,9 @@ url_manual_mapping = ( ("bpy.types.fluiddomainsettings.color_ramp_field_scale*", "physics/fluid/type/domain/gas/viewport_display.html#bpy-types-fluiddomainsettings-color-ramp-field-scale"), ("bpy.types.fluiddomainsettings.use_adaptive_timesteps*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-use-adaptive-timesteps"), ("bpy.types.fluiddomainsettings.use_dissolve_smoke_log*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-use-dissolve-smoke-log"), + ("bpy.types.greasepencil.use_adaptive_curve_resolution*", "grease_pencil/modes/edit/curve_editing.html#bpy-types-greasepencil-use-adaptive-curve-resolution"), ("bpy.types.linestylegeometrymodifier_polygonalization*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/polygonization.html#bpy-types-linestylegeometrymodifier-polygonalization"), + ("bpy.types.toolsettings.use_gpencil_automerge_strokes*", "grease_pencil/modes/draw/introduction.html#bpy-types-toolsettings-use-gpencil-automerge-strokes"), ("bpy.types.toolsettings.use_proportional_edit_objects*", "editors/3dview/controls/proportional_editing.html#bpy-types-toolsettings-use-proportional-edit-objects"), ("bpy.ops.view3d.edit_mesh_extrude_move_shrink_fatten*", "modeling/meshes/editing/face/extrude_faces_normal.html#bpy-ops-view3d-edit-mesh-extrude-move-shrink-fatten"), ("bpy.types.cyclesrendersettings.distance_cull_margin*", "render/cycles/render_settings/simplify.html#bpy-types-cyclesrendersettings-distance-cull-margin"), @@ -105,6 +107,7 @@ url_manual_mapping = ( ("bpy.types.materialgpencilstyle.use_overlap_strokes*", "grease_pencil/materials/grease_pencil_shader.html#bpy-types-materialgpencilstyle-use-overlap-strokes"), ("bpy.types.toolsettings.use_gpencil_weight_data_add*", "grease_pencil/modes/draw/introduction.html#bpy-types-toolsettings-use-gpencil-weight-data-add"), ("bpy.types.view3doverlay.texture_paint_mode_opacity*", "editors/3dview/display/overlays.html#bpy-types-view3doverlay-texture-paint-mode-opacity"), + ("bpy.types.bakesettings.use_pass_ambient_occlusion*", "render/cycles/baking.html#bpy-types-bakesettings-use-pass-ambient-occlusion"), ("bpy.types.brush.surface_smooth_shape_preservation*", "sculpt_paint/sculpting/tools/smooth.html#bpy-types-brush-surface-smooth-shape-preservation"), ("bpy.types.brush.use_cloth_pin_simulation_boundary*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-use-cloth-pin-simulation-boundary"), ("bpy.types.brushgpencilsettings.show_fill_boundary*", "grease_pencil/modes/draw/tools/fill.html#bpy-types-brushgpencilsettings-show-fill-boundary"), @@ -130,6 +133,7 @@ url_manual_mapping = ( ("bpy.types.view3doverlay.vertex_paint_mode_opacity*", "editors/3dview/display/overlays.html#bpy-types-view3doverlay-vertex-paint-mode-opacity"), ("bpy.types.viewlayer.use_pass_cryptomatte_accurate*", "render/layers/passes.html#bpy-types-viewlayer-use-pass-cryptomatte-accurate"), ("bpy.types.viewlayer.use_pass_cryptomatte_material*", "render/layers/passes.html#bpy-types-viewlayer-use-pass-cryptomatte-material"), + ("bpy.ops.gpencil.vertex_color_brightness_contrast*", "grease_pencil/modes/vertex_paint/editing.html#bpy-ops-gpencil-vertex-color-brightness-contrast"), ("bpy.ops.view3d.edit_mesh_extrude_individual_move*", "modeling/meshes/editing/face/extrude_faces.html#bpy-ops-view3d-edit-mesh-extrude-individual-move"), ("bpy.ops.view3d.edit_mesh_extrude_manifold_normal*", "modeling/meshes/tools/extrude_manifold.html#bpy-ops-view3d-edit-mesh-extrude-manifold-normal"), ("bpy.types.cyclesrendersettings.use_distance_cull*", "render/cycles/render_settings/simplify.html#bpy-types-cyclesrendersettings-use-distance-cull"), @@ -191,6 +195,7 @@ url_manual_mapping = ( ("bpy.types.fluiddomainsettings.color_ramp_field*", "physics/fluid/type/domain/gas/viewport_display.html#bpy-types-fluiddomainsettings-color-ramp-field"), ("bpy.types.fluiddomainsettings.guide_vel_factor*", "physics/fluid/type/domain/guides.html#bpy-types-fluiddomainsettings-guide-vel-factor"), ("bpy.types.fluideffectorsettings.use_plane_init*", "physics/fluid/type/effector.html#bpy-types-fluideffectorsettings-use-plane-init"), + ("bpy.types.greasepencil.curve_edit_corner_angle*", "grease_pencil/modes/edit/curve_editing.html#bpy-types-greasepencil-curve-edit-corner-angle"), ("bpy.types.linestylegeometrymodifier_tipremover*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/tip_remover.html#bpy-types-linestylegeometrymodifier-tipremover"), ("bpy.types.movietrackingcamera.distortion_model*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera-distortion-model"), ("bpy.types.rendersettings.resolution_percentage*", "render/output/properties/dimensions.html#bpy-types-rendersettings-resolution-percentage"), @@ -201,6 +206,7 @@ url_manual_mapping = ( ("bpy.types.viewlayer.use_pass_cryptomatte_asset*", "render/layers/passes.html#bpy-types-viewlayer-use-pass-cryptomatte-asset"), ("bpy.ops.outliner.collection_indirect_only_set*", "render/layers/introduction.html#bpy-ops-outliner-collection-indirect-only-set"), ("bpy.ops.sequencer.deinterlace_selected_movies*", "video_editing/sequencer/editing.html#bpy-ops-sequencer-deinterlace-selected-movies"), + ("bpy.types.bakesettings.use_selected_to_active*", "render/cycles/baking.html#bpy-types-bakesettings-use-selected-to-active"), ("bpy.types.brush.surface_smooth_current_vertex*", "sculpt_paint/sculpting/tools/smooth.html#bpy-types-brush-surface-smooth-current-vertex"), ("bpy.types.brush.use_multiplane_scrape_dynamic*", "sculpt_paint/sculpting/tools/multiplane_scrape.html#bpy-types-brush-use-multiplane-scrape-dynamic"), ("bpy.types.brushgpencilsettings.fill_direction*", "grease_pencil/modes/draw/tools/fill.html#bpy-types-brushgpencilsettings-fill-direction"), @@ -234,6 +240,7 @@ url_manual_mapping = ( ("bpy.ops.object.vertex_group_copy_to_selected*", "modeling/meshes/properties/vertex_groups/vertex_groups.html#bpy-ops-object-vertex-group-copy-to-selected"), ("bpy.ops.outliner.collection_duplicate_linked*", "editors/outliner/editing.html#bpy-ops-outliner-collection-duplicate-linked"), ("bpy.ops.view3d.edit_mesh_extrude_move_normal*", "modeling/meshes/editing/face/extrude_faces.html#bpy-ops-view3d-edit-mesh-extrude-move-normal"), + ("bpy.types.bakesettings.use_pass_transmission*", "render/cycles/baking.html#bpy-types-bakesettings-use-pass-transmission"), ("bpy.types.clothsettings.internal_compression*", "physics/cloth/settings/physical_properties.html#bpy-types-clothsettings-internal-compression"), ("bpy.types.cyclesrendersettings.dicing_camera*", "render/cycles/render_settings/subdivision.html#bpy-types-cyclesrendersettings-dicing-camera"), ("bpy.types.cyclesrendersettings.texture_limit*", "render/cycles/render_settings/simplify.html#bpy-types-cyclesrendersettings-texture-limit"), @@ -253,8 +260,11 @@ url_manual_mapping = ( ("bpy.types.fluidflowsettings.surface_distance*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-surface-distance"), ("bpy.types.fluidflowsettings.texture_map_type*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-texture-map-type"), ("bpy.types.gpencilsculptguide.reference_point*", "grease_pencil/modes/draw/guides.html#bpy-types-gpencilsculptguide-reference-point"), + ("bpy.types.greasepencil.edit_curve_resolution*", "grease_pencil/modes/edit/curve_editing.html#bpy-types-greasepencil-edit-curve-resolution"), ("bpy.types.linestylegeometrymodifier_2doffset*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/2d_offset.html#bpy-types-linestylegeometrymodifier-2doffset"), ("bpy.types.linestylegeometrymodifier_sampling*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/sampling.html#bpy-types-linestylegeometrymodifier-sampling"), + ("bpy.types.nodesocketinterface*.default_value*", "interface/controls/nodes/groups.html#bpy-types-nodesocketinterface-default-value"), + ("bpy.types.rendersettings.use_persistent_data*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-use-persistent-data"), ("bpy.types.spaceoutliner.show_restrict_column*", "editors/outliner/interface.html#bpy-types-spaceoutliner-show-restrict-column"), ("bpy.types.toolsettings.transform_pivot_point*", "editors/3dview/controls/pivot_point/index.html#bpy-types-toolsettings-transform-pivot-point"), ("bpy.types.toolsettings.use_proportional_edit*", "editors/3dview/controls/proportional_editing.html#bpy-types-toolsettings-use-proportional-edit"), @@ -273,7 +283,9 @@ url_manual_mapping = ( ("bpy.types.fluidflowsettings.velocity_factor*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-velocity-factor"), ("bpy.types.fluidflowsettings.velocity_normal*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-velocity-normal"), ("bpy.types.geometrynodealignrotationtovector*", "modeling/geometry_nodes/point/align_rotation_to_vector.html#bpy-types-geometrynodealignrotationtovector"), + ("bpy.types.greasepencil.curve_edit_threshold*", "grease_pencil/modes/edit/curve_editing.html#bpy-types-greasepencil-curve-edit-threshold"), ("bpy.types.materialgpencilstyle.stroke_style*", "grease_pencil/materials/grease_pencil_shader.html#bpy-types-materialgpencilstyle-stroke-style"), + ("bpy.types.rendersettings.preview_pixel_size*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-preview-pixel-size"), ("bpy.types.rendersettings.use_crop_to_border*", "render/output/properties/dimensions.html#bpy-types-rendersettings-use-crop-to-border"), ("bpy.types.rendersettings.use_file_extension*", "render/output/properties/output.html#bpy-types-rendersettings-use-file-extension"), ("bpy.types.sculpt.constant_detail_resolution*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-types-sculpt-constant-detail-resolution"), @@ -311,12 +323,15 @@ url_manual_mapping = ( ("bpy.types.movietrackingcamera.pixel_aspect*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera-pixel-aspect"), ("bpy.types.movietrackingcamera.sensor_width*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera-sensor-width"), ("bpy.types.posebone.use_ik_rotation_control*", "animation/armatures/posing/bone_constraints/inverse_kinematics/introduction.html#bpy-types-posebone-use-ik-rotation-control"), + ("bpy.types.rendersettings.use_bake_multires*", "render/cycles/baking.html#bpy-types-rendersettings-use-bake-multires"), ("bpy.types.scenegpencil.antialias_threshold*", "render/cycles/render_settings/grease_pencil.html#bpy-types-scenegpencil-antialias-threshold"), ("bpy.types.spaceuveditor.sticky_select_mode*", "editors/uv/selecting.html#bpy-types-spaceuveditor-sticky-select-mode"), ("bpy.types.spaceview3d.show_object_viewport*", "editors/3dview/display/visibility.html#bpy-types-spaceview3d-show-object-viewport"), ("bpy.types.view3doverlay.show_fade_inactive*", "editors/3dview/display/overlays.html#bpy-types-view3doverlay-show-fade-inactive"), ("bpy.types.viewlayer.pass_cryptomatte_depth*", "render/layers/passes.html#bpy-types-viewlayer-pass-cryptomatte-depth"), + ("bpy.ops.clip.stabilize_2d_rotation_select*", "movie_clip/tracking/clip/selecting.html#bpy-ops-clip-stabilize-2d-rotation-select"), ("bpy.ops.constraint.disable_keep_transform*", "animation/constraints/interface/common.html#bpy-ops-constraint-disable-keep-transform"), + ("bpy.ops.gpencil.stroke_reset_vertex_color*", "grease_pencil/modes/vertex_paint/editing.html#bpy-ops-gpencil-stroke-reset-vertex-color"), ("bpy.ops.object.vertex_group_normalize_all*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-normalize-all"), ("bpy.ops.outliner.collection_color_tag_set*", "editors/outliner/editing.html#bpy-ops-outliner-collection-color-tag-set"), ("bpy.ops.outliner.collection_enable_render*", "editors/outliner/editing.html#bpy-ops-outliner-collection-enable-render"), @@ -349,6 +364,7 @@ url_manual_mapping = ( ("bpy.types.rendersettings.dither_intensity*", "render/output/properties/post_processing.html#bpy-types-rendersettings-dither-intensity"), ("bpy.types.rendersettings.simplify_volumes*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-volumes"), ("bpy.types.rendersettings.use_render_cache*", "render/output/properties/output.html#bpy-types-rendersettings-use-render-cache"), + ("bpy.types.rendersettings.use_save_buffers*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-use-save-buffers"), ("bpy.types.rendersettings.use_single_layer*", "render/layers/view_layer.html#bpy-types-rendersettings-use-single-layer"), ("bpy.types.rendersettings_simplify_gpencil*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-gpencil"), ("bpy.types.sceneeevee.use_taa_reprojection*", "render/eevee/render_settings/sampling.html#bpy-types-sceneeevee-use-taa-reprojection"), @@ -368,6 +384,7 @@ url_manual_mapping = ( ("bpy.ops.object.modifier_copy_to_selected*", "modeling/modifiers/introduction.html#bpy-ops-object-modifier-copy-to-selected"), ("bpy.ops.preferences.app_template_install*", "advanced/app_templates.html#bpy-ops-preferences-app-template-install"), ("bpy.types.actionposemarkers.active_index*", "animation/armatures/properties/pose_library.html#bpy-types-actionposemarkers-active-index"), + ("bpy.types.bakesettings.use_pass_indirect*", "render/cycles/baking.html#bpy-types-bakesettings-use-pass-indirect"), ("bpy.types.brush.cloth_force_falloff_type*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-cloth-force-falloff-type"), ("bpy.types.brushgpencilsettings.fill_leak*", "grease_pencil/modes/draw/tools/fill.html#bpy-types-brushgpencilsettings-fill-leak"), ("bpy.types.brushgpencilsettings.show_fill*", "grease_pencil/modes/draw/tools/fill.html#bpy-types-brushgpencilsettings-show-fill"), @@ -397,6 +414,9 @@ url_manual_mapping = ( ("bpy.types.movietrackingcamera.division_k*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera-division-k"), ("bpy.types.movietrackingobject.keyframe_a*", "movie_clip/tracking/clip/toolbar/solve.html#bpy-types-movietrackingobject-keyframe-a"), ("bpy.types.movietrackingobject.keyframe_b*", "movie_clip/tracking/clip/toolbar/solve.html#bpy-types-movietrackingobject-keyframe-b"), + ("bpy.types.nodesocketinterface*.max_value*", "interface/controls/nodes/groups.html#bpy-types-nodesocketinterface-max-value"), + ("bpy.types.nodesocketinterface*.min_value*", "interface/controls/nodes/groups.html#bpy-types-nodesocketinterface-min-value"), + ("bpy.types.nodesocketinterface.hide_value*", "interface/controls/nodes/groups.html#bpy-types-nodesocketinterface-hide-value"), ("bpy.types.rendersettings.use_compositing*", "render/output/properties/post_processing.html#bpy-types-rendersettings-use-compositing"), ("bpy.types.rendersettings.use_placeholder*", "render/output/properties/output.html#bpy-types-rendersettings-use-placeholder"), ("bpy.types.shadernodesubsurfacescattering*", "render/shader_nodes/shader/sss.html#bpy-types-shadernodesubsurfacescattering"), @@ -418,6 +438,7 @@ url_manual_mapping = ( ("bpy.ops.preferences.reset_default_theme*", "editors/preferences/themes.html#bpy-ops-preferences-reset-default-theme"), ("bpy.ops.sequencer.strip_transform_clear*", "video_editing/sequencer/editing.html#bpy-ops-sequencer-strip-transform-clear"), ("bpy.types.animdata.action_extrapolation*", "editors/nla/sidebar.html#bpy-types-animdata-action-extrapolation"), + ("bpy.types.bakesettings.max_ray_distance*", "render/cycles/baking.html#bpy-types-bakesettings-max-ray-distance"), ("bpy.types.brush.multiplane_scrape_angle*", "sculpt_paint/sculpting/tools/multiplane_scrape.html#bpy-types-brush-multiplane-scrape-angle"), ("bpy.types.clothsettings.internal_spring*", "physics/cloth/settings/physical_properties.html#bpy-types-clothsettings-internal-spring"), ("bpy.types.clothsettings.pressure_factor*", "physics/cloth/settings/physical_properties.html#bpy-types-clothsettings-pressure-factor"), @@ -460,6 +481,8 @@ url_manual_mapping = ( ("bpy.ops.view3d.blenderkit_set_category*", "addons/3d_view/blenderkit.html#bpy-ops-view3d-blenderkit-set-category"), ("bpy.types.armature.rigify_colors_index*", "addons/rigging/rigify/metarigs.html#bpy-types-armature-rigify-colors-index"), ("bpy.types.armature.rigify_theme_to_add*", "addons/rigging/rigify/metarigs.html#bpy-types-armature-rigify-theme-to-add"), + ("bpy.types.bakesettings.use_pass_direct*", "render/cycles/baking.html#bpy-types-bakesettings-use-pass-direct"), + ("bpy.types.bakesettings.use_pass_glossy*", "render/cycles/baking.html#bpy-types-bakesettings-use-pass-glossy"), ("bpy.types.brush.pose_smooth_iterations*", "sculpt_paint/sculpting/tools/pose.html#bpy-types-brush-pose-smooth-iterations"), ("bpy.types.brush.snake_hook_deform_type*", "sculpt_paint/sculpting/tools/snake_hook.html#bpy-types-brush-snake-hook-deform-type"), ("bpy.types.brush.use_grab_active_vertex*", "sculpt_paint/sculpting/tools/grab.html#bpy-types-brush-use-grab-active-vertex"), @@ -488,11 +511,13 @@ url_manual_mapping = ( ("bpy.types.spacetexteditor.replace_text*", "editors/text_editor.html#bpy-types-spacetexteditor-replace-text"), ("bpy.types.spacetexteditor.use_find_all*", "editors/text_editor.html#bpy-types-spacetexteditor-use-find-all"), ("bpy.types.toolsettings.use_snap_rotate*", "editors/3dview/controls/snapping.html#bpy-types-toolsettings-use-snap-rotate"), + ("bpy.types.view3doverlay.display_handle*", "editors/3dview/display/overlays.html#bpy-types-view3doverlay-display-handle"), ("bpy.types.volumedisplay.wireframe_type*", "modeling/volumes/properties.html#bpy-types-volumedisplay-wireframe-type"), ("bpy.ops.curve.normals_make_consistent*", "modeling/curves/editing/control_points.html#bpy-ops-curve-normals-make-consistent"), ("bpy.ops.gpencil.frame_clean_duplicate*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-frame-clean-duplicate"), ("bpy.ops.gpencil.stroke_simplify_fixed*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-simplify-fixed"), ("bpy.ops.mesh.faces_select_linked_flat*", "modeling/meshes/selecting/linked.html#bpy-ops-mesh-faces-select-linked-flat"), + ("bpy.ops.mesh.primitive_ico_sphere_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-ico-sphere-add"), ("bpy.ops.object.gpencil_modifier_apply*", "grease_pencil/modifiers/introduction.html#bpy-ops-object-gpencil-modifier-apply"), ("bpy.ops.object.multires_external_save*", "modeling/modifiers/generate/multiresolution.html#bpy-ops-object-multires-external-save"), ("bpy.ops.object.vertex_group_normalize*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-normalize"), @@ -501,17 +526,21 @@ url_manual_mapping = ( ("bpy.ops.sequencer.change_effect_input*", "video_editing/sequencer/editing.html#bpy-ops-sequencer-change-effect-input"), ("bpy.ops.sequencer.strip_transform_fit*", "video_editing/sequencer/editing.html#bpy-ops-sequencer-strip-transform-fit"), ("bpy.types.armature.rigify_colors_lock*", "addons/rigging/rigify/metarigs.html#bpy-types-armature-rigify-colors-lock"), + ("bpy.types.bakesettings.cage_extrusion*", "render/cycles/baking.html#bpy-types-bakesettings-cage-extrusion"), + ("bpy.types.bakesettings.use_pass_color*", "render/cycles/baking.html#bpy-types-bakesettings-use-pass-color"), ("bpy.types.brush.boundary_falloff_type*", "sculpt_paint/sculpting/tools/boundary.html#bpy-types-brush-boundary-falloff-type"), ("bpy.types.brush.texture_overlay_alpha*", "sculpt_paint/brush/cursor.html#bpy-types-brush-texture-overlay-alpha"), ("bpy.types.brushgpencilsettings.random*", "grease_pencil/modes/draw/tools/draw.html#bpy-types-brushgpencilsettings-random"), ("bpy.types.clothsettings.target_volume*", "physics/cloth/settings/physical_properties.html#bpy-types-clothsettings-target-volume"), ("bpy.types.compositornodebilateralblur*", "compositing/types/filter/bilateral_blur.html#bpy-types-compositornodebilateralblur"), ("bpy.types.compositornodedistancematte*", "compositing/types/matte/distance_key.html#bpy-types-compositornodedistancematte"), + ("bpy.types.compositornodesetalpha.mode*", "compositing/types/converter/set_alpha.html#bpy-types-compositornodesetalpha-mode"), ("bpy.types.dopesheet.use_filter_invert*", "editors/graph_editor/channels.html#bpy-types-dopesheet-use-filter-invert"), ("bpy.types.fluiddomainsettings.gravity*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-gravity"), ("bpy.types.fluidflowsettings.flow_type*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-flow-type"), ("bpy.types.fluidflowsettings.subframes*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-subframes"), ("bpy.types.geometrynodepointdistribute*", "modeling/geometry_nodes/point/point_distribute.html#bpy-types-geometrynodepointdistribute"), + ("bpy.types.greasepencil.use_curve_edit*", "grease_pencil/modes/edit/curve_editing.html#bpy-types-greasepencil-use-curve-edit"), ("bpy.types.imagepaint.screen_grab_size*", "sculpt_paint/texture_paint/tool_settings/options.html#bpy-types-imagepaint-screen-grab-size"), ("bpy.types.linestyle*modifier_material*", "render/freestyle/parameter_editor/line_style/modifiers/color/material.html#bpy-types-linestyle-modifier-material"), ("bpy.types.movietrackingcamera.brown_k*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera-brown-k"), @@ -521,6 +550,7 @@ url_manual_mapping = ( ("bpy.types.regionview3d.show_sync_view*", "editors/3dview/navigate/views.html#bpy-types-regionview3d-show-sync-view"), ("bpy.types.rendersettings.resolution_x*", "render/output/properties/dimensions.html#bpy-types-rendersettings-resolution-x"), ("bpy.types.rendersettings.resolution_y*", "render/output/properties/dimensions.html#bpy-types-rendersettings-resolution-y"), + ("bpy.types.rendersettings.threads_mode*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-threads-mode"), ("bpy.types.rigidbodyconstraint.enabled*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-enabled"), ("bpy.types.rigidbodyconstraint.object1*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-object1"), ("bpy.types.rigidbodyconstraint.object2*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-object2"), @@ -535,9 +565,11 @@ url_manual_mapping = ( ("bpy.types.toolsettings.use_snap_scale*", "editors/3dview/controls/snapping.html#bpy-types-toolsettings-use-snap-scale"), ("bpy.types.toolsettings.uv_select_mode*", "editors/uv/selecting.html#bpy-types-toolsettings-uv-select-mode"), ("bpy.types.viewlayer.material_override*", "render/layers/introduction.html#bpy-types-viewlayer-material-override"), + ("bpy.ops.clip.set_viewport_background*", "movie_clip/tracking/clip/editing/clip.html#bpy-ops-clip-set-viewport-background"), ("bpy.ops.gpencil.interpolate_sequence*", "grease_pencil/animation/tools.html#bpy-ops-gpencil-interpolate-sequence"), ("bpy.ops.mesh.normals_make_consistent*", "modeling/meshes/editing/mesh/normals.html#bpy-ops-mesh-normals-make-consistent"), ("bpy.ops.mesh.offset_edge_loops_slide*", "modeling/meshes/editing/edge/offset_edge_slide.html#bpy-ops-mesh-offset-edge-loops-slide"), + ("bpy.ops.mesh.primitive_uv_sphere_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-uv-sphere-add"), ("bpy.ops.object.duplicate_move_linked*", "scene_layout/object/editing/duplicate_linked.html#bpy-ops-object-duplicate-move-linked"), ("bpy.ops.object.parent_no_inverse_set*", "scene_layout/object/editing/parent.html#bpy-ops-object-parent-no-inverse-set"), ("bpy.ops.object.vertex_group_quantize*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-quantize"), @@ -547,6 +579,7 @@ url_manual_mapping = ( ("bpy.ops.transform.delete_orientation*", "editors/3dview/controls/orientation.html#bpy-ops-transform-delete-orientation"), ("bpy.ops.view3d.localview_remove_from*", "editors/3dview/navigate/local_view.html#bpy-ops-view3d-localview-remove-from"), ("bpy.types.animdata.action_blend_type*", "editors/nla/sidebar.html#bpy-types-animdata-action-blend-type"), + ("bpy.types.bakesettings.use_pass_emit*", "render/cycles/baking.html#bpy-types-bakesettings-use-pass-emit"), ("bpy.types.brush.boundary_deform_type*", "sculpt_paint/sculpting/tools/boundary.html#bpy-types-brush-boundary-deform-type"), ("bpy.types.brush.cursor_overlay_alpha*", "sculpt_paint/brush/cursor.html#bpy-types-brush-cursor-overlay-alpha"), ("bpy.types.brush.normal_radius_factor*", "sculpt_paint/sculpting/tool_settings/brush_settings.html#bpy-types-brush-normal-radius-factor"), @@ -583,6 +616,9 @@ url_manual_mapping = ( ("bpy.ops.gpencil.set_active_material*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-set-active-material"), ("bpy.ops.gpencil.stroke_change_color*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-change-color"), ("bpy.ops.gpencil.stroke_cyclical_set*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-cyclical-set"), + ("bpy.ops.gpencil.vertex_color_invert*", "grease_pencil/modes/vertex_paint/editing.html#bpy-ops-gpencil-vertex-color-invert"), + ("bpy.ops.gpencil.vertex_color_levels*", "grease_pencil/modes/vertex_paint/editing.html#bpy-ops-gpencil-vertex-color-levels"), + ("bpy.ops.mesh.primitive_cylinder_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-cylinder-add"), ("bpy.ops.mesh.set_normals_from_faces*", "modeling/meshes/editing/mesh/normals.html#bpy-ops-mesh-set-normals-from-faces"), ("bpy.ops.mesh.shape_propagate_to_all*", "modeling/meshes/editing/vertex/propagate_shapes.html#bpy-ops-mesh-shape-propagate-to-all"), ("bpy.ops.mesh.vert_connect_nonplanar*", "modeling/meshes/editing/mesh/cleanup.html#bpy-ops-mesh-vert-connect-nonplanar"), @@ -596,6 +632,7 @@ url_manual_mapping = ( ("bpy.ops.view3d.blenderkit_asset_bar*", "addons/3d_view/blenderkit.html#bpy-ops-view3d-blenderkit-asset-bar"), ("bpy.types.animdata.action_influence*", "editors/nla/sidebar.html#bpy-types-animdata-action-influence"), ("bpy.types.armature.layers_protected*", "animation/armatures/properties/skeleton.html#bpy-types-armature-layers-protected"), + ("bpy.types.bakesettings.normal_space*", "render/cycles/baking.html#bpy-types-bakesettings-normal-space"), ("bpy.types.brush.crease_pinch_factor*", "sculpt_paint/sculpting/tools/snake_hook.html#bpy-types-brush-crease-pinch-factor"), ("bpy.types.brush.elastic_deform_type*", "sculpt_paint/sculpting/tools/elastic_deform.html#bpy-types-brush-elastic-deform-type"), ("bpy.types.brush.use_cloth_collision*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-use-cloth-collision"), @@ -663,6 +700,7 @@ url_manual_mapping = ( ("bpy.ops.sequencer.export_subtitles*", "video_editing/preview/introduction.html#bpy-ops-sequencer-export-subtitles"), ("bpy.ops.transform.edge_bevelweight*", "modeling/meshes/editing/edge/edge_data.html#bpy-ops-transform-edge-bevelweight"), ("bpy.ops.wm.previews_batch_generate*", "files/blend/previews.html#bpy-ops-wm-previews-batch-generate"), + ("bpy.types.bakesettings.cage_object*", "render/cycles/baking.html#bpy-types-bakesettings-cage-object"), ("bpy.types.brush.auto_smooth_factor*", "sculpt_paint/sculpting/tool_settings/brush_settings.html#bpy-types-brush-auto-smooth-factor"), ("bpy.types.brush.smooth_deform_type*", "sculpt_paint/sculpting/tools/smooth.html#bpy-types-brush-smooth-deform-type"), ("bpy.types.brush.use_connected_only*", "sculpt_paint/sculpting/tools/pose.html#bpy-types-brush-use-connected-only"), @@ -688,6 +726,7 @@ url_manual_mapping = ( ("bpy.types.linestyle*modifier_noise*", "render/freestyle/parameter_editor/line_style/modifiers/color/noise.html#bpy-types-linestyle-modifier-noise"), ("bpy.types.maintainvolumeconstraint*", "animation/constraints/transform/maintain_volume.html#bpy-types-maintainvolumeconstraint"), ("bpy.types.mesh.use_mirror_topology*", "modeling/meshes/tools/tool_settings.html#bpy-types-mesh-use-mirror-topology"), + ("bpy.types.nodesocketinterface.name*", "interface/controls/nodes/groups.html#bpy-types-nodesocketinterface-name"), ("bpy.types.particleinstancemodifier*", "modeling/modifiers/physics/particle_instance.html#bpy-types-particleinstancemodifier"), ("bpy.types.sequencetransform.offset*", "video_editing/sequencer/sidebar/strip.html#bpy-types-sequencetransform-offset"), ("bpy.types.shadernodebrightcontrast*", "render/shader_nodes/color/bright_contrast.html#bpy-types-shadernodebrightcontrast"), @@ -703,10 +742,14 @@ url_manual_mapping = ( ("bpy.types.vertexweighteditmodifier*", "modeling/modifiers/modify/weight_edit.html#bpy-types-vertexweighteditmodifier"), ("bpy.types.volumedisplay.slice_axis*", "modeling/volumes/properties.html#bpy-types-volumedisplay-slice-axis"), ("bpy.ops.anim.channels_clean_empty*", "editors/nla/editing.html#bpy-ops-anim-channels-clean-empty"), - ("bpy.ops.clip.set_center_principal*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-ops-clip-set-center-principal"), + ("bpy.ops.clip.apply_solution_scale*", "movie_clip/tracking/clip/editing/reconstruction.html#bpy-ops-clip-apply-solution-scale"), + ("bpy.ops.clip.set_center_principal*", "movie_clip/tracking/clip/editing/clip.html#bpy-ops-clip-set-center-principal"), + ("bpy.ops.clip.setup_tracking_scene*", "movie_clip/tracking/clip/editing/clip.html#bpy-ops-clip-setup-tracking-scene"), ("bpy.ops.curve.match_texture_space*", "modeling/meshes/uv/uv_texture_spaces.html#bpy-ops-curve-match-texture-space"), ("bpy.ops.font.text_paste_from_file*", "modeling/texts/editing.html#bpy-ops-font-text-paste-from-file"), ("bpy.ops.gpencil.frame_clean_loose*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-frame-clean-loose"), + ("bpy.ops.mesh.primitive_circle_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-circle-add"), + ("bpy.ops.mesh.primitive_monkey_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-monkey-add"), ("bpy.ops.mesh.select_face_by_sides*", "modeling/meshes/selecting/all_by_trait.html#bpy-ops-mesh-select-face-by-sides"), ("bpy.ops.mesh.shortest_path_select*", "modeling/meshes/selecting/linked.html#bpy-ops-mesh-shortest-path-select"), ("bpy.ops.mesh.vert_connect_concave*", "modeling/meshes/editing/mesh/cleanup.html#bpy-ops-mesh-vert-connect-concave"), @@ -772,12 +815,17 @@ url_manual_mapping = ( ("bpy.types.viewlayer.use_freestyle*", "render/freestyle/view_layer.html#bpy-types-viewlayer-use-freestyle"), ("bpy.types.volumedisplay.use_slice*", "modeling/volumes/properties.html#bpy-types-volumedisplay-use-slice"), ("bpy.ops.armature.armature_layers*", "animation/armatures/bones/editing/change_layers.html#bpy-ops-armature-armature-layers"), + ("bpy.ops.clip.stabilize_2d_select*", "movie_clip/tracking/clip/selecting.html#bpy-ops-clip-stabilize-2d-select"), ("bpy.ops.gpencil.frame_clean_fill*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-frame-clean-fill"), ("bpy.ops.gpencil.stroke_subdivide*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-subdivide"), + ("bpy.ops.gpencil.vertex_color_hsv*", "grease_pencil/modes/vertex_paint/editing.html#bpy-ops-gpencil-vertex-color-hsv"), + ("bpy.ops.gpencil.vertex_color_set*", "grease_pencil/modes/vertex_paint/editing.html#bpy-ops-gpencil-vertex-color-set"), ("bpy.ops.graph.interpolation_type*", "editors/graph_editor/fcurves/editing.html#bpy-ops-graph-interpolation-type"), ("bpy.ops.mesh.dissolve_degenerate*", "modeling/meshes/editing/mesh/cleanup.html#bpy-ops-mesh-dissolve-degenerate"), ("bpy.ops.mesh.face_split_by_edges*", "modeling/meshes/editing/face/weld_edges_faces.html#bpy-ops-mesh-face-split-by-edges"), ("bpy.ops.mesh.mark_freestyle_face*", "modeling/meshes/editing/face/face_data.html#bpy-ops-mesh-mark-freestyle-face"), + ("bpy.ops.mesh.primitive_plane_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-plane-add"), + ("bpy.ops.mesh.primitive_torus_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-torus-add"), ("bpy.ops.mesh.select_non_manifold*", "modeling/meshes/selecting/all_by_trait.html#bpy-ops-mesh-select-non-manifold"), ("bpy.ops.object.constraints_clear*", "animation/constraints/interface/adding_removing.html#bpy-ops-object-constraints-clear"), ("bpy.ops.object.quadriflow_remesh*", "modeling/meshes/retopology.html#bpy-ops-object-quadriflow-remesh"), @@ -797,6 +845,7 @@ url_manual_mapping = ( ("bpy.ops.uv.average_islands_scale*", "modeling/meshes/uv/editing.html#bpy-ops-uv-average-islands-scale"), ("bpy.ops.view3d.blenderkit_search*", "addons/3d_view/blenderkit.html#bpy-ops-view3d-blenderkit-search"), ("bpy.types.armature.pose_position*", "animation/armatures/properties/skeleton.html#bpy-types-armature-pose-position"), + ("bpy.types.bakesettings.use_clear*", "render/cycles/baking.html#bpy-types-bakesettings-use-clear"), ("bpy.types.brightcontrastmodifier*", "video_editing/sequencer/sidebar/modifiers.html#bpy-types-brightcontrastmodifier"), ("bpy.types.brush.cursor_color_add*", "sculpt_paint/brush/cursor.html#bpy-types-brush-cursor-color-add"), ("bpy.types.brush.pose_deform_type*", "sculpt_paint/sculpting/tools/pose.html#bpy-types-brush-pose-deform-type"), @@ -833,6 +882,7 @@ url_manual_mapping = ( ("bpy.types.objectsolverconstraint*", "animation/constraints/motion_tracking/object_solver.html#bpy-types-objectsolverconstraint"), ("bpy.types.opacitygpencilmodifier*", "grease_pencil/modifiers/color/opacity.html#bpy-types-opacitygpencilmodifier"), ("bpy.types.particlesystemmodifier*", "physics/particles/index.html#bpy-types-particlesystemmodifier"), + ("bpy.types.rendersettings.threads*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-threads"), ("bpy.types.sceneeevee.motion_blur*", "render/eevee/render_settings/motion_blur.html#bpy-types-sceneeevee-motion-blur"), ("bpy.types.sceneeevee.taa_samples*", "render/eevee/render_settings/sampling.html#bpy-types-sceneeevee-taa-samples"), ("bpy.types.sculpt.radial_symmetry*", "sculpt_paint/sculpting/tool_settings/symmetry.html#bpy-types-sculpt-radial-symmetry"), @@ -848,7 +898,7 @@ url_manual_mapping = ( ("bpy.types.volumerender.step_size*", "modeling/volumes/properties.html#bpy-types-volumerender-step-size"), ("bpy.types.weightednormalmodifier*", "modeling/modifiers/modify/weighted_normal.html#bpy-types-weightednormalmodifier"), ("bpy.ops.armature.autoside_names*", "animation/armatures/bones/editing/naming.html#bpy-ops-armature-autoside-names"), - ("bpy.ops.clip.create_plane_track*", "movie_clip/tracking/clip/toolbar/solve.html#bpy-ops-clip-create-plane-track"), + ("bpy.ops.clip.create_plane_track*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-create-plane-track"), ("bpy.ops.curve.spline_weight_set*", "modeling/curves/editing/other.html#bpy-ops-curve-spline-weight-set"), ("bpy.ops.gpencil.blank_frame_add*", "grease_pencil/animation/tools.html#bpy-ops-gpencil-blank-frame-add"), ("bpy.ops.gpencil.frame_duplicate*", "grease_pencil/animation/tools.html#bpy-ops-gpencil-frame-duplicate"), @@ -861,7 +911,11 @@ url_manual_mapping = ( ("bpy.ops.mesh.extrude_faces_move*", "modeling/meshes/editing/face/extrude_individual_faces.html#bpy-ops-mesh-extrude-faces-move"), ("bpy.ops.mesh.faces_shade_smooth*", "modeling/meshes/editing/face/shading.html#bpy-ops-mesh-faces-shade-smooth"), ("bpy.ops.mesh.paint_mask_extract*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-mesh-paint-mask-extract"), + ("bpy.ops.mesh.primitive_cone_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-cone-add"), + ("bpy.ops.mesh.primitive_cube_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-cube-add"), + ("bpy.ops.mesh.primitive_grid_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-grid-add"), ("bpy.ops.mesh.subdivide_edgering*", "modeling/meshes/editing/edge/subdivide_edge_ring.html#bpy-ops-mesh-subdivide-edgering"), + ("bpy.ops.node.tree_socket_remove*", "interface/controls/nodes/groups.html#bpy-ops-node-tree-socket-remove"), ("bpy.ops.object.constraints_copy*", "animation/constraints/interface/adding_removing.html#bpy-ops-object-constraints-copy"), ("bpy.ops.object.gpencil_modifier*", "grease_pencil/modifiers/index.html#bpy-ops-object-gpencil-modifier"), ("bpy.ops.object.make_single_user*", "scene_layout/object/editing/relations/make_single_user.html#bpy-ops-object-make-single-user"), @@ -885,6 +939,10 @@ url_manual_mapping = ( ("bpy.ops.wm.operator_cheat_sheet*", "advanced/operators.html#bpy-ops-wm-operator-cheat-sheet"), ("bpy.ops.wm.previews_batch_clear*", "files/blend/previews.html#bpy-ops-wm-previews-batch-clear"), ("bpy.types.armature.use_mirror_x*", "animation/armatures/bones/tools/tool_settings.html#bpy-types-armature-use-mirror-x"), + ("bpy.types.bakesettings.normal_b*", "render/cycles/baking.html#bpy-types-bakesettings-normal-b"), + ("bpy.types.bakesettings.normal_g*", "render/cycles/baking.html#bpy-types-bakesettings-normal-g"), + ("bpy.types.bakesettings.normal_r*", "render/cycles/baking.html#bpy-types-bakesettings-normal-r"), + ("bpy.types.bakesettings.use_cage*", "render/cycles/baking.html#bpy-types-bakesettings-use-cage"), ("bpy.types.brush.boundary_offset*", "sculpt_paint/sculpting/tools/boundary.html#bpy-types-brush-boundary-offset"), ("bpy.types.brush.cloth_sim_limit*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-cloth-sim-limit"), ("bpy.types.brush.use_custom_icon*", "sculpt_paint/brush/brush.html#bpy-types-brush-use-custom-icon"), @@ -917,6 +975,8 @@ url_manual_mapping = ( ("bpy.types.offsetgpencilmodifier*", "grease_pencil/modifiers/deform/offset.html#bpy-types-offsetgpencilmodifier"), ("bpy.types.particlefluidsettings*", "physics/particles/emitter/physics/fluid.html#bpy-types-particlefluidsettings"), ("bpy.types.posebone.custom_shape*", "animation/armatures/bones/properties/display.html#bpy-types-posebone-custom-shape"), + ("bpy.types.rendersettings.tile_x*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-tile-x"), + ("bpy.types.rendersettings.tile_y*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-tile-y"), ("bpy.types.rigifyselectioncolors*", "addons/rigging/rigify/metarigs.html#bpy-types-rigifyselectioncolors"), ("bpy.types.sceneeevee.volumetric*", "render/eevee/render_settings/volumetrics.html#bpy-types-sceneeevee-volumetric"), ("bpy.types.sculpt.detail_percent*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-types-sculpt-detail-percent"), @@ -1005,6 +1065,8 @@ url_manual_mapping = ( ("bpy.types.volume.sequence_mode*", "modeling/volumes/properties.html#bpy-types-volume-sequence-mode"), ("bpy.types.volumetomeshmodifier*", "modeling/modifiers/generate/volume_to_mesh.html#bpy-types-volumetomeshmodifier"), ("bpy.types.whitebalancemodifier*", "video_editing/sequencer/sidebar/modifiers.html#bpy-types-whitebalancemodifier"), + ("bpy.ops.clip.clear_track_path*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-clear-track-path"), + ("bpy.ops.clip.set_scene_frames*", "movie_clip/tracking/clip/editing/clip.html#bpy-ops-clip-set-scene-frames"), ("bpy.ops.curve.handle_type_set*", "modeling/curves/editing/control_points.html#bpy-ops-curve-handle-type-set"), ("bpy.ops.curve.spline_type_set*", "modeling/curves/editing/curve.html#bpy-ops-curve-spline-type-set"), ("bpy.ops.gpencil.move_to_layer*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-move-to-layer"), @@ -1019,6 +1081,7 @@ url_manual_mapping = ( ("bpy.ops.mesh.paint_mask_slice*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-mesh-paint-mask-slice"), ("bpy.ops.mesh.select_ungrouped*", "modeling/meshes/selecting/all_by_trait.html#bpy-ops-mesh-select-ungrouped"), ("bpy.ops.node.tree_path_parent*", "interface/controls/nodes/groups.html#bpy-ops-node-tree-path-parent"), + ("bpy.ops.node.tree_socket_move*", "interface/controls/nodes/groups.html#bpy-ops-node-tree-socket-move"), ("bpy.ops.object.duplicate_move*", "scene_layout/object/editing/duplicate.html#bpy-ops-object-duplicate-move"), ("bpy.ops.object.hook_add_selob*", "modeling/meshes/editing/vertex/hooks.html#bpy-ops-object-hook-add-selob"), ("bpy.ops.object.select_by_type*", "scene_layout/object/selecting.html#bpy-ops-object-select-by-type"), @@ -1044,6 +1107,8 @@ url_manual_mapping = ( ("bpy.ops.transform.edge_crease*", "modeling/meshes/editing/edge/edge_data.html#bpy-ops-transform-edge-crease"), ("bpy.ops.transform.skin_resize*", "modeling/meshes/editing/mesh/transform/skin_resize.html#bpy-ops-transform-skin-resize"), ("bpy.ops.uv.seams_from_islands*", "modeling/meshes/uv/editing.html#bpy-ops-uv-seams-from-islands"), + ("bpy.types.bakesettings.margin*", "render/cycles/baking.html#bpy-types-bakesettings-margin"), + ("bpy.types.bakesettings.target*", "render/cycles/baking.html#bpy-types-bakesettings-target"), ("bpy.types.brush.cloth_damping*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-cloth-damping"), ("bpy.types.brush.icon_filepath*", "sculpt_paint/brush/brush.html#bpy-types-brush-icon-filepath"), ("bpy.types.brush.smooth_stroke*", "grease_pencil/modes/draw/tools/draw.html#bpy-types-brush-smooth-stroke"), @@ -1102,7 +1167,7 @@ url_manual_mapping = ( ("bpy.ops.armature.bone_layers*", "animation/armatures/bones/editing/change_layers.html#bpy-ops-armature-bone-layers"), ("bpy.ops.clip.add_marker_move*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-add-marker-move"), ("bpy.ops.clip.bundles_to_mesh*", "movie_clip/tracking/clip/editing/reconstruction.html#bpy-ops-clip-bundles-to-mesh"), - ("bpy.ops.clip.detect_features*", "movie_clip/tracking/clip/toolbar/track.html#bpy-ops-clip-detect-features"), + ("bpy.ops.clip.detect_features*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-detect-features"), ("bpy.ops.console.autocomplete*", "editors/python_console.html#bpy-ops-console-autocomplete"), ("bpy.ops.curve.dissolve_verts*", "modeling/curves/editing/curve.html#bpy-ops-curve-dissolve-verts"), ("bpy.ops.curve.duplicate_move*", "modeling/curves/editing/curve.html#bpy-ops-curve-duplicate-move"), @@ -1117,6 +1182,7 @@ url_manual_mapping = ( ("bpy.ops.mesh.vertices_smooth*", "modeling/meshes/editing/vertex/smooth_vertices.html#bpy-ops-mesh-vertices-smooth"), ("bpy.ops.nla.make_single_user*", "editors/nla/editing.html#bpy-ops-nla-make-single-user"), ("bpy.ops.node.read_viewlayers*", "interface/controls/nodes/editing.html#bpy-ops-node-read-viewlayers"), + ("bpy.ops.node.tree_socket_add*", "interface/controls/nodes/groups.html#bpy-ops-node-tree-socket-add"), ("bpy.ops.object.data_transfer*", "scene_layout/object/editing/relations/transfer_mesh_data.html#bpy-ops-object-data-transfer"), ("bpy.ops.object.select_camera*", "scene_layout/object/selecting.html#bpy-ops-object-select-camera"), ("bpy.ops.object.select_linked*", "scene_layout/object/selecting.html#bpy-ops-object-select-linked"), @@ -1194,6 +1260,8 @@ url_manual_mapping = ( ("bpy.types.volumerender.space*", "modeling/volumes/properties.html#bpy-types-volumerender-space"), ("bpy.ops.anim.keyframe_clear*", "animation/keyframes/editing.html#bpy-ops-anim-keyframe-clear"), ("bpy.ops.armature.flip_names*", "animation/armatures/bones/editing/naming.html#bpy-ops-armature-flip-names"), + ("bpy.ops.clip.refine_markers*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-refine-markers"), + ("bpy.ops.clip.select_grouped*", "movie_clip/tracking/clip/selecting.html#bpy-ops-clip-select-grouped"), ("bpy.ops.clip.track_to_empty*", "movie_clip/tracking/clip/editing/reconstruction.html#bpy-ops-clip-track-to-empty"), ("bpy.ops.curve.cyclic_toggle*", "modeling/curves/editing/curve.html#bpy-ops-curve-cyclic-toggle"), ("bpy.ops.curve.primitive*add*", "modeling/curves/primitives.html#bpy-ops-curve-primitive-add"), @@ -1294,6 +1362,9 @@ url_manual_mapping = ( ("bpy.types.worldmistsettings*", "render/cycles/world_settings.html#bpy-types-worldmistsettings"), ("bpy.ops.anim.channels_move*", "editors/nla/editing.html#bpy-ops-anim-channels-move"), ("bpy.ops.buttons.toggle_pin*", "editors/properties_editor.html#bpy-ops-buttons-toggle-pin"), + ("bpy.ops.clip.filter_tracks*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-filter-tracks"), + ("bpy.ops.clip.select_circle*", "movie_clip/tracking/clip/selecting.html#bpy-ops-clip-select-circle"), + ("bpy.ops.clip.track_markers*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-track-markers"), ("bpy.ops.curve.extrude_move*", "modeling/curves/editing/control_points.html#bpy-ops-curve-extrude-move"), ("bpy.ops.curve.make_segment*", "modeling/curves/editing/control_points.html#bpy-ops-curve-make-segment"), ("bpy.ops.graph.euler_filter*", "editors/graph_editor/fcurves/editing.html#bpy-ops-graph-euler-filter"), @@ -1308,7 +1379,6 @@ url_manual_mapping = ( ("bpy.ops.mesh.merge_normals*", "modeling/meshes/editing/mesh/normals.html#bpy-ops-mesh-merge-normals"), ("bpy.ops.mesh.normals_tools*", "modeling/meshes/editing/mesh/normals.html#bpy-ops-mesh-normals-tools"), ("bpy.ops.mesh.point_normals*", "modeling/meshes/editing/mesh/normals.html#bpy-ops-mesh-point-normals"), - ("bpy.ops.mesh.primitive*add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-add"), ("bpy.ops.mesh.rip_edge_move*", "modeling/meshes/editing/vertex/rip_vertices_extend.html#bpy-ops-mesh-rip-edge-move"), ("bpy.ops.mesh.select_linked*", "modeling/meshes/selecting/linked.html#bpy-ops-mesh-select-linked"), ("bpy.ops.mesh.select_random*", "modeling/meshes/selecting/random.html#bpy-ops-mesh-select-random"), @@ -1396,6 +1466,7 @@ url_manual_mapping = ( ("bpy.ops.mesh.select_loose*", "modeling/meshes/selecting/all_by_trait.html#bpy-ops-mesh-select-loose"), ("bpy.ops.mesh.vert_connect*", "modeling/meshes/editing/vertex/connect_vertex_pairs.html#bpy-ops-mesh-vert-connect"), ("bpy.ops.nla.tracks_delete*", "editors/nla/editing.html#bpy-ops-nla-tracks-delete"), + ("bpy.ops.node.group_insert*", "interface/controls/nodes/groups.html#bpy-ops-node-group-insert"), ("bpy.ops.object.lightprobe*", "render/eevee/light_probes/index.html#bpy-ops-object-lightprobe"), ("bpy.ops.object.make_links*", "scene_layout/object/editing/make_links.html#bpy-ops-object-make-links"), ("bpy.ops.object.make_local*", "files/linked_libraries/link_append.html#bpy-ops-object-make-local"), @@ -1514,6 +1585,8 @@ url_manual_mapping = ( ("bpy.ops.*.select_circle*", "interface/selecting.html#bpy-ops-select-circle"), ("bpy.ops.anim.keying_set*", "animation/keyframes/keying_sets.html#bpy-ops-anim-keying-set"), ("bpy.ops.armature.delete*", "animation/armatures/bones/editing/delete.html#bpy-ops-armature-delete"), + ("bpy.ops.clip.select_all*", "movie_clip/tracking/clip/selecting.html#bpy-ops-clip-select-all"), + ("bpy.ops.clip.select_box*", "movie_clip/tracking/clip/selecting.html#bpy-ops-clip-select-box"), ("bpy.ops.clip.set_origin*", "movie_clip/tracking/clip/editing/reconstruction.html#bpy-ops-clip-set-origin"), ("bpy.ops.curve.subdivide*", "modeling/curves/editing/segments.html#bpy-ops-curve-subdivide"), ("bpy.ops.ed.undo_history*", "interface/undo_redo.html#bpy-ops-ed-undo-history"), @@ -1739,6 +1812,7 @@ url_manual_mapping = ( ("bpy.ops.mesh.bisect*", "modeling/meshes/editing/mesh/bisect.html#bpy-ops-mesh-bisect"), ("bpy.ops.mesh.delete*", "modeling/meshes/editing/mesh/delete.html#bpy-ops-mesh-delete"), ("bpy.ops.nla.move_up*", "editors/nla/editing.html#bpy-ops-nla-move-up"), + ("bpy.ops.object.bake*", "render/cycles/baking.html#bpy-ops-object-bake"), ("bpy.ops.object.hook*", "modeling/meshes/editing/vertex/hooks.html#bpy-ops-object-hook"), ("bpy.ops.object.join*", "scene_layout/object/editing/join.html#bpy-ops-object-join"), ("bpy.ops.object.text*", "modeling/texts/index.html#bpy-ops-object-text"), diff --git a/release/scripts/modules/rna_xml.py b/release/scripts/modules/rna_xml.py index d9fc09e7d18..58abb5c90db 100644 --- a/release/scripts/modules/rna_xml.py +++ b/release/scripts/modules/rna_xml.py @@ -26,14 +26,21 @@ def build_property_typemap(skip_classes, skip_typemap): property_typemap = {} for attr in dir(bpy.types): + # Skip internal methods. + if attr.startswith("_"): + continue cls = getattr(bpy.types, attr) if issubclass(cls, skip_classes): continue + bl_rna = getattr(cls, "bl_rna", None) + # Needed to skip classes added to the modules `__dict__`. + if bl_rna is None: + continue # # to support skip-save we can't get all props - # properties = cls.bl_rna.properties.keys() + # properties = bl_rna.properties.keys() properties = [] - for prop_id, prop in cls.bl_rna.properties.items(): + for prop_id, prop in bl_rna.properties.items(): if not prop.is_skip_save: properties.append(prop_id) diff --git a/release/scripts/presets/interface_theme/Blender_Light.xml b/release/scripts/presets/interface_theme/Blender_Light.xml index 91ccd574c31..77908bb6bbf 100644 --- a/release/scripts/presets/interface_theme/Blender_Light.xml +++ b/release/scripts/presets/interface_theme/Blender_Light.xml @@ -1053,19 +1053,19 @@ +from __future__ import annotations # support reloading sub-modules if "bpy" in locals(): diff --git a/release/scripts/startup/bl_operators/add_mesh_torus.py b/release/scripts/startup/bl_operators/add_mesh_torus.py index c2f9a4189cf..0ebb6ae27e1 100644 --- a/release/scripts/startup/bl_operators/add_mesh_torus.py +++ b/release/scripts/startup/bl_operators/add_mesh_torus.py @@ -17,6 +17,8 @@ # ##### END GPL LICENSE BLOCK ##### # +from __future__ import annotations + import bpy from bpy.types import Operator @@ -156,7 +158,7 @@ class AddTorus(Operator, object_utils.AddObjectHelper): ('EXT_INT', "Exterior/Interior", "Use the exterior/interior radii for torus dimensions"), ), - update=mode_update_callback, + update=AddTorus.mode_update_callback, ) major_radius: FloatProperty( name="Major Radius", diff --git a/release/scripts/startup/bl_operators/anim.py b/release/scripts/startup/bl_operators/anim.py index 279b66a0833..85290bfe3f0 100644 --- a/release/scripts/startup/bl_operators/anim.py +++ b/release/scripts/startup/bl_operators/anim.py @@ -17,6 +17,7 @@ # ##### END GPL LICENSE BLOCK ##### # +from __future__ import annotations if "bpy" in locals(): from importlib import reload diff --git a/release/scripts/startup/bl_operators/assets.py b/release/scripts/startup/bl_operators/assets.py index 317555280e5..e7fbb155b2f 100644 --- a/release/scripts/startup/bl_operators/assets.py +++ b/release/scripts/startup/bl_operators/assets.py @@ -16,6 +16,9 @@ # # ##### END GPL LICENSE BLOCK ##### +# +from __future__ import annotations + import bpy from bpy_extras.asset_utils import ( diff --git a/release/scripts/startup/bl_operators/console.py b/release/scripts/startup/bl_operators/console.py index bffac4eef55..231dade820d 100644 --- a/release/scripts/startup/bl_operators/console.py +++ b/release/scripts/startup/bl_operators/console.py @@ -17,6 +17,7 @@ # ##### END GPL LICENSE BLOCK ##### # +from __future__ import annotations import bpy from bpy.types import Operator diff --git a/release/scripts/startup/bl_operators/constraint.py b/release/scripts/startup/bl_operators/constraint.py index 213122952ae..49fc6a04112 100644 --- a/release/scripts/startup/bl_operators/constraint.py +++ b/release/scripts/startup/bl_operators/constraint.py @@ -17,6 +17,7 @@ # ##### END GPL LICENSE BLOCK ##### # +from __future__ import annotations from bpy.types import ( Operator, diff --git a/release/scripts/startup/bl_operators/node.py b/release/scripts/startup/bl_operators/node.py index 1c5ebb4fa17..7884a7287b7 100644 --- a/release/scripts/startup/bl_operators/node.py +++ b/release/scripts/startup/bl_operators/node.py @@ -17,6 +17,7 @@ # ##### END GPL LICENSE BLOCK ##### # +from __future__ import annotations import bpy import nodeitems_utils @@ -218,7 +219,7 @@ class NODE_OT_add_search(NodeAddOperator, Operator): node_item: EnumProperty( name="Node Type", description="Node type", - items=node_enum_items, + items=NODE_OT_add_search.node_enum_items, ) def execute(self, context): diff --git a/release/scripts/startup/bl_operators/object_align.py b/release/scripts/startup/bl_operators/object_align.py index cc6724a620e..70b80f7198f 100644 --- a/release/scripts/startup/bl_operators/object_align.py +++ b/release/scripts/startup/bl_operators/object_align.py @@ -366,9 +366,9 @@ class AlignObjects(Operator): bb_quality: BoolProperty( name="High Quality", description=( - "Enables high quality calculation of the " + "Enables high quality but slow calculation of the " "bounding box for perfect results on complex " - "shape meshes with rotation/scale (Slow)" + "shape meshes with rotation/scale" ), default=True, ) diff --git a/release/scripts/startup/bl_operators/object_quick_effects.py b/release/scripts/startup/bl_operators/object_quick_effects.py index 0600536cb66..48312f958ef 100644 --- a/release/scripts/startup/bl_operators/object_quick_effects.py +++ b/release/scripts/startup/bl_operators/object_quick_effects.py @@ -496,7 +496,7 @@ class QuickLiquid(Operator): obj_bb_minmax(obj, min_co, max_co) # add the liquid domain object - bpy.ops.mesh.primitive_cube_add() + bpy.ops.mesh.primitive_cube_add(align='WORLD') obj = context.active_object obj.name = "Liquid Domain" diff --git a/release/scripts/startup/bl_operators/userpref.py b/release/scripts/startup/bl_operators/userpref.py index 0cd97ca6a9e..7547184dc04 100644 --- a/release/scripts/startup/bl_operators/userpref.py +++ b/release/scripts/startup/bl_operators/userpref.py @@ -18,8 +18,6 @@ # -# TODO, use PREFERENCES_OT_* prefix for operators. - import bpy from bpy.types import ( Operator, @@ -36,63 +34,40 @@ from bpy.props import ( from bpy.app.translations import pgettext_tip as tip_ -def module_filesystem_remove(path_base, module_name): +def _zipfile_root_namelist(file_to_extract): + # Return a list of root paths from zipfile.ZipFile.namelist. import os + root_paths = [] + for f in file_to_extract.namelist(): + # Python's `zipfile` API always adds a separate at the end of directories. + # use `os.path.normpath` instead of `f.removesuffix(os.sep)` + # since paths could be stored as `./paths/./`. + # + # Note that `..` prefixed paths can exist in ZIP files but they don't write to parent directory when extracting. + # Nor do they pass the `os.sep not in f` test, this is important, + # otherwise `shutil.rmtree` below could made to remove directories outside the installation directory. + f = os.path.normpath(f) + if os.sep not in f: + root_paths.append(f) + return root_paths + + +def _module_filesystem_remove(path_base, module_name): + # Remove all Python modules with `module_name` in `base_path`. + # The `module_name` is expected to be a result from `_zipfile_root_namelist`. + import os + import shutil module_name = os.path.splitext(module_name)[0] for f in os.listdir(path_base): f_base = os.path.splitext(f)[0] if f_base == module_name: f_full = os.path.join(path_base, f) - if os.path.isdir(f_full): - os.rmdir(f_full) + shutil.rmtree(f_full) else: os.remove(f_full) -# This duplicates shutil.copytree from Python 3.8, with the new dirs_exist_ok -# argument that we need. Once we upgrade to 3.8 we can remove this. -def _preferences_copytree(entries, src, dst): - import os - import shutil - from shutil import Error - - os.makedirs(dst, exist_ok=True) - errors = [] - - for srcentry in entries: - srcname = os.path.join(src, srcentry.name) - dstname = os.path.join(dst, srcentry.name) - srcobj = srcentry - try: - if srcentry.is_symlink(): - linkto = os.readlink(srcname) - os.symlink(linkto, dstname) - shutil.copystat(srcobj, dstname, follow_symlinks=False) - elif srcentry.is_dir(): - preferences_copytree(srcobj, dstname) - else: - shutil.copy2(srcentry, dstname) - except Error as err: - errors.extend(err.args[0]) - except OSError as why: - errors.append((srcname, dstname, str(why))) - try: - shutil.copystat(src, dst) - except OSError as why: - if getattr(why, 'winerror', None) is None: - errors.append((src, dst, str(why))) - if errors: - raise Error(errors) - return dst - - -def preferences_copytree(src, dst): - import os - with os.scandir(src) as entries: - return _preferences_copytree(entries=entries, src=src, dst=dst) - - class PREFERENCES_OT_keyconfig_activate(Operator): bl_idname = "preferences.keyconfig_activate" bl_label = "Activate Keyconfig" @@ -168,10 +143,8 @@ class PREFERENCES_OT_copy_prev(Operator): return os.path.isfile(old_userpref) and not os.path.isfile(new_userpref) def execute(self, _context): - # Use this instead once we upgrade to Python 3.8 with dirs_exist_ok. - # import shutil - # shutil.copytree(self._old_path(), self._new_path(), dirs_exist_ok=True) - preferences_copytree(self._old_path(), self._new_path()) + import shutil + shutil.copytree(self._old_path(), self._new_path(), dirs_exist_ok=True) # reload preferences and recent-files.txt bpy.ops.wm.read_userpref() @@ -680,11 +653,12 @@ class PREFERENCES_OT_addon_install(Operator): traceback.print_exc() return {'CANCELLED'} + file_to_extract_root = _zipfile_root_namelist(file_to_extract) if self.overwrite: - for f in file_to_extract.namelist(): - module_filesystem_remove(path_addons, f) + for f in file_to_extract_root: + _module_filesystem_remove(path_addons, f) else: - for f in file_to_extract.namelist(): + for f in file_to_extract_root: path_dest = os.path.join(path_addons, os.path.basename(f)) if os.path.exists(path_dest): self.report({'WARNING'}, "File already installed to %r\n" % path_dest) @@ -700,7 +674,7 @@ class PREFERENCES_OT_addon_install(Operator): path_dest = os.path.join(path_addons, os.path.basename(pyfile)) if self.overwrite: - module_filesystem_remove(path_addons, os.path.basename(pyfile)) + _module_filesystem_remove(path_addons, os.path.basename(pyfile)) elif os.path.exists(path_dest): self.report({'WARNING'}, "File already installed to %r\n" % path_dest) return {'CANCELLED'} @@ -923,11 +897,12 @@ class PREFERENCES_OT_app_template_install(Operator): traceback.print_exc() return {'CANCELLED'} + file_to_extract_root = _zipfile_root_namelist(file_to_extract) if self.overwrite: - for f in file_to_extract.namelist(): - module_filesystem_remove(path_app_templates, f) + for f in file_to_extract_root: + _module_filesystem_remove(path_app_templates, f) else: - for f in file_to_extract.namelist(): + for f in file_to_extract_root: path_dest = os.path.join(path_app_templates, os.path.basename(f)) if os.path.exists(path_dest): self.report({'WARNING'}, "File already installed to %r\n" % path_dest) @@ -1042,7 +1017,7 @@ class PREFERENCES_OT_studiolight_new(Operator): default="StudioLight", ) - ask_overide = False + ask_override = False def execute(self, context): import os @@ -1057,8 +1032,8 @@ class PREFERENCES_OT_studiolight_new(Operator): filepath_final = os.path.join(path_studiolights, filename) if os.path.isfile(filepath_final): - if not self.ask_overide: - self.ask_overide = True + if not self.ask_override: + self.ask_override = True return wm.invoke_props_dialog(self, width=320) else: for studio_light in prefs.studio_lights: @@ -1078,7 +1053,7 @@ class PREFERENCES_OT_studiolight_new(Operator): def draw(self, _context): layout = self.layout - if self.ask_overide: + if self.ask_override: layout.label(text="Warning, file already exists. Overwrite existing file?") else: layout.prop(self, "filename") diff --git a/release/scripts/startup/bl_operators/uvcalc_lightmap.py b/release/scripts/startup/bl_operators/uvcalc_lightmap.py index d13e98b96e9..29c17711c2a 100644 --- a/release/scripts/startup/bl_operators/uvcalc_lightmap.py +++ b/release/scripts/startup/bl_operators/uvcalc_lightmap.py @@ -568,8 +568,7 @@ def unwrap(operator, context, **kwargs): meshes = list({ me for obj in context.selected_objects if obj.type == 'MESH' - for me in (obj.data,) - if me.polygons and me.library is None + if (me := obj.data).polygons and me.library is None }) if not meshes: @@ -615,8 +614,8 @@ class LightMapPack(Operator): PREF_PACK_IN_ONE: BoolProperty( name="Share Texture Space", description=( - "Objects Share texture space, map all objects " - "into 1 uvmap" + "Objects share texture space, map all objects " + "into a single UV map" ), default=True, ) diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py index 2ee20e08589..06b3b4defcc 100644 --- a/release/scripts/startup/bl_operators/wm.py +++ b/release/scripts/startup/bl_operators/wm.py @@ -17,6 +17,7 @@ # ##### END GPL LICENSE BLOCK ##### # +from __future__ import annotations import bpy from bpy.types import ( @@ -859,9 +860,7 @@ class WM_OT_url_open_preset(Operator): type: EnumProperty( name="Site", - items=lambda self, _context: ( - item for (item, _) in WM_OT_url_open_preset.preset_items - ), + items=WM_OT_url_open_preset._preset_items, ) id: StringProperty( @@ -916,6 +915,10 @@ class WM_OT_url_open_preset(Operator): "https://www.blender.org/about/credits/"), ] + @staticmethod + def _preset_items(_self, _context): + return (item for (item, _) in WM_OT_url_open_preset.preset_items) + def execute(self, context): url = None type = self.type @@ -1217,11 +1220,14 @@ class WM_OT_properties_edit(Operator): ) subtype: EnumProperty( name="Subtype", - items=lambda self, _context: WM_OT_properties_edit.subtype_items, + items=WM_OT_properties_edit._subtype_items_fn, ) subtype_items = rna_vector_subtype_items + def _subtype_items_fn(_self, _context): + return WM_OT_properties_edit.subtype_items + def _init_subtype(self, prop_type, is_array, subtype): subtype = subtype or 'NONE' subtype_items = rna_vector_subtype_items @@ -2060,7 +2066,7 @@ class WM_OT_batch_rename(Operator): # Enum identifiers are compared with 'object.type'. ('MESH', "Meshes", ""), ('CURVE', "Curves", ""), - ('META', "Meta Balls", ""), + ('META', "Metaballs", ""), ('ARMATURE', "Armatures", ""), ('LATTICE', "Lattices", ""), ('GPENCIL', "Grease Pencils", ""), @@ -2191,8 +2197,7 @@ class WM_OT_batch_rename(Operator): id for ob in context.selected_objects if ob.type == data_type - for id in (ob.data,) - if id is not None and id.library is None + if (id := ob.data) is not None and id.library is None )) if only_selected else [id for id in getattr(bpy.data, attr) if id.library is None], @@ -2477,10 +2482,10 @@ class WM_OT_batch_rename(Operator): return wm.invoke_props_dialog(self, width=400) -class WM_MT_splash(Menu): - bl_label = "Splash" +class WM_MT_splash_quick_setup(Menu): + bl_label = "Quick Setup" - def draw_setup(self, context): + def draw(self, context): wm = context.window_manager # prefs = context.preferences @@ -2568,18 +2573,11 @@ class WM_MT_splash(Menu): layout.separator() layout.separator() + +class WM_MT_splash(Menu): + bl_label = "Splash" + def draw(self, context): - # Draw setup screen if no preferences have been saved yet. - import os - - userconfig_path = bpy.utils.user_resource('CONFIG') - userdef_path = os.path.join(userconfig_path, "userpref.blend") - - if not os.path.isfile(userdef_path): - self.draw_setup(context) - return - - # Pass layout = self.layout layout.operator_context = 'EXEC_DEFAULT' layout.emboss = 'PULLDOWN_MENU' @@ -2728,6 +2726,7 @@ classes = ( WM_OT_toolbar_prompt, BatchRenameAction, WM_OT_batch_rename, + WM_MT_splash_quick_setup, WM_MT_splash, WM_MT_splash_about, ) diff --git a/release/scripts/startup/bl_ui/properties_constraint.py b/release/scripts/startup/bl_ui/properties_constraint.py index 37a2b6a38e4..e8c62368239 100644 --- a/release/scripts/startup/bl_ui/properties_constraint.py +++ b/release/scripts/startup/bl_ui/properties_constraint.py @@ -20,7 +20,7 @@ from bpy.types import Panel -class ObjectConstraintPanel(Panel): +class ObjectConstraintPanel: bl_context = "constraint" @classmethod @@ -28,7 +28,7 @@ class ObjectConstraintPanel(Panel): return (context.object) -class BoneConstraintPanel(Panel): +class BoneConstraintPanel: bl_context = "bone_constraint" @classmethod @@ -36,7 +36,7 @@ class BoneConstraintPanel(Panel): return (context.pose_bone) -class OBJECT_PT_constraints(ObjectConstraintPanel): +class OBJECT_PT_constraints(ObjectConstraintPanel, Panel): bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' bl_label = "Object Constraints" @@ -50,7 +50,7 @@ class OBJECT_PT_constraints(ObjectConstraintPanel): layout.template_constraints(use_bone_constraints=False) -class BONE_PT_constraints(BoneConstraintPanel): +class BONE_PT_constraints(BoneConstraintPanel, Panel): bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' bl_label = "Bone Constraints" @@ -66,7 +66,7 @@ class BONE_PT_constraints(BoneConstraintPanel): # Parent class for constraint panels, with templates and drawing methods # shared between the bone and object constraint panels -class ConstraintButtonsPanel(Panel): +class ConstraintButtonsPanel: bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' bl_label = "" @@ -970,7 +970,7 @@ class ConstraintButtonsPanel(Panel): # Parent class for constraint subpanels -class ConstraintButtonsSubPanel(Panel): +class ConstraintButtonsSubPanel: bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' bl_label = "" @@ -1148,149 +1148,149 @@ class ConstraintButtonsSubPanel(Panel): # Child Of Constraint -class OBJECT_PT_bChildOfConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bChildOfConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_childof(context) -class BONE_PT_bChildOfConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bChildOfConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_childof(context) # Track To Constraint -class OBJECT_PT_bTrackToConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bTrackToConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_trackto(context) -class BONE_PT_bTrackToConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bTrackToConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_trackto(context) # Follow Path Constraint -class OBJECT_PT_bFollowPathConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bFollowPathConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_follow_path(context) -class BONE_PT_bFollowPathConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bFollowPathConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_follow_path(context) # Rotation Limit Constraint -class OBJECT_PT_bRotLimitConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bRotLimitConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_rot_limit(context) -class BONE_PT_bRotLimitConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bRotLimitConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_rot_limit(context) # Location Limit Constraint -class OBJECT_PT_bLocLimitConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bLocLimitConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_loc_limit(context) -class BONE_PT_bLocLimitConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bLocLimitConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_loc_limit(context) # Size Limit Constraint -class OBJECT_PT_bSizeLimitConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bSizeLimitConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_size_limit(context) -class BONE_PT_bSizeLimitConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bSizeLimitConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_size_limit(context) # Rotate Like Constraint -class OBJECT_PT_bRotateLikeConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bRotateLikeConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_rotate_like(context) -class BONE_PT_bRotateLikeConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bRotateLikeConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_rotate_like(context) # Locate Like Constraint -class OBJECT_PT_bLocateLikeConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bLocateLikeConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_locate_like(context) -class BONE_PT_bLocateLikeConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bLocateLikeConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_locate_like(context) # Size Like Constraint -class OBJECT_PT_bSizeLikeConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bSizeLikeConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_size_like(context) -class BONE_PT_bSizeLikeConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bSizeLikeConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_size_like(context) # Same Volume Constraint -class OBJECT_PT_bSameVolumeConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bSameVolumeConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_same_volume(context) -class BONE_PT_bSameVolumeConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bSameVolumeConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_same_volume(context) # Trans Like Constraint -class OBJECT_PT_bTransLikeConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bTransLikeConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_trans_like(context) -class BONE_PT_bTransLikeConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bTransLikeConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_trans_like(context) # Action Constraint -class OBJECT_PT_bActionConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bActionConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_action(context) -class BONE_PT_bActionConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bActionConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_action(context) -class OBJECT_PT_bActionConstraint_target(ObjectConstraintPanel, ConstraintButtonsSubPanel): +class OBJECT_PT_bActionConstraint_target(ObjectConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "OBJECT_PT_bActionConstraint" bl_label = "Target" @@ -1298,7 +1298,7 @@ class OBJECT_PT_bActionConstraint_target(ObjectConstraintPanel, ConstraintButton self.draw_action_target(context) -class BONE_PT_bActionConstraint_target(BoneConstraintPanel, ConstraintButtonsSubPanel): +class BONE_PT_bActionConstraint_target(BoneConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "BONE_PT_bActionConstraint" bl_label = "Target" @@ -1306,7 +1306,7 @@ class BONE_PT_bActionConstraint_target(BoneConstraintPanel, ConstraintButtonsSub self.draw_action_target(context) -class OBJECT_PT_bActionConstraint_action(ObjectConstraintPanel, ConstraintButtonsSubPanel): +class OBJECT_PT_bActionConstraint_action(ObjectConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "OBJECT_PT_bActionConstraint" bl_label = "Action" @@ -1314,7 +1314,7 @@ class OBJECT_PT_bActionConstraint_action(ObjectConstraintPanel, ConstraintButton self.draw_action_action(context) -class BONE_PT_bActionConstraint_action(BoneConstraintPanel, ConstraintButtonsSubPanel): +class BONE_PT_bActionConstraint_action(BoneConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "BONE_PT_bActionConstraint" bl_label = "Action" @@ -1324,77 +1324,77 @@ class BONE_PT_bActionConstraint_action(BoneConstraintPanel, ConstraintButtonsSub # Lock Track Constraint -class OBJECT_PT_bLockTrackConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bLockTrackConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_lock_track(context) -class BONE_PT_bLockTrackConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bLockTrackConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_lock_track(context) # Disance Limit Constraint -class OBJECT_PT_bDistLimitConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bDistLimitConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_dist_limit(context) -class BONE_PT_bDistLimitConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bDistLimitConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_dist_limit(context) # Stretch To Constraint -class OBJECT_PT_bStretchToConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bStretchToConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_stretch_to(context) -class BONE_PT_bStretchToConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bStretchToConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_stretch_to(context) # Min Max Constraint -class OBJECT_PT_bMinMaxConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bMinMaxConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_min_max(context) -class BONE_PT_bMinMaxConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bMinMaxConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_min_max(context) # Clamp To Constraint -class OBJECT_PT_bClampToConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bClampToConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_clamp_to(context) -class BONE_PT_bClampToConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bClampToConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_clamp_to(context) # Transform Constraint -class OBJECT_PT_bTransformConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bTransformConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_transform(context) -class BONE_PT_bTransformConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bTransformConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_transform(context) -class OBJECT_PT_bTransformConstraint_source(ObjectConstraintPanel, ConstraintButtonsSubPanel): +class OBJECT_PT_bTransformConstraint_source(ObjectConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "OBJECT_PT_bTransformConstraint" bl_label = "Map From" @@ -1402,7 +1402,7 @@ class OBJECT_PT_bTransformConstraint_source(ObjectConstraintPanel, ConstraintBut self.draw_transform_from(context) -class BONE_PT_bTransformConstraint_from(BoneConstraintPanel, ConstraintButtonsSubPanel): +class BONE_PT_bTransformConstraint_from(BoneConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "BONE_PT_bTransformConstraint" bl_label = "Map From" @@ -1410,7 +1410,7 @@ class BONE_PT_bTransformConstraint_from(BoneConstraintPanel, ConstraintButtonsSu self.draw_transform_from(context) -class OBJECT_PT_bTransformConstraint_destination(ObjectConstraintPanel, ConstraintButtonsSubPanel): +class OBJECT_PT_bTransformConstraint_destination(ObjectConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "OBJECT_PT_bTransformConstraint" bl_label = "Map To" @@ -1418,7 +1418,7 @@ class OBJECT_PT_bTransformConstraint_destination(ObjectConstraintPanel, Constrai self.draw_transform_to(context) -class BONE_PT_bTransformConstraint_to(BoneConstraintPanel, ConstraintButtonsSubPanel): +class BONE_PT_bTransformConstraint_to(BoneConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "BONE_PT_bTransformConstraint" bl_label = "Map To" @@ -1428,36 +1428,36 @@ class BONE_PT_bTransformConstraint_to(BoneConstraintPanel, ConstraintButtonsSubP # Shrinkwrap Constraint -class OBJECT_PT_bShrinkwrapConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bShrinkwrapConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_shrinkwrap(context) -class BONE_PT_bShrinkwrapConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bShrinkwrapConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_shrinkwrap(context) # Damp Track Constraint -class OBJECT_PT_bDampTrackConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bDampTrackConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_damp_track(context) -class BONE_PT_bDampTrackConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bDampTrackConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_damp_track(context) # Spline IK Constraint -class BONE_PT_bSplineIKConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bSplineIKConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_spline_ik(context) -class BONE_PT_bSplineIKConstraint_fitting(BoneConstraintPanel, ConstraintButtonsSubPanel): +class BONE_PT_bSplineIKConstraint_fitting(BoneConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "BONE_PT_bSplineIKConstraint" bl_label = "Fitting" @@ -1465,7 +1465,7 @@ class BONE_PT_bSplineIKConstraint_fitting(BoneConstraintPanel, ConstraintButtons self.draw_spline_ik_fitting(context) -class BONE_PT_bSplineIKConstraint_chain_scaling(BoneConstraintPanel, ConstraintButtonsSubPanel): +class BONE_PT_bSplineIKConstraint_chain_scaling(BoneConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "BONE_PT_bSplineIKConstraint" bl_label = "Chain Scaling" @@ -1475,89 +1475,89 @@ class BONE_PT_bSplineIKConstraint_chain_scaling(BoneConstraintPanel, ConstraintB # Pivot Constraint -class OBJECT_PT_bPivotConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bPivotConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_pivot(context) -class BONE_PT_bPivotConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bPivotConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_pivot(context) # Follow Track Constraint -class OBJECT_PT_bFollowTrackConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bFollowTrackConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_follow_track(context) -class BONE_PT_bFollowTrackConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bFollowTrackConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_follow_track(context) # Camera Solver Constraint -class OBJECT_PT_bCameraSolverConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bCameraSolverConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_camera_solver(context) -class BONE_PT_bCameraSolverConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bCameraSolverConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_camera_solver(context) # Object Solver Constraint -class OBJECT_PT_bObjectSolverConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bObjectSolverConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_object_solver(context) -class BONE_PT_bObjectSolverConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bObjectSolverConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_object_solver(context) # Transform Cache Constraint -class OBJECT_PT_bTransformCacheConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bTransformCacheConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_transform_cache(context) -class BONE_PT_bTransformCacheConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bTransformCacheConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_transform_cache(context) # Python Constraint -class OBJECT_PT_bPythonConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bPythonConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_python_constraint(context) -class BONE_PT_bPythonConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bPythonConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_python_constraint(context) # Armature Constraint -class OBJECT_PT_bArmatureConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bArmatureConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_armature(context) -class BONE_PT_bArmatureConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bArmatureConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_armature(context) -class OBJECT_PT_bArmatureConstraint_bones(ObjectConstraintPanel, ConstraintButtonsSubPanel): +class OBJECT_PT_bArmatureConstraint_bones(ObjectConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "OBJECT_PT_bArmatureConstraint" bl_label = "Bones" @@ -1565,7 +1565,7 @@ class OBJECT_PT_bArmatureConstraint_bones(ObjectConstraintPanel, ConstraintButto self.draw_armature_bones(context) -class BONE_PT_bArmatureConstraint_bones(BoneConstraintPanel, ConstraintButtonsSubPanel): +class BONE_PT_bArmatureConstraint_bones(BoneConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "BONE_PT_bArmatureConstraint" bl_label = "Bones" @@ -1575,12 +1575,12 @@ class BONE_PT_bArmatureConstraint_bones(BoneConstraintPanel, ConstraintButtonsSu # Inverse Kinematic Constraint -class OBJECT_PT_bKinematicConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bKinematicConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_kinematic(context) -class BONE_PT_bKinematicConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bKinematicConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_kinematic(context) diff --git a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py index 67905192fe8..0eb5d60457c 100644 --- a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py +++ b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py @@ -328,11 +328,6 @@ class GPENCIL_MT_material_active(Menu): @classmethod def poll(cls, context): ob = context.active_object - tool_settings = context.scene.tool_settings - mode = tool_settings.gpencil_paint.color_mode - if mode != 'MATERIAL': - return False - if ob is None or len(ob.material_slots) == 0: return False @@ -478,6 +473,7 @@ class AnnotationDataPanel: tool_settings = context.tool_settings if gpd and gpl: + layout.prop(gpl, "opacity", text="Opacity", slider=True) layout.prop(gpl, "thickness") else: layout.prop(tool_settings, "annotation_thickness", text="Thickness") diff --git a/release/scripts/startup/bl_ui/properties_paint_common.py b/release/scripts/startup/bl_ui/properties_paint_common.py index ace39d82544..91c58ba49cb 100644 --- a/release/scripts/startup/bl_ui/properties_paint_common.py +++ b/release/scripts/startup/bl_ui/properties_paint_common.py @@ -909,7 +909,7 @@ def brush_settings_advanced(layout, context, brush, popover=False): if popover: brush_settings(layout, context, brush, popover=True) layout.separator() - layout.label(text="Advanced:") + layout.label(text="Advanced") # These options are shared across many modes. use_accumulate = False @@ -1225,14 +1225,22 @@ def brush_basic_gpencil_paint_settings(layout, context, brush, *, compact=False) # FIXME: tools must use their own UI drawing! elif brush.gpencil_tool == 'FILL': + use_property_split_prev = layout.use_property_split + if compact: + row = layout.row(align=True) + row.prop(gp_settings, "fill_direction", text="", expand=True) + else: + layout.use_property_split = False + row = layout.row(align=True) + row.prop(gp_settings, "fill_direction", expand=True) + row = layout.row(align=True) - row.prop(gp_settings, "fill_direction", text="", expand=True) + row.prop(gp_settings, "fill_factor") row = layout.row(align=True) row.prop(gp_settings, "fill_leak", text="Leak Size") row = layout.row(align=True) row.prop(brush, "size", text="Thickness") - row = layout.row(align=True) - row.prop(gp_settings, "fill_simplify_level", text="Simplify") + layout.use_property_split = use_property_split_prev else: # brush.gpencil_tool == 'DRAW/TINT': row = layout.row(align=True) diff --git a/release/scripts/startup/bl_ui/properties_physics_fluid.py b/release/scripts/startup/bl_ui/properties_physics_fluid.py index 5c3975ffb76..5d3417fad0f 100644 --- a/release/scripts/startup/bl_ui/properties_physics_fluid.py +++ b/release/scripts/startup/bl_ui/properties_physics_fluid.py @@ -958,7 +958,7 @@ class PHYSICS_PT_particles(PhysicButtonsPanel, Panel): col.separator() col = flow.column() - col.prop(domain, "sndparticle_boundary", text="Particles in Boundary:") + col.prop(domain, "sndparticle_boundary", text="Particles in Boundary") if domain.cache_type == 'MODULAR': col.separator() diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py index b326a23b390..3abaa490d02 100644 --- a/release/scripts/startup/bl_ui/properties_render.py +++ b/release/scripts/startup/bl_ui/properties_render.py @@ -198,8 +198,15 @@ class RENDER_PT_eevee_depth_of_field(RenderButtonsPanel, Panel): col = layout.column() col.prop(props, "bokeh_max_size") - # Not supported yet - # col.prop(props, "bokeh_threshold") + col.prop(props, "bokeh_threshold") + col.prop(props, "bokeh_neighbor_max") + col.prop(props, "bokeh_denoise_fac") + col.prop(props, "use_bokeh_high_quality_slight_defocus") + col.prop(props, "use_bokeh_jittered") + + col = layout.column() + col.active = props.use_bokeh_jittered + col.prop(props, "bokeh_overblur") class RENDER_PT_eevee_bloom(RenderButtonsPanel, Panel): diff --git a/release/scripts/startup/bl_ui/properties_view_layer.py b/release/scripts/startup/bl_ui/properties_view_layer.py index b5e6942f19d..8c39684583f 100644 --- a/release/scripts/startup/bl_ui/properties_view_layer.py +++ b/release/scripts/startup/bl_ui/properties_view_layer.py @@ -119,7 +119,8 @@ class VIEWLAYER_PT_eevee_layer_passes_light(ViewLayerButtonsPanel, Panel): col.prop(view_layer, "use_pass_emit", text="Emission") col.prop(view_layer, "use_pass_environment") col.prop(view_layer, "use_pass_shadow") - col.prop(view_layer, "use_pass_ambient_occlusion", text="Ambient Occlusion") + col.prop(view_layer, "use_pass_ambient_occlusion", + text="Ambient Occlusion") class VIEWLAYER_PT_eevee_layer_passes_effects(ViewLayerButtonsPanel, Panel): @@ -143,10 +144,8 @@ class VIEWLAYER_PT_eevee_layer_passes_effects(ViewLayerButtonsPanel, Panel): col.active = scene_eevee.use_bloom -class VIEWLAYER_PT_layer_passes_aov(ViewLayerButtonsPanel, Panel): +class ViewLayerAOVPanel(ViewLayerButtonsPanel, Panel): bl_label = "Shader AOV" - bl_parent_id = "VIEWLAYER_PT_layer_passes" - COMPAT_ENGINES = {'BLENDER_EEVEE'} def draw(self, context): layout = self.layout @@ -158,7 +157,8 @@ class VIEWLAYER_PT_layer_passes_aov(ViewLayerButtonsPanel, Panel): row = layout.row() col = row.column() - col.template_list("VIEWLAYER_UL_aov", "aovs", view_layer, "aovs", view_layer, "active_aov_index", rows=2) + col.template_list("VIEWLAYER_UL_aov", "aovs", view_layer, + "aovs", view_layer, "active_aov_index", rows=2) col = row.column() sub = col.column(align=True) @@ -167,7 +167,13 @@ class VIEWLAYER_PT_layer_passes_aov(ViewLayerButtonsPanel, Panel): aov = view_layer.active_aov if aov and not aov.is_valid: - layout.label(text="Conflicts with another render pass with the same name", icon='ERROR') + layout.label( + text="Conflicts with another render pass with the same name", icon='ERROR') + + +class VIEWLAYER_PT_layer_passes_aov(ViewLayerAOVPanel): + bl_parent_id = "VIEWLAYER_PT_layer_passes" + COMPAT_ENGINES = {'BLENDER_EEVEE'} class ViewLayerCryptomattePanel(ViewLayerButtonsPanel, Panel): @@ -190,10 +196,11 @@ class ViewLayerCryptomattePanel(ViewLayerButtonsPanel, Panel): view_layer.use_pass_cryptomatte_material, view_layer.use_pass_cryptomatte_asset)) col.prop(view_layer, "pass_cryptomatte_depth", text="Levels") - col.prop(view_layer, "use_pass_cryptomatte_accurate", text="Accurate Mode") + col.prop(view_layer, "use_pass_cryptomatte_accurate", + text="Accurate Mode") -class VIEWLAYER_PT_layer_passes_cryptomatte(ViewLayerCryptomattePanel): +class VIEWLAYER_PT_layer_passes_cryptomatte(ViewLayerCryptomattePanel, Panel): bl_parent_id = "VIEWLAYER_PT_layer_passes" COMPAT_ENGINES = {'BLENDER_EEVEE'} diff --git a/release/scripts/startup/bl_ui/space_dopesheet.py b/release/scripts/startup/bl_ui/space_dopesheet.py index aa98e4292f4..39d232b2871 100644 --- a/release/scripts/startup/bl_ui/space_dopesheet.py +++ b/release/scripts/startup/bl_ui/space_dopesheet.py @@ -322,7 +322,7 @@ class DOPESHEET_MT_editor_menus(Menu): if st.mode != 'GPENCIL': layout.menu("DOPESHEET_MT_key") else: - layout.menu("DOPESHEET_MT_gpencil_frame") + layout.menu("DOPESHEET_MT_gpencil_key") class DOPESHEET_MT_view(Menu): @@ -558,8 +558,8 @@ class DOPESHEET_MT_gpencil_channel(Menu): layout.operator_menu_enum("anim.channels_move", "direction", text="Move...") -class DOPESHEET_MT_gpencil_frame(Menu): - bl_label = "Frame" +class DOPESHEET_MT_gpencil_key(Menu): + bl_label = "Key" def draw(self, _context): layout = self.layout @@ -569,15 +569,14 @@ class DOPESHEET_MT_gpencil_frame(Menu): layout.operator_menu_enum("action.mirror", "type", text="Mirror") layout.separator() - layout.operator("action.duplicate") - layout.operator("action.delete") + layout.operator("action.keyframe_insert") layout.separator() - layout.operator("action.keyframe_type") + layout.operator("action.delete") + layout.operator("gpencil.interpolate_reverse") - # layout.separator() - # layout.operator("action.copy") - # layout.operator("action.paste") + layout.separator() + layout.operator("action.keyframe_type", text="Keyframe Type") class DOPESHEET_MT_delete(Menu): @@ -761,7 +760,7 @@ classes = ( DOPESHEET_MT_key, DOPESHEET_MT_key_transform, DOPESHEET_MT_gpencil_channel, - DOPESHEET_MT_gpencil_frame, + DOPESHEET_MT_gpencil_key, DOPESHEET_MT_delete, DOPESHEET_MT_context_menu, DOPESHEET_MT_channel_context_menu, diff --git a/release/scripts/startup/bl_ui/space_outliner.py b/release/scripts/startup/bl_ui/space_outliner.py index 1df7360774f..43a5e17e50e 100644 --- a/release/scripts/startup/bl_ui/space_outliner.py +++ b/release/scripts/startup/bl_ui/space_outliner.py @@ -323,7 +323,7 @@ class OUTLINER_PT_filter(Panel): display_mode = space.display_mode if display_mode == 'VIEW_LAYER': - layout.label(text="Restriction Toggles:") + layout.label(text="Restriction Toggles") row = layout.row(align=True) row.prop(space, "show_restrict_column_enable", text="") row.prop(space, "show_restrict_column_select", text="") @@ -334,7 +334,7 @@ class OUTLINER_PT_filter(Panel): row.prop(space, "show_restrict_column_indirect_only", text="") layout.separator() elif display_mode == 'SCENES': - layout.label(text="Restriction Toggles:") + layout.label(text="Restriction Toggles") row = layout.row(align=True) row.prop(space, "show_restrict_column_select", text="") row.prop(space, "show_restrict_column_hide", text="") @@ -354,7 +354,7 @@ class OUTLINER_PT_filter(Panel): layout.separator() col = layout.column(align=True) - col.label(text="Search:") + col.label(text="Search") col.prop(space, "use_filter_complete", text="Exact Match") col.prop(space, "use_filter_case_sensitive", text="Case Sensitive") @@ -363,7 +363,7 @@ class OUTLINER_PT_filter(Panel): layout.separator() - layout.label(text="Filter:") + layout.label(text="Filter") col = layout.column(align=True) diff --git a/release/scripts/startup/bl_ui/space_properties.py b/release/scripts/startup/bl_ui/space_properties.py index b2a7246af75..b7d5b5007d6 100644 --- a/release/scripts/startup/bl_ui/space_properties.py +++ b/release/scripts/startup/bl_ui/space_properties.py @@ -72,9 +72,10 @@ class PROPERTIES_PT_navigation_bar(Panel): class PROPERTIES_PT_options(Panel): + """Show options for the properties editor""" bl_space_type = 'PROPERTIES' bl_region_type = 'HEADER' - bl_label = 'Options' + bl_label = "Options" def draw(self, context): layout = self.layout diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py index 79f88b1b67d..e10f3383bc8 100644 --- a/release/scripts/startup/bl_ui/space_sequencer.py +++ b/release/scripts/startup/bl_ui/space_sequencer.py @@ -408,17 +408,6 @@ class SEQUENCER_MT_view(Menu): if context.preferences.view.show_developer_ui: layout.menu("SEQUENCER_MT_view_cache", text="Show Cache") - if is_preview: - layout.separator() - if st.display_mode == 'IMAGE': - layout.prop(st, "use_zoom_to_fit") - layout.prop(ed, "show_overlay", text="Show Frame Overlay") - layout.prop(st, "show_safe_areas", text="Show Safe Areas") - layout.prop(st, "show_metadata", text="Show Metadata") - layout.prop(st, "show_annotation", text="Show Annotations") - elif st.display_mode == 'WAVEFORM': - layout.prop(st, "show_separate_color", text="Show Separate Color Channels") - layout.separator() layout.operator("render.opengl", text="Sequence Render Image", icon='RENDER_STILL').sequencer = True @@ -1409,52 +1398,6 @@ class SEQUENCER_PT_source(SequencerButtonsPanel, Panel): split.label(text="None") -class SEQUENCER_PT_sound(SequencerButtonsPanel, Panel): - bl_label = "Sound" - bl_parent_id = "" - bl_category = "Strip" - - @classmethod - def poll(cls, context): - if not cls.has_sequencer(context): - return False - - strip = act_strip(context) - if not strip: - return False - - return (strip.type == 'SOUND') - - def draw(self, context): - layout = self.layout - layout.use_property_split = True - - strip = act_strip(context) - sound = strip.sound - - layout.active = not strip.mute - - layout.template_ID(strip, "sound", open="sound.open") - if sound is not None: - layout.prop(sound, "filepath", text="") - - layout.use_property_split = True - layout.use_property_decorate = False - - layout.alignment = 'RIGHT' - sub = layout.column(align=True) - split = sub.split(factor=0.5, align=True) - split.alignment = 'RIGHT' - if sound.packed_file: - split.label(text="Unpack") - split.operator("sound.unpack", icon='PACKAGE', text="") - else: - split.label(text="Pack") - split.operator("sound.pack", icon='UGLYPACKAGE', text="") - - layout.prop(sound, "use_memory_cache") - - class SEQUENCER_PT_scene(SequencerButtonsPanel, Panel): bl_label = "Scene" bl_category = "Strip" diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py index 68cded82ce3..8e99c3af4c3 100644 --- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -2035,6 +2035,25 @@ class _defs_gpencil_paint: draw_settings=draw_settings, ) + @ToolDef.from_fn + def interpolate(): + def draw_settings(context, layout, tool): + props = tool.operator_properties("gpencil.interpolate") + layout.prop(props, "layers") + layout.prop(props, "flip") + layout.prop(props, "smooth_factor") + layout.prop(props, "smooth_steps") + + return dict( + idname="builtin.interpolate", + label="Interpolate", + icon="ops.pose.breakdowner", + cursor='DEFAULT', + widget=None, + keymap=(), + draw_settings=draw_settings, + ) + class _defs_gpencil_edit: def is_segment(context): @@ -2198,6 +2217,26 @@ class _defs_gpencil_edit: draw_settings=draw_settings, ) + @ToolDef.from_fn + def interpolate(): + def draw_settings(context, layout, tool): + props = tool.operator_properties("gpencil.interpolate") + layout.prop(props, "layers") + layout.prop(props, "interpolate_selected_only") + layout.prop(props, "flip") + layout.prop(props, "smooth_factor") + layout.prop(props, "smooth_steps") + + return dict( + idname="builtin.interpolate", + label="Interpolate", + icon="ops.pose.breakdowner", + cursor='DEFAULT', + widget=None, + keymap=(), + draw_settings=draw_settings, + ) + class _defs_gpencil_sculpt: @@ -2877,6 +2916,8 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel): _defs_gpencil_paint.box, _defs_gpencil_paint.circle, None, + _defs_gpencil_paint.interpolate, + None, *_tools_annotate, ], 'EDIT_GPENCIL': [ @@ -2892,9 +2933,10 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel): _defs_gpencil_edit.shear, _defs_gpencil_edit.tosphere, ), - None, _defs_gpencil_edit.transform_fill, None, + _defs_gpencil_edit.interpolate, + None, *_tools_annotate, ], 'SCULPT_GPENCIL': [ diff --git a/release/scripts/startup/bl_ui/space_topbar.py b/release/scripts/startup/bl_ui/space_topbar.py index 255b6326416..45460a1a5de 100644 --- a/release/scripts/startup/bl_ui/space_topbar.py +++ b/release/scripts/startup/bl_ui/space_topbar.py @@ -248,7 +248,34 @@ class TOPBAR_MT_file_cleanup(Menu): layout = self.layout layout.separator() - layout.operator("outliner.orphans_purge", text="Unused Data-Blocks") + op_props = layout.operator("outliner.orphans_purge", text="Unused Data-Blocks") + op_props.do_local_ids = True + op_props.do_linked_ids = True + op_props.do_recursive = False + op_props = layout.operator("outliner.orphans_purge", text="Recursive Unused Data-Blocks") + op_props.do_local_ids = True + op_props.do_linked_ids = True + op_props.do_recursive = True + + layout.separator() + op_props = layout.operator("outliner.orphans_purge", text="Unused Linked Data-Blocks") + op_props.do_local_ids = False + op_props.do_linked_ids = True + op_props.do_recursive = False + op_props = layout.operator("outliner.orphans_purge", text="Recursive Unused Linked Data-Blocks") + op_props.do_local_ids = False + op_props.do_linked_ids = True + op_props.do_recursive = True + + layout.separator() + op_props = layout.operator("outliner.orphans_purge", text="Unused Local Data-Blocks") + op_props.do_local_ids = True + op_props.do_linked_ids = False + op_props.do_recursive = False + op_props = layout.operator("outliner.orphans_purge", text="Recursive Unused Local Data-Blocks") + op_props.do_local_ids = True + op_props.do_linked_ids = False + op_props.do_recursive = True class TOPBAR_MT_file(Menu): diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index a0b5355e64d..94a1e2bec4d 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -1333,7 +1333,7 @@ class USERPREF_PT_saveload_autorun(FilePathsPanel, Panel): box = layout.box() row = box.row() - row.label(text="Excluded Paths:") + row.label(text="Excluded Paths") row.operator("preferences.autoexec_path_add", text="", icon='ADD', emboss=False) for i, path_cmp in enumerate(prefs.autoexec_paths): row = box.row() diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index ebb6280a42f..41a1831f46a 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -158,7 +158,7 @@ class VIEW3D_HT_tool_header(Header): elif mode_string == 'POSE': _row, sub = row_for_mirror() sub.prop(context.object.pose, "use_mirror_x", text="X", toggle=True) - elif mode_string in {'EDIT_MESH', 'PAINT_WEIGHT', 'SCULPT', 'PAINT_VERTEX'}: + elif mode_string in {'EDIT_MESH', 'PAINT_WEIGHT', 'SCULPT', 'PAINT_VERTEX', 'PAINT_TEXTURE'}: # Mesh Modes, Use Mesh Symmetry row, sub = row_for_mirror() sub.prop(context.object.data, "use_mirror_x", text="X", toggle=True) @@ -695,6 +695,10 @@ class VIEW3D_HT_header(Header): row.prop(tool_settings, "use_gpencil_vertex_select_mask_stroke", text="") row.prop(tool_settings, "use_gpencil_vertex_select_mask_segment", text="") + if gpd.is_stroke_paint_mode: + row = layout.row(align=True) + row.prop(gpd, "use_multiedit", text="", icon='GP_MULTIFRAME_EDITING') + if ( gpd.use_stroke_edit_mode or gpd.is_stroke_sculpt_mode or @@ -711,13 +715,6 @@ class VIEW3D_HT_header(Header): text="Multiframe", ) - if gpd.use_stroke_edit_mode or gpd.is_stroke_paint_mode: - row = layout.row(align=True) - row.popover( - panel="VIEW3D_PT_tools_grease_pencil_interpolate", - text="Interpolate", - ) - overlay = view.overlay VIEW3D_MT_editor_menus.draw_collapsible(context, layout) @@ -4903,7 +4900,7 @@ class VIEW3D_MT_draw_gpencil(Menu): layout.separator() layout.menu("VIEW3D_MT_gpencil_animation") - layout.menu("VIEW3D_MT_edit_gpencil_interpolate") + layout.operator("gpencil.interpolate_sequence", text="Interpolate Sequence") layout.separator() @@ -4965,7 +4962,7 @@ class VIEW3D_MT_edit_gpencil(Menu): layout.separator() layout.menu("VIEW3D_MT_gpencil_animation") - layout.menu("VIEW3D_MT_edit_gpencil_interpolate") + layout.operator("gpencil.interpolate_sequence", text="Interpolate Sequence") layout.separator() @@ -5129,16 +5126,6 @@ class VIEW3D_MT_edit_gpencil_showhide(Menu): layout.operator("gpencil.hide", text="Hide Inactive Layers").unselected = True -class VIEW3D_MT_edit_gpencil_interpolate(Menu): - bl_label = "Interpolate" - - def draw(self, _context): - layout = self.layout - - layout.operator("gpencil.interpolate", text="Interpolate") - layout.operator("gpencil.interpolate_sequence", text="Sequence") - - class VIEW3D_MT_object_mode_pie(Menu): bl_label = "Mode" @@ -6223,7 +6210,7 @@ class VIEW3D_PT_overlay_motion_tracking(Panel): col = layout.column() col.active = display_all - col.label(text="Tracks:") + col.label(text="Tracks") row = col.row(align=True) row.prop(view, "tracks_display_type", text="") row.prop(view, "tracks_display_size", text="Size") @@ -6936,7 +6923,7 @@ class VIEW3D_PT_view3d_stereo(Panel): col = layout.column() col.row().prop(view, "stereo_3d_camera", expand=True) - col.label(text="Display:") + col.label(text="Display") row = col.row() row.active = basic_stereo row.prop(view, "show_stereo_3d_cameras") @@ -7651,7 +7638,6 @@ classes = ( VIEW3D_MT_edit_armature_names, VIEW3D_MT_edit_armature_delete, VIEW3D_MT_edit_gpencil_transform, - VIEW3D_MT_edit_gpencil_interpolate, VIEW3D_MT_object_mode_pie, VIEW3D_MT_view_pie, VIEW3D_MT_transform_gizmo_pie, diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py index 8028df41b2b..ecf46ac2592 100644 --- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py +++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py @@ -333,6 +333,17 @@ class VIEW3D_PT_tools_particlemode(Panel, View3DPaintPanel): layout.use_property_split = True layout.use_property_decorate = False # No animation. + from bl_ui.space_toolsystem_common import ToolSelectPanelHelper + tool_context = ToolSelectPanelHelper.tool_active_from_context(context) + + if not tool_context: + # If there is no active tool, then there can't be an active brush. + tool = None + + if not tool_context.has_datablock: + # tool.has_datablock is always true for tools that use brushes. + tool = None + if tool is not None: col = layout.column() col.prop(brush, "size", slider=True) @@ -1395,7 +1406,7 @@ class VIEW3D_PT_tools_grease_pencil_brush_advanced(View3DPanel, Panel): bl_parent_id = 'VIEW3D_PT_tools_grease_pencil_brush_settings' bl_category = "Tool" bl_options = {'DEFAULT_CLOSED'} - bl_ui_units_x = 11 + bl_ui_units_x = 13 @classmethod def poll(cls, context): @@ -1448,7 +1459,12 @@ class VIEW3D_PT_tools_grease_pencil_brush_advanced(View3DPanel, Panel): row.prop(gp_settings, "fill_layer_mode", text="Layers") col.separator() - col.prop(gp_settings, "fill_factor") + row = col.row(align=True) + row.prop(gp_settings, "extend_stroke_factor") + row.prop(gp_settings, "show_fill_extend", text="", icon='GRID') + + col.separator() + col.prop(gp_settings, "fill_simplify_level", text="Simplify") if gp_settings.fill_draw_mode != 'STROKE': col = layout.column(align=False, heading="Ignore Transparent") col.use_property_decorate = False @@ -1459,6 +1475,10 @@ class VIEW3D_PT_tools_grease_pencil_brush_advanced(View3DPanel, Panel): sub.active = gp_settings.show_fill sub.prop(gp_settings, "fill_threshold", text="") + col.separator() + row = col.row(align=True) + row.prop(gp_settings, "use_fill_limit") + class VIEW3D_PT_tools_grease_pencil_brush_stroke(Panel, View3DPanel): bl_context = ".greasepencil_paint" @@ -1685,58 +1705,6 @@ class VIEW3D_PT_tools_grease_pencil_brush_paint_falloff(GreasePencilBrushFalloff return (settings and settings.brush and settings.brush.curve and tool == 'TINT') -# Grease Pencil stroke interpolation tools -class VIEW3D_PT_tools_grease_pencil_interpolate(Panel): - bl_space_type = 'VIEW_3D' - bl_region_type = 'HEADER' - bl_label = "Interpolate" - - @classmethod - def poll(cls, context): - if context.gpencil_data is None: - return False - - gpd = context.gpencil_data - valid_mode = bool(gpd.use_stroke_edit_mode or gpd.is_stroke_paint_mode) - return bool(context.editable_gpencil_strokes) and valid_mode - - def draw(self, context): - layout = self.layout - settings = context.tool_settings.gpencil_interpolate - - col = layout.column(align=True) - col.label(text="Interpolate Strokes") - col.operator("gpencil.interpolate", text="Interpolate") - col.operator("gpencil.interpolate_sequence", text="Sequence") - col.operator("gpencil.interpolate_reverse", text="Remove Breakdowns") - - col = layout.column(align=True) - col.label(text="Options:") - col.prop(settings, "interpolate_all_layers") - - gpd = context.gpencil_data - if gpd.use_stroke_edit_mode: - col.prop(settings, "interpolate_selected_only") - - col = layout.column(align=True) - col.label(text="Sequence Options:") - col.prop(settings, "step") - col.prop(settings, "type") - if settings.type == 'CUSTOM': - # TODO: Options for loading/saving curve presets? - col.template_curve_mapping(settings, "interpolation_curve", brush=True, - use_negative_slope=True) - elif settings.type != 'LINEAR': - col.prop(settings, "easing") - - if settings.type == 'BACK': - layout.prop(settings, "back") - elif settings.type == 'ELASTIC': - sub = layout.column(align=True) - sub.prop(settings, "amplitude") - sub.prop(settings, "period") - - # Grease Pencil stroke sculpting tools class GreasePencilSculptPanel: bl_context = ".greasepencil_sculpt" @@ -2258,7 +2226,6 @@ classes = ( VIEW3D_PT_tools_grease_pencil_vertex_paint_select, VIEW3D_PT_tools_grease_pencil_vertex_paint_settings, VIEW3D_PT_tools_grease_pencil_vertex_appearance, - VIEW3D_PT_tools_grease_pencil_interpolate, VIEW3D_PT_tools_grease_pencil_brush_mixcolor, VIEW3D_PT_tools_grease_pencil_brush_mix_palette, diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py index 40b57fd10de..ba0a22af0d1 100644 --- a/release/scripts/startup/nodeitems_builtins.py +++ b/release/scripts/startup/nodeitems_builtins.py @@ -491,6 +491,8 @@ geometry_node_categories = [ NodeItem("GeometryNodeAttributeColorRamp"), NodeItem("GeometryNodeAttributeVectorMath"), NodeItem("GeometryNodeAttributeSampleTexture"), + NodeItem("GeometryNodeAttributeCombineXYZ"), + NodeItem("GeometryNodeAttributeSeparateXYZ"), ]), GeometryNodeCategory("GEO_COLOR", "Color", items=[ NodeItem("ShaderNodeValToRGB"), @@ -506,6 +508,7 @@ geometry_node_categories = [ NodeItem("GeometryNodeCollectionInfo"), NodeItem("FunctionNodeRandomFloat"), NodeItem("ShaderNodeValue"), + NodeItem("FunctionNodeInputString"), NodeItem("FunctionNodeInputVector"), NodeItem("GeometryNodeIsViewport"), ]), @@ -514,6 +517,7 @@ geometry_node_categories = [ NodeItem("GeometryNodeTriangulate"), NodeItem("GeometryNodeEdgeSplit"), NodeItem("GeometryNodeSubdivisionSurface"), + NodeItem("GeometryNodeSubdivisionSurfaceSimple"), ]), GeometryNodeCategory("GEO_POINT", "Point", items=[ NodeItem("GeometryNodePointDistribute"), diff --git a/release/scripts/templates_py/operator_mesh_add.py b/release/scripts/templates_py/operator_mesh_add.py index 01a9ad6160e..aa5b9ebf880 100644 --- a/release/scripts/templates_py/operator_mesh_add.py +++ b/release/scripts/templates_py/operator_mesh_add.py @@ -2,6 +2,9 @@ import bpy import bmesh from bpy_extras.object_utils import AddObjectHelper +from bpy.props import ( + FloatProperty, +) def add_box(width, height, depth): """ @@ -36,16 +39,7 @@ def add_box(width, height, depth): return verts, faces -from bpy.props import ( - BoolProperty, - BoolVectorProperty, - EnumProperty, - FloatProperty, - FloatVectorProperty, -) - - -class AddBox(bpy.types.Operator): +class AddBox(bpy.types.Operator, AddObjectHelper): """Add a simple box mesh""" bl_idname = "mesh.primitive_box_add" bl_label = "Add Box" @@ -69,33 +63,6 @@ class AddBox(bpy.types.Operator): min=0.01, max=100.0, default=1.0, ) - layers: BoolVectorProperty( - name="Layers", - description="Object Layers", - size=20, - options={'HIDDEN', 'SKIP_SAVE'}, - ) - - # generic transform props - align_items = ( - ('WORLD', "World", "Align the new object to the world"), - ('VIEW', "View", "Align the new object to the view"), - ('CURSOR', "3D Cursor", "Use the 3D cursor orientation for the new object") - ) - align: EnumProperty( - name="Align", - items=align_items, - default='WORLD', - update=AddObjectHelper.align_update_callback, - ) - location: FloatVectorProperty( - name="Location", - subtype='TRANSLATION', - ) - rotation: FloatVectorProperty( - name="Rotation", - subtype='EULER', - ) def execute(self, context): diff --git a/source/blender/CMakeLists.txt b/source/blender/CMakeLists.txt index efd30ba8509..f875a990d0a 100644 --- a/source/blender/CMakeLists.txt +++ b/source/blender/CMakeLists.txt @@ -20,6 +20,7 @@ set(SRC_DNA_INC ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_ID.h + ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_ID_enums.h ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_action_types.h ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_anim_types.h ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_armature_types.h diff --git a/source/blender/blenfont/intern/blf.c b/source/blender/blenfont/intern/blf.c index 48f283e67b9..4d483934717 100644 --- a/source/blender/blenfont/intern/blf.c +++ b/source/blender/blenfont/intern/blf.c @@ -560,7 +560,7 @@ void BLF_draw_ascii_ex(int fontid, const char *str, size_t len, struct ResultBLF if (font) { blf_draw_gl__start(font); if (font->flags & BLF_WORD_WRAP) { - /* use non-ascii draw function for word-wrap */ + /* Use non-ASCII draw function for word-wrap. */ blf_font_draw__wrap(font, str, len, r_info); } else { diff --git a/source/blender/blenfont/intern/blf_dir.c b/source/blender/blenfont/intern/blf_dir.c index 25235097505..9520e971148 100644 --- a/source/blender/blenfont/intern/blf_dir.c +++ b/source/blender/blenfont/intern/blf_dir.c @@ -140,7 +140,7 @@ char *blf_dir_search(const char *file) } if (!s) { - /* Assume file is either an abslute path, or a relative path to current directory. */ + /* Assume file is either an absolute path, or a relative path to current directory. */ BLI_strncpy(full_path, file, sizeof(full_path)); BLI_path_abs(full_path, BKE_main_blendfile_path(G_MAIN)); if (BLI_exists(full_path)) { @@ -151,8 +151,9 @@ char *blf_dir_search(const char *file) return s; } -/* Some font have additional file with metrics information, - * in general, the extension of the file is: .afm or .pfm +/** + * Some font have additional file with metrics information, + * in general, the extension of the file is: `.afm` or `.pfm` */ char *blf_dir_metrics_search(const char *filename) { diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c index 189cbaf152d..f83ee409187 100644 --- a/source/blender/blenfont/intern/blf_font.c +++ b/source/blender/blenfont/intern/blf_font.c @@ -192,7 +192,7 @@ static GPUTexture *blf_batch_cache_texture_load(void) int remain_row = tex_width - offset_x; int width = remain > remain_row ? remain_row : remain; GPU_texture_update_sub(gc->texture, - GPU_DATA_UNSIGNED_BYTE, + GPU_DATA_UBYTE, &gc->bitmap_result[bitmap_len_landed], offset_x, offset_y, diff --git a/source/blender/blenkernel/BKE_attribute_access.hh b/source/blender/blenkernel/BKE_attribute_access.hh index 55c8b36669d..653c0f0d85d 100644 --- a/source/blender/blenkernel/BKE_attribute_access.hh +++ b/source/blender/blenkernel/BKE_attribute_access.hh @@ -33,6 +33,8 @@ using fn::CPPType; const CPPType *custom_data_type_to_cpp_type(const CustomDataType type); CustomDataType cpp_type_to_custom_data_type(const CPPType &type); +CustomDataType attribute_data_type_highest_complexity(Span data_types); +AttributeDomain attribute_domain_highest_priority(Span domains); /** * This class offers an indirection for reading an attribute. diff --git a/source/blender/blenkernel/BKE_attribute_math.hh b/source/blender/blenkernel/BKE_attribute_math.hh index b8bb2048d9d..0294a8c09d5 100644 --- a/source/blender/blenkernel/BKE_attribute_math.hh +++ b/source/blender/blenkernel/BKE_attribute_math.hh @@ -14,9 +14,11 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#include "BLI_array.hh" #include "BLI_color.hh" #include "BLI_float2.hh" #include "BLI_float3.hh" + #include "DNA_customdata_types.h" namespace blender::attribute_math { @@ -52,7 +54,12 @@ void convert_to_static_type(const CustomDataType data_type, const Func &func) } } -/* Interpolate between three values. */ +/* -------------------------------------------------------------------- */ +/** \name Mix three values of the same type. + * + * This is typically used to interpolate values within a triangle. + * \{ */ + template T mix3(const float3 &weights, const T &v0, const T &v1, const T &v2); template<> inline bool mix3(const float3 &weights, const bool &v0, const bool &v1, const bool &v2) @@ -91,4 +98,159 @@ inline Color4f mix3(const float3 &weights, const Color4f &v0, const Color4f &v1, return result; } +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Mix a dynamic amount of values with weights for many elements. + * + * This section provides an abstraction for "mixers". The abstraction encapsulates details about + * how different types should be mixed. Usually #DefaultMixer should be used to get a mixer for + * a specific type. + * \{ */ + +template class SimpleMixer { + private: + MutableSpan buffer_; + T default_value_; + Array total_weights_; + + public: + /** + * \param buffer: Span where the interpolated values should be stored. + * \param default_value: Output value for an element that has not been affected by a #mix_in. + */ + SimpleMixer(MutableSpan buffer, T default_value = {}) + : buffer_(buffer), default_value_(default_value), total_weights_(buffer.size(), 0.0f) + { + BLI_STATIC_ASSERT(std::is_trivial_v, ""); + memset(buffer_.data(), 0, sizeof(T) * buffer_.size()); + } + + /** + * Mix a #value into the element with the given #index. + */ + void mix_in(const int64_t index, const T &value, const float weight = 1.0f) + { + BLI_assert(weight >= 0.0f); + buffer_[index] += value * weight; + total_weights_[index] += weight; + } + + /** + * Has to be called before the buffer provided in the constructor is used. + */ + void finalize() + { + for (const int64_t i : buffer_.index_range()) { + const float weight = total_weights_[i]; + if (weight > 0.0f) { + buffer_[i] *= 1.0f / weight; + } + else { + buffer_[i] = default_value_; + } + } + } +}; + +/** This mixer accumulates values in a type that is different from the one that is mixed. Some + * types cannot encode the floating point weights in their values (e.g. int and bool). */ +template +class SimpleMixerWithAccumulationType { + private: + struct Item { + /* Store both values together, because they are accessed together. */ + AccumulationT value = {0}; + float weight = 0.0f; + }; + + MutableSpan buffer_; + T default_value_; + Array accumulation_buffer_; + + public: + SimpleMixerWithAccumulationType(MutableSpan buffer, T default_value = {}) + : buffer_(buffer), default_value_(default_value), accumulation_buffer_(buffer.size()) + { + } + + void mix_in(const int64_t index, const T &value, const float weight = 1.0f) + { + const AccumulationT converted_value = static_cast(value); + Item &item = accumulation_buffer_[index]; + item.value += converted_value * weight; + item.weight += weight; + } + + void finalize() + { + for (const int64_t i : buffer_.index_range()) { + const Item &item = accumulation_buffer_[i]; + if (item.weight > 0.0f) { + const float weight_inv = 1.0f / item.weight; + const T converted_value = ConvertToT(item.value * weight_inv); + buffer_[i] = converted_value; + } + else { + buffer_[i] = default_value_; + } + } + } +}; + +class Color4fMixer { + private: + MutableSpan buffer_; + Color4f default_color_; + Array total_weights_; + + public: + Color4fMixer(MutableSpan buffer, Color4f default_color = {0, 0, 0, 1}); + void mix_in(const int64_t index, const Color4f &color, const float weight = 1.0f); + void finalize(); +}; + +template struct DefaultMixerStruct { + /* Use void by default. This can be check for in `if constexpr` statements. */ + using type = void; +}; +template<> struct DefaultMixerStruct { + using type = SimpleMixer; +}; +template<> struct DefaultMixerStruct { + using type = SimpleMixer; +}; +template<> struct DefaultMixerStruct { + using type = SimpleMixer; +}; +template<> struct DefaultMixerStruct { + /* Use a special mixer for colors. Color4f can't be added/multiplied, because this is not + * something one should usually do with colors. */ + using type = Color4fMixer; +}; +template<> struct DefaultMixerStruct { + static int double_to_int(const double &value) + { + return static_cast(value); + } + /* Store interpolated ints in a double temporarily, so that weights are handled correctly. It + * uses double instead of float so that it is accurate for all 32 bit integers. */ + using type = SimpleMixerWithAccumulationType; +}; +template<> struct DefaultMixerStruct { + static bool float_to_bool(const float &value) + { + return value >= 0.5f; + } + /* Store interpolated booleans in a float temporary. + * Otherwise information provided by weights is easily rounded away. */ + using type = SimpleMixerWithAccumulationType; +}; + +/* Utility to get a good default mixer for a given type. This is `void` when there is no default + * mixer for the given type. */ +template using DefaultMixer = typename DefaultMixerStruct::type; + +/** \} */ + } // namespace blender::attribute_math diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index 6b76e69a7a6..17eb6e19292 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -39,7 +39,7 @@ extern "C" { /* Blender file format version. */ #define BLENDER_FILE_VERSION BLENDER_VERSION -#define BLENDER_FILE_SUBVERSION 5 +#define BLENDER_FILE_SUBVERSION 9 /* Minimum Blender version that supports reading file written with the current * version. Older Blender versions will test this and show a warning if the file diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h index e9267955d70..04fcdd6ed6f 100644 --- a/source/blender/blenkernel/BKE_cloth.h +++ b/source/blender/blenkernel/BKE_cloth.h @@ -131,13 +131,13 @@ typedef struct ClothVertex { * The definition of a spring. */ typedef struct ClothSpring { - int ij; /* Pij from the paper, one end of the spring. */ - int kl; /* Pkl from the paper, one end of the spring. */ + int ij; /* `Pij` from the paper, one end of the spring. */ + int kl; /* `Pkl` from the paper, one end of the spring. */ int mn; /* For hair springs: third vertex index; For bending springs: edge index; */ int *pa; /* Array of vert indices for poly a (for bending springs). */ int *pb; /* Array of vert indices for poly b (for bending springs). */ - int la; /* Length of *pa. */ - int lb; /* Length of *pb. */ + int la; /* Length of `*pa`. */ + int lb; /* Length of `*pb`. */ float restlen; /* The original length of the spring. */ float restang; /* The original angle of the bending springs. */ int type; /* Types defined in BKE_cloth.h ("springType"). */ @@ -208,7 +208,7 @@ typedef enum { /* SPRING FLAGS */ typedef enum { CLOTH_SPRING_FLAG_DEACTIVATE = (1 << 1), - CLOTH_SPRING_FLAG_NEEDED = (1 << 2), // springs has values to be applied + CLOTH_SPRING_FLAG_NEEDED = (1 << 2), /* Springs has values to be applied. */ } CLOTH_SPRINGS_FLAGS; ///////////////////////////////////////////////// diff --git a/source/blender/blenkernel/BKE_collection.h b/source/blender/blenkernel/BKE_collection.h index c693c2d3e88..6528c499146 100644 --- a/source/blender/blenkernel/BKE_collection.h +++ b/source/blender/blenkernel/BKE_collection.h @@ -79,8 +79,6 @@ struct Collection *BKE_collection_duplicate(struct Main *bmain, /* Master Collection for Scene */ struct Collection *BKE_collection_master_add(void); -struct Scene *BKE_collection_master_scene_search(const struct Main *bmain, - const struct Collection *master_collection); /* Collection Objects */ diff --git a/source/blender/blenkernel/BKE_cryptomatte.h b/source/blender/blenkernel/BKE_cryptomatte.h index eb2de96a745..1b1c4deeb8a 100644 --- a/source/blender/blenkernel/BKE_cryptomatte.h +++ b/source/blender/blenkernel/BKE_cryptomatte.h @@ -31,14 +31,13 @@ extern "C" { #endif struct CryptomatteSession; -struct Material; struct ID; struct Main; +struct Material; struct Object; struct RenderResult; struct CryptomatteSession *BKE_cryptomatte_init(void); -void BKE_cryptomatte_finish(struct CryptomatteSession *session); void BKE_cryptomatte_free(struct CryptomatteSession *session); uint32_t BKE_cryptomatte_hash(const char *name, int name_len); @@ -51,8 +50,7 @@ uint32_t BKE_cryptomatte_asset_hash(struct CryptomatteSession *session, float BKE_cryptomatte_hash_to_float(uint32_t cryptomatte_hash); char *BKE_cryptomatte_entries_to_matte_id(struct NodeCryptomatte *node_storage); -void BKE_cryptomatte_matte_id_to_entries(const struct Main *bmain, - struct NodeCryptomatte *node_storage, +void BKE_cryptomatte_matte_id_to_entries(struct NodeCryptomatte *node_storage, const char *matte_id); void BKE_cryptomatte_store_metadata(struct CryptomatteSession *session, diff --git a/source/blender/blenkernel/BKE_cryptomatte.hh b/source/blender/blenkernel/BKE_cryptomatte.hh index 4631bb2616e..c1da0339359 100644 --- a/source/blender/blenkernel/BKE_cryptomatte.hh +++ b/source/blender/blenkernel/BKE_cryptomatte.hh @@ -23,11 +23,15 @@ #pragma once +#include #include +#include "BLI_map.hh" #include "BLI_string_ref.hh" -namespace blender { +struct ID; + +namespace blender::bke::cryptomatte { /* Format to a cryptomatte meta data key. * @@ -56,4 +60,30 @@ std::string BKE_cryptomatte_meta_data_key(const StringRef layer_name, */ StringRef BKE_cryptomatte_extract_layer_name(const StringRef render_pass_name); -} // namespace blender +struct CryptomatteHash { + uint32_t hash; + + CryptomatteHash(uint32_t hash); + CryptomatteHash(const char *name, const int name_len); + static CryptomatteHash from_hex_encoded(blender::StringRef hex_encoded); + + std::string hex_encoded() const; + float float_encoded() const; +}; + +struct CryptomatteLayer { + blender::Map hashes; + +#ifdef WITH_CXX_GUARDEDALLOC + MEM_CXX_CLASS_ALLOC_FUNCS("cryptomatte:CryptomatteLayer") +#endif + + static std::unique_ptr read_from_manifest(blender::StringRefNull manifest); + uint32_t add_ID(const struct ID &id); + void add_hash(blender::StringRef name, CryptomatteHash cryptomatte_hash); + std::string manifest(); + + std::optional operator[](float encoded_hash) const; +}; + +} // namespace blender::bke::cryptomatte diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h index 881b93fe709..660e7c08062 100644 --- a/source/blender/blenkernel/BKE_curve.h +++ b/source/blender/blenkernel/BKE_curve.h @@ -338,6 +338,18 @@ void BKE_curve_deform_co(const struct Object *ob_curve, /** \} */ +/* curve_convert.c */ + +/* Create a new curve from the given object at its current state. This only works for curve and + * text objects, otherwise NULL is returned. + * + * If apply_modifiers is true and the object is a curve one, then spline deform modifiers are + * applied on the control points of the splines. + */ +struct Curve *BKE_curve_new_from_object(struct Object *object, + struct Depsgraph *depsgraph, + bool apply_modifiers); + #ifdef __cplusplus } #endif diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h index 8ac7b625805..b31f004628d 100644 --- a/source/blender/blenkernel/BKE_customdata.h +++ b/source/blender/blenkernel/BKE_customdata.h @@ -255,6 +255,13 @@ void CustomData_copy_data(const struct CustomData *source, int source_index, int dest_index, int count); +void CustomData_copy_data_layer(const CustomData *source, + CustomData *dest, + int src_layer_index, + int dst_layer_index, + int src_index, + int dst_index, + int count); void CustomData_copy_data_named(const struct CustomData *source, struct CustomData *dest, int source_index, @@ -427,6 +434,7 @@ int CustomData_sizeof(int type); /* get the name of a layer type */ const char *CustomData_layertype_name(int type); bool CustomData_layertype_is_singleton(int type); +bool CustomData_layertype_is_dynamic(int type); int CustomData_layertype_layers_max(const int type); /* make sure the name of layer at index is unique */ diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h index b2502031029..05e60d38487 100644 --- a/source/blender/blenkernel/BKE_displist.h +++ b/source/blender/blenkernel/BKE_displist.h @@ -112,11 +112,18 @@ void BKE_displist_make_mball_forRender(struct Depsgraph *depsgraph, struct Object *ob, struct ListBase *dispbase); +bool BKE_curve_calc_modifiers_pre(struct Depsgraph *depsgraph, + struct Scene *scene, + struct Object *ob, + struct ListBase *source_nurb, + struct ListBase *target_nurb, + const bool for_render); + bool BKE_displist_surfindex_get(DispList *dl, int a, int *b, int *p1, int *p2, int *p3, int *p4); -void BKE_displist_fill(struct ListBase *dispbase, +void BKE_displist_fill(const struct ListBase *dispbase, struct ListBase *to, const float normal_proj[3], - const bool flipnormal); + const bool flip_normal); float BKE_displist_calc_taper( struct Depsgraph *depsgraph, struct Scene *scene, struct Object *taperobj, int cur, int tot); diff --git a/source/blender/blenkernel/BKE_geometry_set.h b/source/blender/blenkernel/BKE_geometry_set.h index 27ac6d98688..ac42674654f 100644 --- a/source/blender/blenkernel/BKE_geometry_set.h +++ b/source/blender/blenkernel/BKE_geometry_set.h @@ -47,7 +47,7 @@ typedef struct InstancedData { int BKE_geometry_set_instances(const struct GeometrySet *geometry_set, float (**r_transforms)[4][4], - int **r_ids, + const int **r_almost_unique_ids, struct InstancedData **r_instanced_data); #ifdef __cplusplus diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh index 2bed1a36ed7..ad01814ce82 100644 --- a/source/blender/blenkernel/BKE_geometry_set.hh +++ b/source/blender/blenkernel/BKE_geometry_set.hh @@ -25,6 +25,7 @@ #include "BLI_float3.hh" #include "BLI_float4x4.hh" +#include "BLI_function_ref.hh" #include "BLI_hash.hh" #include "BLI_map.hh" #include "BLI_set.hh" @@ -68,6 +69,10 @@ template<> struct DefaultHash { }; } // namespace blender +namespace blender::bke { +class ComponentAttributeProviders; +} + class GeometryComponent; /** @@ -124,6 +129,20 @@ class OutputAttributePtr { void apply_span_and_save(); }; +/** + * Contains information about an attribute in a geometry component. + * More information can be added in the future. E.g. whether the attribute is builtin and how it is + * stored (uv map, vertex group, ...). + */ +struct AttributeMetaData { + AttributeDomain domain; + CustomDataType data_type; +}; + +/* Returns false when the iteration should be stopped. */ +using AttributeForeachCallback = blender::FunctionRef; + /** * This is the base class for specialized geometry component types. */ @@ -152,40 +171,37 @@ class GeometryComponent { bool attribute_exists(const blender::StringRef attribute_name) const; /* Returns true when the geometry component supports this attribute domain. */ - virtual bool attribute_domain_supported(const AttributeDomain domain) const; - /* Returns true when the given data type is supported in the given domain. */ - virtual bool attribute_domain_with_type_supported(const AttributeDomain domain, - const CustomDataType data_type) const; + bool attribute_domain_supported(const AttributeDomain domain) const; /* Can only be used with supported domain types. */ virtual int attribute_domain_size(const AttributeDomain domain) const; - /* Attributes with these names cannot be created or removed via this api. */ - virtual bool attribute_is_builtin(const blender::StringRef attribute_name) const; /* Get read-only access to the highest priority attribute with the given name. * Returns null if the attribute does not exist. */ - virtual blender::bke::ReadAttributePtr attribute_try_get_for_read( + blender::bke::ReadAttributePtr attribute_try_get_for_read( const blender::StringRef attribute_name) const; /* Get read and write access to the highest priority attribute with the given name. * Returns null if the attribute does not exist. */ - virtual blender::bke::WriteAttributePtr attribute_try_get_for_write( + blender::bke::WriteAttributePtr attribute_try_get_for_write( const blender::StringRef attribute_name); /* Get a read-only attribute for the domain based on the given attribute. This can be used to * interpolate from one domain to another. * Returns null if the interpolation is not implemented. */ virtual blender::bke::ReadAttributePtr attribute_try_adapt_domain( - blender::bke::ReadAttributePtr attribute, const AttributeDomain domain) const; + blender::bke::ReadAttributePtr attribute, const AttributeDomain new_domain) const; /* Returns true when the attribute has been deleted. */ - virtual bool attribute_try_delete(const blender::StringRef attribute_name); + bool attribute_try_delete(const blender::StringRef attribute_name); /* Returns true when the attribute has been created. */ - virtual bool attribute_try_create(const blender::StringRef attribute_name, - const AttributeDomain domain, - const CustomDataType data_type); + bool attribute_try_create(const blender::StringRef attribute_name, + const AttributeDomain domain, + const CustomDataType data_type); + + blender::Set attribute_names() const; + void attribute_foreach(const AttributeForeachCallback callback) const; - virtual blender::Set attribute_names() const; virtual bool is_empty() const; /* Get a read-only attribute for the given domain and data type. @@ -257,6 +273,9 @@ class GeometryComponent { const AttributeDomain domain, const CustomDataType data_type, const void *default_value = nullptr); + + private: + virtual const blender::bke::ComponentAttributeProviders *get_attribute_providers() const; }; template @@ -306,6 +325,8 @@ struct GeometrySet { void add(const GeometryComponent &component); + blender::Vector get_components_for_read() const; + void compute_boundbox_without_instances(blender::float3 *r_min, blender::float3 *r_max) const; friend std::ostream &operator<<(std::ostream &stream, const GeometrySet &geometry_set); @@ -359,30 +380,22 @@ class MeshComponent : public GeometryComponent { Mesh *release(); void copy_vertex_group_names_from_object(const struct Object &object); + const blender::Map &vertex_group_names() const; + blender::Map &vertex_group_names(); const Mesh *get_for_read() const; Mesh *get_for_write(); - bool attribute_domain_supported(const AttributeDomain domain) const final; - bool attribute_domain_with_type_supported(const AttributeDomain domain, - const CustomDataType data_type) const final; int attribute_domain_size(const AttributeDomain domain) const final; - bool attribute_is_builtin(const blender::StringRef attribute_name) const final; + blender::bke::ReadAttributePtr attribute_try_adapt_domain( + blender::bke::ReadAttributePtr attribute, const AttributeDomain new_domain) const final; - blender::bke::ReadAttributePtr attribute_try_get_for_read( - const blender::StringRef attribute_name) const final; - blender::bke::WriteAttributePtr attribute_try_get_for_write( - const blender::StringRef attribute_name) final; - - bool attribute_try_delete(const blender::StringRef attribute_name) final; - bool attribute_try_create(const blender::StringRef attribute_name, - const AttributeDomain domain, - const CustomDataType data_type) final; - - blender::Set attribute_names() const final; bool is_empty() const final; static constexpr inline GeometryComponentType static_type = GeometryComponentType::Mesh; + + private: + const blender::bke::ComponentAttributeProviders *get_attribute_providers() const final; }; /** A geometry component that stores a point cloud. */ @@ -405,26 +418,14 @@ class PointCloudComponent : public GeometryComponent { const PointCloud *get_for_read() const; PointCloud *get_for_write(); - bool attribute_domain_supported(const AttributeDomain domain) const final; - bool attribute_domain_with_type_supported(const AttributeDomain domain, - const CustomDataType data_type) const final; int attribute_domain_size(const AttributeDomain domain) const final; - bool attribute_is_builtin(const blender::StringRef attribute_name) const final; - blender::bke::ReadAttributePtr attribute_try_get_for_read( - const blender::StringRef attribute_name) const final; - blender::bke::WriteAttributePtr attribute_try_get_for_write( - const blender::StringRef attribute_name) final; - - bool attribute_try_delete(const blender::StringRef attribute_name) final; - bool attribute_try_create(const blender::StringRef attribute_name, - const AttributeDomain domain, - const CustomDataType data_type) final; - - blender::Set attribute_names() const final; bool is_empty() const final; static constexpr inline GeometryComponentType static_type = GeometryComponentType::PointCloud; + + private: + const blender::bke::ComponentAttributeProviders *get_attribute_providers() const final; }; /** A geometry component that stores instances. */ @@ -434,6 +435,13 @@ class InstancesComponent : public GeometryComponent { blender::Vector ids_; blender::Vector instanced_data_; + /* These almost unique ids are generated based on `ids_`, which might not contain unique ids at + * all. They are *almost* unique, because under certain very unlikely circumstances, they are not + * unique. Code using these ids should not crash when they are not unique but can generally + * expect them to be unique. */ + mutable std::mutex almost_unique_ids_mutex_; + mutable blender::Array almost_unique_ids_; + public: InstancesComponent(); ~InstancesComponent() = default; @@ -450,6 +458,8 @@ class InstancesComponent : public GeometryComponent { blender::MutableSpan transforms(); int instances_amount() const; + blender::Span almost_unique_ids() const; + bool is_empty() const final; static constexpr inline GeometryComponentType static_type = GeometryComponentType::Instances; diff --git a/source/blender/blenkernel/BKE_geometry_set_instances.hh b/source/blender/blenkernel/BKE_geometry_set_instances.hh new file mode 100644 index 00000000000..16c28e32e3c --- /dev/null +++ b/source/blender/blenkernel/BKE_geometry_set_instances.hh @@ -0,0 +1,62 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include "BKE_geometry_set.hh" + +namespace blender::bke { + +/** + * Used to keep track of a group of instances using the same geometry data. + */ +struct GeometryInstanceGroup { + /** + * The geometry set instanced on each of the transforms. The components are not necessarily + * owned here. For example, they may be owned by the instanced object. This cannot be a + * reference because not all instanced data will necessarily have a #geometry_set_eval. + */ + GeometrySet geometry_set; + + /** + * As an optimization to avoid copying, the same geometry set can be associated with multiple + * instances. Each instance is stored as a transform matrix here. Again, these must be owned + * because they may be transformed from the original data. TODO: Validate that last statement. + */ + Vector transforms; +}; + +Vector geometry_set_gather_instances(const GeometrySet &geometry_set); + +GeometrySet geometry_set_realize_mesh_for_modifier(const GeometrySet &geometry_set); +GeometrySet geometry_set_realize_instances(const GeometrySet &geometry_set); + +struct AttributeKind { + CustomDataType data_type; + AttributeDomain domain; +}; + +/** + * Add information about all the attributes on every component of the type. The resulting info + * will contain the highest complexity data type and the highest priority domain among every + * attribute with the given name on all of the input components. + */ +void gather_attribute_info(Map &attributes, + Span component_types, + Span set_groups, + const Set &ignored_attributes); + +} // namespace blender::bke diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h index b7fad9c891a..5cfdcf241d1 100644 --- a/source/blender/blenkernel/BKE_gpencil.h +++ b/source/blender/blenkernel/BKE_gpencil.h @@ -101,8 +101,10 @@ void BKE_gpencil_tag(struct bGPdata *gpd); void BKE_gpencil_batch_cache_dirty_tag(struct bGPdata *gpd); void BKE_gpencil_batch_cache_free(struct bGPdata *gpd); -void BKE_gpencil_stroke_sync_selection(struct bGPDstroke *gps); -void BKE_gpencil_curve_sync_selection(struct bGPDstroke *gps); +void BKE_gpencil_stroke_sync_selection(struct bGPdata *gpd, struct bGPDstroke *gps); +void BKE_gpencil_curve_sync_selection(struct bGPdata *gpd, struct bGPDstroke *gps); +void BKE_gpencil_stroke_select_index_set(struct bGPdata *gpd, struct bGPDstroke *gps); +void BKE_gpencil_stroke_select_index_reset(struct bGPDstroke *gps); struct bGPDframe *BKE_gpencil_frame_addnew(struct bGPDlayer *gpl, int cframe); struct bGPDframe *BKE_gpencil_frame_addcopy(struct bGPDlayer *gpl, int cframe); @@ -115,6 +117,8 @@ struct bGPDlayer *BKE_gpencil_layer_duplicate(const struct bGPDlayer *gpl_src, const bool dup_frames, const bool dup_strokes); void BKE_gpencil_frame_copy_strokes(struct bGPDframe *gpf_src, struct bGPDframe *gpf_dst); +void BKE_gpencil_frame_selected_hash(struct bGPdata *gpd, struct GHash *r_list); + struct bGPDcurve *BKE_gpencil_stroke_curve_duplicate(struct bGPDcurve *gpc_src); struct bGPDstroke *BKE_gpencil_stroke_duplicate(struct bGPDstroke *gps_src, const bool dup_points, diff --git a/source/blender/blenkernel/BKE_gpencil_curve.h b/source/blender/blenkernel/BKE_gpencil_curve.h index 2d42bb36949..9cbe67af9c1 100644 --- a/source/blender/blenkernel/BKE_gpencil_curve.h +++ b/source/blender/blenkernel/BKE_gpencil_curve.h @@ -50,8 +50,12 @@ struct bGPDcurve *BKE_gpencil_stroke_editcurve_generate(struct bGPDstroke *gps, void BKE_gpencil_stroke_editcurve_update(struct bGPdata *gpd, struct bGPDlayer *gpl, struct bGPDstroke *gps); -void BKE_gpencil_editcurve_stroke_sync_selection(struct bGPDstroke *gps, struct bGPDcurve *gpc); -void BKE_gpencil_stroke_editcurve_sync_selection(struct bGPDstroke *gps, struct bGPDcurve *gpc); +void BKE_gpencil_editcurve_stroke_sync_selection(struct bGPdata *gpd, + struct bGPDstroke *gps, + struct bGPDcurve *gpc); +void BKE_gpencil_stroke_editcurve_sync_selection(struct bGPdata *gpd, + struct bGPDstroke *gps, + struct bGPDcurve *gpc); void BKE_gpencil_strokes_selected_update_editcurve(struct bGPdata *gpd); void BKE_gpencil_strokes_selected_sync_selection_editcurve(struct bGPdata *gpd); void BKE_gpencil_stroke_update_geometry_from_editcurve(struct bGPDstroke *gps, diff --git a/source/blender/blenkernel/BKE_gpencil_geom.h b/source/blender/blenkernel/BKE_gpencil_geom.h index 1c86df73d3c..89a794f2df3 100644 --- a/source/blender/blenkernel/BKE_gpencil_geom.h +++ b/source/blender/blenkernel/BKE_gpencil_geom.h @@ -149,6 +149,11 @@ void BKE_gpencil_stroke_join(struct bGPDstroke *gps_a, struct bGPDstroke *gps_b, const bool leave_gaps, const bool fit_thickness); +void BKE_gpencil_stroke_copy_to_keyframes(struct bGPdata *gpd, + struct bGPDlayer *gpl, + struct bGPDframe *gpf, + struct bGPDstroke *gps, + const bool tail); bool BKE_gpencil_convert_mesh(struct Main *bmain, struct Depsgraph *depsgraph, diff --git a/source/blender/blenkernel/BKE_idtype.h b/source/blender/blenkernel/BKE_idtype.h index edfc96f3059..4578f1c3ca5 100644 --- a/source/blender/blenkernel/BKE_idtype.h +++ b/source/blender/blenkernel/BKE_idtype.h @@ -95,6 +95,8 @@ typedef void (*IDTypeForeachCacheFunction)(struct ID *id, IDTypeForeachCacheFunctionCallback function_callback, void *user_data); +typedef struct ID *(*IDTypeEmbeddedOwnerGetFunction)(struct Main *bmain, struct ID *id); + typedef void (*IDTypeBlendWriteFunction)(struct BlendWriter *writer, struct ID *id, const void *id_address); @@ -181,6 +183,11 @@ typedef struct IDTypeInfo { */ IDTypeForeachCacheFunction foreach_cache; + /** + * For embedded IDs, return their owner ID. + */ + IDTypeEmbeddedOwnerGetFunction owner_get; + /* ********** Callbacks for reading and writing .blend files. ********** */ /** diff --git a/source/blender/blenkernel/BKE_lib_query.h b/source/blender/blenkernel/BKE_lib_query.h index bdda5bb0372..f064d03261d 100644 --- a/source/blender/blenkernel/BKE_lib_query.h +++ b/source/blender/blenkernel/BKE_lib_query.h @@ -175,6 +175,13 @@ void BKE_library_ID_test_usages(struct Main *bmain, bool *is_used_local, bool *is_used_linked); +void BKE_lib_query_unused_ids_tag(struct Main *bmain, + const int tag, + const bool do_local_ids, + const bool do_linked_ids, + const bool do_tag_recursive, + int *r_num_tagged); + void BKE_library_unused_linked_data_set_tag(struct Main *bmain, const bool do_init_tag); void BKE_library_indirectly_used_data_tag_clear(struct Main *bmain); diff --git a/source/blender/blenkernel/BKE_mesh_boolean_convert.h b/source/blender/blenkernel/BKE_mesh_boolean_convert.h new file mode 100644 index 00000000000..be5cbb305fa --- /dev/null +++ b/source/blender/blenkernel/BKE_mesh_boolean_convert.h @@ -0,0 +1,38 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2019 Blender Foundation. + * All rights reserved. + */ + +#pragma once + +/** \file + * \ingroup bke + */ + +#ifdef __cplusplus +extern "C" { +#endif + +Mesh *BKE_mesh_boolean(const Mesh **meshes, + const float (*obmats[])[4][4], + const int meshes_len, + const bool use_self, + const int boolean_mode); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h index 32b74d161b2..ab2ecbe2507 100644 --- a/source/blender/blenkernel/BKE_modifier.h +++ b/source/blender/blenkernel/BKE_modifier.h @@ -453,7 +453,7 @@ void BKE_modifiers_foreach_tex_link(struct Object *ob, TexWalkFunc walk, void *u struct ModifierData *BKE_modifiers_findby_type(struct Object *ob, ModifierType type); struct ModifierData *BKE_modifiers_findby_name(struct Object *ob, const char *name); void BKE_modifiers_clear_errors(struct Object *ob); -int BKE_modifiers_get_cage_index(struct Scene *scene, +int BKE_modifiers_get_cage_index(const struct Scene *scene, struct Object *ob, int *r_lastPossibleCageIndex, bool is_virtual); @@ -469,8 +469,8 @@ struct Object *BKE_modifiers_is_deformed_by_lattice(struct Object *ob); struct Object *BKE_modifiers_is_deformed_by_curve(struct Object *ob); bool BKE_modifiers_uses_multires(struct Object *ob); bool BKE_modifiers_uses_armature(struct Object *ob, struct bArmature *arm); -bool BKE_modifiers_uses_subsurf_facedots(struct Scene *scene, struct Object *ob); -bool BKE_modifiers_is_correctable_deformed(struct Scene *scene, struct Object *ob); +bool BKE_modifiers_uses_subsurf_facedots(const struct Scene *scene, struct Object *ob); +bool BKE_modifiers_is_correctable_deformed(const struct Scene *scene, struct Object *ob); void BKE_modifier_free_temporary_data(struct ModifierData *md); typedef struct CDMaskLink { @@ -484,14 +484,14 @@ typedef struct CDMaskLink { * pointed to by md for correct evaluation, assuming the data indicated by * final_datamask is required at the end of the stack. */ -struct CDMaskLink *BKE_modifier_calc_data_masks(struct Scene *scene, +struct CDMaskLink *BKE_modifier_calc_data_masks(const struct Scene *scene, struct Object *ob, struct ModifierData *md, struct CustomData_MeshMasks *final_datamask, int required_mode, ModifierData *previewmd, const struct CustomData_MeshMasks *previewmask); -struct ModifierData *BKE_modifier_get_last_preview(struct Scene *scene, +struct ModifierData *BKE_modifier_get_last_preview(const struct Scene *scene, struct ModifierData *md, int required_mode); diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index f4f753c4084..d675df6d868 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -442,7 +442,6 @@ struct bNodeTree *ntreeCopyTree(struct Main *bmain, const struct bNodeTree *ntre struct bNodeTree **BKE_ntree_ptr_from_id(struct ID *id); struct bNodeTree *ntreeFromID(struct ID *id); -struct ID *BKE_node_tree_find_owner_ID(struct Main *bmain, struct bNodeTree *ntree); void ntreeFreeLocalNode(struct bNodeTree *ntree, struct bNode *node); void ntreeFreeLocalTree(struct bNodeTree *ntree); @@ -778,7 +777,7 @@ void BKE_node_preview_free(struct bNodePreview *preview); void BKE_node_preview_init_tree(struct bNodeTree *ntree, int xsize, int ysize, - int create_previews); + bool create_previews); void BKE_node_preview_free_tree(struct bNodeTree *ntree); void BKE_node_preview_remove_unused(struct bNodeTree *ntree); void BKE_node_preview_clear(struct bNodePreview *preview); @@ -1370,6 +1369,9 @@ int ntreeTexExecTree(struct bNodeTree *ntree, #define GEO_NODE_IS_VIEWPORT 1024 #define GEO_NODE_ATTRIBUTE_PROXIMITY 1025 #define GEO_NODE_VOLUME_TO_MESH 1026 +#define GEO_NODE_ATTRIBUTE_COMBINE_XYZ 1027 +#define GEO_NODE_ATTRIBUTE_SEPARATE_XYZ 1028 +#define GEO_NODE_SUBDIVISION_SURFACE_SIMPLE 1029 /** \} */ @@ -1385,6 +1387,7 @@ int ntreeTexExecTree(struct bNodeTree *ntree, #define FN_NODE_OBJECT_TRANSFORMS 1205 #define FN_NODE_RANDOM_FLOAT 1206 #define FN_NODE_INPUT_VECTOR 1207 +#define FN_NODE_INPUT_STRING 1208 /** \} */ diff --git a/source/blender/blenkernel/BKE_node_ui_storage.hh b/source/blender/blenkernel/BKE_node_ui_storage.hh new file mode 100644 index 00000000000..231eb11d473 --- /dev/null +++ b/source/blender/blenkernel/BKE_node_ui_storage.hh @@ -0,0 +1,103 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include "BLI_hash.hh" +#include "BLI_map.hh" +#include "BLI_session_uuid.h" +#include "BLI_set.hh" + +#include "DNA_ID.h" +#include "DNA_modifier_types.h" +#include "DNA_session_uuid_types.h" + +struct ModifierData; +struct Object; +struct bNode; +struct bNodeTree; +struct bContext; + +/** + * Contains the context necessary to determine when to display settings for a certain node tree + * that may be used for multiple modifiers and objects. The object name and modifier session UUID + * are used instead of pointers because they are re-allocated between evaluations. + * + * \note This does not yet handle the context of nested node trees. + */ +class NodeTreeEvaluationContext { + private: + std::string object_name_; + SessionUUID modifier_session_uuid_; + + public: + NodeTreeEvaluationContext(const Object &object, const ModifierData &modifier) + { + object_name_ = reinterpret_cast(object).name; + modifier_session_uuid_ = modifier.session_uuid; + } + + uint64_t hash() const + { + const uint64_t hash1 = blender::DefaultHash{}(object_name_); + const uint64_t hash2 = BLI_session_uuid_hash_uint64(&modifier_session_uuid_); + return hash1 ^ (hash2 * 33); /* Copied from DefaultHash for std::pair. */ + } + + bool operator==(const NodeTreeEvaluationContext &other) const + { + return other.object_name_ == object_name_ && + BLI_session_uuid_is_equal(&other.modifier_session_uuid_, &modifier_session_uuid_); + } +}; + +enum class NodeWarningType { + Error, + Warning, + Info, +}; + +struct NodeWarning { + NodeWarningType type; + std::string message; +}; + +struct NodeUIStorage { + blender::Vector warnings; + blender::Set attribute_name_hints; +}; + +struct NodeTreeUIStorage { + blender::Map> context_map; +}; + +const NodeUIStorage *BKE_node_tree_ui_storage_get_from_context(const bContext *C, + const bNodeTree &ntree, + const bNode &node); + +void BKE_nodetree_ui_storage_free_for_context(bNodeTree &ntree, + const NodeTreeEvaluationContext &context); + +void BKE_nodetree_error_message_add(bNodeTree &ntree, + const NodeTreeEvaluationContext &context, + const bNode &node, + const NodeWarningType type, + std::string message); + +void BKE_nodetree_attribute_hint_add(bNodeTree &ntree, + const NodeTreeEvaluationContext &context, + const bNode &node, + const blender::StringRef attribute_name); diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index a5ac4d5c8fc..d57469e11c0 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -34,6 +34,7 @@ extern "C" { struct Base; struct BoundBox; +struct Curve; struct Depsgraph; struct GpencilModifierData; struct HookGpencilModifierData; @@ -426,6 +427,21 @@ struct Mesh *BKE_object_to_mesh(struct Depsgraph *depsgraph, void BKE_object_to_mesh_clear(struct Object *object); +/* This is an utility function for Python's object.to_curve(). + * The result is owned by the object. + * + * The curve will be freed when object is re-evaluated or is destroyed. It is possible to force + * clear memory used by this curve by calling BKE_object_to_curve_clear(). + * + * If apply_modifiers is true and the object is a curve one, then spline deform modifiers are + * applied on the curve control points. + */ +struct Curve *BKE_object_to_curve(struct Object *object, + struct Depsgraph *depsgraph, + bool apply_modifiers); + +void BKE_object_to_curve_clear(struct Object *object); + void BKE_object_check_uuids_unique_and_report(const struct Object *object); void BKE_object_modifiers_lib_link_common(void *userData, diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h index 2fc0caf1a2c..085851ba5e6 100644 --- a/source/blender/blenkernel/BKE_screen.h +++ b/source/blender/blenkernel/BKE_screen.h @@ -240,6 +240,7 @@ typedef struct PanelType { char idname[BKE_ST_MAXNAME]; /* unique name */ char label[BKE_ST_MAXNAME]; /* for panel header */ + char *description; /* for panel tooltip */ char translation_context[BKE_ST_MAXNAME]; char context[BKE_ST_MAXNAME]; /* for buttons window */ char category[BKE_ST_MAXNAME]; /* for category tabs */ @@ -403,7 +404,7 @@ void BKE_spacetypes_free(void); /* only for quitting blender */ /* spacedata */ void BKE_spacedata_freelist(ListBase *lb); void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2); -void BKE_spacedata_draw_locks(int set); +void BKE_spacedata_draw_locks(bool set); struct ARegion *BKE_spacedata_find_region_type(const struct SpaceLink *slink, const struct ScrArea *area, diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index 3f22612652c..1e7986eedd9 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -81,6 +81,7 @@ set(SRC intern/asset.cc intern/attribute.c intern/attribute_access.cc + intern/attribute_math.cc intern/autoexec.c intern/blender.c intern/blender_copybuffer.c @@ -106,6 +107,7 @@ set(SRC intern/cryptomatte.cc intern/curve.c intern/curve_bevel.c + intern/curve_convert.c intern/curve_decimate.c intern/curve_deform.c intern/curveprofile.c @@ -129,6 +131,7 @@ set(SRC intern/font.c intern/freestyle.c intern/geometry_set.cc + intern/geometry_set_instances.cc intern/gpencil.c intern/gpencil_curve.c intern/gpencil_geom.c @@ -169,6 +172,7 @@ set(SRC intern/mball.c intern/mball_tessellate.c intern/mesh.c + intern/mesh_boolean_convert.cc intern/mesh_convert.c intern/mesh_evaluate.c intern/mesh_fair.cc @@ -198,6 +202,7 @@ set(SRC intern/multires_versioning.c intern/nla.c intern/node.cc + intern/node_ui_storage.cc intern/object.c intern/object_deform.c intern/object_dupli.c @@ -326,6 +331,7 @@ set(SRC BKE_freestyle.h BKE_geometry_set.h BKE_geometry_set.hh + BKE_geometry_set_instances.hh BKE_global.h BKE_gpencil.h BKE_gpencil_curve.h @@ -358,6 +364,7 @@ set(SRC BKE_mball.h BKE_mball_tessellate.h BKE_mesh.h + BKE_mesh_boolean_convert.h BKE_mesh_fair.h BKE_mesh_iterators.h BKE_mesh_mapping.h @@ -723,6 +730,14 @@ if(WITH_TBB) ) endif() +if(WITH_GMP) + add_definitions(-DWITH_GMP) + + list(APPEND INC_SYS + ${GMP_INCLUDE_DIRS} + ) + endif() + # # Warnings as errors, this is too strict! # if(MSVC) # string(APPEND CMAKE_C_FLAGS " /WX") diff --git a/source/blender/blenkernel/intern/DerivedMesh.cc b/source/blender/blenkernel/intern/DerivedMesh.cc index ecc41e3f0df..4aa7cfae009 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.cc +++ b/source/blender/blenkernel/intern/DerivedMesh.cc @@ -51,6 +51,7 @@ #include "BKE_deform.h" #include "BKE_editmesh.h" #include "BKE_geometry_set.hh" +#include "BKE_geometry_set_instances.hh" #include "BKE_key.h" #include "BKE_layer.h" #include "BKE_lib_id.h" @@ -882,6 +883,33 @@ void BKE_mesh_wrapper_deferred_finalize(Mesh *me_eval, BLI_assert(me_eval->runtime.wrapper_type_finalize == 0); } +/** + * Some modifiers don't work on geometry sets directly, but expect a single mesh as input. + * Therefore, we convert data from the geometry set into a single mesh, so that those + * modifiers can work on it as well. + */ +static Mesh *prepare_geometry_set_for_mesh_modifier(Mesh *mesh, GeometrySet &r_geometry_set) +{ + if (!r_geometry_set.has_instances() && !r_geometry_set.has_pointcloud()) { + return mesh; + } + + { + /* Add the mesh to the geometry set. */ + MeshComponent &mesh_component = r_geometry_set.get_component_for_write(); + mesh_component.replace_mesh_but_keep_vertex_group_names(mesh, GeometryOwnershipType::Editable); + } + { + /* Combine mesh and all instances into a single mesh that can be passed to the modifier. */ + GeometrySet new_geometry_set = blender::bke::geometry_set_realize_mesh_for_modifier( + r_geometry_set); + MeshComponent &mesh_component = new_geometry_set.get_component_for_write(); + Mesh *new_mesh = mesh_component.release(); + r_geometry_set = new_geometry_set; + return new_mesh; + } +} + /** * Modifies the given mesh and geometry set. The mesh is not passed as part of the mesh component * in the \a geometry_set input, it is only passed in \a input_mesh and returned in the return @@ -898,7 +926,14 @@ static Mesh *modifier_modify_mesh_and_geometry_set(ModifierData *md, Mesh *mesh_output = nullptr; const ModifierTypeInfo *mti = BKE_modifier_get_info((ModifierType)md->type); if (mti->modifyGeometrySet == nullptr) { - mesh_output = BKE_modifier_modify_mesh(md, &mectx, input_mesh); + Mesh *new_input_mesh = prepare_geometry_set_for_mesh_modifier(input_mesh, geometry_set); + mesh_output = BKE_modifier_modify_mesh(md, &mectx, new_input_mesh); + + /* The caller is responsible for freeing `input_mesh` and `mesh_output`. The intermediate + * `new_input_mesh` has to be freed here. */ + if (!ELEM(new_input_mesh, input_mesh, mesh_output)) { + BKE_id_free(nullptr, new_input_mesh); + } } else { /* For performance reasons, this should be called by the modifier and/or nodes themselves at @@ -1155,6 +1190,14 @@ static void mesh_calc_modifiers(struct Depsgraph *depsgraph, /* No existing verts to deform, need to build them. */ if (!deformed_verts) { if (mesh_final) { + Mesh *mesh_final_new = prepare_geometry_set_for_mesh_modifier(mesh_final, + geometry_set_final); + if (mesh_final_new != mesh_final) { + BLI_assert(mesh_final != mesh_input); + BKE_id_free(nullptr, mesh_final); + mesh_final = mesh_final_new; + } + /* Deforming a mesh, read the vertex locations * out of the mesh and deform them. Once done with this * run of deformers verts will be written back. */ diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c index 94680dc5c0c..06b8bd5f0f2 100644 --- a/source/blender/blenkernel/intern/action.c +++ b/source/blender/blenkernel/intern/action.c @@ -303,6 +303,7 @@ IDTypeInfo IDType_ID_AC = { .make_local = NULL, .foreach_id = action_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = action_blend_write, .blend_read_data = action_blend_read_data, diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index 965dc4e0bec..4d490f8f76a 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -1050,6 +1050,7 @@ static NlaEvalChannelSnapshot *nlaevalchan_snapshot_new(NlaEvalChannel *nec) nec_snapshot->channel = nec; nec_snapshot->length = length; + nlavalidmask_init(&nec_snapshot->blend_domain, length); return nec_snapshot; } @@ -1059,6 +1060,7 @@ static void nlaevalchan_snapshot_free(NlaEvalChannelSnapshot *nec_snapshot) { BLI_assert(!nec_snapshot->is_base); + nlavalidmask_free(&nec_snapshot->blend_domain); MEM_freeN(nec_snapshot); } @@ -1751,14 +1753,22 @@ static void nlasnapshot_from_action(PointerRNA *ptr, continue; } - NlaEvalChannelSnapshot *necs = nlaeval_snapshot_ensure_channel(r_snapshot, nec); if (!nlaevalchan_validate_index_ex(nec, fcu->array_index)) { continue; } + NlaEvalChannelSnapshot *necs = nlaeval_snapshot_ensure_channel(r_snapshot, nec); + float value = evaluate_fcurve(fcu, modified_evaltime); evaluate_value_fmodifiers(&storage, modifiers, fcu, &value, evaltime); necs->values[fcu->array_index] = value; + + if (nec->mix_mode == NEC_MIX_QUATERNION) { + BLI_bitmap_set_all(necs->blend_domain.ptr, true, 4); + } + else { + BLI_BITMAP_ENABLE(necs->blend_domain.ptr, fcu->array_index); + } } } @@ -1863,6 +1873,8 @@ static void nlastrip_evaluate_transition(PointerRNA *ptr, /** Replace \a snapshot2 NULL channels with base or default values so all channels blend. */ nlasnapshot_ensure_channels(channels, &snapshot2); + /** Mark all \a snapshot2 channel's values to blend. */ + nlasnapshot_enable_all_blend_domain(&snapshot2); nlasnapshot_blend( channels, &snapshot1, &snapshot2, NLASTRIP_MODE_REPLACE, nes->strip_time, snapshot); @@ -2471,6 +2483,18 @@ static void animsys_calculate_nla(PointerRNA *ptr, /* ---------------------- */ +void nlasnapshot_enable_all_blend_domain(NlaEvalSnapshot *snapshot) +{ + for (int i = 0; i < snapshot->size; i++) { + NlaEvalChannelSnapshot *necs = nlaeval_snapshot_get(snapshot, i); + if (necs == NULL) { + continue; + } + + BLI_bitmap_set_all(necs->blend_domain.ptr, true, necs->length); + } +} + void nlasnapshot_ensure_channels(NlaEvalData *eval_data, NlaEvalSnapshot *snapshot) { LISTBASE_FOREACH (NlaEvalChannel *, nec, &eval_data->channels) { @@ -2479,7 +2503,12 @@ void nlasnapshot_ensure_channels(NlaEvalData *eval_data, NlaEvalSnapshot *snapsh } /** Blends the \a lower_snapshot with the \a upper_snapshot into \a r_blended_snapshot according - * to the given \a upper_blendmode and \a upper_influence. */ + * to the given \a upper_blendmode and \a upper_influence. + * + * For \a upper_snapshot, blending limited to values in the \a blend_domain. For Replace blendmode, + * this allows the upper snapshot to have a location XYZ channel where only a subset of values are + * blended. + */ void nlasnapshot_blend(NlaEvalData *eval_data, NlaEvalSnapshot *lower_snapshot, NlaEvalSnapshot *upper_snapshot, @@ -2507,19 +2536,30 @@ void nlasnapshot_blend(NlaEvalData *eval_data, NlaEvalChannelSnapshot *result_necs = nlaeval_snapshot_ensure_channel(r_blended_snapshot, nec); + /** Always copy \a lower_snapshot to result, irrelevant of whether \a upper_snapshot has a + * corresponding channel. This only matters when \a lower_snapshot not the same as + * \a r_blended_snapshot. */ + memcpy(result_necs->values, lower_necs->values, length * sizeof(float)); if (upper_necs == NULL || zero_upper_influence) { - memcpy(result_necs->values, lower_necs->values, length * sizeof(float)); continue; } if (upper_blendmode == NLASTRIP_MODE_COMBINE) { const int mix_mode = nec->mix_mode; if (mix_mode == NEC_MIX_QUATERNION) { + if (!BLI_BITMAP_TEST_BOOL(upper_necs->blend_domain.ptr, 0)) { + continue; + } + nla_combine_quaternion( lower_necs->values, upper_necs->values, upper_influence, result_necs->values); } else { for (int j = 0; j < length; j++) { + if (!BLI_BITMAP_TEST_BOOL(upper_necs->blend_domain.ptr, j)) { + continue; + } + result_necs->values[j] = nla_combine_value(mix_mode, nec->base_snapshot.values[j], lower_necs->values[j], @@ -2530,6 +2570,10 @@ void nlasnapshot_blend(NlaEvalData *eval_data, } else { for (int j = 0; j < length; j++) { + if (!BLI_BITMAP_TEST_BOOL(upper_necs->blend_domain.ptr, j)) { + continue; + } + result_necs->values[j] = nla_blend_value( upper_blendmode, lower_necs->values[j], upper_necs->values[j], upper_influence); } diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index b8a0ed087e0..83aab758f86 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -324,6 +324,7 @@ IDTypeInfo IDType_ID_AR = { .make_local = NULL, .foreach_id = armature_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = armature_blend_write, .blend_read_data = armature_blend_read_data, @@ -1891,9 +1892,8 @@ void BKE_armature_mat_pose_to_bone_ex(struct Depsgraph *depsgraph, * bone loc/sca/rot is ignored, scene and frame are not used. */ BKE_pose_where_is_bone(depsgraph, NULL, ob, &work_pchan, 0.0f, false); - /* find the matrix, need to remove the bone transforms first so this is - * calculated as a matrix to set rather than a difference ontop of what's - * already there. */ + /* Find the matrix, need to remove the bone transforms first so this is calculated + * as a matrix to set rather than a difference on top of what's already there. */ unit_m4(outmat); BKE_pchan_apply_mat4(&work_pchan, outmat, false); @@ -1945,7 +1945,7 @@ void BKE_pchan_rot_to_mat3(const bPoseChannel *pchan, float r_mat[3][3]) float quat[4]; /* NOTE: we now don't normalize the stored values anymore, - * since this was kindof evil in some cases but if this proves to be too problematic, + * since this was kind of evil in some cases but if this proves to be too problematic, * switch back to the old system of operating directly on the stored copy. */ normalize_qt_qt(quat, pchan->quat); quat_to_mat3(r_mat, quat); diff --git a/source/blender/blenkernel/intern/asset.cc b/source/blender/blenkernel/intern/asset.cc index 89c3523285d..b5a7f5e37a6 100644 --- a/source/blender/blenkernel/intern/asset.cc +++ b/source/blender/blenkernel/intern/asset.cc @@ -18,7 +18,7 @@ * \ingroup bke */ -#include +#include #include "DNA_ID.h" #include "DNA_asset_types.h" diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc index 85dabe4490c..8974190d0e3 100644 --- a/source/blender/blenkernel/intern/attribute_access.cc +++ b/source/blender/blenkernel/intern/attribute_access.cc @@ -17,6 +17,7 @@ #include #include "BKE_attribute_access.hh" +#include "BKE_attribute_math.hh" #include "BKE_customdata.h" #include "BKE_deform.h" #include "BKE_geometry_set.hh" @@ -323,29 +324,47 @@ template class ArrayReadAttribute final : public ReadAttribute { } }; -template +template class OwnedArrayReadAttribute final : public ReadAttribute { + private: + Array data_; + + public: + OwnedArrayReadAttribute(AttributeDomain domain, Array data) + : ReadAttribute(domain, CPPType::get(), data.size()), data_(std::move(data)) + { + } + + void get_internal(const int64_t index, void *r_value) const override + { + new (r_value) T(data_[index]); + } + + void initialize_span() const override + { + /* The data will not be modified, so this const_cast is fine. */ + array_buffer_ = const_cast(data_.data()); + array_is_temporary_ = false; + } +}; + +template class DerivedArrayWriteAttribute final : public WriteAttribute { private: MutableSpan data_; - GetFuncT get_function_; - SetFuncT set_function_; public: - DerivedArrayWriteAttribute(AttributeDomain domain, - MutableSpan data, - GetFuncT get_function, - SetFuncT set_function) - : WriteAttribute(domain, CPPType::get(), data.size()), - data_(data), - get_function_(std::move(get_function)), - set_function_(std::move(set_function)) + DerivedArrayWriteAttribute(AttributeDomain domain, MutableSpan data) + : WriteAttribute(domain, CPPType::get(), data.size()), data_(data) { } void get_internal(const int64_t index, void *r_value) const override { const StructT &struct_value = data_[index]; - const ElemT value = get_function_(struct_value); + const ElemT value = GetFunc(struct_value); new (r_value) ElemT(value); } @@ -353,28 +372,25 @@ class DerivedArrayWriteAttribute final : public WriteAttribute { { StructT &struct_value = data_[index]; const ElemT &typed_value = *reinterpret_cast(value); - set_function_(struct_value, typed_value); + SetFunc(struct_value, typed_value); } }; -template +template class DerivedArrayReadAttribute final : public ReadAttribute { private: Span data_; - GetFuncT get_function_; public: - DerivedArrayReadAttribute(AttributeDomain domain, Span data, GetFuncT get_function) - : ReadAttribute(domain, CPPType::get(), data.size()), - data_(data), - get_function_(std::move(get_function)) + DerivedArrayReadAttribute(AttributeDomain domain, Span data) + : ReadAttribute(domain, CPPType::get(), data.size()), data_(data) { } void get_internal(const int64_t index, void *r_value) const override { const StructT &struct_value = data_[index]; - const ElemT value = get_function_(struct_value); + const ElemT value = GetFunc(struct_value); new (r_value) ElemT(value); } }; @@ -492,144 +508,1075 @@ CustomDataType cpp_type_to_custom_data_type(const blender::fn::CPPType &type) return static_cast(-1); } -} // namespace blender::bke - -/* -------------------------------------------------------------------- */ -/** \name Utilities for Accessing Attributes - * \{ */ - -static ReadAttributePtr read_attribute_from_custom_data(const CustomData &custom_data, - const int size, - const StringRef attribute_name, - const AttributeDomain domain) +static int attribute_data_type_complexity(const CustomDataType data_type) { - using namespace blender; - using namespace blender::bke; - for (const CustomDataLayer &layer : Span(custom_data.layers, custom_data.totlayer)) { - if (layer.name != nullptr && layer.name == attribute_name) { - switch (layer.type) { - case CD_PROP_FLOAT: - return std::make_unique>( - domain, Span(static_cast(layer.data), size)); - case CD_PROP_FLOAT2: - return std::make_unique>( - domain, Span(static_cast(layer.data), size)); - case CD_PROP_FLOAT3: - return std::make_unique>( - domain, Span(static_cast(layer.data), size)); - case CD_PROP_INT32: - return std::make_unique>( - domain, Span(static_cast(layer.data), size)); - case CD_PROP_COLOR: - return std::make_unique>( - domain, Span(static_cast(layer.data), size)); - case CD_PROP_BOOL: - return std::make_unique>( - domain, Span(static_cast(layer.data), size)); - case CD_MLOOPUV: - auto get_uv = [](const MLoopUV &uv) { return float2(uv.uv); }; - return std::make_unique>( - domain, Span(static_cast(layer.data), size), get_uv); - } - } + switch (data_type) { + case CD_PROP_BOOL: + return 0; + case CD_PROP_INT32: + return 1; + case CD_PROP_FLOAT: + return 2; + case CD_PROP_FLOAT2: + return 3; + case CD_PROP_FLOAT3: + return 4; + case CD_PROP_COLOR: + return 5; +#if 0 /* These attribute types are not supported yet. */ + case CD_MLOOPCOL: + return 3; + case CD_PROP_STRING: + return 6; +#endif + default: + /* Only accept "generic" custom data types used by the attribute system. */ + BLI_assert(false); + return 0; } - return {}; } -static WriteAttributePtr write_attribute_from_custom_data( - CustomData &custom_data, - const int size, - const StringRef attribute_name, - const AttributeDomain domain, - const std::function &update_customdata_pointers) +CustomDataType attribute_data_type_highest_complexity(Span data_types) { + int highest_complexity = INT_MIN; + CustomDataType most_complex_type = CD_PROP_COLOR; - using namespace blender; - using namespace blender::bke; - for (const CustomDataLayer &layer : Span(custom_data.layers, custom_data.totlayer)) { - if (layer.name != nullptr && layer.name == attribute_name) { - const void *data_before = layer.data; - /* The data layer might be shared with someone else. Since the caller wants to modify it, we - * copy it first. */ - CustomData_duplicate_referenced_layer_named(&custom_data, layer.type, layer.name, size); - if (data_before != layer.data) { - update_customdata_pointers(); - } - switch (layer.type) { - case CD_PROP_FLOAT: - return std::make_unique>( - domain, MutableSpan(static_cast(layer.data), size)); - case CD_PROP_FLOAT2: - return std::make_unique>( - domain, MutableSpan(static_cast(layer.data), size)); - case CD_PROP_FLOAT3: - return std::make_unique>( - domain, MutableSpan(static_cast(layer.data), size)); - case CD_PROP_INT32: - return std::make_unique>( - domain, MutableSpan(static_cast(layer.data), size)); - case CD_PROP_COLOR: - return std::make_unique>( - domain, MutableSpan(static_cast(layer.data), size)); - case CD_PROP_BOOL: - return std::make_unique>( - domain, MutableSpan(static_cast(layer.data), size)); - case CD_MLOOPUV: - auto get_uv = [](const MLoopUV &uv) { return float2(uv.uv); }; - auto set_uv = [](MLoopUV &uv, const float2 value) { copy_v2_v2(uv.uv, value); }; - return std::make_unique< - DerivedArrayWriteAttribute>( - domain, MutableSpan(static_cast(layer.data), size), get_uv, set_uv); - } + for (const CustomDataType data_type : data_types) { + const int complexity = attribute_data_type_complexity(data_type); + if (complexity > highest_complexity) { + highest_complexity = complexity; + most_complex_type = data_type; } } - return {}; + + return most_complex_type; } -/* Returns true when the layer was found and is deleted. */ -static bool delete_named_custom_data_layer(CustomData &custom_data, - const StringRef attribute_name, - const int size) +/** + * \note Generally the order should mirror the order of the domains + * established in each component's ComponentAttributeProviders. + */ +static int attribute_domain_priority(const AttributeDomain domain) { - for (const int index : blender::IndexRange(custom_data.totlayer)) { - const CustomDataLayer &layer = custom_data.layers[index]; - if (layer.name == attribute_name) { - CustomData_free_layer(&custom_data, layer.type, size, index); + switch (domain) { +#if 0 + case ATTR_DOMAIN_CURVE: + return 0; +#endif + case ATTR_DOMAIN_POLYGON: + return 1; + case ATTR_DOMAIN_EDGE: + return 2; + case ATTR_DOMAIN_POINT: + return 3; + case ATTR_DOMAIN_CORNER: + return 4; + default: + /* Domain not supported in nodes yet. */ + BLI_assert(false); + return 0; + } +} + +/** + * Domains with a higher "information density" have a higher priority, in order + * to choose a domain that will not lose data through domain conversion. + */ +AttributeDomain attribute_domain_highest_priority(Span domains) +{ + int highest_priority = INT_MIN; + AttributeDomain highest_priority_domain = ATTR_DOMAIN_CORNER; + + for (const AttributeDomain domain : domains) { + const int priority = attribute_domain_priority(domain); + if (priority > highest_priority) { + highest_priority = priority; + highest_priority_domain = domain; + } + } + + return highest_priority_domain; +} + +/** + * A #BuiltinAttributeProvider is responsible for exactly one attribute on a geometry component. + * The attribute is identified by its name and has a fixed domain and type. Builtin attributes do + * not follow the same loose rules as other attributes, because they are mapped to internal + * "legacy" data structures. For example, some builtin attributes cannot be deleted. */ +class BuiltinAttributeProvider { + public: + /* Some utility enums to avoid hard to read booleans in function calls. */ + enum CreatableEnum { + Creatable, + NonCreatable, + }; + enum WritableEnum { + Writable, + Readonly, + }; + enum DeletableEnum { + Deletable, + NonDeletable, + }; + + protected: + const std::string name_; + const AttributeDomain domain_; + const CustomDataType data_type_; + const CreatableEnum createable_; + const WritableEnum writable_; + const DeletableEnum deletable_; + + public: + BuiltinAttributeProvider(std::string name, + const AttributeDomain domain, + const CustomDataType data_type, + const CreatableEnum createable, + const WritableEnum writable, + const DeletableEnum deletable) + : name_(std::move(name)), + domain_(domain), + data_type_(data_type), + createable_(createable), + writable_(writable), + deletable_(deletable) + { + } + + virtual ReadAttributePtr try_get_for_read(const GeometryComponent &component) const = 0; + virtual WriteAttributePtr try_get_for_write(GeometryComponent &component) const = 0; + virtual bool try_delete(GeometryComponent &component) const = 0; + virtual bool try_create(GeometryComponent &UNUSED(component)) const = 0; + virtual bool exists(const GeometryComponent &component) const = 0; + + StringRefNull name() const + { + return name_; + } + + AttributeDomain domain() const + { + return domain_; + } + + CustomDataType data_type() const + { + return data_type_; + } +}; + +/** + * A #DynamicAttributesProvider manages a set of named attributes on a geometry component. Each + * attribute has a name, domain and type. + */ +class DynamicAttributesProvider { + public: + virtual ReadAttributePtr try_get_for_read(const GeometryComponent &component, + const StringRef attribute_name) const = 0; + virtual WriteAttributePtr try_get_for_write(GeometryComponent &component, + const StringRef attribute_name) const = 0; + virtual bool try_delete(GeometryComponent &component, const StringRef attribute_name) const = 0; + virtual bool try_create(GeometryComponent &UNUSED(component), + const StringRef UNUSED(attribute_name), + const AttributeDomain UNUSED(domain), + const CustomDataType UNUSED(data_type)) const + { + /* Some providers should not create new attributes. */ + return false; + }; + + virtual bool foreach_attribute(const GeometryComponent &component, + const AttributeForeachCallback callback) const = 0; + virtual void supported_domains(Vector &r_domains) const = 0; +}; + +/** + * Utility to group together multiple functions that are used to access custom data on geometry + * components in a generic way. + */ +struct CustomDataAccessInfo { + using CustomDataGetter = CustomData *(*)(GeometryComponent &component); + using ConstCustomDataGetter = const CustomData *(*)(const GeometryComponent &component); + using UpdateCustomDataPointers = void (*)(GeometryComponent &component); + + CustomDataGetter get_custom_data; + ConstCustomDataGetter get_const_custom_data; + UpdateCustomDataPointers update_custom_data_pointers; +}; + +/** + * This provider is used to provide access to builtin attributes. It supports making internal types + * available as different types. For example, the vertex position attribute is stored as part of + * the #MVert struct, but is exposed as float3 attribute. + */ +class BuiltinCustomDataLayerProvider final : public BuiltinAttributeProvider { + using AsReadAttribute = ReadAttributePtr (*)(const void *data, const int domain_size); + using AsWriteAttribute = WriteAttributePtr (*)(void *data, const int domain_size); + using UpdateOnWrite = void (*)(GeometryComponent &component); + const CustomDataType stored_type_; + const CustomDataAccessInfo custom_data_access_; + const AsReadAttribute as_read_attribute_; + const AsWriteAttribute as_write_attribute_; + const UpdateOnWrite update_on_write_; + + public: + BuiltinCustomDataLayerProvider(std::string attribute_name, + const AttributeDomain domain, + const CustomDataType attribute_type, + const CustomDataType stored_type, + const CreatableEnum creatable, + const WritableEnum writable, + const DeletableEnum deletable, + const CustomDataAccessInfo custom_data_access, + const AsReadAttribute as_read_attribute, + const AsWriteAttribute as_write_attribute, + const UpdateOnWrite update_on_write) + : BuiltinAttributeProvider( + std::move(attribute_name), domain, attribute_type, creatable, writable, deletable), + stored_type_(stored_type), + custom_data_access_(custom_data_access), + as_read_attribute_(as_read_attribute), + as_write_attribute_(as_write_attribute), + update_on_write_(update_on_write) + { + } + + ReadAttributePtr try_get_for_read(const GeometryComponent &component) const final + { + const CustomData *custom_data = custom_data_access_.get_const_custom_data(component); + if (custom_data == nullptr) { + return {}; + } + const int domain_size = component.attribute_domain_size(domain_); + const void *data = CustomData_get_layer(custom_data, stored_type_); + if (data == nullptr) { + return {}; + } + return as_read_attribute_(data, domain_size); + } + + WriteAttributePtr try_get_for_write(GeometryComponent &component) const final + { + if (writable_ != Writable) { + return {}; + } + CustomData *custom_data = custom_data_access_.get_custom_data(component); + if (custom_data == nullptr) { + return {}; + } + const int domain_size = component.attribute_domain_size(domain_); + void *data = CustomData_get_layer(custom_data, stored_type_); + if (data == nullptr) { + return {}; + } + void *new_data = CustomData_duplicate_referenced_layer(custom_data, stored_type_, domain_size); + if (data != new_data) { + custom_data_access_.update_custom_data_pointers(component); + data = new_data; + } + if (update_on_write_ != nullptr) { + update_on_write_(component); + } + return as_write_attribute_(data, domain_size); + } + + bool try_delete(GeometryComponent &component) const final + { + if (deletable_ != Deletable) { + return false; + } + CustomData *custom_data = custom_data_access_.get_custom_data(component); + if (custom_data == nullptr) { + return {}; + } + + const int domain_size = component.attribute_domain_size(domain_); + const int layer_index = CustomData_get_layer_index(custom_data, stored_type_); + const bool delete_success = CustomData_free_layer( + custom_data, stored_type_, domain_size, layer_index); + if (delete_success) { + custom_data_access_.update_custom_data_pointers(component); + } + return delete_success; + } + + bool try_create(GeometryComponent &component) const final + { + if (createable_ != Creatable) { + return false; + } + CustomData *custom_data = custom_data_access_.get_custom_data(component); + if (custom_data == nullptr) { + return false; + } + if (CustomData_get_layer(custom_data, stored_type_) != nullptr) { + /* Exists already. */ + return false; + } + const int domain_size = component.attribute_domain_size(domain_); + const void *data = CustomData_add_layer( + custom_data, stored_type_, CD_DEFAULT, nullptr, domain_size); + const bool success = data != nullptr; + if (success) { + custom_data_access_.update_custom_data_pointers(component); + } + return success; + } + + bool exists(const GeometryComponent &component) const final + { + const CustomData *custom_data = custom_data_access_.get_const_custom_data(component); + if (custom_data == nullptr) { + return false; + } + const void *data = CustomData_get_layer(custom_data, stored_type_); + return data != nullptr; + } +}; + +/** + * This is the attribute provider for most user generated attributes. + */ +class CustomDataAttributeProvider final : public DynamicAttributesProvider { + private: + static constexpr uint64_t supported_types_mask = CD_MASK_PROP_FLOAT | CD_MASK_PROP_FLOAT2 | + CD_MASK_PROP_FLOAT3 | CD_MASK_PROP_INT32 | + CD_MASK_PROP_COLOR | CD_MASK_PROP_BOOL; + const AttributeDomain domain_; + const CustomDataAccessInfo custom_data_access_; + + public: + CustomDataAttributeProvider(const AttributeDomain domain, + const CustomDataAccessInfo custom_data_access) + : domain_(domain), custom_data_access_(custom_data_access) + { + } + + ReadAttributePtr try_get_for_read(const GeometryComponent &component, + const StringRef attribute_name) const final + { + const CustomData *custom_data = custom_data_access_.get_const_custom_data(component); + if (custom_data == nullptr) { + return {}; + } + const int domain_size = component.attribute_domain_size(domain_); + for (const CustomDataLayer &layer : Span(custom_data->layers, custom_data->totlayer)) { + if (layer.name != attribute_name) { + continue; + } + const CustomDataType data_type = (CustomDataType)layer.type; + switch (data_type) { + case CD_PROP_FLOAT: + return this->layer_to_read_attribute(layer, domain_size); + case CD_PROP_FLOAT2: + return this->layer_to_read_attribute(layer, domain_size); + case CD_PROP_FLOAT3: + return this->layer_to_read_attribute(layer, domain_size); + case CD_PROP_INT32: + return this->layer_to_read_attribute(layer, domain_size); + case CD_PROP_COLOR: + return this->layer_to_read_attribute(layer, domain_size); + case CD_PROP_BOOL: + return this->layer_to_read_attribute(layer, domain_size); + default: + break; + } + } + return {}; + } + + WriteAttributePtr try_get_for_write(GeometryComponent &component, + const StringRef attribute_name) const final + { + CustomData *custom_data = custom_data_access_.get_custom_data(component); + if (custom_data == nullptr) { + return {}; + } + const int domain_size = component.attribute_domain_size(domain_); + for (CustomDataLayer &layer : MutableSpan(custom_data->layers, custom_data->totlayer)) { + if (layer.name != attribute_name) { + continue; + } + CustomData_duplicate_referenced_layer_named( + custom_data, layer.type, layer.name, domain_size); + const CustomDataType data_type = (CustomDataType)layer.type; + switch (data_type) { + case CD_PROP_FLOAT: + return this->layer_to_write_attribute(layer, domain_size); + case CD_PROP_FLOAT2: + return this->layer_to_write_attribute(layer, domain_size); + case CD_PROP_FLOAT3: + return this->layer_to_write_attribute(layer, domain_size); + case CD_PROP_INT32: + return this->layer_to_write_attribute(layer, domain_size); + case CD_PROP_COLOR: + return this->layer_to_write_attribute(layer, domain_size); + case CD_PROP_BOOL: + return this->layer_to_write_attribute(layer, domain_size); + default: + break; + } + } + return {}; + } + + bool try_delete(GeometryComponent &component, const StringRef attribute_name) const final + { + CustomData *custom_data = custom_data_access_.get_custom_data(component); + if (custom_data == nullptr) { + return false; + } + const int domain_size = component.attribute_domain_size(domain_); + for (const int i : IndexRange(custom_data->totlayer)) { + const CustomDataLayer &layer = custom_data->layers[i]; + if (this->type_is_supported((CustomDataType)layer.type) && layer.name == attribute_name) { + CustomData_free_layer(custom_data, layer.type, domain_size, i); + return true; + } + } + return false; + } + + bool try_create(GeometryComponent &component, + const StringRef attribute_name, + const AttributeDomain domain, + const CustomDataType data_type) const final + { + if (domain_ != domain) { + return false; + } + if (!this->type_is_supported(data_type)) { + return false; + } + CustomData *custom_data = custom_data_access_.get_custom_data(component); + if (custom_data == nullptr) { + return false; + } + for (const CustomDataLayer &layer : Span(custom_data->layers, custom_data->totlayer)) { + if (layer.name == attribute_name) { + return false; + } + } + const int domain_size = component.attribute_domain_size(domain_); + char attribute_name_c[MAX_NAME]; + attribute_name.copy(attribute_name_c); + CustomData_add_layer_named( + custom_data, data_type, CD_DEFAULT, nullptr, domain_size, attribute_name_c); + return true; + } + + bool foreach_attribute(const GeometryComponent &component, + const AttributeForeachCallback callback) const final + { + const CustomData *custom_data = custom_data_access_.get_const_custom_data(component); + if (custom_data == nullptr) { return true; } + for (const CustomDataLayer &layer : Span(custom_data->layers, custom_data->totlayer)) { + const CustomDataType data_type = (CustomDataType)layer.type; + if (this->type_is_supported(data_type)) { + AttributeMetaData meta_data{domain_, data_type}; + if (!callback(layer.name, meta_data)) { + return false; + } + } + } + return true; } - return false; + + void supported_domains(Vector &r_domains) const final + { + r_domains.append_non_duplicates(domain_); + } + + private: + template + ReadAttributePtr layer_to_read_attribute(const CustomDataLayer &layer, + const int domain_size) const + { + return std::make_unique>( + domain_, Span(static_cast(layer.data), domain_size)); + } + + template + WriteAttributePtr layer_to_write_attribute(CustomDataLayer &layer, const int domain_size) const + { + return std::make_unique>( + domain_, MutableSpan(static_cast(layer.data), domain_size)); + } + + bool type_is_supported(CustomDataType data_type) const + { + return ((1ULL << data_type) & supported_types_mask) != 0; + } +}; + +static Mesh *get_mesh_from_component_for_write(GeometryComponent &component) +{ + BLI_assert(component.type() == GeometryComponentType::Mesh); + MeshComponent &mesh_component = static_cast(component); + return mesh_component.get_for_write(); } -static void get_custom_data_layer_attribute_names(const CustomData &custom_data, - const GeometryComponent &component, - const AttributeDomain domain, - Set &r_names) +static const Mesh *get_mesh_from_component_for_read(const GeometryComponent &component) { - for (const CustomDataLayer &layer : blender::Span(custom_data.layers, custom_data.totlayer)) { - const CustomDataType data_type = static_cast(layer.type); - if (component.attribute_domain_with_type_supported(domain, data_type) || - ELEM(data_type, CD_MLOOPUV)) { - r_names.add(layer.name); + BLI_assert(component.type() == GeometryComponentType::Mesh); + const MeshComponent &mesh_component = static_cast(component); + return mesh_component.get_for_read(); +} + +/** + * This attribute provider is used for uv maps and vertex colors. + */ +class NamedLegacyCustomDataProvider final : public DynamicAttributesProvider { + private: + using AsReadAttribute = ReadAttributePtr (*)(const void *data, const int domain_size); + using AsWriteAttribute = WriteAttributePtr (*)(void *data, const int domain_size); + const AttributeDomain domain_; + const CustomDataType attribute_type_; + const CustomDataType stored_type_; + const CustomDataAccessInfo custom_data_access_; + const AsReadAttribute as_read_attribute_; + const AsWriteAttribute as_write_attribute_; + + public: + NamedLegacyCustomDataProvider(const AttributeDomain domain, + const CustomDataType attribute_type, + const CustomDataType stored_type, + const CustomDataAccessInfo custom_data_access, + const AsReadAttribute as_read_attribute, + const AsWriteAttribute as_write_attribute) + : domain_(domain), + attribute_type_(attribute_type), + stored_type_(stored_type), + custom_data_access_(custom_data_access), + as_read_attribute_(as_read_attribute), + as_write_attribute_(as_write_attribute) + { + } + + ReadAttributePtr try_get_for_read(const GeometryComponent &component, + const StringRef attribute_name) const final + { + const CustomData *custom_data = custom_data_access_.get_const_custom_data(component); + if (custom_data == nullptr) { + return {}; + } + for (const CustomDataLayer &layer : Span(custom_data->layers, custom_data->totlayer)) { + if (layer.type == stored_type_) { + if (layer.name == attribute_name) { + const int domain_size = component.attribute_domain_size(domain_); + return as_read_attribute_(layer.data, domain_size); + } + } + } + return {}; + } + + WriteAttributePtr try_get_for_write(GeometryComponent &component, + const StringRef attribute_name) const final + { + CustomData *custom_data = custom_data_access_.get_custom_data(component); + if (custom_data == nullptr) { + return {}; + } + for (CustomDataLayer &layer : MutableSpan(custom_data->layers, custom_data->totlayer)) { + if (layer.type == stored_type_) { + if (layer.name == attribute_name) { + const int domain_size = component.attribute_domain_size(domain_); + void *data_old = layer.data; + void *data_new = CustomData_duplicate_referenced_layer_named( + custom_data, stored_type_, layer.name, domain_size); + if (data_old != data_new) { + custom_data_access_.update_custom_data_pointers(component); + } + return as_write_attribute_(layer.data, domain_size); + } + } + } + return {}; + } + + bool try_delete(GeometryComponent &component, const StringRef attribute_name) const final + { + CustomData *custom_data = custom_data_access_.get_custom_data(component); + if (custom_data == nullptr) { + return false; + } + for (const int i : IndexRange(custom_data->totlayer)) { + const CustomDataLayer &layer = custom_data->layers[i]; + if (layer.type == stored_type_) { + if (layer.name == attribute_name) { + const int domain_size = component.attribute_domain_size(domain_); + CustomData_free_layer(custom_data, stored_type_, domain_size, i); + custom_data_access_.update_custom_data_pointers(component); + return true; + } + } + } + return false; + } + + bool foreach_attribute(const GeometryComponent &component, + const AttributeForeachCallback callback) const final + { + const CustomData *custom_data = custom_data_access_.get_const_custom_data(component); + if (custom_data == nullptr) { + return true; + } + for (const CustomDataLayer &layer : Span(custom_data->layers, custom_data->totlayer)) { + if (layer.type == stored_type_) { + AttributeMetaData meta_data{domain_, attribute_type_}; + if (!callback(layer.name, meta_data)) { + return false; + } + } + } + return true; + } + + void supported_domains(Vector &r_domains) const final + { + r_domains.append_non_duplicates(domain_); + } +}; + +/** + * This provider makes vertex groups available as float attributes. + */ +class VertexGroupsAttributeProvider final : public DynamicAttributesProvider { + public: + ReadAttributePtr try_get_for_read(const GeometryComponent &component, + const StringRef attribute_name) const final + { + BLI_assert(component.type() == GeometryComponentType::Mesh); + const MeshComponent &mesh_component = static_cast(component); + const Mesh *mesh = mesh_component.get_for_read(); + const int vertex_group_index = mesh_component.vertex_group_names().lookup_default_as( + attribute_name, -1); + if (vertex_group_index < 0) { + return {}; + } + if (mesh == nullptr || mesh->dvert == nullptr) { + static const float default_value = 0.0f; + return std::make_unique( + ATTR_DOMAIN_POINT, mesh->totvert, CPPType::get(), &default_value); + } + return std::make_unique( + mesh->dvert, mesh->totvert, vertex_group_index); + } + + WriteAttributePtr try_get_for_write(GeometryComponent &component, + const StringRef attribute_name) const final + { + BLI_assert(component.type() == GeometryComponentType::Mesh); + MeshComponent &mesh_component = static_cast(component); + Mesh *mesh = mesh_component.get_for_write(); + if (mesh == nullptr) { + return {}; + } + const int vertex_group_index = mesh_component.vertex_group_names().lookup_default_as( + attribute_name, -1); + if (vertex_group_index < 0) { + return {}; + } + if (mesh->dvert == nullptr) { + BKE_object_defgroup_data_create(&mesh->id); + } + else { + /* Copy the data layer if it is shared with some other mesh. */ + mesh->dvert = (MDeformVert *)CustomData_duplicate_referenced_layer( + &mesh->vdata, CD_MDEFORMVERT, mesh->totvert); + } + return std::make_unique( + mesh->dvert, mesh->totvert, vertex_group_index); + } + + bool try_delete(GeometryComponent &component, const StringRef attribute_name) const final + { + BLI_assert(component.type() == GeometryComponentType::Mesh); + MeshComponent &mesh_component = static_cast(component); + + const int vertex_group_index = mesh_component.vertex_group_names().pop_default_as( + attribute_name, -1); + if (vertex_group_index < 0) { + return false; + } + Mesh *mesh = mesh_component.get_for_write(); + if (mesh == nullptr) { + return true; + } + if (mesh->dvert == nullptr) { + return true; + } + for (MDeformVert &dvert : MutableSpan(mesh->dvert, mesh->totvert)) { + MDeformWeight *weight = BKE_defvert_find_index(&dvert, vertex_group_index); + BKE_defvert_remove_group(&dvert, weight); + } + return true; + } + + bool foreach_attribute(const GeometryComponent &component, + const AttributeForeachCallback callback) const final + { + BLI_assert(component.type() == GeometryComponentType::Mesh); + const MeshComponent &mesh_component = static_cast(component); + for (const auto item : mesh_component.vertex_group_names().items()) { + const StringRefNull name = item.key; + const int vertex_group_index = item.value; + if (vertex_group_index >= 0) { + AttributeMetaData meta_data{ATTR_DOMAIN_POINT, CD_PROP_FLOAT}; + if (!callback(name, meta_data)) { + return false; + } + } + } + return true; + } + + void supported_domains(Vector &r_domains) const final + { + r_domains.append_non_duplicates(ATTR_DOMAIN_POINT); + } +}; + +/** + * This is a container for multiple attribute providers that are used by one geometry component + * type (e.g. there is a set of attribute providers for mesh components). + */ +class ComponentAttributeProviders { + private: + /** + * Builtin attribute providers are identified by their name. Attribute names that are in this + * map will only be accessed using builtin attribute providers. Therefore, these providers have + * higher priority when an attribute name is looked up. Usually, that means that builtin + * providers are checked before dynamic ones. + */ + Map builtin_attribute_providers_; + /** + * An ordered list of dynamic attribute providers. The order is important because that is order + * in which they are checked when an attribute is looked up. + */ + Vector dynamic_attribute_providers_; + /** + * All the domains that are supported by at least one of the providers above. + */ + Vector supported_domains_; + + public: + ComponentAttributeProviders(Span builtin_attribute_providers, + Span dynamic_attribute_providers) + : dynamic_attribute_providers_(dynamic_attribute_providers) + { + Set domains; + for (const BuiltinAttributeProvider *provider : builtin_attribute_providers) { + /* Use #add_new to make sure that no two builtin attributes have the same name. */ + builtin_attribute_providers_.add_new(provider->name(), provider); + supported_domains_.append_non_duplicates(provider->domain()); + } + for (const DynamicAttributesProvider *provider : dynamic_attribute_providers) { + provider->supported_domains(supported_domains_); } } + + const Map &builtin_attribute_providers() const + { + return builtin_attribute_providers_; + } + + Span dynamic_attribute_providers() const + { + return dynamic_attribute_providers_; + } + + Span supported_domains() const + { + return supported_domains_; + } +}; + +static float3 get_vertex_position(const MVert &vert) +{ + return float3(vert.co); } -/** \} */ +static void set_vertex_position(MVert &vert, const float3 &position) +{ + copy_v3_v3(vert.co, position); +} + +static ReadAttributePtr make_vertex_position_read_attribute(const void *data, + const int domain_size) +{ + return std::make_unique>( + ATTR_DOMAIN_POINT, Span((const MVert *)data, domain_size)); +} + +static WriteAttributePtr make_vertex_position_write_attribute(void *data, const int domain_size) +{ + return std::make_unique< + DerivedArrayWriteAttribute>( + ATTR_DOMAIN_POINT, MutableSpan((MVert *)data, domain_size)); +} + +static void tag_normals_dirty_when_writing_position(GeometryComponent &component) +{ + Mesh *mesh = get_mesh_from_component_for_write(component); + if (mesh != nullptr) { + mesh->runtime.cd_dirty_vert |= CD_MASK_NORMAL; + } +} + +static int get_material_index(const MPoly &mpoly) +{ + return static_cast(mpoly.mat_nr); +} + +static void set_material_index(MPoly &mpoly, const int &index) +{ + mpoly.mat_nr = static_cast(std::clamp(index, 0, SHRT_MAX)); +} + +static ReadAttributePtr make_material_index_read_attribute(const void *data, const int domain_size) +{ + return std::make_unique>( + ATTR_DOMAIN_POLYGON, Span((const MPoly *)data, domain_size)); +} + +static WriteAttributePtr make_material_index_write_attribute(void *data, const int domain_size) +{ + return std::make_unique< + DerivedArrayWriteAttribute>( + ATTR_DOMAIN_POLYGON, MutableSpan((MPoly *)data, domain_size)); +} + +static float2 get_loop_uv(const MLoopUV &uv) +{ + return float2(uv.uv); +} + +static void set_loop_uv(MLoopUV &uv, const float2 &co) +{ + copy_v2_v2(uv.uv, co); +} + +static ReadAttributePtr make_uvs_read_attribute(const void *data, const int domain_size) +{ + return std::make_unique>( + ATTR_DOMAIN_CORNER, Span((const MLoopUV *)data, domain_size)); +} + +static WriteAttributePtr make_uvs_write_attribute(void *data, const int domain_size) +{ + return std::make_unique>( + ATTR_DOMAIN_CORNER, MutableSpan((MLoopUV *)data, domain_size)); +} + +static Color4f get_loop_color(const MLoopCol &col) +{ + Color4f value; + rgba_uchar_to_float(value, &col.r); + return value; +} + +static void set_loop_color(MLoopCol &col, const Color4f &value) +{ + rgba_float_to_uchar(&col.r, value); +} + +static ReadAttributePtr make_vertex_color_read_attribute(const void *data, const int domain_size) +{ + return std::make_unique>( + ATTR_DOMAIN_CORNER, Span((const MLoopCol *)data, domain_size)); +} + +static WriteAttributePtr make_vertex_color_write_attribute(void *data, const int domain_size) +{ + return std::make_unique< + DerivedArrayWriteAttribute>( + ATTR_DOMAIN_CORNER, MutableSpan((MLoopCol *)data, domain_size)); +} + +template +static ReadAttributePtr make_array_read_attribute(const void *data, const int domain_size) +{ + return std::make_unique>(Domain, Span((const T *)data, domain_size)); +} + +template +static WriteAttributePtr make_array_write_attribute(void *data, const int domain_size) +{ + return std::make_unique>(Domain, MutableSpan((T *)data, domain_size)); +} + +/** + * In this function all the attribute providers for a mesh component are created. Most data in this + * function is statically allocated, because it does not change over time. + */ +static ComponentAttributeProviders create_attribute_providers_for_mesh() +{ + static auto update_custom_data_pointers = [](GeometryComponent &component) { + Mesh *mesh = get_mesh_from_component_for_write(component); + if (mesh != nullptr) { + BKE_mesh_update_customdata_pointers(mesh, false); + } + }; + +#define MAKE_MUTABLE_CUSTOM_DATA_GETTER(NAME) \ + [](GeometryComponent &component) -> CustomData * { \ + Mesh *mesh = get_mesh_from_component_for_write(component); \ + return mesh ? &mesh->NAME : nullptr; \ + } +#define MAKE_CONST_CUSTOM_DATA_GETTER(NAME) \ + [](const GeometryComponent &component) -> const CustomData * { \ + const Mesh *mesh = get_mesh_from_component_for_read(component); \ + return mesh ? &mesh->NAME : nullptr; \ + } + + static CustomDataAccessInfo corner_access = {MAKE_MUTABLE_CUSTOM_DATA_GETTER(ldata), + MAKE_CONST_CUSTOM_DATA_GETTER(ldata), + update_custom_data_pointers}; + static CustomDataAccessInfo point_access = {MAKE_MUTABLE_CUSTOM_DATA_GETTER(vdata), + MAKE_CONST_CUSTOM_DATA_GETTER(vdata), + update_custom_data_pointers}; + static CustomDataAccessInfo edge_access = {MAKE_MUTABLE_CUSTOM_DATA_GETTER(edata), + MAKE_CONST_CUSTOM_DATA_GETTER(edata), + update_custom_data_pointers}; + static CustomDataAccessInfo polygon_access = {MAKE_MUTABLE_CUSTOM_DATA_GETTER(pdata), + MAKE_CONST_CUSTOM_DATA_GETTER(pdata), + update_custom_data_pointers}; + +#undef MAKE_CONST_CUSTOM_DATA_GETTER +#undef MAKE_MUTABLE_CUSTOM_DATA_GETTER + + static BuiltinCustomDataLayerProvider position("position", + ATTR_DOMAIN_POINT, + CD_PROP_FLOAT3, + CD_MVERT, + BuiltinAttributeProvider::NonCreatable, + BuiltinAttributeProvider::Writable, + BuiltinAttributeProvider::NonDeletable, + point_access, + make_vertex_position_read_attribute, + make_vertex_position_write_attribute, + tag_normals_dirty_when_writing_position); + + static BuiltinCustomDataLayerProvider material_index("material_index", + ATTR_DOMAIN_POLYGON, + CD_PROP_INT32, + CD_MPOLY, + BuiltinAttributeProvider::NonCreatable, + BuiltinAttributeProvider::Writable, + BuiltinAttributeProvider::NonDeletable, + polygon_access, + make_material_index_read_attribute, + make_material_index_write_attribute, + nullptr); + + static NamedLegacyCustomDataProvider uvs(ATTR_DOMAIN_CORNER, + CD_PROP_FLOAT2, + CD_MLOOPUV, + corner_access, + make_uvs_read_attribute, + make_uvs_write_attribute); + + static NamedLegacyCustomDataProvider vertex_colors(ATTR_DOMAIN_CORNER, + CD_PROP_COLOR, + CD_MLOOPCOL, + corner_access, + make_vertex_color_read_attribute, + make_vertex_color_write_attribute); + + static VertexGroupsAttributeProvider vertex_groups; + static CustomDataAttributeProvider corner_custom_data(ATTR_DOMAIN_CORNER, corner_access); + static CustomDataAttributeProvider point_custom_data(ATTR_DOMAIN_POINT, point_access); + static CustomDataAttributeProvider edge_custom_data(ATTR_DOMAIN_EDGE, edge_access); + static CustomDataAttributeProvider polygon_custom_data(ATTR_DOMAIN_POLYGON, polygon_access); + + return ComponentAttributeProviders({&position, &material_index}, + {&uvs, + &vertex_colors, + &corner_custom_data, + &vertex_groups, + &point_custom_data, + &edge_custom_data, + &polygon_custom_data}); +} + +/** + * In this function all the attribute providers for a point cloud component are created. Most data + * in this function is statically allocated, because it does not change over time. + */ +static ComponentAttributeProviders create_attribute_providers_for_point_cloud() +{ + static auto update_custom_data_pointers = [](GeometryComponent &component) { + PointCloudComponent &pointcloud_component = static_cast(component); + PointCloud *pointcloud = pointcloud_component.get_for_write(); + if (pointcloud != nullptr) { + BKE_pointcloud_update_customdata_pointers(pointcloud); + } + }; + static CustomDataAccessInfo point_access = { + [](GeometryComponent &component) -> CustomData * { + PointCloudComponent &pointcloud_component = static_cast(component); + PointCloud *pointcloud = pointcloud_component.get_for_write(); + return pointcloud ? &pointcloud->pdata : nullptr; + }, + [](const GeometryComponent &component) -> const CustomData * { + const PointCloudComponent &pointcloud_component = static_cast( + component); + const PointCloud *pointcloud = pointcloud_component.get_for_read(); + return pointcloud ? &pointcloud->pdata : nullptr; + }, + update_custom_data_pointers}; + + static BuiltinCustomDataLayerProvider position( + "position", + ATTR_DOMAIN_POINT, + CD_PROP_FLOAT3, + CD_PROP_FLOAT3, + BuiltinAttributeProvider::NonCreatable, + BuiltinAttributeProvider::Writable, + BuiltinAttributeProvider::NonDeletable, + point_access, + make_array_read_attribute, + make_array_write_attribute, + nullptr); + static BuiltinCustomDataLayerProvider radius( + "radius", + ATTR_DOMAIN_POINT, + CD_PROP_FLOAT, + CD_PROP_FLOAT, + BuiltinAttributeProvider::Creatable, + BuiltinAttributeProvider::Writable, + BuiltinAttributeProvider::Deletable, + point_access, + make_array_read_attribute, + make_array_write_attribute, + nullptr); + static CustomDataAttributeProvider point_custom_data(ATTR_DOMAIN_POINT, point_access); + return ComponentAttributeProviders({&position, &radius}, {&point_custom_data}); +} + +} // namespace blender::bke /* -------------------------------------------------------------------- */ /** \name Geometry Component * \{ */ -bool GeometryComponent::attribute_domain_supported(const AttributeDomain UNUSED(domain)) const +const blender::bke::ComponentAttributeProviders *GeometryComponent::get_attribute_providers() const { - return false; + return nullptr; } -bool GeometryComponent::attribute_domain_with_type_supported( - const AttributeDomain UNUSED(domain), const CustomDataType UNUSED(data_type)) const +bool GeometryComponent::attribute_domain_supported(const AttributeDomain domain) const { - return false; + using namespace blender::bke; + const ComponentAttributeProviders *providers = this->get_attribute_providers(); + if (providers == nullptr) { + return false; + } + return providers->supported_domains().contains(domain); } int GeometryComponent::attribute_domain_size(const AttributeDomain UNUSED(domain)) const @@ -638,47 +1585,155 @@ int GeometryComponent::attribute_domain_size(const AttributeDomain UNUSED(domain return 0; } -bool GeometryComponent::attribute_is_builtin(const StringRef UNUSED(attribute_name)) const -{ - return true; -} - ReadAttributePtr GeometryComponent::attribute_try_get_for_read( - const StringRef UNUSED(attribute_name)) const + const StringRef attribute_name) const { + using namespace blender::bke; + const ComponentAttributeProviders *providers = this->get_attribute_providers(); + if (providers == nullptr) { + return {}; + } + const BuiltinAttributeProvider *builtin_provider = + providers->builtin_attribute_providers().lookup_default_as(attribute_name, nullptr); + if (builtin_provider != nullptr) { + return builtin_provider->try_get_for_read(*this); + } + for (const DynamicAttributesProvider *dynamic_provider : + providers->dynamic_attribute_providers()) { + ReadAttributePtr attribute = dynamic_provider->try_get_for_read(*this, attribute_name); + if (attribute) { + return attribute; + } + } return {}; } -ReadAttributePtr GeometryComponent::attribute_try_adapt_domain(ReadAttributePtr attribute, - const AttributeDomain domain) const +ReadAttributePtr GeometryComponent::attribute_try_adapt_domain( + ReadAttributePtr attribute, const AttributeDomain new_domain) const { - if (attribute && attribute->domain() == domain) { + if (attribute && attribute->domain() == new_domain) { return attribute; } return {}; } -WriteAttributePtr GeometryComponent::attribute_try_get_for_write( - const StringRef UNUSED(attribute_name)) +WriteAttributePtr GeometryComponent::attribute_try_get_for_write(const StringRef attribute_name) { + using namespace blender::bke; + const ComponentAttributeProviders *providers = this->get_attribute_providers(); + if (providers == nullptr) { + return {}; + } + const BuiltinAttributeProvider *builtin_provider = + providers->builtin_attribute_providers().lookup_default_as(attribute_name, nullptr); + if (builtin_provider != nullptr) { + return builtin_provider->try_get_for_write(*this); + } + for (const DynamicAttributesProvider *dynamic_provider : + providers->dynamic_attribute_providers()) { + WriteAttributePtr attribute = dynamic_provider->try_get_for_write(*this, attribute_name); + if (attribute) { + return attribute; + } + } return {}; } -bool GeometryComponent::attribute_try_delete(const StringRef UNUSED(attribute_name)) +bool GeometryComponent::attribute_try_delete(const StringRef attribute_name) { - return false; + using namespace blender::bke; + const ComponentAttributeProviders *providers = this->get_attribute_providers(); + if (providers == nullptr) { + return {}; + } + const BuiltinAttributeProvider *builtin_provider = + providers->builtin_attribute_providers().lookup_default_as(attribute_name, nullptr); + if (builtin_provider != nullptr) { + return builtin_provider->try_delete(*this); + } + bool success = false; + for (const DynamicAttributesProvider *dynamic_provider : + providers->dynamic_attribute_providers()) { + success = dynamic_provider->try_delete(*this, attribute_name) || success; + } + return success; } -bool GeometryComponent::attribute_try_create(const StringRef UNUSED(attribute_name), - const AttributeDomain UNUSED(domain), - const CustomDataType UNUSED(data_type)) +bool GeometryComponent::attribute_try_create(const StringRef attribute_name, + const AttributeDomain domain, + const CustomDataType data_type) { + using namespace blender::bke; + if (attribute_name.is_empty()) { + return false; + } + const ComponentAttributeProviders *providers = this->get_attribute_providers(); + if (providers == nullptr) { + return false; + } + const BuiltinAttributeProvider *builtin_provider = + providers->builtin_attribute_providers().lookup_default_as(attribute_name, nullptr); + if (builtin_provider != nullptr) { + if (builtin_provider->domain() != domain) { + return false; + } + if (builtin_provider->data_type() != data_type) { + return false; + } + return builtin_provider->try_create(*this); + } + for (const DynamicAttributesProvider *dynamic_provider : + providers->dynamic_attribute_providers()) { + if (dynamic_provider->try_create(*this, attribute_name, domain, data_type)) { + return true; + } + } return false; } Set GeometryComponent::attribute_names() const { - return {}; + Set attributes; + this->attribute_foreach([&](StringRefNull name, const AttributeMetaData &UNUSED(meta_data)) { + attributes.add(name); + return true; + }); + return attributes; +} + +void GeometryComponent::attribute_foreach(const AttributeForeachCallback callback) const +{ + using namespace blender::bke; + const ComponentAttributeProviders *providers = this->get_attribute_providers(); + if (providers == nullptr) { + return; + } + + /* Keep track handled attribute names to make sure that we do not return the same name twice. */ + Set handled_attribute_names; + + for (const BuiltinAttributeProvider *provider : + providers->builtin_attribute_providers().values()) { + if (provider->exists(*this)) { + AttributeMetaData meta_data{provider->domain(), provider->data_type()}; + if (!callback(provider->name(), meta_data)) { + return; + } + handled_attribute_names.add_new(provider->name()); + } + } + for (const DynamicAttributesProvider *provider : providers->dynamic_attribute_providers()) { + const bool continue_loop = provider->foreach_attribute( + *this, [&](StringRefNull name, const AttributeMetaData &meta_data) { + if (handled_attribute_names.add(name)) { + return callback(name, meta_data); + } + return true; + }); + if (!continue_loop) { + return; + } + } } bool GeometryComponent::attribute_exists(const blender::StringRef attribute_name) const @@ -712,10 +1767,6 @@ ReadAttributePtr GeometryComponent::attribute_try_get_for_read( const AttributeDomain domain, const CustomDataType data_type) const { - if (!this->attribute_domain_with_type_supported(domain, data_type)) { - return {}; - } - ReadAttributePtr attribute = this->attribute_try_get_for_read(attribute_name); if (!attribute) { return {}; @@ -767,8 +1818,6 @@ ReadAttributePtr GeometryComponent::attribute_get_for_read(const StringRef attri const CustomDataType data_type, const void *default_value) const { - BLI_assert(this->attribute_domain_with_type_supported(domain, data_type)); - ReadAttributePtr attribute = this->attribute_try_get_for_read(attribute_name, domain, data_type); if (attribute) { return attribute; @@ -828,8 +1877,6 @@ OutputAttributePtr GeometryComponent::attribute_try_get_for_output(const StringR const CustomDataType data_type, const void *default_value) { - BLI_assert(this->attribute_domain_with_type_supported(domain, data_type)); - const blender::fn::CPPType *cpp_type = blender::bke::custom_data_type_to_cpp_type(data_type); BLI_assert(cpp_type != nullptr); @@ -957,21 +2004,12 @@ void OutputAttributePtr::apply_span_and_save() /** \name Point Cloud Component * \{ */ -bool PointCloudComponent::attribute_domain_supported(const AttributeDomain domain) const +const blender::bke::ComponentAttributeProviders *PointCloudComponent::get_attribute_providers() + const { - return domain == ATTR_DOMAIN_POINT; -} - -bool PointCloudComponent::attribute_domain_with_type_supported( - const AttributeDomain domain, const CustomDataType data_type) const -{ - return domain == ATTR_DOMAIN_POINT && ELEM(data_type, - CD_PROP_BOOL, - CD_PROP_FLOAT, - CD_PROP_FLOAT2, - CD_PROP_FLOAT3, - CD_PROP_INT32, - CD_PROP_COLOR); + static blender::bke::ComponentAttributeProviders providers = + blender::bke::create_attribute_providers_for_point_cloud(); + return &providers; } int PointCloudComponent::attribute_domain_size(const AttributeDomain domain) const @@ -984,119 +2022,17 @@ int PointCloudComponent::attribute_domain_size(const AttributeDomain domain) con return pointcloud_->totpoint; } -bool PointCloudComponent::attribute_is_builtin(const StringRef attribute_name) const -{ - return attribute_name == "position"; -} - -ReadAttributePtr PointCloudComponent::attribute_try_get_for_read( - const StringRef attribute_name) const -{ - if (pointcloud_ == nullptr) { - return {}; - } - - return read_attribute_from_custom_data( - pointcloud_->pdata, pointcloud_->totpoint, attribute_name, ATTR_DOMAIN_POINT); -} - -WriteAttributePtr PointCloudComponent::attribute_try_get_for_write(const StringRef attribute_name) -{ - PointCloud *pointcloud = this->get_for_write(); - if (pointcloud == nullptr) { - return {}; - } - - return write_attribute_from_custom_data( - pointcloud->pdata, pointcloud->totpoint, attribute_name, ATTR_DOMAIN_POINT, [&]() { - BKE_pointcloud_update_customdata_pointers(pointcloud); - }); -} - -bool PointCloudComponent::attribute_try_delete(const StringRef attribute_name) -{ - if (this->attribute_is_builtin(attribute_name)) { - return false; - } - PointCloud *pointcloud = this->get_for_write(); - if (pointcloud == nullptr) { - return false; - } - delete_named_custom_data_layer(pointcloud->pdata, attribute_name, pointcloud->totpoint); - return true; -} - -static bool custom_data_has_layer_with_name(const CustomData &custom_data, const StringRef name) -{ - for (const CustomDataLayer &layer : blender::Span(custom_data.layers, custom_data.totlayer)) { - if (layer.name == name) { - return true; - } - } - return false; -} - -bool PointCloudComponent::attribute_try_create(const StringRef attribute_name, - const AttributeDomain domain, - const CustomDataType data_type) -{ - if (this->attribute_is_builtin(attribute_name)) { - return false; - } - if (!this->attribute_domain_with_type_supported(domain, data_type)) { - return false; - } - PointCloud *pointcloud = this->get_for_write(); - if (pointcloud == nullptr) { - return false; - } - if (custom_data_has_layer_with_name(pointcloud->pdata, attribute_name)) { - return false; - } - - char attribute_name_c[MAX_NAME]; - attribute_name.copy(attribute_name_c); - CustomData_add_layer_named( - &pointcloud->pdata, data_type, CD_DEFAULT, nullptr, pointcloud_->totpoint, attribute_name_c); - return true; -} - -Set PointCloudComponent::attribute_names() const -{ - if (pointcloud_ == nullptr) { - return {}; - } - - Set names; - get_custom_data_layer_attribute_names(pointcloud_->pdata, *this, ATTR_DOMAIN_POINT, names); - return names; -} - /** \} */ /* -------------------------------------------------------------------- */ /** \name Mesh Component * \{ */ -bool MeshComponent::attribute_domain_supported(const AttributeDomain domain) const +const blender::bke::ComponentAttributeProviders *MeshComponent::get_attribute_providers() const { - return ELEM( - domain, ATTR_DOMAIN_CORNER, ATTR_DOMAIN_POINT, ATTR_DOMAIN_EDGE, ATTR_DOMAIN_POLYGON); -} - -bool MeshComponent::attribute_domain_with_type_supported(const AttributeDomain domain, - const CustomDataType data_type) const -{ - if (!this->attribute_domain_supported(domain)) { - return false; - } - return ELEM(data_type, - CD_PROP_BOOL, - CD_PROP_FLOAT, - CD_PROP_FLOAT2, - CD_PROP_FLOAT3, - CD_PROP_INT32, - CD_PROP_COLOR); + static blender::bke::ComponentAttributeProviders providers = + blender::bke::create_attribute_providers_for_mesh(); + return &providers; } int MeshComponent::attribute_domain_size(const AttributeDomain domain) const @@ -1121,228 +2057,115 @@ int MeshComponent::attribute_domain_size(const AttributeDomain domain) const return 0; } -bool MeshComponent::attribute_is_builtin(const StringRef attribute_name) const +namespace blender::bke { + +template +static void adapt_mesh_domain_corner_to_point_impl(const Mesh &mesh, + const TypedReadAttribute &attribute, + MutableSpan r_values) { - return attribute_name == "position"; + BLI_assert(r_values.size() == mesh.totvert); + attribute_math::DefaultMixer mixer(r_values); + + for (const int loop_index : IndexRange(mesh.totloop)) { + const T value = attribute[loop_index]; + const MLoop &loop = mesh.mloop[loop_index]; + const int point_index = loop.v; + mixer.mix_in(point_index, value); + } + mixer.finalize(); } -ReadAttributePtr MeshComponent::attribute_try_get_for_read(const StringRef attribute_name) const +static ReadAttributePtr adapt_mesh_domain_corner_to_point(const Mesh &mesh, + ReadAttributePtr attribute) { - if (mesh_ == nullptr) { + ReadAttributePtr new_attribute; + const CustomDataType data_type = attribute->custom_data_type(); + attribute_math::convert_to_static_type(data_type, [&](auto dummy) { + using T = decltype(dummy); + if constexpr (!std::is_void_v>) { + /* We compute all interpolated values at once, because for this interpolation, one has to + * iterate over all loops anyway. */ + Array values(mesh.totvert); + adapt_mesh_domain_corner_to_point_impl(mesh, *attribute, values); + new_attribute = std::make_unique>(ATTR_DOMAIN_POINT, + std::move(values)); + } + }); + return new_attribute; +} + +template +static void adapt_mesh_domain_point_to_corner_impl(const Mesh &mesh, + const TypedReadAttribute &attribute, + MutableSpan r_values) +{ + BLI_assert(r_values.size() == mesh.totloop); + + for (const int loop_index : IndexRange(mesh.totloop)) { + const int vertex_index = mesh.mloop[loop_index].v; + r_values[loop_index] = attribute[vertex_index]; + } +} + +static ReadAttributePtr adapt_mesh_domain_point_to_corner(const Mesh &mesh, + ReadAttributePtr attribute) +{ + ReadAttributePtr new_attribute; + const CustomDataType data_type = attribute->custom_data_type(); + attribute_math::convert_to_static_type(data_type, [&](auto dummy) { + using T = decltype(dummy); + /* It is not strictly necessary to compute the value for all corners here. Instead one could + * lazily lookup the mesh topology when a specific index accessed. This can be more efficient + * when an algorithm only accesses very few of the corner values. However, for the algorithms + * we currently have, precomputing the array is fine. Also, it is easier to implement. */ + Array values(mesh.totloop); + adapt_mesh_domain_point_to_corner_impl(mesh, *attribute, values); + new_attribute = std::make_unique>(ATTR_DOMAIN_CORNER, + std::move(values)); + }); + return new_attribute; +} + +} // namespace blender::bke + +ReadAttributePtr MeshComponent::attribute_try_adapt_domain(ReadAttributePtr attribute, + const AttributeDomain new_domain) const +{ + if (!attribute) { return {}; } - - if (attribute_name == "position") { - auto get_vertex_position = [](const MVert &vert) { return float3(vert.co); }; - return std::make_unique< - blender::bke::DerivedArrayReadAttribute>( - ATTR_DOMAIN_POINT, blender::Span(mesh_->mvert, mesh_->totvert), get_vertex_position); - } - - ReadAttributePtr corner_attribute = read_attribute_from_custom_data( - mesh_->ldata, mesh_->totloop, attribute_name, ATTR_DOMAIN_CORNER); - if (corner_attribute) { - return corner_attribute; - } - - const int vertex_group_index = vertex_group_names_.lookup_default(attribute_name, -1); - if (vertex_group_index >= 0) { - return std::make_unique( - mesh_->dvert, mesh_->totvert, vertex_group_index); - } - - ReadAttributePtr vertex_attribute = read_attribute_from_custom_data( - mesh_->vdata, mesh_->totvert, attribute_name, ATTR_DOMAIN_POINT); - if (vertex_attribute) { - return vertex_attribute; - } - - ReadAttributePtr edge_attribute = read_attribute_from_custom_data( - mesh_->edata, mesh_->totedge, attribute_name, ATTR_DOMAIN_EDGE); - if (edge_attribute) { - return edge_attribute; - } - - ReadAttributePtr polygon_attribute = read_attribute_from_custom_data( - mesh_->pdata, mesh_->totpoly, attribute_name, ATTR_DOMAIN_POLYGON); - if (polygon_attribute) { - return polygon_attribute; - } - - return {}; -} - -WriteAttributePtr MeshComponent::attribute_try_get_for_write(const StringRef attribute_name) -{ - Mesh *mesh = this->get_for_write(); - if (mesh == nullptr) { + if (attribute->size() == 0) { return {}; } - - const std::function update_mesh_pointers = [&]() { - BKE_mesh_update_customdata_pointers(mesh, false); - }; - - if (attribute_name == "position") { - CustomData_duplicate_referenced_layer(&mesh->vdata, CD_MVERT, mesh->totvert); - update_mesh_pointers(); - - auto get_vertex_position = [](const MVert &vert) { return float3(vert.co); }; - auto set_vertex_position = [](MVert &vert, const float3 &co) { copy_v3_v3(vert.co, co); }; - return std::make_unique< - blender::bke::DerivedArrayWriteAttribute>( - ATTR_DOMAIN_POINT, - blender::MutableSpan(mesh_->mvert, mesh_->totvert), - get_vertex_position, - set_vertex_position); + const AttributeDomain old_domain = attribute->domain(); + if (old_domain == new_domain) { + return attribute; } - WriteAttributePtr corner_attribute = write_attribute_from_custom_data( - mesh_->ldata, mesh_->totloop, attribute_name, ATTR_DOMAIN_CORNER, update_mesh_pointers); - if (corner_attribute) { - return corner_attribute; - } - - const int vertex_group_index = vertex_group_names_.lookup_default_as(attribute_name, -1); - if (vertex_group_index >= 0) { - if (mesh_->dvert == nullptr) { - BKE_object_defgroup_data_create(&mesh_->id); - } - else { - /* Copy the data layer if it is shared with some other mesh. */ - mesh_->dvert = (MDeformVert *)CustomData_duplicate_referenced_layer( - &mesh_->vdata, CD_MDEFORMVERT, mesh_->totvert); - } - return std::make_unique( - mesh_->dvert, mesh_->totvert, vertex_group_index); - } - - WriteAttributePtr vertex_attribute = write_attribute_from_custom_data( - mesh_->vdata, mesh_->totvert, attribute_name, ATTR_DOMAIN_POINT, update_mesh_pointers); - if (vertex_attribute) { - return vertex_attribute; - } - - WriteAttributePtr edge_attribute = write_attribute_from_custom_data( - mesh_->edata, mesh_->totedge, attribute_name, ATTR_DOMAIN_EDGE, update_mesh_pointers); - if (edge_attribute) { - return edge_attribute; - } - - WriteAttributePtr polygon_attribute = write_attribute_from_custom_data( - mesh_->pdata, mesh_->totpoly, attribute_name, ATTR_DOMAIN_POLYGON, update_mesh_pointers); - if (polygon_attribute) { - return polygon_attribute; - } - - return {}; -} - -bool MeshComponent::attribute_try_delete(const StringRef attribute_name) -{ - if (this->attribute_is_builtin(attribute_name)) { - return false; - } - Mesh *mesh = this->get_for_write(); - if (mesh == nullptr) { - return false; - } - - delete_named_custom_data_layer(mesh_->ldata, attribute_name, mesh_->totloop); - delete_named_custom_data_layer(mesh_->vdata, attribute_name, mesh_->totvert); - delete_named_custom_data_layer(mesh_->edata, attribute_name, mesh_->totedge); - delete_named_custom_data_layer(mesh_->pdata, attribute_name, mesh_->totpoly); - - const int vertex_group_index = vertex_group_names_.lookup_default_as(attribute_name, -1); - if (vertex_group_index != -1) { - for (MDeformVert &dvert : blender::MutableSpan(mesh_->dvert, mesh_->totvert)) { - MDeformWeight *weight = BKE_defvert_find_index(&dvert, vertex_group_index); - BKE_defvert_remove_group(&dvert, weight); - } - vertex_group_names_.remove_as(attribute_name); - } - - return true; -} - -bool MeshComponent::attribute_try_create(const StringRef attribute_name, - const AttributeDomain domain, - const CustomDataType data_type) -{ - if (this->attribute_is_builtin(attribute_name)) { - return false; - } - if (!this->attribute_domain_with_type_supported(domain, data_type)) { - return false; - } - Mesh *mesh = this->get_for_write(); - if (mesh == nullptr) { - return false; - } - - char attribute_name_c[MAX_NAME]; - attribute_name.copy(attribute_name_c); - - switch (domain) { + switch (old_domain) { case ATTR_DOMAIN_CORNER: { - if (custom_data_has_layer_with_name(mesh->ldata, attribute_name)) { - return false; + switch (new_domain) { + case ATTR_DOMAIN_POINT: + return blender::bke::adapt_mesh_domain_corner_to_point(*mesh_, std::move(attribute)); + default: + break; } - CustomData_add_layer_named( - &mesh->ldata, data_type, CD_DEFAULT, nullptr, mesh->totloop, attribute_name_c); - return true; + break; } case ATTR_DOMAIN_POINT: { - if (custom_data_has_layer_with_name(mesh->vdata, attribute_name)) { - return false; + switch (new_domain) { + case ATTR_DOMAIN_CORNER: + return blender::bke::adapt_mesh_domain_point_to_corner(*mesh_, std::move(attribute)); + default: + break; } - if (vertex_group_names_.contains_as(attribute_name)) { - return false; - } - CustomData_add_layer_named( - &mesh->vdata, data_type, CD_DEFAULT, nullptr, mesh->totvert, attribute_name_c); - return true; - } - case ATTR_DOMAIN_EDGE: { - if (custom_data_has_layer_with_name(mesh->edata, attribute_name)) { - return false; - } - CustomData_add_layer_named( - &mesh->edata, data_type, CD_DEFAULT, nullptr, mesh->totedge, attribute_name_c); - return true; - } - case ATTR_DOMAIN_POLYGON: { - if (custom_data_has_layer_with_name(mesh->pdata, attribute_name)) { - return false; - } - CustomData_add_layer_named( - &mesh->pdata, data_type, CD_DEFAULT, nullptr, mesh->totpoly, attribute_name_c); - return true; } default: - return false; - } -} - -Set MeshComponent::attribute_names() const -{ - if (mesh_ == nullptr) { - return {}; + break; } - Set names; - names.add("position"); - for (StringRef name : vertex_group_names_.keys()) { - names.add(name); - } - get_custom_data_layer_attribute_names(mesh_->ldata, *this, ATTR_DOMAIN_CORNER, names); - get_custom_data_layer_attribute_names(mesh_->vdata, *this, ATTR_DOMAIN_POINT, names); - get_custom_data_layer_attribute_names(mesh_->edata, *this, ATTR_DOMAIN_EDGE, names); - get_custom_data_layer_attribute_names(mesh_->pdata, *this, ATTR_DOMAIN_POLYGON, names); - return names; + return {}; } /** \} */ diff --git a/source/blender/blenkernel/intern/attribute_math.cc b/source/blender/blenkernel/intern/attribute_math.cc new file mode 100644 index 00000000000..4ff3a6ceff5 --- /dev/null +++ b/source/blender/blenkernel/intern/attribute_math.cc @@ -0,0 +1,58 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "BKE_attribute_math.hh" + +namespace blender::attribute_math { + +Color4fMixer::Color4fMixer(MutableSpan output_buffer, Color4f default_color) + : buffer_(output_buffer), + default_color_(default_color), + total_weights_(output_buffer.size(), 0.0f) +{ + buffer_.fill(Color4f(0, 0, 0, 0)); +} + +void Color4fMixer::mix_in(const int64_t index, const Color4f &color, const float weight) +{ + BLI_assert(weight >= 0.0f); + Color4f &output_color = buffer_[index]; + output_color.r += color.r * weight; + output_color.g += color.g * weight; + output_color.b += color.b * weight; + output_color.a += color.a * weight; + total_weights_[index] += weight; +} + +void Color4fMixer::finalize() +{ + for (const int64_t i : buffer_.index_range()) { + const float weight = total_weights_[i]; + Color4f &output_color = buffer_[i]; + if (weight > 0.0f) { + const float weight_inv = 1.0f / weight; + output_color.r *= weight_inv; + output_color.g *= weight_inv; + output_color.b *= weight_inv; + output_color.a *= weight_inv; + } + else { + output_color = default_color_; + } + } +} + +} // namespace blender::attribute_math diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c index 3eb53e30272..3b5b16feea8 100644 --- a/source/blender/blenkernel/intern/brush.c +++ b/source/blender/blenkernel/intern/brush.c @@ -375,7 +375,7 @@ static int brush_undo_preserve_cb(LibraryIDLinkCallbackData *cb_data) static void brush_undo_preserve(BlendLibReader *reader, ID *id_new, ID *id_old) { - /* Whole Brush is preserved across undos. */ + /* Whole Brush is preserved across undo-steps. */ BKE_lib_id_swap(NULL, id_new, id_old); /* `id_new` now has content from `id_old`, we need to ensure those old ID pointers are valid. @@ -403,6 +403,7 @@ IDTypeInfo IDType_ID_BR = { .make_local = brush_make_local, .foreach_id = brush_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = brush_blend_write, .blend_read_data = brush_blend_read_data, @@ -975,7 +976,7 @@ void BKE_gpencil_brush_preset_set(Main *bmain, Brush *brush, const short type) break; } case GP_BRUSH_PRESET_FILL_AREA: { - brush->size = 20.0f; + brush->size = 5.0f; brush->gpencil_settings->fill_leak = 3; brush->gpencil_settings->fill_threshold = 0.1f; @@ -989,6 +990,8 @@ void BKE_gpencil_brush_preset_set(Main *bmain, Brush *brush, const short type) brush->gpencil_settings->draw_smoothlvl = 1; brush->gpencil_settings->draw_subdivide = 1; + brush->gpencil_settings->flag |= GP_BRUSH_FILL_SHOW_EXTENDLINES; + brush->gpencil_settings->icon_id = GP_BRUSH_ICON_FILL; brush->gpencil_tool = GPAINT_TOOL_FILL; brush->gpencil_settings->vertex_mode = GPPAINT_MODE_FILL; diff --git a/source/blender/blenkernel/intern/cachefile.c b/source/blender/blenkernel/intern/cachefile.c index 1e2139522f1..d233022fd3f 100644 --- a/source/blender/blenkernel/intern/cachefile.c +++ b/source/blender/blenkernel/intern/cachefile.c @@ -135,6 +135,7 @@ IDTypeInfo IDType_ID_CF = { .make_local = NULL, .foreach_id = NULL, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = cache_file_blend_write, .blend_read_data = cache_file_blend_read_data, diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c index b0e3743add1..bab9e2a5592 100644 --- a/source/blender/blenkernel/intern/camera.c +++ b/source/blender/blenkernel/intern/camera.c @@ -196,6 +196,7 @@ IDTypeInfo IDType_ID_CA = { .make_local = camera_make_local, .foreach_id = camera_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = camera_blend_write, .blend_read_data = camera_blend_read_data, diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c index dd0572f9b12..28b91dcc8ce 100644 --- a/source/blender/blenkernel/intern/collection.c +++ b/source/blender/blenkernel/intern/collection.c @@ -172,6 +172,26 @@ static void collection_foreach_id(ID *id, LibraryForeachIDData *data) } } +static ID *collection_owner_get(Main *bmain, ID *id) +{ + if ((id->flag & LIB_EMBEDDED_DATA) == 0) { + return id; + } + BLI_assert((id->tag & LIB_TAG_NO_MAIN) == 0); + + Collection *master_collection = (Collection *)id; + BLI_assert((master_collection->flag & COLLECTION_IS_MASTER) != 0); + + for (Scene *scene = bmain->scenes.first; scene != NULL; scene = scene->id.next) { + if (scene->master_collection == master_collection) { + return &scene->id; + } + } + + BLI_assert(!"Embedded collection with no owner. Critical Main inconsistency."); + return NULL; +} + void BKE_collection_blend_write_nolib(BlendWriter *writer, Collection *collection) { BKE_id_blend_write(writer, &collection->id); @@ -355,6 +375,7 @@ IDTypeInfo IDType_ID_GR = { .make_local = NULL, .foreach_id = collection_foreach_id, .foreach_cache = NULL, + .owner_get = collection_owner_get, .blend_write = collection_blend_write, .blend_read_data = collection_blend_read_data, @@ -839,19 +860,6 @@ Collection *BKE_collection_master_add() return master_collection; } -Scene *BKE_collection_master_scene_search(const Main *bmain, const Collection *master_collection) -{ - BLI_assert((master_collection->flag & COLLECTION_IS_MASTER) != 0); - - for (Scene *scene = bmain->scenes.first; scene != NULL; scene = scene->id.next) { - if (scene->master_collection == master_collection) { - return scene; - } - } - - return NULL; -} - /** \} */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/blenkernel/intern/cryptomatte.cc b/source/blender/blenkernel/intern/cryptomatte.cc index ef7f5963bee..42158dced96 100644 --- a/source/blender/blenkernel/intern/cryptomatte.cc +++ b/source/blender/blenkernel/intern/cryptomatte.cc @@ -35,7 +35,6 @@ #include "BLI_dynstr.h" #include "BLI_hash_mm3.h" #include "BLI_listbase.h" -#include "BLI_set.hh" #include "BLI_string.h" #include "MEM_guardedalloc.h" @@ -47,87 +46,50 @@ #include #include -enum CryptomatteLayerState { - EMPTY, - FILLED, - CLOSED, -}; - -struct CryptomatteLayer { - CryptomatteLayerState state = CryptomatteLayerState::EMPTY; - blender::Set names; - std::stringstream manifest; - -#ifdef WITH_CXX_GUARDEDALLOC - MEM_CXX_CLASS_ALLOC_FUNCS("cryptomatte:CryptomatteLayer") -#endif - - void add_hash(std::string name, uint32_t cryptomatte_hash) - { - BLI_assert(state != CryptomatteLayerState::CLOSED); - const bool first_item = names.is_empty(); - if (!names.add(name)) { - return; - } - - if (first_item) { - state = CryptomatteLayerState::FILLED; - manifest << "{"; - } - else { - manifest << ","; - } - manifest << quoted(name) << ":\""; - manifest << std::setfill('0') << std::setw(sizeof(uint32_t) * 2) << std::hex - << cryptomatte_hash; - manifest << "\""; - } - - void close_manifest() - { - BLI_assert(state != CryptomatteLayerState::CLOSED); - if (state == CryptomatteLayerState::FILLED) { - manifest << "}"; - } - state = CryptomatteLayerState::CLOSED; - } - - std::string manifest_get_string() - { - BLI_assert(state == CryptomatteLayerState::CLOSED); - return manifest.str(); - } -}; - struct CryptomatteSession { - CryptomatteLayer objects; - CryptomatteLayer assets; - CryptomatteLayer materials; + blender::bke::cryptomatte::CryptomatteLayer objects; + blender::bke::cryptomatte::CryptomatteLayer assets; + blender::bke::cryptomatte::CryptomatteLayer materials; + + CryptomatteSession(); + CryptomatteSession(const Main *bmain); + + std::optional operator[](float encoded_hash) const; #ifdef WITH_CXX_GUARDEDALLOC MEM_CXX_CLASS_ALLOC_FUNCS("cryptomatte:CryptomatteSession") #endif - - void finish() - { - objects.close_manifest(); - materials.close_manifest(); - assets.close_manifest(); - } }; +CryptomatteSession::CryptomatteSession() +{ +} + +CryptomatteSession::CryptomatteSession(const Main *bmain) +{ + LISTBASE_FOREACH (ID *, id, &bmain->objects) { + objects.add_ID(*id); + } + LISTBASE_FOREACH (ID *, id, &bmain->materials) { + materials.add_ID(*id); + } +} + +std::optional CryptomatteSession::operator[](float encoded_hash) const +{ + std::optional result = objects[encoded_hash]; + if (result) { + return result; + } + return materials[encoded_hash]; +} + CryptomatteSession *BKE_cryptomatte_init(void) { CryptomatteSession *session = new CryptomatteSession(); return session; } -void BKE_cryptomatte_finish(CryptomatteSession *session) -{ - BLI_assert(session != nullptr); - session->finish(); -} - void BKE_cryptomatte_free(CryptomatteSession *session) { BLI_assert(session != nullptr); @@ -136,26 +98,13 @@ void BKE_cryptomatte_free(CryptomatteSession *session) uint32_t BKE_cryptomatte_hash(const char *name, const int name_len) { - uint32_t cryptohash_int = BLI_hash_mm3((const unsigned char *)name, name_len, 0); - return cryptohash_int; -} - -static uint32_t cryptomatte_hash(CryptomatteLayer *layer, const ID *id) -{ - const char *name = &id->name[2]; - const int name_len = BLI_strnlen(name, MAX_NAME - 2); - uint32_t cryptohash_int = BKE_cryptomatte_hash(name, name_len); - - if (layer != nullptr) { - layer->add_hash(std::string(name, name_len), cryptohash_int); - } - - return cryptohash_int; + blender::bke::cryptomatte::CryptomatteHash hash(name, name_len); + return hash.hash; } uint32_t BKE_cryptomatte_object_hash(CryptomatteSession *session, const Object *object) { - return cryptomatte_hash(&session->objects, &object->id); + return session->objects.add_ID(object->id); } uint32_t BKE_cryptomatte_material_hash(CryptomatteSession *session, const Material *material) @@ -163,7 +112,7 @@ uint32_t BKE_cryptomatte_material_hash(CryptomatteSession *session, const Materi if (material == nullptr) { return 0.0f; } - return cryptomatte_hash(&session->materials, &material->id); + return session->materials.add_ID(material->id); } uint32_t BKE_cryptomatte_asset_hash(CryptomatteSession *session, const Object *object) @@ -172,54 +121,12 @@ uint32_t BKE_cryptomatte_asset_hash(CryptomatteSession *session, const Object *o while (asset_object->parent != nullptr) { asset_object = asset_object->parent; } - return cryptomatte_hash(&session->assets, &asset_object->id); + return session->assets.add_ID(asset_object->id); } -/* Convert a cryptomatte hash to a float. - * - * Cryptomatte hashes are stored in float textures and images. The conversion is taken from the - * cryptomatte specification. See Floating point conversion section in - * https://github.com/Psyop/Cryptomatte/blob/master/specification/cryptomatte_specification.pdf. - * - * The conversion uses as many 32 bit floating point values as possible to minimize hash - * collisions. Unfortunately not all 32 bits can be as NaN and Inf can be problematic. - * - * Note that this conversion assumes to be running on a L-endian system. */ float BKE_cryptomatte_hash_to_float(uint32_t cryptomatte_hash) { - uint32_t mantissa = cryptomatte_hash & ((1 << 23) - 1); - uint32_t exponent = (cryptomatte_hash >> 23) & ((1 << 8) - 1); - exponent = MAX2(exponent, (uint32_t)1); - exponent = MIN2(exponent, (uint32_t)254); - exponent = exponent << 23; - uint32_t sign = (cryptomatte_hash >> 31); - sign = sign << 31; - uint32_t float_bits = sign | exponent | mantissa; - float f; - memcpy(&f, &float_bits, sizeof(uint32_t)); - return f; -} - -static ID *cryptomatte_find_id(const ListBase *ids, const float encoded_hash) -{ - LISTBASE_FOREACH (ID *, id, ids) { - uint32_t hash = BKE_cryptomatte_hash((id->name + 2), BLI_strnlen(id->name + 2, MAX_NAME)); - if (BKE_cryptomatte_hash_to_float(hash) == encoded_hash) { - return id; - } - } - return nullptr; -} - -/* Find an ID in the given main that matches the given encoded float. */ -static struct ID *BKE_cryptomatte_find_id(const Main *bmain, const float encoded_hash) -{ - ID *result; - result = cryptomatte_find_id(&bmain->objects, encoded_hash); - if (result == nullptr) { - result = cryptomatte_find_id(&bmain->materials, encoded_hash); - } - return result; + return blender::bke::cryptomatte::CryptomatteHash(cryptomatte_hash).float_encoded(); } char *BKE_cryptomatte_entries_to_matte_id(NodeCryptomatte *node_storage) @@ -243,11 +150,10 @@ char *BKE_cryptomatte_entries_to_matte_id(NodeCryptomatte *node_storage) return result; } -void BKE_cryptomatte_matte_id_to_entries(const Main *bmain, - NodeCryptomatte *node_storage, - const char *matte_id) +void BKE_cryptomatte_matte_id_to_entries(NodeCryptomatte *node_storage, const char *matte_id) { BLI_freelistN(&node_storage->entries); + std::optional session = std::nullopt; std::istringstream ss(matte_id); while (ss.good()) { @@ -266,18 +172,12 @@ void BKE_cryptomatte_matte_id_to_entries(const Main *bmain, float encoded_hash = atof(token.substr(1, token.length() - 2).c_str()); entry = (CryptomatteEntry *)MEM_callocN(sizeof(CryptomatteEntry), __func__); entry->encoded_hash = encoded_hash; - if (bmain) { - ID *id = BKE_cryptomatte_find_id(bmain, encoded_hash); - if (id != nullptr) { - BLI_strncpy(entry->name, id->name + 2, sizeof(entry->name)); - } - } } else { const char *name = token.c_str(); int name_len = token.length(); entry = (CryptomatteEntry *)MEM_callocN(sizeof(CryptomatteEntry), __func__); - BLI_strncpy(entry->name, name, sizeof(entry->name)); + STRNCPY(entry->name, name); uint32_t hash = BKE_cryptomatte_hash(name, name_len); entry->encoded_hash = BKE_cryptomatte_hash_to_float(hash); } @@ -289,7 +189,7 @@ void BKE_cryptomatte_matte_id_to_entries(const Main *bmain, } static std::string cryptomatte_determine_name(const ViewLayer *view_layer, - const std::string cryptomatte_layer_name) + const blender::StringRefNull cryptomatte_layer_name) { std::stringstream stream; const size_t view_layer_name_len = BLI_strnlen(view_layer->name, sizeof(view_layer->name)); @@ -297,9 +197,9 @@ static std::string cryptomatte_determine_name(const ViewLayer *view_layer, return stream.str(); } -static uint32_t cryptomatte_determine_identifier(const std::string name) +static uint32_t cryptomatte_determine_identifier(const blender::StringRef name) { - return BLI_hash_mm3(reinterpret_cast(name.c_str()), name.length(), 0); + return BLI_hash_mm3(reinterpret_cast(name.data()), name.size(), 0); } static void add_render_result_meta_data(RenderResult *render_result, @@ -309,7 +209,7 @@ static void add_render_result_meta_data(RenderResult *render_result, { BKE_render_result_stamp_data( render_result, - blender::BKE_cryptomatte_meta_data_key(layer_name, key_name).c_str(), + blender::bke::cryptomatte::BKE_cryptomatte_meta_data_key(layer_name, key_name).c_str(), value.data()); } @@ -320,7 +220,7 @@ void BKE_cryptomatte_store_metadata(struct CryptomatteSession *session, const char *cryptomatte_layer_name) { /* Create Manifest. */ - CryptomatteLayer *layer = nullptr; + blender::bke::cryptomatte::CryptomatteLayer *layer = nullptr; switch (cryptomatte_layer) { case VIEW_LAYER_CRYPTOMATTE_OBJECT: layer = &session->objects; @@ -336,7 +236,7 @@ void BKE_cryptomatte_store_metadata(struct CryptomatteSession *session, break; } - const std::string manifest = layer->manifest_get_string(); + const std::string manifest = layer->manifest(); const std::string name = cryptomatte_determine_name(view_layer, cryptomatte_layer_name); /* Store the meta data into the render result. */ @@ -346,7 +246,124 @@ void BKE_cryptomatte_store_metadata(struct CryptomatteSession *session, add_render_result_meta_data(render_result, name, "manifest", manifest); } -namespace blender { +namespace blender::bke::cryptomatte { +namespace manifest { +constexpr StringRef WHITESPACES = " \t\n\v\f\r"; + +static constexpr blender::StringRef skip_whitespaces_(blender::StringRef ref) +{ + size_t skip = ref.find_first_not_of(WHITESPACES); + return ref.drop_prefix(skip); +} + +static constexpr int quoted_string_len_(blender::StringRef ref) +{ + int len = 1; + bool skip_next = false; + while (len < ref.size()) { + char current_char = ref[len]; + if (skip_next) { + skip_next = false; + } + else { + if (current_char == '\\') { + skip_next = true; + } + if (current_char == '\"') { + len += 1; + break; + } + } + len += 1; + } + return len; +} + +static std::string unquote_(const blender::StringRef ref) +{ + std::ostringstream stream; + for (char c : ref) { + if (c != '\\') { + stream << c; + } + } + return stream.str(); +} + +static bool from_manifest(CryptomatteLayer &layer, blender::StringRefNull manifest) +{ + StringRef ref = manifest; + ref = skip_whitespaces_(ref); + if (ref.is_empty() || ref.front() != '{') { + return false; + } + ref = ref.drop_prefix(1); + while (!ref.is_empty()) { + char front = ref.front(); + + if (front == '\"') { + const int quoted_name_len = quoted_string_len_(ref); + const int name_len = quoted_name_len - 2; + std::string name = unquote_(ref.substr(1, name_len)); + ref = ref.drop_prefix(quoted_name_len); + ref = skip_whitespaces_(ref); + + char colon = ref.front(); + if (colon != ':') { + return false; + } + ref = ref.drop_prefix(1); + ref = skip_whitespaces_(ref); + + if (ref.front() != '\"') { + return false; + } + + const int quoted_hash_len = quoted_string_len_(ref); + const int hash_len = quoted_hash_len - 2; + CryptomatteHash hash = CryptomatteHash::from_hex_encoded(ref.substr(1, hash_len)); + ref = ref.drop_prefix(quoted_hash_len); + layer.add_hash(name, hash); + } + else if (front == ',') { + ref = ref.drop_prefix(1); + } + else if (front == '}') { + ref = ref.drop_prefix(1); + ref = skip_whitespaces_(ref); + break; + } + ref = skip_whitespaces_(ref); + } + + if (!ref.is_empty()) { + return false; + } + + return true; +} + +static std::string to_manifest(const CryptomatteLayer *layer) +{ + std::stringstream manifest; + + bool is_first = true; + const blender::Map &const_map = layer->hashes; + manifest << "{"; + for (blender::Map::Item item : const_map.items()) { + if (is_first) { + is_first = false; + } + else { + manifest << ","; + } + manifest << quoted(item.key) << ":\"" << (item.value.hex_encoded()) << "\""; + } + manifest << "}"; + return manifest.str(); +} + +} // namespace manifest /* Return the hash of the given cryptomatte layer name. * @@ -381,4 +398,92 @@ StringRef BKE_cryptomatte_extract_layer_name(const StringRef render_pass_name) return render_pass_name.substr(0, last_token); } -} // namespace blender +CryptomatteHash::CryptomatteHash(uint32_t hash) : hash(hash) +{ +} + +CryptomatteHash::CryptomatteHash(const char *name, const int name_len) +{ + hash = BLI_hash_mm3((const unsigned char *)name, name_len, 0); +} + +CryptomatteHash CryptomatteHash::from_hex_encoded(blender::StringRef hex_encoded) +{ + CryptomatteHash result(0); + std::istringstream(hex_encoded) >> std::hex >> result.hash; + return result; +} + +std::string CryptomatteHash::hex_encoded() const +{ + std::stringstream encoded; + encoded << std::setfill('0') << std::setw(sizeof(uint32_t) * 2) << std::hex << hash; + return encoded.str(); +} + +/* Convert a cryptomatte hash to a float. + * + * Cryptomatte hashes are stored in float textures and images. The conversion is taken from the + * cryptomatte specification. See Floating point conversion section in + * https://github.com/Psyop/Cryptomatte/blob/master/specification/cryptomatte_specification.pdf. + * + * The conversion uses as many 32 bit floating point values as possible to minimize hash + * collisions. Unfortunately not all 32 bits can be used as NaN and Inf can be problematic. + * + * Note that this conversion assumes to be running on a L-endian system. */ +float CryptomatteHash::float_encoded() const +{ + uint32_t mantissa = hash & ((1 << 23) - 1); + uint32_t exponent = (hash >> 23) & ((1 << 8) - 1); + exponent = MAX2(exponent, (uint32_t)1); + exponent = MIN2(exponent, (uint32_t)254); + exponent = exponent << 23; + uint32_t sign = (hash >> 31); + sign = sign << 31; + uint32_t float_bits = sign | exponent | mantissa; + float f; + memcpy(&f, &float_bits, sizeof(uint32_t)); + return f; +} + +std::unique_ptr CryptomatteLayer::read_from_manifest( + blender::StringRefNull manifest) +{ + std::unique_ptr layer = std::make_unique(); + blender::bke::cryptomatte::manifest::from_manifest(*layer.get(), manifest); + return layer; +} + +uint32_t CryptomatteLayer::add_ID(const ID &id) +{ + const char *name = &id.name[2]; + const int name_len = BLI_strnlen(name, MAX_NAME - 2); + uint32_t cryptohash_int = BKE_cryptomatte_hash(name, name_len); + + add_hash(blender::StringRef(name, name_len), cryptohash_int); + + return cryptohash_int; +} + +void CryptomatteLayer::add_hash(blender::StringRef name, CryptomatteHash cryptomatte_hash) +{ + hashes.add_overwrite(name, cryptomatte_hash); +} + +std::optional CryptomatteLayer::operator[](float encoded_hash) const +{ + const blender::Map &const_map = hashes; + for (blender::Map::Item item : const_map.items()) { + if (BKE_cryptomatte_hash_to_float(item.value.hash) == encoded_hash) { + return std::make_optional(item.key); + } + } + return std::nullopt; +} + +std::string CryptomatteLayer::manifest() +{ + return blender::bke::cryptomatte::manifest::to_manifest(this); +} + +} // namespace blender::bke::cryptomatte diff --git a/source/blender/blenkernel/intern/cryptomatte_test.cc b/source/blender/blenkernel/intern/cryptomatte_test.cc index 3773b2b3bf9..4a25f5f7d87 100644 --- a/source/blender/blenkernel/intern/cryptomatte_test.cc +++ b/source/blender/blenkernel/intern/cryptomatte_test.cc @@ -19,7 +19,7 @@ #include "BKE_cryptomatte.hh" -namespace blender::bke::tests { +namespace blender::bke::cryptomatte::tests { TEST(cryptomatte, meta_data_key) { @@ -41,4 +41,45 @@ TEST(cryptomatte, extract_layer_name) ASSERT_EQ("", BKE_cryptomatte_extract_layer_name("")); } -} // namespace blender::bke::tests +TEST(cryptomatte, cryptomatte_layer) +{ + blender::bke::cryptomatte::CryptomatteLayer layer; + ASSERT_EQ("{}", layer.manifest()); + + layer.add_hash("Object", 123); + ASSERT_EQ("{\"Object\":\"0000007b\"}", layer.manifest()); + + layer.add_hash("Object2", 123245678); + ASSERT_EQ("{\"Object\":\"0000007b\",\"Object2\":\"0758946e\"}", layer.manifest()); +} + +TEST(cryptomatte, cryptomatte_layer_quoted) +{ + blender::bke::cryptomatte::CryptomatteLayer layer; + layer.add_hash("\"Object\"", 123); + ASSERT_EQ("{\"\\\"Object\\\"\":\"0000007b\"}", layer.manifest()); +} + +static void test_cryptomatte_manifest(std::string expected, std::string manifest) +{ + EXPECT_EQ(expected, + blender::bke::cryptomatte::CryptomatteLayer::read_from_manifest(manifest)->manifest()); +} + +TEST(cryptomatte, cryptomatte_layer_from_manifest) +{ + test_cryptomatte_manifest("{}", "{}"); + test_cryptomatte_manifest("{\"Object\":\"12345678\"}", "{\"Object\": \"12345678\"}"); + test_cryptomatte_manifest("{\"Object\":\"12345678\",\"Object2\":\"87654321\"}", + "{\"Object\":\"12345678\",\"Object2\":\"87654321\"}"); + test_cryptomatte_manifest( + "{\"Object\":\"12345678\",\"Object2\":\"87654321\"}", + " { \"Object\" : \"12345678\" , \"Object2\" : \"87654321\" } "); + test_cryptomatte_manifest("{\"Object\\\"01\\\"\":\"12345678\"}", + "{\"Object\\\"01\\\"\": \"12345678\"}"); + test_cryptomatte_manifest( + "{\"Object\\\"01\\\"\":\"12345678\",\"Object\":\"12345678\",\"Object2\":\"87654321\"}", + "{\"Object\\\"01\\\"\":\"12345678\",\"Object\":\"12345678\", \"Object2\":\"87654321\"}"); +} + +} // namespace blender::bke::cryptomatte::tests diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 5632ae28960..f3551c98f07 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -320,6 +320,7 @@ IDTypeInfo IDType_ID_CU = { .make_local = NULL, .foreach_id = curve_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = curve_blend_write, .blend_read_data = curve_blend_read_data, @@ -4337,14 +4338,17 @@ void BKE_nurbList_handles_autocalc(ListBase *editnurb, uint8_t flag) } } +/** + * \param code: + * - 1 (#HD_AUTO): set auto-handle. + * - 2 (#HD_VECT): set vector-handle. + * - 3 (#HD_ALIGN) it toggle, vector-handles become #HD_FREE. + * + * - 5: Set align, like 3 but no toggle. + * - 6: Clear align (setting #HD_FREE), like 3 but no toggle. + */ void BKE_nurbList_handles_set(ListBase *editnurb, const char code) { - /* code==1: set autohandle */ - /* code==2: set vectorhandle */ - /* code==3 (HD_ALIGN) it toggle, vectorhandles become HD_FREE */ - /* code==4: sets icu flag to become IPO_AUTO_HORIZ, horizontal extremes on auto-handles */ - /* code==5: Set align, like 3 but no toggle */ - /* code==6: Clear align, like 3 but no toggle */ BezTriple *bezt; int a; diff --git a/source/blender/blenkernel/intern/curve_convert.c b/source/blender/blenkernel/intern/curve_convert.c new file mode 100644 index 00000000000..988ddb3bbc0 --- /dev/null +++ b/source/blender/blenkernel/intern/curve_convert.c @@ -0,0 +1,81 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bke + */ + +#include "DNA_curve_types.h" +#include "DNA_object_types.h" +#include "DNA_vfont_types.h" + +#include "BLI_utildefines.h" + +#include "BKE_curve.h" +#include "BKE_displist.h" +#include "BKE_font.h" +#include "BKE_lib_id.h" +#include "BKE_modifier.h" + +#include "DEG_depsgraph.h" +#include "DEG_depsgraph_query.h" + +static Curve *curve_from_font_object(Object *object, Depsgraph *depsgraph) +{ + Curve *curve = (Curve *)object->data; + Curve *new_curve = (Curve *)BKE_id_copy_ex(NULL, &curve->id, NULL, LIB_ID_COPY_LOCALIZE); + + Object *evaluated_object = DEG_get_evaluated_object(depsgraph, object); + BKE_vfont_to_curve_nubase(evaluated_object, FO_EDIT, &new_curve->nurb); + + new_curve->type = OB_CURVE; + + new_curve->flag &= ~CU_3D; + BKE_curve_curve_dimension_update(new_curve); + + return new_curve; +} + +static Curve *curve_from_curve_object(Object *object, Depsgraph *depsgraph, bool apply_modifiers) +{ + Object *evaluated_object = DEG_get_evaluated_object(depsgraph, object); + Curve *curve = (Curve *)evaluated_object->data; + Curve *new_curve = (Curve *)BKE_id_copy_ex(NULL, &curve->id, NULL, LIB_ID_COPY_LOCALIZE); + + if (apply_modifiers) { + BKE_curve_calc_modifiers_pre(depsgraph, + DEG_get_input_scene(depsgraph), + evaluated_object, + BKE_curve_nurbs_get(curve), + &new_curve->nurb, + DEG_get_mode(depsgraph) == DAG_EVAL_RENDER); + } + + return new_curve; +} + +Curve *BKE_curve_new_from_object(Object *object, Depsgraph *depsgraph, bool apply_modifiers) +{ + if (!ELEM(object->type, OB_FONT, OB_CURVE)) { + return NULL; + } + + if (object->type == OB_FONT) { + return curve_from_font_object(object, depsgraph); + } + + return curve_from_curve_object(object, depsgraph, apply_modifiers); +} diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index 7b6db406073..571010e2017 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -499,6 +499,21 @@ static void layerCopy_propFloat(const void *source, void *dest, int count) memcpy(dest, source, sizeof(MFloatProperty) * count); } +static void layerInterp_propFloat(const void **sources, + const float *weights, + const float *UNUSED(sub_weights), + int count, + void *dest) +{ + float result = 0.0f; + for (int i = 0; i < count; i++) { + const float interp_weight = weights[i]; + const float src = *(const float *)sources[i]; + result += src * interp_weight; + } + *(float *)dest = result; +} + static bool layerValidate_propFloat(void *data, const uint totitems, const bool do_fixes) { MFloatProperty *fp = data; @@ -1579,7 +1594,7 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { N_("Float"), layerCopy_propFloat, NULL, - NULL, + layerInterp_propFloat, NULL, NULL, layerValidate_propFloat}, @@ -2912,20 +2927,20 @@ void CustomData_copy_elements(int type, void *src_data_ofs, void *dst_data_ofs, } } -static void CustomData_copy_data_layer(const CustomData *source, - CustomData *dest, - int src_i, - int dst_i, - int src_index, - int dst_index, - int count) +void CustomData_copy_data_layer(const CustomData *source, + CustomData *dest, + int src_layer_index, + int dst_layer_index, + int src_index, + int dst_index, + int count) { const LayerTypeInfo *typeInfo; - const void *src_data = source->layers[src_i].data; - void *dst_data = dest->layers[dst_i].data; + const void *src_data = source->layers[src_layer_index].data; + void *dst_data = dest->layers[dst_layer_index].data; - typeInfo = layerType_getInfo(source->layers[src_i].type); + typeInfo = layerType_getInfo(source->layers[src_layer_index].type); const size_t src_offset = (size_t)src_index * typeInfo->size; const size_t dst_offset = (size_t)dst_index * typeInfo->size; @@ -2934,7 +2949,7 @@ static void CustomData_copy_data_layer(const CustomData *source, if (count && !(src_data == NULL && dst_data == NULL)) { CLOG_WARN(&LOG, "null data for %s type (%p --> %p), skipping", - layerType_getName(source->layers[src_i].type), + layerType_getName(source->layers[src_layer_index].type), (void *)src_data, (void *)dst_data); } @@ -4318,6 +4333,18 @@ bool CustomData_layertype_is_singleton(int type) return typeInfo->defaultname == NULL; } +/** + * Has dynamically allocated members. + * This is useful to know if operations such as #memcmp are + * valid when comparing data from two layers. + */ +bool CustomData_layertype_is_dynamic(int type) +{ + const LayerTypeInfo *typeInfo = layerType_getInfo(type); + + return (typeInfo->free != NULL); +} + /** * \return Maximum number of layers of given \a type, -1 means 'no limit'. */ diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 58c050493c9..c860e57520d 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -292,164 +292,139 @@ bool BKE_displist_surfindex_get(DispList *dl, int a, int *b, int *p1, int *p2, i /* ICC with the optimization -02 causes crashes. */ # pragma intel optimization_level 1 #endif -static void curve_to_displist(Curve *cu, - ListBase *nubase, - ListBase *dispbase, - const bool for_render) + +static void curve_to_displist(const Curve *cu, + const ListBase *nubase, + const bool for_render, + ListBase *r_dispbase) { - DispList *dl; - BezTriple *bezt, *prevbezt; - BPoint *bp; - float *data; - int a, len, resolu; const bool editmode = (!for_render && (cu->editnurb || cu->editfont)); LISTBASE_FOREACH (Nurb *, nu, nubase) { if (nu->hide != 0 && editmode) { continue; } - - if (for_render && cu->resolu_ren != 0) { - resolu = cu->resolu_ren; - } - else { - resolu = nu->resolu; - } - if (!BKE_nurb_check_valid_u(nu)) { - /* pass */ + continue; } - else if (nu->type == CU_BEZIER) { - /* count */ - len = 0; - a = nu->pntsu - 1; - if (nu->flagu & CU_NURB_CYCLIC) { - a++; - } - prevbezt = nu->bezt; - bezt = prevbezt + 1; - while (a--) { - if (a == 0 && (nu->flagu & CU_NURB_CYCLIC)) { - bezt = nu->bezt; - } + const int resolution = (for_render && cu->resolu_ren != 0) ? cu->resolu_ren : nu->resolu; + const bool is_cyclic = nu->flagu & CU_NURB_CYCLIC; + const BezTriple *bezt_first = &nu->bezt[0]; + const BezTriple *bezt_last = &nu->bezt[nu->pntsu - 1]; + if (nu->type == CU_BEZIER) { + int samples_len = 0; + for (int i = 1; i < nu->pntsu; i++) { + const BezTriple *prevbezt = &nu->bezt[i - 1]; + const BezTriple *bezt = &nu->bezt[i]; if (prevbezt->h2 == HD_VECT && bezt->h1 == HD_VECT) { - len++; + samples_len++; } else { - len += resolu; + samples_len += resolution; } - - if (a == 0 && (nu->flagu & CU_NURB_CYCLIC) == 0) { - len++; + } + if (is_cyclic) { + /* If the curve is cyclic, sample the last edge between the last and first points. */ + if (bezt_first->h1 == HD_VECT && bezt_last->h2 == HD_VECT) { + samples_len++; } - - prevbezt = bezt; - bezt++; + else { + samples_len += resolution; + } + } + else { + /* Otherwise, we only need one additional sample to complete the last edge. */ + samples_len++; } - dl = MEM_callocN(sizeof(DispList), "makeDispListbez"); - /* len+1 because of 'forward_diff_bezier' function */ - dl->verts = MEM_mallocN((len + 1) * sizeof(float[3]), "dlverts"); - BLI_addtail(dispbase, dl); + /* Check that there are more than two points so the curve doesn't loop back on itself. This + * needs to be separate from `is_cyclic` because cyclic sampling can work with two points + * and resolution > 1. */ + const bool use_cyclic_sample = is_cyclic && (samples_len != 2); + + DispList *dl = MEM_callocN(sizeof(DispList), __func__); + /* Add one to the length because of 'BKE_curve_forward_diff_bezier'. */ + dl->verts = MEM_mallocN(sizeof(float[3]) * (samples_len + 1), "dlverts"); + BLI_addtail(r_dispbase, dl); dl->parts = 1; - dl->nr = len; + dl->nr = samples_len; dl->col = nu->mat_nr; dl->charidx = nu->charidx; - data = dl->verts; + dl->type = use_cyclic_sample ? DL_POLY : DL_SEGM; - /* check that (len != 2) so we don't immediately loop back on ourselves */ - if (nu->flagu & CU_NURB_CYCLIC && (dl->nr != 2)) { - dl->type = DL_POLY; - a = nu->pntsu; - } - else { - dl->type = DL_SEGM; - a = nu->pntsu - 1; - } - - prevbezt = nu->bezt; - bezt = prevbezt + 1; - - while (a--) { - if (a == 0 && dl->type == DL_POLY) { - bezt = nu->bezt; - } + float *data = dl->verts; + for (int i = 1; i < nu->pntsu; i++) { + const BezTriple *prevbezt = &nu->bezt[i - 1]; + const BezTriple *bezt = &nu->bezt[i]; if (prevbezt->h2 == HD_VECT && bezt->h1 == HD_VECT) { copy_v3_v3(data, prevbezt->vec[1]); data += 3; } else { - int j; - for (j = 0; j < 3; j++) { + for (int j = 0; j < 3; j++) { BKE_curve_forward_diff_bezier(prevbezt->vec[1][j], prevbezt->vec[2][j], bezt->vec[0][j], bezt->vec[1][j], data + j, - resolu, + resolution, sizeof(float[3])); } - - data += 3 * resolu; + data += 3 * resolution; } - - if (a == 0 && dl->type == DL_SEGM) { - copy_v3_v3(data, bezt->vec[1]); + } + if (is_cyclic) { + if (bezt_first->h1 == HD_VECT && bezt_last->h2 == HD_VECT) { + copy_v3_v3(data, bezt_last->vec[1]); } - - prevbezt = bezt; - bezt++; + else { + for (int j = 0; j < 3; j++) { + BKE_curve_forward_diff_bezier(bezt_last->vec[1][j], + bezt_last->vec[2][j], + bezt_first->vec[0][j], + bezt_first->vec[1][j], + data + j, + resolution, + sizeof(float[3])); + } + } + } + else { + copy_v3_v3(data, bezt_last->vec[1]); } } else if (nu->type == CU_NURBS) { - len = (resolu * SEGMENTSU(nu)); - - dl = MEM_callocN(sizeof(DispList), "makeDispListsurf"); + const int len = (resolution * SEGMENTSU(nu)); + DispList *dl = MEM_callocN(sizeof(DispList), __func__); dl->verts = MEM_mallocN(len * sizeof(float[3]), "dlverts"); - BLI_addtail(dispbase, dl); + BLI_addtail(r_dispbase, dl); dl->parts = 1; - dl->nr = len; dl->col = nu->mat_nr; dl->charidx = nu->charidx; + dl->type = is_cyclic ? DL_POLY : DL_SEGM; - data = dl->verts; - if (nu->flagu & CU_NURB_CYCLIC) { - dl->type = DL_POLY; - } - else { - dl->type = DL_SEGM; - } - BKE_nurb_makeCurve(nu, data, NULL, NULL, NULL, resolu, sizeof(float[3])); + BKE_nurb_makeCurve(nu, dl->verts, NULL, NULL, NULL, resolution, sizeof(float[3])); } else if (nu->type == CU_POLY) { - len = nu->pntsu; - dl = MEM_callocN(sizeof(DispList), "makeDispListpoly"); + const int len = nu->pntsu; + DispList *dl = MEM_callocN(sizeof(DispList), __func__); dl->verts = MEM_mallocN(len * sizeof(float[3]), "dlverts"); - BLI_addtail(dispbase, dl); + BLI_addtail(r_dispbase, dl); dl->parts = 1; dl->nr = len; dl->col = nu->mat_nr; dl->charidx = nu->charidx; + dl->type = (is_cyclic && (dl->nr != 2)) ? DL_POLY : DL_SEGM; - data = dl->verts; - if ((nu->flagu & CU_NURB_CYCLIC) && (dl->nr != 2)) { - dl->type = DL_POLY; - } - else { - dl->type = DL_SEGM; - } - - a = len; - bp = nu->bp; - while (a--) { - copy_v3_v3(data, bp->vec); - bp++; - data += 3; + float(*coords)[3] = (float(*)[3])dl->verts; + for (int i = 0; i < len; i++) { + const BPoint *bp = &nu->bp[i]; + copy_v3_v3(coords[i], bp->vec); } } } @@ -461,22 +436,11 @@ static void curve_to_displist(Curve *cu, * This is also used to initialize #DispList.nors (one normal per display list). * \param flipnormal: Flip the normal (same as passing \a normal_proj negated) */ -void BKE_displist_fill(ListBase *dispbase, +void BKE_displist_fill(const ListBase *dispbase, ListBase *to, const float normal_proj[3], - const bool flipnormal) + const bool flip_normal) { - ScanFillContext sf_ctx; - ScanFillVert *sf_vert, *sf_vert_new, *sf_vert_last; - ScanFillFace *sf_tri; - MemArena *sf_arena; - DispList *dlnew = NULL; - float *f1; - int colnr = 0, charidx = 0, cont = 1, tot, a, *index, nextcol = 0; - int totvert; - const int scanfill_flag = BLI_SCANFILL_CALC_REMOVE_DOUBLES | BLI_SCANFILL_CALC_POLYS | - BLI_SCANFILL_CALC_HOLES; - if (dispbase == NULL) { return; } @@ -484,45 +448,48 @@ void BKE_displist_fill(ListBase *dispbase, return; } - sf_arena = BLI_memarena_new(BLI_SCANFILL_ARENA_SIZE, __func__); + const int scanfill_flag = BLI_SCANFILL_CALC_REMOVE_DOUBLES | BLI_SCANFILL_CALC_POLYS | + BLI_SCANFILL_CALC_HOLES; - while (cont) { - int dl_flag_accum = 0; - int dl_rt_accum = 0; - cont = 0; - totvert = 0; - nextcol = 0; + MemArena *sf_arena = BLI_memarena_new(BLI_SCANFILL_ARENA_SIZE, __func__); + short colnr = 0; + int charidx = 0; + bool should_continue = true; + while (should_continue) { + should_continue = false; + bool nextcol = false; + + ScanFillContext sf_ctx; BLI_scanfill_begin_arena(&sf_ctx, sf_arena); - LISTBASE_FOREACH (DispList *, dl, dispbase) { + int totvert = 0; + short dl_flag_accum = 0; + short dl_rt_accum = 0; + LISTBASE_FOREACH (const DispList *, dl, dispbase) { if (dl->type == DL_POLY) { if (charidx < dl->charidx) { - cont = 1; + should_continue = true; } else if (charidx == dl->charidx) { /* character with needed index */ if (colnr == dl->col) { sf_ctx.poly_nr++; - /* make editverts and edges */ - f1 = dl->verts; - a = dl->nr; - sf_vert = sf_vert_new = NULL; - - while (a--) { + /* Make verts and edges. */ + ScanFillVert *sf_vert = NULL; + ScanFillVert *sf_vert_last = NULL; + ScanFillVert *sf_vert_new = NULL; + for (int i = 0; i < dl->nr; i++) { sf_vert_last = sf_vert; - - sf_vert = BLI_scanfill_vert_add(&sf_ctx, f1); + sf_vert = BLI_scanfill_vert_add(&sf_ctx, &dl->verts[3 * i]); totvert++; - if (sf_vert_last == NULL) { sf_vert_new = sf_vert; } else { BLI_scanfill_edge_add(&sf_ctx, sf_vert_last, sf_vert); } - f1 += 3; } if (sf_vert != NULL && sf_vert_new != NULL) { @@ -531,8 +498,8 @@ void BKE_displist_fill(ListBase *dispbase, } else if (colnr < dl->col) { /* got poly with next material at current char */ - cont = 1; - nextcol = 1; + should_continue = true; + nextcol = true; } } dl_flag_accum |= dl->flag; @@ -540,59 +507,33 @@ void BKE_displist_fill(ListBase *dispbase, } } - /* XXX (obedit && obedit->actcol) ? (obedit->actcol - 1) : 0)) { */ - if (totvert && (tot = BLI_scanfill_calc_ex(&sf_ctx, scanfill_flag, normal_proj))) { - if (tot) { - dlnew = MEM_callocN(sizeof(DispList), "filldisplist"); - dlnew->type = DL_INDEX3; - dlnew->flag = (dl_flag_accum & (DL_BACK_CURVE | DL_FRONT_CURVE)); - dlnew->rt = (dl_rt_accum & CU_SMOOTH); - dlnew->col = colnr; - dlnew->nr = totvert; - dlnew->parts = tot; + const int triangles_len = BLI_scanfill_calc_ex(&sf_ctx, scanfill_flag, normal_proj); + if (totvert != 0 && triangles_len != 0) { + DispList *dlnew = MEM_callocN(sizeof(DispList), "filldisplist"); + dlnew->type = DL_INDEX3; + dlnew->flag = (dl_flag_accum & (DL_BACK_CURVE | DL_FRONT_CURVE)); + dlnew->rt = (dl_rt_accum & CU_SMOOTH); + dlnew->col = colnr; + dlnew->nr = totvert; + dlnew->parts = triangles_len; - dlnew->index = MEM_mallocN(sizeof(int[3]) * tot, "dlindex"); - dlnew->verts = MEM_mallocN(sizeof(float[3]) * totvert, "dlverts"); + dlnew->index = MEM_mallocN(sizeof(int[3]) * triangles_len, "dlindex"); + dlnew->verts = MEM_mallocN(sizeof(float[3]) * totvert, "dlverts"); - if (normal_proj != NULL) { - /* Use a single normal for #DL_INDEX3. - * Counter intuitively, the normal must always be the flipped projection vector. */ - dlnew->nors = MEM_mallocN(sizeof(float[3]), "dlnors"); - if (flipnormal) { - copy_v3_v3(dlnew->nors, normal_proj); - } - else { - negate_v3_v3(dlnew->nors, normal_proj); - } - } + /* vert data */ + int i; + LISTBASE_FOREACH_INDEX (ScanFillVert *, sf_vert, &sf_ctx.fillvertbase, i) { + copy_v3_v3(&dlnew->verts[3 * i], sf_vert->co); + sf_vert->tmp.i = i; /* Index number. */ + } - /* vert data */ - f1 = dlnew->verts; - totvert = 0; - - for (sf_vert = sf_ctx.fillvertbase.first; sf_vert; sf_vert = sf_vert->next) { - copy_v3_v3(f1, sf_vert->co); - f1 += 3; - - /* index number */ - sf_vert->tmp.i = totvert; - totvert++; - } - - /* index data */ - - index = dlnew->index; - for (sf_tri = sf_ctx.fillfacebase.first; sf_tri; sf_tri = sf_tri->next) { - index[0] = sf_tri->v1->tmp.i; - index[1] = sf_tri->v2->tmp.i; - index[2] = sf_tri->v3->tmp.i; - - if (flipnormal) { - SWAP(int, index[0], index[2]); - } - - index += 3; - } + /* index data */ + int *index = dlnew->index; + LISTBASE_FOREACH (ScanFillFace *, sf_tri, &sf_ctx.fillfacebase) { + index[0] = sf_tri->v1->tmp.i; + index[1] = flip_normal ? sf_tri->v3->tmp.i : sf_tri->v2->tmp.i; + index[2] = flip_normal ? sf_tri->v2->tmp.i : sf_tri->v3->tmp.i; + index += 3; } BLI_addhead(to, dlnew); @@ -611,27 +552,21 @@ void BKE_displist_fill(ListBase *dispbase, } BLI_memarena_free(sf_arena); - /* do not free polys, needed for wireframe display */ } -static void bevels_to_filledpoly(Curve *cu, ListBase *dispbase) +static void bevels_to_filledpoly(const Curve *cu, ListBase *dispbase) { - const float z_up[3] = {0.0f, 0.0f, -1.0f}; - ListBase front, back; - float *fp, *fp1; - int a, dpoly; + ListBase front = {NULL, NULL}; + ListBase back = {NULL, NULL}; - BLI_listbase_clear(&front); - BLI_listbase_clear(&back); - - LISTBASE_FOREACH (DispList *, dl, dispbase) { + LISTBASE_FOREACH (const DispList *, dl, dispbase) { if (dl->type == DL_SURF) { if ((dl->flag & DL_CYCL_V) && (dl->flag & DL_CYCL_U) == 0) { if ((cu->flag & CU_BACK) && (dl->flag & DL_BACK_CURVE)) { - DispList *dlnew = MEM_callocN(sizeof(DispList), "filldisp"); + DispList *dlnew = MEM_callocN(sizeof(DispList), __func__); BLI_addtail(&front, dlnew); - dlnew->verts = fp1 = MEM_mallocN(sizeof(float[3]) * dl->parts, "filldisp1"); + dlnew->verts = MEM_mallocN(sizeof(float[3]) * dl->parts, __func__); dlnew->nr = dl->parts; dlnew->parts = 1; dlnew->type = DL_POLY; @@ -639,20 +574,18 @@ static void bevels_to_filledpoly(Curve *cu, ListBase *dispbase) dlnew->col = dl->col; dlnew->charidx = dl->charidx; - fp = dl->verts; - dpoly = 3 * dl->nr; - - a = dl->parts; - while (a--) { - copy_v3_v3(fp1, fp); - fp1 += 3; - fp += dpoly; + const float *old_verts = dl->verts; + float *new_verts = dlnew->verts; + for (int i = 0; i < dl->parts; i++) { + copy_v3_v3(new_verts, old_verts); + new_verts += 3; + old_verts += 3 * dl->nr; } } if ((cu->flag & CU_FRONT) && (dl->flag & DL_FRONT_CURVE)) { - DispList *dlnew = MEM_callocN(sizeof(DispList), "filldisp"); + DispList *dlnew = MEM_callocN(sizeof(DispList), __func__); BLI_addtail(&back, dlnew); - dlnew->verts = fp1 = MEM_mallocN(sizeof(float[3]) * dl->parts, "filldisp1"); + dlnew->verts = MEM_mallocN(sizeof(float[3]) * dl->parts, __func__); dlnew->nr = dl->parts; dlnew->parts = 1; dlnew->type = DL_POLY; @@ -660,20 +593,19 @@ static void bevels_to_filledpoly(Curve *cu, ListBase *dispbase) dlnew->col = dl->col; dlnew->charidx = dl->charidx; - fp = dl->verts + 3 * (dl->nr - 1); - dpoly = 3 * dl->nr; - - a = dl->parts; - while (a--) { - copy_v3_v3(fp1, fp); - fp1 += 3; - fp += dpoly; + const float *old_verts = dl->verts + 3 * (dl->nr - 1); + float *new_verts = dlnew->verts; + for (int i = 0; i < dl->parts; i++) { + copy_v3_v3(new_verts, old_verts); + new_verts += 3; + old_verts += 3 * dl->nr; } } } } } + const float z_up[3] = {0.0f, 0.0f, -1.0f}; BKE_displist_fill(&front, dispbase, z_up, true); BKE_displist_fill(&back, dispbase, z_up, false); @@ -838,8 +770,12 @@ static ModifierData *curve_get_tessellate_point(Scene *scene, } /* Return true if any modifier was applied. */ -static bool curve_calc_modifiers_pre( - Depsgraph *depsgraph, Scene *scene, Object *ob, ListBase *nurb, const bool for_render) +bool BKE_curve_calc_modifiers_pre(Depsgraph *depsgraph, + Scene *scene, + Object *ob, + ListBase *source_nurb, + ListBase *target_nurb, + const bool for_render) { VirtualModifierData virtualModifierData; ModifierData *md = BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData); @@ -878,13 +814,13 @@ static bool curve_calc_modifiers_pre( keyVerts = BKE_key_evaluate_object(ob, &numElems); if (keyVerts) { - BLI_assert(BKE_keyblock_curve_element_count(nurb) == numElems); + BLI_assert(BKE_keyblock_curve_element_count(source_nurb) == numElems); /* split coords from key data, the latter also includes * tilts, which is passed through in the modifier stack. * this is also the reason curves do not use a virtual * shape key modifier yet. */ - deformedVerts = BKE_curve_nurbs_key_vert_coords_alloc(nurb, keyVerts, &numVerts); + deformedVerts = BKE_curve_nurbs_key_vert_coords_alloc(source_nurb, keyVerts, &numVerts); } } @@ -900,7 +836,7 @@ static bool curve_calc_modifiers_pre( } if (!deformedVerts) { - deformedVerts = BKE_curve_nurbs_vert_coords_alloc(nurb, &numVerts); + deformedVerts = BKE_curve_nurbs_vert_coords_alloc(source_nurb, &numVerts); } mti->deformVerts(md, &mectx, NULL, deformedVerts, numVerts); @@ -913,11 +849,11 @@ static bool curve_calc_modifiers_pre( } if (deformedVerts) { - BKE_curve_nurbs_vert_coords_apply(nurb, deformedVerts, false); + BKE_curve_nurbs_vert_coords_apply(target_nurb, deformedVerts, false); MEM_freeN(deformedVerts); } if (keyVerts) { /* these are not passed through modifier stack */ - BKE_curve_nurbs_key_vert_tilts_apply(nurb, keyVerts); + BKE_curve_nurbs_key_vert_tilts_apply(target_nurb, keyVerts); } if (keyVerts) { @@ -1219,7 +1155,8 @@ void BKE_displist_make_surf(Depsgraph *depsgraph, } if (!for_orco) { - force_mesh_conversion = curve_calc_modifiers_pre(depsgraph, scene, ob, &nubase, for_render); + force_mesh_conversion = BKE_curve_calc_modifiers_pre( + depsgraph, scene, ob, &nubase, &nubase, for_render); } LISTBASE_FOREACH (Nurb *, nu, &nubase) { @@ -1569,7 +1506,8 @@ static void do_makeDispListCurveTypes(Depsgraph *depsgraph, } if (!for_orco) { - force_mesh_conversion = curve_calc_modifiers_pre(depsgraph, scene, ob, &nubase, for_render); + force_mesh_conversion = BKE_curve_calc_modifiers_pre( + depsgraph, scene, ob, &nubase, &nubase, for_render); } BKE_curve_bevelList_make(ob, &nubase, for_render); @@ -1579,7 +1517,7 @@ static void do_makeDispListCurveTypes(Depsgraph *depsgraph, /* no bevel or extrude, and no width correction? */ if (!dlbev.first && cu->width == 1.0f) { - curve_to_displist(cu, &nubase, dispbase, for_render); + curve_to_displist(cu, &nubase, for_render, dispbase); } else { const float widfac = cu->width - 1.0f; diff --git a/source/blender/blenkernel/intern/fmodifier.c b/source/blender/blenkernel/intern/fmodifier.c index d0018a556ba..8d1e6b26d4d 100644 --- a/source/blender/blenkernel/intern/fmodifier.c +++ b/source/blender/blenkernel/intern/fmodifier.c @@ -32,6 +32,7 @@ #include "CLG_log.h" #include "DNA_anim_types.h" +#include "DNA_screen_types.h" #include "BLT_translation.h" @@ -1133,7 +1134,7 @@ FModifier *add_fmodifier(ListBase *modifiers, int type, FCurve *owner_fcu) /* add modifier itself */ fcm = MEM_callocN(sizeof(FModifier), "F-Curve Modifier"); fcm->type = type; - fcm->flag = FMODIFIER_FLAG_EXPANDED; + fcm->ui_expand_flag = UI_PANEL_DATA_EXPAND_ROOT; /* Expand the main panel, not the sub-panels. */ fcm->curve = owner_fcu; fcm->influence = 1.0f; BLI_addtail(modifiers, fcm); diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c index 25a0259abe3..febc9e24c9f 100644 --- a/source/blender/blenkernel/intern/font.c +++ b/source/blender/blenkernel/intern/font.c @@ -169,6 +169,7 @@ IDTypeInfo IDType_ID_VF = { .make_local = NULL, .foreach_id = NULL, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = vfont_blend_write, .blend_read_data = vfont_blend_read_data, diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc index dae0b757df0..0274dfdbd1c 100644 --- a/source/blender/blenkernel/intern/geometry_set.cc +++ b/source/blender/blenkernel/intern/geometry_set.cc @@ -14,19 +14,28 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#include "BLI_map.hh" + +#include "BKE_attribute.h" +#include "BKE_attribute_access.hh" #include "BKE_geometry_set.hh" #include "BKE_lib_id.h" #include "BKE_mesh.h" #include "BKE_mesh_wrapper.h" +#include "BKE_modifier.h" #include "BKE_pointcloud.h" #include "BKE_volume.h" +#include "DNA_collection_types.h" #include "DNA_object_types.h" +#include "BLI_rand.hh" + #include "MEM_guardedalloc.h" using blender::float3; using blender::float4x4; +using blender::Map; using blender::MutableSpan; using blender::Span; using blender::StringRef; @@ -151,6 +160,18 @@ void GeometrySet::add(const GeometryComponent &component) components_.add_new(component.type(), std::move(component_ptr)); } +/** + * Get all geometry components in this geometry set for read-only access. + */ +Vector GeometrySet::get_components_for_read() const +{ + Vector components; + for (const GeometryComponentPtr &ptr : components_.values()) { + components.append(ptr.get()); + } + return components; +} + void GeometrySet::compute_boundbox_without_instances(float3 *r_min, float3 *r_max) const { const PointCloud *pointcloud = this->get_pointcloud_for_read(); @@ -377,6 +398,17 @@ void MeshComponent::copy_vertex_group_names_from_object(const Object &object) } } +const blender::Map &MeshComponent::vertex_group_names() const +{ + return vertex_group_names_; +} + +/* This is only exposed for the internal attribute API. */ +blender::Map &MeshComponent::vertex_group_names() +{ + return vertex_group_names_; +} + /* Get the mesh from this component. This method can be used by multiple threads at the same * time. Therefore, the returned mesh should not be modified. No ownership is transferred. */ const Mesh *MeshComponent::get_for_read() const @@ -566,6 +598,68 @@ bool InstancesComponent::is_empty() const return transforms_.size() == 0; } +static blender::Array generate_unique_instance_ids(Span original_ids) +{ + using namespace blender; + Array unique_ids(original_ids.size()); + + Set used_unique_ids; + used_unique_ids.reserve(original_ids.size()); + Vector instances_with_id_collision; + for (const int instance_index : original_ids.index_range()) { + const int original_id = original_ids[instance_index]; + if (used_unique_ids.add(original_id)) { + /* The original id has not been used by another instance yet. */ + unique_ids[instance_index] = original_id; + } + else { + /* The original id of this instance collided with a previous instance, it needs to be looked + * at again in a second pass. Don't generate a new random id here, because this might collide + * with other existing ids. */ + instances_with_id_collision.append(instance_index); + } + } + + Map generator_by_original_id; + for (const int instance_index : instances_with_id_collision) { + const int original_id = original_ids[instance_index]; + RandomNumberGenerator &rng = generator_by_original_id.lookup_or_add_cb(original_id, [&]() { + RandomNumberGenerator rng; + rng.seed_random(original_id); + return rng; + }); + + const int max_iteration = 100; + for (int iteration = 0;; iteration++) { + /* Try generating random numbers until an unused one has been found. */ + const int random_id = rng.get_int32(); + if (used_unique_ids.add(random_id)) { + /* This random id is not used by another instance. */ + unique_ids[instance_index] = random_id; + break; + } + if (iteration == max_iteration) { + /* It seems to be very unlikely that we ever run into this case (assuming there are less + * than 2^30 instances). However, if that happens, it's better to use an id that is not + * unique than to be stuck in an infinite loop. */ + unique_ids[instance_index] = original_id; + break; + } + } + } + + return unique_ids; +} + +blender::Span InstancesComponent::almost_unique_ids() const +{ + std::lock_guard lock(almost_unique_ids_mutex_); + if (almost_unique_ids_.size() != ids_.size()) { + almost_unique_ids_ = generate_unique_instance_ids(ids_); + } + return almost_unique_ids_; +} + /** \} */ /* -------------------------------------------------------------------- */ @@ -663,7 +757,7 @@ bool BKE_geometry_set_has_instances(const GeometrySet *geometry_set) int BKE_geometry_set_instances(const GeometrySet *geometry_set, float (**r_transforms)[4][4], - int **r_ids, + const int **r_almost_unique_ids, InstancedData **r_instanced_data) { const InstancesComponent *component = geometry_set->get_component_for_read(); @@ -671,9 +765,8 @@ int BKE_geometry_set_instances(const GeometrySet *geometry_set, return 0; } *r_transforms = (float(*)[4][4])component->transforms().data(); - *r_ids = (int *)component->ids().data(); - *r_instanced_data = (InstancedData *)component->instanced_data().data(); *r_instanced_data = (InstancedData *)component->instanced_data().data(); + *r_almost_unique_ids = (const int *)component->almost_unique_ids().data(); return component->instances_amount(); } diff --git a/source/blender/blenkernel/intern/geometry_set_instances.cc b/source/blender/blenkernel/intern/geometry_set_instances.cc new file mode 100644 index 00000000000..1a260c5d48e --- /dev/null +++ b/source/blender/blenkernel/intern/geometry_set_instances.cc @@ -0,0 +1,451 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "BKE_geometry_set_instances.hh" +#include "BKE_mesh.h" +#include "BKE_mesh_wrapper.h" +#include "BKE_modifier.h" +#include "BKE_pointcloud.h" + +#include "DNA_collection_types.h" +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_object_types.h" +#include "DNA_pointcloud_types.h" + +namespace blender::bke { + +static void geometry_set_collect_recursive(const GeometrySet &geometry_set, + const float4x4 &transform, + Vector &r_sets); + +static void geometry_set_collect_recursive_collection(const Collection &collection, + const float4x4 &transform, + Vector &r_sets); + +/** + * \note This doesn't extract instances from the "dupli" system for non-geometry-nodes instances. + */ +static GeometrySet object_get_geometry_set_for_read(const Object &object) +{ + /* Objects evaluated with a nodes modifier will have a geometry set already. */ + if (object.runtime.geometry_set_eval != nullptr) { + return *object.runtime.geometry_set_eval; + } + + /* Otherwise, construct a new geometry set with the component based on the object type. */ + GeometrySet new_geometry_set; + + if (object.type == OB_MESH) { + Mesh *mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object( + &const_cast(object), false); + + if (mesh != nullptr) { + BKE_mesh_wrapper_ensure_mdata(mesh); + + MeshComponent &mesh_component = new_geometry_set.get_component_for_write(); + mesh_component.replace(mesh, GeometryOwnershipType::ReadOnly); + mesh_component.copy_vertex_group_names_from_object(object); + } + } + + /* TODO: Cover the case of point-clouds without modifiers-- they may not be covered by the + * #geometry_set_eval case above. */ + + /* TODO: Add volume support. */ + + /* Return by value since there is not always an existing geometry set owned elsewhere to use. */ + return new_geometry_set; +} + +static void geometry_set_collect_recursive_collection_instance( + const Collection &collection, const float4x4 &transform, Vector &r_sets) +{ + float4x4 offset_matrix; + unit_m4(offset_matrix.values); + sub_v3_v3(offset_matrix.values[3], collection.instance_offset); + const float4x4 instance_transform = transform * offset_matrix; + geometry_set_collect_recursive_collection(collection, instance_transform, r_sets); +} + +static void geometry_set_collect_recursive_object(const Object &object, + const float4x4 &transform, + Vector &r_sets) +{ + GeometrySet instance_geometry_set = object_get_geometry_set_for_read(object); + geometry_set_collect_recursive(instance_geometry_set, transform, r_sets); + + if (object.type == OB_EMPTY) { + const Collection *collection_instance = object.instance_collection; + if (collection_instance != nullptr) { + geometry_set_collect_recursive_collection_instance(*collection_instance, transform, r_sets); + } + } +} + +static void geometry_set_collect_recursive_collection(const Collection &collection, + const float4x4 &transform, + Vector &r_sets) +{ + LISTBASE_FOREACH (const CollectionObject *, collection_object, &collection.gobject) { + BLI_assert(collection_object->ob != nullptr); + const Object &object = *collection_object->ob; + const float4x4 object_transform = transform * object.obmat; + geometry_set_collect_recursive_object(object, object_transform, r_sets); + } + LISTBASE_FOREACH (const CollectionChild *, collection_child, &collection.children) { + BLI_assert(collection_child->collection != nullptr); + const Collection &collection = *collection_child->collection; + geometry_set_collect_recursive_collection(collection, transform, r_sets); + } +} + +static void geometry_set_collect_recursive(const GeometrySet &geometry_set, + const float4x4 &transform, + Vector &r_sets) +{ + r_sets.append({geometry_set, {transform}}); + + if (geometry_set.has_instances()) { + const InstancesComponent &instances_component = + *geometry_set.get_component_for_read(); + + Span transforms = instances_component.transforms(); + Span instances = instances_component.instanced_data(); + for (const int i : instances.index_range()) { + const InstancedData &data = instances[i]; + const float4x4 instance_transform = transform * transforms[i]; + + if (data.type == INSTANCE_DATA_TYPE_OBJECT) { + BLI_assert(data.data.object != nullptr); + const Object &object = *data.data.object; + geometry_set_collect_recursive_object(object, instance_transform, r_sets); + } + else if (data.type == INSTANCE_DATA_TYPE_COLLECTION) { + BLI_assert(data.data.collection != nullptr); + const Collection &collection = *data.data.collection; + geometry_set_collect_recursive_collection_instance(collection, instance_transform, r_sets); + } + } + } +} + +/** + * Return flattened vector of the geometry component's recursive instances. I.e. all collection + * instances and object instances will be expanded into the instances of their geometry components. + * Even the instances in those geometry components' will be included. + * + * \note For convenience (to avoid duplication in the caller), the returned vector also contains + * the argument geometry set. + * + * \note This doesn't extract instances from the "dupli" system for non-geometry-nodes instances. + */ +Vector geometry_set_gather_instances(const GeometrySet &geometry_set) +{ + Vector result_vector; + + float4x4 unit_transform; + unit_m4(unit_transform.values); + + geometry_set_collect_recursive(geometry_set, unit_transform, result_vector); + + return result_vector; +} + +void gather_attribute_info(Map &attributes, + Span component_types, + Span set_groups, + const Set &ignored_attributes) +{ + for (const GeometryInstanceGroup &set_group : set_groups) { + const GeometrySet &set = set_group.geometry_set; + for (const GeometryComponentType component_type : component_types) { + if (!set.has(component_type)) { + continue; + } + const GeometryComponent &component = *set.get_component_for_read(component_type); + + component.attribute_foreach([&](StringRefNull name, const AttributeMetaData &meta_data) { + if (ignored_attributes.contains(name)) { + return true; + } + auto add_info = [&](AttributeKind *attribute_kind) { + attribute_kind->domain = meta_data.domain; + attribute_kind->data_type = meta_data.data_type; + }; + auto modify_info = [&](AttributeKind *attribute_kind) { + attribute_kind->domain = meta_data.domain; /* TODO: Use highest priority domain. */ + attribute_kind->data_type = bke::attribute_data_type_highest_complexity( + {attribute_kind->data_type, meta_data.data_type}); + }; + + attributes.add_or_modify(name, add_info, modify_info); + return true; + }); + } + } +} + +static Mesh *join_mesh_topology_and_builtin_attributes(Span set_groups, + const bool convert_points_to_vertices) +{ + int totverts = 0; + int totloops = 0; + int totedges = 0; + int totpolys = 0; + int64_t cd_dirty_vert = 0; + int64_t cd_dirty_poly = 0; + int64_t cd_dirty_edge = 0; + int64_t cd_dirty_loop = 0; + for (const GeometryInstanceGroup &set_group : set_groups) { + const GeometrySet &set = set_group.geometry_set; + const int tot_transforms = set_group.transforms.size(); + if (set.has_mesh()) { + const Mesh &mesh = *set.get_mesh_for_read(); + totverts += mesh.totvert * tot_transforms; + totloops += mesh.totloop * tot_transforms; + totedges += mesh.totedge * tot_transforms; + totpolys += mesh.totpoly * tot_transforms; + cd_dirty_vert |= mesh.runtime.cd_dirty_vert; + cd_dirty_poly |= mesh.runtime.cd_dirty_poly; + cd_dirty_edge |= mesh.runtime.cd_dirty_edge; + cd_dirty_loop |= mesh.runtime.cd_dirty_loop; + } + if (convert_points_to_vertices && set.has_pointcloud()) { + const PointCloud &pointcloud = *set.get_pointcloud_for_read(); + totverts += pointcloud.totpoint * tot_transforms; + } + } + + Mesh *new_mesh = BKE_mesh_new_nomain(totverts, totedges, 0, totloops, totpolys); + /* Copy settings from the first input geometry set with a mesh. */ + for (const GeometryInstanceGroup &set_group : set_groups) { + const GeometrySet &set = set_group.geometry_set; + if (set.has_mesh()) { + const Mesh &mesh = *set.get_mesh_for_read(); + BKE_mesh_copy_settings(new_mesh, &mesh); + break; + } + } + new_mesh->runtime.cd_dirty_vert = cd_dirty_vert; + new_mesh->runtime.cd_dirty_poly = cd_dirty_poly; + new_mesh->runtime.cd_dirty_edge = cd_dirty_edge; + new_mesh->runtime.cd_dirty_loop = cd_dirty_loop; + + int vert_offset = 0; + int loop_offset = 0; + int edge_offset = 0; + int poly_offset = 0; + for (const GeometryInstanceGroup &set_group : set_groups) { + const GeometrySet &set = set_group.geometry_set; + if (set.has_mesh()) { + const Mesh &mesh = *set.get_mesh_for_read(); + for (const float4x4 &transform : set_group.transforms) { + for (const int i : IndexRange(mesh.totvert)) { + const MVert &old_vert = mesh.mvert[i]; + MVert &new_vert = new_mesh->mvert[vert_offset + i]; + + new_vert = old_vert; + + const float3 new_position = transform * float3(old_vert.co); + copy_v3_v3(new_vert.co, new_position); + } + for (const int i : IndexRange(mesh.totedge)) { + const MEdge &old_edge = mesh.medge[i]; + MEdge &new_edge = new_mesh->medge[edge_offset + i]; + new_edge = old_edge; + new_edge.v1 += vert_offset; + new_edge.v2 += vert_offset; + } + for (const int i : IndexRange(mesh.totloop)) { + const MLoop &old_loop = mesh.mloop[i]; + MLoop &new_loop = new_mesh->mloop[loop_offset + i]; + new_loop = old_loop; + new_loop.v += vert_offset; + new_loop.e += edge_offset; + } + for (const int i : IndexRange(mesh.totpoly)) { + const MPoly &old_poly = mesh.mpoly[i]; + MPoly &new_poly = new_mesh->mpoly[poly_offset + i]; + new_poly = old_poly; + new_poly.loopstart += loop_offset; + } + + vert_offset += mesh.totvert; + loop_offset += mesh.totloop; + edge_offset += mesh.totedge; + poly_offset += mesh.totpoly; + } + } + if (convert_points_to_vertices && set.has_pointcloud()) { + const PointCloud &pointcloud = *set.get_pointcloud_for_read(); + for (const float4x4 &transform : set_group.transforms) { + for (const int i : IndexRange(pointcloud.totpoint)) { + MVert &new_vert = new_mesh->mvert[vert_offset + i]; + const float3 old_position = pointcloud.co[i]; + const float3 new_position = transform * old_position; + copy_v3_v3(new_vert.co, new_position); + } + vert_offset += pointcloud.totpoint; + } + } + } + + return new_mesh; +} + +static void join_attributes(Span set_groups, + Span component_types, + const Map &attribute_info, + GeometryComponent &result) +{ + for (Map::Item entry : attribute_info.items()) { + StringRef name = entry.key; + const AttributeDomain domain_output = entry.value.domain; + const CustomDataType data_type_output = entry.value.data_type; + const CPPType *cpp_type = bke::custom_data_type_to_cpp_type(data_type_output); + BLI_assert(cpp_type != nullptr); + + result.attribute_try_create(entry.key, domain_output, data_type_output); + WriteAttributePtr write_attribute = result.attribute_try_get_for_write(name); + if (!write_attribute || &write_attribute->cpp_type() != cpp_type || + write_attribute->domain() != domain_output) { + continue; + } + fn::GMutableSpan dst_span = write_attribute->get_span_for_write_only(); + + int offset = 0; + for (const GeometryInstanceGroup &set_group : set_groups) { + const GeometrySet &set = set_group.geometry_set; + for (const GeometryComponentType component_type : component_types) { + if (set.has(component_type)) { + const GeometryComponent &component = *set.get_component_for_read(component_type); + const int domain_size = component.attribute_domain_size(domain_output); + if (domain_size == 0) { + continue; /* Domain size is 0, so no need to increment the offset. */ + } + ReadAttributePtr source_attribute = component.attribute_try_get_for_read( + name, domain_output, data_type_output); + + if (source_attribute) { + fn::GSpan src_span = source_attribute->get_span(); + const void *src_buffer = src_span.data(); + for (const int UNUSED(i) : set_group.transforms.index_range()) { + void *dst_buffer = dst_span[offset]; + cpp_type->copy_to_initialized_n(src_buffer, dst_buffer, domain_size); + offset += domain_size; + } + } + else { + offset += domain_size * set_group.transforms.size(); + } + } + } + } + + write_attribute->apply_span(); + } +} + +static void join_instance_groups_mesh(Span set_groups, + bool convert_points_to_vertices, + GeometrySet &result) +{ + Mesh *new_mesh = join_mesh_topology_and_builtin_attributes(set_groups, + convert_points_to_vertices); + + MeshComponent &dst_component = result.get_component_for_write(); + dst_component.replace(new_mesh); + + Vector component_types; + component_types.append(GeometryComponentType::Mesh); + if (convert_points_to_vertices) { + component_types.append(GeometryComponentType::PointCloud); + } + + /* Don't copy attributes that are stored directly in the mesh data structs. */ + Map attributes; + gather_attribute_info(attributes, component_types, set_groups, {"position", "material_index"}); + join_attributes( + set_groups, component_types, attributes, static_cast(dst_component)); +} + +static void join_instance_groups_pointcloud(Span set_groups, + GeometrySet &result) +{ + int totpoint = 0; + for (const GeometryInstanceGroup &set_group : set_groups) { + const GeometrySet &set = set_group.geometry_set; + if (set.has()) { + const PointCloudComponent &component = *set.get_component_for_read(); + totpoint += component.attribute_domain_size(ATTR_DOMAIN_POINT); + } + } + + PointCloudComponent &dst_component = result.get_component_for_write(); + PointCloud *pointcloud = BKE_pointcloud_new_nomain(totpoint); + dst_component.replace(pointcloud); + Map attributes; + gather_attribute_info(attributes, {GeometryComponentType::PointCloud}, set_groups, {}); + join_attributes(set_groups, + {GeometryComponentType::PointCloud}, + attributes, + static_cast(dst_component)); +} + +static void join_instance_groups_volume(Span set_groups, + GeometrySet &result) +{ + /* Not yet supported. Joining volume grids with the same name requires resampling of at least + * one of the grids. The cell size of the resulting volume has to be determined somehow. */ + VolumeComponent &dst_component = result.get_component_for_write(); + UNUSED_VARS(set_groups, dst_component); +} + +GeometrySet geometry_set_realize_mesh_for_modifier(const GeometrySet &geometry_set) +{ + if (!geometry_set.has_instances() && !geometry_set.has_pointcloud()) { + return geometry_set; + } + + GeometrySet new_geometry_set = geometry_set; + Vector set_groups = geometry_set_gather_instances(geometry_set); + join_instance_groups_mesh(set_groups, true, new_geometry_set); + /* Remove all instances, even though some might contain other non-mesh data. We can't really + * keep only non-mesh instances in general. */ + new_geometry_set.remove(); + /* If there was a point cloud, it is now part of the mesh. */ + new_geometry_set.remove(); + return new_geometry_set; +} + +GeometrySet geometry_set_realize_instances(const GeometrySet &geometry_set) +{ + if (!geometry_set.has_instances()) { + return geometry_set; + } + + GeometrySet new_geometry_set; + + Vector set_groups = geometry_set_gather_instances(geometry_set); + join_instance_groups_mesh(set_groups, false, new_geometry_set); + join_instance_groups_pointcloud(set_groups, new_geometry_set); + join_instance_groups_volume(set_groups, new_geometry_set); + + return new_geometry_set; +} + +} // namespace blender::bke diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c index 0c813c170ad..00dcaad83db 100644 --- a/source/blender/blenkernel/intern/gpencil.c +++ b/source/blender/blenkernel/intern/gpencil.c @@ -98,9 +98,9 @@ static void greasepencil_copy_data(Main *UNUSED(bmain), /* Apply local layer transform to all frames. Calc the active frame is not enough * because onion skin can use more frames. This is more slow but required here. */ if (gpl_dst->actframe != NULL) { - bool transfomed = ((!is_zero_v3(gpl_dst->location)) || (!is_zero_v3(gpl_dst->rotation)) || - (!is_one_v3(gpl_dst->scale))); - if (transfomed) { + bool transformed = ((!is_zero_v3(gpl_dst->location)) || (!is_zero_v3(gpl_dst->rotation)) || + (!is_one_v3(gpl_dst->scale))); + if (transformed) { loc_eul_size_to_mat4( gpl_dst->layer_mat, gpl_dst->location, gpl_dst->rotation, gpl_dst->scale); bool do_onion = ((gpl_dst->onion_flag & GP_LAYER_ONIONSKIN) != 0); @@ -322,6 +322,7 @@ IDTypeInfo IDType_ID_GD = { .make_local = NULL, .foreach_id = greasepencil_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = greasepencil_blend_write, .blend_read_data = greasepencil_blend_read_data, @@ -851,6 +852,7 @@ bGPDstroke *BKE_gpencil_stroke_new(int mat_idx, int totpoints, short thickness) gps->mat_nr = mat_idx; + gps->dvert = NULL; gps->editcurve = NULL; return gps; @@ -1133,7 +1135,7 @@ bGPdata *BKE_gpencil_data_duplicate(Main *bmain, const bGPdata *gpd_src, bool in * Ensure selection status of stroke is in sync with its points. * \param gps: Grease pencil stroke */ -void BKE_gpencil_stroke_sync_selection(bGPDstroke *gps) +void BKE_gpencil_stroke_sync_selection(bGPdata *gpd, bGPDstroke *gps) { bGPDspoint *pt; int i; @@ -1147,6 +1149,7 @@ void BKE_gpencil_stroke_sync_selection(bGPDstroke *gps) * so initially, we must deselect */ gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { if (pt->flag & GP_SPOINT_SELECT) { @@ -1154,9 +1157,13 @@ void BKE_gpencil_stroke_sync_selection(bGPDstroke *gps) break; } } + + if (gps->flag & GP_STROKE_SELECT) { + BKE_gpencil_stroke_select_index_set(gpd, gps); + } } -void BKE_gpencil_curve_sync_selection(bGPDstroke *gps) +void BKE_gpencil_curve_sync_selection(bGPdata *gpd, bGPDstroke *gps) { bGPDcurve *gpc = gps->editcurve; if (gpc == NULL) { @@ -1164,6 +1171,7 @@ void BKE_gpencil_curve_sync_selection(bGPDstroke *gps) } gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); gpc->flag &= ~GP_CURVE_SELECT; bool is_selected = false; @@ -1186,9 +1194,23 @@ void BKE_gpencil_curve_sync_selection(bGPDstroke *gps) if (is_selected) { gpc->flag |= GP_CURVE_SELECT; gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps); } } +/* Assign unique stroke ID for selection. */ +void BKE_gpencil_stroke_select_index_set(bGPdata *gpd, bGPDstroke *gps) +{ + gpd->select_last_index++; + gps->select_index = gpd->select_last_index; +} + +/* Reset unique stroke ID for selection. */ +void BKE_gpencil_stroke_select_index_reset(bGPDstroke *gps) +{ + gps->select_index = 0; +} + /* ************************************************** */ /* GP Frame API */ @@ -2511,6 +2533,11 @@ bool BKE_gpencil_from_image( pt->flag |= GP_SPOINT_SELECT; } } + + if (gps->flag & GP_STROKE_SELECT) { + BKE_gpencil_stroke_select_index_set(gpd, gps); + } + BKE_gpencil_stroke_geometry_update(gpd, gps); } } @@ -2604,8 +2631,17 @@ void BKE_gpencil_visible_stroke_iter(ViewLayer *view_layer, sta_gpf = end_gpf = NULL; /* Check the whole range and tag the editable frames. */ LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) { - if (gpf == act_gpf || (gpf->flag & GP_FRAME_SELECT)) { + if (act_gpf != NULL && (gpf == act_gpf || (gpf->flag & GP_FRAME_SELECT))) { gpf->runtime.onion_id = 0; + if (do_onion) { + if (gpf->framenum < act_gpf->framenum) { + gpf->runtime.onion_id = -1; + } + else { + gpf->runtime.onion_id = 1; + } + } + if (sta_gpf == NULL) { sta_gpf = gpf; } @@ -2892,14 +2928,14 @@ void BKE_gpencil_update_layer_transforms(const Depsgraph *depsgraph, Object *ob) } /* Calc local layer transform. */ - bool transfomed = ((!is_zero_v3(gpl->location)) || (!is_zero_v3(gpl->rotation)) || - (!is_one_v3(gpl->scale))); - if (transfomed) { + bool transformed = ((!is_zero_v3(gpl->location)) || (!is_zero_v3(gpl->rotation)) || + (!is_one_v3(gpl->scale))); + if (transformed) { loc_eul_size_to_mat4(gpl->layer_mat, gpl->location, gpl->rotation, gpl->scale); } /* only redo if any change */ - if (changed || transfomed) { + if (changed || transformed) { LISTBASE_FOREACH (bGPDstroke *, gps, &gpl->actframe->strokes) { bGPDspoint *pt; int i; @@ -2909,7 +2945,7 @@ void BKE_gpencil_update_layer_transforms(const Depsgraph *depsgraph, Object *ob) mul_m4_v3(cur_mat, &pt->x); } - if (transfomed) { + if (transformed) { mul_m4_v3(gpl->layer_mat, &pt->x); } } @@ -2939,4 +2975,26 @@ int BKE_gpencil_material_find_index_by_name_prefix(Object *ob, const char *name_ return -1; } +/* Create a hash with the list of selected frame number. */ +void BKE_gpencil_frame_selected_hash(bGPdata *gpd, struct GHash *r_list) +{ + const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd); + bGPDlayer *gpl = BKE_gpencil_layer_active_get(gpd); + + LISTBASE_FOREACH (bGPDlayer *, gpl_iter, &gpd->layers) { + if ((gpl != NULL) && (!is_multiedit) && (gpl != gpl_iter)) { + continue; + } + + LISTBASE_FOREACH (bGPDframe *, gpf, &gpl_iter->frames) { + if (((gpf == gpl->actframe) && (!is_multiedit)) || + ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) { + if (!BLI_ghash_lookup(r_list, POINTER_FROM_INT(gpf->framenum))) { + BLI_ghash_insert(r_list, POINTER_FROM_INT(gpf->framenum), gpf); + } + } + } + } +} + /** \} */ diff --git a/source/blender/blenkernel/intern/gpencil_curve.c b/source/blender/blenkernel/intern/gpencil_curve.c index be14d74de7a..88d3e917a7a 100644 --- a/source/blender/blenkernel/intern/gpencil_curve.c +++ b/source/blender/blenkernel/intern/gpencil_curve.c @@ -781,7 +781,9 @@ void BKE_gpencil_stroke_editcurve_update(bGPdata *gpd, bGPDlayer *gpl, bGPDstrok /** * Sync the selection from stroke to editcurve */ -void BKE_gpencil_editcurve_stroke_sync_selection(bGPDstroke *gps, bGPDcurve *gpc) +void BKE_gpencil_editcurve_stroke_sync_selection(bGPdata *UNUSED(gpd), + bGPDstroke *gps, + bGPDcurve *gpc) { if (gps->flag & GP_STROKE_SELECT) { gpc->flag |= GP_CURVE_SELECT; @@ -808,10 +810,11 @@ void BKE_gpencil_editcurve_stroke_sync_selection(bGPDstroke *gps, bGPDcurve *gpc /** * Sync the selection from editcurve to stroke */ -void BKE_gpencil_stroke_editcurve_sync_selection(bGPDstroke *gps, bGPDcurve *gpc) +void BKE_gpencil_stroke_editcurve_sync_selection(bGPdata *gpd, bGPDstroke *gps, bGPDcurve *gpc) { if (gpc->flag & GP_CURVE_SELECT) { gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps); for (int i = 0; i < gpc->tot_curve_points - 1; i++) { bGPDcurve_point *gpc_pt = &gpc->curve_points[i]; @@ -865,6 +868,7 @@ void BKE_gpencil_stroke_editcurve_sync_selection(bGPDstroke *gps, bGPDcurve *gpc } else { gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); for (int i = 0; i < gps->totpoints; i++) { bGPDspoint *pt = &gps->points[i]; pt->flag &= ~GP_SPOINT_SELECT; @@ -1089,6 +1093,7 @@ void BKE_gpencil_stroke_update_geometry_from_editcurve(bGPDstroke *gps, /* deselect */ pt->flag &= ~GP_SPOINT_SELECT; gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); return; } @@ -1131,6 +1136,7 @@ void BKE_gpencil_stroke_update_geometry_from_editcurve(bGPDstroke *gps, pt->flag &= ~GP_SPOINT_SELECT; } gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); /* free temp data */ MEM_freeN(points); @@ -1375,7 +1381,7 @@ void BKE_gpencil_strokes_selected_update_editcurve(bGPdata *gpd) BKE_gpencil_stroke_editcurve_update(gpd, gpl, gps); } /* Update the selection from the stroke to the curve. */ - BKE_gpencil_editcurve_stroke_sync_selection(gps, gps->editcurve); + BKE_gpencil_editcurve_stroke_sync_selection(gpd, gps, gps->editcurve); gps->flag |= GP_STROKE_NEEDS_CURVE_UPDATE; BKE_gpencil_stroke_geometry_update(gpd, gps); @@ -1400,7 +1406,7 @@ void BKE_gpencil_strokes_selected_sync_selection_editcurve(bGPdata *gpd) bGPDcurve *gpc = gps->editcurve; if (gpc != NULL) { /* Update the selection of every stroke that has an editcurve */ - BKE_gpencil_stroke_editcurve_sync_selection(gps, gpc); + BKE_gpencil_stroke_editcurve_sync_selection(gpd, gps, gpc); } } } diff --git a/source/blender/blenkernel/intern/gpencil_geom.c b/source/blender/blenkernel/intern/gpencil_geom.c index 60ffa3c3e73..8c4882854d1 100644 --- a/source/blender/blenkernel/intern/gpencil_geom.c +++ b/source/blender/blenkernel/intern/gpencil_geom.c @@ -3228,6 +3228,45 @@ void BKE_gpencil_stroke_join(bGPDstroke *gps_a, } } +/* Copy the stroke of the frame to all frames selected (except current). */ +void BKE_gpencil_stroke_copy_to_keyframes( + bGPdata *gpd, bGPDlayer *gpl, bGPDframe *gpf, bGPDstroke *gps, const bool tail) +{ + GHash *frame_list = BLI_ghash_int_new_ex(__func__, 64); + BKE_gpencil_frame_selected_hash(gpd, frame_list); + + GHashIterator gh_iter; + GHASH_ITER (gh_iter, frame_list) { + int cfra = POINTER_AS_INT(BLI_ghashIterator_getKey(&gh_iter)); + + if (gpf->framenum != cfra) { + bGPDframe *gpf_new = BKE_gpencil_layer_frame_find(gpl, cfra); + if (gpf_new == NULL) { + gpf_new = BKE_gpencil_frame_addnew(gpl, cfra); + } + + if (gpf_new == NULL) { + continue; + } + + bGPDstroke *gps_new = BKE_gpencil_stroke_duplicate(gps, true, true); + if (gps_new == NULL) { + continue; + } + + if (tail) { + BLI_addhead(&gpf_new->strokes, gps_new); + } + else { + BLI_addtail(&gpf_new->strokes, gps_new); + } + } + } + + /* Free hash table. */ + BLI_ghash_free(frame_list, NULL, NULL); +} + /* Stroke Uniform Subdivide ------------------------------------- */ typedef struct tSamplePoint { @@ -3405,6 +3444,7 @@ void BKE_gpencil_stroke_uniform_subdivide(bGPdata *gpd, if (select) { gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps); } /* Free the sample points. Important to use the mutable loop here because we are erasing the list diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c index 8b12e1b5fca..6f1896f055a 100644 --- a/source/blender/blenkernel/intern/gpencil_modifier.c +++ b/source/blender/blenkernel/intern/gpencil_modifier.c @@ -656,10 +656,12 @@ static void gpencil_copy_activeframe_to_eval( LISTBASE_FOREACH (bGPDlayer *, gpl_orig, &gpd_orig->layers) { if (gpl_eval != NULL) { - int remap_cfra = gpencil_remap_time_get(depsgraph, scene, ob, gpl_orig); + bGPDframe *gpf_orig = gpl_orig->actframe; - bGPDframe *gpf_orig = BKE_gpencil_layer_frame_get( - gpl_orig, remap_cfra, GP_GETFRAME_USE_PREV); + int remap_cfra = gpencil_remap_time_get(depsgraph, scene, ob, gpl_orig); + if (gpf_orig && gpf_orig->framenum != remap_cfra) { + gpf_orig = BKE_gpencil_layer_frame_get(gpl_orig, remap_cfra, GP_GETFRAME_USE_PREV); + } if (gpf_orig != NULL) { int gpf_index = BLI_findindex(&gpl_orig->frames, gpf_orig); diff --git a/source/blender/blenkernel/intern/hair.c b/source/blender/blenkernel/intern/hair.c index f76e5a73478..2894d6daf23 100644 --- a/source/blender/blenkernel/intern/hair.c +++ b/source/blender/blenkernel/intern/hair.c @@ -190,6 +190,7 @@ IDTypeInfo IDType_ID_HA = { .make_local = NULL, .foreach_id = hair_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = hair_blend_write, .blend_read_data = hair_blend_read_data, diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 10f15519ea4..368b1c2e66b 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -331,6 +331,7 @@ IDTypeInfo IDType_ID_IM = { .make_local = NULL, .foreach_id = NULL, .foreach_cache = image_foreach_cache, + .owner_get = NULL, .blend_write = image_blend_write, .blend_read_data = image_blend_read_data, diff --git a/source/blender/blenkernel/intern/image_gpu.c b/source/blender/blenkernel/intern/image_gpu.c index a6bd65227a0..8847b88d6f2 100644 --- a/source/blender/blenkernel/intern/image_gpu.c +++ b/source/blender/blenkernel/intern/image_gpu.c @@ -86,15 +86,15 @@ bool BKE_image_has_gpu_texture_premultiplied_alpha(Image *image, ImBuf *ibuf) /* -------------------------------------------------------------------- */ /** \name UDIM gpu texture * \{ */ - -static bool is_over_resolution_limit(int w, int h) +static bool is_over_resolution_limit(int w, int h, bool limit_gl_texture_size) { - return (w > GPU_texture_size_with_limit(w) || h > GPU_texture_size_with_limit(h)); + return (w > GPU_texture_size_with_limit(w, limit_gl_texture_size) || + h > GPU_texture_size_with_limit(h, limit_gl_texture_size)); } -static int smaller_power_of_2_limit(int num) +static int smaller_power_of_2_limit(int num, bool limit_gl_texture_size) { - return power_of_2_min_i(GPU_texture_size_with_limit(num)); + return power_of_2_min_i(GPU_texture_size_with_limit(num, limit_gl_texture_size)); } static GPUTexture *gpu_texture_create_tile_mapping(Image *ima, const int multiview_eye) @@ -153,6 +153,7 @@ static int compare_packtile(const void *a, const void *b) static GPUTexture *gpu_texture_create_tile_array(Image *ima, ImBuf *main_ibuf) { + const bool limit_gl_texture_size = (ima->gpuflag & IMA_GPU_MAX_RESOLUTION) == 0; int arraywidth = 0, arrayheight = 0; ListBase boxes = {NULL}; @@ -168,9 +169,10 @@ static GPUTexture *gpu_texture_create_tile_array(Image *ima, ImBuf *main_ibuf) packtile->boxpack.w = ibuf->x; packtile->boxpack.h = ibuf->y; - if (is_over_resolution_limit(packtile->boxpack.w, packtile->boxpack.h)) { - packtile->boxpack.w = smaller_power_of_2_limit(packtile->boxpack.w); - packtile->boxpack.h = smaller_power_of_2_limit(packtile->boxpack.h); + if (is_over_resolution_limit( + packtile->boxpack.w, packtile->boxpack.h, limit_gl_texture_size)) { + packtile->boxpack.w = smaller_power_of_2_limit(packtile->boxpack.w, limit_gl_texture_size); + packtile->boxpack.h = smaller_power_of_2_limit(packtile->boxpack.h, limit_gl_texture_size); } arraywidth = max_ii(arraywidth, packtile->boxpack.w); arrayheight = max_ii(arrayheight, packtile->boxpack.h); @@ -312,18 +314,26 @@ static GPUTexture *image_get_gpu_texture(Image *ima, short requested_pass = iuser ? iuser->pass : 0; short requested_layer = iuser ? iuser->layer : 0; short requested_view = iuser ? iuser->multi_index : 0; + const bool limit_resolution = U.glreslimit != 0 && + ((iuser && (iuser->flag & IMA_SHOW_MAX_RESOLUTION) == 0) || + (iuser == NULL)); + short requested_gpu_flags = limit_resolution ? 0 : IMA_GPU_MAX_RESOLUTION; +#define GPU_FLAGS_TO_CHECK (IMA_GPU_MAX_RESOLUTION) /* There is room for 2 multiview textures. When a higher number is requested we should always * target the first view slot. This is fine as multi view images aren't used together. */ if (requested_view < 2) { requested_view = 0; } if (ima->gpu_pass != requested_pass || ima->gpu_layer != requested_layer || - ima->gpu_view != requested_view) { + ima->gpu_view != requested_view || + ((ima->gpuflag & GPU_FLAGS_TO_CHECK) != requested_gpu_flags)) { ima->gpu_pass = requested_pass; ima->gpu_layer = requested_layer; ima->gpu_view = requested_view; - ima->gpuflag |= IMA_GPU_REFRESH; + ima->gpuflag &= ~GPU_FLAGS_TO_CHECK; + ima->gpuflag |= requested_gpu_flags | IMA_GPU_REFRESH; } +#undef GPU_FLAGS_TO_CHECK /* Check if image has been updated and tagged to be updated (full or partial). */ ImageTile *tile = BKE_image_get_tile(ima, 0); @@ -390,9 +400,13 @@ static GPUTexture *image_get_gpu_texture(Image *ima, const bool use_high_bitdepth = (ima->flag & IMA_HIGH_BITDEPTH); const bool store_premultiplied = BKE_image_has_gpu_texture_premultiplied_alpha(ima, ibuf_intern); + const bool limit_gl_texture_size = (ima->gpuflag & IMA_GPU_MAX_RESOLUTION) == 0; - *tex = IMB_create_gpu_texture( - ima->id.name + 2, ibuf_intern, use_high_bitdepth, store_premultiplied); + *tex = IMB_create_gpu_texture(ima->id.name + 2, + ibuf_intern, + use_high_bitdepth, + store_premultiplied, + limit_gl_texture_size); GPU_texture_wrap_mode(*tex, true, false); @@ -633,7 +647,7 @@ static void gpu_texture_update_scaled(GPUTexture *tex, } void *data = (ibuf->rect_float) ? (void *)(ibuf->rect_float) : (void *)(ibuf->rect); - eGPUDataFormat data_format = (ibuf->rect_float) ? GPU_DATA_FLOAT : GPU_DATA_UNSIGNED_BYTE; + eGPUDataFormat data_format = (ibuf->rect_float) ? GPU_DATA_FLOAT : GPU_DATA_UBYTE; GPU_texture_update_sub(tex, data_format, data, x, y, layer, w, h, 1); @@ -659,7 +673,7 @@ static void gpu_texture_update_unscaled(GPUTexture *tex, } void *data = (rect_float) ? (void *)(rect_float + tex_offset) : (void *)(rect + tex_offset); - eGPUDataFormat data_format = (rect_float) ? GPU_DATA_FLOAT : GPU_DATA_UNSIGNED_BYTE; + eGPUDataFormat data_format = (rect_float) ? GPU_DATA_FLOAT : GPU_DATA_UBYTE; /* Partial update without scaling. Stride and offset are used to copy only a * subset of a possible larger buffer than what we are updating. */ diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c index d43a0cb3813..bdc763cf4ca 100644 --- a/source/blender/blenkernel/intern/ipo.c +++ b/source/blender/blenkernel/intern/ipo.c @@ -193,6 +193,7 @@ IDTypeInfo IDType_ID_IP = { .make_local = NULL, .foreach_id = NULL, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = NULL, .blend_read_data = ipo_blend_read_data, diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c index 540337b84b3..f2893e162cb 100644 --- a/source/blender/blenkernel/intern/key.c +++ b/source/blender/blenkernel/intern/key.c @@ -216,6 +216,7 @@ IDTypeInfo IDType_ID_KE = { .make_local = NULL, .foreach_id = shapekey_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, /* Could have one actually? */ .blend_write = shapekey_blend_write, .blend_read_data = shapekey_blend_read_data, diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index 3d3ade1a529..678bd94b68b 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -198,6 +198,7 @@ IDTypeInfo IDType_ID_LT = { .make_local = NULL, .foreach_id = lattice_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = lattice_blend_write, .blend_read_data = lattice_blend_read_data, @@ -321,19 +322,21 @@ void BKE_lattice_resize(Lattice *lt, int uNew, int vNew, int wNew, Object *ltOb) * size first. */ if (ltOb) { - if (uNew != 1 && lt->pntsu != 1) { - fu = lt->fu; - du = (lt->pntsu - 1) * lt->du / (uNew - 1); + const float default_size = 1.0; + + if (uNew != 1) { + fu = -default_size / 2.0; + du = default_size / (uNew - 1); } - if (vNew != 1 && lt->pntsv != 1) { - fv = lt->fv; - dv = (lt->pntsv - 1) * lt->dv / (vNew - 1); + if (vNew != 1) { + fv = -default_size / 2.0; + dv = default_size / (vNew - 1); } - if (wNew != 1 && lt->pntsw != 1) { - fw = lt->fw; - dw = (lt->pntsw - 1) * lt->dw / (wNew - 1); + if (wNew != 1) { + fw = -default_size / 2.0; + dw = default_size / (wNew - 1); } } diff --git a/source/blender/blenkernel/intern/lattice_deform.c b/source/blender/blenkernel/intern/lattice_deform.c index 81c2f492f7e..2651042939f 100644 --- a/source/blender/blenkernel/intern/lattice_deform.c +++ b/source/blender/blenkernel/intern/lattice_deform.c @@ -31,6 +31,7 @@ #include "MEM_guardedalloc.h" #include "BLI_math.h" +#include "BLI_simd.h" #include "BLI_task.h" #include "BLI_utildefines.h" @@ -49,10 +50,6 @@ #include "BKE_deform.h" -#ifdef __SSE2__ -# include -#endif - /* -------------------------------------------------------------------- */ /** \name Lattice Deform API * \{ */ @@ -171,7 +168,7 @@ void BKE_lattice_deform_data_eval_co(LatticeDeformData *lattice_deform_data, /* vgroup influence */ float co_prev[4] = {0}, weight_blend = 0.0f; copy_v3_v3(co_prev, co); -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 __m128 co_vec = _mm_loadu_ps(co_prev); #endif @@ -232,7 +229,7 @@ void BKE_lattice_deform_data_eval_co(LatticeDeformData *lattice_deform_data, u = v * tu[uu - ui + 1]; idx_u = CLAMPIS(uu, 0, idx_u_max); const int idx = idx_w + idx_v + idx_u; -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 { __m128 weight_vec = _mm_set1_ps(u); /* We need to address special case for last item to avoid accessing invalid memory. */ @@ -256,7 +253,7 @@ void BKE_lattice_deform_data_eval_co(LatticeDeformData *lattice_deform_data, } } } -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 { copy_v3_v3(co, (float *)&co_vec); } diff --git a/source/blender/blenkernel/intern/lib_id_delete.c b/source/blender/blenkernel/intern/lib_id_delete.c index 8075660dcd1..7c5032c97f4 100644 --- a/source/blender/blenkernel/intern/lib_id_delete.c +++ b/source/blender/blenkernel/intern/lib_id_delete.c @@ -305,13 +305,16 @@ static size_t id_delete(Main *bmain, const bool do_tagged_deletion) /* Since we removed ID from Main, * we also need to unlink its own other IDs usages ourself. */ BKE_libblock_relink_ex(bmain, id, NULL, NULL, 0); - /* Now we can safely mark that ID as not being in Main database anymore. */ - id->tag |= LIB_TAG_NO_MAIN; - /* This is needed because we may not have remapped usages - * of that ID by other deleted ones. */ - // id->us = 0; /* Is it actually? */ } } + + /* Now we can safely mark that ID as not being in Main database anymore. */ + /* NOTE: This needs to be done in a separate loop than above, otherwise some usercounts of + * deleted IDs may not be properly decreased by the remappings (since `NO_MAIN` ID usercounts + * is never affected). */ + for (ID *id = tagged_deleted_ids.first; id; id = id->next) { + id->tag |= LIB_TAG_NO_MAIN; + } } else { /* First tag all datablocks directly from target lib. diff --git a/source/blender/blenkernel/intern/lib_override.c b/source/blender/blenkernel/intern/lib_override.c index 6911248d198..602c560cedd 100644 --- a/source/blender/blenkernel/intern/lib_override.c +++ b/source/blender/blenkernel/intern/lib_override.c @@ -368,22 +368,30 @@ bool BKE_lib_override_library_create_from_tag(Main *bmain) return success; } +typedef struct LibOverrideGroupTagData { + Main *bmain; + ID *id_root; + uint tag; + uint missing_tag; +} LibOverrideGroupTagData; + /* Tag all IDs in dependency relationships within an override hierarchy/group. + * + * Requires existing `Main.relations`. * * Note: this is typically called to complete `lib_override_linked_group_tag()`. - * Note: BMain's relations mapping won't be valid anymore after that call. */ -static bool lib_override_hierarchy_dependencies_recursive_tag(Main *bmain, - ID *id, - const uint tag, - const uint missing_tag) +static bool lib_override_hierarchy_dependencies_recursive_tag(LibOverrideGroupTagData *data) { + Main *bmain = data->bmain; + ID *id = data->id_root; + MainIDRelationsEntry *entry = BLI_ghash_lookup(bmain->relations->relations_from_pointers, id); BLI_assert(entry != NULL); if (entry->tags & MAINIDRELATIONS_ENTRY_TAGS_PROCESSED) { /* This ID has already been processed. */ - return (*(uint *)&id->tag & tag) != 0; + return (*(uint *)&id->tag & data->tag) != 0; } /* This way we won't process again that ID, should we encounter it again through another * relationship hierarchy. */ @@ -399,70 +407,78 @@ static bool lib_override_hierarchy_dependencies_recursive_tag(Main *bmain, /* We only consider IDs from the same library. */ ID *to_id = *to_id_entry->id_pointer.to; if (to_id != NULL && to_id->lib == id->lib) { - if (lib_override_hierarchy_dependencies_recursive_tag(bmain, to_id, tag, missing_tag)) { - id->tag |= tag; + LibOverrideGroupTagData sub_data = *data; + sub_data.id_root = to_id; + if (lib_override_hierarchy_dependencies_recursive_tag(&sub_data)) { + id->tag |= data->tag; } } } - return (*(uint *)&id->tag & tag) != 0; + return (*(uint *)&id->tag & data->tag) != 0; } -typedef struct LibOverrideGroupTagData { - ID *id_root; - uint tag; - uint missing_tag; -} LibOverrideGroupTagData; - -static int lib_override_linked_group_tag_cb(LibraryIDLinkCallbackData *cb_data) +static void lib_override_linked_group_tag_recursive(LibOverrideGroupTagData *data) { - if (cb_data->cb_flag & (IDWALK_CB_EMBEDDED | IDWALK_CB_LOOPBACK)) { - return IDWALK_RET_STOP_RECURSION; - } - - LibOverrideGroupTagData *data = cb_data->user_data; + Main *bmain = data->bmain; + ID *id_owner = data->id_root; + BLI_assert(ID_IS_LINKED(id_owner)); const uint tag = data->tag; const uint missing_tag = data->missing_tag; - ID *id_root = data->id_root; - Library *library_root = id_root->lib; - ID *id = *cb_data->id_pointer; - ID *id_owner = cb_data->id_owner; + MainIDRelationsEntry *entry = BLI_ghash_lookup(bmain->relations->relations_from_pointers, + id_owner); + BLI_assert(entry != NULL); - BLI_assert(id_owner == cb_data->id_self); - - if (ELEM(id, NULL, id_owner)) { - return IDWALK_RET_NOP; + if (entry->tags & MAINIDRELATIONS_ENTRY_TAGS_PROCESSED) { + /* This ID has already been processed. */ + return; } + /* This way we won't process again that ID, should we encounter it again through another + * relationship hierarchy. */ + entry->tags |= MAINIDRELATIONS_ENTRY_TAGS_PROCESSED; - BLI_assert(id_owner->lib == library_root); - - if (*(uint *)&id->tag & (tag | missing_tag)) { - /* Already processed and tagged, nothing else to do here. */ - return IDWALK_RET_STOP_RECURSION; - } - - if (id->lib != library_root) { - /* We do not override data-blocks from other libraries, nor do we process them. */ - return IDWALK_RET_STOP_RECURSION; - } - - /* We tag all collections and objects for override. And we also tag all other data-blocks which - * would use one of those. - * Note: missing IDs (aka placeholders) are never overridden. */ - if (ELEM(GS(id->name), ID_OB, ID_GR)) { - if ((id->tag & LIB_TAG_MISSING)) { - id->tag |= missing_tag; + for (MainIDRelationsEntryItem *to_id_entry = entry->to_ids; to_id_entry != NULL; + to_id_entry = to_id_entry->next) { + if ((to_id_entry->usage_flag & + (IDWALK_CB_EMBEDDED | IDWALK_CB_LOOPBACK | IDWALK_CB_OVERRIDE_LIBRARY_REFERENCE)) != 0) { + /* Never consider 'loop back' relationships ('from', 'parents', 'owner' etc. pointers), nor + * override references or embedded ID pointers, as actual dependencies. */ + continue; } - else { - id->tag |= tag; - } - } - return IDWALK_RET_NOP; + ID *to_id = *to_id_entry->id_pointer.to; + if (ELEM(to_id, NULL, id_owner)) { + continue; + } + /* We only consider IDs from the same library. */ + if (to_id->lib != id_owner->lib) { + continue; + } + BLI_assert(ID_IS_LINKED(to_id)); + + /* We tag all collections and objects for override. And we also tag all other data-blocks which + * would use one of those. + * Note: missing IDs (aka placeholders) are never overridden. */ + if (ELEM(GS(to_id->name), ID_OB, ID_GR)) { + if ((to_id->tag & LIB_TAG_MISSING)) { + to_id->tag |= missing_tag; + } + else { + to_id->tag |= tag; + } + } + + /* Recursively process the dependencies. */ + LibOverrideGroupTagData sub_data = *data; + sub_data.id_root = to_id; + lib_override_linked_group_tag_recursive(&sub_data); + } } /* This will tag at least all 'boundary' linked IDs for a potential override group. + * + * Requires existing `Main.relations`. * * Note that you will then need to call #lib_override_hierarchy_dependencies_recursive_tag to * complete tagging of all dependencies within the override group. @@ -470,129 +486,129 @@ static int lib_override_linked_group_tag_cb(LibraryIDLinkCallbackData *cb_data) * We currently only consider Collections and Objects (that are not used as bone shapes) as valid * boundary IDs to define an override group. */ -static void lib_override_linked_group_tag( - Main *bmain, ID *id, const uint tag, const uint missing_tag, const bool create_bmain_relations) +static void lib_override_linked_group_tag(LibOverrideGroupTagData *data) { - if (create_bmain_relations) { - BKE_main_relations_create(bmain, 0); - } + Main *bmain = data->bmain; + ID *id_root = data->id_root; - if ((id->tag & LIB_TAG_MISSING)) { - id->tag |= missing_tag; + if ((id_root->tag & LIB_TAG_MISSING)) { + id_root->tag |= data->missing_tag; } else { - id->tag |= tag; + id_root->tag |= data->tag; } - if (ELEM(GS(id->name), ID_OB, ID_GR)) { - LibOverrideGroupTagData data = {.id_root = id, .tag = tag, .missing_tag = missing_tag}; + if (ELEM(GS(id_root->name), ID_OB, ID_GR)) { /* Tag all collections and objects. */ - BKE_library_foreach_ID_link( - bmain, id, lib_override_linked_group_tag_cb, &data, IDWALK_READONLY | IDWALK_RECURSE); + lib_override_linked_group_tag_recursive(data); /* Then, we remove (untag) bone shape objects, you shall never want to directly/explicitly * override those. */ LISTBASE_FOREACH (Object *, ob, &bmain->objects) { - if (ob->type == OB_ARMATURE && ob->pose != NULL && (ob->id.tag & tag)) { + if (ob->type == OB_ARMATURE && ob->pose != NULL && (ob->id.tag & data->tag)) { for (bPoseChannel *pchan = ob->pose->chanbase.first; pchan != NULL; pchan = pchan->next) { if (pchan->custom != NULL) { - pchan->custom->id.tag &= ~(tag | missing_tag); + pchan->custom->id.tag &= ~(data->tag | data->missing_tag); } } } } } - - lib_override_hierarchy_dependencies_recursive_tag(bmain, id, tag, missing_tag); - - if (create_bmain_relations) { - BKE_main_relations_free(bmain); - } } -static int lib_override_local_group_tag_cb(LibraryIDLinkCallbackData *cb_data) +static void lib_override_local_group_tag_recursive(LibOverrideGroupTagData *data) { - if (cb_data->cb_flag & - (IDWALK_CB_EMBEDDED | IDWALK_CB_LOOPBACK | IDWALK_CB_OVERRIDE_LIBRARY_REFERENCE)) { - return IDWALK_RET_STOP_RECURSION; - } - - LibOverrideGroupTagData *data = cb_data->user_data; + Main *bmain = data->bmain; + ID *id_owner = data->id_root; + BLI_assert(ID_IS_OVERRIDE_LIBRARY(id_owner)); const uint tag = data->tag; const uint missing_tag = data->missing_tag; - ID *id_root = data->id_root; - Library *library_reference_root = id_root->override_library->reference->lib; - ID *id = *cb_data->id_pointer; - ID *id_owner = cb_data->id_owner; + MainIDRelationsEntry *entry = BLI_ghash_lookup(bmain->relations->relations_from_pointers, + id_owner); + BLI_assert(entry != NULL); - BLI_assert(id_owner == cb_data->id_self); - - if (ELEM(id, NULL, id_owner)) { - return IDWALK_RET_NOP; + if (entry->tags & MAINIDRELATIONS_ENTRY_TAGS_PROCESSED) { + /* This ID has already been processed. */ + return; } + /* This way we won't process again that ID, should we encounter it again through another + * relationship hierarchy. */ + entry->tags |= MAINIDRELATIONS_ENTRY_TAGS_PROCESSED; - if (*(uint *)&id->tag & (tag | missing_tag)) { - /* Already processed and tagged, nothing else to do here. */ - return IDWALK_RET_STOP_RECURSION; - } + for (MainIDRelationsEntryItem *to_id_entry = entry->to_ids; to_id_entry != NULL; + to_id_entry = to_id_entry->next) { + if ((to_id_entry->usage_flag & + (IDWALK_CB_EMBEDDED | IDWALK_CB_LOOPBACK | IDWALK_CB_OVERRIDE_LIBRARY_REFERENCE)) != 0) { + /* Never consider 'loop back' relationships ('from', 'parents', 'owner' etc. pointers), nor + * override references or embedded ID pointers, as actual dependencies. */ + continue; + } - if (!ID_IS_OVERRIDE_LIBRARY(id) || ID_IS_LINKED(id)) { - /* Fully local, or linked ID, those are never part of a local override group. */ - return IDWALK_RET_STOP_RECURSION; - } + ID *to_id = *to_id_entry->id_pointer.to; + if (ELEM(to_id, NULL, id_owner)) { + continue; + } + if (!ID_IS_OVERRIDE_LIBRARY(to_id) || ID_IS_LINKED(to_id)) { + continue; + } - /* NOTE: Since we rejected embedded data too at the beginning of this function, id should only be - * a real override now. - * - * However, our usual trouble maker, Key, is not considered as an embedded ID currently, yet it - * is never a real override either. Enjoy. */ - if (!ID_IS_OVERRIDE_LIBRARY_REAL(id)) { - return IDWALK_RET_NOP; - } + /* Do not tag 'virtual' overrides (shape keys here, as we already rejected embedded case + * above). */ + if (ID_IS_OVERRIDE_LIBRARY_REAL(to_id)) { + Library *reference_lib = NULL; + if (GS(id_owner->name) == ID_KE) { + reference_lib = ((Key *)id_owner)->from->override_library->reference->lib; + } + else { + reference_lib = id_owner->override_library->reference->lib; + } + if (to_id->override_library->reference->lib != reference_lib) { + /* We do not override data-blocks from other libraries, nor do we process them. */ + continue; + } - if (id->override_library->reference->lib != library_reference_root) { - /* We do not override data-blocks from other libraries, nor do we process them. */ - return IDWALK_RET_STOP_RECURSION; - } + if (to_id->override_library->reference->tag & LIB_TAG_MISSING) { + to_id->tag |= missing_tag; + } + else { + to_id->tag |= tag; + } + } - if (id->override_library->reference->tag & LIB_TAG_MISSING) { - id->tag |= missing_tag; + /* Recursively process the dependencies. */ + LibOverrideGroupTagData sub_data = *data; + sub_data.id_root = to_id; + lib_override_local_group_tag_recursive(&sub_data); } - else { - id->tag |= tag; - } - - return IDWALK_RET_NOP; } -/* This will tag at least all 'boundary' linked IDs for a potential override group. - * - * Note that you will then need to call #lib_override_hierarchy_dependencies_recursive_tag to - * complete tagging of all dependencies within the override group. - * - * We currently only consider Collections and Objects (that are not used as bone shapes) as valid - * boundary IDs to define an override group. - */ -static void lib_override_local_group_tag(Main *bmain, - ID *id, - const uint tag, - const uint missing_tag) +/* This will tag all override IDs of an override group defined by the given `id_root`. */ +static void lib_override_local_group_tag(LibOverrideGroupTagData *data) { - id->tag |= tag; + ID *id_root = data->id_root; + BLI_assert(ID_IS_OVERRIDE_LIBRARY_REAL(id_root) && !ID_IS_LINKED(id_root)); + + if ((id_root->override_library->reference->tag & LIB_TAG_MISSING)) { + id_root->tag |= data->missing_tag; + } + else { + id_root->tag |= data->tag; + } - LibOverrideGroupTagData data = {.id_root = id, .tag = tag, .missing_tag = missing_tag}; /* Tag all local overrides in id_root's group. */ - BKE_library_foreach_ID_link( - bmain, id, lib_override_local_group_tag_cb, &data, IDWALK_READONLY | IDWALK_RECURSE); + lib_override_local_group_tag_recursive(data); } static bool lib_override_library_create_do(Main *bmain, ID *id_root) { BKE_main_relations_create(bmain, 0); + LibOverrideGroupTagData data = { + .bmain = bmain, .id_root = id_root, .tag = LIB_TAG_DOIT, .missing_tag = LIB_TAG_MISSING}; + lib_override_linked_group_tag(&data); - lib_override_linked_group_tag(bmain, id_root, LIB_TAG_DOIT, LIB_TAG_MISSING, false); - lib_override_hierarchy_dependencies_recursive_tag(bmain, id_root, LIB_TAG_DOIT, LIB_TAG_MISSING); + BKE_main_relations_tag_set(bmain, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, false); + lib_override_hierarchy_dependencies_recursive_tag(&data); BKE_main_relations_free(bmain); @@ -790,10 +806,16 @@ bool BKE_lib_override_library_resync(Main *bmain, Scene *scene, ViewLayer *view_ ID *id_root_reference = id_root->override_library->reference; BKE_main_relations_create(bmain, 0); + LibOverrideGroupTagData data = { + .bmain = bmain, .id_root = id_root, .tag = LIB_TAG_DOIT, .missing_tag = LIB_TAG_MISSING}; + lib_override_local_group_tag(&data); - lib_override_local_group_tag(bmain, id_root, LIB_TAG_DOIT, LIB_TAG_MISSING); + BKE_main_relations_tag_set(bmain, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, false); + data.id_root = id_root_reference; + lib_override_linked_group_tag(&data); - lib_override_linked_group_tag(bmain, id_root_reference, LIB_TAG_DOIT, LIB_TAG_MISSING, false); + BKE_main_relations_tag_set(bmain, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, false); + lib_override_hierarchy_dependencies_recursive_tag(&data); /* Make a mapping 'linked reference IDs' -> 'Local override IDs' of existing overrides. */ GHash *linkedref_to_old_override = BLI_ghash_new( @@ -835,8 +857,8 @@ bool BKE_lib_override_library_resync(Main *bmain, Scene *scene, ViewLayer *view_ FOREACH_MAIN_ID_END; /* Code above may have added some tags, we need to update this too. */ - lib_override_hierarchy_dependencies_recursive_tag( - bmain, id_root_reference, LIB_TAG_DOIT, LIB_TAG_MISSING); + BKE_main_relations_tag_set(bmain, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, false); + lib_override_hierarchy_dependencies_recursive_tag(&data); BKE_main_relations_free(bmain); @@ -993,7 +1015,12 @@ void BKE_lib_override_library_delete(Main *bmain, ID *id_root) BLI_assert(ID_IS_OVERRIDE_LIBRARY_REAL(id_root)); /* Tag all library overrides in the chains of dependencies from the given root one. */ - lib_override_local_group_tag(bmain, id_root, LIB_TAG_DOIT, LIB_TAG_DOIT); + BKE_main_relations_create(bmain, 0); + LibOverrideGroupTagData data = { + .bmain = bmain, .id_root = id_root, .tag = LIB_TAG_DOIT, .missing_tag = LIB_TAG_MISSING}; + lib_override_local_group_tag(&data); + + BKE_main_relations_free(bmain); ID *id; FOREACH_MAIN_ID_BEGIN (bmain, id) { @@ -1651,24 +1678,26 @@ static bool lib_override_library_id_reset_do(Main *bmain, ID *id_root) &ptr_root_lib); bool prop_exists = RNA_path_resolve_property(&ptr_root, op->rna_path, &ptr, &prop); - BLI_assert(prop_exists); - prop_exists = RNA_path_resolve_property(&ptr_root_lib, op->rna_path, &ptr_lib, &prop_lib); - if (prop_exists) { - BLI_assert(ELEM(RNA_property_type(prop), PROP_POINTER, PROP_COLLECTION)); - BLI_assert(RNA_property_type(prop) == RNA_property_type(prop_lib)); - if (is_collection) { - ptr.type = RNA_property_pointer_type(&ptr, prop); - ptr_lib.type = RNA_property_pointer_type(&ptr_lib, prop_lib); - } - else { - ptr = RNA_property_pointer_get(&ptr, prop); - ptr_lib = RNA_property_pointer_get(&ptr_lib, prop_lib); - } - if (ptr.owner_id != NULL && ptr_lib.owner_id != NULL) { - BLI_assert(ptr.type == ptr_lib.type); - do_op_delete = !(RNA_struct_is_ID(ptr.type) && ptr.owner_id->override_library != NULL && - ptr.owner_id->override_library->reference == ptr_lib.owner_id); + prop_exists = RNA_path_resolve_property(&ptr_root_lib, op->rna_path, &ptr_lib, &prop_lib); + + if (prop_exists) { + BLI_assert(ELEM(RNA_property_type(prop), PROP_POINTER, PROP_COLLECTION)); + BLI_assert(RNA_property_type(prop) == RNA_property_type(prop_lib)); + if (is_collection) { + ptr.type = RNA_property_pointer_type(&ptr, prop); + ptr_lib.type = RNA_property_pointer_type(&ptr_lib, prop_lib); + } + else { + ptr = RNA_property_pointer_get(&ptr, prop); + ptr_lib = RNA_property_pointer_get(&ptr_lib, prop_lib); + } + if (ptr.owner_id != NULL && ptr_lib.owner_id != NULL) { + BLI_assert(ptr.type == ptr_lib.type); + do_op_delete = !(RNA_struct_is_ID(ptr.type) && + ptr.owner_id->override_library != NULL && + ptr.owner_id->override_library->reference == ptr_lib.owner_id); + } } } } diff --git a/source/blender/blenkernel/intern/lib_query.c b/source/blender/blenkernel/intern/lib_query.c index 1fd51544ba7..eaf1e2d46e6 100644 --- a/source/blender/blenkernel/intern/lib_query.c +++ b/source/blender/blenkernel/intern/lib_query.c @@ -599,6 +599,139 @@ void BKE_library_ID_test_usages(Main *bmain, void *idv, bool *is_used_local, boo } /* ***** IDs usages.checking/tagging. ***** */ +static void lib_query_unused_ids_tag_recurse(Main *bmain, + const int tag, + const bool do_local_ids, + const bool do_linked_ids, + ID *id, + int *r_num_tagged) +{ + /* We should never deal with embedded, not-in-main IDs here. */ + BLI_assert((id->flag & LIB_EMBEDDED_DATA) == 0); + + if ((!do_linked_ids && ID_IS_LINKED(id)) || (!do_local_ids && !ID_IS_LINKED(id))) { + return; + } + + MainIDRelationsEntry *id_relations = BLI_ghash_lookup(bmain->relations->relations_from_pointers, + id); + if ((id_relations->tags & MAINIDRELATIONS_ENTRY_TAGS_PROCESSED) != 0) { + return; + } + id_relations->tags |= MAINIDRELATIONS_ENTRY_TAGS_PROCESSED; + + if ((id->tag & tag) != 0) { + return; + } + + if ((id->flag & LIB_FAKEUSER) != 0) { + /* This ID is forcefully kept around, and therefore never unused, no need to check it further. + */ + return; + } + + if (ELEM(GS(id->name), ID_WM, ID_WS, ID_SCE, ID_SCR, ID_LI)) { + /* Some 'root' ID types are never unused (even though they may not have actual users), unless + * their actual usercount is set to 0. */ + return; + } + + /* An ID user is 'valid' (i.e. may affect the 'used'/'not used' status of the ID it uses) if it + * does not match `ignored_usages`, and does match `required_usages`. */ + const int ignored_usages = (IDWALK_CB_LOOPBACK | IDWALK_CB_EMBEDDED); + const int required_usages = (IDWALK_CB_USER | IDWALK_CB_USER_ONE); + + /* This ID may be tagged as unused if none of its users are 'valid', as defined above. + * + * First recursively check all its valid users, if all of them can be tagged as + * unused, then we can tag this ID as such too. */ + bool has_valid_from_users = false; + for (MainIDRelationsEntryItem *id_from_item = id_relations->from_ids; id_from_item != NULL; + id_from_item = id_from_item->next) { + if ((id_from_item->usage_flag & ignored_usages) != 0 || + (id_from_item->usage_flag & required_usages) == 0) { + continue; + } + + ID *id_from = id_from_item->id_pointer.from; + if ((id_from->flag & LIB_EMBEDDED_DATA) != 0) { + /* Directly 'by-pass' to actual real ID owner. */ + const IDTypeInfo *type_info_from = BKE_idtype_get_info_from_id(id_from); + BLI_assert(type_info_from->owner_get != NULL); + id_from = type_info_from->owner_get(bmain, id_from); + } + + lib_query_unused_ids_tag_recurse( + bmain, tag, do_local_ids, do_linked_ids, id_from, r_num_tagged); + if ((id_from->tag & tag) == 0) { + has_valid_from_users = true; + break; + } + } + if (!has_valid_from_users) { + /* This ID has no 'valid' users, tag it as unused. */ + id->tag |= tag; + if (r_num_tagged != NULL) { + r_num_tagged[INDEX_ID_NULL]++; + r_num_tagged[BKE_idtype_idcode_to_index(GS(id->name))]++; + } + } +} + +/** + * Tag all unused IDs (a.k.a 'orphaned'). + * + * By default only tag IDs with `0` user count. + * If `do_tag_recursive` is set, it will check dependencies to detect all IDs that are not actually + * used in current file, including 'archipelagoes` (i.e. set of IDs referencing each other in + * loops, but without any 'external' valid usages. + * + * Valid usages here are defined as ref-counting usages, which are not towards embedded or + * loop-back data. + * + * \param r_num_tagged If non-NULL, must be a zero-initialized array of #INDEX_ID_MAX integers. + * Number of tagged-as-unused IDs is then set for each type, and as total in + * #INDEX_ID_NULL item. + */ +void BKE_lib_query_unused_ids_tag(Main *bmain, + const int tag, + const bool do_local_ids, + const bool do_linked_ids, + const bool do_tag_recursive, + int *r_num_tagged) +{ + /* First loop, to only check for immediatly unused IDs (those with 0 user count). + * NOTE: It also takes care of clearing given tag for used IDs. */ + ID *id; + FOREACH_MAIN_ID_BEGIN (bmain, id) { + if ((!do_linked_ids && ID_IS_LINKED(id)) || (!do_local_ids && !ID_IS_LINKED(id))) { + id->tag &= ~tag; + } + else if (id->us == 0) { + id->tag |= tag; + if (r_num_tagged != NULL) { + r_num_tagged[INDEX_ID_NULL]++; + r_num_tagged[BKE_idtype_idcode_to_index(GS(id->name))]++; + } + } + else { + id->tag &= ~tag; + } + } + FOREACH_MAIN_ID_END; + + if (!do_tag_recursive) { + return; + } + + BKE_main_relations_create(bmain, 0); + FOREACH_MAIN_ID_BEGIN (bmain, id) { + lib_query_unused_ids_tag_recurse(bmain, tag, do_local_ids, do_linked_ids, id, r_num_tagged); + } + FOREACH_MAIN_ID_END; + BKE_main_relations_free(bmain); +} + static int foreach_libblock_used_linked_data_tag_clear_cb(LibraryIDLinkCallbackData *cb_data) { ID *self_id = cb_data->id_self; diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c index d2f1196d804..677b9497c98 100644 --- a/source/blender/blenkernel/intern/library.c +++ b/source/blender/blenkernel/intern/library.c @@ -77,6 +77,7 @@ IDTypeInfo IDType_ID_LI = { .make_local = NULL, .foreach_id = library_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = NULL, .blend_read_data = NULL, diff --git a/source/blender/blenkernel/intern/light.c b/source/blender/blenkernel/intern/light.c index 4a2afb7f5e6..d91d80ac683 100644 --- a/source/blender/blenkernel/intern/light.c +++ b/source/blender/blenkernel/intern/light.c @@ -202,6 +202,7 @@ IDTypeInfo IDType_ID_LA = { .make_local = NULL, .foreach_id = light_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = light_blend_write, .blend_read_data = light_blend_read_data, diff --git a/source/blender/blenkernel/intern/lightprobe.c b/source/blender/blenkernel/intern/lightprobe.c index 4ef3b8c3237..d872ecf7578 100644 --- a/source/blender/blenkernel/intern/lightprobe.c +++ b/source/blender/blenkernel/intern/lightprobe.c @@ -100,6 +100,7 @@ IDTypeInfo IDType_ID_LP = { .make_local = NULL, .foreach_id = lightprobe_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = lightprobe_blend_write, .blend_read_data = lightprobe_blend_read_data, diff --git a/source/blender/blenkernel/intern/linestyle.c b/source/blender/blenkernel/intern/linestyle.c index 283e2a94732..26d9ab7a8c7 100644 --- a/source/blender/blenkernel/intern/linestyle.c +++ b/source/blender/blenkernel/intern/linestyle.c @@ -760,6 +760,7 @@ IDTypeInfo IDType_ID_LS = { .make_local = NULL, .foreach_id = linestyle_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = linestyle_blend_write, .blend_read_data = linestyle_blend_read_data, diff --git a/source/blender/blenkernel/intern/main.c b/source/blender/blenkernel/intern/main.c index d5cbcb62af2..6f94b3355fa 100644 --- a/source/blender/blenkernel/intern/main.c +++ b/source/blender/blenkernel/intern/main.c @@ -317,7 +317,9 @@ void BKE_main_relations_tag_set(struct Main *bmain, if (bmain->relations == NULL) { return; } - for (GHashIterator *gh_iter = BLI_ghashIterator_new(bmain->relations->relations_from_pointers); + + GHashIterator *gh_iter; + for (gh_iter = BLI_ghashIterator_new(bmain->relations->relations_from_pointers); !BLI_ghashIterator_done(gh_iter); BLI_ghashIterator_step(gh_iter)) { MainIDRelationsEntry *entry = BLI_ghashIterator_getValue(gh_iter); @@ -328,6 +330,7 @@ void BKE_main_relations_tag_set(struct Main *bmain, entry->tags &= ~tag; } } + BLI_ghashIterator_free(gh_iter); } /** diff --git a/source/blender/blenkernel/intern/mask.c b/source/blender/blenkernel/intern/mask.c index 83d9449934c..3a3ad9ef051 100644 --- a/source/blender/blenkernel/intern/mask.c +++ b/source/blender/blenkernel/intern/mask.c @@ -263,6 +263,7 @@ IDTypeInfo IDType_ID_MSK = { .make_local = NULL, .foreach_id = mask_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = mask_blend_write, .blend_read_data = mask_blend_read_data, diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 70906065347..37d47a984cc 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -267,6 +267,7 @@ IDTypeInfo IDType_ID_MA = { .make_local = NULL, .foreach_id = material_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = material_blend_write, .blend_read_data = material_blend_read_data, diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index 849c7ef57fb..6bef11dea76 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -197,6 +197,7 @@ IDTypeInfo IDType_ID_MB = { .make_local = NULL, .foreach_id = metaball_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = metaball_blend_write, .blend_read_data = metaball_blend_read_data, diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 1560e9325d5..5d5d2222f63 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -357,6 +357,7 @@ IDTypeInfo IDType_ID_ME = { .make_local = NULL, .foreach_id = mesh_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = mesh_blend_write, .blend_read_data = mesh_blend_read_data, diff --git a/source/blender/blenkernel/intern/mesh_boolean_convert.cc b/source/blender/blenkernel/intern/mesh_boolean_convert.cc new file mode 100644 index 00000000000..299b1ff1c71 --- /dev/null +++ b/source/blender/blenkernel/intern/mesh_boolean_convert.cc @@ -0,0 +1,838 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + */ + +/** \file + * \ingroup bke + */ + +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_object_types.h" + +#include "BKE_customdata.h" +#include "BKE_material.h" +#include "BKE_mesh.h" +#include "BKE_mesh_boolean_convert.h" + +#include "BLI_alloca.h" +#include "BLI_float2.hh" +#include "BLI_math.h" +#include "BLI_mesh_boolean.hh" +#include "BLI_mesh_intersect.hh" +#include "BLI_span.hh" + +namespace blender::meshintersect { + +#ifdef WITH_GMP + +constexpr int estimated_max_facelen = 100; /* Used for initial size of some Vectors. */ + +/* Snap entries that are near 0 or 1 or -1 to those values. + * Sometimes Blender's rotation matrices for multiples of 90 degrees have + * tiny numbers where there should be zeros. That messes makes some things + * every so slightly non-coplanar when users expect coplanarity, + * so this is a hack to clean up such matrices. + * Would be better to change the transformation code itself. + */ +static void clean_obmat(float cleaned[4][4], const float mat[4][4]) +{ + const float fuzz = 1e-6f; + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + float f = mat[i][j]; + if (fabsf(f) <= fuzz) { + f = 0.0f; + } + else if (fabsf(f - 1.0f) <= fuzz) { + f = 1.0f; + } + else if (fabsf(f + 1.0f) <= fuzz) { + f = -1.0f; + } + cleaned[i][j] = f; + } + } +} + +/* Need to wrap this in a class to use it in an Array. */ +class TransMat { + public: + float mat[4][4]; +}; + +/* `MeshesToIMeshInfo` keeps track of information used when combining a number + * of `Mesh`es into a single `IMesh` for doing boolean on. + * Mostly this means keeping track of the index offsets for various mesh elements. */ +class MeshesToIMeshInfo { + public: + /* The input meshes, */ + Span meshes; + /* Numbering the vertices of the meshes in order of meshes, + * at what offset does the vertex range for mesh[i] start? */ + Array mesh_vert_offset; + /* Similarly for edges of meshes. */ + Array mesh_edge_offset; + /* Similarly for polys of meshes. */ + Array mesh_poly_offset; + /* For each Mesh vertex in all the meshes (with concatenated indexing), + * what is the IMesh Vert* allocated for it in the input IMesh? */ + Array mesh_to_imesh_vert; + /* Similarly for each Mesh poly. */ + Array mesh_to_imesh_face; + /* Transformation matrix to transform a coordinate in the corresponding + * Mesh to the local space of the first Mesh. */ + Array to_obj0; + /* Total number of input mesh vertices. */ + int tot_meshes_verts; + /* Total number of input mesh edges. */ + int tot_meshes_edges; + /* Total number of input mesh polys. */ + int tot_meshes_polys; + + int input_mesh_for_imesh_vert(int imesh_v) const; + int input_mesh_for_imesh_edge(int imesh_e) const; + int input_mesh_for_imesh_face(int imesh_f) const; + const MPoly *input_mpoly_for_orig_index(int orig_index, + const Mesh **r_orig_mesh, + int *r_orig_mesh_index, + int *r_index_in_orig_mesh) const; + const MVert *input_mvert_for_orig_index(int orig_index, + const Mesh **r_orig_mesh, + int *r_index_in_orig_mesh) const; + const MEdge *input_medge_for_orig_index(int orig_index, + const Mesh **r_orig_mesh, + int *r_index_in_orig_mesh) const; +}; + +/* Given an index `imesh_v` in the `IMesh`, return the index of the + * input `Mesh` that contained the `MVert` that it came from. */ +int MeshesToIMeshInfo::input_mesh_for_imesh_vert(int imesh_v) const +{ + int n = static_cast(mesh_vert_offset.size()); + for (int i = 0; i < n - 1; ++i) { + if (imesh_v < mesh_vert_offset[i + 1]) { + return i; + } + } + return n - 1; +} + +/* Given an index `imesh_e` used as an original index in the `IMesh`, + * return the index of the input `Mesh` that contained the `MVert` that it came from. */ +int MeshesToIMeshInfo::input_mesh_for_imesh_edge(int imesh_e) const +{ + int n = static_cast(mesh_edge_offset.size()); + for (int i = 0; i < n - 1; ++i) { + if (imesh_e < mesh_edge_offset[i + 1]) { + return i; + } + } + return n - 1; +} + +/* Given an index `imesh_f` in the `IMesh`, return the index of the + * input `Mesh` that contained the `MPoly` that it came from. */ +int MeshesToIMeshInfo::input_mesh_for_imesh_face(int imesh_f) const +{ + int n = static_cast(mesh_poly_offset.size()); + for (int i = 0; i < n - 1; ++i) { + if (imesh_f < mesh_poly_offset[i + 1]) { + return i; + } + } + return n - 1; +} + +/* Given an index of an original face in the `IMesh`, find out the input + * `Mesh` that it came from and return it in `*r_orig_mesh`, + * and also return the index of that `Mesh` in `*r_orig_mesh_index`. + * Finally, return the index of the corresponding `MPoly` in that `Mesh` + * in `*r_index_in_orig_mesh`. */ +const MPoly *MeshesToIMeshInfo::input_mpoly_for_orig_index(int orig_index, + const Mesh **r_orig_mesh, + int *r_orig_mesh_index, + int *r_index_in_orig_mesh) const +{ + int orig_mesh_index = input_mesh_for_imesh_face(orig_index); + BLI_assert(0 <= orig_mesh_index && orig_mesh_index < meshes.size()); + const Mesh *me = meshes[orig_mesh_index]; + int index_in_mesh = orig_index - mesh_poly_offset[orig_mesh_index]; + BLI_assert(0 <= index_in_mesh && index_in_mesh < me->totpoly); + const MPoly *mp = &me->mpoly[index_in_mesh]; + if (r_orig_mesh) { + *r_orig_mesh = me; + } + if (r_orig_mesh_index) { + *r_orig_mesh_index = orig_mesh_index; + } + if (r_index_in_orig_mesh) { + *r_index_in_orig_mesh = index_in_mesh; + } + return mp; +} + +/* Given an index of an original vertex in the `IMesh`, find out the input + * `Mesh` that it came from and return it in `*r_orig_mesh`. + * Also find the index of the `MVert` in that `Mesh` and return it in + * `*r_index_in_orig_mesh`. */ +const MVert *MeshesToIMeshInfo::input_mvert_for_orig_index(int orig_index, + const Mesh **r_orig_mesh, + int *r_index_in_orig_mesh) const +{ + int orig_mesh_index = input_mesh_for_imesh_vert(orig_index); + BLI_assert(0 <= orig_mesh_index && orig_mesh_index < meshes.size()); + const Mesh *me = meshes[orig_mesh_index]; + int index_in_mesh = orig_index - mesh_vert_offset[orig_mesh_index]; + BLI_assert(0 <= index_in_mesh && index_in_mesh < me->totvert); + const MVert *mv = &me->mvert[index_in_mesh]; + if (r_orig_mesh) { + *r_orig_mesh = me; + } + if (r_index_in_orig_mesh) { + *r_index_in_orig_mesh = index_in_mesh; + } + return mv; +} + +/* Similarly for edges. */ +const MEdge *MeshesToIMeshInfo::input_medge_for_orig_index(int orig_index, + const Mesh **r_orig_mesh, + int *r_index_in_orig_mesh) const +{ + int orig_mesh_index = input_mesh_for_imesh_edge(orig_index); + BLI_assert(0 <= orig_mesh_index && orig_mesh_index < meshes.size()); + const Mesh *me = meshes[orig_mesh_index]; + int index_in_mesh = orig_index - mesh_edge_offset[orig_mesh_index]; + BLI_assert(0 <= index_in_mesh && index_in_mesh < me->totedge); + const MEdge *medge = &me->medge[index_in_mesh]; + if (r_orig_mesh) { + *r_orig_mesh = me; + } + if (r_index_in_orig_mesh) { + *r_index_in_orig_mesh = index_in_mesh; + } + return medge; +} + +/** Convert all of the meshes in `meshes` to an `IMesh` and return that. + * All of the coordinates are transformed into the local space of the + * first Mesh. To do this transformation, we also need the transformation + * obmats corresponding to the Meshes, so they are in the `obmats` argument. + * The 'original' indexes in the IMesh are the indexes you get by + * a scheme that offsets each MVert, MEdge, and MPoly index by the sum of the + * vertices, edges, and polys in the preceding Meshes in the mesh span. + * The `*r_info class` is filled in with information needed to make the + * correspondence between the Mesh MVerts/MPolys and the IMesh Verts/Faces. + * All allocation of memory for the IMesh comes from `arena`. + */ +static IMesh meshes_to_imesh(Span meshes, + const float (*obmats[])[4][4], + IMeshArena &arena, + MeshesToIMeshInfo *r_info) +{ + int nmeshes = meshes.size(); + BLI_assert(nmeshes > 0); + r_info->meshes = meshes; + r_info->tot_meshes_verts = 0; + r_info->tot_meshes_polys = 0; + int &totvert = r_info->tot_meshes_verts; + int &totedge = r_info->tot_meshes_edges; + int &totpoly = r_info->tot_meshes_polys; + for (const Mesh *me : meshes) { + totvert += me->totvert; + totedge += me->totedge; + totpoly += me->totpoly; + } + + /* Estimate the number of vertices and faces in the boolean output, + * so that the memory arena can reserve some space. It is OK if these + * estimates are wrong. */ + const int estimate_num_outv = 3 * totvert; + const int estimate_num_outf = 4 * totpoly; + arena.reserve(estimate_num_outv, estimate_num_outf); + r_info->mesh_to_imesh_vert = Array(totvert); + r_info->mesh_to_imesh_face = Array(totpoly); + r_info->mesh_vert_offset = Array(nmeshes); + r_info->mesh_edge_offset = Array(nmeshes); + r_info->mesh_poly_offset = Array(nmeshes); + r_info->to_obj0 = Array(nmeshes); + int v = 0; + int e = 0; + int f = 0; + + /* Put these Vectors here, with a size unlikely to need resizing, + * so that the loop to make new Faces will likely not need to allocate + * over and over. */ + Vector face_vert; + Vector face_edge_orig; + + /* To convert the coordinates of objects 1, 2, etc. into the local space + * of object 0, we multiply each object's `obmat` by the inverse of + * object 0's `obmat`. Exact Boolean works better if these matrices + * are 'cleaned' -- see the comment for the `clean_obmat` function, above. */ + float obj0_mat[4][4]; + float inv_obj0_mat[4][4]; + if (obmats[0] == nullptr) { + unit_m4(obj0_mat); + unit_m4(inv_obj0_mat); + } + else { + clean_obmat(obj0_mat, *obmats[0]); + invert_m4_m4(inv_obj0_mat, obj0_mat); + } + + /* For each input `Mesh`, make `Vert`s and `Face`s for the corresponding + * `MVert`s and `MPoly`s, and keep track of the original indices (using the + * concatenating offset scheme) inside the `Vert`s and `Face`s. + * When making `Face`s, we also put in the original indices for `MEdge`s that + * make up the `MPoly`s using the same scheme. */ + for (int mi : meshes.index_range()) { + float objn_to_obj0_mat[4][4]; + const Mesh *me = meshes[mi]; + if (mi == 0) { + r_info->mesh_vert_offset[mi] = 0; + r_info->mesh_edge_offset[mi] = 0; + r_info->mesh_poly_offset[mi] = 0; + unit_m4(r_info->to_obj0[0].mat); + } + else { + r_info->mesh_vert_offset[mi] = v; + r_info->mesh_edge_offset[mi] = e; + r_info->mesh_poly_offset[mi] = f; + /* Get matrix that transforms a coordinate in objects[mi]'s local space + * to object[0]'s local space.*/ + float objn_mat[4][4]; + if (obmats[mi] == nullptr) { + unit_m4(objn_mat); + } + else { + clean_obmat(objn_mat, *obmats[mi]); + } + mul_m4_m4m4(objn_to_obj0_mat, inv_obj0_mat, objn_mat); + copy_m4_m4(r_info->to_obj0[mi].mat, objn_to_obj0_mat); + } + for (int vi = 0; vi < me->totvert; ++vi) { + float co[3]; + copy_v3_v3(co, me->mvert[vi].co); + if (mi > 0) { + mul_m4_v3(objn_to_obj0_mat, co); + } + r_info->mesh_to_imesh_vert[v] = arena.add_or_find_vert(mpq3(co[0], co[1], co[2]), v); + ++v; + } + for (const MPoly &poly : Span(me->mpoly, me->totpoly)) { + int flen = poly.totloop; + face_vert.clear(); + face_edge_orig.clear(); + const MLoop *l = &me->mloop[poly.loopstart]; + for (int i = 0; i < flen; ++i) { + int mverti = r_info->mesh_vert_offset[mi] + l->v; + const Vert *fv = r_info->mesh_to_imesh_vert[mverti]; + face_vert.append(fv); + face_edge_orig.append(e + l->e); + ++l; + } + r_info->mesh_to_imesh_face[f] = arena.add_face(face_vert, f, face_edge_orig); + ++f; + } + e += me->totedge; + } + return IMesh(r_info->mesh_to_imesh_face); +} + +/* Copy vertex attributes, including customdata, from `orig_mv` to `mv`. + * `mv` is in `dest_mesh` with index `mv_index`. + * The `orig_mv` vertex came from Mesh `orig_me` and had index `index_in_orig_me` there. */ +static void copy_vert_attributes(Mesh *dest_mesh, + MVert *mv, + const MVert *orig_mv, + const Mesh *orig_me, + int mv_index, + int index_in_orig_me) +{ + mv->bweight = orig_mv->bweight; + mv->flag = orig_mv->flag; + + /* For all layers in the orig mesh, copy the layer information. */ + CustomData *target_cd = &dest_mesh->vdata; + const CustomData *source_cd = &orig_me->vdata; + for (int source_layer_i = 0; source_layer_i < source_cd->totlayer; ++source_layer_i) { + int ty = source_cd->layers[source_layer_i].type; + /* The (first) CD_MVERT layer is the same as dest_mesh->vdata, so we've + * already set the coordinate to the right value. */ + if (ty == CD_MVERT) { + continue; + } + const char *name = source_cd->layers[source_layer_i].name; + int target_layer_i = CustomData_get_named_layer_index(target_cd, ty, name); + /* Not all layers were merged in target: some are marked CD_FLAG_NOCOPY + * and some are not in the CD_MASK_MESH.vdata. */ + if (target_layer_i != -1) { + CustomData_copy_data_layer( + source_cd, target_cd, source_layer_i, target_layer_i, index_in_orig_me, mv_index, 1); + } + } +} + +/* Similar to copy_vert_attributes but for poly attributes. */ +static void copy_poly_attributes(Mesh *dest_mesh, + MPoly *mp, + const MPoly *orig_mp, + const Mesh *orig_me, + int mp_index, + int index_in_orig_me) +{ + mp->mat_nr = orig_mp->mat_nr; + if (mp->mat_nr >= dest_mesh->totcol) { + mp->mat_nr = 0; + } + mp->flag = orig_mp->flag; + CustomData *target_cd = &dest_mesh->pdata; + const CustomData *source_cd = &orig_me->pdata; + for (int source_layer_i = 0; source_layer_i < source_cd->totlayer; ++source_layer_i) { + int ty = source_cd->layers[source_layer_i].type; + if (ty == CD_MPOLY) { + continue; + } + const char *name = source_cd->layers[source_layer_i].name; + int target_layer_i = CustomData_get_named_layer_index(target_cd, ty, name); + if (target_layer_i != -1) { + CustomData_copy_data_layer( + source_cd, target_cd, source_layer_i, target_layer_i, index_in_orig_me, mp_index, 1); + } + } +} + +/* Similar to copy_vert_attributes but for edge attributes. */ +static void copy_edge_attributes(Mesh *dest_mesh, + MEdge *medge, + const MEdge *orig_medge, + const Mesh *orig_me, + int medge_index, + int index_in_orig_me) +{ + medge->bweight = orig_medge->bweight; + medge->crease = orig_medge->crease; + medge->flag = orig_medge->flag; + CustomData *target_cd = &dest_mesh->edata; + const CustomData *source_cd = &orig_me->edata; + for (int source_layer_i = 0; source_layer_i < source_cd->totlayer; ++source_layer_i) { + int ty = source_cd->layers[source_layer_i].type; + if (ty == CD_MEDGE) { + continue; + } + const char *name = source_cd->layers[source_layer_i].name; + int target_layer_i = CustomData_get_named_layer_index(target_cd, ty, name); + if (target_layer_i != -1) { + CustomData_copy_data_layer( + source_cd, target_cd, source_layer_i, target_layer_i, index_in_orig_me, medge_index, 1); + } + } +} + +/** + * For #IMesh face `f`, with corresponding output Mesh poly `mp`, + * where the original Mesh poly is `orig_mp`, coming from the Mesh + * `orig_me`, which has index `orig_me_index` in `mim`: + * fill in the `orig_loops` Array with corresponding indices of MLoops from `orig_me` + * where they have the same start and end vertices; for cases where that is + * not true, put -1 in the `orig_loops` slot. + * For now, we only try to do this if `mp` and `orig_mp` have the same size. + * Return the number of non-null MLoops filled in. + */ +static int fill_orig_loops(const Face *f, + const MPoly *orig_mp, + const Mesh *orig_me, + int orig_me_index, + MeshesToIMeshInfo &mim, + Array &orig_loops) +{ + orig_loops.fill(-1); + int orig_mplen = orig_mp->totloop; + if (f->size() != orig_mplen) { + return 0; + } + BLI_assert(orig_loops.size() == orig_mplen); + /* We'll look for the case where the first vertex in f has an original vertex + * that is the same as one in orig_me (after correcting for offset in mim meshes). + * Then see that loop and any subsequent ones have the same start and end vertex. + * This may miss some cases of partial alignment, but that's OK since discovering + * aligned loops is only an optimization to avoid some re-interpolation. + */ + int first_orig_v = f->vert[0]->orig; + if (first_orig_v == NO_INDEX) { + return 0; + } + /* It is possible that the original vert was merged with another in another mesh. */ + if (orig_me_index != mim.input_mesh_for_imesh_vert(first_orig_v)) { + return 0; + } + int orig_me_vert_offset = mim.mesh_vert_offset[orig_me_index]; + int first_orig_v_in_orig_me = first_orig_v - orig_me_vert_offset; + BLI_assert(0 <= first_orig_v_in_orig_me && first_orig_v_in_orig_me < orig_me->totvert); + /* Assume all vertices in an mpoly are unique. */ + int offset = -1; + for (int i = 0; i < orig_mplen; ++i) { + int loop_i = i + orig_mp->loopstart; + if (orig_me->mloop[loop_i].v == first_orig_v_in_orig_me) { + offset = i; + break; + } + } + if (offset == -1) { + return 0; + } + int num_orig_loops_found = 0; + for (int mp_loop_index = 0; mp_loop_index < orig_mplen; ++mp_loop_index) { + int orig_mp_loop_index = (mp_loop_index + offset) % orig_mplen; + MLoop *l = &orig_me->mloop[orig_mp->loopstart + orig_mp_loop_index]; + int fv_orig = f->vert[mp_loop_index]->orig; + if (fv_orig != NO_INDEX) { + fv_orig -= orig_me_vert_offset; + if (fv_orig < 0 || fv_orig >= orig_me->totvert) { + fv_orig = NO_INDEX; + } + } + if (l->v == fv_orig) { + MLoop *lnext = &orig_me->mloop[orig_mp->loopstart + ((orig_mp_loop_index + 1) % orig_mplen)]; + int fvnext_orig = f->vert[(mp_loop_index + 1) % orig_mplen]->orig; + if (fvnext_orig != NO_INDEX) { + fvnext_orig -= orig_me_vert_offset; + if (fvnext_orig < 0 || fvnext_orig >= orig_me->totvert) { + fvnext_orig = NO_INDEX; + } + } + if (lnext->v == fvnext_orig) { + orig_loops[mp_loop_index] = orig_mp->loopstart + orig_mp_loop_index; + ++num_orig_loops_found; + } + } + } + return num_orig_loops_found; +} + +/* Fill `cos_2d` with the 2d coordinates found by projection MPoly `mp` along + * its normal. Also fill in r_axis_mat with the matrix that does that projection. + * But before projecting, also transform the 3d coordinate by multiplying by trans_mat. + * `cos_2d` should have room for `mp->totloop` entries. */ +static void get_poly2d_cos(const Mesh *me, + const MPoly *mp, + float (*cos_2d)[2], + const TransMat &trans_mat, + float r_axis_mat[3][3]) +{ + int n = mp->totloop; + + /* Project coordinates to 2d in cos_2d, using normal as projection axis. */ + float axis_dominant[3]; + BKE_mesh_calc_poly_normal(mp, &me->mloop[mp->loopstart], me->mvert, axis_dominant); + axis_dominant_v3_to_m3(r_axis_mat, axis_dominant); + MLoop *ml = &me->mloop[mp->loopstart]; + const MVert *mverts = me->mvert; + for (int i = 0; i < n; ++i) { + float co[3]; + copy_v3_v3(co, mverts[ml->v].co); + mul_m4_v3(trans_mat.mat, co); + mul_v2_m3v3(cos_2d[i], r_axis_mat, co); + ++ml; + } +} + +/* For the loops of `mp`, see if the face is unchanged from `orig_mp`, and if so, + * copy the Loop attributes from corresponding loops to corresponding loops. + * Otherwise, interpolate the Loop attributes in the face `orig_mp`. */ +static void copy_or_interp_loop_attributes(Mesh *dest_mesh, + const Face *f, + MPoly *mp, + const MPoly *orig_mp, + const Mesh *orig_me, + int orig_me_index, + MeshesToIMeshInfo &mim) +{ + Array orig_loops(mp->totloop); + int norig = fill_orig_loops(f, orig_mp, orig_me, orig_me_index, mim, orig_loops); + /* We may need these arrays if we have to interpolate Loop attributes rather than just copy. + * Right now, trying Array complains, so declare cos_2d a different way. */ + float(*cos_2d)[2]; + Array weights; + Array src_blocks_ofs; + float axis_mat[3][3]; + if (norig != mp->totloop) { + /* We will need to interpolate. Make `cos_2d` hold 2d-projected coordinates of `orig_mp`, + * which are transformed into object 0's local space before projecting. + * At this point we cannot yet calculate the interpolation weights, as they depend on + * the coordinate where interpolation is to happen, but we can allocate the needed arrays, + * so they don't have to be allocated per-layer. */ + cos_2d = (float(*)[2])BLI_array_alloca(cos_2d, orig_mp->totloop); + weights = Array(orig_mp->totloop); + src_blocks_ofs = Array(orig_mp->totloop); + get_poly2d_cos(orig_me, orig_mp, cos_2d, mim.to_obj0[orig_me_index], axis_mat); + } + CustomData *target_cd = &dest_mesh->ldata; + for (int i = 0; i < mp->totloop; ++i) { + int loop_index = mp->loopstart + i; + int orig_loop_index = norig > 0 ? orig_loops[i] : -1; + const CustomData *source_cd = &orig_me->ldata; + if (orig_loop_index == -1) { + /* Will need interpolation weights for this loop's vertex's coordinates. + * The coordinate needs to be projected into 2d, just like the interpolating polygon's + * coordinates were. The `dest_mesh` coordinates are already in object 0 local space. */ + float co[2]; + mul_v2_m3v3(co, axis_mat, dest_mesh->mvert[dest_mesh->mloop[loop_index].v].co); + interp_weights_poly_v2(weights.data(), cos_2d, orig_mp->totloop, co); + } + for (int source_layer_i = 0; source_layer_i < source_cd->totlayer; ++source_layer_i) { + int ty = source_cd->layers[source_layer_i].type; + if (ty == CD_MLOOP) { + continue; + } + const char *name = source_cd->layers[source_layer_i].name; + int target_layer_i = CustomData_get_named_layer_index(target_cd, ty, name); + if (target_layer_i == -1) { + continue; + } + if (orig_loop_index != -1) { + CustomData_copy_data_layer( + source_cd, target_cd, source_layer_i, target_layer_i, orig_loop_index, loop_index, 1); + } + else { + /* Note: although CustomData_bmesh_interp_n function has bmesh in its name, nothing about + * it is BMesh-specific. We can't use CustomData_interp because it assumes that + * all source layers exist in the dest. + * A non bmesh version could have the benefit of not copying data into src_blocks_ofs - + * using the contiguous data instead. TODO: add to the custom data API. */ + int target_layer_type_index = CustomData_get_named_layer(target_cd, ty, name); + int source_layer_type_index = source_layer_i - source_cd->typemap[ty]; + BLI_assert(target_layer_type_index != -1 && source_layer_type_index >= 0); + for (int j = 0; j < orig_mp->totloop; ++j) { + src_blocks_ofs[j] = CustomData_get_n( + source_cd, ty, orig_mp->loopstart + j, source_layer_type_index); + } + void *dst_block_ofs = CustomData_get_n(target_cd, ty, loop_index, target_layer_type_index); + CustomData_bmesh_interp_n(target_cd, + src_blocks_ofs.data(), + weights.data(), + nullptr, + orig_mp->totloop, + dst_block_ofs, + target_layer_i); + } + } + } +} + +/** Make sure that there are custom data layers in the target mesh + * corresponding to all target layers in all of the operands after the first. + * (The target should already have layers for those in the first operand mesh). + * Edges done separately -- will have to be done later, after edges are made. + */ +static void merge_vertex_loop_poly_customdata_layers(Mesh *target, MeshesToIMeshInfo &mim) +{ + for (int mesh_index = 1; mesh_index < mim.meshes.size(); ++mesh_index) { + const Mesh *me = mim.meshes[mesh_index]; + if (me->totvert) { + CustomData_merge( + &me->vdata, &target->vdata, CD_MASK_MESH.vmask, CD_DEFAULT, target->totvert); + } + if (me->totloop) { + CustomData_merge( + &me->ldata, &target->ldata, CD_MASK_MESH.lmask, CD_DEFAULT, target->totloop); + } + if (me->totpoly) { + CustomData_merge( + &me->pdata, &target->pdata, CD_MASK_MESH.pmask, CD_DEFAULT, target->totpoly); + } + } +} + +static void merge_edge_customdata_layers(Mesh *target, MeshesToIMeshInfo &mim) +{ + for (int mesh_index = 1; mesh_index < mim.meshes.size(); ++mesh_index) { + const Mesh *me = mim.meshes[mesh_index]; + if (me->totedge) { + CustomData_merge( + &me->edata, &target->edata, CD_MASK_MESH.emask, CD_DEFAULT, target->totedge); + } + } +} + +/** Convert the output IMesh im to a Blender Mesh, + * using the information in mim to get all the attributes right. + */ +static Mesh *imesh_to_mesh(IMesh *im, MeshesToIMeshInfo &mim) +{ + constexpr int dbg_level = 0; + + im->populate_vert(); + int out_totvert = im->vert_size(); + int out_totpoly = im->face_size(); + int out_totloop = 0; + for (const Face *f : im->faces()) { + out_totloop += f->size(); + } + /* Will calculate edges later. */ + Mesh *result = BKE_mesh_new_nomain_from_template( + mim.meshes[0], out_totvert, 0, 0, out_totloop, out_totpoly); + + merge_vertex_loop_poly_customdata_layers(result, mim); + /* Set the vertex coordinate values and other data. */ + for (int vi : im->vert_index_range()) { + const Vert *v = im->vert(vi); + MVert *mv = &result->mvert[vi]; + copy_v3fl_v3db(mv->co, v->co); + if (v->orig != NO_INDEX) { + const Mesh *orig_me; + int index_in_orig_me; + const MVert *orig_mv = mim.input_mvert_for_orig_index(v->orig, &orig_me, &index_in_orig_me); + copy_vert_attributes(result, mv, orig_mv, orig_me, vi, index_in_orig_me); + } + } + + /* Set the loopstart and totloop for each output poly, + * and set the vertices in the appropriate loops. */ + int cur_loop_index = 0; + MLoop *l = result->mloop; + for (int fi : im->face_index_range()) { + const Face *f = im->face(fi); + const Mesh *orig_me; + int index_in_orig_me; + int orig_me_index; + const MPoly *orig_mp = mim.input_mpoly_for_orig_index( + f->orig, &orig_me, &orig_me_index, &index_in_orig_me); + MPoly *mp = &result->mpoly[fi]; + mp->totloop = f->size(); + mp->loopstart = cur_loop_index; + for (int j : f->index_range()) { + const Vert *vf = f->vert[j]; + const int vfi = im->lookup_vert(vf); + l->v = vfi; + ++l; + ++cur_loop_index; + } + copy_poly_attributes(result, mp, orig_mp, orig_me, fi, index_in_orig_me); + copy_or_interp_loop_attributes(result, f, mp, orig_mp, orig_me, orig_me_index, mim); + } + + /* BKE_mesh_calc_edges will calculate and populate all the + * MEdges from the MPolys. */ + BKE_mesh_calc_edges(result, false, false); + merge_edge_customdata_layers(result, mim); + + /* Now that the MEdges are populated, we can copy over the required attributes and custom layers. + */ + for (int fi : im->face_index_range()) { + const Face *f = im->face(fi); + MPoly *mp = &result->mpoly[fi]; + for (int j : f->index_range()) { + if (f->edge_orig[j] != NO_INDEX) { + const Mesh *orig_me; + int index_in_orig_me; + const MEdge *orig_medge = mim.input_medge_for_orig_index( + f->edge_orig[j], &orig_me, &index_in_orig_me); + int e_index = result->mloop[mp->loopstart + j].e; + MEdge *medge = &result->medge[e_index]; + copy_edge_attributes(result, medge, orig_medge, orig_me, e_index, index_in_orig_me); + } + } + } + + BKE_mesh_calc_normals(result); + if (dbg_level > 0) { + BKE_mesh_validate(result, true, true); + } + return result; +} + +/** + * Do Exact Boolean directly, without a round trip through #BMesh. + * The Mesh operands are in `meshes`, with corresponding transforms in in `obmats`. + */ +static Mesh *direct_mesh_boolean(const Mesh **meshes, + const float (*obmats[])[4][4], + const int meshes_len, + const bool use_self, + const BoolOpType boolean_mode) +{ + const int dbg_level = 0; + if (meshes_len <= 0) { + return nullptr; + } + if (dbg_level > 0) { + std::cout << "\nDIRECT_MESH_INTERSECT, nmeshes = " << meshes_len << "\n"; + } + Span mesh_span(meshes, meshes_len); + MeshesToIMeshInfo mim; + IMeshArena arena; + IMesh m_in = meshes_to_imesh(mesh_span, obmats, arena, &mim); + std::function shape_fn = [&mim](int f) { + for (int mi = 0; mi < mim.mesh_poly_offset.size() - 1; ++mi) { + if (f < mim.mesh_poly_offset[mi + 1]) { + return mi; + } + } + return static_cast(mim.mesh_poly_offset.size()) - 1; + }; + IMesh m_out = boolean_mesh(m_in, boolean_mode, meshes_len, shape_fn, use_self, nullptr, &arena); + if (dbg_level > 1) { + std::cout << m_out; + write_obj_mesh(m_out, "m_out"); + } + + return imesh_to_mesh(&m_out, mim); +} + +#endif // WITH_GMP +} // namespace blender::meshintersect + +extern "C" { + +#ifdef WITH_GMP +/* Do a mesh boolean directly on meshes (without going back and forth to BMesh). + * The \a meshes argument is an array of \a meshes_len of Mesh pointers. + * The \a obmats argument is an array of \a meshes_len of pointers to the obmat + * matrices that transform local coordinates to global ones. It is allowed + * for the pointers to be nullptr, meaning the transformation is the identity. */ +Mesh *BKE_mesh_boolean(const Mesh **meshes, + const float (*obmats[])[4][4], + const int meshes_len, + const bool use_self, + const int boolean_mode) +{ + return blender::meshintersect::direct_mesh_boolean( + meshes, + obmats, + meshes_len, + use_self, + static_cast(boolean_mode)); +} + +#else +Mesh *BKE_mesh_boolean(const Mesh **UNUSED(meshes), + const float (*obmats[])[4][4], + const int UNUSED(meshes_len), + const bool UNUSED(use_self), + const int UNUSED(boolean_mode)) +{ + UNUSED_VARS(obmats); + return NULL; +} + +#endif + +} // extern "C" diff --git a/source/blender/blenkernel/intern/mesh_merge.c b/source/blender/blenkernel/intern/mesh_merge.c index e118c1b6f6e..e3b5e5ea434 100644 --- a/source/blender/blenkernel/intern/mesh_merge.c +++ b/source/blender/blenkernel/intern/mesh_merge.c @@ -377,8 +377,8 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh, BLI_gset_insert(poly_gset, mpgh); } - /* Can we optimise by reusing an old pmap ? How do we know an old pmap is stale ? */ - /* When called by MOD_array.c, the cddm has just been created, so it has no valid pmap. */ + /* Can we optimize by reusing an old `pmap`? How do we know an old `pmap` is stale? */ + /* When called by `MOD_array.c` the `cddm` has just been created, so it has no valid `pmap`. */ BKE_mesh_vert_poly_map_create( &poly_map, &poly_map_mem, mesh->mpoly, mesh->mloop, totvert, totpoly, totloop); } /* done preparing for fast poly compare */ @@ -411,9 +411,10 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh, continue; } if (merge_mode == MESH_MERGE_VERTS_DUMP_IF_EQUAL) { - /* Additional condition for face dump: target vertices must make up an identical face */ - /* The test has 2 steps: (1) first step is fast ghash lookup, but not failproof */ - /* (2) second step is thorough but more costly poly compare */ + /* Additional condition for face dump: target vertices must make up an identical face. + * The test has 2 steps: + * 1) first step is fast `ghash` lookup, but not fail-proof. + * 2) second step is thorough but more costly poly compare. */ int i_poly, v_target; bool found = false; PolyKey pkey; diff --git a/source/blender/blenkernel/intern/mesh_remesh_voxel.c b/source/blender/blenkernel/intern/mesh_remesh_voxel.c index 82f6b1d6c89..3b3a6af9db9 100644 --- a/source/blender/blenkernel/intern/mesh_remesh_voxel.c +++ b/source/blender/blenkernel/intern/mesh_remesh_voxel.c @@ -71,7 +71,7 @@ struct OpenVDBLevelSet *BKE_mesh_remesh_voxel_ovdb_mesh_to_level_set_create( unsigned int totverts = mesh->totvert; float *verts = (float *)MEM_malloc_arrayN(totverts * 3, sizeof(float), "remesh_input_verts"); unsigned int *faces = (unsigned int *)MEM_malloc_arrayN( - totfaces * 3, sizeof(unsigned int), "remesh_intput_faces"); + totfaces * 3, sizeof(unsigned int), "remesh_input_faces"); for (unsigned int i = 0; i < totverts; i++) { MVert *mvert = &mesh->mvert[i]; @@ -175,7 +175,7 @@ static Mesh *BKE_mesh_remesh_quadriflow(Mesh *input_mesh, unsigned int totverts = input_mesh->totvert; float *verts = (float *)MEM_malloc_arrayN(totverts * 3, sizeof(float), "remesh_input_verts"); unsigned int *faces = (unsigned int *)MEM_malloc_arrayN( - totfaces * 3, sizeof(unsigned int), "remesh_intput_faces"); + totfaces * 3, sizeof(unsigned int), "remesh_input_faces"); for (unsigned int i = 0; i < totverts; i++) { MVert *mvert = &input_mesh->mvert[i]; diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index a2a0bd84234..34b7c4234ec 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -464,7 +464,7 @@ void BKE_modifier_set_error(const Object *ob, ModifierData *md, const char *_for * then is NULL) * also used for some mesh tools to give warnings */ -int BKE_modifiers_get_cage_index(struct Scene *scene, +int BKE_modifiers_get_cage_index(const Scene *scene, Object *ob, int *r_lastPossibleCageIndex, bool is_virtual) @@ -587,7 +587,7 @@ bool BKE_modifier_is_nonlocal_in_liboverride(const Object *ob, const ModifierDat (md == NULL || (md->flag & eModifierFlag_OverrideLibrary_Local) == 0)); } -CDMaskLink *BKE_modifier_calc_data_masks(struct Scene *scene, +CDMaskLink *BKE_modifier_calc_data_masks(const struct Scene *scene, Object *ob, ModifierData *md, CustomData_MeshMasks *final_datamask, @@ -655,7 +655,7 @@ CDMaskLink *BKE_modifier_calc_data_masks(struct Scene *scene, return dataMasks; } -ModifierData *BKE_modifier_get_last_preview(struct Scene *scene, +ModifierData *BKE_modifier_get_last_preview(const struct Scene *scene, ModifierData *md, int required_mode) { @@ -878,7 +878,7 @@ bool BKE_modifiers_uses_armature(Object *ob, bArmature *arm) return false; } -bool BKE_modifiers_uses_subsurf_facedots(struct Scene *scene, Object *ob) +bool BKE_modifiers_uses_subsurf_facedots(const struct Scene *scene, Object *ob) { /* Search (backward) in the modifier stack to find if we have a subsurf modifier (enabled) before * the last modifier displayed on cage (or if the subsurf is the last). */ @@ -919,7 +919,7 @@ bool BKE_modifier_is_correctable_deformed(ModifierData *md) return mti->deformMatricesEM != NULL; } -bool BKE_modifiers_is_correctable_deformed(struct Scene *scene, Object *ob) +bool BKE_modifiers_is_correctable_deformed(const struct Scene *scene, Object *ob) { VirtualModifierData virtualModifierData; ModifierData *md = BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData); diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c index 175caf85b49..017a73593ee 100644 --- a/source/blender/blenkernel/intern/movieclip.c +++ b/source/blender/blenkernel/intern/movieclip.c @@ -355,6 +355,7 @@ IDTypeInfo IDType_ID_MC = { .make_local = NULL, .foreach_id = movie_clip_foreach_id, .foreach_cache = movie_clip_foreach_cache, + .owner_get = NULL, .blend_write = movieclip_blend_write, .blend_read_data = movieclip_blend_read_data, @@ -1728,76 +1729,78 @@ void BKE_movieclip_update_scopes(MovieClip *clip, MovieClipUser *user, MovieClip scopes->track = NULL; scopes->track_locked = true; - if (clip) { - MovieTrackingTrack *act_track = BKE_tracking_track_get_active(&clip->tracking); + scopes->scene_framenr = user->framenr; + scopes->ok = true; - if (act_track) { - MovieTrackingTrack *track = act_track; - int framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, user->framenr); - MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr); - - scopes->marker = marker; - scopes->track = track; - - if (marker->flag & MARKER_DISABLED) { - scopes->track_disabled = true; - } - else { - ImBuf *ibuf = BKE_movieclip_get_ibuf(clip, user); - - scopes->track_disabled = false; - - if (ibuf && (ibuf->rect || ibuf->rect_float)) { - MovieTrackingMarker undist_marker = *marker; - - if (user->render_flag & MCLIP_PROXY_RENDER_UNDISTORT) { - int width, height; - float aspy = 1.0f / clip->tracking.camera.pixel_aspect; - - BKE_movieclip_get_size(clip, user, &width, &height); - - undist_marker.pos[0] *= width; - undist_marker.pos[1] *= height * aspy; - - BKE_tracking_undistort_v2( - &clip->tracking, width, height, undist_marker.pos, undist_marker.pos); - - undist_marker.pos[0] /= width; - undist_marker.pos[1] /= height * aspy; - } - - scopes->track_search = BKE_tracking_get_search_imbuf( - ibuf, track, &undist_marker, true, true); - - scopes->undist_marker = undist_marker; - - scopes->frame_width = ibuf->x; - scopes->frame_height = ibuf->y; - - scopes->use_track_mask = (track->flag & TRACK_PREVIEW_ALPHA) != 0; - } - - IMB_freeImBuf(ibuf); - } - - if ((track->flag & TRACK_LOCKED) == 0) { - float pat_min[2], pat_max[2]; - - scopes->track_locked = false; - - /* XXX: would work fine with non-transformed patterns, but would likely fail - * with transformed patterns, but that would be easier to debug when - * we'll have real pattern sampling (at least to test) */ - BKE_tracking_marker_pattern_minmax(marker, pat_min, pat_max); - - scopes->slide_scale[0] = pat_max[0] - pat_min[0]; - scopes->slide_scale[1] = pat_max[1] - pat_min[1]; - } - } + if (clip == NULL) { + return; } - scopes->framenr = user->framenr; - scopes->ok = true; + MovieTrackingTrack *track = BKE_tracking_track_get_active(&clip->tracking); + if (track == NULL) { + return; + } + + const int framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, user->framenr); + MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr); + + scopes->marker = marker; + scopes->track = track; + + if (marker->flag & MARKER_DISABLED) { + scopes->track_disabled = true; + } + else { + ImBuf *ibuf = BKE_movieclip_get_ibuf(clip, user); + + scopes->track_disabled = false; + + if (ibuf && (ibuf->rect || ibuf->rect_float)) { + MovieTrackingMarker undist_marker = *marker; + + if (user->render_flag & MCLIP_PROXY_RENDER_UNDISTORT) { + int width, height; + float aspy = 1.0f / clip->tracking.camera.pixel_aspect; + + BKE_movieclip_get_size(clip, user, &width, &height); + + undist_marker.pos[0] *= width; + undist_marker.pos[1] *= height * aspy; + + BKE_tracking_undistort_v2( + &clip->tracking, width, height, undist_marker.pos, undist_marker.pos); + + undist_marker.pos[0] /= width; + undist_marker.pos[1] /= height * aspy; + } + + scopes->track_search = BKE_tracking_get_search_imbuf( + ibuf, track, &undist_marker, true, true); + + scopes->undist_marker = undist_marker; + + scopes->frame_width = ibuf->x; + scopes->frame_height = ibuf->y; + + scopes->use_track_mask = (track->flag & TRACK_PREVIEW_ALPHA) != 0; + } + + IMB_freeImBuf(ibuf); + } + + if ((track->flag & TRACK_LOCKED) == 0) { + float pat_min[2], pat_max[2]; + + scopes->track_locked = false; + + /* XXX: would work fine with non-transformed patterns, but would likely fail + * with transformed patterns, but that would be easier to debug when + * we'll have real pattern sampling (at least to test) */ + BKE_tracking_marker_pattern_minmax(marker, pat_min, pat_max); + + scopes->slide_scale[0] = pat_max[0] - pat_min[0]; + scopes->slide_scale[1] = pat_max[1] - pat_min[1]; + } } static void movieclip_build_proxy_ibuf( @@ -2114,7 +2117,8 @@ GPUTexture *BKE_movieclip_get_gpu_texture(MovieClip *clip, MovieClipUser *cuser) /* This only means RGBA16F instead of RGBA32F. */ const bool high_bitdepth = false; const bool store_premultiplied = ibuf->rect_float ? false : true; - *tex = IMB_create_gpu_texture(clip->id.name + 2, ibuf, high_bitdepth, store_premultiplied); + *tex = IMB_create_gpu_texture( + clip->id.name + 2, ibuf, high_bitdepth, store_premultiplied, false); /* Do not generate mips for movieclips... too slow. */ GPU_texture_mipmap_mode(*tex, false, true); diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index a4440d3d9f3..7bd7fb4a29b 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -49,6 +49,7 @@ #include "BLI_ghash.h" #include "BLI_listbase.h" +#include "BLI_map.hh" #include "BLI_math.h" #include "BLI_path_util.h" #include "BLI_string.h" @@ -68,6 +69,7 @@ #include "BKE_lib_query.h" #include "BKE_main.h" #include "BKE_node.h" +#include "BKE_node_ui_storage.hh" #include "BLI_ghash.h" #include "BLI_threads.h" @@ -215,6 +217,10 @@ static void ntree_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, c /* node tree will generate its own interface type */ ntree_dst->interface_type = nullptr; + + /* Don't copy error messages in the runtime struct. + * They should be filled during execution anyway. */ + ntree_dst->ui_storage = nullptr; } static void ntree_free_data(ID *id) @@ -268,6 +274,8 @@ static void ntree_free_data(ID *id) if (ntree->id.tag & LIB_TAG_LOCALIZED) { BKE_libblock_free_data(&ntree->id, true); } + + delete ntree->ui_storage; } static void library_foreach_node_socket(LibraryForeachIDData *data, bNodeSocket *sock) @@ -359,6 +367,35 @@ static void node_foreach_cache(ID *id, } } +static ID *node_owner_get(Main *bmain, ID *id) +{ + if ((id->flag & LIB_EMBEDDED_DATA) == 0) { + return id; + } + BLI_assert((id->tag & LIB_TAG_NO_MAIN) == 0); + + ListBase *lists[] = {&bmain->materials, + &bmain->lights, + &bmain->worlds, + &bmain->textures, + &bmain->scenes, + &bmain->linestyles, + &bmain->simulations, + nullptr}; + + bNodeTree *ntree = (bNodeTree *)id; + for (int i = 0; lists[i] != nullptr; i++) { + LISTBASE_FOREACH (ID *, id_iter, lists[i]) { + if (ntreeFromID(id_iter) == ntree) { + return id_iter; + } + } + } + + BLI_assert(!"Embedded node tree with no owner. Critical Main inconsistency."); + return nullptr; +} + static void write_node_socket_default_value(BlendWriter *writer, bNodeSocket *sock) { if (sock->default_value == nullptr) { @@ -515,6 +552,13 @@ void ntreeBlendWrite(BlendWriter *writer, bNodeTree *ntree) BLO_write_struct_by_name(writer, node->typeinfo->storagename, node->storage); MEM_SAFE_FREE(nc->matte_id); } + else if (node->type == FN_NODE_INPUT_STRING) { + NodeInputString *storage = (NodeInputString *)node->storage; + if (storage->string) { + BLO_write_string(writer, storage->string); + } + BLO_write_struct_by_name(writer, node->typeinfo->storagename, storage); + } else if (node->typeinfo != &NodeTypeUndefined) { BLO_write_struct_by_name(writer, node->typeinfo->storagename, node->storage); } @@ -557,6 +601,7 @@ static void ntree_blend_write(BlendWriter *writer, ID *id, const void *id_addres ntree->interface_type = nullptr; ntree->progress = nullptr; ntree->execdata = nullptr; + ntree->ui_storage = nullptr; BLO_write_id_struct(writer, bNodeTree, id_address, &ntree->id); @@ -573,6 +618,7 @@ static void direct_link_node_socket(BlendDataReader *reader, bNodeSocket *sock) sock->typeinfo = nullptr; BLO_read_data_address(reader, &sock->storage); BLO_read_data_address(reader, &sock->default_value); + sock->total_inputs = 0; /* Clear runtime data set before drawing. */ sock->cache = nullptr; } @@ -587,6 +633,7 @@ void ntreeBlendReadData(BlendDataReader *reader, bNodeTree *ntree) ntree->progress = nullptr; ntree->execdata = nullptr; + ntree->ui_storage = nullptr; BLO_read_data_address(reader, &ntree->adt); BKE_animdata_blend_read_data(reader, ntree->adt); @@ -674,6 +721,11 @@ void ntreeBlendReadData(BlendDataReader *reader, bNodeTree *ntree) iuser->scene = nullptr; break; } + case FN_NODE_INPUT_STRING: { + NodeInputString *storage = (NodeInputString *)node->storage; + BLO_read_data_address(reader, &storage->string); + break; + } default: break; } @@ -893,6 +945,7 @@ IDTypeInfo IDType_ID_NT = { /* make_local */ nullptr, /* foreach_id */ node_foreach_id, /* foreach_cache */ node_foreach_cache, + /* owner_get */ node_owner_get, /* blend_write */ ntree_blend_write, /* blend_read_data */ ntree_blend_read_data, @@ -1410,18 +1463,24 @@ static void socket_id_user_decrement(bNodeSocket *sock) switch ((eNodeSocketDatatype)sock->type) { case SOCK_OBJECT: { bNodeSocketValueObject *default_value = (bNodeSocketValueObject *)sock->default_value; - id_us_min(&default_value->value->id); + if (default_value->value != nullptr) { + id_us_min(&default_value->value->id); + } break; } case SOCK_IMAGE: { bNodeSocketValueImage *default_value = (bNodeSocketValueImage *)sock->default_value; - id_us_min(&default_value->value->id); + if (default_value->value != nullptr) { + id_us_min(&default_value->value->id); + } break; } case SOCK_COLLECTION: { bNodeSocketValueCollection *default_value = (bNodeSocketValueCollection *) sock->default_value; - id_us_min(&default_value->value->id); + if (default_value->value != nullptr) { + id_us_min(&default_value->value->id); + } break; } case SOCK_FLOAT: @@ -2442,7 +2501,7 @@ static void node_preview_init_tree_recursive(bNodeInstanceHash *previews, bNodeInstanceKey parent_key, int xsize, int ysize, - int create) + bool create_previews) { LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { bNodeInstanceKey key = BKE_node_instance_key(parent_key, ntree, node); @@ -2451,16 +2510,17 @@ static void node_preview_init_tree_recursive(bNodeInstanceHash *previews, node->preview_xsize = xsize; node->preview_ysize = ysize; - BKE_node_preview_verify(previews, key, xsize, ysize, create); + BKE_node_preview_verify(previews, key, xsize, ysize, create_previews); } if (node->type == NODE_GROUP && node->id) { - node_preview_init_tree_recursive(previews, (bNodeTree *)node->id, key, xsize, ysize, create); + node_preview_init_tree_recursive( + previews, (bNodeTree *)node->id, key, xsize, ysize, create_previews); } } } -void BKE_node_preview_init_tree(bNodeTree *ntree, int xsize, int ysize, int create_previews) +void BKE_node_preview_init_tree(bNodeTree *ntree, int xsize, int ysize, bool create_previews) { if (!ntree) { return; @@ -2951,29 +3011,6 @@ bNodeTree *ntreeFromID(ID *id) return (nodetree != nullptr) ? *nodetree : nullptr; } -/* Finds and returns the datablock that privately owns the given tree, or null. */ -ID *BKE_node_tree_find_owner_ID(Main *bmain, struct bNodeTree *ntree) -{ - ListBase *lists[] = {&bmain->materials, - &bmain->lights, - &bmain->worlds, - &bmain->textures, - &bmain->scenes, - &bmain->linestyles, - &bmain->simulations, - nullptr}; - - for (int i = 0; lists[i] != nullptr; i++) { - LISTBASE_FOREACH (ID *, id, lists[i]) { - if (ntreeFromID(id) == ntree) { - return id; - } - } - } - - return nullptr; -} - bool ntreeNodeExists(const bNodeTree *ntree, const bNode *testnode) { LISTBASE_FOREACH (const bNode *, node, &ntree->nodes) { @@ -4753,12 +4790,14 @@ static void registerGeometryNodes() register_node_type_geo_align_rotation_to_vector(); register_node_type_geo_attribute_color_ramp(); + register_node_type_geo_attribute_combine_xyz(); register_node_type_geo_attribute_compare(); register_node_type_geo_attribute_fill(); register_node_type_geo_attribute_math(); register_node_type_geo_attribute_mix(); register_node_type_geo_attribute_proximity(); register_node_type_geo_attribute_randomize(); + register_node_type_geo_attribute_separate_xyz(); register_node_type_geo_attribute_vector_math(); register_node_type_geo_boolean(); register_node_type_geo_collection_info(); @@ -4775,6 +4814,7 @@ static void registerGeometryNodes() register_node_type_geo_points_to_volume(); register_node_type_geo_sample_texture(); register_node_type_geo_subdivision_surface(); + register_node_type_geo_subdivision_surface_simple(); register_node_type_geo_transform(); register_node_type_geo_triangulate(); register_node_type_geo_volume_to_mesh(); @@ -4786,6 +4826,7 @@ static void registerFunctionNodes() register_node_type_fn_combine_strings(); register_node_type_fn_float_compare(); register_node_type_fn_group_instance_id(); + register_node_type_fn_input_string(); register_node_type_fn_input_vector(); register_node_type_fn_object_transforms(); register_node_type_fn_random_float(); diff --git a/source/blender/blenkernel/intern/node_ui_storage.cc b/source/blender/blenkernel/intern/node_ui_storage.cc new file mode 100644 index 00000000000..ea492c4d36a --- /dev/null +++ b/source/blender/blenkernel/intern/node_ui_storage.cc @@ -0,0 +1,147 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "CLG_log.h" + +#include "BLI_map.hh" +#include "BLI_string_ref.hh" +#include "BLI_vector.hh" + +#include "DNA_node_types.h" +#include "DNA_object_types.h" + +#include "BKE_context.h" +#include "BKE_node_ui_storage.hh" +#include "BKE_object.h" + +static CLG_LogRef LOG = {"bke.node_ui_storage"}; + +using blender::Map; +using blender::StringRef; +using blender::Vector; + +static void ui_storage_ensure(bNodeTree &ntree) +{ + if (ntree.ui_storage == nullptr) { + ntree.ui_storage = new NodeTreeUIStorage(); + } +} + +const NodeUIStorage *BKE_node_tree_ui_storage_get_from_context(const bContext *C, + const bNodeTree &ntree, + const bNode &node) +{ + const NodeTreeUIStorage *ui_storage = ntree.ui_storage; + if (ui_storage == nullptr) { + return nullptr; + } + + const Object *active_object = CTX_data_active_object(C); + const ModifierData *active_modifier = BKE_object_active_modifier(active_object); + if (active_object == nullptr || active_modifier == nullptr) { + return nullptr; + } + + const NodeTreeEvaluationContext context(*active_object, *active_modifier); + const Map *storage = ui_storage->context_map.lookup_ptr(context); + if (storage == nullptr) { + return nullptr; + } + + return storage->lookup_ptr_as(StringRef(node.name)); +} + +/** + * Removes only the UI data associated with a particular evaluation context. The same node tree + * can be used for execution in multiple places, but the entire UI storage can't be removed when + * one execution starts, or all of the data associated with the node tree would be lost. + */ +void BKE_nodetree_ui_storage_free_for_context(bNodeTree &ntree, + const NodeTreeEvaluationContext &context) +{ + NodeTreeUIStorage *ui_storage = ntree.ui_storage; + if (ui_storage != nullptr) { + ui_storage->context_map.remove(context); + } +} + +static void node_error_message_log(bNodeTree &ntree, + const bNode &node, + const StringRef message, + const NodeWarningType type) +{ + switch (type) { + case NodeWarningType::Error: + CLOG_ERROR(&LOG, + "Node Tree: \"%s\", Node: \"%s\", %s", + ntree.id.name + 2, + node.name, + message.data()); + break; + case NodeWarningType::Warning: + CLOG_WARN(&LOG, + "Node Tree: \"%s\", Node: \"%s\", %s", + ntree.id.name + 2, + node.name, + message.data()); + break; + case NodeWarningType::Info: + CLOG_INFO(&LOG, + 2, + "Node Tree: \"%s\", Node: \"%s\", %s", + ntree.id.name + 2, + node.name, + message.data()); + break; + } +} + +static NodeUIStorage &find_node_ui_storage(bNodeTree &ntree, + const NodeTreeEvaluationContext &context, + const bNode &node) +{ + ui_storage_ensure(ntree); + NodeTreeUIStorage &ui_storage = *ntree.ui_storage; + + Map &node_tree_ui_storage = + ui_storage.context_map.lookup_or_add_default(context); + + NodeUIStorage &node_ui_storage = node_tree_ui_storage.lookup_or_add_default_as( + StringRef(node.name)); + + return node_ui_storage; +} + +void BKE_nodetree_error_message_add(bNodeTree &ntree, + const NodeTreeEvaluationContext &context, + const bNode &node, + const NodeWarningType type, + std::string message) +{ + node_error_message_log(ntree, node, message, type); + + NodeUIStorage &node_ui_storage = find_node_ui_storage(ntree, context, node); + node_ui_storage.warnings.append({type, std::move(message)}); +} + +void BKE_nodetree_attribute_hint_add(bNodeTree &ntree, + const NodeTreeEvaluationContext &context, + const bNode &node, + const StringRef attribute_name) +{ + NodeUIStorage &node_ui_storage = find_node_ui_storage(ntree, context, node); + node_ui_storage.attribute_name_hints.add_as(attribute_name); +} diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 381823754e9..704d6d1cf4f 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -1148,6 +1148,7 @@ IDTypeInfo IDType_ID_OB = { .make_local = object_make_local, .foreach_id = object_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = object_blend_write, .blend_read_data = object_blend_read_data, @@ -1742,6 +1743,7 @@ void BKE_object_free_derived_caches(Object *ob) } BKE_object_to_mesh_clear(ob); + BKE_object_to_curve_clear(ob); BKE_object_free_curve_cache(ob); /* Clear grease pencil data. */ @@ -1973,7 +1975,8 @@ int BKE_object_visibility(const Object *ob, const int dag_eval_mode) visibility |= OB_VISIBLE_INSTANCES; } - if (ob->runtime.geometry_set_eval != NULL) { + if (ob->runtime.geometry_set_eval != NULL && + BKE_geometry_set_has_instances(ob->runtime.geometry_set_eval)) { visibility |= OB_VISIBLE_INSTANCES; } @@ -5056,6 +5059,7 @@ void BKE_object_runtime_reset_on_copy(Object *object, const int UNUSED(flag)) runtime->mesh_deform_eval = NULL; runtime->curve_cache = NULL; runtime->object_as_temp_mesh = NULL; + runtime->object_as_temp_curve = NULL; runtime->geometry_set_eval = NULL; } @@ -5614,6 +5618,24 @@ void BKE_object_to_mesh_clear(Object *object) object->runtime.object_as_temp_mesh = NULL; } +Curve *BKE_object_to_curve(Object *object, Depsgraph *depsgraph, bool apply_modifiers) +{ + BKE_object_to_curve_clear(object); + + Curve *curve = BKE_curve_new_from_object(object, depsgraph, apply_modifiers); + object->runtime.object_as_temp_curve = curve; + return curve; +} + +void BKE_object_to_curve_clear(Object *object) +{ + if (object->runtime.object_as_temp_curve == NULL) { + return; + } + BKE_id_free(NULL, object->runtime.object_as_temp_curve); + object->runtime.object_as_temp_curve = NULL; +} + void BKE_object_check_uuids_unique_and_report(const Object *object) { BKE_pose_check_uuids_unique_and_report(object->pose); diff --git a/source/blender/blenkernel/intern/object_dupli.c b/source/blender/blenkernel/intern/object_dupli.c index 6c8a57f8599..632e7519f05 100644 --- a/source/blender/blenkernel/intern/object_dupli.c +++ b/source/blender/blenkernel/intern/object_dupli.c @@ -814,15 +814,17 @@ static const DupliGenerator gen_dupli_verts_pointcloud = { static void make_duplis_instances_component(const DupliContext *ctx) { float(*instance_offset_matrices)[4][4]; - int *ids; InstancedData *instanced_data; - const int amount = BKE_geometry_set_instances( - ctx->object->runtime.geometry_set_eval, &instance_offset_matrices, &ids, &instanced_data); + const int *almost_unique_ids; + const int amount = BKE_geometry_set_instances(ctx->object->runtime.geometry_set_eval, + &instance_offset_matrices, + &almost_unique_ids, + &instanced_data); for (int i = 0; i < amount; i++) { InstancedData *data = &instanced_data[i]; - const int id = ids[i] != -1 ? ids[i] : i; + const int id = almost_unique_ids[i]; if (data->type == INSTANCE_DATA_TYPE_OBJECT) { Object *object = data->data.object; diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c index 6c9b92d532d..0a2441bbf74 100644 --- a/source/blender/blenkernel/intern/paint.c +++ b/source/blender/blenkernel/intern/paint.c @@ -127,7 +127,7 @@ static void palette_blend_read_data(BlendDataReader *reader, ID *id) static void palette_undo_preserve(BlendLibReader *UNUSED(reader), ID *id_new, ID *id_old) { - /* Whole Palette is preserved across undos, and it has no extra pointer, simple. */ + /* Whole Palette is preserved across undo-steps, and it has no extra pointer, simple. */ /* Note: We do not care about potential internal references to self here, Palette has none. */ /* Note: We do not swap IDProperties, as dealing with potential ID pointers in those would be * fairly delicate. */ @@ -151,6 +151,7 @@ IDTypeInfo IDType_ID_PAL = { .make_local = NULL, .foreach_id = NULL, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = palette_blend_write, .blend_read_data = palette_blend_read_data, @@ -216,6 +217,7 @@ IDTypeInfo IDType_ID_PC = { .make_local = NULL, .foreach_id = NULL, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = paint_curve_blend_write, .blend_read_data = paint_curve_blend_read_data, diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 21d1e070389..acda59ce96c 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -504,6 +504,7 @@ IDTypeInfo IDType_ID_PA = { .make_local = NULL, .foreach_id = particle_settings_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = particle_settings_blend_write, .blend_read_data = particle_settings_blend_read_data, diff --git a/source/blender/blenkernel/intern/pointcloud.cc b/source/blender/blenkernel/intern/pointcloud.cc index b9ff2a1179d..d9a7a376e2e 100644 --- a/source/blender/blenkernel/intern/pointcloud.cc +++ b/source/blender/blenkernel/intern/pointcloud.cc @@ -183,6 +183,7 @@ IDTypeInfo IDType_ID_PT = { /* make_local */ nullptr, /* foreach_id */ pointcloud_foreach_id, /* foreach_cache */ nullptr, + /* owner_get */ nullptr, /* blend_write */ pointcloud_blend_write, /* blend_read_data */ pointcloud_blend_read_data, diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 5d923b34901..d77541924a7 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -167,8 +167,6 @@ static void scene_init_data(ID *id) &gp_primitive_curve->clipr, CURVE_PRESET_BELL, CURVEMAP_SLOPE_POSITIVE); - /* Grease pencil interpolate. */ - scene->toolsettings->gp_interpolate.step = 1; scene->unit.system = USER_UNIT_METRIC; scene->unit.scale_length = 1.0f; @@ -475,7 +473,7 @@ static void scene_foreach_rigidbodyworldSceneLooper(struct RigidBodyWorld *UNUSE /** * This code is shared by both the regular `foreach_id` looper, and the code trying to restore or - * preserve ID pointers like brushes across undoes. + * preserve ID pointers like brushes across undo-steps. */ typedef enum eSceneForeachUndoPreserveProcess { /* Undo when preserving tool-settings from old scene, we also want to try to preserve that ID @@ -1720,6 +1718,7 @@ IDTypeInfo IDType_ID_SCE = { .make_local = NULL, .foreach_id = scene_foreach_id, .foreach_cache = scene_foreach_cache, + .owner_get = NULL, .blend_write = scene_blend_write, .blend_read_data = scene_blend_read_data, diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c index 80a83aecea8..8b911143668 100644 --- a/source/blender/blenkernel/intern/screen.c +++ b/source/blender/blenkernel/intern/screen.c @@ -65,6 +65,10 @@ #include "BLO_read_write.h" +#ifdef WITH_PYTHON +# include "BPY_extern.h" +#endif + static void screen_free_data(ID *id) { bScreen *screen = (bScreen *)id; @@ -307,6 +311,7 @@ IDTypeInfo IDType_ID_SCR = { .make_local = NULL, .foreach_id = screen_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = screen_blend_write, /* Cannot be used yet, because #direct_link_screen has a return value. */ @@ -328,6 +333,9 @@ static ListBase spacetypes = {NULL, NULL}; static void spacetype_free(SpaceType *st) { LISTBASE_FOREACH (ARegionType *, art, &st->regiontypes) { +#ifdef WITH_PYTHON + BPY_callback_screen_free(art); +#endif BLI_freelistN(&art->drawcalls); LISTBASE_FOREACH (PanelType *, pt, &art->paneltypes) { @@ -525,7 +533,7 @@ void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2) /* facility to set locks for drawing to survive (render) threads accessing drawing data */ /* lock can become bitflag too */ /* should be replaced in future by better local data handling for threads */ -void BKE_spacedata_draw_locks(int set) +void BKE_spacedata_draw_locks(bool set) { LISTBASE_FOREACH (SpaceType *, st, &spacetypes) { LISTBASE_FOREACH (ARegionType *, art, &st->regiontypes) { diff --git a/source/blender/blenkernel/intern/simulation.cc b/source/blender/blenkernel/intern/simulation.cc index 4e0a08455e6..6b46804c251 100644 --- a/source/blender/blenkernel/intern/simulation.cc +++ b/source/blender/blenkernel/intern/simulation.cc @@ -166,6 +166,7 @@ IDTypeInfo IDType_ID_SIM = { /* make_local */ nullptr, /* foreach_id */ simulation_foreach_id, /* foreach_cache */ nullptr, + /* owner_get */ nullptr, /* blend_write */ simulation_blend_write, /* blend_read_data */ simulation_blend_read_data, diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c index 0c917434bd1..a33fedb3ea6 100644 --- a/source/blender/blenkernel/intern/sound.c +++ b/source/blender/blenkernel/intern/sound.c @@ -214,6 +214,7 @@ IDTypeInfo IDType_ID_SO = { .make_local = NULL, .foreach_id = NULL, .foreach_cache = sound_foreach_cache, + .owner_get = NULL, .blend_write = sound_blend_write, .blend_read_data = sound_blend_read_data, diff --git a/source/blender/blenkernel/intern/speaker.c b/source/blender/blenkernel/intern/speaker.c index 9caeaf05e6a..af9b2268879 100644 --- a/source/blender/blenkernel/intern/speaker.c +++ b/source/blender/blenkernel/intern/speaker.c @@ -107,6 +107,7 @@ IDTypeInfo IDType_ID_SPK = { .make_local = NULL, .foreach_id = speaker_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = speaker_blend_write, .blend_read_data = speaker_blend_read_data, diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c index 9bf215515f7..43d587861a5 100644 --- a/source/blender/blenkernel/intern/text.c +++ b/source/blender/blenkernel/intern/text.c @@ -251,6 +251,7 @@ IDTypeInfo IDType_ID_TXT = { .make_local = NULL, .foreach_id = NULL, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = text_blend_write, .blend_read_data = text_blend_read_data, diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c index ce84bfcd95a..29c41b88135 100644 --- a/source/blender/blenkernel/intern/texture.c +++ b/source/blender/blenkernel/intern/texture.c @@ -219,6 +219,7 @@ IDTypeInfo IDType_ID_TE = { .make_local = NULL, .foreach_id = texture_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = texture_blend_write, .blend_read_data = texture_blend_read_data, diff --git a/source/blender/blenkernel/intern/tracking_util.c b/source/blender/blenkernel/intern/tracking_util.c index ad2713b9977..ea0d92cf78e 100644 --- a/source/blender/blenkernel/intern/tracking_util.c +++ b/source/blender/blenkernel/intern/tracking_util.c @@ -60,7 +60,9 @@ # define CACHE_PRINTF(...) #endif -/*********************** Tracks map *************************/ +/* -------------------------------------------------------------------- */ +/** \name Tracks Map + * \{ */ TracksMap *tracks_map_new(const char *object_name, bool is_camera, @@ -242,7 +244,11 @@ void tracks_map_free(TracksMap *map, void (*customdata_free)(void *customdata)) MEM_freeN(map); } -/*********************** Space transformation functions *************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Space Transformation Functions + * \{ */ /* Three coordinate frames: Frame, Search, and Marker * Two units: Pixels, Unified @@ -399,7 +405,11 @@ void tracking_set_marker_coords_from_tracking(int frame_width, marker->pos[1] += marker_unified[1]; } -/*********************** General purpose utility functions *************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name General Purpose Utility Functions + * \{ */ /* Place a disabled marker before or after specified ref_marker. * @@ -613,7 +623,11 @@ MovieTrackingMarker *tracking_get_keyframed_marker(MovieTrackingTrack *track, return marker_keyed; } -/*********************** Frame accessr *************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Frame Accessor + * \{ */ static ImBuf *accessor_get_preprocessed_ibuf(TrackingImageAccessor *accessor, int clip_index, @@ -936,3 +950,5 @@ void tracking_image_accessor_destroy(TrackingImageAccessor *accessor) MEM_freeN(accessor->tracks); MEM_freeN(accessor); } + +/** \} */ diff --git a/source/blender/blenkernel/intern/undo_system.c b/source/blender/blenkernel/intern/undo_system.c index 07e7d07f1ef..52f0fe3f5a2 100644 --- a/source/blender/blenkernel/intern/undo_system.c +++ b/source/blender/blenkernel/intern/undo_system.c @@ -287,7 +287,7 @@ void BKE_undosys_stack_clear(UndoStack *ustack) void BKE_undosys_stack_clear_active(UndoStack *ustack) { - /* Remove active and all following undos. */ + /* Remove active and all following undo-steps. */ UndoStep *us = ustack->step_active; if (us) { @@ -517,7 +517,7 @@ UndoPushReturn BKE_undosys_step_push_with_type(UndoStack *ustack, retval |= UNDO_PUSH_RET_OVERRIDE_CHANGED; } - /* Remove all undos after (also when 'ustack->step_active == NULL'). */ + /* Remove all undo-steps after (also when 'ustack->step_active == NULL'). */ while (ustack->steps.last != ustack->step_active) { UndoStep *us_iter = ustack->steps.last; undosys_step_free_and_unlink(ustack, us_iter); @@ -768,10 +768,13 @@ bool BKE_undosys_step_load_data_ex(UndoStack *ustack, while (us_target_active != NULL && us_target_active->skip) { us_target_active = (undo_dir == -1) ? us_target_active->prev : us_target_active->next; } - } - if (us_target_active == NULL) { - CLOG_ERROR(&LOG, "could not find a valid final active target step"); - return false; + if (us_target_active == NULL) { + CLOG_INFO(&LOG, + 2, + "undo/redo did not find a step after stepping over skip-steps " + "(undo limit exceeded)"); + return false; + } } CLOG_INFO(&LOG, diff --git a/source/blender/blenkernel/intern/unit.c b/source/blender/blenkernel/intern/unit.c index e98fae9d92a..9ae1c754846 100644 --- a/source/blender/blenkernel/intern/unit.c +++ b/source/blender/blenkernel/intern/unit.c @@ -333,7 +333,7 @@ static struct bUnitCollection buPowerCollection = {buPowerDef, 3, 0, UNIT_COLLEC /* Temperature */ static struct bUnitDef buMetricTempDef[] = { {"kelvin", "kelvin", "K", NULL, "Kelvin", "KELVIN", 1.0f, 0.0, B_UNIT_DEF_NONE}, /* Base unit. */ - {"celsius", "celsius", "°C", "C", "Celsius", "CELCIUS", 1.0f, 273.15, B_UNIT_DEF_NONE}, + {"celsius", "celsius", "°C", "C", "Celsius", "CELSIUS", 1.0f, 273.15, B_UNIT_DEF_NONE}, NULL_UNIT, }; static struct bUnitCollection buMetricTempCollection = {buMetricTempDef, 0, 0, UNIT_COLLECTION_LENGTH(buMetricTempDef)}; diff --git a/source/blender/blenkernel/intern/volume.cc b/source/blender/blenkernel/intern/volume.cc index edf40ab3861..9b5231f7d6f 100644 --- a/source/blender/blenkernel/intern/volume.cc +++ b/source/blender/blenkernel/intern/volume.cc @@ -637,6 +637,7 @@ IDTypeInfo IDType_ID_VO = { /* make_local */ nullptr, /* foreach_id */ volume_foreach_id, /* foreach_cache */ volume_foreach_cache, + /* owner_get */ nullptr, /* blend_write */ volume_blend_write, /* blend_read_data */ volume_blend_read_data, diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c index 5a101cf009b..481d190952f 100644 --- a/source/blender/blenkernel/intern/workspace.c +++ b/source/blender/blenkernel/intern/workspace.c @@ -185,6 +185,7 @@ IDTypeInfo IDType_ID_WS = { .make_local = NULL, .foreach_id = workspace_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = workspace_blend_write, .blend_read_data = workspace_blend_read_data, diff --git a/source/blender/blenkernel/intern/world.c b/source/blender/blenkernel/intern/world.c index a2ce37a5d90..e889d8af1d5 100644 --- a/source/blender/blenkernel/intern/world.c +++ b/source/blender/blenkernel/intern/world.c @@ -199,6 +199,7 @@ IDTypeInfo IDType_ID_WO = { .make_local = NULL, .foreach_id = world_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = world_blend_write, .blend_read_data = world_blend_read_data, diff --git a/source/blender/blenkernel/intern/writeffmpeg.c b/source/blender/blenkernel/intern/writeffmpeg.c index e6adad765c3..0991d804882 100644 --- a/source/blender/blenkernel/intern/writeffmpeg.c +++ b/source/blender/blenkernel/intern/writeffmpeg.c @@ -37,6 +37,7 @@ # endif # include "BLI_math_base.h" +# include "BLI_threads.h" # include "BLI_utildefines.h" # include "BKE_global.h" @@ -566,8 +567,8 @@ static AVStream *alloc_video_stream(FFMpegContext *context, /* Set up the codec context */ c = st->codec; - c->thread_count = 0; - c->thread_type = FF_THREAD_FRAME; + c->thread_count = BLI_system_thread_count(); + c->thread_type = FF_THREAD_SLICE; c->codec_id = codec_id; c->codec_type = AVMEDIA_TYPE_VIDEO; @@ -780,8 +781,8 @@ static AVStream *alloc_audio_stream(FFMpegContext *context, st->id = 1; c = st->codec; - c->thread_count = 0; - c->thread_type = FF_THREAD_FRAME; + c->thread_count = BLI_system_thread_count(); + c->thread_type = FF_THREAD_SLICE; c->codec_id = codec_id; c->codec_type = AVMEDIA_TYPE_AUDIO; diff --git a/source/blender/blenkernel/nla_private.h b/source/blender/blenkernel/nla_private.h index 79c16e321be..706bcac4f17 100644 --- a/source/blender/blenkernel/nla_private.h +++ b/source/blender/blenkernel/nla_private.h @@ -79,6 +79,9 @@ typedef struct NlaValidMask { typedef struct NlaEvalChannelSnapshot { struct NlaEvalChannel *channel; + /** For an upper snapshot channel, marks values that should be blended. */ + NlaValidMask blend_domain; + int length; /* Number of values in the property. */ bool is_base; /* Base snapshot of the channel. */ @@ -182,6 +185,8 @@ void nladata_flush_channels(PointerRNA *ptr, NlaEvalSnapshot *snapshot, const bool flush_to_original); +void nlasnapshot_enable_all_blend_domain(NlaEvalSnapshot *snapshot); + void nlasnapshot_ensure_channels(NlaEvalData *eval_data, NlaEvalSnapshot *snapshot); void nlasnapshot_blend(NlaEvalData *eval_data, diff --git a/source/blender/blenlib/BLI_function_ref.hh b/source/blender/blenlib/BLI_function_ref.hh new file mode 100644 index 00000000000..57fffdc09b4 --- /dev/null +++ b/source/blender/blenlib/BLI_function_ref.hh @@ -0,0 +1,154 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include +#include + +#include "BLI_utildefines.h" + +/** \file + * \ingroup bli + * + * A `FunctionRef` is a non-owning reference to some callable object with a specific + * signature. It can be used to pass some callback to another function. + * + * A `FunctionRef` is small and cheap to copy. Therefore it should generally be passed by value. + * + * Example signatures: + * `FunctionRef` - A function without parameters and void return type. + * `FunctionRef` - A function with a float parameter and an int return value. + * `FunctionRef` - A function with two int parameters and an int return value. + * + * There are multiple ways to achieve that, so here is a comparison of the different approaches: + * 1. Pass function pointer and user data (as void *) separately: + * - The only method that is compatible with C interfaces. + * - Is cumbersome to work with in many cases, because one has to keep track of two parameters. + * - Not type safe at all, because of the void pointer. + * - It requires workarounds when one wants to pass a lambda into a function. + * 2. Using `std::function`: + * - It works well with most callables and is easy to use. + * - Owns the callable, so it can be returned from a function more safely than other methods. + * - Requires that the callable is copyable. + * - Requires an allocation when the callable is too large (typically > 16 bytes). + * 3. Using a template for the callable type: + * - Most efficient solution at runtime, because compiler knows the exact callable at the place + * where it is called. + * - Works well with all callables. + * - Requires the function to be in a header file. + * - It's difficult to constrain the signature of the function. + * 4. Using `FunctionRef`: + * - Second most efficient solution at runtime. + * - It's easy to constrain the signature of the callable. + * - Does not require the function to be in a header file. + * - Works well with all callables. + * - It's a non-owning reference, so it *cannot* be stored safely in general. + * + * The fact that this is a non-owning reference makes `FunctionRef` very well suited for some use + * cases, but one has to be a bit more careful when using it to make sure that the referenced + * callable is not destructed. + * + * In particular, one must not construct a `FunctionRef` variable from a lambda directly as shown + * below. This is because the lambda object goes out of scope after the line finished executing and + * will be destructed. Calling the reference afterwards invokes undefined behavior. + * + * Don't: + * FunctionRef ref = []() { return 0; }; + * Do: + * auto f = []() { return 0; }; + * FuntionRef ref = f; + * + * It is fine to pass a lambda directly to a function: + * + * void some_function(FunctionRef f); + * some_function([]() { return 0; }); + * + */ + +namespace blender { + +template class FunctionRef; + +template class FunctionRef { + private: + /** + * A function pointer that knows how to call the referenced callable with the given parameters. + */ + Ret (*callback_)(intptr_t callable, Params... params) = nullptr; + + /** + * A pointer to the referenced callable object. This can be a C function, a lambda object or any + * other callable. + * + * The value does not need to be initialized because it is not used unless callback_ is set as + * well, in which case it will be initialized as well. + * + * Use `intptr_t` to avoid warnings when casting to function pointers. + */ + intptr_t callable_; + + template static Ret callback_fn(intptr_t callable, Params... params) + { + return (*reinterpret_cast(callable))(std::forward(params)...); + } + + public: + FunctionRef() = default; + + /** + * A `FunctionRef` itself is a callable as well. However, we don't want that this + * constructor is called when `Callable` is a `FunctionRef`. If we would allow this, it + * would be easy to accidentally create a `FunctionRef` that internally calls another + * `FunctionRef`. Usually, when assigning a `FunctionRef` to another, we want that both + * contain a reference to the same underlying callable afterwards. + * + * It is still possible to reference another `FunctionRef` by first wrapping it in + * another lambda. + */ + template>, + FunctionRef>> * = nullptr> + FunctionRef(Callable &&callable) + : callback_(callback_fn>), + callable_(reinterpret_cast(&callable)) + { + } + + /** + * Call the referenced function and forward all parameters to it. + * + * This invokes undefined behavior if the `FunctionRef` does not reference a function currently. + */ + Ret operator()(Params... params) const + { + BLI_assert(callback_ != nullptr); + return callback_(callable_, std::forward(params)...); + } + + /** + * Returns true, when the `FunctionRef` references a function currently. + * If this returns false, the `FunctionRef` must not be called. + */ + operator bool() const + { + /* Just checking `callback_` is enough to determine if the `FunctionRef` is in a state that it + * can be called in. */ + return callback_ != nullptr; + } +}; + +} // namespace blender diff --git a/source/blender/blenlib/BLI_hash.h b/source/blender/blenlib/BLI_hash.h index d687e805323..cfd39ea3cf8 100644 --- a/source/blender/blenlib/BLI_hash.h +++ b/source/blender/blenlib/BLI_hash.h @@ -90,6 +90,16 @@ BLI_INLINE unsigned int BLI_hash_string(const char *str) return i; } +BLI_INLINE float BLI_hash_int_2d_to_float(uint32_t kx, uint32_t ky) +{ + return (float)BLI_hash_int_2d(kx, ky) / (float)0xFFFFFFFFu; +} + +BLI_INLINE float BLI_hash_int_3d_to_float(uint32_t kx, uint32_t ky, uint32_t kz) +{ + return (float)BLI_hash_int_3d(kx, ky, kz) / (float)0xFFFFFFFFu; +} + BLI_INLINE unsigned int BLI_hash_int(unsigned int k) { return BLI_hash_int_2d(k, 0); diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h index 1df22f7c2c9..bb1e1a1c38d 100644 --- a/source/blender/blenlib/BLI_math_vector.h +++ b/source/blender/blenlib/BLI_math_vector.h @@ -309,6 +309,7 @@ void interp_v4_v4v4_uchar(unsigned char target[4], void mid_v3_v3v3(float r[3], const float a[3], const float b[3]); void mid_v2_v2v2(float r[2], const float a[2], const float b[2]); void mid_v3_v3v3v3(float v[3], const float v1[3], const float v2[3], const float v3[3]); +void mid_v2_v2v2v2(float v[2], const float v1[2], const float v2[2], const float v3[2]); void mid_v3_v3v3v3v3( float v[3], const float v1[3], const float v2[3], const float v3[3], const float v4[3]); void mid_v3_v3_array(float r[3], const float (*vec_arr)[3], const unsigned int nbr); diff --git a/source/blender/blenlib/BLI_resource_collector.hh b/source/blender/blenlib/BLI_resource_collector.hh index 20180f3b2c9..ecae9b8c682 100644 --- a/source/blender/blenlib/BLI_resource_collector.hh +++ b/source/blender/blenlib/BLI_resource_collector.hh @@ -107,6 +107,15 @@ class ResourceCollector : NonCopyable, NonMovable { m_resources.append(data); } + /** + * Construct an object with the same value in the ResourceCollector and return a reference to the + * new value. + */ + template T &add_value(T &&value, const char *name) + { + return this->construct(name, std::forward(value)); + } + /** * Returns a reference to a linear allocator that is owned by the ResourcesCollector. Memory * allocated through this allocator will be freed when the collector is destructed. diff --git a/source/blender/blenlib/BLI_simd.h b/source/blender/blenlib/BLI_simd.h new file mode 100644 index 00000000000..2ebbd7a2250 --- /dev/null +++ b/source/blender/blenlib/BLI_simd.h @@ -0,0 +1,36 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#pragma once + +/** \file + * \ingroup bli + * + * SIMD instruction support. + */ + +#if defined(__ARM_NEON) && defined(WITH_SSE2NEON) +/* SSE/SSE2 emulation on ARM Neon. Match SSE precision. */ +# define SSE2NEON_PRECISE_MINMAX 1 +# define SSE2NEON_PRECISE_DIV 1 +# define SSE2NEON_PRECISE_SQRT 1 +# include +# define BLI_HAVE_SSE2 +#elif defined(__SSE2__) +/* Native SSE2 on Intel/AMD. */ +# include +# define BLI_HAVE_SSE2 +#endif diff --git a/source/blender/blenlib/BLI_span.hh b/source/blender/blenlib/BLI_span.hh index 8011b2f9abc..5f55efe3f63 100644 --- a/source/blender/blenlib/BLI_span.hh +++ b/source/blender/blenlib/BLI_span.hh @@ -142,15 +142,15 @@ template class Span { } /** - * Returns a contiguous part of the array. This invokes undefined behavior when the slice does - * not stay within the bounds of the array. + * Returns a contiguous part of the array. This invokes undefined behavior when the start or size + * is negative. */ constexpr Span slice(int64_t start, int64_t size) const { BLI_assert(start >= 0); BLI_assert(size >= 0); - BLI_assert(start + size <= this->size() || size == 0); - return Span(data_ + start, size); + const int64_t new_size = std::max(0, std::min(size, size_ - start)); + return Span(data_ + start, new_size); } constexpr Span slice(IndexRange range) const @@ -160,46 +160,46 @@ template class Span { /** * Returns a new Span with n elements removed from the beginning. This invokes undefined - * behavior when the array is too small. + * behavior when n is negative. */ constexpr Span drop_front(int64_t n) const { BLI_assert(n >= 0); - BLI_assert(n <= this->size()); - return this->slice(n, this->size() - n); + const int64_t new_size = std::max(0, size_ - n); + return Span(data_ + n, new_size); } /** * Returns a new Span with n elements removed from the beginning. This invokes undefined - * behavior when the array is too small. + * behavior when n is negative. */ constexpr Span drop_back(int64_t n) const { BLI_assert(n >= 0); - BLI_assert(n <= this->size()); - return this->slice(0, this->size() - n); + const int64_t new_size = std::max(0, size_ - n); + return Span(data_, new_size); } /** * Returns a new Span that only contains the first n elements. This invokes undefined - * behavior when the array is too small. + * behavior when n is negative. */ constexpr Span take_front(int64_t n) const { BLI_assert(n >= 0); - BLI_assert(n <= this->size()); - return this->slice(0, n); + const int64_t new_size = std::min(size_, n); + return Span(data_, new_size); } /** * Returns a new Span that only contains the last n elements. This invokes undefined - * behavior when the array is too small. + * behavior when n is negative. */ constexpr Span take_back(int64_t n) const { BLI_assert(n >= 0); - BLI_assert(n <= this->size()); - return this->slice(this->size() - n, n); + const int64_t new_size = std::min(size_, n); + return Span(data_ + size_ - new_size, new_size); } /** @@ -480,6 +480,14 @@ template class MutableSpan { return size_; } + /** + * Returns true if the size is zero. + */ + constexpr bool is_empty() const + { + return size_ == 0; + } + /** * Replace all elements in the referenced array with the given value. */ @@ -534,53 +542,59 @@ template class MutableSpan { } /** - * Returns a contiguous part of the array. This invokes undefined behavior when the slice would - * go out of bounds. + * Returns a contiguous part of the array. This invokes undefined behavior when the start or size + * is negative. */ - constexpr MutableSpan slice(const int64_t start, const int64_t length) const + constexpr MutableSpan slice(const int64_t start, const int64_t size) const { - BLI_assert(start + length <= this->size()); - return MutableSpan(data_ + start, length); + BLI_assert(start >= 0); + BLI_assert(size >= 0); + const int64_t new_size = std::max(0, std::min(size, size_ - start)); + return MutableSpan(data_ + start, new_size); } /** * Returns a new MutableSpan with n elements removed from the beginning. This invokes - * undefined behavior when the array is too small. + * undefined behavior when n is negative. */ constexpr MutableSpan drop_front(const int64_t n) const { - BLI_assert(n <= this->size()); - return this->slice(n, this->size() - n); + BLI_assert(n >= 0); + const int64_t new_size = std::max(0, size_ - n); + return MutableSpan(data_ + n, new_size); } /** * Returns a new MutableSpan with n elements removed from the end. This invokes undefined - * behavior when the array is too small. + * behavior when n is negative. */ constexpr MutableSpan drop_back(const int64_t n) const { - BLI_assert(n <= this->size()); - return this->slice(0, this->size() - n); + BLI_assert(n >= 0); + const int64_t new_size = std::max(0, size_ - n); + return MutableSpan(data_, new_size); } /** * Returns a new MutableSpan that only contains the first n elements. This invokes undefined - * behavior when the array is too small. + * behavior when n is negative. */ constexpr MutableSpan take_front(const int64_t n) const { - BLI_assert(n <= this->size()); - return this->slice(0, n); + BLI_assert(n >= 0); + const int64_t new_size = std::min(size_, n); + return MutableSpan(data_, new_size); } /** * Return a new MutableSpan that only contains the last n elements. This invokes undefined - * behavior when the array is too small. + * behavior when n is negative. */ constexpr MutableSpan take_back(const int64_t n) const { - BLI_assert(n <= this->size()); - return this->slice(this->size() - n, n); + BLI_assert(n >= 0); + const int64_t new_size = std::min(size_, n); + return MutableSpan(data_ + size_ - new_size, new_size); } /** diff --git a/source/blender/blenlib/BLI_string_ref.hh b/source/blender/blenlib/BLI_string_ref.hh index a2562c6100a..0cff8fa7fb4 100644 --- a/source/blender/blenlib/BLI_string_ref.hh +++ b/source/blender/blenlib/BLI_string_ref.hh @@ -321,37 +321,36 @@ class StringRef : public StringRefBase { } /** - * Returns a new StringRef that does not contain the first n chars. - * - * This is similar to std::string_view::remove_prefix. + * Returns a new StringRef that does not contain the first n chars. This invokes undefined + * behavior when n is negative. */ constexpr StringRef drop_prefix(const int64_t n) const { BLI_assert(n >= 0); - BLI_assert(n <= size_); - return StringRef(data_ + n, size_ - n); + const int64_t clamped_n = std::min(n, size_); + const int64_t new_size = size_ - clamped_n; + return StringRef(data_ + clamped_n, new_size); } /** * Return a new StringRef with the given prefix being skipped. This invokes undefined behavior if * the string does not begin with the given prefix. */ - constexpr StringRef drop_prefix(StringRef prefix) const + constexpr StringRef drop_known_prefix(StringRef prefix) const { BLI_assert(this->startswith(prefix)); return this->drop_prefix(prefix.size()); } /** - * Return a new StringRef that does not contain the last n chars. - * - * This is similar to std::string_view::remove_suffix. + * Return a new StringRef that does not contain the last n chars. This invokes undefined behavior + * when n is negative. */ constexpr StringRef drop_suffix(const int64_t n) const { BLI_assert(n >= 0); - BLI_assert(n <= size_); - return StringRef(data_, size_ - n); + const int64_t new_size = std::max(0, size_ - n); + return StringRef(data_, new_size); } /** @@ -460,7 +459,8 @@ constexpr inline bool StringRefBase::endswith(StringRef suffix) const } /** - * Return a new #StringRef containing only a sub-string of the original string. + * Return a new #StringRef containing only a sub-string of the original string. This invokes + * undefined if the start or max_size is negative. */ constexpr inline StringRef StringRefBase::substr(const int64_t start, const int64_t max_size = INT64_MAX) const diff --git a/source/blender/blenlib/BLI_task.hh b/source/blender/blenlib/BLI_task.hh index 0da03d84793..8e963c958b2 100644 --- a/source/blender/blenlib/BLI_task.hh +++ b/source/blender/blenlib/BLI_task.hh @@ -22,15 +22,15 @@ #ifdef WITH_TBB /* Quiet top level deprecation message, unrelated to API usage here. */ -# define TBB_SUPPRESS_DEPRECATED_MESSAGES 1 - # if defined(WIN32) && !defined(NOMINMAX) /* TBB includes Windows.h which will define min/max macros causing issues * when we try to use std::min and std::max later on. */ # define NOMINMAX # define TBB_MIN_MAX_CLEANUP # endif -# include +# include +# include +# include # ifdef WIN32 /* We cannot keep this defined, since other parts of the code deal with this on their own, leading * to multiple define warnings unless we un-define this, however we can only undefine this if we diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt index 363d3003b3c..5a851b7b2cb 100644 --- a/source/blender/blenlib/CMakeLists.txt +++ b/source/blender/blenlib/CMakeLists.txt @@ -192,6 +192,7 @@ set(SRC BLI_float3.hh BLI_float4x4.hh BLI_fnmatch.h + BLI_function_ref.hh BLI_ghash.h BLI_gsqueue.h BLI_hash.h @@ -388,6 +389,7 @@ if(WITH_GTESTS) tests/BLI_disjoint_set_test.cc tests/BLI_edgehash_test.cc tests/BLI_expr_pylike_eval_test.cc + tests/BLI_function_ref_test.cc tests/BLI_ghash_test.cc tests/BLI_hash_mm2a_test.cc tests/BLI_heap_simple_test.cc diff --git a/source/blender/blenlib/intern/array_store.c b/source/blender/blenlib/intern/array_store.c index 08164e75009..cc1d6df10f5 100644 --- a/source/blender/blenlib/intern/array_store.c +++ b/source/blender/blenlib/intern/array_store.c @@ -1012,7 +1012,6 @@ static const BChunkRef *table_lookup(const BArrayInfo *info, /* -------------------------------------------------------------------- */ /** \name Main Data De-Duplication Function - * * \{ */ /** diff --git a/source/blender/blenlib/intern/convexhull_2d.c b/source/blender/blenlib/intern/convexhull_2d.c index a3d24787d27..cb4ef54bfb7 100644 --- a/source/blender/blenlib/intern/convexhull_2d.c +++ b/source/blender/blenlib/intern/convexhull_2d.c @@ -28,7 +28,7 @@ #include "BLI_strict_flags.h" #include "BLI_utildefines.h" -/* Copyright 2001, softSurfer (www.softsurfer.com) +/* Copyright 2001, softSurfer (http://www.softsurfer.com) * This code may be freely used and modified for any purpose * providing that this copyright notice is included with it. * SoftSurfer makes no warranty for this code, and cannot be held diff --git a/source/blender/blenlib/intern/delaunay_2d.cc b/source/blender/blenlib/intern/delaunay_2d.cc index 1cf2046ce16..06a749ab921 100644 --- a/source/blender/blenlib/intern/delaunay_2d.cc +++ b/source/blender/blenlib/intern/delaunay_2d.cc @@ -1500,7 +1500,7 @@ template static void re_delaunay_triangulate(CDTArrangement *cdt, cse = ss; } } - /* Add diagonals necessary to make abc a triangle. */ + /* Add diagonals necessary to make `abc` a triangle. */ CDTEdge *ebc = nullptr; CDTEdge *eca = nullptr; if (!exists_edge(b, c)) { diff --git a/source/blender/blenlib/intern/dot_export.cc b/source/blender/blenlib/intern/dot_export.cc index 13a2341a9d5..93075a23c07 100644 --- a/source/blender/blenlib/intern/dot_export.cc +++ b/source/blender/blenlib/intern/dot_export.cc @@ -221,7 +221,7 @@ void Attributes::export__as_bracket_list(std::stringstream &ss) const ss << "["; attributes_.foreach_item([&](StringRef key, StringRef value) { if (StringRef(value).startswith("<")) { - /* Don't draw the quotes, this is an html-like value. */ + /* Don't draw the quotes, this is an HTML-like value. */ ss << key << "=" << value << ", "; } else { diff --git a/source/blender/blenlib/intern/fileops.c b/source/blender/blenlib/intern/fileops.c index bb218995c83..106bd5bc793 100644 --- a/source/blender/blenlib/intern/fileops.c +++ b/source/blender/blenlib/intern/fileops.c @@ -158,7 +158,7 @@ char *BLI_file_ungzip_to_mem(const char *from_file, int *r_size) return mem; } -#define CHUNK 256 * 1024 +#define CHUNK (256 * 1024) /* gzip byte array from memory and write it to file at certain position. * return size of gzip stream. diff --git a/source/blender/blenlib/intern/math_base_inline.c b/source/blender/blenlib/intern/math_base_inline.c index 28aa81e5858..39945960e68 100644 --- a/source/blender/blenlib/intern/math_base_inline.c +++ b/source/blender/blenlib/intern/math_base_inline.c @@ -31,11 +31,8 @@ #include #include -#ifdef __SSE2__ -# include -#endif - #include "BLI_math_base.h" +#include "BLI_simd.h" #ifdef __cplusplus extern "C" { @@ -685,10 +682,10 @@ MINLINE int integer_digits_i(const int i) /* Internal helpers for SSE2 implementation. * - * NOTE: Are to be called ONLY from inside `#ifdef __SSE2__` !!! + * NOTE: Are to be called ONLY from inside `#ifdef BLI_HAVE_SSE2` !!! */ -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 /* Calculate initial guess for arg^exp based on float representation * This method gives a constant bias, which can be easily compensated by @@ -769,7 +766,7 @@ MALWAYS_INLINE __m128 _bli_math_blend_sse(const __m128 mask, const __m128 a, con return _mm_or_ps(_mm_and_ps(mask, a), _mm_andnot_ps(mask, b)); } -#endif /* __SSE2__ */ +#endif /* BLI_HAVE_SSE2 */ /* Low level conversion functions */ MINLINE unsigned char unit_float_to_uchar_clamp(float val) diff --git a/source/blender/blenlib/intern/math_color_inline.c b/source/blender/blenlib/intern/math_color_inline.c index 26828cb8717..4c50c1c7af8 100644 --- a/source/blender/blenlib/intern/math_color_inline.c +++ b/source/blender/blenlib/intern/math_color_inline.c @@ -34,7 +34,7 @@ /******************************** Color Space ********************************/ -# ifdef __SSE2__ +# ifdef BLI_HAVE_SSE2 MALWAYS_INLINE __m128 srgb_to_linearrgb_v4_simd(const __m128 c) { @@ -75,7 +75,7 @@ MINLINE void linearrgb_to_srgb_v3_v3(float srgb[3], const float linear[3]) srgb[2] = r[2]; } -# else /* __SSE2__ */ +# else /* BLI_HAVE_SSE2 */ MINLINE void srgb_to_linearrgb_v3_v3(float linear[3], const float srgb[3]) { @@ -90,7 +90,7 @@ MINLINE void linearrgb_to_srgb_v3_v3(float srgb[3], const float linear[3]) srgb[1] = linearrgb_to_srgb(linear[1]); srgb[2] = linearrgb_to_srgb(linear[2]); } -# endif /* __SSE2__ */ +# endif /* BLI_HAVE_SSE2 */ MINLINE void srgb_to_linearrgb_v4(float linear[4], const float srgb[4]) { diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c index 5d78bb0b901..01cda6c9e4a 100644 --- a/source/blender/blenlib/intern/math_geom.c +++ b/source/blender/blenlib/intern/math_geom.c @@ -4886,8 +4886,8 @@ void window_translate_m4(float winmat[4][4], float perspmat[4][4], const float x len1 = (1.0f / len_v3(v1)); len2 = (1.0f / len_v3(v2)); - winmat[2][0] += len1 * winmat[0][0] * x; - winmat[2][1] += len2 * winmat[1][1] * y; + winmat[2][0] -= len1 * winmat[0][0] * x; + winmat[2][1] -= len2 * winmat[1][1] * y; } else { winmat[3][0] += x; @@ -5907,7 +5907,7 @@ static float ff_quad_form_factor(float *p, float *n, float *q0, float *q1, float #if 0 -# include +# include "BLI_simd.h" static __m128 sse_approx_acos(__m128 x) { diff --git a/source/blender/blenlib/intern/math_interp.c b/source/blender/blenlib/intern/math_interp.c index 3cec3db9806..163a3ab5fe3 100644 --- a/source/blender/blenlib/intern/math_interp.c +++ b/source/blender/blenlib/intern/math_interp.c @@ -139,10 +139,10 @@ BLI_INLINE void bicubic_interpolation(const unsigned char *byte_buffer, y1 = j + m; CLAMP(y1, 0, height - 1); - /* normally we could do this */ - /* w = P(n-a) * P(b-m); */ - /* except that would call P() 16 times per pixel therefor pow() 64 times, - * better precalc these */ + /* Normally we could do this: + * `w = P(n-a) * P(b-m);` + * except that would call `P()` 16 times per pixel therefor `pow()` 64 times, + * better pre-calculate these. */ w = wx * wy[m + 1]; if (float_output) { diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c index 6b5efc3f8c4..b460d75d77f 100644 --- a/source/blender/blenlib/intern/math_matrix.c +++ b/source/blender/blenlib/intern/math_matrix.c @@ -277,7 +277,7 @@ void mul_m4_m4m4_uniq(float R[4][4], const float A[4][4], const float B[4][4]) BLI_assert(!ELEM(R, A, B)); /* matrix product: R[j][k] = A[j][i] . B[i][k] */ -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 __m128 A0 = _mm_loadu_ps(A[0]); __m128 A1 = _mm_loadu_ps(A[1]); __m128 A2 = _mm_loadu_ps(A[2]); diff --git a/source/blender/blenlib/intern/math_vector.c b/source/blender/blenlib/intern/math_vector.c index 000468b3715..a21e0c8f092 100644 --- a/source/blender/blenlib/intern/math_vector.c +++ b/source/blender/blenlib/intern/math_vector.c @@ -280,6 +280,12 @@ void mid_v2_v2v2(float r[2], const float a[2], const float b[2]) r[1] = 0.5f * (a[1] + b[1]); } +void mid_v2_v2v2v2(float v[2], const float v1[2], const float v2[2], const float v3[2]) +{ + v[0] = (v1[0] + v2[0] + v3[0]) / 3.0f; + v[1] = (v1[1] + v2[1] + v3[1]) / 3.0f; +} + void mid_v3_v3v3v3(float v[3], const float v1[3], const float v2[3], const float v3[3]) { v[0] = (v1[0] + v2[0] + v3[0]) / 3.0f; diff --git a/source/blender/blenlib/intern/mesh_boolean.cc b/source/blender/blenlib/intern/mesh_boolean.cc index 09b6ffc1fd9..fcf5c5bfad3 100644 --- a/source/blender/blenlib/intern/mesh_boolean.cc +++ b/source/blender/blenlib/intern/mesh_boolean.cc @@ -38,6 +38,7 @@ # include "BLI_math_mpq.hh" # include "BLI_mesh_intersect.hh" # include "BLI_mpq3.hh" +# include "BLI_polyfill_2d.h" # include "BLI_set.hh" # include "BLI_span.hh" # include "BLI_stack.hh" @@ -2385,7 +2386,7 @@ static void inside_shape_callback(void *userdata, std::cout << " fv2=(" << fv2[0] << "," << fv2[1] << "," << fv2[2] << ")\n"; } if (isect_ray_tri_epsilon_v3( - ray->origin, ray->direction, fv0, fv1, fv2, &dist, NULL, FLT_EPSILON)) { + ray->origin, ray->direction, fv0, fv1, fv2, &dist, nullptr, FLT_EPSILON)) { /* Count parity as +1 if ray is in the same direction as tri's normal, * and -1 if the directions are opposite. */ double3 o_db{double(ray->origin[0]), double(ray->origin[1]), double(ray->origin[2])}; @@ -2403,8 +2404,8 @@ static void inside_shape_callback(void *userdata, * how likely we think it is that it is inside. * This is done by casting some rays from just on the positive side of a test * face in various directions and summing the parity of crossing faces of each face. - * The BVHtree \a tree contains all the triangles of \a tm and can be used for - * fast raycasting. + * + * \param tree: Contains all the triangles of \a tm and can be used for fast ray-casting. */ static void test_tri_inside_shapes(const IMesh &tm, std::function shape_fn, @@ -2424,7 +2425,7 @@ static void test_tri_inside_shapes(const IMesh &tm, return; } double3 test_point = calc_point_inside_tri_db(tri_test); - /* Offset the test point a tiny bit in the tri_test normal direcction. */ + /* Offset the test point a tiny bit in the tri_test normal direction. */ tri_test.populate_plane(false); double3 norm = tri_test.plane->norm.normalized(); const double offset_amount = 1e-5; @@ -2436,8 +2437,8 @@ static void test_tri_inside_shapes(const IMesh &tm, } /* Try six test rays almost along orthogonal axes. * Perturb their directions slightly to make it less likely to hit a seam. - * Raycast assumes they have unit length, so use r1 near 1 and - * ra near 0.5, and rb near .01, but normalized so sqrt(r1^2 + ra^2 + rb^2) == 1. */ + * Ray-cast assumes they have unit length, so use r1 near 1 and + * ra near 0.5, and rb near .01, but normalized so `sqrt(r1^2 + ra^2 + rb^2) == 1`. */ constexpr int num_rays = 6; constexpr float r1 = 0.9987025295199663f; constexpr float ra = 0.04993512647599832f; @@ -2589,25 +2590,9 @@ static IMesh raycast_boolean(const IMesh &tm, return ans; } -/** - * Which CDT output edge index is for an edge between output verts - * v1 and v2 (in either order)? - * \return -1 if none. - */ -static int find_cdt_edge(const CDT_result &cdt_out, int v1, int v2) -{ - for (int e : cdt_out.edge.index_range()) { - const std::pair &edge = cdt_out.edge[e]; - if ((edge.first == v1 && edge.second == v2) || (edge.first == v2 && edge.second == v1)) { - return e; - } - } - return -1; -} - /** * Tessellate face f into triangles and return an array of `const Face *` - * giving that triangulation. + * giving that triangulation. Intended to be used when f has > 4 vertices. * Care is taken so that the original edge index associated with * each edge in the output triangles either matches the original edge * for the (identical) edge of f, or else is -1. So diagonals added @@ -2615,68 +2600,55 @@ static int find_cdt_edge(const CDT_result &cdt_out, int v1, int v2) */ static Array triangulate_poly(Face *f, IMeshArena *arena) { + /* Similar to loop body in BM_mesh_calc_tesselation. */ int flen = f->size(); - CDT_input cdt_in; - cdt_in.vert = Array(flen); - cdt_in.face = Array>(1); - cdt_in.face[0].reserve(flen); - for (int i : f->index_range()) { - cdt_in.face[0].append(i); - } - /* Project poly along dominant axis of normal to get 2d coords. */ + BLI_assert(flen > 4); if (!f->plane_populated()) { f->populate_plane(false); } + /* Project along negative face normal so (x,y) can be used in 2d. */ const double3 &poly_normal = f->plane->norm; - int axis = double3::dominant_axis(poly_normal); - /* If project down y axis as opposed to x or z, the orientation - * of the polygon will be reversed. - * Yet another reversal happens if the poly normal in the dominant - * direction is opposite that of the positive dominant axis. */ - bool rev1 = (axis == 1); - bool rev2 = poly_normal[axis] < 0; - bool rev = rev1 ^ rev2; - for (int i = 0; i < flen; ++i) { - int ii = rev ? flen - i - 1 : i; - mpq2 &p2d = cdt_in.vert[ii]; - int k = 0; - for (int j = 0; j < 3; ++j) { - if (j != axis) { - p2d[k++] = (*f)[ii]->co_exact[j]; - } - } + float no[3] = {float(poly_normal[0]), float(poly_normal[1]), float(poly_normal[2])}; + normalize_v3(no); + float axis_mat[3][3]; + float(*projverts)[2]; + unsigned int(*tris)[3]; + const int totfilltri = flen - 2; + /* Prepare projected vertices and array to receive triangles in tesselation. */ + tris = static_cast(MEM_malloc_arrayN(totfilltri, sizeof(*tris), __func__)); + projverts = static_cast(MEM_malloc_arrayN(flen, sizeof(*projverts), __func__)); + axis_dominant_v3_to_m3_negate(axis_mat, no); + for (int j = 0; j < flen; ++j) { + const double3 &dco = (*f)[j]->co; + float co[3] = {float(dco[0]), float(dco[1]), float(dco[2])}; + mul_v2_m3v3(projverts[j], axis_mat, co); } - CDT_result cdt_out = delaunay_2d_calc(cdt_in, CDT_INSIDE); - int n_tris = cdt_out.face.size(); - Array ans(n_tris); - for (int t = 0; t < n_tris; ++t) { - int i_v_out[3]; - const Vert *v[3]; + BLI_polyfill_calc(projverts, flen, 1, tris); + /* Put tesselation triangles into Face form. Record original edges where they exist. */ + Array ans(totfilltri); + for (int t = 0; t < totfilltri; ++t) { + unsigned int *tri = tris[t]; int eo[3]; - for (int i = 0; i < 3; ++i) { - i_v_out[i] = cdt_out.face[t][i]; - v[i] = (*f)[cdt_out.vert_orig[i_v_out[i]][0]]; - } - for (int i = 0; i < 3; ++i) { - int e_out = find_cdt_edge(cdt_out, i_v_out[i], i_v_out[(i + 1) % 3]); - BLI_assert(e_out != -1); - eo[i] = NO_INDEX; - for (int orig : cdt_out.edge_orig[e_out]) { - if (orig != NO_INDEX) { - eo[i] = orig; - break; - } + const Vert *v[3]; + for (int k = 0; k < 3; k++) { + BLI_assert(tri[k] < flen); + v[k] = (*f)[tri[k]]; + /* If tri edge goes between two successive indices in + * the original face, then it is an original edge. */ + if ((tri[k] + 1) % flen == tri[(k + 1) % 3]) { + eo[k] = f->edge_orig[tri[k]]; + } + else { + eo[k] = NO_INDEX; } - } - if (rev) { - ans[t] = arena->add_face( - {v[0], v[2], v[1]}, f->orig, {eo[2], eo[1], eo[0]}, {false, false, false}); - } - else { ans[t] = arena->add_face( {v[0], v[1], v[2]}, f->orig, {eo[0], eo[1], eo[2]}, {false, false, false}); } } + + MEM_freeN(tris); + MEM_freeN(projverts); + return ans; } diff --git a/source/blender/blenlib/intern/noise.c b/source/blender/blenlib/intern/noise.c index b770a267eee..996a1622239 100644 --- a/source/blender/blenlib/intern/noise.c +++ b/source/blender/blenlib/intern/noise.c @@ -36,6 +36,10 @@ static float noise3_perlin(const float vec[3]); /* UNUSED */ // #define HASHVEC(x, y, z) hashvectf + 3 * hash[(hash[(hash[(z) & 255] + (y)) & 255] + (x)) & 255] +/* -------------------------------------------------------------------- */ +/** \name Static Data + * \{ */ + /* needed for voronoi */ #define HASHPNT(x, y, z) hashpntf + 3 * hash[(hash[(hash[(z)&255] + (y)) & 255] + (x)) & 255] static const float hashpntf[768] = { @@ -263,9 +267,11 @@ static const float hashvectf[768] = { 0.64801, -0.100586, 0.114716, 0.044525, -0.992371, 0.966003, 0.244873, -0.082764, }; -/**************************/ -/* IMPROVED PERLIN NOISE */ -/**************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Improved Perlin Noise Implementation (New) + * \{ */ BLI_INLINE float lerp(float t, float a, float b) { @@ -328,9 +334,11 @@ static float newPerlinU(float x, float y, float z) return (0.5f + 0.5f * newPerlin(x, y, z)); } -/**************************/ -/* END OF IMPROVED PERLIN */ -/**************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Improved Perlin Noise Implementation (Original) + * \{ */ /* Was BLI_noise_hnoise(), removed noisesize, so other functions can call it without scaling. */ static float orgBlenderNoise(float x, float y, float z) @@ -855,9 +863,11 @@ float BLI_noise_hnoisep(float noisesize, float x, float y, float z) return noise3_perlin(vec); } -/******************/ -/* VORONOI/WORLEY */ -/******************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Voronoi/Worley Implementation + * \{ */ /* distance metrics for voronoi, e parameter only used in Minkowski */ /* Camberra omitted, didn't seem useful */ @@ -1105,13 +1115,11 @@ static float voronoi_CrS(float x, float y, float z) return (2.0f * t - 1.0f); } -/***************/ -/* voronoi end */ -/***************/ +/** \} */ -/*************/ -/* CELLNOISE */ -/*************/ +/* -------------------------------------------------------------------- */ +/** \name Cell-Noise Implementation + * \{ */ /* returns unsigned cellnoise */ static float BLI_cellNoiseU(float x, float y, float z) @@ -1152,9 +1160,11 @@ void BLI_noise_cell_v3(float x, float y, float z, float ca[3]) ca[2] = p[2]; } -/*****************/ -/* end cellnoise */ -/*****************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Public API's + * \{ */ /* newnoise: generic noise function for use with different noisebases */ float BLI_noise_generic_noise( @@ -1747,6 +1757,4 @@ float BLI_noise_mg_variable_lacunarity( return noisefunc2(x + rv[0], y + rv[1], z + rv[2]); /* distorted-domain noise */ } -/****************/ -/* musgrave end */ -/****************/ +/** \} */ diff --git a/source/blender/blenlib/intern/string_search.cc b/source/blender/blenlib/intern/string_search.cc index a5983967542..a09aa7a4bc2 100644 --- a/source/blender/blenlib/intern/string_search.cc +++ b/source/blender/blenlib/intern/string_search.cc @@ -250,7 +250,7 @@ static int get_shortest_word_index_that_startswith(StringRef query, Span word_is_usable) { int best_word_size = INT32_MAX; - int bset_word_index = -1; + int best_word_index = -1; for (const int i : words.index_range()) { if (!word_is_usable[i]) { continue; @@ -258,11 +258,12 @@ static int get_shortest_word_index_that_startswith(StringRef query, StringRef word = words[i]; if (word.startswith(query)) { if (word.size() < best_word_size) { - bset_word_index = i; + best_word_index = i; + best_word_size = word.size(); } } } - return bset_word_index; + return best_word_index; } static int get_word_index_that_fuzzy_matches(StringRef query, diff --git a/source/blender/blenlib/intern/system.c b/source/blender/blenlib/intern/system.c index e32f310549c..f4110c65a6d 100644 --- a/source/blender/blenlib/intern/system.c +++ b/source/blender/blenlib/intern/system.c @@ -128,6 +128,7 @@ static void __cpuid( : "a"(selector) : "ebx"); # else + (void)selector; data[0] = data[1] = data[2] = data[3] = 0; # endif } diff --git a/source/blender/blenlib/intern/task_graph.cc b/source/blender/blenlib/intern/task_graph.cc index 5b804cd1df8..32450c16630 100644 --- a/source/blender/blenlib/intern/task_graph.cc +++ b/source/blender/blenlib/intern/task_graph.cc @@ -28,10 +28,7 @@ #include #ifdef WITH_TBB -/* Quiet top level deprecation message, unrelated to API usage here. */ -# define TBB_SUPPRESS_DEPRECATED_MESSAGES 1 # include -# include #endif /* Task Graph */ diff --git a/source/blender/blenlib/intern/task_pool.cc b/source/blender/blenlib/intern/task_pool.cc index ac2c5a5e5e1..1c48bcf9af4 100644 --- a/source/blender/blenlib/intern/task_pool.cc +++ b/source/blender/blenlib/intern/task_pool.cc @@ -34,9 +34,9 @@ #include "BLI_threads.h" #ifdef WITH_TBB -/* Quiet top level deprecation message, unrelated to API usage here. */ -# define TBB_SUPPRESS_DEPRECATED_MESSAGES 1 -# include +# include +# include +# include #endif /* Task diff --git a/source/blender/blenlib/intern/task_range.cc b/source/blender/blenlib/intern/task_range.cc index c2498de1af8..a27241e91dd 100644 --- a/source/blender/blenlib/intern/task_range.cc +++ b/source/blender/blenlib/intern/task_range.cc @@ -32,9 +32,10 @@ #include "atomic_ops.h" #ifdef WITH_TBB -/* Quiet top level deprecation message, unrelated to API usage here. */ -# define TBB_SUPPRESS_DEPRECATED_MESSAGES 1 -# include +# include +# include +# include +# include #endif #ifdef WITH_TBB diff --git a/source/blender/blenlib/intern/task_scheduler.cc b/source/blender/blenlib/intern/task_scheduler.cc index b0245da0385..b22334a5676 100644 --- a/source/blender/blenlib/intern/task_scheduler.cc +++ b/source/blender/blenlib/intern/task_scheduler.cc @@ -26,10 +26,10 @@ #include "BLI_threads.h" #ifdef WITH_TBB -/* Quiet top level deprecation message, unrelated to API usage here. */ -# define TBB_SUPPRESS_DEPRECATED_MESSAGES 1 -# include +/* Need to include at least one header to get the version define. */ +# include # if TBB_INTERFACE_VERSION_MAJOR >= 10 +# include # define WITH_TBB_GLOBAL_CONTROL # endif #endif diff --git a/source/blender/blenlib/intern/uvproject.c b/source/blender/blenlib/intern/uvproject.c index 00fef29587c..329c4d48fe8 100644 --- a/source/blender/blenlib/intern/uvproject.c +++ b/source/blender/blenlib/intern/uvproject.c @@ -132,8 +132,8 @@ void BLI_uvproject_from_view(float target[2], target[1] = (y + target[1]) / winy; } -/* 'rotmat' can be obedit->obmat when uv project is used. - * 'winx' and 'winy' can be from scene->r.xsch/ysch */ +/* 'rotmat' can be `obedit->obmat` when uv project is used. + * 'winx' and 'winy' can be from `scene->r.xsch/ysch` */ ProjCameraInfo *BLI_uvproject_camera_info(Object *ob, float (*rotmat)[4], float winx, float winy) { ProjCameraInfo uci; diff --git a/source/blender/blenlib/tests/BLI_function_ref_test.cc b/source/blender/blenlib/tests/BLI_function_ref_test.cc new file mode 100644 index 00000000000..cdcbccc72e8 --- /dev/null +++ b/source/blender/blenlib/tests/BLI_function_ref_test.cc @@ -0,0 +1,102 @@ +/* Apache License, Version 2.0 */ + +#include "BLI_function_ref.hh" + +#include "testing/testing.h" + +namespace blender::tests { + +static int perform_binary_operation(int a, int b, FunctionRef operation) +{ + return operation(a, b); +} + +TEST(function_ref, StatelessLambda) +{ + const int result = perform_binary_operation(4, 6, [](int a, int b) { return a - b; }); + EXPECT_EQ(result, -2); +} + +TEST(function_ref, StatefullLambda) +{ + const int factor = 10; + const int result = perform_binary_operation( + 2, 3, [&](int a, int b) { return factor * (a + b); }); + EXPECT_EQ(result, 50); +} + +static int add_two_numbers(int a, int b) +{ + return a + b; +} + +TEST(function_ref, StandaloneFunction) +{ + const int result = perform_binary_operation(10, 5, add_two_numbers); + EXPECT_EQ(result, 15); +} + +TEST(function_ref, ConstantFunction) +{ + auto f = []() { return 42; }; + FunctionRef ref = f; + EXPECT_EQ(ref(), 42); +} + +TEST(function_ref, MutableStatefullLambda) +{ + int counter = 0; + auto f = [&]() mutable { return counter++; }; + FunctionRef ref = f; + EXPECT_EQ(ref(), 0); + EXPECT_EQ(ref(), 1); + EXPECT_EQ(ref(), 2); +} + +TEST(function_ref, Null) +{ + FunctionRef ref; + EXPECT_FALSE(ref); + + auto f = []() { return 1; }; + ref = f; + EXPECT_TRUE(ref); + + ref = {}; + EXPECT_FALSE(ref); +} + +TEST(function_ref, CopyDoesNotReferenceFunctionRef) +{ + auto f1 = []() { return 1; }; + auto f2 = []() { return 2; }; + FunctionRef x = f1; + FunctionRef y = x; + x = f2; + EXPECT_EQ(y(), 1); +} + +TEST(function_ref, CopyDoesNotReferenceFunctionRef2) +{ + auto f = []() { return 1; }; + FunctionRef x; + FunctionRef y = f; + FunctionRef z = static_cast &&>(y); + x = z; + y = {}; + EXPECT_EQ(x(), 1); +} + +TEST(function_ref, ReferenceAnotherFunctionRef) +{ + auto f1 = []() { return 1; }; + auto f2 = []() { return 2; }; + FunctionRef x = f1; + auto f3 = [&]() { return x(); }; + FunctionRef y = f3; + EXPECT_EQ(y(), 1); + x = f2; + EXPECT_EQ(y(), 2); +} + +} // namespace blender::tests diff --git a/source/blender/blenlib/tests/BLI_span_test.cc b/source/blender/blenlib/tests/BLI_span_test.cc index d1c9f312b97..002c97b0c7d 100644 --- a/source/blender/blenlib/tests/BLI_span_test.cc +++ b/source/blender/blenlib/tests/BLI_span_test.cc @@ -62,6 +62,15 @@ TEST(span, DropFront) EXPECT_EQ(slice[2], 7); } +TEST(span, DropFrontLargeN) +{ + Vector a = {1, 2, 3, 4, 5}; + Span slice1 = Span(a).drop_front(100); + MutableSpan slice2 = MutableSpan(a).drop_front(100); + EXPECT_TRUE(slice1.is_empty()); + EXPECT_TRUE(slice2.is_empty()); +} + TEST(span, DropFrontAll) { Vector a = {4, 5, 6, 7}; @@ -78,6 +87,15 @@ TEST(span, TakeFront) EXPECT_EQ(slice[1], 5); } +TEST(span, TakeFrontLargeN) +{ + Vector a = {4, 5, 6, 7}; + Span slice1 = Span(a).take_front(100); + MutableSpan slice2 = MutableSpan(a).take_front(100); + EXPECT_EQ(slice1.size(), 4); + EXPECT_EQ(slice2.size(), 4); +} + TEST(span, TakeBack) { Vector a = {5, 6, 7, 8}; @@ -87,6 +105,15 @@ TEST(span, TakeBack) EXPECT_EQ(slice[1], 8); } +TEST(span, TakeBackLargeN) +{ + Vector a = {3, 4, 5, 6}; + Span slice1 = Span(a).take_back(100); + MutableSpan slice2 = MutableSpan(a).take_back(100); + EXPECT_EQ(slice1.size(), 4); + EXPECT_EQ(slice2.size(), 4); +} + TEST(span, Slice) { Vector a = {4, 5, 6, 7}; @@ -112,6 +139,19 @@ TEST(span, SliceRange) EXPECT_EQ(slice[1], 4); } +TEST(span, SliceLargeN) +{ + Vector a = {1, 2, 3, 4, 5}; + Span slice1 = Span(a).slice(3, 100); + MutableSpan slice2 = MutableSpan(a).slice(3, 100); + EXPECT_EQ(slice1.size(), 2); + EXPECT_EQ(slice2.size(), 2); + EXPECT_EQ(slice1[0], 4); + EXPECT_EQ(slice2[0], 4); + EXPECT_EQ(slice1[1], 5); + EXPECT_EQ(slice2[1], 5); +} + TEST(span, Contains) { Vector a = {4, 5, 6, 7}; @@ -337,7 +377,7 @@ TEST(span, MutableReverseIterator) EXPECT_EQ_ARRAY(src.data(), Span({14, 15, 16, 17}).data(), 4); } -TEST(span, constexpr_) +TEST(span, Constexpr) { static constexpr std::array src = {3, 2, 1}; constexpr Span span(src); diff --git a/source/blender/blenlib/tests/BLI_string_ref_test.cc b/source/blender/blenlib/tests/BLI_string_ref_test.cc index 401a7bc1118..fb8b894bfd5 100644 --- a/source/blender/blenlib/tests/BLI_string_ref_test.cc +++ b/source/blender/blenlib/tests/BLI_string_ref_test.cc @@ -246,10 +246,18 @@ TEST(string_ref, DropPrefixN) EXPECT_EQ(ref3, ""); } -TEST(string_ref, DropPrefix) +TEST(string_ref, DropPrefixLargeN) { StringRef ref("test"); - StringRef ref2 = ref.drop_prefix("tes"); + StringRef ref2 = ref.drop_prefix(100); + EXPECT_EQ(ref2.size(), 0); + EXPECT_EQ(ref2, ""); +} + +TEST(string_ref, DropKnownPrefix) +{ + StringRef ref("test"); + StringRef ref2 = ref.drop_known_prefix("tes"); EXPECT_EQ(ref2.size(), 1); EXPECT_EQ(ref2, "t"); } @@ -262,6 +270,14 @@ TEST(string_ref, DropSuffix) EXPECT_EQ(ref2, "tes"); } +TEST(string_ref, DropSuffixLargeN) +{ + StringRef ref("test"); + StringRef ref2 = ref.drop_suffix(100); + EXPECT_EQ(ref2.size(), 0); + EXPECT_EQ(ref2, ""); +} + TEST(string_ref, Substr) { StringRef ref("hello world"); @@ -298,7 +314,7 @@ TEST(string_ref, ToStringView) EXPECT_EQ(view, "hello"); } -TEST(string_ref, constexpr_) +TEST(string_ref, Constexpr) { constexpr StringRef sref("World"); BLI_STATIC_ASSERT(sref[2] == 'r', ""); diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 89d4fe0b222..c0293c1f8f2 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2740,7 +2740,7 @@ static void lib_link_window_scene_data_restore(wmWindow *win, Scene *scene, View v3d->localvd->camera = scene->camera; - /* Localview can become invalid during undo/redo steps, + /* Local-view can become invalid during undo/redo steps, * so we exit it when no could be found. */ for (base = view_layer->object_bases.first; base; base = base->next) { if (base->local_view_bits & v3d->local_view_uuid) { @@ -2752,7 +2752,7 @@ static void lib_link_window_scene_data_restore(wmWindow *win, Scene *scene, View v3d->localvd = NULL; v3d->local_view_uuid = 0; - /* Regionbase storage is different depending if the space is active. */ + /* Region-base storage is different depending if the space is active. */ ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase : &sl->regionbase; LISTBASE_FOREACH (ARegion *, region, regionbase) { @@ -3918,6 +3918,26 @@ static void lib_link_all(FileData *fd, Main *bmain) } FOREACH_MAIN_ID_END; +#ifndef NDEBUG + /* Double check we do not have any 'need link' tag remaining, this should never be the case once + * this function has run. */ + FOREACH_MAIN_ID_BEGIN (bmain, id) { + BLI_assert((id->tag & LIB_TAG_NEED_LINK) == 0); + } + FOREACH_MAIN_ID_END; +#endif +} + +/** + * Checks to perform after `lib_link_all`. + * Those operations cannot perform properly in a split bmain case, since some data from other + * bmain's (aka libraries) may not have been processed yet. + */ +static void after_liblink_merged_bmain_process(Main *bmain) +{ + /* We only expect a merged Main here, not a split one. */ + BLI_assert((bmain->prev == NULL) && (bmain->next == NULL)); + /* Check for possible cycles in scenes' 'set' background property. */ lib_link_scenes_check_set(bmain); @@ -3928,15 +3948,6 @@ static void lib_link_all(FileData *fd, Main *bmain) /* We have to rebuild that runtime information *after* all data-blocks have been properly linked. */ BKE_main_collections_parent_relations_rebuild(bmain); - -#ifndef NDEBUG - /* Double check we do not have any 'need link' tag remaining, this should never be the case once - * this function has run. */ - FOREACH_MAIN_ID_BEGIN (bmain, id) { - BLI_assert((id->tag & LIB_TAG_NEED_LINK) == 0); - } - FOREACH_MAIN_ID_END; -#endif } /** \} */ @@ -4159,6 +4170,7 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath) blo_join_main(&mainlist); lib_link_all(fd, bfd->main); + after_liblink_merged_bmain_process(bfd->main); /* Skip in undo case. */ if (fd->memfile == NULL) { @@ -4588,6 +4600,13 @@ static bool object_in_any_collection(Main *bmain, Object *ob) } } + LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { + if (scene->master_collection != NULL && + BKE_collection_has_object(scene->master_collection, ob)) { + return true; + } + } + return false; } @@ -5107,6 +5126,7 @@ static void library_link_end(Main *mainl, mainl = NULL; /* blo_join_main free's mainl, cant use anymore */ lib_link_all(*fd, mainvar); + after_liblink_merged_bmain_process(mainvar); /* Some versioning code does expect some proper userrefcounting, e.g. in conversion from * groups to collections... We could optimize out that first call when we are reading a @@ -5222,7 +5242,7 @@ static int has_linked_ids_to_read(Main *mainvar) } static void read_library_linked_id( - ReportList *reports, FileData *fd, Main *mainvar, ID *id, ID **r_id) + FileData *basefd, FileData *fd, Main *mainvar, ID *id, ID **r_id) { BHead *bhead = NULL; const bool is_valid = BKE_idtype_idcode_is_linkable(GS(id->name)) || @@ -5233,7 +5253,7 @@ static void read_library_linked_id( } if (!is_valid) { - BLO_reportf_wrap(reports, + BLO_reportf_wrap(basefd->reports, RPT_ERROR, TIP_("LIB: %s: '%s' is directly linked from '%s' (parent '%s'), but is a " "non-linkable data type"), @@ -5252,13 +5272,14 @@ static void read_library_linked_id( read_libblock(fd, mainvar, bhead, id->tag, false, r_id); } else { - BLO_reportf_wrap(reports, - RPT_WARNING, + BLO_reportf_wrap(basefd->reports, + RPT_INFO, TIP_("LIB: %s: '%s' missing from '%s', parent '%s'"), BKE_idtype_idcode_to_name(GS(id->name)), id->name + 2, mainvar->curlib->filepath_abs, library_parent_filepath(mainvar->curlib)); + basefd->library_id_missing_count++; /* Generate a placeholder for this ID (simplified version of read_libblock actually...). */ if (r_id) { @@ -5292,7 +5313,7 @@ static void read_library_linked_ids(FileData *basefd, * we go back to a single linked data when loading the file. */ ID **realid = NULL; if (!BLI_ghash_ensure_p(loaded_ids, id->name, (void ***)&realid)) { - read_library_linked_id(basefd->reports, fd, mainvar, id, realid); + read_library_linked_id(basefd, fd, mainvar, id, realid); } /* realid shall never be NULL - unless some source file/lib is broken @@ -5412,7 +5433,8 @@ static FileData *read_library_file_data(FileData *basefd, if (fd == NULL) { BLO_reportf_wrap( - basefd->reports, RPT_WARNING, TIP_("Cannot find lib '%s'"), mainptr->curlib->filepath_abs); + basefd->reports, RPT_INFO, TIP_("Cannot find lib '%s'"), mainptr->curlib->filepath_abs); + basefd->library_file_missing_count++; } return fd; @@ -5506,6 +5528,15 @@ static void read_libraries(FileData *basefd, ListBase *mainlist) mainptr->curlib->filedata = NULL; } BKE_main_free(main_newid); + + if (basefd->library_file_missing_count != 0 || basefd->library_id_missing_count != 0) { + BKE_reportf(basefd->reports, + RPT_WARNING, + "LIB: %d libraries and %d linked data-blocks are missing, please check the " + "Info and Outliner editors for details", + basefd->library_file_missing_count, + basefd->library_id_missing_count); + } } void *BLO_read_get_new_data_address(BlendDataReader *reader, const void *old_address) diff --git a/source/blender/blenloader/intern/readfile.h b/source/blender/blenloader/intern/readfile.h index e007d42b283..b81d8bd9a2b 100644 --- a/source/blender/blenloader/intern/readfile.h +++ b/source/blender/blenloader/intern/readfile.h @@ -33,6 +33,7 @@ #include "DNA_windowmanager_types.h" /* for ReportType */ #include "zlib.h" +struct BLI_mmap_file; struct BLOCacheStorage; struct IDNameLib_Map; struct Key; @@ -41,7 +42,6 @@ struct Object; struct OldNewMap; struct ReportList; struct UserDef; -struct BLI_mmap_file; typedef struct IDNameLib_Map IDNameLib_Map; @@ -138,6 +138,10 @@ typedef struct FileData { struct IDNameLib_Map *old_idmap; struct ReportList *reports; + /* Counters for amount of missing libraries, and missing IDs in libraries. + * Used to generate a synthetic report in the UI. */ + int library_file_missing_count; + int library_id_missing_count; } FileData; #define SIZEOFBLENDERHEADER 12 diff --git a/source/blender/blenloader/intern/versioning_250.c b/source/blender/blenloader/intern/versioning_250.c index 23f46e15f51..983fdce15f1 100644 --- a/source/blender/blenloader/intern/versioning_250.c +++ b/source/blender/blenloader/intern/versioning_250.c @@ -412,7 +412,7 @@ static void do_versions_windowmanager_2_50(bScreen *screen) area_add_window_regions(area, area->spacedata.first, &area->regionbase); - /* space imageselect is deprecated */ + /* Space image-select is deprecated. */ for (sl = area->spacedata.first; sl; sl = sl->next) { if (sl->spacetype == SPACE_IMASEL) { sl->spacetype = SPACE_EMPTY; /* spacedata then matches */ diff --git a/source/blender/blenloader/intern/versioning_260.c b/source/blender/blenloader/intern/versioning_260.c index 3b9ad64770d..7c5eefa60f7 100644 --- a/source/blender/blenloader/intern/versioning_260.c +++ b/source/blender/blenloader/intern/versioning_260.c @@ -75,7 +75,7 @@ # include "BKE_writeffmpeg.h" #endif -#include "IMB_imbuf.h" /* for proxy / timecode versioning stuff */ +#include "IMB_imbuf.h" /* for proxy / time-code versioning stuff. */ #include "NOD_common.h" #include "NOD_texture.h" diff --git a/source/blender/blenloader/intern/versioning_270.c b/source/blender/blenloader/intern/versioning_270.c index e383d46858f..d86ddc5b646 100644 --- a/source/blender/blenloader/intern/versioning_270.c +++ b/source/blender/blenloader/intern/versioning_270.c @@ -1429,7 +1429,7 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *bmain) } if (clip->tracking.stabilization.scale == 0.0f) { /* ensure init. - * Was previously used for autoscale only, + * Was previously used for auto-scale only, * now used always (as "target scale") */ clip->tracking.stabilization.scale = 1.0f; } @@ -1657,7 +1657,7 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *bmain) if (!DNA_struct_elem_find(fd->filesdna, "Brush", "float", "falloff_angle")) { for (Brush *br = bmain->brushes.first; br; br = br->id.next) { br->falloff_angle = DEG2RADF(80); - /* These flags are used for new feautres. They are not related to falloff_angle */ + /* These flags are used for new features. They are not related to `falloff_angle`. */ br->flag &= ~(BRUSH_INVERT_TO_SCRAPE_FILL | BRUSH_ORIGINAL_PLANE | BRUSH_GRAB_ACTIVE_VERTEX | BRUSH_SCENE_SPACING | BRUSH_FRONTFACE_FALLOFF); } diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c index 0e90d9b6045..ef2e196094e 100644 --- a/source/blender/blenloader/intern/versioning_280.c +++ b/source/blender/blenloader/intern/versioning_280.c @@ -4912,7 +4912,7 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain) } } - /* Boundary Edges Automasking. */ + /* Boundary Edges Auto-masking. */ if (!DNA_struct_elem_find( fd->filesdna, "Brush", "int", "automasking_boundary_edges_propagation_steps")) { for (Brush *br = bmain->brushes.first; br; br = br->id.next) { diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c index 569d74dae98..2f3e2ae09a7 100644 --- a/source/blender/blenloader/intern/versioning_290.c +++ b/source/blender/blenloader/intern/versioning_290.c @@ -124,6 +124,13 @@ static void seq_convert_transform_crop(const Scene *scene, Sequence *seq, const eSpaceSeq_Proxy_RenderSize render_size) { + if (seq->strip->transform == NULL) { + seq->strip->transform = MEM_callocN(sizeof(struct StripTransform), "StripTransform"); + } + if (seq->strip->crop == NULL) { + seq->strip->crop = MEM_callocN(sizeof(struct StripCrop), "StripCrop"); + } + StripCrop *c = seq->strip->crop; StripTransform *t = seq->strip->transform; int old_image_center_x = scene->r.xsch / 2; @@ -735,6 +742,23 @@ static void version_node_socket_name(bNodeTree *ntree, } } +static void version_node_join_geometry_for_multi_input_socket(bNodeTree *ntree) +{ + LISTBASE_FOREACH_MUTABLE (bNodeLink *, link, &ntree->links) { + if (link->tonode->type == GEO_NODE_JOIN_GEOMETRY && !(link->tosock->flag & SOCK_MULTI_INPUT)) { + link->tosock = link->tonode->inputs.first; + } + } + LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { + if (node->type == GEO_NODE_JOIN_GEOMETRY) { + bNodeSocket *socket = node->inputs.first; + socket->flag |= SOCK_MULTI_INPUT; + socket->limit = 4095; + nodeRemoveSocket(ntree, node, socket->next); + } + } +} + /* NOLINTNEXTLINE: readability-function-size */ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) { @@ -1037,14 +1061,6 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) } } - /* Set the minimum sequence interpolate for grease pencil. */ - if (!DNA_struct_elem_find(fd->filesdna, "GP_Interpolate_Settings", "int", "step")) { - LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { - ToolSettings *ts = scene->toolsettings; - ts->gp_interpolate.step = 1; - } - } - /* Hair and PointCloud attributes. */ for (Hair *hair = bmain->hairs.first; hair != NULL; hair = hair->id.next) { do_versions_point_attributes(&hair->pdata); @@ -1425,7 +1441,7 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) if (matte_id == NULL || strlen(storage->matte_id) == 0) { continue; } - BKE_cryptomatte_matte_id_to_entries(NULL, storage, storage->matte_id); + BKE_cryptomatte_matte_id_to_entries(storage, storage->matte_id); MEM_SAFE_FREE(storage->matte_id); } } @@ -1670,6 +1686,82 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) FOREACH_NODETREE_END; } + if (!MAIN_VERSION_ATLEAST(bmain, 293, 6)) { + LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) { + LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { + LISTBASE_FOREACH (SpaceLink *, space, &area->spacedata) { + /* UV/Image Max resolution images in image editor. */ + if (space->spacetype == SPACE_IMAGE) { + SpaceImage *sima = (SpaceImage *)space; + sima->iuser.flag |= IMA_SHOW_MAX_RESOLUTION; + } + /* Enable Outliner render visibility column. */ + else if (space->spacetype == SPACE_OUTLINER) { + SpaceOutliner *space_outliner = (SpaceOutliner *)space; + space_outliner->show_restrict_flags |= SO_RESTRICT_RENDER; + } + } + } + } + } + + if (!MAIN_VERSION_ATLEAST(bmain, 293, 7)) { + FOREACH_NODETREE_BEGIN (bmain, ntree, id) { + if (ntree->type == NTREE_GEOMETRY) { + version_node_join_geometry_for_multi_input_socket(ntree); + } + } + FOREACH_NODETREE_END; + } + + if (!MAIN_VERSION_ATLEAST(bmain, 293, 8)) { + FOREACH_NODETREE_BEGIN (bmain, ntree, id) { + if (ntree->type != NTREE_GEOMETRY) { + continue; + } + LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { + if (node->type == GEO_NODE_ATTRIBUTE_RANDOMIZE && node->storage == NULL) { + NodeAttributeRandomize *data = (NodeAttributeRandomize *)MEM_callocN( + sizeof(NodeAttributeRandomize), __func__); + data->data_type = node->custom1; + data->operation = GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE; + node->storage = data; + } + } + } + FOREACH_NODETREE_END; + } + + if (!MAIN_VERSION_ATLEAST(bmain, 293, 9)) { + if (!DNA_struct_elem_find(fd->filesdna, "SceneEEVEE", "float", "bokeh_overblur")) { + LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { + scene->eevee.bokeh_neighbor_max = 10.0f; + scene->eevee.bokeh_denoise_fac = 0.75f; + scene->eevee.bokeh_overblur = 5.0f; + } + } + + /* Add subpanels for FModifiers, which requires a field to store expansion. */ + if (!DNA_struct_elem_find(fd->filesdna, "FModifier", "short", "ui_expand_flag")) { + LISTBASE_FOREACH (bAction *, act, &bmain->actions) { + LISTBASE_FOREACH (FCurve *, fcu, &act->curves) { + LISTBASE_FOREACH (FModifier *, fcm, &fcu->modifiers) { + SET_FLAG_FROM_TEST(fcm->ui_expand_flag, + fcm->flag & FMODIFIER_FLAG_EXPANDED, + UI_PANEL_DATA_EXPAND_ROOT); + } + } + } + } + + FOREACH_NODETREE_BEGIN (bmain, ntree, id) { + if (ntree->type == NTREE_GEOMETRY) { + version_node_socket_name(ntree, GEO_NODE_ATTRIBUTE_PROXIMITY, "Result", "Distance"); + } + } + FOREACH_NODETREE_END; + } + /** * Versioning code until next subversion bump goes here. * diff --git a/source/blender/blenloader/intern/versioning_defaults.c b/source/blender/blenloader/intern/versioning_defaults.c index 45eff4d9e51..b2b93302512 100644 --- a/source/blender/blenloader/intern/versioning_defaults.c +++ b/source/blender/blenloader/intern/versioning_defaults.c @@ -330,7 +330,7 @@ static void blo_update_defaults_scene(Main *bmain, Scene *scene) /* Enable Soft Shadows by default. */ scene->eevee.flag |= SCE_EEVEE_SHADOW_SOFT; - /* Be sure curfalloff and primitive are initializated */ + /* Be sure `curfalloff` and primitive are initialized. */ ToolSettings *ts = scene->toolsettings; if (ts->gp_sculpt.cur_falloff == NULL) { ts->gp_sculpt.cur_falloff = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f); diff --git a/source/blender/blenloader/intern/versioning_legacy.c b/source/blender/blenloader/intern/versioning_legacy.c index dc8f7a0305a..e43f8153bd1 100644 --- a/source/blender/blenloader/intern/versioning_legacy.c +++ b/source/blender/blenloader/intern/versioning_legacy.c @@ -1316,13 +1316,13 @@ void blo_do_versions_pre250(FileData *fd, Library *lib, Main *bmain) } } - /* btw. armature_rebuild_pose is further only called on leave editmode */ + /* Note: #BKE_pose_rebuild is further only called on leave edit-mode. */ if (ob->type == OB_ARMATURE) { if (ob->pose) { BKE_pose_tag_recalc(bmain, ob->pose); } - /* cannot call stuff now (pointers!), done in setup_app_data */ + /* Cannot call stuff now (pointers!), done in #setup_app_data. */ ob->id.recalc |= ID_RECALC_ALL; /* new generic xray option */ @@ -2378,7 +2378,7 @@ void blo_do_versions_pre250(FileData *fd, Library *lib, Main *bmain) Object *ob; bActionStrip *strip; - /* nla-strips - scale */ + /* NLA-strips - scale. */ for (ob = bmain->objects.first; ob; ob = ob->id.next) { for (strip = ob->nlastrips.first; strip; strip = strip->next) { float length, actlength, repeat; diff --git a/source/blender/blenloader/intern/versioning_userdef.c b/source/blender/blenloader/intern/versioning_userdef.c index 04f8023351b..3d39181cd32 100644 --- a/source/blender/blenloader/intern/versioning_userdef.c +++ b/source/blender/blenloader/intern/versioning_userdef.c @@ -273,6 +273,15 @@ static void do_versions_theme(const UserDef *userdef, bTheme *btheme) { /* Keep this block, even when empty. */ FROM_DEFAULT_V4_UCHAR(space_properties.active); + + FROM_DEFAULT_V4_UCHAR(space_info.info_error); + FROM_DEFAULT_V4_UCHAR(space_info.info_warning); + FROM_DEFAULT_V4_UCHAR(space_info.info_info); + FROM_DEFAULT_V4_UCHAR(space_info.info_debug); + FROM_DEFAULT_V4_UCHAR(space_info.info_debug_text); + FROM_DEFAULT_V4_UCHAR(space_info.info_property); + FROM_DEFAULT_V4_UCHAR(space_info.info_error); + FROM_DEFAULT_V4_UCHAR(space_info.info_operator); } #undef FROM_DEFAULT_V4_UCHAR diff --git a/source/blender/bmesh/bmesh_class.h b/source/blender/bmesh/bmesh_class.h index 124bde70515..f61921cd61c 100644 --- a/source/blender/bmesh/bmesh_class.h +++ b/source/blender/bmesh/bmesh_class.h @@ -20,10 +20,11 @@ /** \file * \ingroup bmesh + * + * #BMesh data structures, used for mesh editing operations + * that benefit from accessing connectivity information. */ -/* bmesh data structures */ - /* disable holes for now, * these are ifdef'd because they use more memory and cant be saved in DNA currently */ // #define USE_BMESH_HOLES @@ -48,15 +49,15 @@ struct BLI_mempool; // #pragma GCC diagnostic error "-Wpadded" /** - * BMHeader + * #BMHeader * - * All mesh elements begin with a BMHeader. This structure + * All mesh elements begin with a #BMHeader. This structure * hold several types of data * * 1: The type of the element (vert, edge, loop or face) * 2: Persistent "header" flags/markings (smooth, seam, select, hidden, etc) - * note that this is different from the "tool" flags. - * 3: Unique ID in the bmesh. + * note that this is different from the "tool" flags. + * 3: Unique ID in the #BMesh. * 4: some elements for internal record keeping. */ typedef struct BMHeader { @@ -104,7 +105,7 @@ typedef struct BMVert { * Pointer to (any) edge using this vertex (for disk cycles). * * \note Some higher level functions set this to different edges that use this vertex, - * which is a bit of an abuse of internal bmesh data but also works OK for now + * which is a bit of an abuse of internal #BMesh data but also works OK for now * (use with care!). */ struct BMEdge *e; @@ -123,10 +124,21 @@ typedef struct BMDiskLink { typedef struct BMEdge { BMHeader head; - struct BMVert *v1, *v2; /* vertices (unordered) */ + /** + * Vertices (unordered), + * + * Although the order can be used at times, + * when extruding a face from a wire-edge for example. + * + * Operations that create/subdivide edges shouldn't flip the order + * unless there is a good reason to do so. + */ + BMVert *v1, *v2; - /* the list of loops around the edge (use l->radial_prev/next) - * to access the other loops using the edge */ + /** + * The list of loops around the edge, see doc-string for #BMLoop.radial_next + * for an example of using this to loop over all faces used by an edge. + */ struct BMLoop *l; /** @@ -147,17 +159,92 @@ typedef struct BMLoop { BMHeader head; /* notice no flags layer */ + /** + * The vertex this loop points to. + * + * - This vertex must be unique within the cycle. + */ struct BMVert *v; - struct BMEdge *e; /* edge, using verts (v, next->v) */ + + /** + * The edge this loop uses. + * + * Vertices (#BMLoop.v & #BMLoop.next.v) always contain vertices from (#BMEdge.v1 & #BMEdge.v2). + * Although no assumptions can be made about the order, + * as this isn't meaningful for mesh topology. + * + * - This edge must be unique within the cycle (defined by #BMLoop.next & #BMLoop.prev links). + */ + struct BMEdge *e; + /** + * The face this loop is part of. + * + * - This face must be shared by all within the cycle. + * Used as a back-pointer so loops can know the face they define. + */ struct BMFace *f; - /* circular linked list of loops which all use the same edge as this one '->e', - * but not necessarily the same vertex (can be either v1 or v2 of our own '->e') */ + /** + * Other loops connected to this edge,. + * + * This is typically use for accessing an edges faces, + * however this is done by stepping over it's loops. + * + * - This is a circular list, so there are no first/last storage of the "radial" data. + * Instead #BMEdge.l points to any one of the loops that use it. + * + * - Since the list is circular, the particular loop referenced doesn't matter, + * as all other loops can be accessed from it. + * + * - Every loop in this radial list has the same value for #BMLoop.e. + * + * - The value for #BMLoop.v might not match the radial next/previous + * as this depends on the face-winding. + * You can be sure #BMLoop.v will either #BMEdge.v1 or #BMEdge.v2 of #BMLoop.e, + * + * - Unlike face-winding (which defines if the direction the face points), + * next and previous are insignificant. The list could be reversed for example, + * without any impact on the topology. + * + * This is an example of looping over an edges faces using #BMLoop.radial_next. + * + * \code{.c} + * BMLoop *l_iter = edge->l; + * do { + * operate_on_face(l_iter->f); + * } while ((l_iter = l_iter->radial_next) != edge->l); + * \endcode + */ struct BMLoop *radial_next, *radial_prev; - /* these were originally commented as private but are used all over the code */ - /* can't use ListBase API, due to head */ - struct BMLoop *next, *prev; /* next/prev verts around the face */ + /** + * Other loops that are part of this face. + * + * This is typically used for accessing all vertices/edges in a faces. + * + * - This is a circular list, so there are no first/last storage of the "cycle" data. + * Instead #BMFace.l_first points to any one of the loops that are part of this face. + * + * - Since the list is circular, the particular loop referenced doesn't matter, + * as all other loops can be accessed from it. + * + * - Every loop in this "cycle" list has the same value for #BMLoop.f. + * + * - The direction of this list defines the face winding. + * Reversing the list flips the face. + * + * This is an example loop over all vertices and edges of a face. + * + * \code{.c} + * BMLoop *l_first, *l_iter; + * l_iter = l_first = BM_FACE_FIRST_LOOP(f); + * do { + * operate_on_vert(l_iter->v); + * operate_on_edge(l_iter->e); + * } while ((l_iter = l_iter->next) != l_first); + * \endcode + */ + struct BMLoop *next, *prev; } BMLoop; /* can cast BMFace/BMEdge/BMVert, but NOT BMLoop, since these don't have a flag layer */ @@ -187,7 +274,11 @@ typedef struct BMFace { #else BMLoop *l_first; #endif - int len; /* number of vertices in the face */ + /** + * Number of vertices in the face + * (the length of #BMFace.l_first circular linked list). + */ + int len; float no[3]; /* face normal */ short mat_nr; /* material index */ // short _pad[3]; @@ -208,13 +299,17 @@ typedef struct BMesh { int totvert, totedge, totloop, totface; int totvertsel, totedgesel, totfacesel; - /* flag index arrays as being dirty so we can check if they are clean and + /** + * Flag index arrays as being dirty so we can check if they are clean and * avoid looping over the entire vert/edge/face/loop array in those cases. - * valid flags are - BM_VERT | BM_EDGE | BM_FACE | BM_LOOP. */ + * valid flags are: `(BM_VERT | BM_EDGE | BM_FACE | BM_LOOP)` + */ char elem_index_dirty; - /* flag array table as being dirty so we know when its safe to use it, - * or when it needs to be re-created */ + /** + * Flag array table as being dirty so we know when its safe to use it, + * or when it needs to be re-created. + */ char elem_table_dirty; /* element pools */ @@ -250,8 +345,8 @@ typedef struct BMesh { struct MLoopNorSpaceArray *lnor_spacearr; char spacearr_dirty; - /* should be copy of scene select mode */ - /* stored in BMEditMesh too, this is a bit confusing, + /* Should be copy of scene select mode. */ + /* Stored in #BMEditMesh too, this is a bit confusing, * make sure they're in sync! * Only use when the edit mesh cant be accessed - campbell */ short selectmode; @@ -262,17 +357,33 @@ typedef struct BMesh { int totflags; ListBase selected; + /** + * The active face. + * This is kept even when unselected, mainly so UV editing can keep showing the + * active faces image while the selection is being modified in the 3D viewport. + * + * Without this the active image in the UV editor would flicker in a distracting way + * while changing selection in the 3D viewport. + */ BMFace *act_face; + /** List of #BMOpError, used for operator error handling. */ ListBase errorstack; + /** + * Keep a single reference to the Python instance of this #BMesh (if any exists). + * + * This allows save invalidation of a #BMesh when it's freed, + * so the Python object will report it as having been removed, + * instead of crashing on invalid memory access. + */ void *py_handle; MultiresModifierData multires; //copy of multires settings bool haveMultiResSettings; int multiresSpace; } BMesh; -/* BMHeader->htype (char) */ +/** #BMHeader.htype (char) */ enum { BM_VERT = 1, BM_EDGE = 2, @@ -293,7 +404,7 @@ typedef struct BMLoopNorEditDataArray { BMLoopNorEditData *lnor_editdata; /** * This one has full amount of loops, - * used to map loop index to actual BMLoopNorEditData struct. + * used to map loop index to actual #BMLoopNorEditData struct. */ BMLoopNorEditData **lidx_to_lnor_editdata; @@ -304,6 +415,7 @@ typedef struct BMLoopNorEditDataArray { #define BM_ALL (BM_VERT | BM_EDGE | BM_LOOP | BM_FACE) #define BM_ALL_NOLOOP (BM_VERT | BM_EDGE | BM_FACE) +/** #BMesh.spacearr_dirty */ enum { BM_SPACEARR_DIRTY = 1 << 0, BM_SPACEARR_DIRTY_ALL = 1 << 1, @@ -359,7 +471,7 @@ enum { # define BM_CHECK_TYPE_ELEM_ASSIGN(ele) (BM_CHECK_TYPE_ELEM(ele)), ele #endif -/* BMHeader->hflag (char) */ +/** #BMHeader.hflag (char) */ enum { BM_ELEM_SELECT = (1 << 0), BM_ELEM_HIDDEN = (1 << 1), @@ -369,20 +481,23 @@ enum { * this is a sharp edge when disabled */ BM_ELEM_SMOOTH = (1 << 3), /** - * internal flag, used for ensuring correct normals - * during multires interpolation, and any other time + * Internal flag, used for ensuring correct normals + * during multi-resolution interpolation, and any other time * when temp tagging is handy. - * always assume dirty & clear before use. */ + * always assume dirty & clear before use. + */ BM_ELEM_TAG = (1 << 4), BM_ELEM_DRAW = (1 << 5), /* edge display */ - /* spare tag, assumed dirty, use define in each function to name based on use */ - // _BM_ELEM_TAG_ALT = (1 << 6), // UNUSED + /** Spare tag, assumed dirty, use define in each function to name based on use. */ + BM_ELEM_TAG_ALT = (1 << 6), + /** * For low level internal API tagging, * since tools may want to tag verts and not have functions clobber them. - * Leave cleared! */ + * Leave cleared! + */ BM_ELEM_INTERNAL_TAG = (1 << 7), }; diff --git a/source/blender/bmesh/intern/bmesh_error.h b/source/blender/bmesh/intern/bmesh_error.h index fdec043ec48..41d02e334fb 100644 --- a/source/blender/bmesh/intern/bmesh_error.h +++ b/source/blender/bmesh/intern/bmesh_error.h @@ -25,7 +25,7 @@ /*----------- bmop error system ----------*/ /* pushes an error onto the bmesh error stack. - * if msg is null, then the default message for the errorcode is used.*/ + * if msg is null, then the default message for the `errcode` is used. */ void BMO_error_raise(BMesh *bm, BMOperator *owner, int errcode, const char *msg); /* gets the topmost error from the stack. diff --git a/source/blender/bmesh/intern/bmesh_interp.c b/source/blender/bmesh/intern/bmesh_interp.c index a2718977c82..48a19f6f01c 100644 --- a/source/blender/bmesh/intern/bmesh_interp.c +++ b/source/blender/bmesh/intern/bmesh_interp.c @@ -379,8 +379,12 @@ static void mdisp_axis_from_quad(const float v1[3], normalize_v3(r_axis_y); } -/* tl is loop to project onto, l is loop whose internal displacement, co, is being - * projected. x and y are location in loop's mdisps grid of point co. */ +/** + * \param l_src: is loop whose internal displacement. + * \param l_dst: is loop to project onto. + * \param p: The point being projected. + * \param r_axis_x, r_axis_y: The location in loop's #CD_MDISPS grid of point `p`. + */ static bool mdisp_in_mdispquad(BMLoop *l_src, BMLoop *l_dst, const float l_dst_f_center[3], diff --git a/source/blender/bmesh/intern/bmesh_marking.c b/source/blender/bmesh/intern/bmesh_marking.c index 6804f8bb174..49204d2a2b0 100644 --- a/source/blender/bmesh/intern/bmesh_marking.c +++ b/source/blender/bmesh/intern/bmesh_marking.c @@ -894,7 +894,7 @@ void BM_editselection_plane(BMEditSelection *ese, float r_plane[3]) sub_v3_v3v3(r_plane, vec, eve->co); } else { - /* make a fake plane that's at rightangles to the normal + /* make a fake plane that's at right-angles to the normal * we can't make a crossvec from a vec that's the same as the vec * unlikely but possible, so make sure if the normal is (0, 0, 1) * that vec isn't the same or in the same direction even. */ diff --git a/source/blender/bmesh/intern/bmesh_mods.c b/source/blender/bmesh/intern/bmesh_mods.c index 4c72b802396..8e5ed9c3bf0 100644 --- a/source/blender/bmesh/intern/bmesh_mods.c +++ b/source/blender/bmesh/intern/bmesh_mods.c @@ -802,7 +802,7 @@ void BM_edge_calc_rotate(BMEdge *e, const bool ccw, BMLoop **r_l1, BMLoop **r_l2 /* we know this will work */ BM_edge_face_pair(e, &fa, &fb); - /* so we can use ccw variable correctly, + /* so we can use `ccw` variable correctly, * otherwise we could use the edges verts direct */ BM_edge_ordered_verts(e, &v1, &v2); @@ -886,7 +886,7 @@ bool BM_edge_rotate_check_degenerate(BMEdge *e, BMLoop *l1, BMLoop *l2) /* verts from the loops passed */ BMVert *v1, *v2; - /* these are the opposite verts - the verts that _would_ be used if 'ccw' was inverted*/ + /* These are the opposite verts - the verts that _would_ be used if `ccw` was inverted. */ BMVert *v1_alt, *v2_alt; /* this should have already run */ @@ -1070,7 +1070,7 @@ BMEdge *BM_edge_rotate(BMesh *bm, BMEdge *e, const bool ccw, const short check_f BM_face_normal_flip(bm, fb); if (ccw) { - /* needed otherwise ccw toggles direction */ + /* Needed otherwise `ccw` toggles direction */ e_new->l = e_new->l->radial_next; } } diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c index 4e3bd4b1faa..1bef0ad2650 100644 --- a/source/blender/bmesh/intern/bmesh_opdefines.c +++ b/source/blender/bmesh/intern/bmesh_opdefines.c @@ -1409,7 +1409,7 @@ static BMOpDefine bmo_duplicate_def = { /* slots_out */ {{"geom_orig.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, - /* facemap maps from source faces to dupe + /* face_map maps from source faces to dupe * faces, and from dupe faces to source faces */ {"vert_map.out", BMO_OP_SLOT_MAPPING, {(int)BMO_OP_SLOT_SUBTYPE_MAP_ELEM}}, {"edge_map.out", BMO_OP_SLOT_MAPPING, {(int)BMO_OP_SLOT_SUBTYPE_MAP_ELEM}}, diff --git a/source/blender/bmesh/intern/bmesh_structure.c b/source/blender/bmesh/intern/bmesh_structure.c index cd230e76aca..cfdce0b749b 100644 --- a/source/blender/bmesh/intern/bmesh_structure.c +++ b/source/blender/bmesh/intern/bmesh_structure.c @@ -143,7 +143,7 @@ void bmesh_disk_vert_replace(BMEdge *e, BMVert *v_dst, BMVert *v_src) * * The loop cycle keeps track of a faces vertices and edges. It should be noted that the * direction of a loop cycle is either CW or CCW depending on the face normal, and is - * not oriented to the faces editedges. + * not oriented to the faces edit-edges. * * Functions relating to this cycle: * - bmesh_cycle_XXX family of functions. diff --git a/source/blender/bmesh/operators/bmo_fill_grid.c b/source/blender/bmesh/operators/bmo_fill_grid.c index 3aad37b3b02..df15778558b 100644 --- a/source/blender/bmesh/operators/bmo_fill_grid.c +++ b/source/blender/bmesh/operators/bmo_fill_grid.c @@ -326,8 +326,8 @@ static void bm_grid_fill_array(BMesh *bm, v = BM_vert_create(bm, co, NULL, BM_CREATE_NOP); v_grid[(y * xtot) + x] = v; - /* interpolate only along one axis, this could be changed - * but from user pov gives predictable results since these are selected loop */ + /* Interpolate only along one axis, this could be changed + * but from user POV gives predictable results since these are selected loop. */ if (use_vert_interp) { const float *w = weight_table[XY(x, y)]; diff --git a/source/blender/bmesh/operators/bmo_primitive.c b/source/blender/bmesh/operators/bmo_primitive.c index 8e088683d62..7d980299771 100644 --- a/source/blender/bmesh/operators/bmo_primitive.c +++ b/source/blender/bmesh/operators/bmo_primitive.c @@ -55,21 +55,21 @@ static const short icoface[20][3] = { }; static const float icouvs[60][2] = { - {0.818181f, 0.000000f}, {0.727272f, 0.157461f}, {0.909090f, 0.157461f}, {0.727272f, 0.157461f}, - {0.636363f, 0.000000f}, {0.545454f, 0.157461f}, {0.090909f, 0.000000f}, {0.000000f, 0.157461f}, - {0.181818f, 0.157461f}, {0.272727f, 0.000000f}, {0.181818f, 0.157461f}, {0.363636f, 0.157461f}, - {0.454545f, 0.000000f}, {0.363636f, 0.157461f}, {0.545454f, 0.157461f}, {0.727272f, 0.157461f}, - {0.545454f, 0.157461f}, {0.636363f, 0.314921f}, {0.909090f, 0.157461f}, {0.727272f, 0.157461f}, - {0.818181f, 0.314921f}, {0.181818f, 0.157461f}, {0.000000f, 0.157461f}, {0.090909f, 0.314921f}, - {0.363636f, 0.157461f}, {0.181818f, 0.157461f}, {0.272727f, 0.314921f}, {0.545454f, 0.157461f}, - {0.363636f, 0.157461f}, {0.454545f, 0.314921f}, {0.727272f, 0.157461f}, {0.636363f, 0.314921f}, - {0.818181f, 0.314921f}, {0.909090f, 0.157461f}, {0.818181f, 0.314921f}, {1.000000f, 0.314921f}, - {0.181818f, 0.157461f}, {0.090909f, 0.314921f}, {0.272727f, 0.314921f}, {0.363636f, 0.157461f}, - {0.272727f, 0.314921f}, {0.454545f, 0.314921f}, {0.545454f, 0.157461f}, {0.454545f, 0.314921f}, - {0.636363f, 0.314921f}, {0.818181f, 0.314921f}, {0.636363f, 0.314921f}, {0.727272f, 0.472382f}, - {1.000000f, 0.314921f}, {0.818181f, 0.314921f}, {0.909090f, 0.472382f}, {0.272727f, 0.314921f}, - {0.090909f, 0.314921f}, {0.181818f, 0.472382f}, {0.454545f, 0.314921f}, {0.272727f, 0.314921f}, - {0.363636f, 0.472382f}, {0.636363f, 0.314921f}, {0.454545f, 0.314921f}, {0.545454f, 0.472382f}, + {0.181819f, 0.000000f}, {0.272728f, 0.157461f}, {0.090910f, 0.157461f}, {0.272728f, 0.157461f}, + {0.363637f, 0.000000f}, {0.454546f, 0.157461f}, {0.909091f, 0.000000f}, {1.000000f, 0.157461f}, + {0.818182f, 0.157461f}, {0.727273f, 0.000000f}, {0.818182f, 0.157461f}, {0.636364f, 0.157461f}, + {0.545455f, 0.000000f}, {0.636364f, 0.157461f}, {0.454546f, 0.157461f}, {0.272728f, 0.157461f}, + {0.454546f, 0.157461f}, {0.363637f, 0.314921f}, {0.090910f, 0.157461f}, {0.272728f, 0.157461f}, + {0.181819f, 0.314921f}, {0.818182f, 0.157461f}, {1.000000f, 0.157461f}, {0.909091f, 0.314921f}, + {0.636364f, 0.157461f}, {0.818182f, 0.157461f}, {0.727273f, 0.314921f}, {0.454546f, 0.157461f}, + {0.636364f, 0.157461f}, {0.545455f, 0.314921f}, {0.272728f, 0.157461f}, {0.363637f, 0.314921f}, + {0.181819f, 0.314921f}, {0.090910f, 0.157461f}, {0.181819f, 0.314921f}, {0.000000f, 0.314921f}, + {0.818182f, 0.157461f}, {0.909091f, 0.314921f}, {0.727273f, 0.314921f}, {0.636364f, 0.157461f}, + {0.727273f, 0.314921f}, {0.545455f, 0.314921f}, {0.454546f, 0.157461f}, {0.545455f, 0.314921f}, + {0.363637f, 0.314921f}, {0.181819f, 0.314921f}, {0.363637f, 0.314921f}, {0.272728f, 0.472382f}, + {0.000000f, 0.314921f}, {0.181819f, 0.314921f}, {0.090910f, 0.472382f}, {0.727273f, 0.314921f}, + {0.909091f, 0.314921f}, {0.818182f, 0.472382f}, {0.545455f, 0.314921f}, {0.727273f, 0.314921f}, + {0.636364f, 0.472382f}, {0.363637f, 0.314921f}, {0.545455f, 0.314921f}, {0.454546f, 0.472382f}, }; static const int monkeyo = 4; diff --git a/source/blender/bmesh/tools/bmesh_bevel.c b/source/blender/bmesh/tools/bmesh_bevel.c index 920307b42a2..a17724895f1 100644 --- a/source/blender/bmesh/tools/bmesh_bevel.c +++ b/source/blender/bmesh/tools/bmesh_bevel.c @@ -58,9 +58,9 @@ #define BEVEL_EPSILON_ANG DEG2RADF(2.0f) #define BEVEL_SMALL_ANG DEG2RADF(10.0f) /** Difference in dot products that corresponds to 10 degree difference between vectors. */ -#define BEVEL_SMALL_ANG_DOT 1 - cosf(BEVEL_SMALL_ANG) +#define BEVEL_SMALL_ANG_DOT (1.0f - cosf(BEVEL_SMALL_ANG)) /** Difference in dot products that corresponds to 2.0 degree difference between vectors. */ -#define BEVEL_EPSILON_ANG_DOT 1 - cosf(BEVEL_EPSILON_ANG) +#define BEVEL_EPSILON_ANG_DOT (1.0f - cosf(BEVEL_EPSILON_ANG)) #define BEVEL_MAX_ADJUST_PCT 10.0f #define BEVEL_MAX_AUTO_ADJUST_PCT 300.0f #define BEVEL_MATCH_SPEC_WEIGHT 0.2 @@ -235,7 +235,7 @@ typedef struct BoundVert { /** Is this boundvert the side of the custom profile's start. */ bool is_profile_start; char _pad[3]; - /** Length of seam starting from current boundvert to next boundvert with ccw ordering. */ + /** Length of seam starting from current boundvert to next boundvert with CCW ordering. */ int seam_len; /** Same as seam_len but defines length of sharp edges. */ int sharp_len; @@ -1961,7 +1961,7 @@ static bool make_unit_square_map(const float va[3], /** * Like make_unit_square_map, but this one makes a matrix that transforms the * (1,1,1) corner of a unit cube into an arbitrary corner with corner vert d - * and verts around it a, b, c (in ccw order, viewed from d normal dir). + * and verts around it a, b, c (in CCW order, viewed from d normal dir). * The matrix mat is calculated to map: * (1,0,0) -> va * (0,1,0) -> vb @@ -1969,9 +1969,9 @@ static bool make_unit_square_map(const float va[3], * (1,1,1) -> vd * We want M to make M*A=B where A has the left side above, as columns * and B has the right side as columns - both extended into homogeneous coords. - * So M = B*(Ainverse). Doing Ainverse by hand gives the code below. - * The cols of M are 1/2{va-vb+vc-vd}, 1/2{-va+vb-vc+vd}, 1/2{-va-vb+vc+vd}, - * and 1/2{va+vb+vc-vd} + * So `M = B*(Ainverse)`. Doing `Ainverse` by hand gives the code below. + * The cols of M are `1/2{va-vb+vc-vd}`, `1/2{-va+vb-vc+vd}`, `1/2{-va-vb+vc+vd}`, + * and `1/2{va+vb+vc-vd}` * and Blender matrices have cols at m[i][*]. */ static void make_unit_cube_map( @@ -6378,7 +6378,7 @@ static bool bev_rebuild_polygon(BMesh *bm, BevelParams *bp, BMFace *f) go_ccw = (e->fnext != f); } else { - go_ccw = true; /* Going ccw around bv to trace this corner. */ + go_ccw = true; /* Going CCW around bv to trace this corner. */ } } else if (eprev->prev == e) { @@ -7230,17 +7230,17 @@ static void set_profile_spacing(BevelParams *bp, ProfileSpacing *pro_spacing, bo * B * * - * where edges are A, B, and C, following a face around vertices a, b, c, d. - * th1 is angle abc and th2 is angle bcd; + * where edges are A, B, and C, following a face around vertices `a, b, c, d`. + * `th1` is angle `abc` and th2 is angle `bcd`; * and the argument `EdgeHalf eb` is B, going from b to c. * In general case, edge offset specs for A, B, C have - * the form ka*t, kb*t, kc*t where ka, kb, kc are some factors + * the form `ka*t`, `kb*t`, `kc*t` where `ka`, `kb`, `kc` are some factors * (may be 0) and t is the current bp->offset. * We want to calculate t at which the clone of B parallel * to it collapses. This can be calculated using trig. * Another case of geometry collision that can happen is * When B slides along A because A is un-beveled. - * Then it might collide with a. Similarly for B sliding along C. + * Then it might collide with a. Similarly for B sliding along C. */ static float geometry_collide_offset(BevelParams *bp, EdgeHalf *eb) { diff --git a/source/blender/bmesh/tools/bmesh_intersect_edges.c b/source/blender/bmesh/tools/bmesh_intersect_edges.c index 5e266fdac0e..1e9adea2615 100644 --- a/source/blender/bmesh/tools/bmesh_intersect_edges.c +++ b/source/blender/bmesh/tools/bmesh_intersect_edges.c @@ -39,7 +39,7 @@ #define KDOP_TREE_TYPE 4 #define KDOP_AXIS_LEN 14 -#define BLI_STACK_PAIR_LEN 2 * KDOP_TREE_TYPE +#define BLI_STACK_PAIR_LEN (2 * KDOP_TREE_TYPE) /* -------------------------------------------------------------------- */ /** \name Weld Linked Wire Edges into Linked Faces diff --git a/source/blender/compositor/COM_compositor.h b/source/blender/compositor/COM_compositor.h index 6c8d372f587..ba66d7f0dfe 100644 --- a/source/blender/compositor/COM_compositor.h +++ b/source/blender/compositor/COM_compositor.h @@ -339,9 +339,9 @@ extern "C" { */ /* clang-format off */ -void COM_execute(RenderData *rd, +void COM_execute(RenderData *render_data, Scene *scene, - bNodeTree *editingtree, + bNodeTree *node_tree, int rendering, const ColorManagedViewSettings *viewSettings, const ColorManagedDisplaySettings *displaySettings, diff --git a/source/blender/compositor/intern/COM_ChunkOrder.cpp b/source/blender/compositor/intern/COM_ChunkOrder.cpp index 7c9e5013c5d..3baa50da487 100644 --- a/source/blender/compositor/intern/COM_ChunkOrder.cpp +++ b/source/blender/compositor/intern/COM_ChunkOrder.cpp @@ -21,27 +21,26 @@ ChunkOrder::ChunkOrder() { - this->m_distance = 0.0; - this->m_number = 0; - this->m_x = 0; - this->m_y = 0; + distance = 0.0; + number = 0; + x = 0; + y = 0; } -void ChunkOrder::determineDistance(ChunkOrderHotspot **hotspots, unsigned int numberOfHotspots) +void ChunkOrder::update_distance(ChunkOrderHotspot **hotspots, unsigned int len_hotspots) { - unsigned int index; - double distance = FLT_MAX; - for (index = 0; index < numberOfHotspots; index++) { + double new_distance = FLT_MAX; + for (int index = 0; index < len_hotspots; index++) { ChunkOrderHotspot *hotspot = hotspots[index]; - double ndistance = hotspot->determineDistance(this->m_x, this->m_y); - if (ndistance < distance) { - distance = ndistance; + double distance_to_hotspot = hotspot->calc_distance(x, y); + if (distance_to_hotspot < new_distance) { + new_distance = distance_to_hotspot; } } - this->m_distance = distance; + this->distance = new_distance; } bool operator<(const ChunkOrder &a, const ChunkOrder &b) { - return a.m_distance < b.m_distance; + return a.distance < b.distance; } diff --git a/source/blender/compositor/intern/COM_ChunkOrder.h b/source/blender/compositor/intern/COM_ChunkOrder.h index 32d8c07de83..993622b346c 100644 --- a/source/blender/compositor/intern/COM_ChunkOrder.h +++ b/source/blender/compositor/intern/COM_ChunkOrder.h @@ -18,37 +18,24 @@ #pragma once -#include "COM_ChunkOrderHotspot.h" -class ChunkOrder { - private: - unsigned int m_number; - int m_x; - int m_y; - double m_distance; +#ifdef WITH_CXX_GUARDEDALLOC +# include "MEM_guardedalloc.h" +#endif + +#include "COM_ChunkOrderHotspot.h" +struct ChunkOrder { + unsigned int number; + int x; + int y; + double distance; - public: ChunkOrder(); - void determineDistance(ChunkOrderHotspot **hotspots, unsigned int numberOfHotspots); + friend bool operator<(const ChunkOrder &a, const ChunkOrder &b); - void setChunkNumber(unsigned int chunknumber) - { - this->m_number = chunknumber; - } - void setX(int x) - { - this->m_x = x; - } - void setY(int y) - { - this->m_y = y; - } - unsigned int getChunkNumber() - { - return this->m_number; - } - double getDistance() - { - return this->m_distance; - } + void update_distance(ChunkOrderHotspot **hotspots, unsigned int len_hotspots); + +#ifdef WITH_CXX_GUARDEDALLOC + MEM_CXX_CLASS_ALLOC_FUNCS("COM:ChunkOrderHotspot") +#endif }; diff --git a/source/blender/compositor/intern/COM_ChunkOrderHotspot.cpp b/source/blender/compositor/intern/COM_ChunkOrderHotspot.cpp index b111fba44b7..bbc98d086a6 100644 --- a/source/blender/compositor/intern/COM_ChunkOrderHotspot.cpp +++ b/source/blender/compositor/intern/COM_ChunkOrderHotspot.cpp @@ -21,16 +21,16 @@ ChunkOrderHotspot::ChunkOrderHotspot(int x, int y, float addition) { - this->m_x = x; - this->m_y = y; - this->m_addition = addition; + x = x; + y = y; + addition = addition; } -double ChunkOrderHotspot::determineDistance(int x, int y) +double ChunkOrderHotspot::calc_distance(int x, int y) { - int dx = x - this->m_x; - int dy = y - this->m_y; + int dx = x - x; + int dy = y - y; double result = sqrt((double)(dx * dx + dy * dy)); - result += (double)this->m_addition; + result += (double)addition; return result; } diff --git a/source/blender/compositor/intern/COM_ChunkOrderHotspot.h b/source/blender/compositor/intern/COM_ChunkOrderHotspot.h index afacf5fc672..af0cf897673 100644 --- a/source/blender/compositor/intern/COM_ChunkOrderHotspot.h +++ b/source/blender/compositor/intern/COM_ChunkOrderHotspot.h @@ -22,15 +22,15 @@ # include "MEM_guardedalloc.h" #endif -class ChunkOrderHotspot { - private: - int m_x; - int m_y; - float m_addition; +struct ChunkOrderHotspot { + int x; + int y; + float addition; public: ChunkOrderHotspot(int x, int y, float addition); - double determineDistance(int x, int y); + + double calc_distance(int x, int y); #ifdef WITH_CXX_GUARDEDALLOC MEM_CXX_CLASS_ALLOC_FUNCS("COM:ChunkOrderHotspot") diff --git a/source/blender/compositor/intern/COM_ExecutionGroup.cpp b/source/blender/compositor/intern/COM_ExecutionGroup.cpp index b026d2e60d9..9c21c91c370 100644 --- a/source/blender/compositor/intern/COM_ExecutionGroup.cpp +++ b/source/blender/compositor/intern/COM_ExecutionGroup.cpp @@ -251,15 +251,15 @@ void ExecutionGroup::execute(ExecutionSystem *graph) sizeof(ChunkOrder) * this->m_numberOfChunks, __func__); for (index = 0; index < this->m_numberOfChunks; index++) { determineChunkRect(&rect, index); - chunkOrders[index].setChunkNumber(index); - chunkOrders[index].setX(rect.xmin - this->m_viewerBorder.xmin); - chunkOrders[index].setY(rect.ymin - this->m_viewerBorder.ymin); - chunkOrders[index].determineDistance(hotspots, 1); + chunkOrders[index].number = index; + chunkOrders[index].x = rect.xmin - this->m_viewerBorder.xmin; + chunkOrders[index].y = rect.ymin - this->m_viewerBorder.ymin; + chunkOrders[index].update_distance(hotspots, 1); } std::sort(&chunkOrders[0], &chunkOrders[this->m_numberOfChunks - 1]); for (index = 0; index < this->m_numberOfChunks; index++) { - chunkOrder[index] = chunkOrders[index].getChunkNumber(); + chunkOrder[index] = chunkOrders[index].number; } delete hotspots[0]; @@ -290,16 +290,16 @@ void ExecutionGroup::execute(ExecutionSystem *graph) sizeof(ChunkOrder) * this->m_numberOfChunks, __func__); for (index = 0; index < this->m_numberOfChunks; index++) { determineChunkRect(&rect, index); - chunkOrders[index].setChunkNumber(index); - chunkOrders[index].setX(rect.xmin - this->m_viewerBorder.xmin); - chunkOrders[index].setY(rect.ymin - this->m_viewerBorder.ymin); - chunkOrders[index].determineDistance(hotspots, 9); + chunkOrders[index].number = index; + chunkOrders[index].x = rect.xmin - this->m_viewerBorder.xmin; + chunkOrders[index].y = rect.ymin - this->m_viewerBorder.ymin; + chunkOrders[index].update_distance(hotspots, 9); } std::sort(&chunkOrders[0], &chunkOrders[this->m_numberOfChunks]); for (index = 0; index < this->m_numberOfChunks; index++) { - chunkOrder[index] = chunkOrders[index].getChunkNumber(); + chunkOrder[index] = chunkOrders[index].number; } delete hotspots[0]; diff --git a/source/blender/compositor/intern/COM_ExecutionSystem.cpp b/source/blender/compositor/intern/COM_ExecutionSystem.cpp index 34682aae2fd..4c0c7d2103e 100644 --- a/source/blender/compositor/intern/COM_ExecutionSystem.cpp +++ b/source/blender/compositor/intern/COM_ExecutionSystem.cpp @@ -59,7 +59,7 @@ ExecutionSystem::ExecutionSystem(RenderData *rd, this->m_context.setQuality((CompositorQuality)editingtree->edit_quality); } this->m_context.setRendering(rendering); - this->m_context.setHasActiveOpenCLDevices(WorkScheduler::hasGPUDevices() && + this->m_context.setHasActiveOpenCLDevices(WorkScheduler::has_gpu_devices() && (editingtree->flag & NTREE_COM_OPENCL)); this->m_context.setRenderData(rd); diff --git a/source/blender/compositor/intern/COM_MetaData.cpp b/source/blender/compositor/intern/COM_MetaData.cpp index 2b75947ff89..4bc4571face 100644 --- a/source/blender/compositor/intern/COM_MetaData.cpp +++ b/source/blender/compositor/intern/COM_MetaData.cpp @@ -34,7 +34,7 @@ void MetaData::addCryptomatteEntry(const blender::StringRef layer_name, const blender::StringRefNull key, const blender::StringRef value) { - add(blender::BKE_cryptomatte_meta_data_key(layer_name, key), value); + add(blender::bke::cryptomatte::BKE_cryptomatte_meta_data_key(layer_name, key), value); } /* Replace the hash neutral cryptomatte keys with hashed versions. diff --git a/source/blender/compositor/intern/COM_MetaData.h b/source/blender/compositor/intern/COM_MetaData.h index 22988b0b7ee..c1e34df2791 100644 --- a/source/blender/compositor/intern/COM_MetaData.h +++ b/source/blender/compositor/intern/COM_MetaData.h @@ -25,8 +25,8 @@ #include "MEM_guardedalloc.h" /* Forward declarations. */ -struct StampData; struct RenderResult; +struct StampData; /* Cryptomatte includes hash in its meta data keys. The hash is generated from the render * layer/pass name. Compositing happens without the knowledge of the original layer and pass. The diff --git a/source/blender/compositor/intern/COM_WorkScheduler.cpp b/source/blender/compositor/intern/COM_WorkScheduler.cpp index f726caa3d66..9ca704afdea 100644 --- a/source/blender/compositor/intern/COM_WorkScheduler.cpp +++ b/source/blender/compositor/intern/COM_WorkScheduler.cpp @@ -44,38 +44,42 @@ # error COM_CURRENT_THREADING_MODEL No threading model selected #endif -/** \brief list of all CPUDevices. for every hardware thread an instance of CPUDevice is created */ -static vector g_cpudevices; static ThreadLocal(CPUDevice *) g_thread_device; +static struct { + /** \brief list of all CPUDevices. for every hardware thread an instance of CPUDevice is created + */ + vector cpu_devices; #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE -/** \brief list of all thread for every CPUDevice in cpudevices a thread exists. */ -static ListBase g_cputhreads; -static bool g_cpuInitialized = false; -/** \brief all scheduled work for the cpu */ -static ThreadQueue *g_cpuqueue; -static ThreadQueue *g_gpuqueue; + /** \brief list of all thread for every CPUDevice in cpudevices a thread exists. */ + ListBase cpu_threads; + bool cpu_initialized = false; + /** \brief all scheduled work for the cpu */ + ThreadQueue *cpu_queue; + ThreadQueue *gpu_queue; # ifdef COM_OPENCL_ENABLED -static cl_context g_context; -static cl_program g_program; -/** \brief list of all OpenCLDevices. for every OpenCL GPU device an instance of OpenCLDevice is - * created. */ -static vector g_gpudevices; -/** \brief list of all thread for every GPUDevice in cpudevices a thread exists. */ -static ListBase g_gputhreads; -/** \brief all scheduled work for the GPU. */ -static bool g_openclActive = false; -static bool g_openclInitialized = false; + cl_context opencl_context; + cl_program opencl_program; + /** \brief list of all OpenCLDevices. for every OpenCL GPU device an instance of OpenCLDevice is + * created. */ + vector gpu_devices; + /** \brief list of all thread for every GPUDevice in cpudevices a thread exists. */ + ListBase gpu_threads; + /** \brief all scheduled work for the GPU. */ + bool opencl_active = false; + bool opencl_initialized = false; # endif #endif +} g_work_scheduler; + #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE void *WorkScheduler::thread_execute_cpu(void *data) { CPUDevice *device = (CPUDevice *)data; WorkPackage *work; BLI_thread_local_set(g_thread_device, device); - while ((work = (WorkPackage *)BLI_thread_queue_pop(g_cpuqueue))) { + while ((work = (WorkPackage *)BLI_thread_queue_pop(g_work_scheduler.cpu_queue))) { device->execute(work); delete work; } @@ -88,7 +92,7 @@ void *WorkScheduler::thread_execute_gpu(void *data) Device *device = (Device *)data; WorkPackage *work; - while ((work = (WorkPackage *)BLI_thread_queue_pop(g_gpuqueue))) { + while ((work = (WorkPackage *)BLI_thread_queue_pop(g_work_scheduler.gpu_queue))) { device->execute(work); delete work; } @@ -106,14 +110,14 @@ void WorkScheduler::schedule(ExecutionGroup *group, int chunkNumber) delete package; #elif COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE # ifdef COM_OPENCL_ENABLED - if (group->isOpenCL() && g_openclActive) { - BLI_thread_queue_push(g_gpuqueue, package); + if (group->isOpenCL() && g_work_scheduler.opencl_active) { + BLI_thread_queue_push(g_work_scheduler.gpu_queue, package); } else { - BLI_thread_queue_push(g_cpuqueue, package); + BLI_thread_queue_push(g_work_scheduler.cpu_queue, package); } # else - BLI_thread_queue_push(g_cpuqueue, package); + BLI_thread_queue_push(g_work_scheduler.cpu_queue, package); # endif #endif } @@ -122,24 +126,26 @@ void WorkScheduler::start(CompositorContext &context) { #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE unsigned int index; - g_cpuqueue = BLI_thread_queue_init(); - BLI_threadpool_init(&g_cputhreads, thread_execute_cpu, g_cpudevices.size()); - for (index = 0; index < g_cpudevices.size(); index++) { - Device *device = g_cpudevices[index]; - BLI_threadpool_insert(&g_cputhreads, device); + g_work_scheduler.cpu_queue = BLI_thread_queue_init(); + BLI_threadpool_init( + &g_work_scheduler.cpu_threads, thread_execute_cpu, g_work_scheduler.cpu_devices.size()); + for (index = 0; index < g_work_scheduler.cpu_devices.size(); index++) { + Device *device = g_work_scheduler.cpu_devices[index]; + BLI_threadpool_insert(&g_work_scheduler.cpu_threads, device); } # ifdef COM_OPENCL_ENABLED if (context.getHasActiveOpenCLDevices()) { - g_gpuqueue = BLI_thread_queue_init(); - BLI_threadpool_init(&g_gputhreads, thread_execute_gpu, g_gpudevices.size()); - for (index = 0; index < g_gpudevices.size(); index++) { - Device *device = g_gpudevices[index]; - BLI_threadpool_insert(&g_gputhreads, device); + g_work_scheduler.gpu_queue = BLI_thread_queue_init(); + BLI_threadpool_init( + &g_work_scheduler.gpu_threads, thread_execute_gpu, g_work_scheduler.gpu_devices.size()); + for (index = 0; index < g_work_scheduler.gpu_devices.size(); index++) { + Device *device = g_work_scheduler.gpu_devices[index]; + BLI_threadpool_insert(&g_work_scheduler.gpu_threads, device); } - g_openclActive = true; + g_work_scheduler.opencl_active = true; } else { - g_openclActive = false; + g_work_scheduler.opencl_active = false; } # endif #endif @@ -148,12 +154,12 @@ void WorkScheduler::finish() { #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE # ifdef COM_OPENCL_ENABLED - if (g_openclActive) { - BLI_thread_queue_wait_finish(g_gpuqueue); - BLI_thread_queue_wait_finish(g_cpuqueue); + if (g_work_scheduler.opencl_active) { + BLI_thread_queue_wait_finish(g_work_scheduler.gpu_queue); + BLI_thread_queue_wait_finish(g_work_scheduler.cpu_queue); } else { - BLI_thread_queue_wait_finish(g_cpuqueue); + BLI_thread_queue_wait_finish(g_work_scheduler.cpu_queue); } # else BLI_thread_queue_wait_finish(cpuqueue); @@ -163,26 +169,26 @@ void WorkScheduler::finish() void WorkScheduler::stop() { #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE - BLI_thread_queue_nowait(g_cpuqueue); - BLI_threadpool_end(&g_cputhreads); - BLI_thread_queue_free(g_cpuqueue); - g_cpuqueue = nullptr; + BLI_thread_queue_nowait(g_work_scheduler.cpu_queue); + BLI_threadpool_end(&g_work_scheduler.cpu_threads); + BLI_thread_queue_free(g_work_scheduler.cpu_queue); + g_work_scheduler.cpu_queue = nullptr; # ifdef COM_OPENCL_ENABLED - if (g_openclActive) { - BLI_thread_queue_nowait(g_gpuqueue); - BLI_threadpool_end(&g_gputhreads); - BLI_thread_queue_free(g_gpuqueue); - g_gpuqueue = nullptr; + if (g_work_scheduler.opencl_active) { + BLI_thread_queue_nowait(g_work_scheduler.gpu_queue); + BLI_threadpool_end(&g_work_scheduler.gpu_threads); + BLI_thread_queue_free(g_work_scheduler.gpu_queue); + g_work_scheduler.gpu_queue = nullptr; } # endif #endif } -bool WorkScheduler::hasGPUDevices() +bool WorkScheduler::has_gpu_devices() { #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE # ifdef COM_OPENCL_ENABLED - return !g_gpudevices.empty(); + return !g_work_scheduler.gpu_devices.empty(); # else return 0; # endif @@ -205,37 +211,37 @@ void WorkScheduler::initialize(bool use_opencl, int num_cpu_threads) { #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE /* deinitialize if number of threads doesn't match */ - if (g_cpudevices.size() != num_cpu_threads) { + if (g_work_scheduler.cpu_devices.size() != num_cpu_threads) { Device *device; - while (!g_cpudevices.empty()) { - device = g_cpudevices.back(); - g_cpudevices.pop_back(); + while (!g_work_scheduler.cpu_devices.empty()) { + device = g_work_scheduler.cpu_devices.back(); + g_work_scheduler.cpu_devices.pop_back(); device->deinitialize(); delete device; } - if (g_cpuInitialized) { + if (g_work_scheduler.cpu_initialized) { BLI_thread_local_delete(g_thread_device); } - g_cpuInitialized = false; + g_work_scheduler.cpu_initialized = false; } /* initialize CPU threads */ - if (!g_cpuInitialized) { + if (!g_work_scheduler.cpu_initialized) { for (int index = 0; index < num_cpu_threads; index++) { CPUDevice *device = new CPUDevice(index); device->initialize(); - g_cpudevices.push_back(device); + g_work_scheduler.cpu_devices.push_back(device); } BLI_thread_local_create(g_thread_device); - g_cpuInitialized = true; + g_work_scheduler.cpu_initialized = true; } # ifdef COM_OPENCL_ENABLED /* deinitialize OpenCL GPU's */ - if (use_opencl && !g_openclInitialized) { - g_context = nullptr; - g_program = nullptr; + if (use_opencl && !g_work_scheduler.opencl_initialized) { + g_work_scheduler.opencl_context = nullptr; + g_work_scheduler.opencl_program = nullptr; /* This will check for errors and skip if already initialized. */ if (clewInit() != CLEW_SUCCESS) { @@ -270,26 +276,40 @@ void WorkScheduler::initialize(bool use_opencl, int num_cpu_threads) sizeof(cl_device_id) * numberOfDevices, __func__); clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, numberOfDevices, cldevices, nullptr); - g_context = clCreateContext( + g_work_scheduler.opencl_context = clCreateContext( nullptr, numberOfDevices, cldevices, clContextError, nullptr, &error); if (error != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); } const char *cl_str[2] = {datatoc_COM_OpenCLKernels_cl, nullptr}; - g_program = clCreateProgramWithSource(g_context, 1, cl_str, nullptr, &error); - error = clBuildProgram(g_program, numberOfDevices, cldevices, nullptr, nullptr, nullptr); + g_work_scheduler.opencl_program = clCreateProgramWithSource( + g_work_scheduler.opencl_context, 1, cl_str, nullptr, &error); + error = clBuildProgram(g_work_scheduler.opencl_program, + numberOfDevices, + cldevices, + nullptr, + nullptr, + nullptr); if (error != CL_SUCCESS) { cl_int error2; size_t ret_val_size = 0; printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); - error2 = clGetProgramBuildInfo( - g_program, cldevices[0], CL_PROGRAM_BUILD_LOG, 0, nullptr, &ret_val_size); + error2 = clGetProgramBuildInfo(g_work_scheduler.opencl_program, + cldevices[0], + CL_PROGRAM_BUILD_LOG, + 0, + nullptr, + &ret_val_size); if (error2 != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); } char *build_log = (char *)MEM_mallocN(sizeof(char) * ret_val_size + 1, __func__); - error2 = clGetProgramBuildInfo( - g_program, cldevices[0], CL_PROGRAM_BUILD_LOG, ret_val_size, build_log, nullptr); + error2 = clGetProgramBuildInfo(g_work_scheduler.opencl_program, + cldevices[0], + CL_PROGRAM_BUILD_LOG, + ret_val_size, + build_log, + nullptr); if (error2 != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); } @@ -307,9 +327,12 @@ void WorkScheduler::initialize(bool use_opencl, int num_cpu_threads) if (error2 != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error2, clewErrorString(error2)); } - OpenCLDevice *clDevice = new OpenCLDevice(g_context, device, g_program, vendorID); + OpenCLDevice *clDevice = new OpenCLDevice(g_work_scheduler.opencl_context, + device, + g_work_scheduler.opencl_program, + vendorID); clDevice->initialize(); - g_gpudevices.push_back(clDevice); + g_work_scheduler.gpu_devices.push_back(clDevice); } } MEM_freeN(cldevices); @@ -317,7 +340,7 @@ void WorkScheduler::initialize(bool use_opencl, int num_cpu_threads) MEM_freeN(platforms); } - g_openclInitialized = true; + g_work_scheduler.opencl_initialized = true; } # endif #endif @@ -327,38 +350,38 @@ void WorkScheduler::deinitialize() { #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE /* deinitialize CPU threads */ - if (g_cpuInitialized) { + if (g_work_scheduler.cpu_initialized) { Device *device; - while (!g_cpudevices.empty()) { - device = g_cpudevices.back(); - g_cpudevices.pop_back(); + while (!g_work_scheduler.cpu_devices.empty()) { + device = g_work_scheduler.cpu_devices.back(); + g_work_scheduler.cpu_devices.pop_back(); device->deinitialize(); delete device; } BLI_thread_local_delete(g_thread_device); - g_cpuInitialized = false; + g_work_scheduler.cpu_initialized = false; } # ifdef COM_OPENCL_ENABLED /* deinitialize OpenCL GPU's */ - if (g_openclInitialized) { + if (g_work_scheduler.opencl_initialized) { Device *device; - while (!g_gpudevices.empty()) { - device = g_gpudevices.back(); - g_gpudevices.pop_back(); + while (!g_work_scheduler.gpu_devices.empty()) { + device = g_work_scheduler.gpu_devices.back(); + g_work_scheduler.gpu_devices.pop_back(); device->deinitialize(); delete device; } - if (g_program) { - clReleaseProgram(g_program); - g_program = nullptr; + if (g_work_scheduler.opencl_program) { + clReleaseProgram(g_work_scheduler.opencl_program); + g_work_scheduler.opencl_program = nullptr; } - if (g_context) { - clReleaseContext(g_context); - g_context = nullptr; + if (g_work_scheduler.opencl_context) { + clReleaseContext(g_work_scheduler.opencl_context); + g_work_scheduler.opencl_context = nullptr; } - g_openclInitialized = false; + g_work_scheduler.opencl_initialized = false; } # endif #endif diff --git a/source/blender/compositor/intern/COM_WorkScheduler.h b/source/blender/compositor/intern/COM_WorkScheduler.h index 2424d1bdb72..ebddaa01ce1 100644 --- a/source/blender/compositor/intern/COM_WorkScheduler.h +++ b/source/blender/compositor/intern/COM_WorkScheduler.h @@ -29,14 +29,9 @@ /** \brief the workscheduler * \ingroup execution */ -class WorkScheduler { +struct WorkScheduler { #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE - /** - * \brief are we being stopped. - */ - static bool isStopping(); - /** * \brief main thread loop for cpudevices * inside this loop new work is queried and being executed @@ -107,7 +102,7 @@ class WorkScheduler { * A node can generate a different operation tree when OpenCLDevices exists. * \see CompositorContext.getHasActiveOpenCLDevices */ - static bool hasGPUDevices(); + static bool has_gpu_devices(); static int current_thread_id(); diff --git a/source/blender/compositor/intern/COM_compositor.cpp b/source/blender/compositor/intern/COM_compositor.cpp index bccdd026ead..68e4f80f91f 100644 --- a/source/blender/compositor/intern/COM_compositor.cpp +++ b/source/blender/compositor/intern/COM_compositor.cpp @@ -29,42 +29,21 @@ #include "COM_compositor.h" #include "clew.h" -static ThreadMutex s_compositorMutex; -static bool is_compositorMutex_init = false; +static struct { + bool is_initialized = false; + ThreadMutex mutex; +} g_compositor; -void COM_execute(RenderData *rd, - Scene *scene, - bNodeTree *editingtree, - int rendering, - const ColorManagedViewSettings *viewSettings, - const ColorManagedDisplaySettings *displaySettings, - const char *viewName) +/* Make sure node tree has previews. + * Don't create previews in advance, this is done when adding preview operations. + * Reserved preview size is determined by render output for now. */ +static void compositor_init_node_previews(const RenderData *render_data, bNodeTree *node_tree) { - /* initialize mutex, TODO this mutex init is actually not thread safe and - * should be done somewhere as part of blender startup, all the other - * initializations can be done lazily */ - if (is_compositorMutex_init == false) { - BLI_mutex_init(&s_compositorMutex); - is_compositorMutex_init = true; - } - - BLI_mutex_lock(&s_compositorMutex); - - if (editingtree->test_break(editingtree->tbh)) { - // during editing multiple calls to this method can be triggered. - // make sure one the last one will be doing the work. - BLI_mutex_unlock(&s_compositorMutex); - return; - } - - /* Make sure node tree has previews. - * Don't create previews in advance, this is done when adding preview operations. - * Reserved preview size is determined by render output for now. - * - * We fit the aspect into COM_PREVIEW_SIZE x COM_PREVIEW_SIZE image to avoid - * insane preview resolution, which might even overflow preview dimensions. - */ - const float aspect = rd->xsch > 0 ? (float)rd->ysch / (float)rd->xsch : 1.0f; + /* We fit the aspect into COM_PREVIEW_SIZE x COM_PREVIEW_SIZE image to avoid + * insane preview resolution, which might even overflow preview dimensions. */ + const float aspect = render_data->xsch > 0 ? + (float)render_data->ysch / (float)render_data->xsch : + 1.0f; int preview_width, preview_height; if (aspect < 1.0f) { preview_width = COM_PREVIEW_SIZE; @@ -74,47 +53,74 @@ void COM_execute(RenderData *rd, preview_width = (int)(COM_PREVIEW_SIZE / aspect); preview_height = COM_PREVIEW_SIZE; } - BKE_node_preview_init_tree(editingtree, preview_width, preview_height, false); + BKE_node_preview_init_tree(node_tree, preview_width, preview_height, false); +} - /* initialize workscheduler, will check if already done. TODO deinitialize somewhere */ - bool use_opencl = (editingtree->flag & NTREE_COM_OPENCL) != 0; - WorkScheduler::initialize(use_opencl, BKE_render_num_threads(rd)); +static void compositor_reset_node_tree_status(bNodeTree *node_tree) +{ + node_tree->progress(node_tree->prh, 0.0); + node_tree->stats_draw(node_tree->sdh, IFACE_("Compositing")); +} - /* set progress bar to 0% and status to init compositing */ - editingtree->progress(editingtree->prh, 0.0); - editingtree->stats_draw(editingtree->sdh, IFACE_("Compositing")); +void COM_execute(RenderData *render_data, + Scene *scene, + bNodeTree *node_tree, + int rendering, + const ColorManagedViewSettings *viewSettings, + const ColorManagedDisplaySettings *displaySettings, + const char *viewName) +{ + /* Initialize mutex, TODO this mutex init is actually not thread safe and + * should be done somewhere as part of blender startup, all the other + * initializations can be done lazily. */ + if (!g_compositor.is_initialized) { + BLI_mutex_init(&g_compositor.mutex); + g_compositor.is_initialized = true; + } - bool twopass = (editingtree->flag & NTREE_TWO_PASS) && !rendering; - /* initialize execution system */ + BLI_mutex_lock(&g_compositor.mutex); + + if (node_tree->test_break(node_tree->tbh)) { + /* During editing multiple compositor executions can be triggered. + * Make sure this is the most recent one. */ + BLI_mutex_unlock(&g_compositor.mutex); + return; + } + + compositor_init_node_previews(render_data, node_tree); + compositor_reset_node_tree_status(node_tree); + + /* Initialize workscheduler. */ + const bool use_opencl = (node_tree->flag & NTREE_COM_OPENCL) != 0; + WorkScheduler::initialize(use_opencl, BKE_render_num_threads(render_data)); + + /* Execute. */ + const bool twopass = (node_tree->flag & NTREE_TWO_PASS) && !rendering; if (twopass) { - ExecutionSystem *system = new ExecutionSystem( - rd, scene, editingtree, rendering, twopass, viewSettings, displaySettings, viewName); - system->execute(); - delete system; + ExecutionSystem fast_pass( + render_data, scene, node_tree, rendering, true, viewSettings, displaySettings, viewName); + fast_pass.execute(); - if (editingtree->test_break(editingtree->tbh)) { - // during editing multiple calls to this method can be triggered. - // make sure one the last one will be doing the work. - BLI_mutex_unlock(&s_compositorMutex); + if (node_tree->test_break(node_tree->tbh)) { + BLI_mutex_unlock(&g_compositor.mutex); return; } } - ExecutionSystem *system = new ExecutionSystem( - rd, scene, editingtree, rendering, false, viewSettings, displaySettings, viewName); - system->execute(); - delete system; + ExecutionSystem system( + render_data, scene, node_tree, rendering, false, viewSettings, displaySettings, viewName); + system.execute(); - BLI_mutex_unlock(&s_compositorMutex); + BLI_mutex_unlock(&g_compositor.mutex); } void COM_deinitialize() { - if (is_compositorMutex_init) { - BLI_mutex_lock(&s_compositorMutex); + if (g_compositor.is_initialized) { + BLI_mutex_lock(&g_compositor.mutex); WorkScheduler::deinitialize(); - is_compositorMutex_init = false; - BLI_mutex_unlock(&s_compositorMutex); - BLI_mutex_end(&s_compositorMutex); + g_compositor.is_initialized = false; + BLI_mutex_unlock(&g_compositor.mutex); + BLI_mutex_end(&g_compositor.mutex); } } diff --git a/source/blender/compositor/nodes/COM_KeyingNode.cpp b/source/blender/compositor/nodes/COM_KeyingNode.cpp index 13bdabcdfd8..9b493d3f332 100644 --- a/source/blender/compositor/nodes/COM_KeyingNode.cpp +++ b/source/blender/compositor/nodes/COM_KeyingNode.cpp @@ -240,9 +240,9 @@ void KeyingNode::convertToOperations(NodeConverter &converter, if (keying_data->blur_pre) { /* Chroma pre-blur operation for input of keying operation. */ - NodeOperationOutput *preBluredImage = setupPreBlur( + NodeOperationOutput *preBlurredImage = setupPreBlur( converter, inputImage, keying_data->blur_pre); - converter.addLink(preBluredImage, keyingOperation->getInputSocket(0)); + converter.addLink(preBlurredImage, keyingOperation->getInputSocket(0)); } else { converter.mapInputSocket(inputImage, keyingOperation->getInputSocket(0)); diff --git a/source/blender/compositor/operations/COM_BlurBaseOperation.cpp b/source/blender/compositor/operations/COM_BlurBaseOperation.cpp index 3fe154c397e..612a71037f7 100644 --- a/source/blender/compositor/operations/COM_BlurBaseOperation.cpp +++ b/source/blender/compositor/operations/COM_BlurBaseOperation.cpp @@ -88,7 +88,7 @@ float *BlurBaseOperation::make_gausstab(float rad, int size) return gausstab; } -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 __m128 *BlurBaseOperation::convert_gausstab_sse(const float *gausstab, int size) { int n = 2 * size + 1; diff --git a/source/blender/compositor/operations/COM_BlurBaseOperation.h b/source/blender/compositor/operations/COM_BlurBaseOperation.h index c452b2e4ea1..56dacc96710 100644 --- a/source/blender/compositor/operations/COM_BlurBaseOperation.h +++ b/source/blender/compositor/operations/COM_BlurBaseOperation.h @@ -23,16 +23,14 @@ #define MAX_GAUSSTAB_RADIUS 30000 -#ifdef __SSE2__ -# include -#endif +#include "BLI_simd.h" class BlurBaseOperation : public NodeOperation, public QualityStepHelper { private: protected: BlurBaseOperation(DataType data_type); float *make_gausstab(float rad, int size); -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 __m128 *convert_gausstab_sse(const float *gausstab, int size); #endif float *make_dist_fac_inverse(float rad, int size, int falloff); diff --git a/source/blender/compositor/operations/COM_DenoiseOperation.cpp b/source/blender/compositor/operations/COM_DenoiseOperation.cpp index bc33e5f75c4..d08f238c4c1 100644 --- a/source/blender/compositor/operations/COM_DenoiseOperation.cpp +++ b/source/blender/compositor/operations/COM_DenoiseOperation.cpp @@ -94,7 +94,11 @@ void DenoiseOperation::generateDenoise(float *data, return; } #ifdef WITH_OPENIMAGEDENOISE - if (BLI_cpu_support_sse41()) { + /* Always supported through Accelerate framework BNNS on macOS. */ +# ifndef __APPLE__ + if (BLI_cpu_support_sse41()) +# endif + { oidn::DeviceRef device = oidn::newDevice(); device.commit(); diff --git a/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp index e08d30e5ddf..90333f7dd79 100644 --- a/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp @@ -26,7 +26,7 @@ GaussianXBlurOperation::GaussianXBlurOperation() : BlurBaseOperation(COM_DT_COLOR) { this->m_gausstab = nullptr; -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 this->m_gausstab_sse = nullptr; #endif this->m_filtersize = 0; @@ -55,7 +55,7 @@ void GaussianXBlurOperation::initExecution() /* TODO(sergey): De-duplicate with the case below and Y blur. */ this->m_gausstab = BlurBaseOperation::make_gausstab(rad, m_filtersize); -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 this->m_gausstab_sse = BlurBaseOperation::convert_gausstab_sse(this->m_gausstab, m_filtersize); #endif } @@ -70,7 +70,7 @@ void GaussianXBlurOperation::updateGauss() m_filtersize = min_ii(ceil(rad), MAX_GAUSSTAB_RADIUS); this->m_gausstab = BlurBaseOperation::make_gausstab(rad, m_filtersize); -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 this->m_gausstab_sse = BlurBaseOperation::convert_gausstab_sse(this->m_gausstab, m_filtersize); #endif } @@ -95,7 +95,7 @@ void GaussianXBlurOperation::executePixel(float output[4], int x, int y, void *d int offsetadd = getOffsetAdd(); int bufferindex = ((xmin - bufferstartx) * 4) + ((ymin - bufferstarty) * 4 * bufferwidth); -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 __m128 accum_r = _mm_load_ps(color_accum); for (int nx = xmin, index = (xmin - x) + this->m_filtersize; nx < xmax; nx += step, index += step) { @@ -162,7 +162,7 @@ void GaussianXBlurOperation::deinitExecution() MEM_freeN(this->m_gausstab); this->m_gausstab = nullptr; } -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 if (this->m_gausstab_sse) { MEM_freeN(this->m_gausstab_sse); this->m_gausstab_sse = nullptr; diff --git a/source/blender/compositor/operations/COM_GaussianXBlurOperation.h b/source/blender/compositor/operations/COM_GaussianXBlurOperation.h index 9348c05f906..b2bcd79e716 100644 --- a/source/blender/compositor/operations/COM_GaussianXBlurOperation.h +++ b/source/blender/compositor/operations/COM_GaussianXBlurOperation.h @@ -24,7 +24,7 @@ class GaussianXBlurOperation : public BlurBaseOperation { private: float *m_gausstab; -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 __m128 *m_gausstab_sse; #endif int m_filtersize; diff --git a/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp index 7710b065ccd..c5b3cf24239 100644 --- a/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp @@ -26,7 +26,7 @@ GaussianYBlurOperation::GaussianYBlurOperation() : BlurBaseOperation(COM_DT_COLOR) { this->m_gausstab = nullptr; -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 this->m_gausstab_sse = nullptr; #endif this->m_filtersize = 0; @@ -54,7 +54,7 @@ void GaussianYBlurOperation::initExecution() m_filtersize = min_ii(ceil(rad), MAX_GAUSSTAB_RADIUS); this->m_gausstab = BlurBaseOperation::make_gausstab(rad, m_filtersize); -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 this->m_gausstab_sse = BlurBaseOperation::convert_gausstab_sse(this->m_gausstab, m_filtersize); #endif } @@ -69,7 +69,7 @@ void GaussianYBlurOperation::updateGauss() m_filtersize = min_ii(ceil(rad), MAX_GAUSSTAB_RADIUS); this->m_gausstab = BlurBaseOperation::make_gausstab(rad, m_filtersize); -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 this->m_gausstab_sse = BlurBaseOperation::convert_gausstab_sse(this->m_gausstab, m_filtersize); #endif } @@ -94,7 +94,7 @@ void GaussianYBlurOperation::executePixel(float output[4], int x, int y, void *d int step = getStep(); const int bufferIndexx = ((xmin - bufferstartx) * 4); -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 __m128 accum_r = _mm_load_ps(color_accum); for (int ny = ymin; ny < ymax; ny += step) { index = (ny - y) + this->m_filtersize; @@ -162,7 +162,7 @@ void GaussianYBlurOperation::deinitExecution() MEM_freeN(this->m_gausstab); this->m_gausstab = nullptr; } -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 if (this->m_gausstab_sse) { MEM_freeN(this->m_gausstab_sse); this->m_gausstab_sse = nullptr; diff --git a/source/blender/compositor/operations/COM_GaussianYBlurOperation.h b/source/blender/compositor/operations/COM_GaussianYBlurOperation.h index 7ab4ecb5506..d921780876a 100644 --- a/source/blender/compositor/operations/COM_GaussianYBlurOperation.h +++ b/source/blender/compositor/operations/COM_GaussianYBlurOperation.h @@ -24,7 +24,7 @@ class GaussianYBlurOperation : public BlurBaseOperation { private: float *m_gausstab; -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 __m128 *m_gausstab_sse; #endif int m_filtersize; diff --git a/source/blender/compositor/operations/COM_OutputFileOperation.cpp b/source/blender/compositor/operations/COM_OutputFileOperation.cpp index 2f8740081a1..19d49bc2ae7 100644 --- a/source/blender/compositor/operations/COM_OutputFileOperation.cpp +++ b/source/blender/compositor/operations/COM_OutputFileOperation.cpp @@ -347,8 +347,9 @@ StampData *OutputOpenExrMultiLayerOperation::createStampData() const } std::unique_ptr meta_data = layer->imageInput->getMetaData(); if (meta_data) { - blender::StringRef layer_name = blender::BKE_cryptomatte_extract_layer_name( - blender::StringRef(layer->name, BLI_strnlen(layer->name, sizeof(layer->name)))); + blender::StringRef layer_name = + blender::bke::cryptomatte::BKE_cryptomatte_extract_layer_name( + blender::StringRef(layer->name, BLI_strnlen(layer->name, sizeof(layer->name)))); meta_data->replaceHashNeutralCryptomatteKeys(layer_name); meta_data->addToRenderResult(&render_result); } diff --git a/source/blender/compositor/operations/COM_RenderLayersProg.cpp b/source/blender/compositor/operations/COM_RenderLayersProg.cpp index 2a0a6e33b6a..4f4116d6faa 100644 --- a/source/blender/compositor/operations/COM_RenderLayersProg.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersProg.cpp @@ -233,9 +233,12 @@ struct CallbackData { void setCryptomatteKeys(blender::StringRef cryptomatte_layer_name) { - manifest_key = blender::BKE_cryptomatte_meta_data_key(cryptomatte_layer_name, "manifest"); - hash_key = blender::BKE_cryptomatte_meta_data_key(cryptomatte_layer_name, "hash"); - conversion_key = blender::BKE_cryptomatte_meta_data_key(cryptomatte_layer_name, "conversion"); + manifest_key = blender::bke::cryptomatte::BKE_cryptomatte_meta_data_key(cryptomatte_layer_name, + "manifest"); + hash_key = blender::bke::cryptomatte::BKE_cryptomatte_meta_data_key(cryptomatte_layer_name, + "hash"); + conversion_key = blender::bke::cryptomatte::BKE_cryptomatte_meta_data_key( + cryptomatte_layer_name, "conversion"); } }; @@ -276,7 +279,7 @@ std::unique_ptr RenderLayersProg::getMetaData() const view_layer->name, BLI_strnlen(view_layer->name, sizeof(view_layer->name))) + "." + m_passName; - blender::StringRef cryptomatte_layer_name = blender::BKE_cryptomatte_extract_layer_name( + blender::StringRef cryptomatte_layer_name = blender::bke::cryptomatte::BKE_cryptomatte_extract_layer_name( full_layer_name); callback_data.setCryptomatteKeys(cryptomatte_layer_name); diff --git a/source/blender/compositor/operations/COM_TonemapOperation.h b/source/blender/compositor/operations/COM_TonemapOperation.h index 3870593b423..cb8816b93b3 100644 --- a/source/blender/compositor/operations/COM_TonemapOperation.h +++ b/source/blender/compositor/operations/COM_TonemapOperation.h @@ -22,7 +22,7 @@ #include "DNA_node_types.h" /** - * \brief temporarily storage during execution of Tonemap + * \brief temporarily storage during execution of Tone-map * \ingroup operation */ typedef struct AvgLogLum { diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index 9b716eeeed3..dff9e302fdf 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -90,6 +90,7 @@ set(SRC engines/eevee/eevee_lights.c engines/eevee/eevee_lookdev.c engines/eevee/eevee_lut.c + engines/eevee/eevee_lut_gen.c engines/eevee/eevee_materials.c engines/eevee/eevee_mist.c engines/eevee/eevee_motion_blur.c @@ -197,7 +198,6 @@ set(LIB data_to_c_simple(engines/eevee/shaders/ambient_occlusion_lib.glsl SRC) data_to_c_simple(engines/eevee/shaders/background_vert.glsl SRC) -data_to_c_simple(engines/eevee/shaders/closure_lib.glsl SRC) data_to_c_simple(engines/eevee/shaders/common_uniforms_lib.glsl SRC) data_to_c_simple(engines/eevee/shaders/common_utiltex_lib.glsl SRC) data_to_c_simple(engines/eevee/shaders/lights_lib.glsl SRC) @@ -215,10 +215,25 @@ data_to_c_simple(engines/eevee/shaders/lightprobe_grid_fill_frag.glsl SRC) data_to_c_simple(engines/eevee/shaders/lightprobe_planar_display_frag.glsl SRC) data_to_c_simple(engines/eevee/shaders/lightprobe_planar_display_vert.glsl SRC) data_to_c_simple(engines/eevee/shaders/lookdev_world_frag.glsl SRC) -data_to_c_simple(engines/eevee/shaders/closure_lit_lib.glsl SRC) +data_to_c_simple(engines/eevee/shaders/closure_eval_lib.glsl SRC) +data_to_c_simple(engines/eevee/shaders/closure_eval_diffuse_lib.glsl SRC) +data_to_c_simple(engines/eevee/shaders/closure_eval_glossy_lib.glsl SRC) +data_to_c_simple(engines/eevee/shaders/closure_eval_refraction_lib.glsl SRC) +data_to_c_simple(engines/eevee/shaders/closure_eval_translucent_lib.glsl SRC) +data_to_c_simple(engines/eevee/shaders/closure_type_lib.glsl SRC) data_to_c_simple(engines/eevee/shaders/effect_bloom_frag.glsl SRC) -data_to_c_simple(engines/eevee/shaders/effect_dof_vert.glsl SRC) -data_to_c_simple(engines/eevee/shaders/effect_dof_frag.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_bokeh_frag.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_dilate_tiles_frag.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_downsample_frag.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_filter_frag.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_flatten_tiles_frag.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_gather_frag.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_lib.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_reduce_frag.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_resolve_frag.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_scatter_frag.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_scatter_vert.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_setup_frag.glsl SRC) data_to_c_simple(engines/eevee/shaders/effect_downsample_frag.glsl SRC) data_to_c_simple(engines/eevee/shaders/effect_downsample_cube_frag.glsl SRC) data_to_c_simple(engines/eevee/shaders/effect_gtao_frag.glsl SRC) diff --git a/source/blender/draw/engines/eevee/eevee_cryptomatte.c b/source/blender/draw/engines/eevee/eevee_cryptomatte.c index 13a3f1766a9..c95279fc078 100644 --- a/source/blender/draw/engines/eevee/eevee_cryptomatte.c +++ b/source/blender/draw/engines/eevee/eevee_cryptomatte.c @@ -321,12 +321,6 @@ void EEVEE_cryptomatte_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *s } } -void EEVEE_cryptomatte_cache_finish(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) -{ - EEVEE_PrivateData *g_data = vedata->stl->g_data; - BKE_cryptomatte_finish(g_data->cryptomatte_session); -} - /** \} */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/draw/engines/eevee/eevee_depth_of_field.c b/source/blender/draw/engines/eevee/eevee_depth_of_field.c index 92ba526c67c..33d45d61d42 100644 --- a/source/blender/draw/engines/eevee/eevee_depth_of_field.c +++ b/source/blender/draw/engines/eevee/eevee_depth_of_field.c @@ -20,6 +20,13 @@ * \ingroup draw_engine * * Depth of field post process effect. + * + * There are 2 methods to achieve this effect. + * - The first uses projection matrix offsetting and sample accumulation to give reference quality + * depth of field. But this needs many samples to hide the under-sampling. + * - The second one is a post-processing based one. It follows the implementation described in + * the presentation "Life of a Bokeh - Siggraph 2018" from Guillaume Abadie. There are some + * difference with our actual implementation that prioritize quality. */ #include "DRW_render.h" @@ -40,10 +47,156 @@ #include "GPU_texture.h" #include "eevee_private.h" +#define CAMERA_JITTER_RING_DENSITY 6 + +static float coc_radius_from_camera_depth(bool is_ortho, EEVEE_EffectsInfo *fx, float camera_depth) +{ + float multiplier = fx->dof_coc_params[0]; + float bias = fx->dof_coc_params[1]; + if (multiplier == 0.0f || bias == 0.0f) { + return 0.0f; + } + if (is_ortho) { + return (camera_depth + multiplier / bias) * multiplier; + } + return multiplier / camera_depth - bias; +} + +static float polygon_sides_length(float sides_count) +{ + return 2.0 * sin(M_PI / sides_count); +} + +/* Returns intersection ratio between the radius edge at theta and the polygon edge. + * Start first corners at theta == 0. */ +static float circle_to_polygon_radius(float sides_count, float theta) +{ + /* From Graphics Gems from CryENGINE 3 (Siggraph 2013) by Tiago Sousa (slide 36). */ + float side_angle = (2.0f * M_PI) / sides_count; + return cosf(side_angle * 0.5f) / + cosf(theta - side_angle * floorf((sides_count * theta + M_PI) / (2.0f * M_PI))); +} + +/* Remap input angle to have homogenous spacing of points along a polygon edge. + * Expect theta to be in [0..2pi] range. */ +static float circle_to_polygon_angle(float sides_count, float theta) +{ + float side_angle = (2.0f * M_PI) / sides_count; + float halfside_angle = side_angle * 0.5f; + float side = floorf(theta / side_angle); + /* Length of segment from center to the middle of polygon side. */ + float adjacent = circle_to_polygon_radius(sides_count, 0.0f); + + /* This is the relative position of the sample on the polygon half side. */ + float local_theta = theta - side * side_angle; + float ratio = (local_theta - halfside_angle) / halfside_angle; + + float halfside_len = polygon_sides_length(sides_count) * 0.5f; + float opposite = ratio * halfside_len; + + /* NOTE: atan(y_over_x) has output range [-M_PI_2..M_PI_2]. */ + float final_local_theta = atanf(opposite / adjacent); + + return side * side_angle + final_local_theta; +} + +static int dof_jitter_total_sample_count(int ring_density, int ring_count) +{ + return ((ring_count * ring_count + ring_count) / 2) * ring_density + 1; +} + +bool EEVEE_depth_of_field_jitter_get(EEVEE_EffectsInfo *fx, + float r_jitter[2], + float *r_focus_distance) +{ + if (fx->dof_jitter_radius == 0.0f) { + return false; + } + + int ring_density = CAMERA_JITTER_RING_DENSITY; + int ring_count = fx->dof_jitter_ring_count; + int sample_count = dof_jitter_total_sample_count(ring_density, ring_count); + + int s = fx->taa_current_sample - 1; + + int ring = 0; + int ring_sample_count = 1; + int ring_sample = 1; + + s = s * (ring_density - 1); + s = s % sample_count; + + int samples_passed = 1; + while (s >= samples_passed) { + ring++; + ring_sample_count = ring * ring_density; + ring_sample = s - samples_passed; + ring_sample = (ring_sample + 1) % ring_sample_count; + samples_passed += ring_sample_count; + } + + r_jitter[0] = (float)ring / ring_count; + r_jitter[1] = (float)ring_sample / ring_sample_count; + + { + /* Bokeh shape parameterization. */ + float r = r_jitter[0]; + float T = r_jitter[1] * 2.0f * M_PI; + + if (fx->dof_jitter_blades >= 3.0f) { + T = circle_to_polygon_angle(fx->dof_jitter_blades, T); + r *= circle_to_polygon_radius(fx->dof_jitter_blades, T); + } + + T += fx->dof_bokeh_rotation; + + r_jitter[0] = r * cosf(T); + r_jitter[1] = r * sinf(T); + + mul_v2_v2(r_jitter, fx->dof_bokeh_aniso); + } + + mul_v2_fl(r_jitter, fx->dof_jitter_radius); + + *r_focus_distance = fx->dof_jitter_focus; + return true; +} + +int EEVEE_depth_of_field_sample_count_get(EEVEE_EffectsInfo *effects, + int sample_count, + int *r_ring_count) +{ + if (effects->dof_jitter_radius == 0.0f) { + if (r_ring_count != NULL) { + *r_ring_count = 0; + } + return 1; + } + + if (sample_count == TAA_MAX_SAMPLE) { + /* Special case for viewport continuous rendering. We clamp to a max sample to avoid the + * jittered dof never converging. */ + sample_count = 1024; + } + /* Inversion of dof_jitter_total_sample_count. */ + float x = 2.0f * (sample_count - 1.0f) / CAMERA_JITTER_RING_DENSITY; + /* Solving polynomial. We only search positive solution. */ + float discriminant = 1.0f + 4.0f * x; + int ring_count = ceilf(0.5f * (sqrt(discriminant) - 1.0f)); + + sample_count = dof_jitter_total_sample_count(CAMERA_JITTER_RING_DENSITY, ring_count); + + if (r_ring_count != NULL) { + *r_ring_count = ring_count; + } + return sample_count; +} + int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata, Object *camera) { + EEVEE_TextureList *txl = vedata->txl; EEVEE_StorageList *stl = vedata->stl; EEVEE_FramebufferList *fbl = vedata->fbl; EEVEE_EffectsInfo *effects = stl->effects; @@ -57,59 +210,30 @@ int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata), RegionView3D *rv3d = draw_ctx->rv3d; const float *viewport_size = DRW_viewport_size_get(); + effects->dof_hq_slight_focus = (scene_eval->eevee.flag & SCE_EEVEE_DOF_HQ_SLIGHT_FOCUS) != 0; + /* Retrieve Near and Far distance */ - effects->dof_near_far[0] = -cam->clip_start; - effects->dof_near_far[1] = -cam->clip_end; - - int buffer_size[2] = {(int)viewport_size[0] / 2, (int)viewport_size[1] / 2}; - - buffer_size[0] = max_ii(1, buffer_size[0]); - buffer_size[1] = max_ii(1, buffer_size[1]); - - eGPUTextureFormat down_format = DRW_state_draw_background() ? GPU_R11F_G11F_B10F : GPU_RGBA16F; - - effects->dof_down_near = DRW_texture_pool_query_2d( - buffer_size[0], buffer_size[1], down_format, &draw_engine_eevee_type); - effects->dof_down_far = DRW_texture_pool_query_2d( - buffer_size[0], buffer_size[1], down_format, &draw_engine_eevee_type); - effects->dof_coc = DRW_texture_pool_query_2d( - buffer_size[0], buffer_size[1], GPU_RG16F, &draw_engine_eevee_type); - - GPU_framebuffer_ensure_config(&fbl->dof_down_fb, - {GPU_ATTACHMENT_NONE, - GPU_ATTACHMENT_TEXTURE(effects->dof_down_near), - GPU_ATTACHMENT_TEXTURE(effects->dof_down_far), - GPU_ATTACHMENT_TEXTURE(effects->dof_coc)}); - - /* Go full 32bits for rendering and reduce the color artifacts. */ - eGPUTextureFormat fb_format = DRW_state_is_image_render() ? GPU_RGBA32F : GPU_RGBA16F; - - effects->dof_blur = DRW_texture_pool_query_2d( - buffer_size[0] * 2, buffer_size[1], fb_format, &draw_engine_eevee_type); - - GPU_framebuffer_ensure_config(&fbl->dof_scatter_fb, - { - GPU_ATTACHMENT_NONE, - GPU_ATTACHMENT_TEXTURE(effects->dof_blur), - }); - - if (!DRW_state_draw_background()) { - effects->dof_blur_alpha = DRW_texture_pool_query_2d( - buffer_size[0] * 2, buffer_size[1], GPU_R32F, &draw_engine_eevee_type); - GPU_framebuffer_texture_attach(fbl->dof_scatter_fb, effects->dof_blur_alpha, 1, 0); - } + effects->dof_coc_near_dist = -cam->clip_start; + effects->dof_coc_far_dist = -cam->clip_end; /* Parameters */ - /* TODO UI Options */ + bool is_ortho = cam->type == CAM_ORTHO; float fstop = cam->dof.aperture_fstop; float blades = cam->dof.aperture_blades; float rotation = cam->dof.aperture_rotation; - float ratio = 1.0f / cam->dof.aperture_ratio; + float ratio = 1.0f / max_ff(cam->dof.aperture_ratio, 0.00001f); float sensor = BKE_camera_sensor_size(cam->sensor_fit, cam->sensor_x, cam->sensor_y); float focus_dist = BKE_camera_object_dof_distance(camera); float focal_len = cam->lens; - const float scale_camera = 0.001f; + if (is_ortho) { + /* (fclem) A bit of black magic here. I don't know if this is correct. */ + fstop *= 1.3f; + focal_len = 1.0f; + sensor = cam->ortho_scale; + } + + const float scale_camera = (is_ortho) ? 1.0 : 0.001f; /* we want radius here for the aperture number */ float aperture = 0.5f * scale_camera * focal_len / fstop; float focal_len_scaled = scale_camera * focal_len; @@ -119,93 +243,724 @@ int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata), sensor_scaled *= rv3d->viewcamtexcofac[0]; } - effects->dof_params[1] = aperture * fabsf(focal_len_scaled / (focus_dist - focal_len_scaled)); - effects->dof_params[1] *= viewport_size[0] / sensor_scaled; - effects->dof_params[0] = -focus_dist * effects->dof_params[1]; + if (ratio > 1.0) { + /* If ratio is scaling the bokeh outwards, we scale the aperture so that the gather + * kernel size will encompass the maximum axis. */ + aperture *= ratio; + } - effects->dof_bokeh[0] = rotation; - effects->dof_bokeh[1] = ratio; - effects->dof_bokeh[2] = scene_eval->eevee.bokeh_max_size; + effects->dof_coc_params[1] = -aperture * + fabsf(focal_len_scaled / (focus_dist - focal_len_scaled)); + /* FIXME(fclem) This is broken for vertically fit sensor. */ + effects->dof_coc_params[1] *= viewport_size[0] / sensor_scaled; - /* Precompute values to save instructions in fragment shader. */ - effects->dof_bokeh_sides[0] = blades; - effects->dof_bokeh_sides[1] = blades > 0.0f ? 2.0f * M_PI / blades : 0.0f; - effects->dof_bokeh_sides[2] = blades / (2.0f * M_PI); - effects->dof_bokeh_sides[3] = blades > 0.0f ? cosf(M_PI / blades) : 0.0f; + if ((scene_eval->eevee.flag & SCE_EEVEE_DOF_JITTER) != 0) { + effects->dof_jitter_radius = effects->dof_coc_params[1]; + effects->dof_jitter_focus = focus_dist; + effects->dof_jitter_blades = blades; + + int sample_count = EEVEE_temporal_sampling_sample_count_get(scene_eval, stl); + sample_count = EEVEE_depth_of_field_sample_count_get( + effects, sample_count, &effects->dof_jitter_ring_count); + + if (effects->dof_jitter_ring_count == 0) { + effects->dof_jitter_radius = 0.0f; + } + else { + /* Compute a minimal overblur radius to fill the gaps between the samples. + * This is just the simplified form of dividing the area of the bokeh + * by the number of samples. */ + float minimal_overblur = 1.0f / sqrtf(sample_count); + float user_overblur = scene_eval->eevee.bokeh_overblur / 100.0f; + + effects->dof_coc_params[1] *= minimal_overblur + user_overblur; + /* Avoid dilating the shape. Over-blur only soften. */ + effects->dof_jitter_radius -= effects->dof_coc_params[1]; + } + } + else { + effects->dof_jitter_radius = 0.0f; + } + + if (is_ortho) { + /* (fclem) A bit of black magic here. Needed to match cycles. */ + effects->dof_coc_params[1] *= 0.225; + } + + effects->dof_coc_params[0] = -focus_dist * effects->dof_coc_params[1]; + + effects->dof_bokeh_blades = blades; + effects->dof_bokeh_rotation = rotation; + effects->dof_bokeh_aniso[0] = min_ff(ratio, 1.0f); + effects->dof_bokeh_aniso[1] = min_ff(1.0f / ratio, 1.0f); + effects->dof_bokeh_max_size = scene_eval->eevee.bokeh_max_size; + + copy_v2_v2(effects->dof_bokeh_aniso_inv, effects->dof_bokeh_aniso); + invert_v2(effects->dof_bokeh_aniso_inv); + + effects->dof_scatter_color_threshold = scene_eval->eevee.bokeh_threshold; + effects->dof_scatter_neighbor_max_color = scene_eval->eevee.bokeh_neighbor_max; + effects->dof_denoise_factor = clamp_f(scene_eval->eevee.bokeh_denoise_fac, 0.0f, 1.0f); + + float max_abs_fg_coc, max_abs_bg_coc; + if (is_ortho) { + max_abs_fg_coc = fabsf(coc_radius_from_camera_depth(true, effects, -cam->clip_start)); + max_abs_bg_coc = fabsf(coc_radius_from_camera_depth(true, effects, -cam->clip_end)); + } + else { + max_abs_fg_coc = fabsf(coc_radius_from_camera_depth(false, effects, -cam->clip_start)); + /* Background is at infinity so maximum CoC is the limit of the function at -inf. */ + max_abs_bg_coc = fabsf(effects->dof_coc_params[1]); + } + + float max_coc = max_ff(max_abs_bg_coc, max_abs_fg_coc); + /* Clamp with user defined max. */ + effects->dof_fx_max_coc = min_ff(scene_eval->eevee.bokeh_max_size, max_coc); + + if (effects->dof_fx_max_coc < 0.5f) { + return 0; + } return EFFECT_DOF | EFFECT_POST_BUFFER; } + effects->dof_jitter_radius = 0.0f; + /* Cleanup to release memory */ - GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_down_fb); - GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_scatter_fb); + GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_setup_fb); + GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_flatten_tiles_fb); + GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_dilate_tiles_fb); + GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_reduce_fb); + GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_reduce_copy_fb); + GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_gather_fg_fb); + GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_gather_bg_fb); + GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_scatter_bg_fb); + DRW_TEXTURE_FREE_SAFE(txl->dof_reduced_color); + DRW_TEXTURE_FREE_SAFE(txl->dof_reduced_coc); return 0; } -void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) +#define WITH_FILTERING (GPU_SAMPLER_MIPMAP | GPU_SAMPLER_FILTER) +#define NO_FILTERING GPU_SAMPLER_MIPMAP +#define COLOR_FORMAT fx->dof_color_format +#define FG_TILE_FORMAT GPU_RGBA16F +#define BG_TILE_FORMAT GPU_R11F_G11F_B10F + +/** + * Create bokeh texture. + **/ +static void dof_bokeh_pass_init(EEVEE_FramebufferList *fbl, + EEVEE_PassList *psl, + EEVEE_EffectsInfo *fx) +{ + if ((fx->dof_bokeh_aniso[0] == 1.0f) && (fx->dof_bokeh_aniso[1] == 1.0f) && + (fx->dof_bokeh_blades == 0.0)) { + fx->dof_bokeh_gather_lut_tx = NULL; + fx->dof_bokeh_scatter_lut_tx = NULL; + fx->dof_bokeh_resolve_lut_tx = NULL; + return; + } + + void *owner = (void *)&EEVEE_depth_of_field_init; + int res[2] = {DOF_BOKEH_LUT_SIZE, DOF_BOKEH_LUT_SIZE}; + + DRW_PASS_CREATE(psl->dof_bokeh, DRW_STATE_WRITE_COLOR); + + GPUShader *sh = EEVEE_shaders_depth_of_field_bokeh_get(); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_bokeh); + DRW_shgroup_uniform_float_copy(grp, "bokehSides", fx->dof_bokeh_blades); + DRW_shgroup_uniform_float_copy(grp, "bokehRotation", fx->dof_bokeh_rotation); + DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropyInv", fx->dof_bokeh_aniso_inv); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + + fx->dof_bokeh_gather_lut_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_RG16F, owner); + fx->dof_bokeh_scatter_lut_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R16F, owner); + fx->dof_bokeh_resolve_lut_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R16F, owner); + + GPU_framebuffer_ensure_config(&fbl->dof_bokeh_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_bokeh_gather_lut_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_bokeh_scatter_lut_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_bokeh_resolve_lut_tx), + }); +} + +/** + * Outputs halfResColorBuffer and halfResCocBuffer. + **/ +static void dof_setup_pass_init(EEVEE_FramebufferList *fbl, + EEVEE_PassList *psl, + EEVEE_EffectsInfo *fx) { - EEVEE_PassList *psl = vedata->psl; - EEVEE_StorageList *stl = vedata->stl; - EEVEE_EffectsInfo *effects = stl->effects; DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); - if ((effects->enabled_effects & EFFECT_DOF) != 0) { - /** Depth of Field algorithm - * - * Overview : - * - Down-sample the color buffer into 2 buffers weighted with - * CoC values. Also output CoC into a texture. - * - Shoot quads for every pixel and expand it depending on the CoC. - * Do one pass for near Dof and one pass for far Dof. - * - Finally composite the 2 blurred buffers with the original render. - */ - DRWShadingGroup *grp; - struct GPUBatch *quad = DRW_cache_fullscreen_quad_get(); - const bool use_alpha = !DRW_state_draw_background(); + void *owner = (void *)&EEVEE_depth_of_field_init; + const float *fullres = DRW_viewport_size_get(); + int res[2] = {divide_ceil_u(fullres[0], 2), divide_ceil_u(fullres[1], 2)}; - DRW_PASS_CREATE(psl->dof_down, DRW_STATE_WRITE_COLOR); + DRW_PASS_CREATE(psl->dof_setup, DRW_STATE_WRITE_COLOR); - grp = DRW_shgroup_create(EEVEE_shaders_depth_of_field_downsample_get(use_alpha), - psl->dof_down); - DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &effects->source_buffer); - DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); - DRW_shgroup_uniform_vec2(grp, "nearFar", effects->dof_near_far, 1); - DRW_shgroup_uniform_vec2(grp, "dofParams", effects->dof_params, 1); - DRW_shgroup_call(grp, quad, NULL); + GPUShader *sh = EEVEE_shaders_depth_of_field_setup_get(); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_setup); + DRW_shgroup_uniform_texture_ref_ex(grp, "colorBuffer", &fx->source_buffer, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex(grp, "depthBuffer", &dtxl->depth, NO_FILTERING); + DRW_shgroup_uniform_vec4_copy(grp, "cocParams", fx->dof_coc_params); + DRW_shgroup_uniform_float_copy(grp, "bokehMaxSize", fx->dof_bokeh_max_size); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); - DRW_PASS_CREATE(psl->dof_scatter, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD_FULL); + fx->dof_half_res_color_tx = DRW_texture_pool_query_2d(UNPACK2(res), COLOR_FORMAT, owner); + fx->dof_half_res_coc_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_RG16F, owner); - /* This create an empty batch of N triangles to be positioned - * by the vertex shader 0.4ms against 6ms with instancing */ - const float *viewport_size = DRW_viewport_size_get(); - const int sprite_len = ((int)viewport_size[0] / 2) * - ((int)viewport_size[1] / 2); /* brackets matters */ - grp = DRW_shgroup_create(EEVEE_shaders_depth_of_field_scatter_get(use_alpha), - psl->dof_scatter); - DRW_shgroup_uniform_texture_ref(grp, "nearBuffer", &effects->dof_down_near); - DRW_shgroup_uniform_texture_ref(grp, "farBuffer", &effects->dof_down_far); - DRW_shgroup_uniform_texture_ref(grp, "cocBuffer", &effects->dof_coc); - DRW_shgroup_uniform_vec4(grp, "bokehParams", effects->dof_bokeh, 2); + GPU_framebuffer_ensure_config(&fbl->dof_setup_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_half_res_color_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_half_res_coc_tx), + }); +} - DRW_shgroup_call_procedural_triangles(grp, NULL, sprite_len); +/** + * Outputs min & max COC in each 8x8 half res pixel tiles (so 1/16th of full resolution). + **/ +static void dof_flatten_tiles_pass_init(EEVEE_FramebufferList *fbl, + EEVEE_PassList *psl, + EEVEE_EffectsInfo *fx) +{ + void *owner = (void *)&EEVEE_depth_of_field_init; + const float *fullres = DRW_viewport_size_get(); + int res[2] = {divide_ceil_u(fullres[0], DOF_TILE_DIVISOR), + divide_ceil_u(fullres[1], DOF_TILE_DIVISOR)}; - DRW_PASS_CREATE(psl->dof_resolve, DRW_STATE_WRITE_COLOR); + DRW_PASS_CREATE(psl->dof_flatten_tiles, DRW_STATE_WRITE_COLOR); - grp = DRW_shgroup_create(EEVEE_shaders_depth_of_field_resolve_get(use_alpha), - psl->dof_resolve); - DRW_shgroup_uniform_texture_ref(grp, "scatterBuffer", &effects->dof_blur); - DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &effects->source_buffer); - DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); - DRW_shgroup_uniform_vec2(grp, "nearFar", effects->dof_near_far, 1); - DRW_shgroup_uniform_vec2(grp, "dofParams", effects->dof_params, 1); - DRW_shgroup_call(grp, quad, NULL); + GPUShader *sh = EEVEE_shaders_depth_of_field_flatten_tiles_get(); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_flatten_tiles); + DRW_shgroup_uniform_texture_ref_ex( + grp, "halfResCocBuffer", &fx->dof_half_res_coc_tx, NO_FILTERING); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); - if (use_alpha) { - DRW_shgroup_uniform_texture_ref(grp, "scatterAlphaBuffer", &effects->dof_blur_alpha); - DRW_shgroup_uniform_bool_copy(grp, "unpremult", DRW_state_is_image_render()); + fx->dof_coc_tiles_fg_tx = DRW_texture_pool_query_2d(UNPACK2(res), FG_TILE_FORMAT, owner); + fx->dof_coc_tiles_bg_tx = DRW_texture_pool_query_2d(UNPACK2(res), BG_TILE_FORMAT, owner); + + GPU_framebuffer_ensure_config(&fbl->dof_flatten_tiles_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_coc_tiles_fg_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_coc_tiles_bg_tx), + }); +} + +/** + * Dilates the min & max COCS to cover maximum COC values. + * Output format/dimensions should be the same as coc_flatten_pass as they are swapped for + * doing multiple dilation passes. + **/ +static void dof_dilate_tiles_pass_init(EEVEE_FramebufferList *fbl, + EEVEE_PassList *psl, + EEVEE_EffectsInfo *fx) +{ + void *owner = (void *)&EEVEE_depth_of_field_init; + const float *fullres = DRW_viewport_size_get(); + int res[2] = {divide_ceil_u(fullres[0], DOF_TILE_DIVISOR), + divide_ceil_u(fullres[1], DOF_TILE_DIVISOR)}; + + DRW_PASS_CREATE(psl->dof_dilate_tiles_minmax, DRW_STATE_WRITE_COLOR); + DRW_PASS_CREATE(psl->dof_dilate_tiles_minabs, DRW_STATE_WRITE_COLOR); + + for (int pass = 0; pass < 2; pass++) { + DRWPass *drw_pass = (pass == 0) ? psl->dof_dilate_tiles_minmax : psl->dof_dilate_tiles_minabs; + GPUShader *sh = EEVEE_shaders_depth_of_field_dilate_tiles_get(pass); + DRWShadingGroup *grp = DRW_shgroup_create(sh, drw_pass); + DRW_shgroup_uniform_texture_ref(grp, "cocTilesFgBuffer", &fx->dof_coc_tiles_fg_tx); + DRW_shgroup_uniform_texture_ref(grp, "cocTilesBgBuffer", &fx->dof_coc_tiles_bg_tx); + DRW_shgroup_uniform_bool(grp, "dilateSlightFocus", &fx->dof_dilate_slight_focus, 1); + DRW_shgroup_uniform_int(grp, "ringCount", &fx->dof_dilate_ring_count, 1); + DRW_shgroup_uniform_int(grp, "ringWidthMultiplier", &fx->dof_dilate_ring_width_multiplier, 1); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + } + + fx->dof_coc_dilated_tiles_fg_tx = DRW_texture_pool_query_2d(UNPACK2(res), FG_TILE_FORMAT, owner); + fx->dof_coc_dilated_tiles_bg_tx = DRW_texture_pool_query_2d(UNPACK2(res), BG_TILE_FORMAT, owner); + + GPU_framebuffer_ensure_config(&fbl->dof_dilate_tiles_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_coc_dilated_tiles_fg_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_coc_dilated_tiles_bg_tx), + }); +} + +static void dof_dilate_tiles_pass_draw(EEVEE_FramebufferList *fbl, + EEVEE_PassList *psl, + EEVEE_EffectsInfo *fx) +{ + for (int pass = 0; pass < 2; pass++) { + DRWPass *drw_pass = (pass == 0) ? psl->dof_dilate_tiles_minmax : psl->dof_dilate_tiles_minabs; + + /* Error introduced by gather center jittering. */ + const float error_multiplier = 1.0f + 1.0f / (DOF_GATHER_RING_COUNT + 0.5f); + int dilation_end_radius = ceilf((fx->dof_fx_max_coc * error_multiplier) / DOF_TILE_DIVISOR); + + /* This algorithm produce the exact dilation radius by dividing it in multiple passes. */ + int dilation_radius = 0; + while (dilation_radius < dilation_end_radius) { + /* Dilate slight focus only on first iteration. */ + fx->dof_dilate_slight_focus = (dilation_radius == 0) ? 1 : 0; + + int remainder = dilation_end_radius - dilation_radius; + /* Do not step over any unvisited tile. */ + int max_multiplier = dilation_radius + 1; + + int ring_count = min_ii(DOF_DILATE_RING_COUNT, ceilf(remainder / (float)max_multiplier)); + int multiplier = min_ii(max_multiplier, floor(remainder / (float)ring_count)); + + dilation_radius += ring_count * multiplier; + + fx->dof_dilate_ring_count = ring_count; + fx->dof_dilate_ring_width_multiplier = multiplier; + + GPU_framebuffer_bind(fbl->dof_dilate_tiles_fb); + DRW_draw_pass(drw_pass); + + SWAP(GPUFrameBuffer *, fbl->dof_dilate_tiles_fb, fbl->dof_flatten_tiles_fb); + SWAP(GPUTexture *, fx->dof_coc_dilated_tiles_bg_tx, fx->dof_coc_tiles_bg_tx); + SWAP(GPUTexture *, fx->dof_coc_dilated_tiles_fg_tx, fx->dof_coc_tiles_fg_tx); } } + /* Swap again so that final textures are dof_coc_dilated_tiles_*_tx. */ + SWAP(GPUFrameBuffer *, fbl->dof_dilate_tiles_fb, fbl->dof_flatten_tiles_fb); + SWAP(GPUTexture *, fx->dof_coc_dilated_tiles_bg_tx, fx->dof_coc_tiles_bg_tx); + SWAP(GPUTexture *, fx->dof_coc_dilated_tiles_fg_tx, fx->dof_coc_tiles_fg_tx); +} + +/** + * Create mipmapped color & COC textures for gather passes. + **/ +static void dof_reduce_pass_init(EEVEE_FramebufferList *fbl, + EEVEE_PassList *psl, + EEVEE_TextureList *txl, + EEVEE_EffectsInfo *fx) +{ + const float *fullres = DRW_viewport_size_get(); + + /* Divide by 2 because dof_fx_max_coc is in fullres CoC radius and the reduce texture begins at + * half resolution. */ + float max_space_between_sample = fx->dof_fx_max_coc * 0.5f / DOF_GATHER_RING_COUNT; + + int mip_count = max_ii(1, log2_ceil_u(max_space_between_sample)); + + fx->dof_reduce_steps = mip_count - 1; + /* This ensure the mipmaps are aligned for the needed 4 mip levels. + * Starts at 2 because already at half resolution. */ + int multiple = 2 << (mip_count - 1); + int res[2] = {(multiple * divide_ceil_u(fullres[0], multiple)) / 2, + (multiple * divide_ceil_u(fullres[1], multiple)) / 2}; + + int quater_res[2] = {divide_ceil_u(fullres[0], 4), divide_ceil_u(fullres[1], 4)}; + + /* TODO(fclem): Make this dependent of the quality of the gather pass. */ + fx->dof_scatter_coc_threshold = 4.0f; + + { + DRW_PASS_CREATE(psl->dof_downsample, DRW_STATE_WRITE_COLOR); + + GPUShader *sh = EEVEE_shaders_depth_of_field_downsample_get(); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_downsample); + DRW_shgroup_uniform_texture_ref_ex( + grp, "colorBuffer", &fx->dof_reduce_input_color_tx, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex( + grp, "cocBuffer", &fx->dof_reduce_input_coc_tx, NO_FILTERING); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + + void *owner = (void *)&EEVEE_depth_of_field_init; + fx->dof_downsample_tx = DRW_texture_pool_query_2d(UNPACK2(quater_res), COLOR_FORMAT, owner); + + GPU_framebuffer_ensure_config(&fbl->dof_downsample_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_downsample_tx), + }); + } + + { + DRW_PASS_CREATE(psl->dof_reduce_copy, DRW_STATE_WRITE_COLOR); + + const bool is_copy_pass = true; + GPUShader *sh = EEVEE_shaders_depth_of_field_reduce_get(is_copy_pass); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_reduce_copy); + DRW_shgroup_uniform_texture_ref_ex( + grp, "colorBuffer", &fx->dof_reduce_input_color_tx, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex( + grp, "cocBuffer", &fx->dof_reduce_input_coc_tx, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex( + grp, "downsampledBuffer", &fx->dof_downsample_tx, NO_FILTERING); + DRW_shgroup_uniform_float_copy(grp, "scatterColorThreshold", fx->dof_scatter_color_threshold); + DRW_shgroup_uniform_float_copy( + grp, "scatterColorNeighborMax", fx->dof_scatter_neighbor_max_color); + DRW_shgroup_uniform_float_copy(grp, "scatterCocThreshold", fx->dof_scatter_coc_threshold); + DRW_shgroup_uniform_float_copy(grp, "colorNeighborClamping", fx->dof_denoise_factor); + DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropy", fx->dof_bokeh_aniso); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + + void *owner = (void *)&EEVEE_depth_of_field_init; + fx->dof_scatter_src_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R11F_G11F_B10F, owner); + } + + { + DRW_PASS_CREATE(psl->dof_reduce, DRW_STATE_WRITE_COLOR); + + const bool is_copy_pass = false; + GPUShader *sh = EEVEE_shaders_depth_of_field_reduce_get(is_copy_pass); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_reduce); + DRW_shgroup_uniform_texture_ref_ex( + grp, "colorBuffer", &fx->dof_reduce_input_color_tx, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex( + grp, "cocBuffer", &fx->dof_reduce_input_coc_tx, NO_FILTERING); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + } + + if (txl->dof_reduced_color) { + /* TODO(fclem) In the future, we need to check if mip_count did not change. + * For now it's ok as we always define all mip level.*/ + if (res[0] != GPU_texture_width(txl->dof_reduced_color) || + res[1] != GPU_texture_width(txl->dof_reduced_color)) { + DRW_TEXTURE_FREE_SAFE(txl->dof_reduced_color); + DRW_TEXTURE_FREE_SAFE(txl->dof_reduced_coc); + } + } + + if (txl->dof_reduced_color == NULL) { + /* Color needs to be signed format here. See note in shader for explanation. */ + /* Do not use texture pool because of needs mipmaps. */ + txl->dof_reduced_color = GPU_texture_create_2d( + "dof_reduced_color", UNPACK2(res), mip_count, GPU_RGBA16F, NULL); + txl->dof_reduced_coc = GPU_texture_create_2d( + "dof_reduced_coc", UNPACK2(res), mip_count, GPU_R16F, NULL); + + /* TODO(fclem) Remove once we have immutable storage or when mips are generated on creation. */ + GPU_texture_generate_mipmap(txl->dof_reduced_color); + GPU_texture_generate_mipmap(txl->dof_reduced_coc); + } + + GPU_framebuffer_ensure_config(&fbl->dof_reduce_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(txl->dof_reduced_color), + GPU_ATTACHMENT_TEXTURE(txl->dof_reduced_coc), + }); + + GPU_framebuffer_ensure_config(&fbl->dof_reduce_copy_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(txl->dof_reduced_color), + GPU_ATTACHMENT_TEXTURE(txl->dof_reduced_coc), + GPU_ATTACHMENT_TEXTURE(fx->dof_scatter_src_tx), + }); +} + +/** + * Do the gather convolution. For each pixels we gather multiple pixels in its neighborhood + * depending on the min & max CoC tiles. + **/ +static void dof_gather_pass_init(EEVEE_FramebufferList *fbl, + EEVEE_PassList *psl, + EEVEE_TextureList *txl, + EEVEE_EffectsInfo *fx) +{ + void *owner = (void *)&EEVEE_depth_of_field_init; + const float *fullres = DRW_viewport_size_get(); + int res[2] = {divide_ceil_u(fullres[0], 2), divide_ceil_u(fullres[1], 2)}; + int input_size[2]; + GPU_texture_get_mipmap_size(txl->dof_reduced_color, 0, input_size); + float uv_correction_fac[2] = {res[0] / (float)input_size[0], res[1] / (float)input_size[1]}; + float output_texel_size[2] = {1.0f / res[0], 1.0f / res[1]}; + const bool use_bokeh_tx = (fx->dof_bokeh_gather_lut_tx != NULL); + + { + DRW_PASS_CREATE(psl->dof_gather_fg_holefill, DRW_STATE_WRITE_COLOR); + + GPUShader *sh = EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_HOLEFILL, false); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_gather_fg_holefill); + DRW_shgroup_uniform_texture_ref_ex( + grp, "colorBufferBilinear", &txl->dof_reduced_color, WITH_FILTERING); + DRW_shgroup_uniform_texture_ref_ex(grp, "colorBuffer", &txl->dof_reduced_color, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex(grp, "cocBuffer", &txl->dof_reduced_coc, NO_FILTERING); + DRW_shgroup_uniform_texture_ref(grp, "cocTilesFgBuffer", &fx->dof_coc_dilated_tiles_fg_tx); + DRW_shgroup_uniform_texture_ref(grp, "cocTilesBgBuffer", &fx->dof_coc_dilated_tiles_bg_tx); + DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex()); + DRW_shgroup_uniform_vec2_copy(grp, "gatherInputUvCorrection", uv_correction_fac); + DRW_shgroup_uniform_vec2_copy(grp, "gatherOutputTexelSize", output_texel_size); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + + /* Reuse textures from the setup pass. */ + /* NOTE: We could use the texture pool do that for us but it does not track usage and it might + * backfire (it does in practice). */ + fx->dof_fg_holefill_color_tx = fx->dof_half_res_color_tx; + fx->dof_fg_holefill_weight_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R16F, owner); + + GPU_framebuffer_ensure_config(&fbl->dof_gather_fg_holefill_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_fg_holefill_color_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_fg_holefill_weight_tx), + }); + } + { + DRW_PASS_CREATE(psl->dof_gather_fg, DRW_STATE_WRITE_COLOR); + + GPUShader *sh = EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_FOREGROUND, use_bokeh_tx); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_gather_fg); + DRW_shgroup_uniform_texture_ref_ex( + grp, "colorBufferBilinear", &txl->dof_reduced_color, WITH_FILTERING); + DRW_shgroup_uniform_texture_ref_ex(grp, "colorBuffer", &txl->dof_reduced_color, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex(grp, "cocBuffer", &txl->dof_reduced_coc, NO_FILTERING); + DRW_shgroup_uniform_texture_ref(grp, "cocTilesFgBuffer", &fx->dof_coc_dilated_tiles_fg_tx); + DRW_shgroup_uniform_texture_ref(grp, "cocTilesBgBuffer", &fx->dof_coc_dilated_tiles_bg_tx); + DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex()); + DRW_shgroup_uniform_vec2_copy(grp, "gatherInputUvCorrection", uv_correction_fac); + DRW_shgroup_uniform_vec2_copy(grp, "gatherOutputTexelSize", output_texel_size); + if (use_bokeh_tx) { + /* Negate to flip bokeh shape. Mimics optical phenomenon. */ + negate_v2(fx->dof_bokeh_aniso); + DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropy", fx->dof_bokeh_aniso); + DRW_shgroup_uniform_texture_ref(grp, "bokehLut", &fx->dof_bokeh_gather_lut_tx); + /* Restore. */ + negate_v2(fx->dof_bokeh_aniso); + } + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + + fx->dof_fg_color_tx = DRW_texture_pool_query_2d(UNPACK2(res), COLOR_FORMAT, owner); + fx->dof_fg_weight_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R16F, owner); + /* Reuse textures from the setup pass. */ + /* NOTE: We could use the texture pool do that for us but it does not track usage and it might + * backfire (it does in practice). */ + fx->dof_fg_occlusion_tx = fx->dof_half_res_coc_tx; + + /* NOTE: First target is holefill texture so we can use the median filter on it. + * See the filter function. */ + GPU_framebuffer_ensure_config(&fbl->dof_gather_fg_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_fg_holefill_color_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_fg_holefill_weight_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_fg_occlusion_tx), + }); + } + { + DRW_PASS_CREATE(psl->dof_gather_bg, DRW_STATE_WRITE_COLOR); + + GPUShader *sh = EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_BACKGROUND, use_bokeh_tx); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_gather_bg); + DRW_shgroup_uniform_texture_ref_ex( + grp, "colorBufferBilinear", &txl->dof_reduced_color, WITH_FILTERING); + DRW_shgroup_uniform_texture_ref_ex(grp, "colorBuffer", &txl->dof_reduced_color, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex(grp, "cocBuffer", &txl->dof_reduced_coc, NO_FILTERING); + DRW_shgroup_uniform_texture_ref(grp, "cocTilesFgBuffer", &fx->dof_coc_dilated_tiles_fg_tx); + DRW_shgroup_uniform_texture_ref(grp, "cocTilesBgBuffer", &fx->dof_coc_dilated_tiles_bg_tx); + DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex()); + DRW_shgroup_uniform_vec2_copy(grp, "gatherInputUvCorrection", uv_correction_fac); + DRW_shgroup_uniform_vec2_copy(grp, "gatherOutputTexelSize", output_texel_size); + if (use_bokeh_tx) { + DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropy", fx->dof_bokeh_aniso); + DRW_shgroup_uniform_texture_ref(grp, "bokehLut", &fx->dof_bokeh_gather_lut_tx); + } + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + + fx->dof_bg_color_tx = DRW_texture_pool_query_2d(UNPACK2(res), COLOR_FORMAT, owner); + fx->dof_bg_weight_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R16F, owner); + /* Reuse, since only used for scatter. Foreground is processed before background. */ + fx->dof_bg_occlusion_tx = fx->dof_fg_occlusion_tx; + + /* NOTE: First target is holefill texture so we can use the median filter on it. + * See the filter function. */ + GPU_framebuffer_ensure_config(&fbl->dof_gather_bg_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_fg_holefill_color_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_fg_holefill_weight_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_bg_occlusion_tx), + }); + } +} + +/** + * Filter an input buffer using a median filter to reduce noise. + * NOTE: We use the holefill texture as our input to reduce memory usage. + * Thus, the holefill pass cannot be filtered. + **/ +static void dof_filter_pass_init(EEVEE_FramebufferList *fbl, + EEVEE_PassList *psl, + EEVEE_EffectsInfo *fx) +{ + DRW_PASS_CREATE(psl->dof_filter, DRW_STATE_WRITE_COLOR); + + GPUShader *sh = EEVEE_shaders_depth_of_field_filter_get(); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_filter); + DRW_shgroup_uniform_texture_ref_ex( + grp, "colorBuffer", &fx->dof_fg_holefill_color_tx, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex( + grp, "weightBuffer", &fx->dof_fg_holefill_weight_tx, NO_FILTERING); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + + GPU_framebuffer_ensure_config(&fbl->dof_filter_fg_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_fg_color_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_fg_weight_tx), + }); + + GPU_framebuffer_ensure_config(&fbl->dof_filter_bg_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_bg_color_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_bg_weight_tx), + }); +} + +/** + * Do the Scatter convolution. A sprite is emitted for every 4 pixels but is only expanded if the + * pixels are bright enough to be scattered. + **/ +static void dof_scatter_pass_init(EEVEE_FramebufferList *fbl, + EEVEE_PassList *psl, + EEVEE_TextureList *txl, + EEVEE_EffectsInfo *fx) +{ + int input_size[2], target_size[2]; + GPU_texture_get_mipmap_size(fx->dof_half_res_color_tx, 0, input_size); + GPU_texture_get_mipmap_size(fx->dof_bg_color_tx, 0, target_size); + /* Draw a sprite for every four halfres pixels. */ + int sprite_count = (input_size[0] / 2) * (input_size[1] / 2); + float target_texel_size[2] = {1.0f / target_size[0], 1.0f / target_size[1]}; + const bool use_bokeh_tx = (fx->dof_bokeh_gather_lut_tx != NULL); + + { + DRW_PASS_CREATE(psl->dof_scatter_fg, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD_FULL); + + const bool is_foreground = true; + GPUShader *sh = EEVEE_shaders_depth_of_field_scatter_get(is_foreground, use_bokeh_tx); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_scatter_fg); + DRW_shgroup_uniform_texture_ref_ex(grp, "colorBuffer", &fx->dof_scatter_src_tx, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex(grp, "cocBuffer", &txl->dof_reduced_coc, NO_FILTERING); + DRW_shgroup_uniform_texture_ref(grp, "occlusionBuffer", &fx->dof_fg_occlusion_tx); + DRW_shgroup_uniform_vec2_copy(grp, "targetTexelSize", target_texel_size); + DRW_shgroup_uniform_int_copy(grp, "spritePerRow", input_size[0] / 2); + DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropy", fx->dof_bokeh_aniso); + if (use_bokeh_tx) { + /* Negate to flip bokeh shape. Mimics optical phenomenon. */ + negate_v2(fx->dof_bokeh_aniso_inv); + DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropyInv", fx->dof_bokeh_aniso_inv); + DRW_shgroup_uniform_texture_ref(grp, "bokehLut", &fx->dof_bokeh_scatter_lut_tx); + /* Restore. */ + negate_v2(fx->dof_bokeh_aniso_inv); + } + DRW_shgroup_call_procedural_triangles(grp, NULL, sprite_count); + + GPU_framebuffer_ensure_config(&fbl->dof_scatter_fg_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_fg_color_tx), + }); + } + { + DRW_PASS_CREATE(psl->dof_scatter_bg, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD_FULL); + + const bool is_foreground = false; + GPUShader *sh = EEVEE_shaders_depth_of_field_scatter_get(is_foreground, use_bokeh_tx); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_scatter_bg); + DRW_shgroup_uniform_texture_ref_ex(grp, "colorBuffer", &fx->dof_scatter_src_tx, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex(grp, "cocBuffer", &txl->dof_reduced_coc, NO_FILTERING); + DRW_shgroup_uniform_texture_ref(grp, "occlusionBuffer", &fx->dof_bg_occlusion_tx); + DRW_shgroup_uniform_vec2_copy(grp, "targetTexelSize", target_texel_size); + DRW_shgroup_uniform_int_copy(grp, "spritePerRow", input_size[0] / 2); + DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropy", fx->dof_bokeh_aniso); + if (use_bokeh_tx) { + DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropyInv", fx->dof_bokeh_aniso_inv); + DRW_shgroup_uniform_texture_ref(grp, "bokehLut", &fx->dof_bokeh_scatter_lut_tx); + } + DRW_shgroup_call_procedural_triangles(grp, NULL, sprite_count); + + GPU_framebuffer_ensure_config(&fbl->dof_scatter_bg_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_bg_color_tx), + }); + } +} + +/** + * Recombine the result of the foreground and background processing. Also perform a slight out of + * focus blur to improve geometric continuity. + **/ +static void dof_recombine_pass_init(EEVEE_FramebufferList *UNUSED(fbl), + EEVEE_PassList *psl, + EEVEE_EffectsInfo *fx) +{ + DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); + const bool use_bokeh_tx = (fx->dof_bokeh_gather_lut_tx != NULL); + + DRW_PASS_CREATE(psl->dof_resolve, DRW_STATE_WRITE_COLOR); + + GPUShader *sh = EEVEE_shaders_depth_of_field_resolve_get(use_bokeh_tx, fx->dof_hq_slight_focus); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_resolve); + DRW_shgroup_uniform_texture_ref_ex(grp, "fullResColorBuffer", &fx->source_buffer, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex(grp, "fullResDepthBuffer", &dtxl->depth, NO_FILTERING); + DRW_shgroup_uniform_texture_ref(grp, "bgColorBuffer", &fx->dof_bg_color_tx); + DRW_shgroup_uniform_texture_ref(grp, "bgWeightBuffer", &fx->dof_bg_weight_tx); + DRW_shgroup_uniform_texture_ref(grp, "bgTileBuffer", &fx->dof_coc_dilated_tiles_bg_tx); + DRW_shgroup_uniform_texture_ref(grp, "fgColorBuffer", &fx->dof_fg_color_tx); + DRW_shgroup_uniform_texture_ref(grp, "fgWeightBuffer", &fx->dof_fg_weight_tx); + DRW_shgroup_uniform_texture_ref(grp, "holefillColorBuffer", &fx->dof_fg_holefill_color_tx); + DRW_shgroup_uniform_texture_ref(grp, "holefillWeightBuffer", &fx->dof_fg_holefill_weight_tx); + DRW_shgroup_uniform_texture_ref(grp, "fgTileBuffer", &fx->dof_coc_dilated_tiles_fg_tx); + DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex()); + DRW_shgroup_uniform_vec4_copy(grp, "cocParams", fx->dof_coc_params); + DRW_shgroup_uniform_float_copy(grp, "bokehMaxSize", fx->dof_bokeh_max_size); + if (use_bokeh_tx) { + DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropyInv", fx->dof_bokeh_aniso_inv); + DRW_shgroup_uniform_texture_ref(grp, "bokehLut", &fx->dof_bokeh_resolve_lut_tx); + } + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); +} + +void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) +{ + EEVEE_TextureList *txl = vedata->txl; + EEVEE_FramebufferList *fbl = vedata->fbl; + EEVEE_PassList *psl = vedata->psl; + EEVEE_StorageList *stl = vedata->stl; + EEVEE_EffectsInfo *fx = stl->effects; + + if ((fx->enabled_effects & EFFECT_DOF) != 0) { + /* GPU_RGBA16F is sufficient now that all scattered bokeh are premultiplied. + * GPU_R11F_G11F_B10F is not enough when lots of scattered sprites are big and offers + * relatively small benefits. */ + fx->dof_color_format = GPU_RGBA16F; + + dof_bokeh_pass_init(fbl, psl, fx); + dof_setup_pass_init(fbl, psl, fx); + dof_flatten_tiles_pass_init(fbl, psl, fx); + dof_dilate_tiles_pass_init(fbl, psl, fx); + dof_reduce_pass_init(fbl, psl, txl, fx); + dof_gather_pass_init(fbl, psl, txl, fx); + dof_filter_pass_init(fbl, psl, fx); + dof_scatter_pass_init(fbl, psl, txl, fx); + dof_recombine_pass_init(fbl, psl, fx); + } +} + +static void dof_recursive_reduce(void *vedata, int UNUSED(level)) +{ + EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl; + EEVEE_TextureList *txl = ((EEVEE_Data *)vedata)->txl; + EEVEE_EffectsInfo *fx = ((EEVEE_Data *)vedata)->stl->effects; + + fx->dof_reduce_input_color_tx = txl->dof_reduced_color; + fx->dof_reduce_input_coc_tx = txl->dof_reduced_coc; + + DRW_draw_pass(psl->dof_reduce); } void EEVEE_depth_of_field_draw(EEVEE_Data *vedata) @@ -214,24 +969,77 @@ void EEVEE_depth_of_field_draw(EEVEE_Data *vedata) EEVEE_TextureList *txl = vedata->txl; EEVEE_FramebufferList *fbl = vedata->fbl; EEVEE_StorageList *stl = vedata->stl; - EEVEE_EffectsInfo *effects = stl->effects; + EEVEE_EffectsInfo *effects = stl->effects; /* TODO(fclem): Because of silly SWAP_BUFFERS. */ + EEVEE_EffectsInfo *fx = effects; /* Depth Of Field */ if ((effects->enabled_effects & EFFECT_DOF) != 0) { - const float clear_col[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + DRW_stats_group_start("Depth of Field"); - /* Downsample */ - GPU_framebuffer_bind(fbl->dof_down_fb); - DRW_draw_pass(psl->dof_down); + if (fx->dof_bokeh_gather_lut_tx != NULL) { + GPU_framebuffer_bind(fbl->dof_bokeh_fb); + DRW_draw_pass(psl->dof_bokeh); + } - /* Scatter */ - GPU_framebuffer_bind(fbl->dof_scatter_fb); - GPU_framebuffer_clear_color(fbl->dof_scatter_fb, clear_col); - DRW_draw_pass(psl->dof_scatter); + GPU_framebuffer_bind(fbl->dof_setup_fb); + DRW_draw_pass(psl->dof_setup); - /* Resolve */ - GPU_framebuffer_bind(effects->target_buffer); + GPU_framebuffer_bind(fbl->dof_flatten_tiles_fb); + DRW_draw_pass(psl->dof_flatten_tiles); + + dof_dilate_tiles_pass_draw(fbl, psl, fx); + + fx->dof_reduce_input_color_tx = fx->dof_half_res_color_tx; + fx->dof_reduce_input_coc_tx = fx->dof_half_res_coc_tx; + + /* First step is just a copy. */ + GPU_framebuffer_bind(fbl->dof_downsample_fb); + DRW_draw_pass(psl->dof_downsample); + + /* First step is just a copy. */ + GPU_framebuffer_bind(fbl->dof_reduce_copy_fb); + DRW_draw_pass(psl->dof_reduce_copy); + + GPU_framebuffer_recursive_downsample( + fbl->dof_reduce_fb, fx->dof_reduce_steps, &dof_recursive_reduce, vedata); + + { + /* Foreground convolution. */ + GPU_framebuffer_bind(fbl->dof_gather_fg_fb); + DRW_draw_pass(psl->dof_gather_fg); + + GPU_framebuffer_bind(fbl->dof_filter_fg_fb); + DRW_draw_pass(psl->dof_filter); + + GPU_framebuffer_bind(fbl->dof_scatter_fg_fb); + DRW_draw_pass(psl->dof_scatter_fg); + } + + { + /* Background convolution. */ + GPU_framebuffer_bind(fbl->dof_gather_bg_fb); + DRW_draw_pass(psl->dof_gather_bg); + + GPU_framebuffer_bind(fbl->dof_filter_bg_fb); + DRW_draw_pass(psl->dof_filter); + + GPU_framebuffer_bind(fbl->dof_scatter_bg_fb); + DRW_draw_pass(psl->dof_scatter_bg); + } + + { + /* Hole-fill convolution. */ + GPU_framebuffer_bind(fbl->dof_gather_fg_holefill_fb); + DRW_draw_pass(psl->dof_gather_fg_holefill); + + /* NOTE: do not filter the hole-fill pass as we use it as out filter input buffer. */ + } + + GPU_framebuffer_bind(fx->target_buffer); DRW_draw_pass(psl->dof_resolve); + SWAP_BUFFERS(); + + DRW_stats_group_end(); } } diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c index 698b959f1a9..18d3e453c5d 100644 --- a/source/blender/draw/engines/eevee/eevee_effects.c +++ b/source/blender/draw/engines/eevee/eevee_effects.c @@ -102,11 +102,9 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, effects->enabled_effects |= EEVEE_occlusion_init(sldata, vedata); effects->enabled_effects |= EEVEE_screen_raytrace_init(sldata, vedata); - if ((effects->enabled_effects & EFFECT_TAA) && effects->taa_current_sample > 1) { - /* Update matrices here because EEVEE_screen_raytrace_init can have reset the - * taa_current_sample. (See T66811) */ - EEVEE_temporal_sampling_update_matrices(vedata); - } + /* Update matrices here because EEVEE_screen_raytrace_init can have reset the + * taa_current_sample. (See T66811) */ + EEVEE_temporal_sampling_update_matrices(vedata); EEVEE_volumes_init(sldata, vedata); EEVEE_subsurface_init(sldata, vedata); @@ -519,7 +517,7 @@ void EEVEE_draw_effects(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) DRW_viewport_request_redraw(); } - /* Record pers matrix for the next frame. */ + /* Record perspective matrix for the next frame. */ DRW_view_persmat_get(effects->taa_view, effects->prev_persmat, false); /* Update double buffer status if render mode. */ diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c index 802b47b61a4..582bfad323b 100644 --- a/source/blender/draw/engines/eevee/eevee_engine.c +++ b/source/blender/draw/engines/eevee/eevee_engine.c @@ -66,6 +66,7 @@ static void eevee_engine_init(void *ved) stl->g_data->valid_double_buffer = (txl->color_double_buffer != NULL); stl->g_data->valid_taa_history = (txl->taa_history != NULL); stl->g_data->queued_shaders_count = 0; + stl->g_data->render_timesteps = 1; /* Main Buffer */ DRW_texture_ensure_fullscreen_2d(&txl->color, GPU_RGBA16F, DRW_TEX_FILTER | DRW_TEX_MIPMAP); @@ -456,13 +457,17 @@ static void eevee_render_to_image(void *vedata, } EEVEE_PrivateData *g_data = ved->stl->g_data; - EEVEE_render_modules_init(vedata, engine, depsgraph); - int initial_frame = CFRA; float initial_subframe = SUBFRA; float shuttertime = (do_motion_blur) ? scene->eevee.motion_blur_shutter : 0.0f; int time_steps_tot = (do_motion_blur) ? max_ii(1, scene->eevee.motion_blur_steps) : 1; - g_data->render_tot_samples = divide_ceil_u(scene->eevee.taa_render_samples, time_steps_tot); + g_data->render_timesteps = time_steps_tot; + + EEVEE_render_modules_init(vedata, engine, depsgraph); + + g_data->render_sample_count_per_timestep = EEVEE_temporal_sampling_sample_count_get(scene, + ved->stl); + /* Compute start time. The motion blur will cover `[time ...time + shuttertime]`. */ float time = initial_frame + initial_subframe; switch (scene->eevee.motion_blur_position) { @@ -553,7 +558,8 @@ static void eevee_render_to_image(void *vedata, /* Actual drawing. */ { - EEVEE_renderpasses_output_init(sldata, vedata, g_data->render_tot_samples * time_steps_tot); + EEVEE_renderpasses_output_init( + sldata, vedata, g_data->render_sample_count_per_timestep * time_steps_tot); EEVEE_temporal_sampling_create_view(vedata); EEVEE_render_draw(vedata, engine, render_layer, rect); diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c b/source/blender/draw/engines/eevee/eevee_lightcache.c index c4973dc2e8b..145fddf62a0 100644 --- a/source/blender/draw/engines/eevee/eevee_lightcache.c +++ b/source/blender/draw/engines/eevee/eevee_lightcache.c @@ -403,7 +403,7 @@ static bool eevee_lightcache_static_load(LightCache *lcache) if (lcache->grid_tx.tex == NULL) { lcache->grid_tx.tex = GPU_texture_create_2d_array( "lightcache_irradiance", UNPACK3(lcache->grid_tx.tex_size), 1, IRRADIANCE_FORMAT, NULL); - GPU_texture_update(lcache->grid_tx.tex, GPU_DATA_UNSIGNED_BYTE, lcache->grid_tx.data); + GPU_texture_update(lcache->grid_tx.tex, GPU_DATA_UBYTE, lcache->grid_tx.data); if (lcache->grid_tx.tex == NULL) { lcache->flag |= LIGHTCACHE_NOT_USABLE; @@ -470,7 +470,7 @@ bool EEVEE_lightcache_load(LightCache *lcache) static void eevee_lightbake_readback_irradiance(LightCache *lcache) { MEM_SAFE_FREE(lcache->grid_tx.data); - lcache->grid_tx.data = GPU_texture_read(lcache->grid_tx.tex, GPU_DATA_UNSIGNED_BYTE, 0); + lcache->grid_tx.data = GPU_texture_read(lcache->grid_tx.tex, GPU_DATA_UBYTE, 0); lcache->grid_tx.data_type = LIGHTCACHETEX_BYTE; lcache->grid_tx.components = 4; } @@ -914,6 +914,7 @@ static void eevee_lightbake_cache_create(EEVEE_Data *vedata, EEVEE_LightBake *lb stl->g_data = MEM_callocN(sizeof(*stl->g_data), __func__); stl->g_data->background_alpha = 1.0f; + stl->g_data->render_timesteps = 1; /* XXX TODO remove this. This is in order to make the init functions work. */ if (DRW_view_default_get() == NULL) { diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c index 395d4dc790d..7688039d0a8 100644 --- a/source/blender/draw/engines/eevee/eevee_lightprobes.c +++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c @@ -1040,8 +1040,10 @@ void EEVEE_lightbake_filter_glossy(EEVEE_ViewLayerData *sldata, pinfo->padding_size *= pinfo->texel_size; pinfo->layer = probe_idx * 6; pinfo->roughness = i / (float)maxlevel; - pinfo->roughness *= pinfo->roughness; /* Disney Roughness */ - pinfo->roughness *= pinfo->roughness; /* Distribute Roughness across lod more evenly. */ + /* Disney Roughness */ + pinfo->roughness = square_f(pinfo->roughness); + /* Distribute Roughness across lod more evenly */ + pinfo->roughness = square_f(square_f(pinfo->roughness)); CLAMP(pinfo->roughness, 1e-8f, 0.99999f); /* Avoid artifacts */ #if 1 /* Variable Sample count and bias (fast) */ diff --git a/source/blender/draw/engines/eevee/eevee_lut.c b/source/blender/draw/engines/eevee/eevee_lut.c index b380269db99..27ce66ebec7 100644 --- a/source/blender/draw/engines/eevee/eevee_lut.c +++ b/source/blender/draw/engines/eevee/eevee_lut.c @@ -2988,1033 +2988,6 @@ const float ltc_mag_ggx[64 * 64 * 2] = { 0.932164, 0.047190, }; -const float bsdf_split_sum_ggx[64 * 64 * 2] = { - 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, - 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, - 0.999512f, 0.000000f, 0.999023f, 0.000001f, 0.999023f, 0.000001f, 0.998535f, 0.000001f, - 0.998047f, 0.000001f, 0.997559f, 0.000002f, 0.997070f, 0.000003f, 0.996094f, 0.000004f, - 0.994629f, 0.000004f, 0.993652f, 0.000006f, 0.991699f, 0.000007f, 0.989746f, 0.000008f, - 0.987305f, 0.000010f, 0.984375f, 0.000012f, 0.980957f, 0.000013f, 0.977539f, 0.000016f, - 0.973145f, 0.000018f, 0.967773f, 0.000020f, 0.961914f, 0.000023f, 0.955566f, 0.000025f, - 0.947754f, 0.000028f, 0.939941f, 0.000031f, 0.930664f, 0.000033f, 0.920410f, 0.000036f, - 0.909180f, 0.000039f, 0.896973f, 0.000042f, 0.884277f, 0.000044f, 0.870117f, 0.000047f, - 0.854980f, 0.000049f, 0.838867f, 0.000051f, 0.821777f, 0.000053f, 0.803711f, 0.000055f, - 0.785156f, 0.000057f, 0.765625f, 0.000058f, 0.745605f, 0.000059f, 0.724609f, 0.000060f, - 0.703613f, 0.000061f, 0.681641f, 0.000061f, 0.659668f, 0.000061f, 0.637695f, 0.000061f, - 0.615234f, 0.000061f, 0.592773f, 0.000060f, 0.570801f, 0.000060f, 0.548340f, 0.000059f, - 0.526855f, 0.000058f, 0.504883f, 0.000057f, 0.483887f, 0.000055f, 0.462891f, 0.000054f, - 0.442627f, 0.000053f, 0.422607f, 0.000051f, 0.403320f, 0.000050f, 0.384766f, 0.000048f, - 0.366455f, 0.000046f, 0.348877f, 0.000045f, 0.332031f, 0.000043f, 0.315918f, 0.000041f, - 0.999512f, 0.000000f, 0.999512f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.999512f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, - 0.999512f, 0.000000f, 0.999023f, 0.000001f, 0.999023f, 0.000001f, 0.998535f, 0.000002f, - 0.998047f, 0.000003f, 0.997559f, 0.000004f, 0.997070f, 0.000005f, 0.996094f, 0.000006f, - 0.994629f, 0.000008f, 0.993164f, 0.000010f, 0.991699f, 0.000012f, 0.989746f, 0.000015f, - 0.987305f, 0.000018f, 0.984375f, 0.000020f, 0.980957f, 0.000024f, 0.977051f, 0.000027f, - 0.972168f, 0.000031f, 0.967285f, 0.000035f, 0.961426f, 0.000039f, 0.954590f, 0.000043f, - 0.947266f, 0.000048f, 0.938965f, 0.000052f, 0.929199f, 0.000057f, 0.919434f, 0.000061f, - 0.908203f, 0.000065f, 0.895996f, 0.000069f, 0.882812f, 0.000073f, 0.868652f, 0.000077f, - 0.853027f, 0.000080f, 0.837402f, 0.000083f, 0.820312f, 0.000086f, 0.802246f, 0.000088f, - 0.783691f, 0.000090f, 0.764160f, 0.000092f, 0.744141f, 0.000093f, 0.723633f, 0.000093f, - 0.702637f, 0.000094f, 0.681152f, 0.000094f, 0.659180f, 0.000093f, 0.637207f, 0.000093f, - 0.615234f, 0.000091f, 0.593262f, 0.000090f, 0.571289f, 0.000088f, 0.549316f, 0.000087f, - 0.527344f, 0.000085f, 0.505859f, 0.000082f, 0.485107f, 0.000080f, 0.464355f, 0.000078f, - 0.444336f, 0.000075f, 0.424561f, 0.000072f, 0.405273f, 0.000070f, 0.386719f, 0.000067f, - 0.368652f, 0.000065f, 0.351318f, 0.000062f, 0.334473f, 0.000059f, 0.318115f, 0.000057f, - 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 1.000000f, 0.000000f, - 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000001f, 0.999512f, 0.000001f, - 0.999512f, 0.000001f, 0.999512f, 0.000003f, 0.999023f, 0.000002f, 0.998535f, 0.000004f, - 0.998047f, 0.000005f, 0.997559f, 0.000007f, 0.997070f, 0.000009f, 0.996094f, 0.000011f, - 0.994629f, 0.000013f, 0.993164f, 0.000017f, 0.991211f, 0.000020f, 0.989258f, 0.000024f, - 0.986816f, 0.000028f, 0.983887f, 0.000033f, 0.980469f, 0.000038f, 0.976562f, 0.000043f, - 0.971680f, 0.000049f, 0.966797f, 0.000055f, 0.960449f, 0.000062f, 0.953613f, 0.000068f, - 0.946289f, 0.000075f, 0.937500f, 0.000081f, 0.928223f, 0.000088f, 0.917969f, 0.000094f, - 0.906738f, 0.000100f, 0.894531f, 0.000106f, 0.880859f, 0.000111f, 0.866699f, 0.000116f, - 0.851562f, 0.000120f, 0.835449f, 0.000124f, 0.818359f, 0.000127f, 0.800781f, 0.000130f, - 0.782227f, 0.000132f, 0.762695f, 0.000134f, 0.742676f, 0.000134f, 0.722656f, 0.000135f, - 0.701660f, 0.000134f, 0.680176f, 0.000133f, 0.658691f, 0.000132f, 0.636719f, 0.000130f, - 0.615234f, 0.000128f, 0.593262f, 0.000125f, 0.571289f, 0.000123f, 0.549805f, 0.000119f, - 0.528320f, 0.000116f, 0.507324f, 0.000112f, 0.486328f, 0.000109f, 0.466064f, 0.000105f, - 0.446045f, 0.000101f, 0.426514f, 0.000097f, 0.407471f, 0.000093f, 0.388916f, 0.000089f, - 0.370850f, 0.000085f, 0.353516f, 0.000082f, 0.336914f, 0.000078f, 0.320557f, 0.000074f, - 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, - 1.000000f, 0.000000f, 1.000000f, 0.000001f, 0.999512f, 0.000001f, 0.999512f, 0.000002f, - 0.999512f, 0.000002f, 0.999023f, 0.000003f, 0.999023f, 0.000005f, 0.998535f, 0.000006f, - 0.998535f, 0.000008f, 0.997559f, 0.000011f, 0.997070f, 0.000014f, 0.996094f, 0.000017f, - 0.994629f, 0.000020f, 0.993164f, 0.000026f, 0.991211f, 0.000030f, 0.989258f, 0.000036f, - 0.986816f, 0.000043f, 0.983398f, 0.000050f, 0.979980f, 0.000058f, 0.976074f, 0.000066f, - 0.971191f, 0.000074f, 0.965820f, 0.000082f, 0.959961f, 0.000093f, 0.952637f, 0.000101f, - 0.945312f, 0.000111f, 0.936523f, 0.000120f, 0.927246f, 0.000129f, 0.916504f, 0.000137f, - 0.905273f, 0.000145f, 0.892578f, 0.000153f, 0.879395f, 0.000160f, 0.865234f, 0.000166f, - 0.850098f, 0.000171f, 0.833984f, 0.000176f, 0.816895f, 0.000179f, 0.799316f, 0.000182f, - 0.780762f, 0.000184f, 0.761230f, 0.000185f, 0.741699f, 0.000185f, 0.721191f, 0.000184f, - 0.700684f, 0.000183f, 0.679688f, 0.000181f, 0.658203f, 0.000178f, 0.636719f, 0.000175f, - 0.615234f, 0.000171f, 0.593262f, 0.000167f, 0.571777f, 0.000162f, 0.550293f, 0.000158f, - 0.529297f, 0.000152f, 0.508301f, 0.000147f, 0.487793f, 0.000142f, 0.467529f, 0.000136f, - 0.447754f, 0.000131f, 0.428223f, 0.000125f, 0.409424f, 0.000120f, 0.391113f, 0.000115f, - 0.373291f, 0.000109f, 0.355957f, 0.000104f, 0.339355f, 0.000099f, 0.323242f, 0.000094f, - 0.999512f, 0.000002f, 0.999512f, 0.000002f, 1.000000f, 0.000002f, 0.999512f, 0.000002f, - 1.000000f, 0.000002f, 0.999512f, 0.000002f, 0.999512f, 0.000002f, 0.999512f, 0.000003f, - 0.999512f, 0.000004f, 0.999512f, 0.000005f, 0.999023f, 0.000007f, 0.998535f, 0.000010f, - 0.998047f, 0.000012f, 0.997559f, 0.000017f, 0.996582f, 0.000020f, 0.995605f, 0.000025f, - 0.994629f, 0.000032f, 0.993164f, 0.000038f, 0.991211f, 0.000047f, 0.988770f, 0.000055f, - 0.986328f, 0.000063f, 0.983398f, 0.000074f, 0.979492f, 0.000085f, 0.975586f, 0.000095f, - 0.970703f, 0.000108f, 0.965332f, 0.000121f, 0.958984f, 0.000132f, 0.952148f, 0.000145f, - 0.944336f, 0.000157f, 0.935547f, 0.000170f, 0.925781f, 0.000181f, 0.915039f, 0.000192f, - 0.903809f, 0.000203f, 0.891113f, 0.000212f, 0.877930f, 0.000220f, 0.863281f, 0.000227f, - 0.848145f, 0.000234f, 0.832031f, 0.000239f, 0.814941f, 0.000242f, 0.797363f, 0.000245f, - 0.778809f, 0.000247f, 0.759766f, 0.000247f, 0.740234f, 0.000246f, 0.720215f, 0.000244f, - 0.699707f, 0.000241f, 0.678711f, 0.000237f, 0.657715f, 0.000233f, 0.636230f, 0.000228f, - 0.614746f, 0.000222f, 0.593750f, 0.000216f, 0.572266f, 0.000209f, 0.551270f, 0.000202f, - 0.530273f, 0.000195f, 0.509277f, 0.000187f, 0.489014f, 0.000180f, 0.468994f, 0.000172f, - 0.449463f, 0.000165f, 0.430176f, 0.000157f, 0.411377f, 0.000150f, 0.393311f, 0.000143f, - 0.375488f, 0.000136f, 0.358398f, 0.000129f, 0.341797f, 0.000123f, 0.325684f, 0.000116f, - 0.999512f, 0.000005f, 0.999512f, 0.000005f, 0.999512f, 0.000005f, 0.999512f, 0.000005f, - 0.999512f, 0.000005f, 0.999512f, 0.000005f, 0.999512f, 0.000006f, 0.999512f, 0.000007f, - 0.999512f, 0.000008f, 0.999512f, 0.000011f, 0.999023f, 0.000013f, 0.998535f, 0.000015f, - 0.998047f, 0.000019f, 0.997559f, 0.000026f, 0.996582f, 0.000033f, 0.995605f, 0.000040f, - 0.994141f, 0.000047f, 0.993164f, 0.000058f, 0.991211f, 0.000069f, 0.988770f, 0.000080f, - 0.985840f, 0.000093f, 0.982910f, 0.000106f, 0.979004f, 0.000121f, 0.975098f, 0.000137f, - 0.970215f, 0.000153f, 0.964355f, 0.000169f, 0.958008f, 0.000186f, 0.951172f, 0.000201f, - 0.943359f, 0.000218f, 0.934082f, 0.000233f, 0.924316f, 0.000248f, 0.914062f, 0.000262f, - 0.902344f, 0.000275f, 0.889648f, 0.000286f, 0.875977f, 0.000295f, 0.861816f, 0.000304f, - 0.846680f, 0.000311f, 0.830566f, 0.000316f, 0.813477f, 0.000319f, 0.795898f, 0.000321f, - 0.777344f, 0.000322f, 0.758301f, 0.000320f, 0.739258f, 0.000318f, 0.719238f, 0.000314f, - 0.698730f, 0.000309f, 0.678223f, 0.000303f, 0.657227f, 0.000296f, 0.636230f, 0.000288f, - 0.614746f, 0.000280f, 0.593750f, 0.000271f, 0.572754f, 0.000262f, 0.551758f, 0.000252f, - 0.531250f, 0.000243f, 0.510742f, 0.000233f, 0.490479f, 0.000223f, 0.470703f, 0.000213f, - 0.451172f, 0.000203f, 0.432129f, 0.000194f, 0.413574f, 0.000184f, 0.395508f, 0.000175f, - 0.377930f, 0.000166f, 0.360840f, 0.000157f, 0.344238f, 0.000149f, 0.328125f, 0.000141f, - 0.999512f, 0.000011f, 0.999512f, 0.000011f, 0.999512f, 0.000011f, 0.999512f, 0.000011f, - 0.999512f, 0.000011f, 0.999512f, 0.000012f, 0.999512f, 0.000014f, 0.999512f, 0.000015f, - 0.999512f, 0.000017f, 0.999023f, 0.000020f, 0.998535f, 0.000022f, 0.998535f, 0.000028f, - 0.998047f, 0.000034f, 0.997559f, 0.000042f, 0.996582f, 0.000050f, 0.995605f, 0.000060f, - 0.994141f, 0.000072f, 0.992676f, 0.000084f, 0.990723f, 0.000099f, 0.988281f, 0.000115f, - 0.985840f, 0.000133f, 0.982422f, 0.000150f, 0.978516f, 0.000171f, 0.974609f, 0.000191f, - 0.969238f, 0.000211f, 0.963867f, 0.000232f, 0.957520f, 0.000253f, 0.950195f, 0.000274f, - 0.941895f, 0.000294f, 0.933105f, 0.000314f, 0.922852f, 0.000332f, 0.912109f, 0.000348f, - 0.900879f, 0.000363f, 0.888184f, 0.000377f, 0.874512f, 0.000387f, 0.859863f, 0.000397f, - 0.844727f, 0.000404f, 0.828613f, 0.000408f, 0.811523f, 0.000411f, 0.793945f, 0.000412f, - 0.775879f, 0.000411f, 0.756836f, 0.000407f, 0.737793f, 0.000403f, 0.717773f, 0.000396f, - 0.697754f, 0.000389f, 0.677246f, 0.000380f, 0.656738f, 0.000370f, 0.635742f, 0.000359f, - 0.614746f, 0.000347f, 0.594238f, 0.000335f, 0.573242f, 0.000323f, 0.552734f, 0.000310f, - 0.532227f, 0.000297f, 0.511719f, 0.000284f, 0.491943f, 0.000272f, 0.472412f, 0.000259f, - 0.453125f, 0.000246f, 0.434082f, 0.000234f, 0.415771f, 0.000222f, 0.397705f, 0.000211f, - 0.380127f, 0.000199f, 0.363281f, 0.000189f, 0.346680f, 0.000178f, 0.330811f, 0.000168f, - 0.999512f, 0.000022f, 0.999512f, 0.000022f, 0.999512f, 0.000022f, 0.999512f, 0.000022f, - 0.999512f, 0.000023f, 0.999512f, 0.000025f, 0.999512f, 0.000024f, 0.999512f, 0.000028f, - 0.999023f, 0.000030f, 0.999023f, 0.000035f, 0.999023f, 0.000040f, 0.998535f, 0.000046f, - 0.998047f, 0.000056f, 0.997559f, 0.000063f, 0.996094f, 0.000077f, 0.995605f, 0.000089f, - 0.994141f, 0.000106f, 0.992188f, 0.000123f, 0.990234f, 0.000143f, 0.987793f, 0.000163f, - 0.985352f, 0.000185f, 0.981934f, 0.000211f, 0.978027f, 0.000236f, 0.973633f, 0.000261f, - 0.968750f, 0.000288f, 0.962891f, 0.000314f, 0.956055f, 0.000341f, 0.949219f, 0.000366f, - 0.940918f, 0.000391f, 0.931641f, 0.000414f, 0.921875f, 0.000436f, 0.910645f, 0.000455f, - 0.898926f, 0.000471f, 0.886230f, 0.000487f, 0.872559f, 0.000499f, 0.858398f, 0.000509f, - 0.842773f, 0.000515f, 0.826660f, 0.000518f, 0.810059f, 0.000520f, 0.792480f, 0.000519f, - 0.774414f, 0.000515f, 0.755371f, 0.000509f, 0.736328f, 0.000501f, 0.716797f, 0.000492f, - 0.696777f, 0.000480f, 0.676758f, 0.000468f, 0.656250f, 0.000454f, 0.635742f, 0.000439f, - 0.615234f, 0.000424f, 0.594238f, 0.000408f, 0.573730f, 0.000392f, 0.553223f, 0.000375f, - 0.533203f, 0.000359f, 0.513184f, 0.000342f, 0.493408f, 0.000326f, 0.474121f, 0.000310f, - 0.455078f, 0.000294f, 0.436279f, 0.000279f, 0.417969f, 0.000264f, 0.400146f, 0.000250f, - 0.382812f, 0.000237f, 0.365723f, 0.000223f, 0.349365f, 0.000211f, 0.333496f, 0.000199f, - 0.999512f, 0.000041f, 0.999512f, 0.000041f, 0.999512f, 0.000041f, 0.999512f, 0.000042f, - 0.999512f, 0.000042f, 0.999512f, 0.000044f, 0.999512f, 0.000046f, 0.999512f, 0.000049f, - 0.999512f, 0.000054f, 0.999512f, 0.000059f, 0.999023f, 0.000065f, 0.998535f, 0.000076f, - 0.998047f, 0.000087f, 0.997070f, 0.000098f, 0.996582f, 0.000117f, 0.995117f, 0.000135f, - 0.993652f, 0.000152f, 0.992188f, 0.000176f, 0.989746f, 0.000201f, 0.987793f, 0.000228f, - 0.984863f, 0.000256f, 0.981445f, 0.000286f, 0.977539f, 0.000318f, 0.973145f, 0.000352f, - 0.967773f, 0.000384f, 0.961914f, 0.000417f, 0.955566f, 0.000451f, 0.947754f, 0.000481f, - 0.939453f, 0.000510f, 0.930176f, 0.000537f, 0.919922f, 0.000563f, 0.909180f, 0.000585f, - 0.897461f, 0.000604f, 0.884766f, 0.000620f, 0.871094f, 0.000632f, 0.856445f, 0.000641f, - 0.841309f, 0.000647f, 0.825195f, 0.000648f, 0.808105f, 0.000648f, 0.790527f, 0.000643f, - 0.772949f, 0.000637f, 0.754395f, 0.000627f, 0.735352f, 0.000615f, 0.715820f, 0.000601f, - 0.695801f, 0.000585f, 0.675781f, 0.000568f, 0.655762f, 0.000550f, 0.635742f, 0.000530f, - 0.615234f, 0.000510f, 0.594727f, 0.000490f, 0.574707f, 0.000469f, 0.554199f, 0.000448f, - 0.534180f, 0.000428f, 0.514648f, 0.000407f, 0.495117f, 0.000387f, 0.475830f, 0.000367f, - 0.456787f, 0.000348f, 0.438232f, 0.000329f, 0.420166f, 0.000311f, 0.402344f, 0.000294f, - 0.385254f, 0.000277f, 0.368408f, 0.000262f, 0.352051f, 0.000246f, 0.336182f, 0.000232f, - 0.999512f, 0.000072f, 0.999512f, 0.000072f, 0.999512f, 0.000072f, 0.999512f, 0.000072f, - 0.999512f, 0.000073f, 0.999512f, 0.000076f, 0.999512f, 0.000078f, 0.999512f, 0.000082f, - 0.999023f, 0.000086f, 0.999023f, 0.000095f, 0.998535f, 0.000102f, 0.998047f, 0.000116f, - 0.998047f, 0.000131f, 0.997070f, 0.000147f, 0.996094f, 0.000167f, 0.995117f, 0.000195f, - 0.993652f, 0.000219f, 0.991699f, 0.000246f, 0.989746f, 0.000278f, 0.987305f, 0.000315f, - 0.984375f, 0.000350f, 0.980957f, 0.000385f, 0.976562f, 0.000427f, 0.972168f, 0.000467f, - 0.967285f, 0.000509f, 0.960938f, 0.000548f, 0.954102f, 0.000587f, 0.946777f, 0.000623f, - 0.937988f, 0.000657f, 0.928711f, 0.000690f, 0.918457f, 0.000718f, 0.907715f, 0.000741f, - 0.895508f, 0.000762f, 0.882812f, 0.000778f, 0.869141f, 0.000791f, 0.854492f, 0.000798f, - 0.839355f, 0.000802f, 0.823242f, 0.000801f, 0.806152f, 0.000796f, 0.789062f, 0.000788f, - 0.770996f, 0.000777f, 0.752930f, 0.000762f, 0.733887f, 0.000745f, 0.714844f, 0.000726f, - 0.695312f, 0.000704f, 0.675293f, 0.000682f, 0.655273f, 0.000658f, 0.635254f, 0.000633f, - 0.615234f, 0.000607f, 0.595215f, 0.000582f, 0.575195f, 0.000556f, 0.555176f, 0.000530f, - 0.535645f, 0.000504f, 0.515625f, 0.000479f, 0.496582f, 0.000455f, 0.477539f, 0.000431f, - 0.458984f, 0.000407f, 0.440430f, 0.000385f, 0.422363f, 0.000363f, 0.404785f, 0.000343f, - 0.387695f, 0.000323f, 0.370850f, 0.000304f, 0.354736f, 0.000286f, 0.338867f, 0.000268f, - 0.999512f, 0.000119f, 0.999512f, 0.000119f, 0.999512f, 0.000119f, 0.999512f, 0.000119f, - 0.999512f, 0.000121f, 0.999512f, 0.000122f, 0.999512f, 0.000128f, 0.999512f, 0.000131f, - 0.999512f, 0.000139f, 0.999023f, 0.000149f, 0.998535f, 0.000161f, 0.998047f, 0.000179f, - 0.998047f, 0.000194f, 0.997070f, 0.000220f, 0.996094f, 0.000247f, 0.994629f, 0.000275f, - 0.993652f, 0.000309f, 0.991699f, 0.000344f, 0.989746f, 0.000385f, 0.986816f, 0.000429f, - 0.983887f, 0.000471f, 0.980469f, 0.000519f, 0.976074f, 0.000565f, 0.971680f, 0.000614f, - 0.966309f, 0.000664f, 0.959961f, 0.000710f, 0.953125f, 0.000754f, 0.945312f, 0.000797f, - 0.936523f, 0.000837f, 0.927246f, 0.000873f, 0.916992f, 0.000902f, 0.905762f, 0.000929f, - 0.893555f, 0.000950f, 0.880859f, 0.000966f, 0.866699f, 0.000977f, 0.852539f, 0.000981f, - 0.836914f, 0.000981f, 0.821289f, 0.000977f, 0.804688f, 0.000968f, 0.787109f, 0.000955f, - 0.769531f, 0.000937f, 0.751465f, 0.000917f, 0.732422f, 0.000894f, 0.713379f, 0.000868f, - 0.694336f, 0.000840f, 0.674805f, 0.000811f, 0.655273f, 0.000780f, 0.635254f, 0.000749f, - 0.615723f, 0.000716f, 0.595703f, 0.000685f, 0.575684f, 0.000653f, 0.556152f, 0.000621f, - 0.536621f, 0.000590f, 0.517090f, 0.000559f, 0.498291f, 0.000530f, 0.479492f, 0.000501f, - 0.460938f, 0.000473f, 0.442627f, 0.000446f, 0.424805f, 0.000420f, 0.407227f, 0.000396f, - 0.390137f, 0.000373f, 0.373535f, 0.000350f, 0.357422f, 0.000329f, 0.341553f, 0.000309f, - 0.999512f, 0.000187f, 0.999512f, 0.000187f, 0.999512f, 0.000188f, 0.999512f, 0.000188f, - 0.999512f, 0.000190f, 0.999512f, 0.000194f, 0.999512f, 0.000201f, 0.999023f, 0.000204f, - 0.999023f, 0.000213f, 0.999023f, 0.000228f, 0.998535f, 0.000242f, 0.998535f, 0.000264f, - 0.997559f, 0.000285f, 0.997070f, 0.000311f, 0.996094f, 0.000351f, 0.995117f, 0.000386f, - 0.993164f, 0.000429f, 0.991211f, 0.000470f, 0.989258f, 0.000520f, 0.986328f, 0.000575f, - 0.983398f, 0.000628f, 0.979492f, 0.000683f, 0.975586f, 0.000741f, 0.970703f, 0.000801f, - 0.965332f, 0.000855f, 0.958984f, 0.000910f, 0.951660f, 0.000961f, 0.943848f, 0.001009f, - 0.935059f, 0.001053f, 0.925781f, 0.001090f, 0.915039f, 0.001123f, 0.903809f, 0.001152f, - 0.891602f, 0.001172f, 0.878906f, 0.001186f, 0.864746f, 0.001194f, 0.850586f, 0.001195f, - 0.835449f, 0.001191f, 0.819336f, 0.001181f, 0.802734f, 0.001164f, 0.785645f, 0.001144f, - 0.768066f, 0.001121f, 0.750000f, 0.001092f, 0.731445f, 0.001061f, 0.712402f, 0.001027f, - 0.693359f, 0.000992f, 0.674316f, 0.000955f, 0.654785f, 0.000916f, 0.635254f, 0.000877f, - 0.615723f, 0.000838f, 0.596191f, 0.000799f, 0.576660f, 0.000760f, 0.557129f, 0.000721f, - 0.538086f, 0.000684f, 0.518555f, 0.000648f, 0.500000f, 0.000612f, 0.481445f, 0.000578f, - 0.462891f, 0.000545f, 0.444824f, 0.000513f, 0.427246f, 0.000483f, 0.409912f, 0.000454f, - 0.392822f, 0.000427f, 0.376221f, 0.000401f, 0.360107f, 0.000376f, 0.344482f, 0.000353f, - 0.999512f, 0.000284f, 0.999512f, 0.000284f, 0.999512f, 0.000284f, 0.999512f, 0.000285f, - 0.999512f, 0.000287f, 0.999512f, 0.000292f, 0.999512f, 0.000296f, 0.999023f, 0.000307f, - 0.999023f, 0.000320f, 0.999023f, 0.000338f, 0.998535f, 0.000349f, 0.998047f, 0.000381f, - 0.997559f, 0.000407f, 0.996582f, 0.000447f, 0.995605f, 0.000480f, 0.994629f, 0.000531f, - 0.992676f, 0.000579f, 0.990723f, 0.000637f, 0.988770f, 0.000693f, 0.985840f, 0.000755f, - 0.982422f, 0.000824f, 0.979004f, 0.000889f, 0.975098f, 0.000958f, 0.969727f, 0.001024f, - 0.963867f, 0.001090f, 0.957520f, 0.001152f, 0.950684f, 0.001211f, 0.942383f, 0.001263f, - 0.933594f, 0.001309f, 0.923828f, 0.001353f, 0.913086f, 0.001387f, 0.901855f, 0.001413f, - 0.889648f, 0.001432f, 0.876465f, 0.001443f, 0.862793f, 0.001446f, 0.848145f, 0.001442f, - 0.833008f, 0.001431f, 0.817383f, 0.001413f, 0.800781f, 0.001390f, 0.783691f, 0.001362f, - 0.766113f, 0.001328f, 0.748535f, 0.001291f, 0.729980f, 0.001250f, 0.711426f, 0.001207f, - 0.692871f, 0.001163f, 0.673828f, 0.001116f, 0.654785f, 0.001068f, 0.635254f, 0.001020f, - 0.616211f, 0.000973f, 0.596680f, 0.000926f, 0.577637f, 0.000878f, 0.558105f, 0.000833f, - 0.539062f, 0.000788f, 0.520508f, 0.000745f, 0.501465f, 0.000702f, 0.483154f, 0.000663f, - 0.465088f, 0.000624f, 0.447266f, 0.000587f, 0.429443f, 0.000552f, 0.412354f, 0.000518f, - 0.395508f, 0.000486f, 0.378906f, 0.000456f, 0.363037f, 0.000427f, 0.347168f, 0.000400f, - 0.999512f, 0.000417f, 0.999512f, 0.000417f, 0.999512f, 0.000418f, 0.999512f, 0.000419f, - 0.999512f, 0.000422f, 0.999512f, 0.000425f, 0.999023f, 0.000434f, 0.999023f, 0.000447f, - 0.999023f, 0.000462f, 0.999023f, 0.000480f, 0.998047f, 0.000508f, 0.998047f, 0.000538f, - 0.997070f, 0.000576f, 0.996582f, 0.000621f, 0.995605f, 0.000669f, 0.993652f, 0.000721f, - 0.992188f, 0.000784f, 0.990723f, 0.000849f, 0.987793f, 0.000918f, 0.985840f, 0.000996f, - 0.982422f, 0.001071f, 0.978516f, 0.001148f, 0.973633f, 0.001225f, 0.968750f, 0.001304f, - 0.962891f, 0.001378f, 0.956543f, 0.001447f, 0.948730f, 0.001511f, 0.940918f, 0.001568f, - 0.931641f, 0.001617f, 0.921875f, 0.001660f, 0.911621f, 0.001697f, 0.899902f, 0.001719f, - 0.887695f, 0.001735f, 0.874512f, 0.001740f, 0.860840f, 0.001738f, 0.846191f, 0.001725f, - 0.831055f, 0.001706f, 0.815430f, 0.001679f, 0.798828f, 0.001646f, 0.782227f, 0.001607f, - 0.764648f, 0.001562f, 0.747070f, 0.001514f, 0.729004f, 0.001462f, 0.710449f, 0.001409f, - 0.691895f, 0.001352f, 0.673340f, 0.001295f, 0.654297f, 0.001237f, 0.635254f, 0.001179f, - 0.616211f, 0.001122f, 0.597168f, 0.001065f, 0.578125f, 0.001010f, 0.559570f, 0.000955f, - 0.540527f, 0.000902f, 0.521973f, 0.000852f, 0.503418f, 0.000803f, 0.485352f, 0.000755f, - 0.467285f, 0.000710f, 0.449463f, 0.000668f, 0.431885f, 0.000626f, 0.414795f, 0.000587f, - 0.398193f, 0.000551f, 0.381836f, 0.000516f, 0.365723f, 0.000483f, 0.350098f, 0.000452f, - 0.999023f, 0.000597f, 0.999023f, 0.000597f, 0.999023f, 0.000597f, 0.999023f, 0.000598f, - 0.999023f, 0.000602f, 0.999023f, 0.000610f, 0.999023f, 0.000618f, 0.999023f, 0.000632f, - 0.998535f, 0.000651f, 0.998535f, 0.000675f, 0.998047f, 0.000704f, 0.997559f, 0.000742f, - 0.997070f, 0.000787f, 0.996094f, 0.000843f, 0.995117f, 0.000902f, 0.993652f, 0.000966f, - 0.992188f, 0.001039f, 0.990234f, 0.001117f, 0.987793f, 0.001197f, 0.984863f, 0.001286f, - 0.981445f, 0.001372f, 0.977539f, 0.001464f, 0.972656f, 0.001553f, 0.967773f, 0.001639f, - 0.961914f, 0.001722f, 0.955078f, 0.001798f, 0.947754f, 0.001868f, 0.938965f, 0.001928f, - 0.930176f, 0.001982f, 0.920410f, 0.002026f, 0.909668f, 0.002056f, 0.897949f, 0.002075f, - 0.885254f, 0.002085f, 0.872559f, 0.002083f, 0.858398f, 0.002071f, 0.844238f, 0.002048f, - 0.828613f, 0.002018f, 0.812988f, 0.001980f, 0.796875f, 0.001934f, 0.780273f, 0.001883f, - 0.763184f, 0.001824f, 0.745605f, 0.001763f, 0.728027f, 0.001698f, 0.709473f, 0.001632f, - 0.691406f, 0.001563f, 0.672852f, 0.001494f, 0.654297f, 0.001422f, 0.635254f, 0.001355f, - 0.616699f, 0.001286f, 0.598145f, 0.001218f, 0.579102f, 0.001152f, 0.560547f, 0.001089f, - 0.541992f, 0.001027f, 0.523438f, 0.000968f, 0.505371f, 0.000911f, 0.487305f, 0.000857f, - 0.469482f, 0.000804f, 0.451904f, 0.000755f, 0.434570f, 0.000708f, 0.417480f, 0.000663f, - 0.400879f, 0.000621f, 0.384521f, 0.000581f, 0.368652f, 0.000544f, 0.353027f, 0.000508f, - 0.999023f, 0.000833f, 0.999023f, 0.000833f, 0.999023f, 0.000834f, 0.999023f, 0.000835f, - 0.999023f, 0.000840f, 0.999023f, 0.000845f, 0.998535f, 0.000861f, 0.998535f, 0.000875f, - 0.998535f, 0.000897f, 0.998047f, 0.000928f, 0.997559f, 0.000965f, 0.997070f, 0.001007f, - 0.996582f, 0.001061f, 0.995605f, 0.001128f, 0.994629f, 0.001195f, 0.993164f, 0.001276f, - 0.991699f, 0.001362f, 0.989258f, 0.001453f, 0.986816f, 0.001539f, 0.983887f, 0.001645f, - 0.980469f, 0.001747f, 0.976562f, 0.001849f, 0.971680f, 0.001945f, 0.966309f, 0.002045f, - 0.959961f, 0.002136f, 0.953613f, 0.002218f, 0.945801f, 0.002291f, 0.937500f, 0.002357f, - 0.928223f, 0.002407f, 0.917969f, 0.002447f, 0.907227f, 0.002472f, 0.895508f, 0.002487f, - 0.883301f, 0.002485f, 0.870117f, 0.002474f, 0.856445f, 0.002451f, 0.841797f, 0.002417f, - 0.826660f, 0.002373f, 0.811035f, 0.002317f, 0.794922f, 0.002258f, 0.778320f, 0.002190f, - 0.761230f, 0.002117f, 0.744141f, 0.002041f, 0.726562f, 0.001961f, 0.708496f, 0.001880f, - 0.690430f, 0.001796f, 0.672363f, 0.001713f, 0.654297f, 0.001630f, 0.635742f, 0.001547f, - 0.617188f, 0.001466f, 0.598633f, 0.001387f, 0.580078f, 0.001310f, 0.561523f, 0.001235f, - 0.543457f, 0.001164f, 0.524902f, 0.001095f, 0.507324f, 0.001029f, 0.489258f, 0.000967f, - 0.471680f, 0.000906f, 0.454346f, 0.000850f, 0.437012f, 0.000796f, 0.420166f, 0.000745f, - 0.403564f, 0.000698f, 0.387451f, 0.000652f, 0.371582f, 0.000609f, 0.356201f, 0.000569f, - 0.998535f, 0.001139f, 0.998535f, 0.001139f, 0.998535f, 0.001140f, 0.998535f, 0.001142f, - 0.998535f, 0.001147f, 0.998535f, 0.001159f, 0.998535f, 0.001168f, 0.998047f, 0.001190f, - 0.998047f, 0.001217f, 0.997559f, 0.001254f, 0.997559f, 0.001301f, 0.997070f, 0.001356f, - 0.996094f, 0.001416f, 0.995605f, 0.001493f, 0.994141f, 0.001574f, 0.992676f, 0.001663f, - 0.990723f, 0.001759f, 0.988770f, 0.001867f, 0.986328f, 0.001980f, 0.982910f, 0.002087f, - 0.979492f, 0.002199f, 0.975586f, 0.002319f, 0.970703f, 0.002422f, 0.965332f, 0.002531f, - 0.958496f, 0.002628f, 0.952148f, 0.002714f, 0.944336f, 0.002792f, 0.935547f, 0.002851f, - 0.926270f, 0.002903f, 0.916016f, 0.002935f, 0.904785f, 0.002954f, 0.893066f, 0.002956f, - 0.880859f, 0.002947f, 0.867676f, 0.002920f, 0.853516f, 0.002882f, 0.839355f, 0.002831f, - 0.824219f, 0.002769f, 0.809082f, 0.002699f, 0.792969f, 0.002619f, 0.776367f, 0.002533f, - 0.759766f, 0.002443f, 0.742676f, 0.002350f, 0.725586f, 0.002251f, 0.708008f, 0.002151f, - 0.689941f, 0.002052f, 0.671875f, 0.001953f, 0.653809f, 0.001854f, 0.635742f, 0.001758f, - 0.617676f, 0.001663f, 0.599121f, 0.001572f, 0.581055f, 0.001482f, 0.562988f, 0.001395f, - 0.544922f, 0.001313f, 0.526855f, 0.001234f, 0.508789f, 0.001158f, 0.491455f, 0.001086f, - 0.473877f, 0.001018f, 0.456787f, 0.000954f, 0.439697f, 0.000892f, 0.422852f, 0.000834f, - 0.406494f, 0.000780f, 0.390381f, 0.000729f, 0.374512f, 0.000680f, 0.359131f, 0.000635f, - 0.998047f, 0.001528f, 0.998047f, 0.001528f, 0.998047f, 0.001529f, 0.998047f, 0.001532f, - 0.998047f, 0.001539f, 0.998047f, 0.001546f, 0.998047f, 0.001562f, 0.998047f, 0.001589f, - 0.997559f, 0.001621f, 0.997559f, 0.001668f, 0.996582f, 0.001715f, 0.996582f, 0.001777f, - 0.995605f, 0.001859f, 0.994629f, 0.001939f, 0.993652f, 0.002035f, 0.992188f, 0.002140f, - 0.990234f, 0.002243f, 0.987793f, 0.002369f, 0.985352f, 0.002489f, 0.981934f, 0.002621f, - 0.978516f, 0.002750f, 0.974121f, 0.002876f, 0.969238f, 0.002991f, 0.963867f, 0.003105f, - 0.957031f, 0.003206f, 0.950195f, 0.003300f, 0.942383f, 0.003374f, 0.933594f, 0.003431f, - 0.923828f, 0.003473f, 0.913574f, 0.003498f, 0.902344f, 0.003506f, 0.890625f, 0.003494f, - 0.878418f, 0.003468f, 0.865234f, 0.003426f, 0.851074f, 0.003366f, 0.836914f, 0.003296f, - 0.822266f, 0.003216f, 0.806641f, 0.003122f, 0.791016f, 0.003023f, 0.774902f, 0.002916f, - 0.758301f, 0.002804f, 0.741211f, 0.002689f, 0.724121f, 0.002573f, 0.707031f, 0.002453f, - 0.689453f, 0.002335f, 0.671875f, 0.002216f, 0.653809f, 0.002102f, 0.636230f, 0.001987f, - 0.618164f, 0.001878f, 0.600098f, 0.001771f, 0.582031f, 0.001668f, 0.564453f, 0.001569f, - 0.546387f, 0.001475f, 0.528809f, 0.001384f, 0.511230f, 0.001297f, 0.493652f, 0.001217f, - 0.476318f, 0.001139f, 0.459229f, 0.001065f, 0.442383f, 0.000996f, 0.425781f, 0.000930f, - 0.409424f, 0.000869f, 0.393311f, 0.000811f, 0.377686f, 0.000757f, 0.362305f, 0.000707f, - 0.997559f, 0.002018f, 0.997559f, 0.002018f, 0.997559f, 0.002018f, 0.997559f, 0.002022f, - 0.997559f, 0.002028f, 0.997559f, 0.002045f, 0.997559f, 0.002066f, 0.997559f, 0.002092f, - 0.997559f, 0.002129f, 0.996582f, 0.002176f, 0.996094f, 0.002235f, 0.995605f, 0.002312f, - 0.995605f, 0.002407f, 0.993652f, 0.002491f, 0.992676f, 0.002605f, 0.991211f, 0.002729f, - 0.989258f, 0.002846f, 0.987305f, 0.002987f, 0.984375f, 0.003120f, 0.980957f, 0.003263f, - 0.977051f, 0.003403f, 0.972656f, 0.003542f, 0.967285f, 0.003666f, 0.961914f, 0.003782f, - 0.955566f, 0.003889f, 0.947754f, 0.003967f, 0.939941f, 0.004044f, 0.931152f, 0.004097f, - 0.921387f, 0.004131f, 0.911133f, 0.004139f, 0.899902f, 0.004131f, 0.888184f, 0.004108f, - 0.875488f, 0.004055f, 0.862305f, 0.003990f, 0.848633f, 0.003914f, 0.834473f, 0.003819f, - 0.819824f, 0.003712f, 0.804199f, 0.003593f, 0.788574f, 0.003469f, 0.772949f, 0.003338f, - 0.756348f, 0.003201f, 0.739746f, 0.003063f, 0.723145f, 0.002924f, 0.706055f, 0.002781f, - 0.688965f, 0.002644f, 0.671387f, 0.002506f, 0.653809f, 0.002371f, 0.636230f, 0.002239f, - 0.618652f, 0.002111f, 0.601074f, 0.001989f, 0.583496f, 0.001871f, 0.565430f, 0.001759f, - 0.547852f, 0.001650f, 0.530273f, 0.001547f, 0.513184f, 0.001449f, 0.495850f, 0.001356f, - 0.478760f, 0.001269f, 0.461670f, 0.001185f, 0.445068f, 0.001107f, 0.428467f, 0.001035f, - 0.412354f, 0.000965f, 0.396240f, 0.000901f, 0.380615f, 0.000840f, 0.365479f, 0.000783f, - 0.997070f, 0.002625f, 0.997070f, 0.002625f, 0.997070f, 0.002626f, 0.997070f, 0.002630f, - 0.997070f, 0.002640f, 0.997070f, 0.002659f, 0.997070f, 0.002676f, 0.996582f, 0.002708f, - 0.996582f, 0.002752f, 0.996094f, 0.002813f, 0.995605f, 0.002886f, 0.995117f, 0.002956f, - 0.994141f, 0.003071f, 0.992676f, 0.003172f, 0.991699f, 0.003292f, 0.990234f, 0.003433f, - 0.988281f, 0.003580f, 0.985840f, 0.003727f, 0.982910f, 0.003870f, 0.979492f, 0.004028f, - 0.975586f, 0.004177f, 0.971191f, 0.004322f, 0.966309f, 0.004456f, 0.959961f, 0.004570f, - 0.953125f, 0.004669f, 0.945801f, 0.004757f, 0.937500f, 0.004826f, 0.928711f, 0.004864f, - 0.918945f, 0.004883f, 0.908691f, 0.004875f, 0.897461f, 0.004845f, 0.885254f, 0.004795f, - 0.872559f, 0.004723f, 0.859863f, 0.004631f, 0.846191f, 0.004520f, 0.832031f, 0.004398f, - 0.817383f, 0.004261f, 0.802246f, 0.004116f, 0.786621f, 0.003963f, 0.770996f, 0.003805f, - 0.754883f, 0.003639f, 0.738770f, 0.003475f, 0.722168f, 0.003307f, 0.705078f, 0.003143f, - 0.688477f, 0.002981f, 0.671387f, 0.002821f, 0.653809f, 0.002665f, 0.636719f, 0.002512f, - 0.619141f, 0.002367f, 0.602051f, 0.002226f, 0.584473f, 0.002090f, 0.566895f, 0.001963f, - 0.549805f, 0.001840f, 0.532227f, 0.001722f, 0.515137f, 0.001613f, 0.498047f, 0.001508f, - 0.481201f, 0.001409f, 0.464355f, 0.001316f, 0.447754f, 0.001228f, 0.431396f, 0.001145f, - 0.415283f, 0.001069f, 0.399414f, 0.000997f, 0.383789f, 0.000929f, 0.368652f, 0.000865f, - 0.996582f, 0.003370f, 0.996582f, 0.003370f, 0.996582f, 0.003372f, 0.996582f, 0.003378f, - 0.996582f, 0.003389f, 0.996094f, 0.003410f, 0.996094f, 0.003435f, 0.996094f, 0.003471f, - 0.996094f, 0.003523f, 0.995117f, 0.003588f, 0.995117f, 0.003664f, 0.994141f, 0.003754f, - 0.993164f, 0.003864f, 0.992676f, 0.003990f, 0.990723f, 0.004128f, 0.989746f, 0.004288f, - 0.987793f, 0.004429f, 0.984375f, 0.004601f, 0.981445f, 0.004757f, 0.978027f, 0.004925f, - 0.974121f, 0.005089f, 0.969727f, 0.005241f, 0.964355f, 0.005375f, 0.958008f, 0.005486f, - 0.951172f, 0.005596f, 0.943848f, 0.005665f, 0.935547f, 0.005718f, 0.925781f, 0.005737f, - 0.916016f, 0.005733f, 0.905762f, 0.005707f, 0.894531f, 0.005650f, 0.882324f, 0.005569f, - 0.870117f, 0.005466f, 0.856934f, 0.005341f, 0.843262f, 0.005199f, 0.829102f, 0.005043f, - 0.814941f, 0.004871f, 0.799805f, 0.004692f, 0.784668f, 0.004505f, 0.769043f, 0.004314f, - 0.753418f, 0.004116f, 0.737305f, 0.003922f, 0.721191f, 0.003729f, 0.704590f, 0.003536f, - 0.687988f, 0.003347f, 0.670898f, 0.003162f, 0.654297f, 0.002983f, 0.637207f, 0.002810f, - 0.620117f, 0.002642f, 0.603027f, 0.002481f, 0.585938f, 0.002329f, 0.568359f, 0.002182f, - 0.551270f, 0.002045f, 0.534180f, 0.001913f, 0.517090f, 0.001788f, 0.500488f, 0.001671f, - 0.483643f, 0.001560f, 0.467041f, 0.001456f, 0.450684f, 0.001358f, 0.434326f, 0.001266f, - 0.418213f, 0.001181f, 0.402588f, 0.001101f, 0.386963f, 0.001025f, 0.371826f, 0.000954f, - 0.995605f, 0.004276f, 0.995605f, 0.004276f, 0.995605f, 0.004280f, 0.995605f, 0.004284f, - 0.995605f, 0.004299f, 0.995117f, 0.004318f, 0.995117f, 0.004349f, 0.995117f, 0.004383f, - 0.994629f, 0.004456f, 0.994629f, 0.004524f, 0.994141f, 0.004612f, 0.993164f, 0.004704f, - 0.992676f, 0.004848f, 0.991699f, 0.004974f, 0.990234f, 0.005142f, 0.987793f, 0.005291f, - 0.986328f, 0.005474f, 0.982910f, 0.005638f, 0.980469f, 0.005825f, 0.976562f, 0.005989f, - 0.972656f, 0.006157f, 0.967773f, 0.006313f, 0.961914f, 0.006443f, 0.955566f, 0.006554f, - 0.948730f, 0.006645f, 0.940918f, 0.006702f, 0.932617f, 0.006733f, 0.923340f, 0.006733f, - 0.913574f, 0.006699f, 0.902832f, 0.006645f, 0.891602f, 0.006550f, 0.879395f, 0.006435f, - 0.867188f, 0.006294f, 0.854004f, 0.006130f, 0.840332f, 0.005951f, 0.826660f, 0.005756f, - 0.812500f, 0.005543f, 0.797363f, 0.005325f, 0.782715f, 0.005100f, 0.767090f, 0.004871f, - 0.751465f, 0.004642f, 0.735840f, 0.004414f, 0.719727f, 0.004185f, 0.703613f, 0.003960f, - 0.687500f, 0.003744f, 0.670898f, 0.003531f, 0.654297f, 0.003326f, 0.637695f, 0.003128f, - 0.620605f, 0.002939f, 0.604004f, 0.002756f, 0.586914f, 0.002584f, 0.569824f, 0.002420f, - 0.553223f, 0.002264f, 0.536133f, 0.002117f, 0.519531f, 0.001978f, 0.502930f, 0.001847f, - 0.486328f, 0.001723f, 0.469727f, 0.001607f, 0.453369f, 0.001498f, 0.437256f, 0.001395f, - 0.421387f, 0.001300f, 0.405762f, 0.001211f, 0.390381f, 0.001127f, 0.375244f, 0.001050f, - 0.994141f, 0.005367f, 0.994141f, 0.005367f, 0.994141f, 0.005371f, 0.994141f, 0.005375f, - 0.994141f, 0.005394f, 0.994141f, 0.005413f, 0.994141f, 0.005447f, 0.994141f, 0.005508f, - 0.993652f, 0.005558f, 0.993652f, 0.005650f, 0.992676f, 0.005741f, 0.991699f, 0.005848f, - 0.991211f, 0.006004f, 0.990234f, 0.006149f, 0.988281f, 0.006317f, 0.986328f, 0.006504f, - 0.984863f, 0.006687f, 0.981934f, 0.006866f, 0.978516f, 0.007050f, 0.974609f, 0.007233f, - 0.970215f, 0.007393f, 0.965820f, 0.007553f, 0.959961f, 0.007675f, 0.953125f, 0.007774f, - 0.946289f, 0.007843f, 0.938477f, 0.007889f, 0.929688f, 0.007889f, 0.920410f, 0.007858f, - 0.910156f, 0.007793f, 0.899414f, 0.007694f, 0.888672f, 0.007565f, 0.876465f, 0.007401f, - 0.864258f, 0.007214f, 0.851074f, 0.007008f, 0.837402f, 0.006779f, 0.823730f, 0.006535f, - 0.809570f, 0.006279f, 0.794922f, 0.006023f, 0.780273f, 0.005753f, 0.765137f, 0.005482f, - 0.750000f, 0.005215f, 0.734375f, 0.004944f, 0.718750f, 0.004681f, 0.703125f, 0.004425f, - 0.687012f, 0.004173f, 0.670898f, 0.003929f, 0.654297f, 0.003700f, 0.638184f, 0.003473f, - 0.621582f, 0.003260f, 0.604980f, 0.003056f, 0.588379f, 0.002861f, 0.571777f, 0.002676f, - 0.555176f, 0.002502f, 0.538574f, 0.002337f, 0.521973f, 0.002180f, 0.505371f, 0.002035f, - 0.488770f, 0.001898f, 0.472656f, 0.001769f, 0.456299f, 0.001649f, 0.440430f, 0.001534f, - 0.424561f, 0.001430f, 0.408936f, 0.001329f, 0.393555f, 0.001238f, 0.378418f, 0.001151f, - 0.993164f, 0.006672f, 0.993164f, 0.006672f, 0.993164f, 0.006676f, 0.993164f, 0.006687f, - 0.993164f, 0.006699f, 0.993164f, 0.006721f, 0.992676f, 0.006760f, 0.992676f, 0.006821f, - 0.992188f, 0.006897f, 0.991699f, 0.006973f, 0.991211f, 0.007099f, 0.990234f, 0.007206f, - 0.990234f, 0.007366f, 0.988281f, 0.007519f, 0.986328f, 0.007706f, 0.984863f, 0.007912f, - 0.982422f, 0.008087f, 0.979980f, 0.008286f, 0.977051f, 0.008476f, 0.972656f, 0.008667f, - 0.968262f, 0.008827f, 0.962891f, 0.008980f, 0.957520f, 0.009079f, 0.951172f, 0.009171f, - 0.943848f, 0.009216f, 0.935547f, 0.009224f, 0.926758f, 0.009193f, 0.917480f, 0.009125f, - 0.906738f, 0.009010f, 0.895996f, 0.008865f, 0.885254f, 0.008682f, 0.873047f, 0.008469f, - 0.860840f, 0.008232f, 0.847656f, 0.007973f, 0.834473f, 0.007690f, 0.820801f, 0.007397f, - 0.807129f, 0.007092f, 0.792969f, 0.006783f, 0.778320f, 0.006462f, 0.763184f, 0.006145f, - 0.748535f, 0.005833f, 0.733398f, 0.005524f, 0.717773f, 0.005219f, 0.702148f, 0.004925f, - 0.686523f, 0.004639f, 0.670898f, 0.004364f, 0.654785f, 0.004097f, 0.638672f, 0.003847f, - 0.622559f, 0.003605f, 0.605957f, 0.003376f, 0.589844f, 0.003157f, 0.573242f, 0.002951f, - 0.556641f, 0.002756f, 0.540527f, 0.002573f, 0.523926f, 0.002399f, 0.507812f, 0.002237f, - 0.491455f, 0.002085f, 0.475342f, 0.001943f, 0.459229f, 0.001809f, 0.443359f, 0.001684f, - 0.427734f, 0.001567f, 0.412109f, 0.001457f, 0.396973f, 0.001356f, 0.382080f, 0.001261f, - 0.991699f, 0.008217f, 0.991699f, 0.008217f, 0.991699f, 0.008217f, 0.991699f, 0.008232f, - 0.991211f, 0.008240f, 0.991211f, 0.008270f, 0.991211f, 0.008324f, 0.991211f, 0.008377f, - 0.990723f, 0.008461f, 0.990234f, 0.008553f, 0.989746f, 0.008682f, 0.988770f, 0.008820f, - 0.987793f, 0.008972f, 0.986816f, 0.009163f, 0.985352f, 0.009338f, 0.982910f, 0.009567f, - 0.980957f, 0.009758f, 0.977539f, 0.009956f, 0.974609f, 0.010155f, 0.970215f, 0.010330f, - 0.965820f, 0.010483f, 0.960449f, 0.010597f, 0.954590f, 0.010696f, 0.947754f, 0.010750f, - 0.940430f, 0.010757f, 0.932129f, 0.010735f, 0.923340f, 0.010651f, 0.913574f, 0.010536f, - 0.903809f, 0.010376f, 0.892578f, 0.010162f, 0.881348f, 0.009926f, 0.869629f, 0.009651f, - 0.857422f, 0.009354f, 0.844727f, 0.009026f, 0.831543f, 0.008690f, 0.817871f, 0.008331f, - 0.804199f, 0.007973f, 0.790527f, 0.007603f, 0.775879f, 0.007233f, 0.761719f, 0.006866f, - 0.747070f, 0.006500f, 0.731934f, 0.006145f, 0.716797f, 0.005798f, 0.701660f, 0.005466f, - 0.686523f, 0.005138f, 0.670898f, 0.004829f, 0.655273f, 0.004532f, 0.639160f, 0.004246f, - 0.623535f, 0.003975f, 0.607422f, 0.003719f, 0.591309f, 0.003477f, 0.575195f, 0.003246f, - 0.558594f, 0.003029f, 0.542480f, 0.002827f, 0.526367f, 0.002634f, 0.510254f, 0.002455f, - 0.494141f, 0.002285f, 0.478271f, 0.002129f, 0.462402f, 0.001980f, 0.446533f, 0.001843f, - 0.430908f, 0.001715f, 0.415527f, 0.001594f, 0.400391f, 0.001483f, 0.385498f, 0.001378f, - 0.989746f, 0.010040f, 0.989746f, 0.010040f, 0.989746f, 0.010040f, 0.989746f, 0.010048f, - 0.989746f, 0.010071f, 0.989746f, 0.010094f, 0.989258f, 0.010147f, 0.989258f, 0.010223f, - 0.988770f, 0.010300f, 0.988770f, 0.010406f, 0.987793f, 0.010529f, 0.986816f, 0.010696f, - 0.986328f, 0.010857f, 0.984863f, 0.011055f, 0.982422f, 0.011238f, 0.981445f, 0.011467f, - 0.978516f, 0.011673f, 0.975098f, 0.011871f, 0.972168f, 0.012062f, 0.967285f, 0.012215f, - 0.962402f, 0.012352f, 0.957031f, 0.012459f, 0.951172f, 0.012535f, 0.944336f, 0.012535f, - 0.937012f, 0.012520f, 0.928711f, 0.012428f, 0.919922f, 0.012299f, 0.910156f, 0.012115f, - 0.899414f, 0.011879f, 0.889160f, 0.011612f, 0.877441f, 0.011299f, 0.865723f, 0.010956f, - 0.853516f, 0.010582f, 0.841309f, 0.010193f, 0.828125f, 0.009773f, 0.814941f, 0.009361f, - 0.801270f, 0.008926f, 0.787598f, 0.008499f, 0.773926f, 0.008064f, 0.759766f, 0.007641f, - 0.745117f, 0.007225f, 0.730469f, 0.006817f, 0.716309f, 0.006424f, 0.701172f, 0.006042f, - 0.686035f, 0.005676f, 0.670898f, 0.005329f, 0.655273f, 0.004993f, 0.640137f, 0.004673f, - 0.624512f, 0.004372f, 0.608398f, 0.004086f, 0.592773f, 0.003817f, 0.576660f, 0.003561f, - 0.561035f, 0.003323f, 0.544922f, 0.003098f, 0.528809f, 0.002884f, 0.512695f, 0.002686f, - 0.497070f, 0.002501f, 0.481201f, 0.002327f, 0.465332f, 0.002165f, 0.449707f, 0.002014f, - 0.434326f, 0.001873f, 0.418945f, 0.001740f, 0.403809f, 0.001617f, 0.388916f, 0.001504f, - 0.987793f, 0.012169f, 0.987793f, 0.012169f, 0.987793f, 0.012169f, 0.987793f, 0.012184f, - 0.987305f, 0.012207f, 0.987305f, 0.012245f, 0.987305f, 0.012291f, 0.986816f, 0.012360f, - 0.986816f, 0.012459f, 0.986328f, 0.012573f, 0.985840f, 0.012695f, 0.984863f, 0.012878f, - 0.983887f, 0.013046f, 0.982422f, 0.013237f, 0.980469f, 0.013466f, 0.979004f, 0.013680f, - 0.976074f, 0.013878f, 0.972656f, 0.014069f, 0.969238f, 0.014259f, 0.964355f, 0.014397f, - 0.959961f, 0.014488f, 0.954102f, 0.014580f, 0.947754f, 0.014595f, 0.940430f, 0.014557f, - 0.933105f, 0.014481f, 0.925293f, 0.014328f, 0.915527f, 0.014122f, 0.906250f, 0.013870f, - 0.895996f, 0.013565f, 0.885254f, 0.013206f, 0.873535f, 0.012817f, 0.862305f, 0.012383f, - 0.850098f, 0.011932f, 0.837891f, 0.011452f, 0.824707f, 0.010963f, 0.812012f, 0.010460f, - 0.798828f, 0.009964f, 0.785156f, 0.009460f, 0.771484f, 0.008965f, 0.757812f, 0.008484f, - 0.743652f, 0.008003f, 0.729492f, 0.007542f, 0.715332f, 0.007095f, 0.700684f, 0.006668f, - 0.686035f, 0.006256f, 0.670898f, 0.005863f, 0.655762f, 0.005489f, 0.640625f, 0.005135f, - 0.625488f, 0.004799f, 0.609863f, 0.004478f, 0.594238f, 0.004181f, 0.578613f, 0.003901f, - 0.562988f, 0.003635f, 0.547363f, 0.003386f, 0.531250f, 0.003153f, 0.515625f, 0.002935f, - 0.500000f, 0.002729f, 0.484131f, 0.002539f, 0.468506f, 0.002361f, 0.453125f, 0.002195f, - 0.437744f, 0.002041f, 0.422363f, 0.001897f, 0.407471f, 0.001763f, 0.392578f, 0.001637f, - 0.985352f, 0.014641f, 0.985352f, 0.014641f, 0.984863f, 0.014648f, 0.984863f, 0.014656f, - 0.984863f, 0.014679f, 0.984863f, 0.014717f, 0.984863f, 0.014771f, 0.984375f, 0.014839f, - 0.984375f, 0.014938f, 0.983398f, 0.015060f, 0.983398f, 0.015244f, 0.981934f, 0.015388f, - 0.980957f, 0.015587f, 0.979492f, 0.015778f, 0.977539f, 0.015976f, 0.975586f, 0.016190f, - 0.972656f, 0.016388f, 0.969727f, 0.016571f, 0.965820f, 0.016739f, 0.961426f, 0.016861f, - 0.956055f, 0.016922f, 0.950684f, 0.016953f, 0.943848f, 0.016922f, 0.937012f, 0.016815f, - 0.929199f, 0.016663f, 0.920410f, 0.016434f, 0.911621f, 0.016144f, 0.901855f, 0.015793f, - 0.891602f, 0.015411f, 0.880859f, 0.014954f, 0.869629f, 0.014473f, 0.857910f, 0.013947f, - 0.846191f, 0.013390f, 0.833984f, 0.012825f, 0.821289f, 0.012253f, 0.809082f, 0.011665f, - 0.795898f, 0.011086f, 0.782715f, 0.010506f, 0.769531f, 0.009933f, 0.755859f, 0.009377f, - 0.742188f, 0.008842f, 0.728516f, 0.008316f, 0.714355f, 0.007812f, 0.700195f, 0.007336f, - 0.685547f, 0.006874f, 0.670898f, 0.006435f, 0.656250f, 0.006020f, 0.641602f, 0.005623f, - 0.626465f, 0.005253f, 0.611328f, 0.004902f, 0.596191f, 0.004570f, 0.580566f, 0.004261f, - 0.564941f, 0.003967f, 0.549316f, 0.003695f, 0.533691f, 0.003437f, 0.518066f, 0.003199f, - 0.502930f, 0.002975f, 0.487305f, 0.002766f, 0.471680f, 0.002571f, 0.456299f, 0.002388f, - 0.441162f, 0.002220f, 0.426025f, 0.002062f, 0.411133f, 0.001916f, 0.396240f, 0.001781f, - 0.982422f, 0.017502f, 0.982422f, 0.017502f, 0.982422f, 0.017502f, 0.982422f, 0.017517f, - 0.981934f, 0.017532f, 0.981934f, 0.017593f, 0.981934f, 0.017639f, 0.981934f, 0.017731f, - 0.981445f, 0.017838f, 0.980957f, 0.017960f, 0.979980f, 0.018112f, 0.979004f, 0.018295f, - 0.978027f, 0.018478f, 0.975586f, 0.018677f, 0.974609f, 0.018860f, 0.972168f, 0.019073f, - 0.969238f, 0.019287f, 0.965820f, 0.019455f, 0.962402f, 0.019562f, 0.958008f, 0.019653f, - 0.952637f, 0.019653f, 0.946289f, 0.019623f, 0.939453f, 0.019516f, 0.932617f, 0.019348f, - 0.924316f, 0.019089f, 0.916016f, 0.018784f, 0.907227f, 0.018387f, 0.897461f, 0.017944f, - 0.887207f, 0.017426f, 0.876465f, 0.016861f, 0.865234f, 0.016266f, 0.854004f, 0.015640f, - 0.842285f, 0.014999f, 0.830078f, 0.014320f, 0.818359f, 0.013641f, 0.805664f, 0.012962f, - 0.792969f, 0.012291f, 0.780273f, 0.011627f, 0.767090f, 0.010979f, 0.753906f, 0.010345f, - 0.740723f, 0.009735f, 0.727539f, 0.009155f, 0.713867f, 0.008591f, 0.699707f, 0.008049f, - 0.685547f, 0.007534f, 0.671387f, 0.007050f, 0.656738f, 0.006588f, 0.642578f, 0.006149f, - 0.627441f, 0.005737f, 0.612793f, 0.005352f, 0.597656f, 0.004986f, 0.582520f, 0.004642f, - 0.567383f, 0.004322f, 0.551758f, 0.004021f, 0.536621f, 0.003744f, 0.520996f, 0.003481f, - 0.505859f, 0.003235f, 0.490479f, 0.003006f, 0.475098f, 0.002794f, 0.459717f, 0.002596f, - 0.444580f, 0.002411f, 0.429688f, 0.002241f, 0.414795f, 0.002081f, 0.400146f, 0.001933f, - 0.979004f, 0.020798f, 0.979004f, 0.020798f, 0.979004f, 0.020798f, 0.979004f, 0.020813f, - 0.979004f, 0.020844f, 0.978516f, 0.020874f, 0.978516f, 0.020935f, 0.978027f, 0.021027f, - 0.978027f, 0.021149f, 0.977539f, 0.021286f, 0.977051f, 0.021454f, 0.975586f, 0.021622f, - 0.974121f, 0.021820f, 0.972656f, 0.021988f, 0.970215f, 0.022186f, 0.968750f, 0.022385f, - 0.965820f, 0.022552f, 0.961914f, 0.022675f, 0.958008f, 0.022736f, 0.953613f, 0.022751f, - 0.948242f, 0.022736f, 0.942383f, 0.022614f, 0.935547f, 0.022415f, 0.927734f, 0.022156f, - 0.919922f, 0.021790f, 0.911621f, 0.021362f, 0.901855f, 0.020859f, 0.892090f, 0.020279f, - 0.882324f, 0.019638f, 0.872070f, 0.018951f, 0.860840f, 0.018234f, 0.849609f, 0.017487f, - 0.838379f, 0.016708f, 0.826172f, 0.015930f, 0.814453f, 0.015144f, 0.802246f, 0.014359f, - 0.790527f, 0.013588f, 0.777832f, 0.012833f, 0.765137f, 0.012100f, 0.752441f, 0.011383f, - 0.739258f, 0.010696f, 0.726074f, 0.010040f, 0.712891f, 0.009415f, 0.699219f, 0.008812f, - 0.685547f, 0.008240f, 0.671875f, 0.007698f, 0.657715f, 0.007191f, 0.643555f, 0.006710f, - 0.628906f, 0.006252f, 0.614258f, 0.005829f, 0.599609f, 0.005428f, 0.584473f, 0.005051f, - 0.569336f, 0.004704f, 0.554199f, 0.004372f, 0.539062f, 0.004063f, 0.523926f, 0.003780f, - 0.508789f, 0.003513f, 0.493652f, 0.003263f, 0.478271f, 0.003033f, 0.463135f, 0.002817f, - 0.448242f, 0.002615f, 0.433350f, 0.002430f, 0.418457f, 0.002256f, 0.403809f, 0.002094f, - 0.975098f, 0.024582f, 0.975098f, 0.024567f, 0.975098f, 0.024582f, 0.975098f, 0.024597f, - 0.975098f, 0.024628f, 0.975098f, 0.024658f, 0.975098f, 0.024734f, 0.974609f, 0.024826f, - 0.973633f, 0.024933f, 0.973633f, 0.025055f, 0.972656f, 0.025223f, 0.972168f, 0.025421f, - 0.970215f, 0.025589f, 0.968262f, 0.025742f, 0.966309f, 0.025925f, 0.964355f, 0.026108f, - 0.960938f, 0.026230f, 0.957520f, 0.026321f, 0.953613f, 0.026352f, 0.948242f, 0.026260f, - 0.943848f, 0.026154f, 0.937500f, 0.025970f, 0.930664f, 0.025650f, 0.922852f, 0.025253f, - 0.915039f, 0.024765f, 0.906738f, 0.024200f, 0.897461f, 0.023560f, 0.887207f, 0.022827f, - 0.877441f, 0.022064f, 0.866699f, 0.021225f, 0.855957f, 0.020370f, 0.845215f, 0.019470f, - 0.833984f, 0.018570f, 0.822266f, 0.017654f, 0.811035f, 0.016754f, 0.799316f, 0.015854f, - 0.787109f, 0.014984f, 0.775391f, 0.014122f, 0.763184f, 0.013298f, 0.750488f, 0.012489f, - 0.737793f, 0.011726f, 0.725098f, 0.010986f, 0.712402f, 0.010284f, 0.699219f, 0.009621f, - 0.685547f, 0.008987f, 0.671875f, 0.008392f, 0.658203f, 0.007828f, 0.644531f, 0.007305f, - 0.630371f, 0.006802f, 0.615723f, 0.006336f, 0.601562f, 0.005898f, 0.586914f, 0.005489f, - 0.571777f, 0.005104f, 0.557129f, 0.004745f, 0.541992f, 0.004414f, 0.526855f, 0.004101f, - 0.511719f, 0.003809f, 0.496826f, 0.003538f, 0.481689f, 0.003286f, 0.466797f, 0.003052f, - 0.451904f, 0.002832f, 0.437012f, 0.002630f, 0.422363f, 0.002441f, 0.407715f, 0.002268f, - 0.970703f, 0.028870f, 0.970703f, 0.028870f, 0.970703f, 0.028885f, 0.970703f, 0.028900f, - 0.970703f, 0.028915f, 0.970703f, 0.028961f, 0.970215f, 0.029022f, 0.970215f, 0.029114f, - 0.969727f, 0.029251f, 0.968750f, 0.029373f, 0.968262f, 0.029526f, 0.966797f, 0.029678f, - 0.966309f, 0.029877f, 0.964844f, 0.030045f, 0.962402f, 0.030167f, 0.959473f, 0.030304f, - 0.956543f, 0.030411f, 0.953125f, 0.030411f, 0.948242f, 0.030319f, 0.943359f, 0.030197f, - 0.938477f, 0.029968f, 0.931641f, 0.029648f, 0.924805f, 0.029221f, 0.917969f, 0.028687f, - 0.909180f, 0.028030f, 0.900879f, 0.027313f, 0.891602f, 0.026505f, 0.881836f, 0.025620f, - 0.871582f, 0.024673f, 0.861816f, 0.023697f, 0.851074f, 0.022659f, 0.840820f, 0.021622f, - 0.829590f, 0.020569f, 0.818359f, 0.019516f, 0.807129f, 0.018478f, 0.795898f, 0.017456f, - 0.784180f, 0.016464f, 0.772461f, 0.015503f, 0.760742f, 0.014572f, 0.748535f, 0.013672f, - 0.736816f, 0.012817f, 0.724121f, 0.012001f, 0.711914f, 0.011215f, 0.698730f, 0.010483f, - 0.686035f, 0.009789f, 0.672852f, 0.009132f, 0.659180f, 0.008514f, 0.645508f, 0.007935f, - 0.631836f, 0.007389f, 0.617676f, 0.006878f, 0.603516f, 0.006397f, 0.588867f, 0.005951f, - 0.574219f, 0.005531f, 0.559570f, 0.005142f, 0.544922f, 0.004776f, 0.529785f, 0.004436f, - 0.515137f, 0.004120f, 0.500000f, 0.003828f, 0.485352f, 0.003555f, 0.470215f, 0.003302f, - 0.455566f, 0.003065f, 0.440918f, 0.002844f, 0.426270f, 0.002642f, 0.411621f, 0.002451f, - 0.965820f, 0.033752f, 0.965820f, 0.033752f, 0.965820f, 0.033752f, 0.965820f, 0.033783f, - 0.965820f, 0.033783f, 0.965820f, 0.033875f, 0.965332f, 0.033905f, 0.965332f, 0.033997f, - 0.964844f, 0.034088f, 0.963867f, 0.034241f, 0.963379f, 0.034393f, 0.962402f, 0.034546f, - 0.960938f, 0.034698f, 0.958496f, 0.034851f, 0.957520f, 0.034973f, 0.954102f, 0.035034f, - 0.951172f, 0.035034f, 0.947754f, 0.034943f, 0.942871f, 0.034821f, 0.937988f, 0.034576f, - 0.932129f, 0.034180f, 0.926270f, 0.033722f, 0.918945f, 0.033142f, 0.911133f, 0.032410f, - 0.902832f, 0.031616f, 0.894531f, 0.030685f, 0.885254f, 0.029694f, 0.876465f, 0.028641f, - 0.866699f, 0.027512f, 0.856445f, 0.026337f, 0.846191f, 0.025146f, 0.835449f, 0.023926f, - 0.825195f, 0.022720f, 0.814453f, 0.021515f, 0.803711f, 0.020340f, 0.792480f, 0.019165f, - 0.781250f, 0.018051f, 0.770020f, 0.016968f, 0.758789f, 0.015915f, 0.747070f, 0.014931f, - 0.735352f, 0.013977f, 0.723145f, 0.013069f, 0.710938f, 0.012215f, 0.698730f, 0.011398f, - 0.686035f, 0.010635f, 0.673340f, 0.009918f, 0.660156f, 0.009239f, 0.646484f, 0.008598f, - 0.633301f, 0.008003f, 0.619141f, 0.007446f, 0.605469f, 0.006927f, 0.591309f, 0.006439f, - 0.576660f, 0.005985f, 0.562500f, 0.005562f, 0.547852f, 0.005165f, 0.533203f, 0.004795f, - 0.518066f, 0.004456f, 0.503418f, 0.004135f, 0.488770f, 0.003841f, 0.474121f, 0.003565f, - 0.459229f, 0.003311f, 0.444580f, 0.003073f, 0.430176f, 0.002853f, 0.415771f, 0.002647f, - 0.960449f, 0.039276f, 0.960449f, 0.039276f, 0.960449f, 0.039276f, 0.960449f, 0.039307f, - 0.960449f, 0.039337f, 0.959961f, 0.039368f, 0.959961f, 0.039429f, 0.959961f, 0.039520f, - 0.959473f, 0.039612f, 0.958984f, 0.039764f, 0.958008f, 0.039886f, 0.956543f, 0.040009f, - 0.955566f, 0.040131f, 0.953125f, 0.040253f, 0.951172f, 0.040314f, 0.948242f, 0.040283f, - 0.945801f, 0.040222f, 0.940918f, 0.040039f, 0.936523f, 0.039764f, 0.931152f, 0.039368f, - 0.926270f, 0.038879f, 0.919434f, 0.038208f, 0.913086f, 0.037445f, 0.905273f, 0.036530f, - 0.897461f, 0.035522f, 0.888184f, 0.034393f, 0.879395f, 0.033173f, 0.870117f, 0.031891f, - 0.860352f, 0.030563f, 0.850586f, 0.029190f, 0.840820f, 0.027802f, 0.830566f, 0.026398f, - 0.820312f, 0.025009f, 0.810059f, 0.023636f, 0.799805f, 0.022308f, 0.789062f, 0.020996f, - 0.778809f, 0.019730f, 0.767578f, 0.018524f, 0.756348f, 0.017365f, 0.745605f, 0.016251f, - 0.733887f, 0.015213f, 0.722656f, 0.014206f, 0.710938f, 0.013260f, 0.698730f, 0.012367f, - 0.686523f, 0.011536f, 0.673828f, 0.010742f, 0.661133f, 0.010002f, 0.647949f, 0.009308f, - 0.634766f, 0.008659f, 0.621094f, 0.008057f, 0.607422f, 0.007488f, 0.593262f, 0.006958f, - 0.579102f, 0.006466f, 0.564941f, 0.006004f, 0.550781f, 0.005577f, 0.536133f, 0.005177f, - 0.521484f, 0.004807f, 0.506836f, 0.004463f, 0.492432f, 0.004143f, 0.477783f, 0.003847f, - 0.463135f, 0.003571f, 0.448730f, 0.003315f, 0.434082f, 0.003077f, 0.419922f, 0.002857f, - 0.954102f, 0.045502f, 0.954102f, 0.045502f, 0.954102f, 0.045502f, 0.954102f, 0.045532f, - 0.954102f, 0.045563f, 0.954102f, 0.045593f, 0.953613f, 0.045654f, 0.953613f, 0.045715f, - 0.953125f, 0.045868f, 0.952148f, 0.045990f, 0.951660f, 0.046082f, 0.950195f, 0.046143f, - 0.948242f, 0.046265f, 0.946777f, 0.046265f, 0.943848f, 0.046265f, 0.941895f, 0.046204f, - 0.938477f, 0.046021f, 0.935059f, 0.045685f, 0.929199f, 0.045258f, 0.925293f, 0.044708f, - 0.919434f, 0.044006f, 0.912109f, 0.043121f, 0.905273f, 0.042145f, 0.897949f, 0.041016f, - 0.890137f, 0.039734f, 0.881348f, 0.038391f, 0.872559f, 0.036926f, 0.863770f, 0.035431f, - 0.854004f, 0.033813f, 0.844727f, 0.032227f, 0.835449f, 0.030640f, 0.825195f, 0.029037f, - 0.815430f, 0.027451f, 0.806152f, 0.025909f, 0.795898f, 0.024399f, 0.785645f, 0.022934f, - 0.775391f, 0.021530f, 0.765137f, 0.020187f, 0.754883f, 0.018890f, 0.743652f, 0.017670f, - 0.732910f, 0.016510f, 0.721680f, 0.015411f, 0.710449f, 0.014374f, 0.698730f, 0.013405f, - 0.686523f, 0.012482f, 0.674316f, 0.011620f, 0.662109f, 0.010811f, 0.649414f, 0.010063f, - 0.636230f, 0.009354f, 0.623047f, 0.008698f, 0.609375f, 0.008080f, 0.595703f, 0.007507f, - 0.582031f, 0.006973f, 0.567871f, 0.006477f, 0.553711f, 0.006016f, 0.539551f, 0.005585f, - 0.524902f, 0.005180f, 0.510254f, 0.004810f, 0.496094f, 0.004463f, 0.481689f, 0.004147f, - 0.467041f, 0.003847f, 0.452637f, 0.003571f, 0.438232f, 0.003315f, 0.424072f, 0.003077f, - 0.947266f, 0.052490f, 0.947266f, 0.052490f, 0.947266f, 0.052490f, 0.947266f, 0.052521f, - 0.947266f, 0.052551f, 0.946777f, 0.052582f, 0.946777f, 0.052612f, 0.946289f, 0.052734f, - 0.945801f, 0.052795f, 0.945312f, 0.052887f, 0.944336f, 0.052948f, 0.942871f, 0.053040f, - 0.941406f, 0.053009f, 0.939941f, 0.053009f, 0.937012f, 0.052917f, 0.934570f, 0.052704f, - 0.931641f, 0.052399f, 0.926758f, 0.051971f, 0.922852f, 0.051331f, 0.917480f, 0.050568f, - 0.911133f, 0.049622f, 0.904297f, 0.048523f, 0.898438f, 0.047272f, 0.890137f, 0.045868f, - 0.882812f, 0.044312f, 0.874512f, 0.042694f, 0.865723f, 0.040955f, 0.856934f, 0.039154f, - 0.847656f, 0.037354f, 0.838867f, 0.035522f, 0.829590f, 0.033661f, 0.820312f, 0.031830f, - 0.811035f, 0.030060f, 0.801270f, 0.028305f, 0.791992f, 0.026611f, 0.782227f, 0.024994f, - 0.772461f, 0.023422f, 0.762695f, 0.021927f, 0.752441f, 0.020508f, 0.742188f, 0.019165f, - 0.731445f, 0.017883f, 0.721191f, 0.016678f, 0.709961f, 0.015556f, 0.698730f, 0.014488f, - 0.687012f, 0.013489f, 0.675293f, 0.012550f, 0.663086f, 0.011673f, 0.650879f, 0.010849f, - 0.638184f, 0.010086f, 0.625000f, 0.009369f, 0.611816f, 0.008705f, 0.598145f, 0.008087f, - 0.584961f, 0.007511f, 0.570801f, 0.006977f, 0.556641f, 0.006474f, 0.542480f, 0.006012f, - 0.528320f, 0.005581f, 0.514160f, 0.005180f, 0.499756f, 0.004807f, 0.485596f, 0.004459f, - 0.471191f, 0.004139f, 0.456787f, 0.003843f, 0.442383f, 0.003569f, 0.428467f, 0.003313f, - 0.939453f, 0.060333f, 0.939453f, 0.060333f, 0.939453f, 0.060333f, 0.939453f, 0.060333f, - 0.939453f, 0.060394f, 0.938965f, 0.060394f, 0.938965f, 0.060455f, 0.938477f, 0.060516f, - 0.937988f, 0.060577f, 0.937500f, 0.060638f, 0.936035f, 0.060669f, 0.935547f, 0.060669f, - 0.933594f, 0.060608f, 0.931641f, 0.060516f, 0.929688f, 0.060272f, 0.927246f, 0.059967f, - 0.922363f, 0.059448f, 0.918945f, 0.058868f, 0.914062f, 0.057953f, 0.908691f, 0.056946f, - 0.902832f, 0.055786f, 0.897461f, 0.054382f, 0.890137f, 0.052826f, 0.882324f, 0.051117f, - 0.874023f, 0.049255f, 0.866211f, 0.047302f, 0.858398f, 0.045288f, 0.849609f, 0.043213f, - 0.840820f, 0.041107f, 0.832031f, 0.038971f, 0.823730f, 0.036896f, 0.814453f, 0.034821f, - 0.806152f, 0.032806f, 0.796875f, 0.030853f, 0.788086f, 0.028961f, 0.778809f, 0.027161f, - 0.769531f, 0.025421f, 0.760254f, 0.023788f, 0.750488f, 0.022217f, 0.740723f, 0.020737f, - 0.730957f, 0.019333f, 0.720703f, 0.018021f, 0.709961f, 0.016785f, 0.698730f, 0.015625f, - 0.687500f, 0.014549f, 0.676270f, 0.013535f, 0.664551f, 0.012573f, 0.652344f, 0.011688f, - 0.640137f, 0.010864f, 0.627441f, 0.010086f, 0.614258f, 0.009369f, 0.601074f, 0.008698f, - 0.587402f, 0.008080f, 0.573730f, 0.007500f, 0.560059f, 0.006962f, 0.545898f, 0.006462f, - 0.531738f, 0.006001f, 0.517578f, 0.005569f, 0.503418f, 0.005165f, 0.489502f, 0.004795f, - 0.475098f, 0.004452f, 0.460938f, 0.004131f, 0.446777f, 0.003838f, 0.432861f, 0.003563f, - 0.930664f, 0.069031f, 0.930664f, 0.069031f, 0.930664f, 0.069031f, 0.930664f, 0.069031f, - 0.930664f, 0.069092f, 0.930664f, 0.069092f, 0.930176f, 0.069214f, 0.929688f, 0.069153f, - 0.929199f, 0.069214f, 0.929199f, 0.069275f, 0.927246f, 0.069214f, 0.926758f, 0.069153f, - 0.925293f, 0.069031f, 0.923340f, 0.068787f, 0.920410f, 0.068420f, 0.917480f, 0.067932f, - 0.914551f, 0.067261f, 0.911133f, 0.066345f, 0.905273f, 0.065247f, 0.900391f, 0.063965f, - 0.894043f, 0.062469f, 0.888184f, 0.060699f, 0.880859f, 0.058807f, 0.873535f, 0.056763f, - 0.866211f, 0.054565f, 0.858887f, 0.052277f, 0.850586f, 0.049896f, 0.841797f, 0.047485f, - 0.833496f, 0.045105f, 0.825684f, 0.042664f, 0.817383f, 0.040283f, 0.809082f, 0.037964f, - 0.800781f, 0.035706f, 0.792480f, 0.033539f, 0.784180f, 0.031433f, 0.775391f, 0.029449f, - 0.766602f, 0.027542f, 0.757812f, 0.025726f, 0.748535f, 0.024017f, 0.739258f, 0.022400f, - 0.729980f, 0.020874f, 0.719727f, 0.019440f, 0.709961f, 0.018097f, 0.699219f, 0.016830f, - 0.688477f, 0.015656f, 0.677246f, 0.014557f, 0.665527f, 0.013527f, 0.653809f, 0.012573f, - 0.641602f, 0.011681f, 0.629395f, 0.010841f, 0.616699f, 0.010071f, 0.603516f, 0.009346f, - 0.590332f, 0.008682f, 0.577148f, 0.008057f, 0.563477f, 0.007481f, 0.549316f, 0.006943f, - 0.535645f, 0.006443f, 0.521484f, 0.005978f, 0.507324f, 0.005550f, 0.493408f, 0.005150f, - 0.479248f, 0.004780f, 0.465332f, 0.004436f, 0.451172f, 0.004124f, 0.437256f, 0.003828f, - 0.920898f, 0.078735f, 0.920898f, 0.078735f, 0.920898f, 0.078735f, 0.920898f, 0.078735f, - 0.920898f, 0.078796f, 0.920898f, 0.078796f, 0.920410f, 0.078796f, 0.919922f, 0.078857f, - 0.919922f, 0.078857f, 0.918945f, 0.078796f, 0.917480f, 0.078735f, 0.916992f, 0.078613f, - 0.915039f, 0.078308f, 0.913086f, 0.077942f, 0.910645f, 0.077454f, 0.908691f, 0.076660f, - 0.905273f, 0.075745f, 0.899902f, 0.074585f, 0.895996f, 0.073181f, 0.889648f, 0.071533f, - 0.883789f, 0.069641f, 0.877930f, 0.067566f, 0.872070f, 0.065247f, 0.864258f, 0.062805f, - 0.856934f, 0.060242f, 0.849121f, 0.057556f, 0.841797f, 0.054810f, 0.833984f, 0.052063f, - 0.827148f, 0.049316f, 0.818848f, 0.046570f, 0.811035f, 0.043915f, 0.803223f, 0.041290f, - 0.795898f, 0.038788f, 0.788086f, 0.036377f, 0.779785f, 0.034058f, 0.771973f, 0.031830f, - 0.763672f, 0.029755f, 0.755371f, 0.027771f, 0.747070f, 0.025894f, 0.738281f, 0.024139f, - 0.729004f, 0.022476f, 0.719238f, 0.020935f, 0.709473f, 0.019470f, 0.699707f, 0.018097f, - 0.688965f, 0.016830f, 0.678223f, 0.015640f, 0.666992f, 0.014534f, 0.655762f, 0.013496f, - 0.643555f, 0.012535f, 0.631348f, 0.011642f, 0.619141f, 0.010803f, 0.606445f, 0.010033f, - 0.593262f, 0.009308f, 0.580078f, 0.008644f, 0.566406f, 0.008018f, 0.553223f, 0.007446f, - 0.539062f, 0.006908f, 0.525391f, 0.006413f, 0.511230f, 0.005951f, 0.497559f, 0.005527f, - 0.483643f, 0.005131f, 0.469482f, 0.004765f, 0.455566f, 0.004421f, 0.441650f, 0.004108f, - 0.910156f, 0.089539f, 0.910156f, 0.089539f, 0.910156f, 0.089539f, 0.910156f, 0.089539f, - 0.910156f, 0.089539f, 0.909668f, 0.089539f, 0.909668f, 0.089539f, 0.909180f, 0.089539f, - 0.908691f, 0.089478f, 0.907715f, 0.089417f, 0.907227f, 0.089233f, 0.905762f, 0.088989f, - 0.904297f, 0.088562f, 0.902832f, 0.088013f, 0.900391f, 0.087280f, 0.896973f, 0.086243f, - 0.895020f, 0.085083f, 0.889160f, 0.083557f, 0.884766f, 0.081787f, 0.878906f, 0.079712f, - 0.874512f, 0.077393f, 0.867676f, 0.074951f, 0.860840f, 0.072205f, 0.854492f, 0.069275f, - 0.848145f, 0.066223f, 0.840820f, 0.063171f, 0.833008f, 0.060059f, 0.826172f, 0.056885f, - 0.819336f, 0.053741f, 0.812012f, 0.050690f, 0.804688f, 0.047699f, 0.797852f, 0.044800f, - 0.790527f, 0.042023f, 0.783691f, 0.039337f, 0.776367f, 0.036804f, 0.768555f, 0.034393f, - 0.761230f, 0.032074f, 0.753418f, 0.029922f, 0.745117f, 0.027893f, 0.736816f, 0.025970f, - 0.728516f, 0.024170f, 0.719238f, 0.022491f, 0.709961f, 0.020905f, 0.700195f, 0.019440f, - 0.689941f, 0.018066f, 0.679688f, 0.016785f, 0.668457f, 0.015587f, 0.657227f, 0.014473f, - 0.645996f, 0.013443f, 0.633789f, 0.012474f, 0.621582f, 0.011581f, 0.609375f, 0.010750f, - 0.596191f, 0.009972f, 0.583496f, 0.009262f, 0.569824f, 0.008591f, 0.556641f, 0.007973f, - 0.542969f, 0.007404f, 0.529297f, 0.006874f, 0.515625f, 0.006378f, 0.501465f, 0.005920f, - 0.487793f, 0.005501f, 0.474121f, 0.005108f, 0.460205f, 0.004742f, 0.446289f, 0.004406f, - 0.898438f, 0.101440f, 0.898438f, 0.101440f, 0.898438f, 0.101440f, 0.898438f, 0.101440f, - 0.897949f, 0.101440f, 0.897949f, 0.101440f, 0.897461f, 0.101440f, 0.896973f, 0.101379f, - 0.896973f, 0.101318f, 0.895996f, 0.101135f, 0.895508f, 0.100830f, 0.894043f, 0.100464f, - 0.893066f, 0.099854f, 0.890625f, 0.099121f, 0.888184f, 0.098083f, 0.885254f, 0.096802f, - 0.882324f, 0.095215f, 0.878418f, 0.093323f, 0.872559f, 0.091125f, 0.869629f, 0.088623f, - 0.862793f, 0.085815f, 0.855957f, 0.082764f, 0.850098f, 0.079590f, 0.844727f, 0.076172f, - 0.837402f, 0.072693f, 0.831055f, 0.069092f, 0.824219f, 0.065491f, 0.817871f, 0.061981f, - 0.811035f, 0.058472f, 0.804688f, 0.055023f, 0.797852f, 0.051697f, 0.791992f, 0.048492f, - 0.785645f, 0.045410f, 0.778809f, 0.042480f, 0.771973f, 0.039673f, 0.765625f, 0.037018f, - 0.758789f, 0.034515f, 0.750977f, 0.032166f, 0.743652f, 0.029968f, 0.735840f, 0.027878f, - 0.727539f, 0.025940f, 0.718750f, 0.024124f, 0.709961f, 0.022430f, 0.700684f, 0.020844f, - 0.690918f, 0.019363f, 0.680664f, 0.017975f, 0.670410f, 0.016693f, 0.659180f, 0.015495f, - 0.647949f, 0.014389f, 0.636230f, 0.013359f, 0.624512f, 0.012398f, 0.611816f, 0.011505f, - 0.599609f, 0.010681f, 0.586426f, 0.009911f, 0.573730f, 0.009201f, 0.560547f, 0.008537f, - 0.546875f, 0.007927f, 0.533203f, 0.007355f, 0.519531f, 0.006828f, 0.505859f, 0.006340f, - 0.492432f, 0.005890f, 0.478516f, 0.005470f, 0.464844f, 0.005077f, 0.450928f, 0.004719f, - 0.885254f, 0.114624f, 0.885254f, 0.114624f, 0.885254f, 0.114624f, 0.885254f, 0.114624f, - 0.884766f, 0.114624f, 0.884766f, 0.114563f, 0.884766f, 0.114502f, 0.884277f, 0.114380f, - 0.883789f, 0.114258f, 0.883301f, 0.114014f, 0.882324f, 0.113525f, 0.881348f, 0.112976f, - 0.879395f, 0.112183f, 0.877441f, 0.111145f, 0.875977f, 0.109802f, 0.872559f, 0.108215f, - 0.869141f, 0.106201f, 0.865723f, 0.103821f, 0.860352f, 0.101196f, 0.854492f, 0.098145f, - 0.850586f, 0.094849f, 0.845215f, 0.091187f, 0.838379f, 0.087463f, 0.833496f, 0.083496f, - 0.826660f, 0.079468f, 0.820801f, 0.075378f, 0.814453f, 0.071289f, 0.809082f, 0.067322f, - 0.803711f, 0.063354f, 0.797363f, 0.059540f, 0.791992f, 0.055878f, 0.786133f, 0.052338f, - 0.780762f, 0.048950f, 0.774414f, 0.045746f, 0.768555f, 0.042664f, 0.762207f, 0.039795f, - 0.755859f, 0.037079f, 0.749023f, 0.034546f, 0.741699f, 0.032135f, 0.734863f, 0.029892f, - 0.727051f, 0.027802f, 0.718750f, 0.025833f, 0.710449f, 0.024002f, 0.701172f, 0.022293f, - 0.691895f, 0.020706f, 0.682129f, 0.019226f, 0.671875f, 0.017853f, 0.661133f, 0.016571f, - 0.650391f, 0.015381f, 0.639160f, 0.014282f, 0.626953f, 0.013252f, 0.615234f, 0.012299f, - 0.602539f, 0.011414f, 0.590332f, 0.010597f, 0.577148f, 0.009834f, 0.563965f, 0.009132f, - 0.550781f, 0.008476f, 0.537598f, 0.007866f, 0.523926f, 0.007309f, 0.510254f, 0.006786f, - 0.496826f, 0.006306f, 0.483154f, 0.005856f, 0.469482f, 0.005440f, 0.455811f, 0.005054f, - 0.870605f, 0.129028f, 0.870605f, 0.129028f, 0.870605f, 0.129028f, 0.870605f, 0.129028f, - 0.870605f, 0.129028f, 0.870605f, 0.129028f, 0.870117f, 0.128906f, 0.870117f, 0.128784f, - 0.869629f, 0.128540f, 0.869141f, 0.128052f, 0.868164f, 0.127563f, 0.867188f, 0.126709f, - 0.865723f, 0.125732f, 0.863281f, 0.124329f, 0.862305f, 0.122742f, 0.858887f, 0.120544f, - 0.854980f, 0.118103f, 0.850098f, 0.115173f, 0.847168f, 0.111938f, 0.843750f, 0.108276f, - 0.836426f, 0.104309f, 0.832031f, 0.100159f, 0.827148f, 0.095764f, 0.821289f, 0.091187f, - 0.815918f, 0.086609f, 0.810547f, 0.081970f, 0.806152f, 0.077393f, 0.800781f, 0.072937f, - 0.795410f, 0.068542f, 0.790039f, 0.064270f, 0.785645f, 0.060242f, 0.780762f, 0.056335f, - 0.775391f, 0.052643f, 0.770020f, 0.049133f, 0.765137f, 0.045807f, 0.759766f, 0.042694f, - 0.753906f, 0.039734f, 0.747559f, 0.036987f, 0.740723f, 0.034393f, 0.733887f, 0.031982f, - 0.726562f, 0.029739f, 0.719238f, 0.027618f, 0.710449f, 0.025650f, 0.702148f, 0.023834f, - 0.692871f, 0.022125f, 0.683594f, 0.020538f, 0.673828f, 0.019058f, 0.663574f, 0.017685f, - 0.652832f, 0.016418f, 0.641602f, 0.015244f, 0.629883f, 0.014153f, 0.618164f, 0.013138f, - 0.605957f, 0.012192f, 0.593750f, 0.011314f, 0.581055f, 0.010506f, 0.567871f, 0.009750f, - 0.555176f, 0.009056f, 0.541504f, 0.008408f, 0.528320f, 0.007809f, 0.514648f, 0.007252f, - 0.501465f, 0.006741f, 0.487793f, 0.006260f, 0.474365f, 0.005817f, 0.460938f, 0.005409f, - 0.854492f, 0.145020f, 0.854492f, 0.145020f, 0.854492f, 0.145020f, 0.854492f, 0.145020f, - 0.854492f, 0.144897f, 0.854492f, 0.144897f, 0.854004f, 0.144653f, 0.854492f, 0.144531f, - 0.854004f, 0.144165f, 0.853027f, 0.143555f, 0.852051f, 0.142822f, 0.851074f, 0.141724f, - 0.850586f, 0.140503f, 0.848145f, 0.138672f, 0.846191f, 0.136475f, 0.843262f, 0.133911f, - 0.839844f, 0.130859f, 0.835449f, 0.127319f, 0.832031f, 0.123474f, 0.828613f, 0.119141f, - 0.823242f, 0.114502f, 0.819824f, 0.109558f, 0.813477f, 0.104431f, 0.809570f, 0.099304f, - 0.804199f, 0.094055f, 0.799316f, 0.088867f, 0.794922f, 0.083740f, 0.791992f, 0.078735f, - 0.786621f, 0.073914f, 0.783203f, 0.069214f, 0.779297f, 0.064758f, 0.774902f, 0.060516f, - 0.770508f, 0.056488f, 0.765625f, 0.052673f, 0.761230f, 0.049072f, 0.756348f, 0.045715f, - 0.750977f, 0.042511f, 0.745605f, 0.039551f, 0.739746f, 0.036774f, 0.733398f, 0.034180f, - 0.726562f, 0.031738f, 0.719238f, 0.029495f, 0.711426f, 0.027390f, 0.703125f, 0.025421f, - 0.694336f, 0.023605f, 0.685059f, 0.021912f, 0.675781f, 0.020340f, 0.665527f, 0.018875f, - 0.655273f, 0.017517f, 0.644043f, 0.016251f, 0.632812f, 0.015091f, 0.621582f, 0.014008f, - 0.609375f, 0.013000f, 0.597168f, 0.012070f, 0.584473f, 0.011200f, 0.571777f, 0.010406f, - 0.559082f, 0.009659f, 0.545898f, 0.008972f, 0.532715f, 0.008339f, 0.519531f, 0.007748f, - 0.505859f, 0.007198f, 0.492676f, 0.006691f, 0.479248f, 0.006218f, 0.465820f, 0.005783f, - 0.837402f, 0.162476f, 0.837402f, 0.162476f, 0.837402f, 0.162476f, 0.837402f, 0.162354f, - 0.837402f, 0.162354f, 0.836914f, 0.162231f, 0.836914f, 0.161987f, 0.836426f, 0.161743f, - 0.836426f, 0.161133f, 0.835449f, 0.160522f, 0.835449f, 0.159546f, 0.834473f, 0.158203f, - 0.833496f, 0.156372f, 0.831055f, 0.154175f, 0.830078f, 0.151489f, 0.826660f, 0.148315f, - 0.823242f, 0.144531f, 0.821289f, 0.140381f, 0.817383f, 0.135620f, 0.812012f, 0.130615f, - 0.810547f, 0.125122f, 0.805176f, 0.119507f, 0.800293f, 0.113647f, 0.797852f, 0.107788f, - 0.792480f, 0.101868f, 0.788574f, 0.096008f, 0.785156f, 0.090332f, 0.782715f, 0.084839f, - 0.779297f, 0.079468f, 0.774902f, 0.074341f, 0.772461f, 0.069458f, 0.769531f, 0.064819f, - 0.765137f, 0.060486f, 0.761719f, 0.056366f, 0.758301f, 0.052490f, 0.753418f, 0.048828f, - 0.749023f, 0.045410f, 0.743652f, 0.042206f, 0.738770f, 0.039215f, 0.732422f, 0.036438f, - 0.726074f, 0.033844f, 0.719238f, 0.031433f, 0.711914f, 0.029190f, 0.704102f, 0.027100f, - 0.695801f, 0.025146f, 0.687012f, 0.023346f, 0.677734f, 0.021667f, 0.667969f, 0.020111f, - 0.657715f, 0.018646f, 0.646973f, 0.017319f, 0.636230f, 0.016068f, 0.624512f, 0.014923f, - 0.612793f, 0.013855f, 0.601074f, 0.012863f, 0.588379f, 0.011948f, 0.576172f, 0.011093f, - 0.563477f, 0.010300f, 0.550293f, 0.009567f, 0.537109f, 0.008896f, 0.523926f, 0.008263f, - 0.510742f, 0.007687f, 0.497559f, 0.007145f, 0.484375f, 0.006645f, 0.470947f, 0.006180f, - 0.818359f, 0.181519f, 0.818359f, 0.181519f, 0.818359f, 0.181519f, 0.817871f, 0.181519f, - 0.817871f, 0.181396f, 0.817871f, 0.181274f, 0.817871f, 0.181030f, 0.817871f, 0.180542f, - 0.817871f, 0.179932f, 0.817383f, 0.178955f, 0.816406f, 0.177612f, 0.815918f, 0.175903f, - 0.814941f, 0.173584f, 0.812500f, 0.170898f, 0.811035f, 0.167603f, 0.808594f, 0.163696f, - 0.805664f, 0.159180f, 0.802246f, 0.154175f, 0.799805f, 0.148560f, 0.796875f, 0.142700f, - 0.792480f, 0.136353f, 0.789551f, 0.129883f, 0.787598f, 0.123230f, 0.782227f, 0.116577f, - 0.780273f, 0.109985f, 0.777344f, 0.103516f, 0.774414f, 0.097168f, 0.771973f, 0.091125f, - 0.770508f, 0.085205f, 0.767578f, 0.079651f, 0.765625f, 0.074341f, 0.763184f, 0.069336f, - 0.760254f, 0.064636f, 0.757812f, 0.060181f, 0.754395f, 0.056000f, 0.750977f, 0.052063f, - 0.747559f, 0.048431f, 0.742188f, 0.044983f, 0.737793f, 0.041779f, 0.732422f, 0.038818f, - 0.726074f, 0.036041f, 0.719727f, 0.033447f, 0.712891f, 0.031052f, 0.705566f, 0.028824f, - 0.697266f, 0.026749f, 0.688965f, 0.024826f, 0.679688f, 0.023041f, 0.670410f, 0.021393f, - 0.660645f, 0.019852f, 0.649902f, 0.018433f, 0.639160f, 0.017105f, 0.627930f, 0.015869f, - 0.616211f, 0.014748f, 0.604492f, 0.013687f, 0.592773f, 0.012718f, 0.580078f, 0.011818f, - 0.567871f, 0.010979f, 0.554688f, 0.010201f, 0.541992f, 0.009483f, 0.528809f, 0.008812f, - 0.515625f, 0.008194f, 0.502441f, 0.007626f, 0.489502f, 0.007088f, 0.476318f, 0.006599f, - 0.797363f, 0.202393f, 0.797363f, 0.202393f, 0.797363f, 0.202393f, 0.797363f, 0.202393f, - 0.797363f, 0.202148f, 0.797363f, 0.202026f, 0.797363f, 0.201660f, 0.797363f, 0.201050f, - 0.796875f, 0.200195f, 0.796875f, 0.198975f, 0.796387f, 0.197266f, 0.795898f, 0.195068f, - 0.794922f, 0.192261f, 0.792969f, 0.188843f, 0.792480f, 0.184937f, 0.789551f, 0.180298f, - 0.787598f, 0.174927f, 0.785645f, 0.168823f, 0.782715f, 0.162231f, 0.779297f, 0.155273f, - 0.775879f, 0.148071f, 0.775391f, 0.140747f, 0.772461f, 0.133179f, 0.770508f, 0.125732f, - 0.767578f, 0.118347f, 0.766113f, 0.111206f, 0.764648f, 0.104248f, 0.763184f, 0.097595f, - 0.762695f, 0.091187f, 0.761719f, 0.085144f, 0.759277f, 0.079407f, 0.758301f, 0.073975f, - 0.755859f, 0.068909f, 0.754395f, 0.064087f, 0.751465f, 0.059631f, 0.748535f, 0.055450f, - 0.745117f, 0.051514f, 0.741211f, 0.047852f, 0.737305f, 0.044434f, 0.731934f, 0.041260f, - 0.726562f, 0.038300f, 0.720215f, 0.035553f, 0.713867f, 0.032990f, 0.706543f, 0.030624f, - 0.699219f, 0.028427f, 0.690918f, 0.026382f, 0.682129f, 0.024475f, 0.672852f, 0.022720f, - 0.663086f, 0.021088f, 0.652832f, 0.019577f, 0.642578f, 0.018173f, 0.631348f, 0.016876f, - 0.620117f, 0.015671f, 0.608398f, 0.014565f, 0.596680f, 0.013535f, 0.584473f, 0.012573f, - 0.572266f, 0.011681f, 0.559570f, 0.010857f, 0.546875f, 0.010101f, 0.533691f, 0.009392f, - 0.520996f, 0.008736f, 0.507812f, 0.008125f, 0.494629f, 0.007565f, 0.481689f, 0.007042f, - 0.774414f, 0.225098f, 0.774414f, 0.225098f, 0.774414f, 0.225098f, 0.774414f, 0.225098f, - 0.774414f, 0.224854f, 0.774902f, 0.224609f, 0.774414f, 0.224121f, 0.774414f, 0.223389f, - 0.774414f, 0.222290f, 0.773926f, 0.220581f, 0.773926f, 0.218628f, 0.773926f, 0.215942f, - 0.773438f, 0.212524f, 0.772461f, 0.208374f, 0.771484f, 0.203491f, 0.770508f, 0.197754f, - 0.769043f, 0.191284f, 0.766113f, 0.184204f, 0.763672f, 0.176514f, 0.760742f, 0.168457f, - 0.760742f, 0.160278f, 0.757812f, 0.151855f, 0.757812f, 0.143433f, 0.756836f, 0.135132f, - 0.754395f, 0.126953f, 0.755371f, 0.119141f, 0.755371f, 0.111511f, 0.754395f, 0.104309f, - 0.753418f, 0.097351f, 0.754395f, 0.090820f, 0.753906f, 0.084595f, 0.752441f, 0.078796f, - 0.751465f, 0.073303f, 0.750000f, 0.068176f, 0.748535f, 0.063354f, 0.746094f, 0.058899f, - 0.743164f, 0.054718f, 0.740234f, 0.050812f, 0.736816f, 0.047150f, 0.731934f, 0.043793f, - 0.727051f, 0.040649f, 0.721191f, 0.037720f, 0.714844f, 0.035004f, 0.708008f, 0.032501f, - 0.700684f, 0.030167f, 0.692871f, 0.027985f, 0.684570f, 0.025986f, 0.675781f, 0.024124f, - 0.666016f, 0.022385f, 0.656250f, 0.020782f, 0.645996f, 0.019302f, 0.635254f, 0.017929f, - 0.624023f, 0.016647f, 0.612793f, 0.015480f, 0.601074f, 0.014381f, 0.588867f, 0.013367f, - 0.576660f, 0.012428f, 0.563965f, 0.011559f, 0.551270f, 0.010750f, 0.539062f, 0.010002f, - 0.525879f, 0.009308f, 0.513184f, 0.008659f, 0.500000f, 0.008064f, 0.487061f, 0.007511f, - 0.750000f, 0.249878f, 0.749512f, 0.249878f, 0.750000f, 0.249878f, 0.750000f, 0.249756f, - 0.750000f, 0.249512f, 0.750000f, 0.249146f, 0.750000f, 0.248413f, 0.750488f, 0.247559f, - 0.750488f, 0.246094f, 0.750488f, 0.244141f, 0.750488f, 0.241577f, 0.750488f, 0.238281f, - 0.748535f, 0.234009f, 0.749512f, 0.229004f, 0.749023f, 0.223022f, 0.747070f, 0.216309f, - 0.745117f, 0.208496f, 0.743164f, 0.200195f, 0.744629f, 0.191406f, 0.741211f, 0.182251f, - 0.741699f, 0.172852f, 0.740234f, 0.163330f, 0.742676f, 0.154053f, 0.741211f, 0.144775f, - 0.743652f, 0.135864f, 0.744629f, 0.127197f, 0.743164f, 0.118958f, 0.744629f, 0.111145f, - 0.745605f, 0.103638f, 0.746582f, 0.096558f, 0.748047f, 0.089966f, 0.747559f, 0.083679f, - 0.747559f, 0.077820f, 0.746582f, 0.072327f, 0.745605f, 0.067261f, 0.744629f, 0.062469f, - 0.742676f, 0.058014f, 0.739746f, 0.053864f, 0.735840f, 0.049988f, 0.731934f, 0.046417f, - 0.727539f, 0.043091f, 0.722168f, 0.039978f, 0.716309f, 0.037079f, 0.709473f, 0.034424f, - 0.702637f, 0.031952f, 0.695312f, 0.029663f, 0.687012f, 0.027542f, 0.678223f, 0.025558f, - 0.668945f, 0.023743f, 0.659180f, 0.022049f, 0.649414f, 0.020477f, 0.638672f, 0.019028f, - 0.627930f, 0.017670f, 0.616699f, 0.016434f, 0.604980f, 0.015274f, 0.593262f, 0.014198f, - 0.581055f, 0.013206f, 0.568848f, 0.012283f, 0.556641f, 0.011429f, 0.543945f, 0.010643f, - 0.531250f, 0.009903f, 0.518066f, 0.009224f, 0.505371f, 0.008591f, 0.492676f, 0.008003f, - 0.723145f, 0.276611f, 0.723145f, 0.276611f, 0.723145f, 0.276611f, 0.723145f, 0.276611f, - 0.723145f, 0.276123f, 0.723145f, 0.275635f, 0.723145f, 0.274902f, 0.723633f, 0.273682f, - 0.723633f, 0.271973f, 0.724121f, 0.269531f, 0.724609f, 0.266113f, 0.725098f, 0.262207f, - 0.725098f, 0.257080f, 0.724609f, 0.250732f, 0.722656f, 0.243652f, 0.725586f, 0.235474f, - 0.724121f, 0.226685f, 0.723145f, 0.216919f, 0.722656f, 0.206787f, 0.720703f, 0.196289f, - 0.723145f, 0.185791f, 0.723633f, 0.175171f, 0.724121f, 0.164795f, 0.728027f, 0.154663f, - 0.730469f, 0.144897f, 0.731934f, 0.135498f, 0.734863f, 0.126587f, 0.737305f, 0.118103f, - 0.739258f, 0.110107f, 0.739746f, 0.102478f, 0.741699f, 0.095398f, 0.743164f, 0.088745f, - 0.743652f, 0.082520f, 0.743652f, 0.076660f, 0.743652f, 0.071228f, 0.742676f, 0.066101f, - 0.741211f, 0.061401f, 0.739258f, 0.057007f, 0.735840f, 0.052887f, 0.732422f, 0.049103f, - 0.728516f, 0.045563f, 0.723145f, 0.042297f, 0.717773f, 0.039246f, 0.711914f, 0.036438f, - 0.704590f, 0.033813f, 0.697754f, 0.031403f, 0.689453f, 0.029160f, 0.681152f, 0.027069f, - 0.671875f, 0.025146f, 0.662598f, 0.023346f, 0.652832f, 0.021698f, 0.642578f, 0.020157f, - 0.631836f, 0.018738f, 0.621094f, 0.017426f, 0.609375f, 0.016205f, 0.597656f, 0.015076f, - 0.585938f, 0.014023f, 0.573730f, 0.013054f, 0.561523f, 0.012146f, 0.548828f, 0.011314f, - 0.536621f, 0.010536f, 0.523926f, 0.009811f, 0.511230f, 0.009148f, 0.498291f, 0.008530f, - 0.693848f, 0.305664f, 0.693848f, 0.305664f, 0.693848f, 0.305664f, 0.693848f, 0.305664f, - 0.693848f, 0.305176f, 0.694336f, 0.304443f, 0.694824f, 0.303467f, 0.695312f, 0.302002f, - 0.695312f, 0.299561f, 0.696289f, 0.296631f, 0.696777f, 0.292725f, 0.696777f, 0.287598f, - 0.697754f, 0.281250f, 0.698242f, 0.273926f, 0.698730f, 0.265137f, 0.697266f, 0.255615f, - 0.699707f, 0.245239f, 0.699707f, 0.234131f, 0.700195f, 0.222412f, 0.702637f, 0.210693f, - 0.705078f, 0.198853f, 0.708496f, 0.187134f, 0.708984f, 0.175781f, 0.715332f, 0.164673f, - 0.718750f, 0.154053f, 0.722168f, 0.143921f, 0.724121f, 0.134277f, 0.727539f, 0.125244f, - 0.731934f, 0.116638f, 0.733398f, 0.108582f, 0.736816f, 0.101013f, 0.738281f, 0.093872f, - 0.740234f, 0.087219f, 0.741699f, 0.081055f, 0.741211f, 0.075256f, 0.741211f, 0.069885f, - 0.740723f, 0.064880f, 0.738281f, 0.060211f, 0.736328f, 0.055908f, 0.732910f, 0.051849f, - 0.729004f, 0.048157f, 0.724609f, 0.044678f, 0.719727f, 0.041473f, 0.713379f, 0.038483f, - 0.707031f, 0.035736f, 0.699707f, 0.033173f, 0.692383f, 0.030823f, 0.684082f, 0.028625f, - 0.675293f, 0.026596f, 0.666016f, 0.024704f, 0.656738f, 0.022964f, 0.646484f, 0.021347f, - 0.636230f, 0.019852f, 0.625488f, 0.018463f, 0.614258f, 0.017181f, 0.602539f, 0.015976f, - 0.590820f, 0.014877f, 0.578613f, 0.013855f, 0.566895f, 0.012901f, 0.554688f, 0.012024f, - 0.541992f, 0.011200f, 0.529297f, 0.010437f, 0.516602f, 0.009735f, 0.503906f, 0.009079f, - 0.662598f, 0.337158f, 0.662598f, 0.337158f, 0.662598f, 0.337158f, 0.662598f, 0.336914f, - 0.662598f, 0.336670f, 0.663086f, 0.335938f, 0.663086f, 0.334473f, 0.664062f, 0.332520f, - 0.665039f, 0.329834f, 0.666016f, 0.325928f, 0.665527f, 0.320801f, 0.667969f, 0.314697f, - 0.667480f, 0.306885f, 0.669922f, 0.298096f, 0.669434f, 0.287842f, 0.671387f, 0.276367f, - 0.675781f, 0.264404f, 0.675781f, 0.251465f, 0.677734f, 0.238403f, 0.681152f, 0.225342f, - 0.686035f, 0.212036f, 0.690430f, 0.199219f, 0.694824f, 0.186768f, 0.700684f, 0.174805f, - 0.702637f, 0.163330f, 0.708008f, 0.152466f, 0.714844f, 0.142212f, 0.718750f, 0.132446f, - 0.724609f, 0.123291f, 0.728516f, 0.114685f, 0.731445f, 0.106628f, 0.734375f, 0.099121f, - 0.736816f, 0.092102f, 0.738770f, 0.085510f, 0.740723f, 0.079407f, 0.740234f, 0.073730f, - 0.739258f, 0.068420f, 0.738770f, 0.063538f, 0.736328f, 0.058960f, 0.734375f, 0.054718f, - 0.730469f, 0.050781f, 0.726562f, 0.047150f, 0.721191f, 0.043762f, 0.715332f, 0.040619f, - 0.709473f, 0.037720f, 0.702637f, 0.035034f, 0.695312f, 0.032532f, 0.687500f, 0.030243f, - 0.678711f, 0.028107f, 0.669922f, 0.026123f, 0.660645f, 0.024277f, 0.650391f, 0.022583f, - 0.640137f, 0.021011f, 0.629395f, 0.019547f, 0.618652f, 0.018188f, 0.607422f, 0.016937f, - 0.595703f, 0.015778f, 0.583984f, 0.014694f, 0.572266f, 0.013695f, 0.560059f, 0.012764f, - 0.547852f, 0.011902f, 0.535156f, 0.011101f, 0.522461f, 0.010353f, 0.510254f, 0.009666f, - 0.628418f, 0.371338f, 0.628418f, 0.371338f, 0.628418f, 0.371094f, 0.628418f, 0.371094f, - 0.628418f, 0.370361f, 0.629395f, 0.369385f, 0.629883f, 0.367920f, 0.630859f, 0.365234f, - 0.631836f, 0.361816f, 0.633301f, 0.357178f, 0.634766f, 0.350830f, 0.635742f, 0.343262f, - 0.638184f, 0.333984f, 0.640137f, 0.322998f, 0.641113f, 0.311035f, 0.645508f, 0.297852f, - 0.647949f, 0.283691f, 0.652344f, 0.269043f, 0.657227f, 0.254395f, 0.662598f, 0.239868f, - 0.669922f, 0.225464f, 0.673340f, 0.211426f, 0.680664f, 0.197876f, 0.685547f, 0.184937f, - 0.693359f, 0.172729f, 0.700684f, 0.161011f, 0.705566f, 0.150146f, 0.711426f, 0.139771f, - 0.718750f, 0.130005f, 0.722168f, 0.120911f, 0.727051f, 0.112427f, 0.732422f, 0.104431f, - 0.733887f, 0.097046f, 0.737305f, 0.090088f, 0.738770f, 0.083618f, 0.740234f, 0.077637f, - 0.739258f, 0.072083f, 0.738281f, 0.066895f, 0.736816f, 0.062073f, 0.734375f, 0.057648f, - 0.731934f, 0.053497f, 0.728027f, 0.049683f, 0.723145f, 0.046112f, 0.717773f, 0.042816f, - 0.712402f, 0.039764f, 0.705566f, 0.036957f, 0.698242f, 0.034332f, 0.690430f, 0.031891f, - 0.682617f, 0.029663f, 0.673340f, 0.027573f, 0.664551f, 0.025650f, 0.654785f, 0.023865f, - 0.644531f, 0.022202f, 0.634277f, 0.020676f, 0.623535f, 0.019257f, 0.612305f, 0.017929f, - 0.601074f, 0.016708f, 0.589355f, 0.015579f, 0.577637f, 0.014526f, 0.565430f, 0.013550f, - 0.553223f, 0.012642f, 0.541016f, 0.011787f, 0.528809f, 0.011009f, 0.516113f, 0.010277f, - 0.591309f, 0.407959f, 0.591797f, 0.407959f, 0.591797f, 0.407959f, 0.591797f, 0.407471f, - 0.592285f, 0.406982f, 0.592773f, 0.405762f, 0.593750f, 0.403564f, 0.594727f, 0.400391f, - 0.596680f, 0.396240f, 0.598145f, 0.390137f, 0.600098f, 0.382568f, 0.602539f, 0.373047f, - 0.604980f, 0.361816f, 0.606934f, 0.348877f, 0.611816f, 0.334473f, 0.616699f, 0.319336f, - 0.620605f, 0.302979f, 0.627930f, 0.286865f, 0.634277f, 0.270508f, 0.638672f, 0.254150f, - 0.647949f, 0.238525f, 0.654297f, 0.223389f, 0.663086f, 0.208862f, 0.673828f, 0.195068f, - 0.680176f, 0.182007f, 0.689941f, 0.169678f, 0.696289f, 0.157959f, 0.705078f, 0.147095f, - 0.713867f, 0.136841f, 0.719727f, 0.127197f, 0.724121f, 0.118225f, 0.729980f, 0.109863f, - 0.731934f, 0.101990f, 0.735840f, 0.094727f, 0.737305f, 0.087952f, 0.738770f, 0.081604f, - 0.740234f, 0.075745f, 0.739258f, 0.070312f, 0.738281f, 0.065247f, 0.735840f, 0.060608f, - 0.733398f, 0.056274f, 0.729492f, 0.052246f, 0.725098f, 0.048523f, 0.720703f, 0.045074f, - 0.714355f, 0.041870f, 0.708496f, 0.038910f, 0.701660f, 0.036163f, 0.693848f, 0.033630f, - 0.686035f, 0.031281f, 0.677734f, 0.029099f, 0.668457f, 0.027069f, 0.659180f, 0.025192f, - 0.648926f, 0.023453f, 0.639160f, 0.021851f, 0.628418f, 0.020355f, 0.617676f, 0.018967f, - 0.605957f, 0.017685f, 0.594727f, 0.016495f, 0.583008f, 0.015388f, 0.571289f, 0.014366f, - 0.559570f, 0.013412f, 0.546875f, 0.012520f, 0.534668f, 0.011696f, 0.522461f, 0.010925f, - 0.551758f, 0.447754f, 0.551758f, 0.447754f, 0.552246f, 0.447510f, 0.552246f, 0.447266f, - 0.552734f, 0.446289f, 0.553223f, 0.444580f, 0.555176f, 0.441895f, 0.556152f, 0.438232f, - 0.558594f, 0.432617f, 0.561035f, 0.425049f, 0.563477f, 0.415527f, 0.566406f, 0.404053f, - 0.570312f, 0.390381f, 0.575195f, 0.375000f, 0.578613f, 0.358154f, 0.584473f, 0.340332f, - 0.593750f, 0.322266f, 0.600098f, 0.303955f, 0.611328f, 0.286133f, 0.617676f, 0.268555f, - 0.629395f, 0.251709f, 0.640625f, 0.235352f, 0.649902f, 0.219849f, 0.661621f, 0.205078f, - 0.671387f, 0.191284f, 0.678711f, 0.178223f, 0.688965f, 0.166016f, 0.699707f, 0.154419f, - 0.707031f, 0.143555f, 0.714844f, 0.133545f, 0.719727f, 0.124084f, 0.726074f, 0.115295f, - 0.731445f, 0.107056f, 0.734863f, 0.099365f, 0.737305f, 0.092285f, 0.739258f, 0.085632f, - 0.740234f, 0.079529f, 0.739746f, 0.073792f, 0.739258f, 0.068542f, 0.737793f, 0.063599f, - 0.734863f, 0.059082f, 0.731934f, 0.054871f, 0.727539f, 0.050964f, 0.723633f, 0.047394f, - 0.717773f, 0.044006f, 0.711426f, 0.040924f, 0.705078f, 0.038055f, 0.697754f, 0.035400f, - 0.689941f, 0.032928f, 0.681641f, 0.030655f, 0.672852f, 0.028534f, 0.663574f, 0.026581f, - 0.653809f, 0.024750f, 0.644043f, 0.023071f, 0.633301f, 0.021515f, 0.622559f, 0.020050f, - 0.611328f, 0.018707f, 0.600098f, 0.017456f, 0.588867f, 0.016296f, 0.577148f, 0.015221f, - 0.565430f, 0.014221f, 0.553223f, 0.013290f, 0.541504f, 0.012421f, 0.528809f, 0.011620f, - 0.509277f, 0.490234f, 0.509277f, 0.490234f, 0.509277f, 0.489990f, 0.509766f, 0.489502f, - 0.510254f, 0.488525f, 0.511230f, 0.486328f, 0.512695f, 0.482910f, 0.514160f, 0.478027f, - 0.517578f, 0.470947f, 0.520996f, 0.461670f, 0.523926f, 0.449707f, 0.528809f, 0.435303f, - 0.534180f, 0.418945f, 0.540527f, 0.400635f, 0.548340f, 0.381348f, 0.554688f, 0.361328f, - 0.566895f, 0.340820f, 0.577637f, 0.320801f, 0.588867f, 0.301270f, 0.601074f, 0.282471f, - 0.610352f, 0.264404f, 0.624023f, 0.247070f, 0.637207f, 0.230591f, 0.649414f, 0.215210f, - 0.662109f, 0.200562f, 0.672852f, 0.186768f, 0.685547f, 0.173828f, 0.693359f, 0.161743f, - 0.702148f, 0.150391f, 0.711426f, 0.139771f, 0.720703f, 0.129883f, 0.726074f, 0.120667f, - 0.730469f, 0.112061f, 0.733887f, 0.104065f, 0.738281f, 0.096619f, 0.739258f, 0.089722f, - 0.740234f, 0.083252f, 0.741699f, 0.077332f, 0.740723f, 0.071777f, 0.739258f, 0.066711f, - 0.736816f, 0.061951f, 0.734375f, 0.057556f, 0.730469f, 0.053497f, 0.726074f, 0.049713f, - 0.720703f, 0.046234f, 0.714844f, 0.042999f, 0.708496f, 0.039978f, 0.701172f, 0.037231f, - 0.693848f, 0.034637f, 0.685547f, 0.032257f, 0.677246f, 0.030060f, 0.667969f, 0.028000f, - 0.658691f, 0.026108f, 0.648926f, 0.024338f, 0.638672f, 0.022705f, 0.627930f, 0.021194f, - 0.617188f, 0.019775f, 0.605957f, 0.018463f, 0.594727f, 0.017258f, 0.583008f, 0.016129f, - 0.571289f, 0.015076f, 0.559570f, 0.014099f, 0.547852f, 0.013191f, 0.535645f, 0.012337f, - 0.463623f, 0.536133f, 0.463623f, 0.536133f, 0.463867f, 0.535645f, 0.464111f, 0.535156f, - 0.465088f, 0.533691f, 0.466064f, 0.530762f, 0.468506f, 0.526367f, 0.471191f, 0.520020f, - 0.474609f, 0.511230f, 0.478516f, 0.499268f, 0.483643f, 0.484375f, 0.489990f, 0.466797f, - 0.495361f, 0.447266f, 0.502441f, 0.425537f, 0.515137f, 0.403564f, 0.526855f, 0.380859f, - 0.540039f, 0.358887f, 0.553711f, 0.336914f, 0.564453f, 0.315918f, 0.587891f, 0.295898f, - 0.600098f, 0.276611f, 0.610840f, 0.258545f, 0.624512f, 0.241211f, 0.641113f, 0.225098f, - 0.657715f, 0.209717f, 0.668457f, 0.195312f, 0.678223f, 0.181763f, 0.687988f, 0.169067f, - 0.701172f, 0.157104f, 0.707031f, 0.146118f, 0.715332f, 0.135620f, 0.723145f, 0.125977f, - 0.728516f, 0.117126f, 0.734375f, 0.108704f, 0.736328f, 0.100952f, 0.739746f, 0.093750f, - 0.741699f, 0.087036f, 0.742188f, 0.080872f, 0.741699f, 0.075134f, 0.741211f, 0.069763f, - 0.739258f, 0.064819f, 0.736816f, 0.060272f, 0.733398f, 0.056030f, 0.729004f, 0.052124f, - 0.724121f, 0.048492f, 0.718750f, 0.045105f, 0.712402f, 0.041992f, 0.705078f, 0.039093f, - 0.698242f, 0.036407f, 0.689941f, 0.033905f, 0.681641f, 0.031616f, 0.672852f, 0.029480f, - 0.663574f, 0.027512f, 0.653809f, 0.025665f, 0.644043f, 0.023956f, 0.633301f, 0.022369f, - 0.622559f, 0.020889f, 0.611816f, 0.019516f, 0.601074f, 0.018250f, 0.589355f, 0.017059f, - 0.578125f, 0.015961f, 0.565918f, 0.014946f, 0.554199f, 0.013992f, 0.542480f, 0.013107f, - 0.414551f, 0.584961f, 0.414551f, 0.584961f, 0.414795f, 0.584961f, 0.415039f, 0.583984f, - 0.416260f, 0.582031f, 0.418457f, 0.578613f, 0.420166f, 0.572754f, 0.424072f, 0.563965f, - 0.428467f, 0.552246f, 0.433838f, 0.537109f, 0.441162f, 0.518066f, 0.448730f, 0.497070f, - 0.458984f, 0.473633f, 0.467773f, 0.449219f, 0.480713f, 0.424072f, 0.497559f, 0.399414f, - 0.511719f, 0.375244f, 0.529297f, 0.352051f, 0.543945f, 0.329834f, 0.566895f, 0.308838f, - 0.581543f, 0.288574f, 0.598633f, 0.269531f, 0.619629f, 0.251465f, 0.635742f, 0.234497f, - 0.646973f, 0.218506f, 0.659668f, 0.203369f, 0.674805f, 0.189331f, 0.684570f, 0.176025f, - 0.695801f, 0.163696f, 0.707031f, 0.152222f, 0.718750f, 0.141357f, 0.723145f, 0.131348f, - 0.729004f, 0.122009f, 0.734375f, 0.113342f, 0.738281f, 0.105286f, 0.741211f, 0.097778f, - 0.743164f, 0.090820f, 0.744629f, 0.084412f, 0.744629f, 0.078430f, 0.743652f, 0.072876f, - 0.742676f, 0.067749f, 0.739746f, 0.062988f, 0.735840f, 0.058624f, 0.731934f, 0.054535f, - 0.727539f, 0.050751f, 0.721680f, 0.047241f, 0.715820f, 0.044006f, 0.709473f, 0.040985f, - 0.702148f, 0.038208f, 0.694824f, 0.035614f, 0.686523f, 0.033234f, 0.677734f, 0.031006f, - 0.668457f, 0.028946f, 0.659180f, 0.027023f, 0.649414f, 0.025238f, 0.639160f, 0.023590f, - 0.628906f, 0.022049f, 0.618164f, 0.020630f, 0.606934f, 0.019287f, 0.595703f, 0.018051f, - 0.584473f, 0.016907f, 0.572754f, 0.015839f, 0.561035f, 0.014839f, 0.549316f, 0.013908f, - 0.361816f, 0.637695f, 0.361816f, 0.637695f, 0.362061f, 0.637207f, 0.362793f, 0.636230f, - 0.364258f, 0.633301f, 0.366455f, 0.628906f, 0.369873f, 0.621094f, 0.374512f, 0.609375f, - 0.378906f, 0.593750f, 0.387451f, 0.573730f, 0.396484f, 0.550293f, 0.407471f, 0.524414f, - 0.419189f, 0.497314f, 0.433594f, 0.469971f, 0.453613f, 0.442627f, 0.473633f, 0.416016f, - 0.488037f, 0.390381f, 0.509277f, 0.365967f, 0.528809f, 0.343262f, 0.549805f, 0.320801f, - 0.574707f, 0.299805f, 0.590332f, 0.280029f, 0.609375f, 0.261475f, 0.631836f, 0.243774f, - 0.641602f, 0.227173f, 0.659668f, 0.211426f, 0.671387f, 0.196777f, 0.685059f, 0.183105f, - 0.698730f, 0.170166f, 0.705078f, 0.158203f, 0.715820f, 0.146973f, 0.723145f, 0.136597f, - 0.730469f, 0.126831f, 0.737793f, 0.117920f, 0.740723f, 0.109558f, 0.741699f, 0.101807f, - 0.745117f, 0.094604f, 0.747559f, 0.087891f, 0.747070f, 0.081726f, 0.747070f, 0.075989f, - 0.744141f, 0.070679f, 0.742676f, 0.065796f, 0.739258f, 0.061218f, 0.735840f, 0.056976f, - 0.730957f, 0.053070f, 0.725586f, 0.049438f, 0.719727f, 0.046082f, 0.713867f, 0.042938f, - 0.706543f, 0.040070f, 0.699219f, 0.037384f, 0.690918f, 0.034882f, 0.682617f, 0.032562f, - 0.673828f, 0.030426f, 0.664551f, 0.028442f, 0.654785f, 0.026581f, 0.645020f, 0.024857f, - 0.634766f, 0.023254f, 0.624023f, 0.021774f, 0.613281f, 0.020386f, 0.602051f, 0.019089f, - 0.590820f, 0.017899f, 0.579590f, 0.016769f, 0.567871f, 0.015732f, 0.556641f, 0.014755f, - 0.305420f, 0.694336f, 0.305420f, 0.694336f, 0.305664f, 0.693848f, 0.306641f, 0.691895f, - 0.308105f, 0.687988f, 0.311279f, 0.681152f, 0.316162f, 0.669922f, 0.321777f, 0.654297f, - 0.330078f, 0.632812f, 0.344238f, 0.606934f, 0.353027f, 0.578125f, 0.367432f, 0.547852f, - 0.385498f, 0.517578f, 0.405273f, 0.487793f, 0.422852f, 0.458496f, 0.448730f, 0.431152f, - 0.473633f, 0.404541f, 0.493896f, 0.379639f, 0.519531f, 0.355469f, 0.539551f, 0.332520f, - 0.563477f, 0.310791f, 0.583008f, 0.290283f, 0.604004f, 0.270752f, 0.626953f, 0.252686f, - 0.642090f, 0.235352f, 0.657715f, 0.218994f, 0.672852f, 0.203857f, 0.686523f, 0.189575f, - 0.699219f, 0.176270f, 0.707031f, 0.163818f, 0.717285f, 0.152344f, 0.723633f, 0.141602f, - 0.730469f, 0.131592f, 0.739258f, 0.122375f, 0.741699f, 0.113708f, 0.745605f, 0.105713f, - 0.747559f, 0.098267f, 0.748047f, 0.091370f, 0.749023f, 0.085022f, 0.748535f, 0.079102f, - 0.747070f, 0.073608f, 0.746582f, 0.068542f, 0.742188f, 0.063843f, 0.739258f, 0.059448f, - 0.734375f, 0.055420f, 0.730469f, 0.051666f, 0.724609f, 0.048187f, 0.717773f, 0.044952f, - 0.710938f, 0.041962f, 0.704102f, 0.039154f, 0.695801f, 0.036591f, 0.687988f, 0.034180f, - 0.679199f, 0.031952f, 0.670410f, 0.029892f, 0.660645f, 0.027969f, 0.650879f, 0.026184f, - 0.640625f, 0.024521f, 0.630371f, 0.022964f, 0.619629f, 0.021515f, 0.608887f, 0.020172f, - 0.598145f, 0.018921f, 0.586914f, 0.017761f, 0.575195f, 0.016663f, 0.563965f, 0.015656f, - 0.244995f, 0.754395f, 0.245117f, 0.754395f, 0.245483f, 0.753418f, 0.246704f, 0.750977f, - 0.249634f, 0.745117f, 0.253662f, 0.734863f, 0.260010f, 0.717773f, 0.268555f, 0.694336f, - 0.277344f, 0.665527f, 0.292480f, 0.632812f, 0.309814f, 0.599121f, 0.331787f, 0.565918f, - 0.352539f, 0.533203f, 0.376465f, 0.501953f, 0.405518f, 0.472412f, 0.433838f, 0.444336f, - 0.456787f, 0.417236f, 0.488281f, 0.391357f, 0.510254f, 0.366211f, 0.540039f, 0.343018f, - 0.564941f, 0.320557f, 0.579590f, 0.299561f, 0.606445f, 0.279541f, 0.627441f, 0.260498f, - 0.638184f, 0.242676f, 0.666504f, 0.226074f, 0.670898f, 0.210327f, 0.687988f, 0.195801f, - 0.700684f, 0.182129f, 0.706055f, 0.169312f, 0.718262f, 0.157471f, 0.727539f, 0.146362f, - 0.735840f, 0.136108f, 0.738770f, 0.126587f, 0.743164f, 0.117737f, 0.746582f, 0.109497f, - 0.751953f, 0.101868f, 0.751953f, 0.094788f, 0.753906f, 0.088257f, 0.752930f, 0.082153f, - 0.750977f, 0.076538f, 0.749512f, 0.071289f, 0.745605f, 0.066406f, 0.742188f, 0.061951f, - 0.738281f, 0.057770f, 0.734375f, 0.053894f, 0.729004f, 0.050293f, 0.722656f, 0.046967f, - 0.715332f, 0.043854f, 0.708496f, 0.040985f, 0.701172f, 0.038330f, 0.693359f, 0.035828f, - 0.684570f, 0.033539f, 0.676270f, 0.031403f, 0.666992f, 0.029404f, 0.657227f, 0.027542f, - 0.646973f, 0.025818f, 0.636719f, 0.024200f, 0.626465f, 0.022705f, 0.615723f, 0.021301f, - 0.604980f, 0.020004f, 0.593750f, 0.018784f, 0.582520f, 0.017654f, 0.571289f, 0.016586f, - 0.180542f, 0.818848f, 0.180664f, 0.818848f, 0.181274f, 0.817383f, 0.183350f, 0.812988f, - 0.187134f, 0.802734f, 0.193237f, 0.784180f, 0.201416f, 0.757324f, 0.214355f, 0.723145f, - 0.231445f, 0.685547f, 0.248901f, 0.648438f, 0.272217f, 0.611816f, 0.302979f, 0.577148f, - 0.329834f, 0.544922f, 0.364258f, 0.514160f, 0.394043f, 0.484619f, 0.425781f, 0.456055f, - 0.456543f, 0.428467f, 0.481934f, 0.402344f, 0.512207f, 0.376709f, 0.540039f, 0.352783f, - 0.566406f, 0.329346f, 0.579102f, 0.307617f, 0.607910f, 0.286865f, 0.627930f, 0.267822f, - 0.645996f, 0.249512f, 0.661621f, 0.232178f, 0.677734f, 0.216309f, 0.691406f, 0.201172f, - 0.702637f, 0.187256f, 0.711426f, 0.174194f, 0.721680f, 0.161987f, 0.730957f, 0.150879f, - 0.736328f, 0.140259f, 0.742188f, 0.130493f, 0.746582f, 0.121582f, 0.750488f, 0.113159f, - 0.751953f, 0.105347f, 0.752930f, 0.098083f, 0.756836f, 0.091370f, 0.755859f, 0.085144f, - 0.755371f, 0.079346f, 0.752441f, 0.073975f, 0.750488f, 0.069031f, 0.746582f, 0.064392f, - 0.743652f, 0.060120f, 0.737793f, 0.056152f, 0.733398f, 0.052460f, 0.727051f, 0.049011f, - 0.720215f, 0.045837f, 0.713867f, 0.042847f, 0.706543f, 0.040100f, 0.699219f, 0.037537f, - 0.690430f, 0.035156f, 0.682129f, 0.032928f, 0.672852f, 0.030884f, 0.663086f, 0.028961f, - 0.653809f, 0.027161f, 0.644043f, 0.025497f, 0.633301f, 0.023941f, 0.622559f, 0.022491f, - 0.612305f, 0.021133f, 0.601074f, 0.019867f, 0.590332f, 0.018692f, 0.579102f, 0.017578f, - 0.111816f, 0.888184f, 0.112000f, 0.887207f, 0.112976f, 0.883789f, 0.115845f, 0.873047f, - 0.122864f, 0.849609f, 0.133301f, 0.813477f, 0.147217f, 0.770996f, 0.167236f, 0.728027f, - 0.196411f, 0.688965f, 0.222290f, 0.653320f, 0.258057f, 0.619629f, 0.293457f, 0.587402f, - 0.328613f, 0.556152f, 0.361328f, 0.524902f, 0.392578f, 0.495850f, 0.430420f, 0.466064f, - 0.459961f, 0.437744f, 0.482422f, 0.410889f, 0.511230f, 0.385010f, 0.536621f, 0.359863f, - 0.568848f, 0.336182f, 0.592773f, 0.313721f, 0.614258f, 0.293213f, 0.626953f, 0.273193f, - 0.646484f, 0.254639f, 0.657227f, 0.237427f, 0.683105f, 0.221191f, 0.693359f, 0.205933f, - 0.698242f, 0.191772f, 0.709473f, 0.178589f, 0.724609f, 0.166260f, 0.733398f, 0.154907f, - 0.739746f, 0.144165f, 0.745605f, 0.134399f, 0.750977f, 0.125122f, 0.753906f, 0.116577f, - 0.754883f, 0.108704f, 0.758301f, 0.101257f, 0.759766f, 0.094482f, 0.757812f, 0.088074f, - 0.759766f, 0.082092f, 0.758301f, 0.076660f, 0.756348f, 0.071594f, 0.752441f, 0.066833f, - 0.748047f, 0.062469f, 0.741699f, 0.058380f, 0.736816f, 0.054596f, 0.732910f, 0.051086f, - 0.726074f, 0.047791f, 0.719727f, 0.044769f, 0.711914f, 0.041901f, 0.704590f, 0.039276f, - 0.696289f, 0.036804f, 0.688477f, 0.034546f, 0.678711f, 0.032410f, 0.669922f, 0.030411f, - 0.660156f, 0.028564f, 0.650391f, 0.026840f, 0.640625f, 0.025223f, 0.630371f, 0.023727f, - 0.619629f, 0.022324f, 0.608887f, 0.020996f, 0.597656f, 0.019775f, 0.586914f, 0.018631f, - 0.038452f, 0.960938f, 0.039124f, 0.957520f, 0.042480f, 0.933594f, 0.051575f, 0.879395f, - 0.069275f, 0.824219f, 0.091064f, 0.785156f, 0.126343f, 0.753906f, 0.154419f, 0.725586f, - 0.192139f, 0.695312f, 0.234375f, 0.663086f, 0.273438f, 0.630371f, 0.305908f, 0.597656f, - 0.338379f, 0.565430f, 0.379150f, 0.532227f, 0.413818f, 0.501465f, 0.444336f, 0.471191f, - 0.471436f, 0.442383f, 0.504395f, 0.414795f, 0.531250f, 0.388672f, 0.547363f, 0.364014f, - 0.579590f, 0.340088f, 0.603516f, 0.317627f, 0.622559f, 0.297119f, 0.635742f, 0.276855f, - 0.669434f, 0.258301f, 0.670410f, 0.241089f, 0.685547f, 0.224854f, 0.699219f, 0.209717f, - 0.712402f, 0.195190f, 0.720703f, 0.182373f, 0.729980f, 0.169678f, 0.746582f, 0.158325f, - 0.744629f, 0.147705f, 0.748535f, 0.137695f, 0.760254f, 0.128296f, 0.757812f, 0.119629f, - 0.761230f, 0.111755f, 0.762207f, 0.104248f, 0.764160f, 0.097290f, 0.763184f, 0.090881f, - 0.762207f, 0.084900f, 0.760742f, 0.079285f, 0.759766f, 0.074097f, 0.755859f, 0.069275f, - 0.752930f, 0.064758f, 0.747559f, 0.060669f, 0.742676f, 0.056793f, 0.737305f, 0.053131f, - 0.731445f, 0.049774f, 0.725586f, 0.046661f, 0.718262f, 0.043732f, 0.710449f, 0.041077f, - 0.702637f, 0.038544f, 0.694336f, 0.036163f, 0.685547f, 0.033966f, 0.676758f, 0.031921f, - 0.667480f, 0.030014f, 0.657715f, 0.028229f, 0.647461f, 0.026566f, 0.637207f, 0.025009f, - 0.626953f, 0.023544f, 0.616699f, 0.022186f, 0.605957f, 0.020920f, 0.594727f, 0.019730f, -}; - const float ltc_disk_integral[64 * 64] = { 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, @@ -4530,16456 +3503,6 @@ const float ltc_disk_integral[64 * 64] = { 0.888889f, 0.904762f, 0.920635f, 0.936508f, 0.952381f, 0.968254f, 0.984127f, 1.000000f, }; -const float btdf_split_sum_ggx[32][64 * 64] = { - { - 0.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 0.999512f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 0.999512f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.039917f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, - 0.999512f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.999512f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, - 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.999512f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, - 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, - 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - }, - { - 0.000122f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000122f, 0.004147f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.897949f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000732f, 0.996094f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.002439f, - 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000366f, 0.078308f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 1.000000f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, - 0.000122f, 0.000122f, 0.001098f, 0.992188f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 0.999512f, - 1.000000f, 1.000000f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.005001f, 0.998535f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 1.000000f, 0.999512f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000732f, 0.902344f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.002928f, - 0.997070f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 1.000000f, 0.999512f, 0.999512f, 1.000000f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, - 0.000732f, 0.301758f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.002562f, 0.996094f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000732f, 0.433594f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.004021f, 0.996582f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.001098f, 0.949219f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000610f, - 0.012039f, 0.998047f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.002073f, 0.993652f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000854f, 0.725586f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000610f, 0.011856f, 0.998047f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.002905f, 0.995117f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.001098f, 0.978027f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000732f, - 0.314941f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, - 0.000731f, 0.017670f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.000366f, 0.005852f, 0.997559f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.003050f, 0.996094f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.001957f, 0.993652f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.001586f, 0.990234f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.001220f, 0.986816f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.001220f, - 0.984375f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, - 0.001098f, 0.985352f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.001220f, 0.989258f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, - 0.000122f, 0.000122f, 0.001341f, 0.993652f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.001586f, 0.996094f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.002802f, 0.997559f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000117f, 0.000122f, 0.000122f, 0.000243f, 0.006088f, 0.998535f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000366f, 0.026321f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000732f, 0.892578f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000975f, - 0.993652f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, - 0.002317f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.017944f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, - 0.000122f, 0.000731f, 0.983887f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000119f, - 0.000122f, 0.000122f, 0.001653f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.026108f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000732f, 0.995605f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.003777f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000365f, 0.991211f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.002195f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000364f, 0.993164f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.002672f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000360f, 0.998047f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.017075f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000731f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.997070f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, - 0.006874f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, - 0.000480f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000122f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000122f, 0.996582f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000067f, 0.005440f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000365f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000122f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000121f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.995605f, 0.995117f, 0.995117f, 0.995605f, 0.995117f, 0.995117f, - }, - { - 0.003168f, 0.995605f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 1.000000f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000976f, 0.053314f, 0.994629f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000122f, 0.000122f, 0.000732f, 0.003660f, 0.653809f, 0.995117f, 0.998047f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000488f, 0.001463f, 0.010452f, 0.947266f, 0.995605f, - 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000365f, 0.000853f, 0.002928f, 0.037750f, - 0.980957f, 0.996582f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.000610f, 0.001342f, - 0.006100f, 0.314453f, 0.989746f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000487f, - 0.001091f, 0.002317f, 0.015839f, 0.910645f, 0.993652f, 0.997559f, 0.998535f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000366f, 0.000732f, 0.001463f, 0.005302f, 0.068909f, 0.977539f, 0.995605f, 0.998047f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000244f, 0.000732f, 0.001098f, 0.002560f, 0.011551f, 0.658691f, 0.989746f, - 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000366f, 0.000732f, 0.001585f, 0.004868f, 0.041077f, - 0.958984f, 0.994141f, 0.997559f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.000732f, 0.001215f, 0.002802f, - 0.010834f, 0.441895f, 0.987305f, 0.996094f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000242f, 0.000488f, 0.000850f, - 0.001586f, 0.004753f, 0.039154f, 0.948242f, 0.993652f, 0.997559f, 0.998535f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000366f, - 0.000732f, 0.001220f, 0.003159f, 0.012032f, 0.480713f, 0.985840f, 0.996094f, 0.998047f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000240f, 0.000731f, 0.001097f, 0.001950f, 0.005966f, 0.054413f, 0.957520f, 0.994141f, - 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000486f, 0.000732f, 0.001534f, 0.003536f, 0.016937f, 0.726562f, - 0.988281f, 0.996582f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000365f, 0.000732f, 0.001098f, 0.002192f, 0.008278f, - 0.125244f, 0.974121f, 0.994629f, 0.997559f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000365f, 0.000731f, 0.000947f, 0.001828f, - 0.005314f, 0.031677f, 0.916016f, 0.991699f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000488f, 0.000732f, - 0.001339f, 0.003294f, 0.014389f, 0.562012f, 0.985840f, 0.996094f, 0.998047f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000487f, - 0.000732f, 0.001098f, 0.002310f, 0.008163f, 0.123779f, 0.973633f, 0.994629f, 0.997559f, - 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000365f, 0.000732f, 0.001097f, 0.002071f, 0.005669f, 0.041199f, 0.937988f, 0.992676f, - 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000118f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000366f, 0.000728f, 0.000732f, 0.001585f, 0.004143f, 0.020813f, 0.813965f, - 0.989746f, 0.996582f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000116f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000488f, 0.000732f, 0.001220f, 0.003292f, 0.012581f, - 0.446533f, 0.984863f, 0.996094f, 0.998047f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000471f, 0.000732f, 0.001220f, 0.002796f, - 0.009338f, 0.161865f, 0.977051f, 0.995117f, 0.997559f, 0.998535f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000365f, 0.000732f, 0.001098f, - 0.002285f, 0.006870f, 0.074097f, 0.965820f, 0.994141f, 0.997559f, 0.998535f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000366f, 0.000731f, - 0.001086f, 0.001945f, 0.005238f, 0.043732f, 0.947754f, 0.993652f, 0.997559f, 0.998535f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000366f, - 0.000730f, 0.000893f, 0.001826f, 0.004871f, 0.030411f, 0.922852f, 0.992188f, 0.997559f, - 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000243f, 0.000609f, 0.000732f, 0.001407f, 0.004375f, 0.023758f, 0.892090f, 0.992188f, - 0.997070f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000605f, 0.000732f, 0.001579f, 0.003941f, 0.020767f, 0.862793f, - 0.991699f, 0.997559f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000238f, 0.000483f, 0.000732f, 0.001449f, 0.003654f, 0.018951f, - 0.847656f, 0.991699f, 0.997559f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000233f, 0.000485f, 0.000732f, 0.001308f, 0.003353f, - 0.018997f, 0.855469f, 0.991699f, 0.997559f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000118f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000487f, 0.000732f, 0.001292f, - 0.003649f, 0.019791f, 0.881836f, 0.992188f, 0.997559f, 0.998535f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000432f, 0.000732f, - 0.001220f, 0.003635f, 0.021912f, 0.916992f, 0.993652f, 0.997559f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000116f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000487f, - 0.000732f, 0.001245f, 0.004002f, 0.028107f, 0.946289f, 0.994141f, 0.998047f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000085f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000475f, 0.000732f, 0.001611f, 0.004581f, 0.040466f, 0.966309f, 0.995605f, 0.998535f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000487f, 0.000732f, 0.001703f, 0.005589f, 0.073486f, 0.979980f, 0.996094f, - 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000475f, 0.000732f, 0.001706f, 0.006809f, 0.198730f, 0.987305f, - 0.997559f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000488f, 0.000732f, 0.002071f, 0.009590f, 0.647949f, - 0.992188f, 0.997559f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000710f, 0.001093f, 0.002541f, 0.015533f, - 0.922852f, 0.995117f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000116f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000242f, 0.000728f, 0.001218f, 0.003387f, - 0.034454f, 0.975586f, 0.996582f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000365f, 0.000731f, 0.001219f, - 0.004959f, 0.161865f, 0.989746f, 0.998047f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000366f, 0.000731f, - 0.001767f, 0.009331f, 0.849121f, 0.994629f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000487f, - 0.000732f, 0.002644f, 0.024231f, 0.977051f, 0.997559f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000685f, 0.001217f, 0.004139f, 0.195435f, 0.992676f, 0.998535f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000362f, 0.000731f, 0.001570f, 0.010086f, 0.944824f, 0.997070f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000365f, 0.000745f, 0.002781f, 0.051758f, 0.990723f, 0.998535f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000599f, 0.001176f, 0.006641f, 0.899414f, 0.997070f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000731f, 0.002066f, 0.032654f, 0.991211f, 0.998535f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000448f, 0.001088f, 0.005440f, 0.918457f, 0.997070f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000725f, 0.001822f, 0.038452f, 0.994141f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000329f, 0.000848f, 0.005672f, 0.972168f, - 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000581f, 0.001982f, 0.155273f, - 0.997070f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000330f, 0.000848f, 0.009247f, - 0.992676f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000589f, 0.002625f, - 0.958496f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.001199f, - 0.083374f, 0.998047f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000716f, - 0.007244f, 0.996582f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, - 0.002277f, 0.991211f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000070f, 0.000121f, 0.000122f, 0.000122f, - 0.000854f, 0.950684f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000111f, 0.000121f, 0.000122f, - 0.000475f, 0.067139f, 0.999512f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000118f, 0.000122f, - 0.000002f, 0.005859f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, - 0.000014f, 0.001376f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000121f, 0.000572f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000077f, 0.000002f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000103f, 0.992188f, 0.991699f, 0.991699f, 0.992188f, 0.992188f, 0.991699f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.940430f, 0.940430f, 0.940918f, 0.940918f, 0.940430f, 0.940430f, - }, - { - 0.014023f, 0.979492f, 0.994629f, 0.997070f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000488f, 0.004757f, 0.163330f, 0.975098f, 0.993164f, 0.996582f, 0.997559f, 0.998535f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000610f, 0.002928f, 0.017166f, 0.563965f, 0.978027f, 0.992676f, 0.996094f, - 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000364f, 0.000732f, 0.002192f, 0.006573f, 0.044952f, 0.830566f, 0.980957f, - 0.992676f, 0.996094f, 0.997070f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000366f, 0.000854f, 0.001586f, 0.004253f, 0.014313f, 0.130371f, - 0.919922f, 0.984375f, 0.993652f, 0.996094f, 0.997070f, 0.998047f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000488f, 0.000854f, 0.001342f, 0.003025f, 0.007305f, - 0.028870f, 0.407715f, 0.954590f, 0.987305f, 0.993652f, 0.996094f, 0.997070f, 0.998047f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000609f, 0.000842f, 0.000976f, 0.002193f, - 0.005112f, 0.012505f, 0.066589f, 0.768066f, 0.970703f, 0.989746f, 0.994629f, 0.996582f, - 0.997070f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000244f, 0.000599f, 0.000609f, 0.000976f, - 0.001829f, 0.003046f, 0.007256f, 0.023499f, 0.194946f, 0.908691f, 0.979980f, 0.991699f, - 0.995117f, 0.996582f, 0.997559f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.000488f, 0.000609f, - 0.000976f, 0.001583f, 0.002647f, 0.004726f, 0.012169f, 0.050537f, 0.568359f, 0.954102f, - 0.985840f, 0.993164f, 0.995605f, 0.997070f, 0.998047f, 0.998047f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.000488f, - 0.000610f, 0.000975f, 0.001211f, 0.001946f, 0.003532f, 0.007793f, 0.022446f, 0.139648f, - 0.856445f, 0.974121f, 0.989746f, 0.994141f, 0.996094f, 0.997559f, 0.998047f, 0.998535f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000241f, - 0.000310f, 0.000609f, 0.000807f, 0.001098f, 0.001822f, 0.002794f, 0.005699f, 0.012878f, - 0.047821f, 0.469238f, 0.941406f, 0.982910f, 0.991699f, 0.995117f, 0.996582f, 0.997559f, - 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000244f, 0.000244f, 0.000609f, 0.000732f, 0.001098f, 0.001461f, 0.002274f, 0.004025f, - 0.008247f, 0.023254f, 0.135254f, 0.833984f, 0.969727f, 0.987793f, 0.993652f, 0.995605f, - 0.997070f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000207f, 0.000244f, 0.000609f, 0.000610f, 0.001096f, 0.001098f, 0.002071f, - 0.003370f, 0.006172f, 0.014442f, 0.052795f, 0.486572f, 0.940430f, 0.981934f, 0.991699f, - 0.994629f, 0.996582f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.000485f, 0.000610f, 0.001080f, 0.001098f, - 0.001742f, 0.002668f, 0.004692f, 0.010147f, 0.028076f, 0.168701f, 0.854004f, 0.970703f, - 0.988770f, 0.993652f, 0.996094f, 0.997070f, 0.998047f, 0.998047f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.000487f, 0.000610f, 0.000731f, - 0.001098f, 0.001413f, 0.002411f, 0.003895f, 0.007072f, 0.017242f, 0.069580f, 0.605957f, - 0.948730f, 0.983398f, 0.992188f, 0.995117f, 0.996582f, 0.997559f, 0.998047f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.000244f, 0.000609f, - 0.000610f, 0.001094f, 0.001337f, 0.001828f, 0.003275f, 0.005814f, 0.012054f, 0.036987f, - 0.270752f, 0.899414f, 0.975586f, 0.989746f, 0.993652f, 0.996094f, 0.997070f, 0.998047f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000241f, 0.000365f, - 0.000597f, 0.000610f, 0.000970f, 0.001098f, 0.001815f, 0.002771f, 0.005009f, 0.008888f, - 0.023804f, 0.115845f, 0.775879f, 0.962891f, 0.986328f, 0.993164f, 0.995605f, 0.997070f, - 0.997559f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000244f, 0.000536f, 0.000731f, 0.000937f, 0.001203f, 0.001581f, 0.002186f, 0.004005f, - 0.007061f, 0.016830f, 0.061218f, 0.522949f, 0.940430f, 0.981934f, 0.991211f, 0.994629f, - 0.996582f, 0.997559f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000363f, 0.000487f, 0.000731f, 0.000732f, 0.001097f, 0.001339f, 0.002071f, - 0.003498f, 0.005947f, 0.012390f, 0.037964f, 0.268799f, 0.896973f, 0.975586f, 0.989258f, - 0.994141f, 0.996094f, 0.997070f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000244f, 0.000366f, 0.000609f, 0.000610f, 0.001094f, 0.001215f, - 0.002056f, 0.003183f, 0.004742f, 0.009880f, 0.026337f, 0.139526f, 0.813477f, 0.966309f, - 0.986816f, 0.993164f, 0.996094f, 0.997070f, 0.997559f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000163f, 0.000363f, 0.000600f, 0.000731f, 0.001088f, - 0.001216f, 0.001616f, 0.002640f, 0.004402f, 0.008156f, 0.019669f, 0.083191f, 0.664062f, - 0.953125f, 0.984375f, 0.992188f, 0.995117f, 0.997070f, 0.998047f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.000244f, 0.000523f, 0.000731f, - 0.000732f, 0.001097f, 0.001690f, 0.002169f, 0.003998f, 0.006939f, 0.015808f, 0.055634f, - 0.471191f, 0.935059f, 0.980957f, 0.991211f, 0.995117f, 0.996582f, 0.997559f, 0.998047f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000336f, 0.000486f, - 0.000731f, 0.000732f, 0.001097f, 0.001558f, 0.002069f, 0.003525f, 0.006058f, 0.013062f, - 0.040894f, 0.306396f, 0.910156f, 0.978027f, 0.990234f, 0.994141f, 0.996582f, 0.997559f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000113f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000360f, - 0.000515f, 0.000731f, 0.000731f, 0.001094f, 0.001219f, 0.002148f, 0.003159f, 0.005577f, - 0.011360f, 0.031952f, 0.203979f, 0.874512f, 0.973633f, 0.989258f, 0.994141f, 0.996582f, - 0.997559f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000325f, 0.000366f, 0.000731f, 0.000731f, 0.001093f, 0.001219f, 0.001820f, 0.002916f, - 0.005291f, 0.009758f, 0.026352f, 0.145020f, 0.832520f, 0.969238f, 0.988281f, 0.993652f, - 0.996094f, 0.997559f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000244f, 0.000440f, 0.000605f, 0.000731f, 0.001086f, 0.001097f, 0.001646f, - 0.002670f, 0.004230f, 0.008835f, 0.022415f, 0.112183f, 0.786133f, 0.966309f, 0.987793f, - 0.993652f, 0.996094f, 0.997559f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000272f, 0.000358f, 0.000565f, 0.000731f, 0.000790f, 0.001210f, - 0.001573f, 0.002434f, 0.004360f, 0.008102f, 0.020660f, 0.092896f, 0.741699f, 0.962891f, - 0.987305f, 0.993164f, 0.996094f, 0.997070f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000364f, 0.000723f, 0.000731f, 0.000731f, - 0.001216f, 0.001698f, 0.002510f, 0.003998f, 0.007484f, 0.018463f, 0.082336f, 0.709961f, - 0.961426f, 0.986816f, 0.993652f, 0.996094f, 0.997559f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000242f, 0.000362f, 0.000704f, 0.000730f, - 0.000845f, 0.001096f, 0.001513f, 0.002302f, 0.003941f, 0.007168f, 0.017746f, 0.076782f, - 0.693848f, 0.961426f, 0.987305f, 0.993652f, 0.996094f, 0.997559f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000364f, 0.000579f, - 0.000728f, 0.000731f, 0.001096f, 0.001491f, 0.002069f, 0.003899f, 0.007195f, 0.017059f, - 0.075439f, 0.701172f, 0.962402f, 0.987793f, 0.993652f, 0.996094f, 0.997559f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000119f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000357f, - 0.000482f, 0.000730f, 0.000731f, 0.001094f, 0.001334f, 0.002230f, 0.003708f, 0.007217f, - 0.017410f, 0.079163f, 0.730469f, 0.965820f, 0.988281f, 0.994141f, 0.996582f, 0.998047f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000112f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000238f, - 0.000243f, 0.000365f, 0.000729f, 0.000731f, 0.001095f, 0.001330f, 0.002066f, 0.003637f, - 0.007118f, 0.018112f, 0.087708f, 0.775391f, 0.969238f, 0.989258f, 0.994629f, 0.997070f, - 0.997559f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000073f, 0.000121f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000323f, 0.000390f, 0.000729f, 0.000731f, 0.001094f, 0.001332f, 0.002275f, - 0.003782f, 0.007252f, 0.019379f, 0.105042f, 0.827637f, 0.973145f, 0.990723f, 0.994629f, - 0.997070f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000114f, 0.000121f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000240f, 0.000369f, 0.000729f, 0.000731f, 0.001093f, 0.001330f, - 0.002209f, 0.003937f, 0.007896f, 0.021805f, 0.137207f, 0.876953f, 0.979004f, 0.991699f, - 0.995605f, 0.997559f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000119f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000272f, 0.000479f, 0.000727f, 0.000731f, 0.001085f, - 0.001331f, 0.002291f, 0.004105f, 0.008446f, 0.025024f, 0.202271f, 0.916504f, 0.982910f, - 0.993164f, 0.996094f, 0.997559f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000120f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000360f, 0.000469f, 0.000681f, 0.000731f, - 0.001092f, 0.001331f, 0.002184f, 0.004227f, 0.009521f, 0.030899f, 0.335205f, 0.945312f, - 0.986816f, 0.993652f, 0.996582f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000116f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000241f, 0.000429f, 0.000726f, - 0.000731f, 0.001091f, 0.001649f, 0.002464f, 0.004810f, 0.010895f, 0.041931f, 0.563477f, - 0.963867f, 0.989746f, 0.995117f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000101f, 0.000120f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000288f, 0.000481f, - 0.000720f, 0.000731f, 0.001093f, 0.001571f, 0.002735f, 0.005405f, 0.013199f, 0.064880f, - 0.786133f, 0.976562f, 0.992188f, 0.995605f, 0.997559f, 0.998535f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000112f, 0.000121f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000240f, - 0.000481f, 0.000727f, 0.000731f, 0.001093f, 0.001655f, 0.003132f, 0.005909f, 0.017181f, - 0.123169f, 0.904297f, 0.984375f, 0.993652f, 0.996582f, 0.998047f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000110f, 0.000120f, 0.000121f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000264f, 0.000392f, 0.000727f, 0.000835f, 0.001196f, 0.001765f, 0.003252f, 0.007343f, - 0.024521f, 0.304199f, 0.954102f, 0.989258f, 0.995605f, 0.997559f, 0.998535f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000034f, 0.000119f, - 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000235f, 0.000375f, 0.000728f, 0.000822f, 0.001095f, 0.002024f, 0.003952f, - 0.009193f, 0.040894f, 0.694824f, 0.975586f, 0.992676f, 0.996582f, 0.998047f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000112f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000307f, 0.000475f, 0.000728f, 0.000943f, 0.001216f, 0.002283f, - 0.004829f, 0.013008f, 0.092224f, 0.908203f, 0.986328f, 0.995117f, 0.997559f, 0.998535f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000073f, 0.000118f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000240f, 0.000576f, 0.000728f, 0.001073f, 0.001569f, - 0.002668f, 0.005947f, 0.020889f, 0.331543f, 0.965820f, 0.992188f, 0.996582f, 0.998047f, - 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000100f, 0.000120f, 0.000121f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000362f, 0.000630f, 0.000729f, 0.001087f, - 0.001567f, 0.003241f, 0.008240f, 0.043793f, 0.824219f, 0.984375f, 0.994629f, 0.997559f, - 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000075f, 0.000119f, 0.000121f, 0.000121f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000363f, 0.000689f, 0.000730f, - 0.001185f, 0.002022f, 0.004108f, 0.013702f, 0.161011f, 0.957031f, 0.991699f, 0.996582f, - 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000003f, 0.000105f, 0.000120f, - 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000156f, 0.000372f, 0.000689f, - 0.000730f, 0.001198f, 0.002651f, 0.006214f, 0.028854f, 0.750000f, 0.984375f, 0.995605f, - 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000102f, - 0.000118f, 0.000120f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000472f, - 0.000724f, 0.000966f, 0.001658f, 0.003397f, 0.010582f, 0.116028f, 0.959473f, 0.993164f, - 0.997559f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000111f, 0.000119f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000130f, - 0.000479f, 0.000726f, 0.001163f, 0.002157f, 0.004829f, 0.024338f, 0.776855f, 0.987793f, - 0.996582f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000097f, 0.000117f, 0.000120f, 0.000121f, 0.000121f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000219f, 0.000580f, 0.000728f, 0.001203f, 0.002872f, 0.009109f, 0.130371f, 0.972168f, - 0.995117f, 0.998047f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000112f, 0.000118f, 0.000121f, 0.000121f, - 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000333f, 0.000681f, 0.000940f, 0.001629f, 0.004120f, 0.025467f, 0.890625f, - 0.991699f, 0.997559f, 0.999512f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000083f, 0.000116f, 0.000120f, - 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000353f, 0.000722f, 0.000961f, 0.002403f, 0.009354f, 0.295166f, - 0.985840f, 0.997070f, 0.999512f, 0.999023f, 0.999512f, 0.999023f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000105f, - 0.000118f, 0.000120f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000130f, 0.000427f, 0.000605f, 0.001345f, 0.004620f, 0.041229f, - 0.966797f, 0.996094f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000074f, 0.000114f, 0.000119f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000089f, 0.000562f, 0.000942f, 0.002352f, 0.012459f, - 0.854004f, 0.994141f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000103f, 0.000117f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, - 0.000122f, 0.000122f, 0.000007f, 0.000002f, 0.000231f, 0.000596f, 0.001180f, 0.005474f, - 0.211426f, 0.991211f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000111f, 0.000118f, 0.000120f, 0.000121f, - 0.000121f, 0.000122f, 0.000029f, 0.000004f, 0.000001f, 0.000348f, 0.000896f, 0.002764f, - 0.032562f, 0.984375f, 0.998535f, 0.998535f, 0.999023f, 0.998535f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000089f, 0.000116f, 0.000119f, - 0.000121f, 0.000121f, 0.000121f, 0.000013f, 0.000003f, 0.000075f, 0.000586f, 0.001508f, - 0.010292f, 0.963379f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000006f, 0.000107f, - 0.000118f, 0.000120f, 0.000121f, 0.000116f, 0.000008f, 0.000002f, 0.000233f, 0.000857f, - 0.004566f, 0.834961f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000083f, 0.000114f, 0.000119f, 0.000120f, 0.000060f, 0.000005f, 0.000001f, 0.000557f, - 0.002064f, 0.182373f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000103f, 0.000117f, 0.000120f, 0.000024f, 0.000003f, 0.000168f, - 0.000968f, 0.026428f, 0.996582f, 0.997070f, 0.996582f, 0.996582f, 0.996582f, 0.997070f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000047f, 0.000110f, 0.000118f, 0.000017f, 0.000002f, - 0.000513f, 0.006870f, 0.995605f, 0.995605f, 0.995117f, 0.995117f, 0.995117f, 0.995117f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000096f, 0.000115f, 0.000011f, - 0.000042f, 0.001919f, 0.992676f, 0.992676f, 0.992676f, 0.992676f, 0.992676f, 0.992676f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000044f, 0.000109f, - 0.000008f, 0.000314f, 0.985840f, 0.985840f, 0.985840f, 0.985840f, 0.986328f, 0.985840f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000089f, 0.000060f, 0.964355f, 0.964355f, 0.963867f, 0.963867f, 0.963379f, 0.964355f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000022f, 0.818848f, 0.819824f, 0.819336f, 0.819824f, 0.819824f, 0.819824f, - }, - { - 0.038849f, 0.941406f, 0.984375f, 0.992188f, 0.994141f, 0.996094f, 0.996582f, 0.997070f, - 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, - 0.001582f, 0.014984f, 0.262451f, 0.930664f, 0.979980f, 0.989258f, 0.993164f, 0.995117f, - 0.996094f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 0.999512f, - 0.000244f, 0.002317f, 0.009003f, 0.047180f, 0.524902f, 0.936523f, 0.978027f, 0.988281f, - 0.992188f, 0.994629f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000122f, 0.001098f, 0.002560f, 0.006824f, 0.020493f, 0.108826f, 0.715820f, 0.946289f, - 0.978516f, 0.988281f, 0.992188f, 0.994141f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, - 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000607f, 0.001098f, 0.002310f, 0.005646f, 0.012825f, 0.040131f, 0.231201f, - 0.825195f, 0.954590f, 0.979980f, 0.988281f, 0.992188f, 0.994141f, 0.995117f, 0.996582f, - 0.996582f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000244f, 0.000609f, 0.001341f, 0.002310f, 0.004208f, 0.008865f, 0.021591f, - 0.074585f, 0.439209f, 0.885742f, 0.962402f, 0.981934f, 0.989258f, 0.992676f, 0.994141f, - 0.995605f, 0.996582f, 0.997070f, 0.997070f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 0.999512f, - 0.000000f, 0.000122f, 0.000483f, 0.000610f, 0.001460f, 0.002192f, 0.003994f, 0.007030f, - 0.013847f, 0.036316f, 0.146362f, 0.661621f, 0.921875f, 0.969238f, 0.983398f, 0.989746f, - 0.993164f, 0.994141f, 0.995605f, 0.996582f, 0.996582f, 0.997559f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000243f, 0.000604f, 0.000730f, 0.001307f, 0.001944f, 0.003017f, - 0.004997f, 0.009834f, 0.021606f, 0.063416f, 0.295410f, 0.808594f, 0.944336f, 0.974609f, - 0.985352f, 0.990234f, 0.993652f, 0.995117f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, - 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000119f, 0.000366f, 0.000495f, 0.000731f, 0.001217f, 0.001823f, - 0.002796f, 0.004398f, 0.007656f, 0.015366f, 0.035828f, 0.119263f, 0.531738f, 0.886230f, - 0.958496f, 0.979004f, 0.986816f, 0.991699f, 0.993652f, 0.995117f, 0.996094f, 0.997070f, - 0.997559f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000244f, 0.000366f, 0.000607f, 0.000731f, 0.001211f, - 0.001650f, 0.002441f, 0.003975f, 0.006207f, 0.011536f, 0.023315f, 0.060822f, 0.242798f, - 0.744141f, 0.927734f, 0.969238f, 0.982422f, 0.989258f, 0.992188f, 0.994141f, 0.995605f, - 0.996094f, 0.996582f, 0.997559f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000211f, 0.000455f, 0.000486f, 0.000853f, - 0.001081f, 0.001810f, 0.002426f, 0.003759f, 0.005501f, 0.009094f, 0.016876f, 0.037109f, - 0.114075f, 0.475586f, 0.862305f, 0.951172f, 0.975586f, 0.985840f, 0.990234f, 0.992676f, - 0.995117f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000364f, 0.000366f, 0.000464f, - 0.000731f, 0.001093f, 0.001577f, 0.002235f, 0.002798f, 0.004841f, 0.007637f, 0.013008f, - 0.025635f, 0.063965f, 0.238403f, 0.720215f, 0.919434f, 0.965820f, 0.981445f, 0.987793f, - 0.991211f, 0.993652f, 0.995117f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, - 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000238f, 0.000609f, - 0.000712f, 0.000974f, 0.000976f, 0.001507f, 0.002031f, 0.002680f, 0.004066f, 0.006294f, - 0.010284f, 0.018326f, 0.040924f, 0.124146f, 0.485596f, 0.859375f, 0.949707f, 0.975586f, - 0.984375f, 0.989746f, 0.992676f, 0.994629f, 0.995605f, 0.996582f, 0.997070f, 0.997070f, - 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000113f, 0.000487f, - 0.000488f, 0.000610f, 0.000961f, 0.000976f, 0.001337f, 0.001705f, 0.002663f, 0.003521f, - 0.005417f, 0.008408f, 0.014809f, 0.028793f, 0.073120f, 0.270996f, 0.741699f, 0.922363f, - 0.965332f, 0.980957f, 0.987793f, 0.991699f, 0.993652f, 0.995117f, 0.996094f, 0.997070f, - 0.997070f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000244f, 0.000224f, - 0.000486f, 0.000609f, 0.000610f, 0.000973f, 0.000975f, 0.001306f, 0.001703f, 0.002350f, - 0.003239f, 0.004848f, 0.007122f, 0.011955f, 0.021820f, 0.048859f, 0.152710f, 0.554199f, - 0.875977f, 0.953125f, 0.976562f, 0.985352f, 0.990234f, 0.993164f, 0.994629f, 0.995605f, - 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000234f, - 0.000244f, 0.000485f, 0.000488f, 0.000610f, 0.000969f, 0.000975f, 0.001335f, 0.001693f, - 0.001991f, 0.002811f, 0.004097f, 0.006397f, 0.009903f, 0.017303f, 0.035034f, 0.094421f, - 0.354736f, 0.795898f, 0.933594f, 0.969238f, 0.981934f, 0.988281f, 0.991699f, 0.993652f, - 0.995117f, 0.996094f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000244f, 0.000244f, 0.000480f, 0.000608f, 0.000488f, 0.000922f, 0.000975f, 0.000976f, - 0.001339f, 0.001827f, 0.002674f, 0.003891f, 0.005688f, 0.008324f, 0.014320f, 0.026917f, - 0.064392f, 0.216431f, 0.668945f, 0.904785f, 0.959961f, 0.978516f, 0.986816f, 0.990723f, - 0.993652f, 0.994141f, 0.996094f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000188f, 0.000220f, 0.000480f, 0.000608f, 0.000609f, 0.000876f, 0.000975f, - 0.000976f, 0.001454f, 0.002068f, 0.002649f, 0.003481f, 0.004757f, 0.007801f, 0.012230f, - 0.021698f, 0.046814f, 0.138306f, 0.506348f, 0.859375f, 0.947754f, 0.974121f, 0.984375f, - 0.989746f, 0.992188f, 0.994141f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, - 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.000446f, 0.000487f, 0.000609f, 0.000731f, - 0.000973f, 0.000975f, 0.001310f, 0.001823f, 0.002304f, 0.002869f, 0.004890f, 0.006813f, - 0.010475f, 0.017731f, 0.036163f, 0.095337f, 0.353516f, 0.792480f, 0.932129f, 0.968262f, - 0.982422f, 0.988770f, 0.992188f, 0.993652f, 0.995605f, 0.996094f, 0.997070f, 0.997559f, - 0.998047f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.000241f, 0.000362f, 0.000487f, 0.000609f, - 0.000609f, 0.000973f, 0.001213f, 0.001419f, 0.001807f, 0.002068f, 0.002794f, 0.004070f, - 0.005917f, 0.009140f, 0.015129f, 0.029053f, 0.070068f, 0.242554f, 0.700684f, 0.911621f, - 0.961914f, 0.979492f, 0.987305f, 0.991211f, 0.993164f, 0.995117f, 0.995605f, 0.997070f, - 0.997559f, 0.997559f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.000243f, 0.000483f, 0.000603f, - 0.000609f, 0.000730f, 0.001076f, 0.000975f, 0.001327f, 0.001598f, 0.002056f, 0.002848f, - 0.003519f, 0.005589f, 0.008041f, 0.013321f, 0.024155f, 0.054718f, 0.171875f, 0.590332f, - 0.885742f, 0.955566f, 0.977051f, 0.985840f, 0.990723f, 0.993164f, 0.994629f, 0.995605f, - 0.997070f, 0.997070f, 0.997559f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000192f, 0.000122f, 0.000244f, 0.000483f, - 0.000606f, 0.000608f, 0.000731f, 0.000953f, 0.001095f, 0.001258f, 0.001575f, 0.002066f, - 0.002594f, 0.003857f, 0.004734f, 0.007683f, 0.011642f, 0.021179f, 0.044464f, 0.127930f, - 0.476807f, 0.850586f, 0.947266f, 0.974121f, 0.984375f, 0.989746f, 0.992676f, 0.994141f, - 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000229f, 0.000239f, 0.000244f, - 0.000343f, 0.000483f, 0.000608f, 0.000609f, 0.000857f, 0.000973f, 0.001097f, 0.001571f, - 0.002041f, 0.002399f, 0.002922f, 0.004471f, 0.006836f, 0.010643f, 0.018661f, 0.037354f, - 0.100037f, 0.378418f, 0.810547f, 0.937988f, 0.971191f, 0.983887f, 0.989258f, 0.992188f, - 0.994141f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000161f, - 0.000230f, 0.000244f, 0.000486f, 0.000607f, 0.000609f, 0.000819f, 0.000972f, 0.000975f, - 0.001431f, 0.001945f, 0.002283f, 0.003031f, 0.004238f, 0.006424f, 0.009995f, 0.016068f, - 0.032104f, 0.081360f, 0.302246f, 0.765625f, 0.928223f, 0.968750f, 0.982422f, 0.988770f, - 0.992676f, 0.994629f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998535f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000240f, 0.000240f, 0.000244f, 0.000450f, 0.000607f, 0.000609f, 0.000731f, 0.001084f, - 0.000974f, 0.001341f, 0.001910f, 0.002254f, 0.003216f, 0.004017f, 0.005692f, 0.008980f, - 0.014832f, 0.028854f, 0.069641f, 0.248657f, 0.719238f, 0.918945f, 0.965820f, 0.981445f, - 0.988770f, 0.992188f, 0.994629f, 0.995605f, 0.996094f, 0.997070f, 0.997559f, 0.998535f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000243f, 0.000360f, 0.000461f, 0.000607f, 0.000608f, 0.000731f, - 0.001086f, 0.001202f, 0.001307f, 0.001592f, 0.002066f, 0.003134f, 0.003990f, 0.005611f, - 0.008133f, 0.013680f, 0.025986f, 0.061462f, 0.211670f, 0.676758f, 0.910156f, 0.963867f, - 0.980957f, 0.988281f, 0.991699f, 0.994629f, 0.995605f, 0.996582f, 0.997070f, 0.998047f, - 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000240f, 0.000243f, 0.000482f, 0.000604f, 0.000608f, - 0.000730f, 0.001040f, 0.001188f, 0.001287f, 0.001574f, 0.002064f, 0.002613f, 0.003721f, - 0.005428f, 0.008018f, 0.013161f, 0.024200f, 0.055573f, 0.186401f, 0.642578f, 0.904785f, - 0.962402f, 0.980469f, 0.987793f, 0.991699f, 0.994141f, 0.995605f, 0.996582f, 0.997070f, - 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.000480f, 0.000602f, - 0.000721f, 0.000705f, 0.000907f, 0.001094f, 0.001096f, 0.001493f, 0.002058f, 0.002607f, - 0.003639f, 0.004826f, 0.007595f, 0.012413f, 0.022171f, 0.051697f, 0.171143f, 0.619629f, - 0.899414f, 0.961426f, 0.980957f, 0.987793f, 0.992188f, 0.994629f, 0.995605f, 0.996582f, - 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000172f, 0.000232f, 0.000243f, 0.000244f, - 0.000576f, 0.000711f, 0.000608f, 0.000767f, 0.001089f, 0.001213f, 0.001509f, 0.002029f, - 0.002684f, 0.003550f, 0.005161f, 0.007107f, 0.011871f, 0.021545f, 0.049347f, 0.163086f, - 0.609863f, 0.900391f, 0.962891f, 0.980957f, 0.988281f, 0.992676f, 0.994629f, 0.996094f, - 0.996582f, 0.997559f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000210f, 0.000122f, 0.000337f, - 0.000290f, 0.000594f, 0.000726f, 0.000730f, 0.000731f, 0.001090f, 0.001212f, 0.001506f, - 0.002029f, 0.002335f, 0.003489f, 0.005077f, 0.007000f, 0.011398f, 0.021027f, 0.048218f, - 0.161133f, 0.614258f, 0.903809f, 0.963379f, 0.981934f, 0.988770f, 0.992188f, 0.994629f, - 0.996094f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000281f, 0.000440f, 0.000683f, 0.000726f, 0.000730f, 0.000731f, 0.001087f, 0.001095f, - 0.001485f, 0.001793f, 0.002214f, 0.002991f, 0.004951f, 0.006912f, 0.011162f, 0.020905f, - 0.048187f, 0.165527f, 0.633789f, 0.910156f, 0.965820f, 0.982422f, 0.989746f, 0.993164f, - 0.995117f, 0.996094f, 0.997070f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000241f, 0.000243f, 0.000480f, 0.000725f, 0.000697f, 0.000731f, 0.001007f, - 0.001094f, 0.001360f, 0.001795f, 0.002161f, 0.003244f, 0.004871f, 0.006966f, 0.011330f, - 0.020706f, 0.049591f, 0.178345f, 0.667969f, 0.918457f, 0.968262f, 0.983887f, 0.990234f, - 0.993652f, 0.995605f, 0.996582f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000086f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000243f, 0.000243f, 0.000465f, 0.000592f, 0.000729f, 0.000730f, - 0.001079f, 0.001093f, 0.001332f, 0.001885f, 0.002129f, 0.003254f, 0.004818f, 0.006889f, - 0.011429f, 0.021957f, 0.052521f, 0.201294f, 0.714355f, 0.929199f, 0.972168f, 0.985352f, - 0.991211f, 0.994141f, 0.995605f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000115f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000184f, 0.000241f, 0.000347f, 0.000453f, 0.000579f, 0.000728f, - 0.000729f, 0.001034f, 0.001093f, 0.001292f, 0.001857f, 0.002131f, 0.003296f, 0.004826f, - 0.006958f, 0.011726f, 0.023071f, 0.057983f, 0.239258f, 0.767578f, 0.939453f, 0.976074f, - 0.987305f, 0.992676f, 0.994629f, 0.996094f, 0.997070f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000088f, 0.000119f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000191f, 0.000242f, 0.000425f, 0.000558f, - 0.000723f, 0.000730f, 0.001058f, 0.001092f, 0.001297f, 0.001653f, 0.002352f, 0.003124f, - 0.004860f, 0.007072f, 0.012131f, 0.024551f, 0.066406f, 0.300537f, 0.820312f, 0.951172f, - 0.979492f, 0.988281f, 0.993164f, 0.995117f, 0.996582f, 0.997070f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000227f, 0.000239f, 0.000341f, 0.000359f, - 0.000587f, 0.000605f, 0.000729f, 0.001040f, 0.001185f, 0.001275f, 0.001849f, 0.002390f, - 0.003399f, 0.005001f, 0.007404f, 0.012871f, 0.027237f, 0.079529f, 0.395264f, 0.868164f, - 0.960938f, 0.982910f, 0.990234f, 0.993164f, 0.995605f, 0.997070f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000120f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000211f, 0.000239f, 0.000307f, - 0.000394f, 0.000704f, 0.000711f, 0.000728f, 0.001001f, 0.001088f, 0.001204f, 0.001713f, - 0.002367f, 0.003151f, 0.004639f, 0.007820f, 0.014084f, 0.030609f, 0.102722f, 0.527344f, - 0.906250f, 0.969727f, 0.985840f, 0.991699f, 0.994629f, 0.996094f, 0.997559f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000117f, 0.000115f, 0.000121f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000196f, - 0.000332f, 0.000363f, 0.000686f, 0.000719f, 0.000723f, 0.000963f, 0.001089f, 0.001290f, - 0.001849f, 0.002394f, 0.003458f, 0.004833f, 0.008301f, 0.015579f, 0.036926f, 0.143188f, - 0.676270f, 0.934570f, 0.976562f, 0.988281f, 0.992676f, 0.995605f, 0.996582f, 0.998047f, - 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000102f, 0.000120f, - 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000311f, 0.000345f, 0.000479f, 0.000723f, 0.000728f, 0.000934f, 0.001085f, - 0.001282f, 0.001821f, 0.002399f, 0.003355f, 0.005524f, 0.008881f, 0.017807f, 0.047058f, - 0.222046f, 0.803223f, 0.954102f, 0.981445f, 0.990723f, 0.994141f, 0.996582f, 0.997559f, - 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000090f, - 0.000116f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000201f, 0.000239f, 0.000358f, 0.000618f, 0.000719f, 0.000727f, 0.000863f, - 0.001087f, 0.001350f, 0.001945f, 0.002689f, 0.003731f, 0.005817f, 0.010033f, 0.021332f, - 0.064514f, 0.374512f, 0.885254f, 0.969238f, 0.986328f, 0.992676f, 0.995605f, 0.996582f, - 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000086f, 0.000117f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000164f, 0.000238f, 0.000353f, 0.000596f, 0.000591f, 0.000727f, - 0.000901f, 0.001085f, 0.001266f, 0.001767f, 0.002663f, 0.003914f, 0.006153f, 0.011612f, - 0.026871f, 0.100525f, 0.605957f, 0.934082f, 0.978027f, 0.989746f, 0.994141f, 0.996094f, - 0.997559f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999023f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000107f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000195f, 0.000323f, 0.000339f, 0.000461f, 0.000706f, - 0.000726f, 0.000845f, 0.001086f, 0.001298f, 0.001843f, 0.003027f, 0.004387f, 0.007011f, - 0.013832f, 0.036530f, 0.183228f, 0.805664f, 0.959961f, 0.984863f, 0.991699f, 0.995605f, - 0.997070f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000117f, 0.000120f, 0.000120f, 0.000121f, - 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000224f, 0.000336f, 0.000464f, - 0.000708f, 0.000726f, 0.000965f, 0.001083f, 0.001458f, 0.002180f, 0.003096f, 0.004425f, - 0.008377f, 0.017639f, 0.056610f, 0.390869f, 0.909180f, 0.975586f, 0.989746f, 0.994141f, - 0.996582f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000110f, 0.000113f, 0.000120f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000135f, 0.000336f, - 0.000467f, 0.000713f, 0.000725f, 0.000959f, 0.001191f, 0.001287f, 0.001939f, 0.003231f, - 0.005306f, 0.009888f, 0.024414f, 0.105835f, 0.709961f, 0.955078f, 0.984863f, 0.993164f, - 0.996094f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000061f, 0.000089f, - 0.000118f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000309f, - 0.000299f, 0.000460f, 0.000710f, 0.000724f, 0.000997f, 0.001073f, 0.001410f, 0.002117f, - 0.003506f, 0.006031f, 0.012863f, 0.038391f, 0.260742f, 0.892090f, 0.975098f, 0.990723f, - 0.995117f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000085f, 0.000110f, 0.000118f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000317f, 0.000499f, 0.000706f, 0.000599f, 0.000851f, 0.001069f, 0.001633f, - 0.002367f, 0.003918f, 0.007580f, 0.017929f, 0.074646f, 0.645508f, 0.956055f, 0.986328f, - 0.994141f, 0.996582f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000099f, 0.000113f, 0.000119f, 0.000119f, 0.000120f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000160f, 0.000326f, 0.000308f, 0.000578f, 0.000602f, 0.000921f, 0.001071f, - 0.001807f, 0.002783f, 0.004620f, 0.010017f, 0.029465f, 0.211792f, 0.896484f, 0.979004f, - 0.992188f, 0.996094f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000027f, 0.000103f, 0.000114f, 0.000118f, 0.000120f, - 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000090f, 0.000212f, 0.000309f, 0.000586f, 0.000602f, 0.000937f, - 0.001147f, 0.002031f, 0.003237f, 0.006134f, 0.014969f, 0.063171f, 0.665527f, 0.964355f, - 0.989258f, 0.995117f, 0.999023f, 0.998535f, 0.999023f, 0.999023f, 0.998535f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000018f, 0.000103f, 0.000113f, - 0.000117f, 0.000119f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000004f, 0.000002f, 0.000199f, 0.000390f, 0.000586f, 0.000665f, - 0.000946f, 0.001365f, 0.002207f, 0.003767f, 0.008308f, 0.025955f, 0.227661f, 0.924316f, - 0.984863f, 0.994141f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000098f, 0.000109f, 0.000117f, 0.000119f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000011f, 0.000005f, 0.000003f, 0.000002f, 0.000193f, 0.000388f, 0.000586f, - 0.000659f, 0.000952f, 0.001580f, 0.002762f, 0.005363f, 0.013153f, 0.066589f, 0.781738f, - 0.977051f, 0.993164f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000075f, 0.000112f, 0.000116f, 0.000118f, 0.000119f, 0.000120f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, - 0.000088f, 0.000026f, 0.000010f, 0.000005f, 0.000003f, 0.000002f, 0.000186f, 0.000407f, - 0.000586f, 0.000760f, 0.000986f, 0.001796f, 0.003275f, 0.007565f, 0.026794f, 0.363281f, - 0.959473f, 0.990723f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000010f, 0.000090f, 0.000110f, 0.000115f, 0.000117f, - 0.000119f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000077f, 0.000023f, 0.000011f, 0.000005f, 0.000003f, 0.000002f, 0.000158f, - 0.000407f, 0.000587f, 0.000826f, 0.001264f, 0.002174f, 0.004894f, 0.013359f, 0.098511f, - 0.911133f, 0.987793f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000084f, 0.000107f, - 0.000114f, 0.000117f, 0.000119f, 0.000119f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000093f, 0.000024f, 0.000011f, 0.000005f, 0.000003f, 0.000002f, - 0.000220f, 0.000476f, 0.000585f, 0.000913f, 0.001374f, 0.002951f, 0.007511f, 0.034973f, - 0.736328f, 0.982910f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000056f, 0.000102f, 0.000112f, 0.000116f, 0.000117f, 0.000119f, 0.000120f, 0.000120f, - 0.000121f, 0.000121f, 0.000121f, 0.000075f, 0.000025f, 0.000010f, 0.000005f, 0.000003f, - 0.000034f, 0.000222f, 0.000491f, 0.000589f, 0.001020f, 0.001881f, 0.004669f, 0.015717f, - 0.298340f, 0.974609f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000048f, 0.000095f, 0.000106f, 0.000114f, 0.000117f, 0.000118f, - 0.000119f, 0.000120f, 0.000120f, 0.000121f, 0.000089f, 0.000029f, 0.000012f, 0.000006f, - 0.000003f, 0.000002f, 0.000223f, 0.000525f, 0.000687f, 0.001122f, 0.002672f, 0.008255f, - 0.079590f, 0.954590f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000077f, 0.000104f, 0.000112f, - 0.000115f, 0.000117f, 0.000119f, 0.000119f, 0.000120f, 0.000109f, 0.000031f, 0.000013f, - 0.000006f, 0.000003f, 0.000002f, 0.000254f, 0.000550f, 0.000846f, 0.001545f, 0.004223f, - 0.027771f, 0.901855f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000037f, - 0.000090f, 0.000107f, 0.000113f, 0.000116f, 0.000118f, 0.000119f, 0.000120f, 0.000041f, - 0.000015f, 0.000007f, 0.000004f, 0.000002f, 0.000271f, 0.000563f, 0.000786f, 0.002211f, - 0.012207f, 0.711426f, 0.994629f, 0.994629f, 0.995117f, 0.994629f, 0.994629f, 0.994629f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000028f, 0.000083f, 0.000102f, 0.000110f, 0.000114f, 0.000117f, 0.000118f, - 0.000052f, 0.000019f, 0.000008f, 0.000004f, 0.000002f, 0.000314f, 0.000444f, 0.001049f, - 0.005669f, 0.266846f, 0.993164f, 0.993652f, 0.993164f, 0.993652f, 0.993164f, 0.993164f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000048f, 0.000089f, 0.000106f, 0.000112f, - 0.000115f, 0.000077f, 0.000026f, 0.000010f, 0.000005f, 0.000079f, 0.000425f, 0.000405f, - 0.002468f, 0.064209f, 0.990234f, 0.990723f, 0.990234f, 0.990234f, 0.990234f, 0.991211f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000020f, 0.000075f, - 0.000098f, 0.000108f, 0.000113f, 0.000044f, 0.000016f, 0.000006f, 0.000027f, 0.000270f, - 0.000825f, 0.018448f, 0.986328f, 0.986328f, 0.986328f, 0.986328f, 0.986328f, 0.986328f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000049f, 0.000085f, 0.000102f, 0.000070f, 0.000022f, 0.000008f, 0.000133f, - 0.000295f, 0.005318f, 0.978516f, 0.979004f, 0.977539f, 0.977539f, 0.978027f, 0.978516f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000066f, 0.000092f, 0.000036f, 0.000011f, - 0.000135f, 0.000925f, 0.959473f, 0.959961f, 0.959961f, 0.959473f, 0.959961f, 0.959473f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000027f, 0.000065f, - 0.000016f, 0.000109f, 0.907715f, 0.907227f, 0.907715f, 0.907227f, 0.907715f, 0.907715f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000017f, 0.711914f, 0.712402f, 0.711426f, 0.711426f, 0.711914f, 0.712402f, - }, - { - 0.076172f, 0.877441f, 0.964355f, 0.980957f, 0.987305f, 0.990723f, 0.992676f, 0.993652f, - 0.994629f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997559f, - 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.003897f, 0.033173f, 0.320557f, 0.863770f, 0.953613f, 0.975586f, 0.984863f, 0.988770f, - 0.991211f, 0.992676f, 0.994141f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, - 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000975f, 0.005951f, 0.020935f, 0.093140f, 0.501465f, 0.873047f, 0.950684f, 0.973145f, - 0.981934f, 0.986816f, 0.990234f, 0.992188f, 0.993164f, 0.994629f, 0.995605f, 0.996094f, - 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998535f, - 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000610f, 0.002430f, 0.006081f, 0.015915f, 0.045593f, 0.179810f, 0.635254f, 0.889648f, - 0.951172f, 0.972168f, 0.981445f, 0.986328f, 0.989746f, 0.991699f, 0.993652f, 0.994629f, - 0.995117f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, - 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.001219f, 0.002796f, 0.006172f, 0.012848f, 0.028458f, 0.081177f, 0.301758f, - 0.733398f, 0.905273f, 0.953613f, 0.972168f, 0.981445f, 0.986328f, 0.989258f, 0.991699f, - 0.993652f, 0.994141f, 0.995117f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997070f, - 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.000731f, 0.001706f, 0.003166f, 0.005470f, 0.010406f, 0.020813f, 0.047089f, - 0.136719f, 0.449951f, 0.803223f, 0.919434f, 0.957520f, 0.973633f, 0.981934f, 0.986328f, - 0.989746f, 0.991699f, 0.993164f, 0.994629f, 0.995117f, 0.995605f, 0.996582f, 0.996582f, - 0.997070f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.000366f, 0.001214f, 0.001894f, 0.003159f, 0.005108f, 0.008720f, 0.015839f, - 0.031586f, 0.074951f, 0.224121f, 0.596680f, 0.851074f, 0.932617f, 0.962402f, 0.975586f, - 0.982910f, 0.987305f, 0.989746f, 0.991699f, 0.993164f, 0.994141f, 0.995117f, 0.995605f, - 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000366f, 0.000731f, 0.000976f, 0.001827f, 0.002987f, 0.004757f, 0.007988f, - 0.013023f, 0.023544f, 0.048431f, 0.120239f, 0.352783f, 0.717285f, 0.887207f, 0.943848f, - 0.966309f, 0.978027f, 0.983887f, 0.987305f, 0.990234f, 0.992188f, 0.993652f, 0.994629f, - 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.998047f, 0.998047f, - 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000434f, 0.000488f, 0.000704f, 0.001218f, 0.002190f, 0.002783f, 0.004723f, - 0.006878f, 0.011040f, 0.018372f, 0.034241f, 0.073242f, 0.194336f, 0.510742f, 0.803711f, - 0.912598f, 0.952637f, 0.970703f, 0.979004f, 0.984863f, 0.988281f, 0.991211f, 0.992676f, - 0.994141f, 0.994629f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, - 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000243f, 0.000488f, 0.000488f, 0.000916f, 0.001219f, 0.002308f, 0.002914f, - 0.004124f, 0.006523f, 0.009537f, 0.014793f, 0.025833f, 0.050446f, 0.116089f, 0.312744f, - 0.661133f, 0.860840f, 0.931641f, 0.960449f, 0.974121f, 0.981445f, 0.986328f, 0.989258f, - 0.991211f, 0.992676f, 0.994141f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, - 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000121f, 0.000356f, 0.000488f, 0.000609f, 0.000944f, 0.001339f, 0.002296f, - 0.002964f, 0.003880f, 0.005676f, 0.008476f, 0.012909f, 0.020874f, 0.036926f, 0.075500f, - 0.187988f, 0.474854f, 0.774414f, 0.900391f, 0.946289f, 0.966309f, 0.978027f, 0.983887f, - 0.987793f, 0.990234f, 0.991699f, 0.993164f, 0.994141f, 0.995117f, 0.995605f, 0.996094f, - 0.997070f, 0.997070f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000244f, 0.000483f, 0.000488f, 0.000731f, 0.001070f, 0.001551f, - 0.002024f, 0.002520f, 0.003990f, 0.004738f, 0.007584f, 0.010834f, 0.016800f, 0.028763f, - 0.054535f, 0.120728f, 0.309082f, 0.642090f, 0.848145f, 0.926270f, 0.957031f, 0.971191f, - 0.980469f, 0.985352f, 0.988770f, 0.990723f, 0.992188f, 0.993652f, 0.994629f, 0.995605f, - 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000122f, 0.000242f, 0.000485f, 0.000608f, 0.000731f, 0.001091f, - 0.001339f, 0.001943f, 0.002602f, 0.003466f, 0.004845f, 0.006649f, 0.009529f, 0.014824f, - 0.023407f, 0.041351f, 0.083496f, 0.199951f, 0.482422f, 0.770996f, 0.896484f, 0.944336f, - 0.965332f, 0.976562f, 0.982910f, 0.986816f, 0.990234f, 0.991699f, 0.993164f, 0.994141f, - 0.995117f, 0.995117f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, - 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000121f, 0.000243f, 0.000243f, 0.000602f, 0.000609f, 0.000799f, - 0.001088f, 0.001459f, 0.001822f, 0.002432f, 0.003033f, 0.004375f, 0.006042f, 0.008560f, - 0.012810f, 0.019791f, 0.032715f, 0.061584f, 0.135254f, 0.335693f, 0.660156f, 0.853027f, - 0.926758f, 0.956543f, 0.972168f, 0.980469f, 0.984863f, 0.988281f, 0.991211f, 0.992676f, - 0.993652f, 0.994141f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, - 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000243f, 0.000366f, 0.000605f, 0.000730f, - 0.000731f, 0.001201f, 0.001458f, 0.001804f, 0.002428f, 0.003593f, 0.004234f, 0.005745f, - 0.007755f, 0.011139f, 0.016754f, 0.027054f, 0.047424f, 0.097107f, 0.231323f, 0.525879f, - 0.791016f, 0.902832f, 0.945801f, 0.966797f, 0.977051f, 0.982910f, 0.987793f, 0.990234f, - 0.991699f, 0.993164f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, - 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000116f, 0.000122f, 0.000365f, 0.000244f, 0.000602f, - 0.000721f, 0.000730f, 0.000852f, 0.001451f, 0.001842f, 0.002518f, 0.002993f, 0.004097f, - 0.005253f, 0.007099f, 0.009865f, 0.014908f, 0.022827f, 0.038879f, 0.072815f, 0.163940f, - 0.396484f, 0.707031f, 0.869141f, 0.932129f, 0.960449f, 0.973145f, 0.980957f, 0.986328f, - 0.988770f, 0.991211f, 0.992676f, 0.993652f, 0.994629f, 0.995605f, 0.996094f, 0.996582f, - 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000110f, 0.000361f, 0.000242f, 0.000244f, - 0.000602f, 0.000728f, 0.000853f, 0.001260f, 0.001569f, 0.001704f, 0.002287f, 0.003103f, - 0.003857f, 0.004848f, 0.006680f, 0.009003f, 0.012978f, 0.019897f, 0.032135f, 0.057983f, - 0.121033f, 0.291504f, 0.604980f, 0.827148f, 0.915039f, 0.953125f, 0.969238f, 0.978516f, - 0.984375f, 0.988281f, 0.991211f, 0.992188f, 0.993652f, 0.994141f, 0.995117f, 0.995605f, - 0.996582f, 0.996582f, 0.997070f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000241f, 0.000241f, 0.000365f, - 0.000365f, 0.000589f, 0.000852f, 0.000852f, 0.001246f, 0.001562f, 0.001812f, 0.002241f, - 0.002794f, 0.003633f, 0.004669f, 0.006069f, 0.008202f, 0.011772f, 0.016891f, 0.027618f, - 0.047089f, 0.093506f, 0.216309f, 0.495605f, 0.771484f, 0.894531f, 0.942383f, 0.965332f, - 0.976074f, 0.982910f, 0.987305f, 0.989746f, 0.991699f, 0.993164f, 0.994629f, 0.995117f, - 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000364f, - 0.000242f, 0.000487f, 0.000737f, 0.000730f, 0.000974f, 0.001083f, 0.001520f, 0.001701f, - 0.001938f, 0.002768f, 0.003658f, 0.004227f, 0.005741f, 0.007671f, 0.010796f, 0.015511f, - 0.023529f, 0.040009f, 0.074158f, 0.165405f, 0.395264f, 0.703613f, 0.868164f, 0.932129f, - 0.959473f, 0.973633f, 0.980957f, 0.985840f, 0.988770f, 0.991699f, 0.992676f, 0.994141f, - 0.995117f, 0.995117f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, - 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000100f, 0.000000f, 0.000241f, - 0.000224f, 0.000487f, 0.000488f, 0.000710f, 0.000972f, 0.000848f, 0.001181f, 0.001333f, - 0.001910f, 0.001830f, 0.002661f, 0.003298f, 0.004154f, 0.005386f, 0.007271f, 0.009735f, - 0.013908f, 0.021149f, 0.034149f, 0.062042f, 0.130371f, 0.313477f, 0.627930f, 0.837402f, - 0.919922f, 0.954590f, 0.970215f, 0.979492f, 0.985352f, 0.988770f, 0.991211f, 0.992676f, - 0.993652f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997559f, 0.997559f, - 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000049f, - 0.000242f, 0.000483f, 0.000606f, 0.000487f, 0.000695f, 0.000970f, 0.000974f, 0.001136f, - 0.001328f, 0.001694f, 0.002028f, 0.002617f, 0.002953f, 0.003847f, 0.004951f, 0.006653f, - 0.009193f, 0.012672f, 0.018661f, 0.029968f, 0.052673f, 0.106689f, 0.250977f, 0.549805f, - 0.801758f, 0.907227f, 0.948242f, 0.967773f, 0.978027f, 0.984375f, 0.987793f, 0.990723f, - 0.992188f, 0.993652f, 0.994629f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997559f, - 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000166f, 0.000243f, 0.000485f, 0.000487f, 0.000487f, 0.000945f, 0.000834f, 0.000974f, - 0.000974f, 0.001300f, 0.001810f, 0.002058f, 0.002573f, 0.002703f, 0.003761f, 0.004887f, - 0.006393f, 0.008514f, 0.011818f, 0.016937f, 0.026672f, 0.046051f, 0.089478f, 0.204712f, - 0.476807f, 0.762207f, 0.891602f, 0.942383f, 0.965820f, 0.976562f, 0.983398f, 0.987793f, - 0.990234f, 0.992188f, 0.993652f, 0.994629f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, - 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.000224f, 0.000358f, 0.000477f, 0.000486f, 0.000487f, 0.000580f, 0.000841f, - 0.000973f, 0.001079f, 0.001255f, 0.001649f, 0.002045f, 0.002241f, 0.002995f, 0.003841f, - 0.004826f, 0.005920f, 0.007866f, 0.010925f, 0.015930f, 0.024109f, 0.040619f, 0.077454f, - 0.171509f, 0.412354f, 0.720215f, 0.876953f, 0.936035f, 0.962402f, 0.975098f, 0.982422f, - 0.987305f, 0.990234f, 0.992188f, 0.993164f, 0.994629f, 0.995117f, 0.996094f, 0.996582f, - 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000165f, 0.000205f, 0.000411f, 0.000480f, 0.000486f, 0.000608f, 0.000688f, - 0.000966f, 0.000968f, 0.000974f, 0.001421f, 0.001489f, 0.001695f, 0.002090f, 0.002886f, - 0.003326f, 0.004608f, 0.005604f, 0.007317f, 0.010414f, 0.014862f, 0.022232f, 0.036469f, - 0.067810f, 0.146973f, 0.359375f, 0.680664f, 0.861816f, 0.931152f, 0.959961f, 0.974609f, - 0.981934f, 0.986816f, 0.989746f, 0.991699f, 0.993652f, 0.994629f, 0.995605f, 0.996094f, - 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000242f, 0.000453f, 0.000539f, 0.000486f, 0.000487f, - 0.000487f, 0.000957f, 0.000969f, 0.001202f, 0.001139f, 0.001393f, 0.001986f, 0.002045f, - 0.002863f, 0.003216f, 0.004128f, 0.005417f, 0.007378f, 0.009689f, 0.013466f, 0.020432f, - 0.033722f, 0.060883f, 0.129395f, 0.318115f, 0.642090f, 0.847656f, 0.926270f, 0.958008f, - 0.973145f, 0.981934f, 0.986328f, 0.989746f, 0.992188f, 0.993164f, 0.994629f, 0.995605f, - 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.000380f, 0.000482f, 0.000606f, - 0.000607f, 0.000608f, 0.000829f, 0.000970f, 0.000972f, 0.001070f, 0.001402f, 0.001812f, - 0.002138f, 0.002619f, 0.003246f, 0.004082f, 0.005318f, 0.006699f, 0.009262f, 0.012764f, - 0.019318f, 0.031052f, 0.055878f, 0.116821f, 0.286621f, 0.610352f, 0.835938f, 0.922852f, - 0.956543f, 0.973145f, 0.981445f, 0.986328f, 0.989746f, 0.991699f, 0.993652f, 0.995117f, - 0.995605f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.000350f, 0.000480f, - 0.000605f, 0.000596f, 0.000608f, 0.000890f, 0.000963f, 0.000972f, 0.000974f, 0.001316f, - 0.001798f, 0.002058f, 0.002560f, 0.002811f, 0.003983f, 0.005108f, 0.006489f, 0.008888f, - 0.012314f, 0.018021f, 0.029495f, 0.051941f, 0.107422f, 0.263428f, 0.585449f, 0.827148f, - 0.919434f, 0.956055f, 0.971680f, 0.981445f, 0.986816f, 0.989746f, 0.992188f, 0.994141f, - 0.995117f, 0.995605f, 0.996582f, 0.996582f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000130f, 0.000176f, 0.000462f, - 0.000483f, 0.000604f, 0.000607f, 0.000638f, 0.000922f, 0.000965f, 0.000971f, 0.001235f, - 0.001376f, 0.001769f, 0.002041f, 0.002575f, 0.003130f, 0.003487f, 0.004936f, 0.006264f, - 0.008415f, 0.012047f, 0.017517f, 0.027786f, 0.049164f, 0.101257f, 0.249512f, 0.568848f, - 0.821777f, 0.918945f, 0.956055f, 0.972168f, 0.981445f, 0.986816f, 0.990234f, 0.992188f, - 0.993652f, 0.995117f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000130f, 0.000122f, 0.000242f, - 0.000352f, 0.000560f, 0.000602f, 0.000604f, 0.000606f, 0.000767f, 0.001046f, 0.001089f, - 0.000973f, 0.001327f, 0.001583f, 0.002033f, 0.002272f, 0.002657f, 0.003563f, 0.004589f, - 0.006138f, 0.008194f, 0.011299f, 0.016861f, 0.026718f, 0.047119f, 0.097656f, 0.240967f, - 0.562500f, 0.821289f, 0.919922f, 0.957031f, 0.973145f, 0.981934f, 0.987305f, 0.990234f, - 0.992676f, 0.994141f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000241f, 0.000314f, 0.000459f, 0.000600f, 0.000605f, 0.000598f, 0.000804f, 0.000958f, - 0.001084f, 0.001104f, 0.001389f, 0.001709f, 0.002041f, 0.002211f, 0.002645f, 0.003635f, - 0.004467f, 0.005718f, 0.008072f, 0.011185f, 0.016846f, 0.026184f, 0.046112f, 0.094971f, - 0.239014f, 0.565430f, 0.825684f, 0.922363f, 0.958496f, 0.973633f, 0.983398f, 0.987793f, - 0.990723f, 0.992676f, 0.994141f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000238f, - 0.000122f, 0.000173f, 0.000246f, 0.000387f, 0.000480f, 0.000604f, 0.000604f, 0.000701f, - 0.000951f, 0.000968f, 0.001184f, 0.001315f, 0.001597f, 0.001899f, 0.002268f, 0.002813f, - 0.003716f, 0.004372f, 0.005886f, 0.007759f, 0.010918f, 0.015915f, 0.025726f, 0.045685f, - 0.095459f, 0.243774f, 0.579102f, 0.833984f, 0.926270f, 0.960449f, 0.976074f, 0.983887f, - 0.988770f, 0.991211f, 0.993164f, 0.994629f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, - 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999023f, 0.999512f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000238f, 0.000237f, 0.000242f, 0.000463f, 0.000585f, 0.000587f, 0.000718f, - 0.000607f, 0.000885f, 0.001081f, 0.001087f, 0.001299f, 0.001553f, 0.001982f, 0.002104f, - 0.002777f, 0.003494f, 0.004406f, 0.005798f, 0.007645f, 0.010750f, 0.016159f, 0.025467f, - 0.045959f, 0.097778f, 0.256104f, 0.603516f, 0.847168f, 0.931152f, 0.963379f, 0.977539f, - 0.985352f, 0.989258f, 0.991699f, 0.993652f, 0.995117f, 0.996094f, 0.996582f, 0.997559f, - 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000231f, 0.000122f, 0.000242f, 0.000242f, 0.000400f, 0.000525f, 0.000495f, - 0.000605f, 0.000607f, 0.000898f, 0.001075f, 0.001191f, 0.001133f, 0.001420f, 0.001794f, - 0.002041f, 0.002733f, 0.003548f, 0.004448f, 0.005585f, 0.007656f, 0.010735f, 0.015671f, - 0.025589f, 0.047363f, 0.102783f, 0.276855f, 0.637695f, 0.862793f, 0.938477f, 0.966797f, - 0.979004f, 0.985840f, 0.990234f, 0.992676f, 0.994141f, 0.995117f, 0.996582f, 0.997070f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000226f, 0.000242f, 0.000470f, 0.000469f, - 0.000547f, 0.000711f, 0.000723f, 0.000829f, 0.001024f, 0.001188f, 0.001081f, 0.001415f, - 0.001765f, 0.002048f, 0.002708f, 0.003252f, 0.004448f, 0.005711f, 0.007557f, 0.010780f, - 0.016220f, 0.026398f, 0.048950f, 0.111267f, 0.309082f, 0.680664f, 0.880371f, 0.945801f, - 0.970703f, 0.980957f, 0.986816f, 0.990723f, 0.993164f, 0.994629f, 0.995605f, 0.996582f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000204f, 0.000239f, 0.000242f, 0.000283f, - 0.000479f, 0.000594f, 0.000603f, 0.000606f, 0.000779f, 0.001068f, 0.001084f, 0.001118f, - 0.001515f, 0.001926f, 0.002098f, 0.002674f, 0.002975f, 0.004040f, 0.005478f, 0.007488f, - 0.010651f, 0.016327f, 0.027222f, 0.052460f, 0.123718f, 0.355713f, 0.729980f, 0.899902f, - 0.952637f, 0.973145f, 0.983887f, 0.988770f, 0.991699f, 0.994141f, 0.995117f, 0.996094f, - 0.997070f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000122f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000236f, 0.000207f, 0.000240f, - 0.000435f, 0.000534f, 0.000594f, 0.000602f, 0.000722f, 0.000727f, 0.000947f, 0.001081f, - 0.001090f, 0.001471f, 0.001829f, 0.002010f, 0.002478f, 0.002956f, 0.004051f, 0.005753f, - 0.007717f, 0.011040f, 0.017105f, 0.028748f, 0.057159f, 0.142944f, 0.421387f, 0.780762f, - 0.916992f, 0.960449f, 0.976562f, 0.985352f, 0.989746f, 0.992676f, 0.994629f, 0.996094f, - 0.997070f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000224f, 0.000232f, - 0.000230f, 0.000382f, 0.000472f, 0.000576f, 0.000715f, 0.000721f, 0.000727f, 0.001046f, - 0.001078f, 0.001186f, 0.001434f, 0.001674f, 0.002066f, 0.002546f, 0.003407f, 0.004181f, - 0.005634f, 0.007542f, 0.011330f, 0.017609f, 0.031189f, 0.064392f, 0.172729f, 0.506836f, - 0.828125f, 0.933105f, 0.966309f, 0.980469f, 0.987305f, 0.991211f, 0.993652f, 0.995117f, - 0.996582f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000232f, 0.000234f, 0.000352f, 0.000461f, 0.000535f, 0.000594f, 0.000722f, 0.000725f, - 0.000921f, 0.001116f, 0.001192f, 0.001416f, 0.001637f, 0.001911f, 0.002380f, 0.002949f, - 0.003948f, 0.005589f, 0.007942f, 0.011650f, 0.018631f, 0.034302f, 0.075867f, 0.219238f, - 0.607422f, 0.870605f, 0.946777f, 0.972656f, 0.983887f, 0.989258f, 0.992676f, 0.995117f, - 0.996094f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000239f, 0.000302f, 0.000396f, 0.000564f, 0.000674f, 0.000617f, - 0.000722f, 0.001003f, 0.001068f, 0.001084f, 0.001302f, 0.001598f, 0.001929f, 0.002375f, - 0.002935f, 0.004349f, 0.005714f, 0.007957f, 0.012306f, 0.020493f, 0.039001f, 0.092590f, - 0.293213f, 0.711426f, 0.905762f, 0.958984f, 0.978027f, 0.986328f, 0.990723f, 0.994141f, - 0.995605f, 0.996582f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000232f, 0.000227f, 0.000240f, 0.000282f, 0.000542f, 0.000703f, - 0.000718f, 0.000724f, 0.000833f, 0.001069f, 0.001184f, 0.001346f, 0.001464f, 0.001898f, - 0.002649f, 0.003164f, 0.004467f, 0.005863f, 0.008400f, 0.013199f, 0.022614f, 0.046051f, - 0.120605f, 0.406738f, 0.801270f, 0.931641f, 0.968262f, 0.982422f, 0.988770f, 0.992676f, - 0.994629f, 0.996094f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000219f, 0.000237f, 0.000235f, 0.000241f, 0.000480f, - 0.000584f, 0.000715f, 0.000723f, 0.000775f, 0.001061f, 0.000959f, 0.001139f, 0.001526f, - 0.001770f, 0.002546f, 0.003151f, 0.004250f, 0.006195f, 0.009071f, 0.014595f, 0.026413f, - 0.056763f, 0.169067f, 0.557617f, 0.869141f, 0.951172f, 0.976074f, 0.986328f, 0.990723f, - 0.994141f, 0.995605f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000216f, 0.000228f, 0.000285f, 0.000339f, - 0.000454f, 0.000572f, 0.000595f, 0.000721f, 0.000604f, 0.000930f, 0.000958f, 0.001171f, - 0.001431f, 0.001888f, 0.002663f, 0.003256f, 0.004402f, 0.006527f, 0.009964f, 0.016281f, - 0.031189f, 0.074524f, 0.258301f, 0.714355f, 0.916016f, 0.965332f, 0.982422f, 0.989746f, - 0.992676f, 0.995117f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000063f, 0.000120f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000194f, 0.000184f, 0.000228f, - 0.000340f, 0.000396f, 0.000668f, 0.000571f, 0.000478f, 0.000602f, 0.000919f, 0.000956f, - 0.001061f, 0.001497f, 0.001888f, 0.002565f, 0.003523f, 0.004578f, 0.006935f, 0.010765f, - 0.018417f, 0.038635f, 0.107727f, 0.416260f, 0.832520f, 0.946289f, 0.975586f, 0.986328f, - 0.991699f, 0.994629f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000045f, 0.000118f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000234f, 0.000294f, 0.000220f, 0.000486f, 0.000579f, 0.000588f, 0.000669f, 0.000878f, - 0.001038f, 0.001135f, 0.001451f, 0.001820f, 0.002529f, 0.003551f, 0.005199f, 0.007542f, - 0.012230f, 0.022369f, 0.051910f, 0.174927f, 0.630859f, 0.905273f, 0.965332f, 0.982910f, - 0.990234f, 0.993652f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000091f, 0.000117f, 0.000120f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000171f, 0.000151f, 0.000166f, 0.000195f, 0.000342f, 0.000452f, 0.000594f, 0.000599f, - 0.000862f, 0.001019f, 0.001135f, 0.001465f, 0.002031f, 0.002676f, 0.003714f, 0.005497f, - 0.008286f, 0.014320f, 0.028854f, 0.077332f, 0.322754f, 0.809082f, 0.946289f, 0.977051f, - 0.987793f, 0.993164f, 0.998047f, 0.998535f, 0.998047f, 0.998047f, 0.998535f, 0.998047f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000079f, 0.000105f, 0.000120f, - 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000008f, 0.000006f, 0.000098f, 0.000137f, 0.000233f, 0.000324f, 0.000566f, 0.000589f, - 0.000618f, 0.000874f, 0.000941f, 0.001108f, 0.001621f, 0.001880f, 0.002726f, 0.003788f, - 0.005840f, 0.009583f, 0.017563f, 0.039368f, 0.133545f, 0.582520f, 0.906738f, 0.968262f, - 0.984863f, 0.992188f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000069f, 0.000114f, - 0.000117f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000021f, - 0.000013f, 0.000009f, 0.000006f, 0.000004f, 0.000090f, 0.000206f, 0.000305f, 0.000538f, - 0.000585f, 0.000596f, 0.000869f, 0.000941f, 0.001149f, 0.001516f, 0.002150f, 0.002729f, - 0.004475f, 0.006660f, 0.011360f, 0.022690f, 0.061401f, 0.281494f, 0.813965f, 0.952148f, - 0.980957f, 0.990723f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000006f, - 0.000085f, 0.000114f, 0.000117f, 0.000119f, 0.000119f, 0.000120f, 0.000120f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000077f, 0.000041f, - 0.000022f, 0.000013f, 0.000009f, 0.000006f, 0.000066f, 0.000107f, 0.000223f, 0.000250f, - 0.000532f, 0.000576f, 0.000593f, 0.000784f, 0.000937f, 0.001126f, 0.001523f, 0.002306f, - 0.003193f, 0.004574f, 0.007717f, 0.014191f, 0.032410f, 0.116577f, 0.595215f, 0.921875f, - 0.974609f, 0.988770f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000056f, 0.000112f, 0.000114f, 0.000118f, 0.000119f, 0.000120f, - 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000074f, - 0.000038f, 0.000021f, 0.000013f, 0.000009f, 0.000006f, 0.000004f, 0.000003f, 0.000179f, - 0.000258f, 0.000367f, 0.000469f, 0.000583f, 0.000770f, 0.000932f, 0.001131f, 0.001758f, - 0.002483f, 0.003517f, 0.005432f, 0.009232f, 0.019302f, 0.054504f, 0.293457f, 0.853516f, - 0.964844f, 0.986816f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000015f, 0.000084f, 0.000107f, 0.000113f, 0.000117f, - 0.000118f, 0.000119f, 0.000120f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000076f, 0.000042f, 0.000023f, 0.000015f, 0.000009f, 0.000007f, 0.000005f, 0.000004f, - 0.000147f, 0.000238f, 0.000457f, 0.000545f, 0.000586f, 0.000821f, 0.000936f, 0.001139f, - 0.001849f, 0.002665f, 0.003687f, 0.006367f, 0.011810f, 0.028931f, 0.120605f, 0.687988f, - 0.947754f, 0.982910f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000082f, 0.000095f, - 0.000111f, 0.000115f, 0.000117f, 0.000118f, 0.000119f, 0.000119f, 0.000120f, 0.000120f, - 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000083f, 0.000042f, 0.000026f, 0.000015f, 0.000010f, 0.000007f, 0.000005f, - 0.000013f, 0.000086f, 0.000185f, 0.000309f, 0.000552f, 0.000577f, 0.000796f, 0.000925f, - 0.001251f, 0.001838f, 0.002878f, 0.004509f, 0.007572f, 0.016617f, 0.054932f, 0.391602f, - 0.912109f, 0.978516f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.996094f, 0.996094f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000095f, 0.000106f, 0.000112f, 0.000113f, 0.000115f, 0.000118f, 0.000118f, - 0.000119f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000099f, 0.000048f, 0.000027f, 0.000017f, 0.000011f, 0.000008f, - 0.000006f, 0.000004f, 0.000089f, 0.000182f, 0.000347f, 0.000495f, 0.000570f, 0.000777f, - 0.000922f, 0.001316f, 0.001831f, 0.003004f, 0.005028f, 0.010078f, 0.028183f, 0.161865f, - 0.833496f, 0.972168f, 0.995117f, 0.995605f, 0.995605f, 0.995117f, 0.995117f, 0.995605f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000074f, 0.000093f, 0.000107f, 0.000111f, 0.000115f, - 0.000116f, 0.000117f, 0.000118f, 0.000119f, 0.000119f, 0.000119f, 0.000120f, 0.000120f, - 0.000120f, 0.000120f, 0.000120f, 0.000121f, 0.000057f, 0.000032f, 0.000021f, 0.000013f, - 0.000008f, 0.000006f, 0.000005f, 0.000034f, 0.000159f, 0.000267f, 0.000514f, 0.000566f, - 0.000714f, 0.000888f, 0.001348f, 0.001995f, 0.003302f, 0.006447f, 0.015945f, 0.069153f, - 0.646484f, 0.960449f, 0.994629f, 0.995117f, 0.994629f, 0.995117f, 0.994629f, 0.995117f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000080f, 0.000095f, - 0.000102f, 0.000109f, 0.000114f, 0.000115f, 0.000116f, 0.000118f, 0.000118f, 0.000119f, - 0.000119f, 0.000119f, 0.000120f, 0.000120f, 0.000120f, 0.000077f, 0.000044f, 0.000025f, - 0.000015f, 0.000011f, 0.000007f, 0.000005f, 0.000004f, 0.000106f, 0.000244f, 0.000476f, - 0.000561f, 0.000622f, 0.000893f, 0.001266f, 0.001968f, 0.003990f, 0.009476f, 0.033234f, - 0.342529f, 0.940918f, 0.993652f, 0.993652f, 0.993652f, 0.993652f, 0.993652f, 0.993652f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000046f, 0.000079f, 0.000093f, 0.000104f, 0.000110f, 0.000111f, 0.000113f, 0.000116f, - 0.000117f, 0.000118f, 0.000118f, 0.000119f, 0.000119f, 0.000119f, 0.000092f, 0.000050f, - 0.000029f, 0.000019f, 0.000012f, 0.000009f, 0.000006f, 0.000004f, 0.000061f, 0.000188f, - 0.000324f, 0.000456f, 0.000525f, 0.000657f, 0.001371f, 0.002445f, 0.005634f, 0.017563f, - 0.135986f, 0.902832f, 0.992188f, 0.992188f, 0.992676f, 0.992188f, 0.992676f, 0.992188f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000038f, 0.000075f, 0.000092f, 0.000100f, 0.000105f, - 0.000111f, 0.000112f, 0.000114f, 0.000116f, 0.000117f, 0.000117f, 0.000118f, 0.000118f, - 0.000074f, 0.000041f, 0.000024f, 0.000016f, 0.000010f, 0.000007f, 0.000005f, 0.000033f, - 0.000167f, 0.000423f, 0.000410f, 0.000413f, 0.000575f, 0.001446f, 0.003387f, 0.009644f, - 0.056183f, 0.817383f, 0.990234f, 0.990234f, 0.990234f, 0.990723f, 0.990234f, 0.990723f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000011f, 0.000067f, - 0.000084f, 0.000096f, 0.000103f, 0.000108f, 0.000110f, 0.000113f, 0.000115f, 0.000115f, - 0.000116f, 0.000104f, 0.000057f, 0.000035f, 0.000021f, 0.000013f, 0.000009f, 0.000006f, - 0.000054f, 0.000161f, 0.000317f, 0.000332f, 0.000393f, 0.000723f, 0.001760f, 0.005203f, - 0.025345f, 0.617676f, 0.987793f, 0.987793f, 0.987793f, 0.988281f, 0.988281f, 0.988281f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000017f, 0.000052f, 0.000075f, 0.000091f, 0.000097f, 0.000105f, 0.000108f, - 0.000111f, 0.000113f, 0.000114f, 0.000085f, 0.000050f, 0.000031f, 0.000018f, 0.000012f, - 0.000008f, 0.000005f, 0.000095f, 0.000314f, 0.000306f, 0.000363f, 0.000813f, 0.002583f, - 0.011734f, 0.308105f, 0.983887f, 0.984375f, 0.984375f, 0.984375f, 0.983887f, 0.983887f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000037f, 0.000065f, 0.000083f, - 0.000093f, 0.000099f, 0.000105f, 0.000108f, 0.000110f, 0.000082f, 0.000045f, 0.000027f, - 0.000017f, 0.000011f, 0.000007f, 0.000114f, 0.000245f, 0.000209f, 0.000379f, 0.001151f, - 0.005260f, 0.107971f, 0.977539f, 0.979004f, 0.978027f, 0.978027f, 0.978027f, 0.978027f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000007f, 0.000045f, 0.000069f, 0.000084f, 0.000093f, 0.000099f, 0.000104f, 0.000076f, - 0.000044f, 0.000026f, 0.000016f, 0.000010f, 0.000012f, 0.000152f, 0.000179f, 0.000373f, - 0.001760f, 0.035522f, 0.969238f, 0.968750f, 0.968750f, 0.968750f, 0.968750f, 0.968750f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000014f, 0.000050f, 0.000070f, 0.000082f, - 0.000092f, 0.000075f, 0.000044f, 0.000026f, 0.000015f, 0.000009f, 0.000121f, 0.000117f, - 0.000611f, 0.010231f, 0.951172f, 0.951172f, 0.951172f, 0.951172f, 0.950684f, 0.951660f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000020f, 0.000047f, 0.000069f, 0.000077f, 0.000042f, 0.000024f, 0.000013f, 0.000078f, - 0.000130f, 0.001914f, 0.915039f, 0.915527f, 0.915039f, 0.915527f, 0.916016f, 0.915039f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000017f, 0.000047f, 0.000040f, 0.000019f, - 0.000035f, 0.000188f, 0.833984f, 0.833496f, 0.833496f, 0.834473f, 0.834473f, 0.833984f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000014f, 0.000007f, 0.642578f, 0.643555f, 0.643066f, 0.643555f, 0.642578f, 0.642578f, - }, - { - 0.113464f, 0.797852f, 0.930176f, 0.961914f, 0.974609f, 0.980469f, 0.984863f, 0.987793f, - 0.989258f, 0.991211f, 0.992188f, 0.993164f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, - 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997559f, - 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.007183f, 0.058716f, 0.349609f, 0.784668f, 0.912598f, 0.952148f, 0.968262f, 0.977539f, - 0.981934f, 0.985352f, 0.988281f, 0.990234f, 0.991211f, 0.992188f, 0.993652f, 0.993652f, - 0.994141f, 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, - 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.002432f, 0.011818f, 0.039581f, 0.143677f, 0.482910f, 0.800293f, 0.908691f, 0.947266f, - 0.964844f, 0.974609f, 0.980469f, 0.984375f, 0.987305f, 0.989258f, 0.990723f, 0.991699f, - 0.992676f, 0.993652f, 0.994141f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, - 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, - 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.001096f, 0.005062f, 0.012482f, 0.030151f, 0.079956f, 0.239014f, 0.581055f, 0.819824f, - 0.909180f, 0.946289f, 0.963379f, 0.973145f, 0.979492f, 0.983398f, 0.986328f, 0.988281f, - 0.990234f, 0.991699f, 0.992188f, 0.993164f, 0.994141f, 0.994629f, 0.995605f, 0.996094f, - 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, - 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000610f, 0.002434f, 0.005779f, 0.012207f, 0.023972f, 0.052765f, 0.129883f, 0.342773f, - 0.660156f, 0.841309f, 0.914062f, 0.947266f, 0.963379f, 0.973145f, 0.979004f, 0.982910f, - 0.985840f, 0.987793f, 0.989746f, 0.991211f, 0.992188f, 0.993164f, 0.994141f, 0.994629f, - 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, - 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000397f, 0.001559f, 0.003397f, 0.006058f, 0.011177f, 0.020355f, 0.039307f, 0.083130f, - 0.196777f, 0.452148f, 0.724121f, 0.862305f, 0.920410f, 0.949219f, 0.964355f, 0.973145f, - 0.979004f, 0.982910f, 0.985840f, 0.988770f, 0.989258f, 0.991211f, 0.992188f, 0.993164f, - 0.994141f, 0.994629f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, - 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000366f, 0.001097f, 0.002163f, 0.003523f, 0.006268f, 0.010941f, 0.017487f, 0.030930f, - 0.058411f, 0.122925f, 0.281738f, 0.556152f, 0.776367f, 0.881348f, 0.928223f, 0.951660f, - 0.966309f, 0.973633f, 0.979492f, 0.983398f, 0.986328f, 0.988281f, 0.989746f, 0.991211f, - 0.992188f, 0.993164f, 0.994141f, 0.994629f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, - 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.000728f, 0.001340f, 0.002533f, 0.003813f, 0.006081f, 0.009750f, 0.015419f, - 0.025177f, 0.044067f, 0.084473f, 0.179077f, 0.384033f, 0.649902f, 0.818848f, 0.897949f, - 0.935547f, 0.956055f, 0.967285f, 0.975098f, 0.980957f, 0.983887f, 0.986328f, 0.988281f, - 0.990234f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, 0.995117f, 0.995605f, 0.996094f, - 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, - 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.000609f, 0.000854f, 0.001898f, 0.002781f, 0.004246f, 0.006218f, 0.008835f, - 0.013504f, 0.021362f, 0.035400f, 0.062347f, 0.121460f, 0.255127f, 0.495361f, 0.726562f, - 0.852539f, 0.912598f, 0.943359f, 0.959473f, 0.969238f, 0.976562f, 0.981445f, 0.984375f, - 0.987305f, 0.988770f, 0.990234f, 0.991699f, 0.992676f, 0.993652f, 0.994629f, 0.995117f, - 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, - 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.000244f, 0.000731f, 0.001295f, 0.002159f, 0.003092f, 0.004051f, 0.005836f, - 0.008560f, 0.011925f, 0.018585f, 0.029373f, 0.048950f, 0.088013f, 0.174194f, 0.354980f, - 0.604492f, 0.788086f, 0.880371f, 0.925293f, 0.950195f, 0.963867f, 0.972168f, 0.978027f, - 0.982422f, 0.985840f, 0.987793f, 0.990234f, 0.991699f, 0.992188f, 0.993164f, 0.994141f, - 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997070f, - 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000114f, 0.000244f, 0.000709f, 0.001089f, 0.001580f, 0.002100f, 0.002848f, 0.004028f, - 0.005646f, 0.008232f, 0.011276f, 0.016647f, 0.024948f, 0.039215f, 0.067566f, 0.125244f, - 0.249878f, 0.471436f, 0.698242f, 0.834961f, 0.902344f, 0.937012f, 0.955078f, 0.967773f, - 0.974609f, 0.979492f, 0.983887f, 0.987305f, 0.988770f, 0.990723f, 0.991699f, 0.992676f, - 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, - 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000244f, 0.000480f, 0.001081f, 0.001216f, 0.001684f, 0.002287f, 0.003113f, - 0.004246f, 0.005711f, 0.007412f, 0.010658f, 0.014900f, 0.021408f, 0.033173f, 0.053711f, - 0.094299f, 0.179688f, 0.351807f, 0.591309f, 0.774902f, 0.871582f, 0.919922f, 0.946289f, - 0.961426f, 0.971191f, 0.977051f, 0.981934f, 0.984863f, 0.987305f, 0.989258f, 0.991211f, - 0.992188f, 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.996094f, - 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.997559f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000364f, 0.000366f, 0.000729f, 0.001195f, 0.001218f, 0.001693f, 0.002209f, - 0.003038f, 0.004192f, 0.005249f, 0.006981f, 0.009926f, 0.013405f, 0.019165f, 0.028473f, - 0.044250f, 0.073975f, 0.134521f, 0.260010f, 0.476562f, 0.696289f, 0.830566f, 0.898438f, - 0.933594f, 0.954102f, 0.966309f, 0.974609f, 0.979492f, 0.982910f, 0.986328f, 0.988281f, - 0.989746f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, 0.995605f, - 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, - 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000226f, 0.000365f, 0.000488f, 0.000731f, 0.001090f, 0.001245f, 0.002028f, - 0.002169f, 0.003023f, 0.003952f, 0.005043f, 0.006790f, 0.009026f, 0.012276f, 0.016754f, - 0.024628f, 0.037384f, 0.060120f, 0.104431f, 0.196045f, 0.372803f, 0.604980f, 0.779785f, - 0.872070f, 0.919922f, 0.945312f, 0.960938f, 0.970703f, 0.977539f, 0.980957f, 0.984863f, - 0.987305f, 0.989258f, 0.991211f, 0.992188f, 0.993164f, 0.993652f, 0.994629f, 0.995117f, - 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, - 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000364f, 0.000487f, 0.000488f, 0.000608f, 0.001092f, 0.001323f, - 0.001909f, 0.002028f, 0.002829f, 0.003754f, 0.004940f, 0.006329f, 0.008850f, 0.011353f, - 0.015572f, 0.022110f, 0.032196f, 0.050293f, 0.083984f, 0.151978f, 0.288574f, 0.507812f, - 0.715332f, 0.839844f, 0.902832f, 0.936035f, 0.955566f, 0.966797f, 0.974609f, 0.979492f, - 0.983887f, 0.986816f, 0.988281f, 0.989746f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, - 0.994629f, 0.995605f, 0.995605f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, - 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000341f, 0.000486f, 0.000487f, 0.000591f, 0.000846f, 0.001213f, - 0.001407f, 0.002018f, 0.002306f, 0.003119f, 0.003736f, 0.004700f, 0.005936f, 0.007858f, - 0.010498f, 0.013939f, 0.019913f, 0.028564f, 0.043060f, 0.069275f, 0.120972f, 0.225830f, - 0.416748f, 0.642090f, 0.798828f, 0.881836f, 0.924805f, 0.948730f, 0.962891f, 0.971191f, - 0.978516f, 0.982422f, 0.985352f, 0.987793f, 0.989746f, 0.991211f, 0.992676f, 0.993164f, - 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996582f, 0.996582f, 0.996582f, 0.997070f, - 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000121f, 0.000122f, 0.000475f, 0.000486f, 0.000487f, 0.000714f, 0.000913f, - 0.001296f, 0.001350f, 0.001884f, 0.002163f, 0.002871f, 0.003702f, 0.004578f, 0.005573f, - 0.007278f, 0.009819f, 0.013039f, 0.017883f, 0.025589f, 0.037445f, 0.058655f, 0.099243f, - 0.180542f, 0.338867f, 0.563965f, 0.751465f, 0.857422f, 0.912109f, 0.941406f, 0.958496f, - 0.968262f, 0.976074f, 0.980957f, 0.984375f, 0.986816f, 0.989258f, 0.990723f, 0.992188f, - 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996582f, 0.996582f, 0.997070f, - 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000122f, 0.000242f, 0.000417f, 0.000607f, 0.000602f, 0.000644f, - 0.001016f, 0.001223f, 0.001337f, 0.002010f, 0.002087f, 0.002752f, 0.003380f, 0.004486f, - 0.005760f, 0.007523f, 0.009048f, 0.012169f, 0.016312f, 0.022949f, 0.033295f, 0.050812f, - 0.082886f, 0.146851f, 0.275635f, 0.486572f, 0.696777f, 0.828613f, 0.896484f, 0.933594f, - 0.953613f, 0.965820f, 0.973633f, 0.979980f, 0.983887f, 0.986328f, 0.988770f, 0.990723f, - 0.992188f, 0.993164f, 0.993652f, 0.994141f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, - 0.996582f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000262f, 0.000463f, 0.000603f, 0.000665f, - 0.000716f, 0.001069f, 0.001322f, 0.001538f, 0.001895f, 0.002293f, 0.003120f, 0.003323f, - 0.004166f, 0.005638f, 0.006828f, 0.008942f, 0.011368f, 0.015465f, 0.021057f, 0.029663f, - 0.044861f, 0.070923f, 0.123169f, 0.228149f, 0.416504f, 0.640137f, 0.797363f, 0.880859f, - 0.924805f, 0.948730f, 0.963379f, 0.971680f, 0.978516f, 0.982422f, 0.985840f, 0.988281f, - 0.990723f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, 0.996094f, - 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000120f, 0.000172f, 0.000243f, 0.000365f, 0.000475f, 0.000607f, - 0.000608f, 0.000609f, 0.001013f, 0.001424f, 0.001456f, 0.001904f, 0.002411f, 0.002903f, - 0.003145f, 0.004314f, 0.004944f, 0.006607f, 0.008156f, 0.010719f, 0.014297f, 0.018906f, - 0.027069f, 0.040070f, 0.062103f, 0.104858f, 0.191162f, 0.355469f, 0.581543f, 0.762695f, - 0.863281f, 0.915039f, 0.943848f, 0.960449f, 0.970703f, 0.977051f, 0.981445f, 0.985840f, - 0.987793f, 0.989746f, 0.991211f, 0.992676f, 0.993652f, 0.994141f, 0.995117f, 0.995605f, - 0.996094f, 0.996094f, 0.997070f, 0.997070f, 0.998047f, 0.997559f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000096f, 0.000239f, 0.000241f, 0.000336f, 0.000482f, - 0.000719f, 0.000729f, 0.000831f, 0.001049f, 0.001552f, 0.001576f, 0.001710f, 0.002373f, - 0.002846f, 0.003254f, 0.004051f, 0.005035f, 0.006405f, 0.007706f, 0.009987f, 0.013092f, - 0.017715f, 0.024872f, 0.035980f, 0.055328f, 0.091248f, 0.163330f, 0.305664f, 0.524902f, - 0.726562f, 0.845215f, 0.906250f, 0.938965f, 0.957031f, 0.969238f, 0.976074f, 0.981445f, - 0.984863f, 0.987305f, 0.989258f, 0.991211f, 0.992188f, 0.993164f, 0.994141f, 0.995117f, - 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000118f, 0.000120f, 0.000351f, 0.000364f, 0.000421f, - 0.000480f, 0.000606f, 0.000728f, 0.000852f, 0.001175f, 0.001535f, 0.001673f, 0.001671f, - 0.002277f, 0.002743f, 0.003220f, 0.003922f, 0.004868f, 0.005951f, 0.007488f, 0.009430f, - 0.012527f, 0.016266f, 0.022964f, 0.033142f, 0.049805f, 0.080688f, 0.141846f, 0.265625f, - 0.473145f, 0.688477f, 0.825684f, 0.897949f, 0.934082f, 0.954102f, 0.966797f, 0.975098f, - 0.980469f, 0.984375f, 0.987305f, 0.989258f, 0.991211f, 0.992676f, 0.993164f, 0.993652f, - 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000058f, 0.000235f, 0.000360f, 0.000243f, - 0.000440f, 0.000583f, 0.000847f, 0.000851f, 0.000852f, 0.001189f, 0.001411f, 0.001645f, - 0.001898f, 0.002417f, 0.002617f, 0.003435f, 0.003695f, 0.004616f, 0.005733f, 0.007278f, - 0.009216f, 0.012016f, 0.015701f, 0.021561f, 0.030396f, 0.045746f, 0.073120f, 0.125732f, - 0.233521f, 0.428223f, 0.653320f, 0.807617f, 0.887695f, 0.929688f, 0.951660f, 0.965820f, - 0.974121f, 0.980469f, 0.984375f, 0.986816f, 0.989746f, 0.991211f, 0.992676f, 0.993164f, - 0.994141f, 0.995117f, 0.995605f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, - 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000237f, 0.000237f, 0.000362f, - 0.000365f, 0.000558f, 0.000814f, 0.000727f, 0.000729f, 0.000935f, 0.001189f, 0.001403f, - 0.001569f, 0.001989f, 0.002216f, 0.002533f, 0.003307f, 0.003906f, 0.004463f, 0.005646f, - 0.006908f, 0.008980f, 0.011230f, 0.014755f, 0.020020f, 0.028320f, 0.041931f, 0.065979f, - 0.113098f, 0.209229f, 0.389648f, 0.620605f, 0.789551f, 0.879395f, 0.924805f, 0.950684f, - 0.964844f, 0.974121f, 0.979980f, 0.983398f, 0.987305f, 0.989258f, 0.991211f, 0.992676f, - 0.993652f, 0.993652f, 0.995117f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, - 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000121f, - 0.000241f, 0.000486f, 0.000575f, 0.000707f, 0.000726f, 0.000971f, 0.000849f, 0.000966f, - 0.001350f, 0.001660f, 0.001678f, 0.002224f, 0.002483f, 0.003197f, 0.003611f, 0.004200f, - 0.005318f, 0.006744f, 0.008476f, 0.010506f, 0.014145f, 0.019089f, 0.026627f, 0.039001f, - 0.061096f, 0.103333f, 0.189819f, 0.358887f, 0.591309f, 0.773438f, 0.872559f, 0.922363f, - 0.948730f, 0.963867f, 0.973145f, 0.979492f, 0.983887f, 0.986816f, 0.989258f, 0.991211f, - 0.992188f, 0.993164f, 0.994629f, 0.995117f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, - 0.998047f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000175f, 0.000361f, - 0.000481f, 0.000485f, 0.000364f, 0.000562f, 0.000703f, 0.000827f, 0.000842f, 0.000972f, - 0.001172f, 0.001321f, 0.001675f, 0.001684f, 0.002153f, 0.002455f, 0.003122f, 0.003391f, - 0.004177f, 0.005314f, 0.006325f, 0.007896f, 0.010368f, 0.013527f, 0.018082f, 0.025162f, - 0.037140f, 0.057343f, 0.095886f, 0.175659f, 0.334473f, 0.567871f, 0.760742f, 0.866699f, - 0.919922f, 0.947754f, 0.963379f, 0.972656f, 0.979492f, 0.984375f, 0.987305f, 0.989258f, - 0.991211f, 0.992676f, 0.993652f, 0.994629f, 0.995117f, 0.996094f, 0.996582f, 0.997070f, - 0.998047f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000325f, - 0.000311f, 0.000243f, 0.000484f, 0.000486f, 0.000536f, 0.000698f, 0.000723f, 0.000844f, - 0.000972f, 0.001081f, 0.001312f, 0.001658f, 0.001914f, 0.001932f, 0.002390f, 0.003017f, - 0.003668f, 0.004353f, 0.005199f, 0.006336f, 0.007812f, 0.009972f, 0.012802f, 0.017029f, - 0.024200f, 0.035034f, 0.053833f, 0.090027f, 0.164185f, 0.316162f, 0.549805f, 0.751465f, - 0.863281f, 0.918457f, 0.947266f, 0.963379f, 0.974121f, 0.979492f, 0.984375f, 0.987793f, - 0.989746f, 0.991699f, 0.993164f, 0.994141f, 0.995117f, 0.995605f, 0.996094f, 0.997070f, - 0.997559f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, - 0.000231f, 0.000453f, 0.000480f, 0.000484f, 0.000485f, 0.000486f, 0.000917f, 0.000963f, - 0.000969f, 0.000970f, 0.001043f, 0.001288f, 0.001523f, 0.001684f, 0.001885f, 0.002464f, - 0.002531f, 0.003565f, 0.004124f, 0.004745f, 0.006077f, 0.007580f, 0.009605f, 0.012634f, - 0.016953f, 0.023346f, 0.033386f, 0.051697f, 0.085632f, 0.156250f, 0.303955f, 0.537598f, - 0.746582f, 0.860840f, 0.918457f, 0.947754f, 0.963867f, 0.973633f, 0.979980f, 0.984863f, - 0.987793f, 0.990234f, 0.991699f, 0.993652f, 0.994141f, 0.995117f, 0.996094f, 0.996582f, - 0.997070f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.000235f, 0.000239f, 0.000359f, 0.000484f, 0.000485f, 0.000486f, 0.000628f, - 0.000957f, 0.000967f, 0.000969f, 0.001065f, 0.001288f, 0.001602f, 0.001850f, 0.001995f, - 0.002409f, 0.002523f, 0.003462f, 0.003838f, 0.004993f, 0.005917f, 0.007233f, 0.009338f, - 0.012230f, 0.015610f, 0.022415f, 0.032288f, 0.049805f, 0.082947f, 0.151489f, 0.296631f, - 0.532715f, 0.745117f, 0.862793f, 0.919434f, 0.948242f, 0.964844f, 0.974609f, 0.980957f, - 0.985352f, 0.988281f, 0.990723f, 0.992676f, 0.994141f, 0.994629f, 0.995605f, 0.996094f, - 0.996582f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000187f, 0.000437f, 0.000473f, 0.000483f, 0.000485f, 0.000606f, - 0.000583f, 0.000711f, 0.000772f, 0.000968f, 0.001107f, 0.001287f, 0.001434f, 0.001662f, - 0.001984f, 0.002449f, 0.002634f, 0.003145f, 0.003777f, 0.004410f, 0.005722f, 0.007114f, - 0.008926f, 0.011696f, 0.016006f, 0.021683f, 0.031342f, 0.048309f, 0.080750f, 0.149170f, - 0.294678f, 0.534668f, 0.749512f, 0.866211f, 0.922363f, 0.950684f, 0.966309f, 0.975586f, - 0.981934f, 0.985840f, 0.989258f, 0.991699f, 0.992676f, 0.994141f, 0.994629f, 0.996094f, - 0.996582f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000247f, 0.000238f, 0.000407f, 0.000482f, 0.000484f, - 0.000604f, 0.000869f, 0.000909f, 0.000721f, 0.000955f, 0.001000f, 0.001241f, 0.001342f, - 0.001655f, 0.001721f, 0.002329f, 0.002623f, 0.003086f, 0.003677f, 0.004349f, 0.005600f, - 0.006962f, 0.008835f, 0.011581f, 0.015274f, 0.021286f, 0.030884f, 0.047760f, 0.079895f, - 0.148926f, 0.298584f, 0.543945f, 0.758301f, 0.872559f, 0.925781f, 0.953125f, 0.967773f, - 0.977051f, 0.982910f, 0.986816f, 0.989258f, 0.991211f, 0.993164f, 0.994629f, 0.995605f, - 0.996094f, 0.996582f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000237f, 0.000410f, 0.000472f, 0.000481f, - 0.000483f, 0.000485f, 0.000687f, 0.000913f, 0.000956f, 0.000966f, 0.000997f, 0.001341f, - 0.001415f, 0.001813f, 0.002029f, 0.002043f, 0.002594f, 0.003210f, 0.003641f, 0.004734f, - 0.005356f, 0.006882f, 0.008675f, 0.011360f, 0.014816f, 0.020920f, 0.030380f, 0.047485f, - 0.080200f, 0.151733f, 0.308105f, 0.561523f, 0.772949f, 0.881348f, 0.931152f, 0.956055f, - 0.969727f, 0.978516f, 0.983887f, 0.987793f, 0.990234f, 0.992188f, 0.993652f, 0.994629f, - 0.995605f, 0.996094f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000254f, 0.000345f, 0.000468f, - 0.000585f, 0.000482f, 0.000603f, 0.000485f, 0.000862f, 0.000928f, 0.000965f, 0.001174f, - 0.001162f, 0.001405f, 0.001761f, 0.002016f, 0.002182f, 0.002733f, 0.002831f, 0.003504f, - 0.004456f, 0.005440f, 0.006775f, 0.008553f, 0.011055f, 0.014694f, 0.020859f, 0.030334f, - 0.047852f, 0.081970f, 0.157593f, 0.325439f, 0.586914f, 0.790527f, 0.890137f, 0.936523f, - 0.959473f, 0.973145f, 0.980469f, 0.985352f, 0.988770f, 0.990723f, 0.992676f, 0.994141f, - 0.995117f, 0.996094f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000241f, 0.000237f, 0.000340f, - 0.000457f, 0.000580f, 0.000481f, 0.000601f, 0.000605f, 0.000742f, 0.000951f, 0.000953f, - 0.001131f, 0.001257f, 0.001396f, 0.001730f, 0.001936f, 0.002102f, 0.002682f, 0.002762f, - 0.003733f, 0.004425f, 0.005344f, 0.006516f, 0.008354f, 0.010971f, 0.014793f, 0.020859f, - 0.030640f, 0.048859f, 0.085144f, 0.167358f, 0.350586f, 0.620117f, 0.811035f, 0.900391f, - 0.942383f, 0.963379f, 0.975098f, 0.981934f, 0.986816f, 0.989746f, 0.992188f, 0.993164f, - 0.994629f, 0.995117f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000131f, - 0.000301f, 0.000430f, 0.000470f, 0.000593f, 0.000571f, 0.000587f, 0.000693f, 0.000906f, - 0.000959f, 0.000965f, 0.001094f, 0.001364f, 0.001522f, 0.001783f, 0.002094f, 0.002615f, - 0.003038f, 0.003365f, 0.004307f, 0.005135f, 0.006493f, 0.008347f, 0.011055f, 0.014824f, - 0.020844f, 0.031204f, 0.050507f, 0.090027f, 0.182129f, 0.385498f, 0.659668f, 0.834473f, - 0.913086f, 0.949219f, 0.967285f, 0.978027f, 0.983887f, 0.987793f, 0.991211f, 0.992188f, - 0.994141f, 0.995117f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000189f, 0.000122f, 0.000122f, - 0.000241f, 0.000295f, 0.000425f, 0.000457f, 0.000592f, 0.000481f, 0.000603f, 0.000697f, - 0.000926f, 0.000943f, 0.000960f, 0.001022f, 0.001435f, 0.001632f, 0.001658f, 0.002024f, - 0.002468f, 0.003010f, 0.003210f, 0.004124f, 0.005219f, 0.006351f, 0.008163f, 0.010933f, - 0.015030f, 0.021271f, 0.032257f, 0.053009f, 0.097534f, 0.203003f, 0.432373f, 0.704102f, - 0.858887f, 0.924805f, 0.955566f, 0.970703f, 0.979492f, 0.985840f, 0.989258f, 0.991699f, - 0.993164f, 0.995117f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000214f, - 0.000201f, 0.000239f, 0.000241f, 0.000383f, 0.000461f, 0.000474f, 0.000479f, 0.000598f, - 0.000736f, 0.000905f, 0.000947f, 0.001072f, 0.001180f, 0.001376f, 0.001572f, 0.001752f, - 0.001900f, 0.002258f, 0.002792f, 0.003487f, 0.004055f, 0.005161f, 0.006424f, 0.008209f, - 0.010933f, 0.015030f, 0.021942f, 0.033630f, 0.056671f, 0.107666f, 0.233276f, 0.492188f, - 0.752441f, 0.881836f, 0.937012f, 0.961914f, 0.975098f, 0.982910f, 0.987305f, 0.990234f, - 0.992676f, 0.994629f, 0.998535f, 0.998535f, 0.998535f, 0.998047f, 0.998535f, 0.998535f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000132f, - 0.000224f, 0.000129f, 0.000237f, 0.000240f, 0.000337f, 0.000430f, 0.000468f, 0.000579f, - 0.000593f, 0.000602f, 0.000881f, 0.000936f, 0.000956f, 0.000963f, 0.001282f, 0.001519f, - 0.001607f, 0.001852f, 0.002150f, 0.002737f, 0.003508f, 0.003990f, 0.005077f, 0.006516f, - 0.008179f, 0.011185f, 0.015511f, 0.022446f, 0.035614f, 0.061859f, 0.122681f, 0.275879f, - 0.563965f, 0.798828f, 0.903809f, 0.946777f, 0.967773f, 0.978516f, 0.984863f, 0.988770f, - 0.991699f, 0.993652f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000149f, 0.000122f, 0.000207f, 0.000371f, 0.000430f, 0.000573f, - 0.000591f, 0.000598f, 0.000597f, 0.000804f, 0.000901f, 0.000948f, 0.001053f, 0.001083f, - 0.001376f, 0.001584f, 0.001878f, 0.002331f, 0.002529f, 0.003376f, 0.003944f, 0.005230f, - 0.006504f, 0.008537f, 0.011459f, 0.015747f, 0.024002f, 0.038361f, 0.069458f, 0.144409f, - 0.336914f, 0.644043f, 0.841797f, 0.922363f, 0.957520f, 0.972656f, 0.981934f, 0.987305f, - 0.990234f, 0.993164f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000230f, 0.000234f, 0.000235f, 0.000268f, 0.000400f, - 0.000448f, 0.000585f, 0.000590f, 0.000599f, 0.000641f, 0.000788f, 0.000930f, 0.000968f, - 0.001107f, 0.001251f, 0.001656f, 0.001701f, 0.002047f, 0.002691f, 0.003437f, 0.003998f, - 0.004829f, 0.006329f, 0.008492f, 0.011757f, 0.016525f, 0.025345f, 0.042297f, 0.080200f, - 0.177490f, 0.420654f, 0.724121f, 0.878906f, 0.938965f, 0.964355f, 0.977539f, 0.984863f, - 0.989746f, 0.992188f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000214f, 0.000235f, 0.000228f, 0.000240f, - 0.000429f, 0.000439f, 0.000574f, 0.000654f, 0.000583f, 0.000493f, 0.000788f, 0.000813f, - 0.000947f, 0.001062f, 0.001225f, 0.001569f, 0.001721f, 0.002048f, 0.002844f, 0.002979f, - 0.003902f, 0.004997f, 0.006454f, 0.008698f, 0.012192f, 0.018143f, 0.027634f, 0.047913f, - 0.095886f, 0.228394f, 0.526855f, 0.796875f, 0.910156f, 0.953125f, 0.973145f, 0.982422f, - 0.987793f, 0.991699f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000205f, 0.000236f, - 0.000232f, 0.000299f, 0.000446f, 0.000417f, 0.000466f, 0.000580f, 0.000508f, 0.000710f, - 0.000800f, 0.000940f, 0.000954f, 0.001228f, 0.001496f, 0.001631f, 0.002043f, 0.002798f, - 0.003359f, 0.004139f, 0.004951f, 0.006680f, 0.008995f, 0.012764f, 0.018860f, 0.030823f, - 0.056061f, 0.120911f, 0.307617f, 0.645508f, 0.855957f, 0.934082f, 0.964355f, 0.978516f, - 0.985840f, 0.990234f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000226f, - 0.000122f, 0.000226f, 0.000373f, 0.000272f, 0.000325f, 0.000460f, 0.000471f, 0.000477f, - 0.000673f, 0.000877f, 0.000929f, 0.000951f, 0.001129f, 0.001446f, 0.001614f, 0.002096f, - 0.002619f, 0.002939f, 0.003941f, 0.005363f, 0.006844f, 0.009491f, 0.013596f, 0.020905f, - 0.035370f, 0.068420f, 0.161743f, 0.426270f, 0.755859f, 0.900879f, 0.952148f, 0.973145f, - 0.983398f, 0.989746f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000111f, 0.000236f, 0.000297f, 0.000368f, 0.000449f, 0.000467f, - 0.000588f, 0.000641f, 0.000813f, 0.000924f, 0.001035f, 0.001124f, 0.001348f, 0.001764f, - 0.001922f, 0.002439f, 0.003160f, 0.004005f, 0.005280f, 0.007107f, 0.010109f, 0.014748f, - 0.023148f, 0.041595f, 0.088440f, 0.232910f, 0.578125f, 0.841797f, 0.933594f, 0.965820f, - 0.980469f, 0.987305f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000014f, 0.000011f, 0.000116f, 0.000148f, 0.000128f, 0.000369f, 0.000418f, - 0.000563f, 0.000470f, 0.000592f, 0.000776f, 0.000901f, 0.000937f, 0.001112f, 0.001348f, - 0.001743f, 0.001904f, 0.002470f, 0.003187f, 0.003986f, 0.005360f, 0.007557f, 0.010674f, - 0.016068f, 0.026871f, 0.051666f, 0.122925f, 0.356445f, 0.729492f, 0.901855f, 0.955078f, - 0.976074f, 0.985840f, 0.996094f, 0.996582f, 0.996094f, 0.996582f, 0.996094f, 0.996582f, - 0.000122f, 0.000122f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000028f, 0.000019f, 0.000014f, 0.000011f, 0.000033f, 0.000118f, 0.000247f, 0.000305f, - 0.000412f, 0.000447f, 0.000576f, 0.000587f, 0.000693f, 0.000850f, 0.000949f, 0.001083f, - 0.001319f, 0.001557f, 0.001957f, 0.002424f, 0.003340f, 0.004417f, 0.005688f, 0.007774f, - 0.011497f, 0.017731f, 0.032257f, 0.068604f, 0.189575f, 0.541992f, 0.843262f, 0.938477f, - 0.970703f, 0.983887f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, - 0.000121f, 0.000118f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000067f, - 0.000042f, 0.000028f, 0.000020f, 0.000015f, 0.000066f, 0.000009f, 0.000101f, 0.000118f, - 0.000260f, 0.000358f, 0.000520f, 0.000456f, 0.000563f, 0.000711f, 0.000872f, 0.000980f, - 0.001059f, 0.001309f, 0.001699f, 0.002066f, 0.002708f, 0.003248f, 0.004166f, 0.005836f, - 0.008224f, 0.012619f, 0.021484f, 0.041260f, 0.101074f, 0.323486f, 0.733887f, 0.912109f, - 0.962402f, 0.980957f, 0.995117f, 0.995117f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, - 0.000000f, 0.000000f, 0.000119f, 0.000119f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000105f, - 0.000067f, 0.000042f, 0.000029f, 0.000022f, 0.000015f, 0.000011f, 0.000040f, 0.000033f, - 0.000153f, 0.000204f, 0.000313f, 0.000501f, 0.000554f, 0.000575f, 0.000585f, 0.000778f, - 0.000925f, 0.000980f, 0.001245f, 0.001634f, 0.001989f, 0.002413f, 0.003433f, 0.004028f, - 0.005989f, 0.008911f, 0.014374f, 0.026443f, 0.057495f, 0.170166f, 0.549805f, 0.864746f, - 0.951172f, 0.977051f, 0.994629f, 0.994629f, 0.994629f, 0.994629f, 0.995605f, 0.994629f, - 0.000000f, 0.000046f, 0.000088f, 0.000118f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000108f, 0.000069f, 0.000047f, 0.000030f, 0.000022f, 0.000016f, 0.000012f, 0.000052f, - 0.000081f, 0.000100f, 0.000184f, 0.000226f, 0.000400f, 0.000467f, 0.000452f, 0.000597f, - 0.000807f, 0.000895f, 0.000942f, 0.001219f, 0.001611f, 0.002022f, 0.002352f, 0.003222f, - 0.004177f, 0.006481f, 0.009850f, 0.017517f, 0.034668f, 0.090637f, 0.331055f, 0.776367f, - 0.932129f, 0.972656f, 0.994141f, 0.994141f, 0.994629f, 0.994141f, 0.994629f, 0.994629f, - 0.000000f, 0.000000f, 0.000000f, 0.000107f, 0.000115f, 0.000112f, 0.000119f, 0.000118f, - 0.000119f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000117f, 0.000072f, 0.000049f, 0.000032f, 0.000023f, 0.000017f, 0.000013f, - 0.000011f, 0.000008f, 0.000075f, 0.000151f, 0.000207f, 0.000305f, 0.000509f, 0.000499f, - 0.000560f, 0.000704f, 0.000863f, 0.000917f, 0.001220f, 0.001505f, 0.001740f, 0.002174f, - 0.003153f, 0.004559f, 0.007095f, 0.011826f, 0.022247f, 0.051147f, 0.173462f, 0.618652f, - 0.902344f, 0.966309f, 0.993164f, 0.993652f, 0.992676f, 0.992676f, 0.993164f, 0.993164f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000060f, 0.000102f, 0.000113f, - 0.000117f, 0.000118f, 0.000119f, 0.000119f, 0.000119f, 0.000120f, 0.000120f, 0.000120f, - 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000078f, 0.000052f, 0.000038f, 0.000027f, 0.000019f, - 0.000015f, 0.000011f, 0.000054f, 0.000007f, 0.000085f, 0.000108f, 0.000258f, 0.000466f, - 0.000533f, 0.000560f, 0.000662f, 0.000849f, 0.000856f, 0.000965f, 0.001180f, 0.001678f, - 0.002075f, 0.003193f, 0.005016f, 0.008095f, 0.014343f, 0.030899f, 0.090820f, 0.401367f, - 0.848145f, 0.956543f, 0.992188f, 0.992188f, 0.992188f, 0.992676f, 0.991699f, 0.992188f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000059f, 0.000096f, - 0.000107f, 0.000112f, 0.000115f, 0.000116f, 0.000117f, 0.000118f, 0.000118f, 0.000119f, - 0.000119f, 0.000119f, 0.000119f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, - 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000088f, 0.000059f, 0.000041f, 0.000031f, - 0.000022f, 0.000017f, 0.000013f, 0.000010f, 0.000056f, 0.000091f, 0.000183f, 0.000201f, - 0.000309f, 0.000506f, 0.000547f, 0.000525f, 0.000629f, 0.000613f, 0.000817f, 0.001012f, - 0.001640f, 0.002420f, 0.003588f, 0.005520f, 0.009453f, 0.019119f, 0.050415f, 0.214722f, - 0.751465f, 0.943848f, 0.990723f, 0.990723f, 0.991211f, 0.991211f, 0.991211f, 0.991211f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000055f, 0.000095f, 0.000103f, 0.000105f, 0.000112f, 0.000114f, 0.000115f, - 0.000117f, 0.000117f, 0.000117f, 0.000118f, 0.000118f, 0.000119f, 0.000119f, 0.000119f, - 0.000119f, 0.000119f, 0.000119f, 0.000120f, 0.000120f, 0.000105f, 0.000069f, 0.000048f, - 0.000035f, 0.000025f, 0.000019f, 0.000015f, 0.000011f, 0.000014f, 0.000008f, 0.000071f, - 0.000193f, 0.000311f, 0.000315f, 0.000524f, 0.000483f, 0.000558f, 0.000591f, 0.000705f, - 0.000950f, 0.001389f, 0.002428f, 0.003494f, 0.006321f, 0.012306f, 0.029480f, 0.108948f, - 0.581543f, 0.924316f, 0.989746f, 0.989746f, 0.989258f, 0.989746f, 0.989258f, 0.989746f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000069f, 0.000096f, 0.000103f, 0.000107f, - 0.000109f, 0.000112f, 0.000113f, 0.000115f, 0.000115f, 0.000116f, 0.000117f, 0.000117f, - 0.000118f, 0.000118f, 0.000118f, 0.000118f, 0.000119f, 0.000119f, 0.000119f, 0.000084f, - 0.000061f, 0.000042f, 0.000031f, 0.000023f, 0.000018f, 0.000014f, 0.000011f, 0.000009f, - 0.000095f, 0.000127f, 0.000223f, 0.000402f, 0.000432f, 0.000399f, 0.000494f, 0.000535f, - 0.000557f, 0.000933f, 0.001474f, 0.002300f, 0.004192f, 0.007919f, 0.017838f, 0.057068f, - 0.360840f, 0.890625f, 0.986816f, 0.987793f, 0.987305f, 0.987305f, 0.987793f, 0.987305f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000035f, 0.000041f, - 0.000088f, 0.000098f, 0.000103f, 0.000106f, 0.000110f, 0.000110f, 0.000113f, 0.000113f, - 0.000115f, 0.000116f, 0.000116f, 0.000117f, 0.000117f, 0.000117f, 0.000117f, 0.000118f, - 0.000111f, 0.000074f, 0.000053f, 0.000038f, 0.000029f, 0.000022f, 0.000016f, 0.000013f, - 0.000010f, 0.000008f, 0.000073f, 0.000152f, 0.000296f, 0.000369f, 0.000365f, 0.000437f, - 0.000507f, 0.000661f, 0.000876f, 0.001451f, 0.002531f, 0.004898f, 0.010384f, 0.031113f, - 0.183838f, 0.833008f, 0.984375f, 0.984863f, 0.984863f, 0.984375f, 0.984863f, 0.984863f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000024f, 0.000044f, 0.000073f, 0.000087f, 0.000097f, 0.000102f, 0.000105f, - 0.000108f, 0.000110f, 0.000111f, 0.000113f, 0.000114f, 0.000114f, 0.000115f, 0.000115f, - 0.000116f, 0.000116f, 0.000101f, 0.000070f, 0.000052f, 0.000037f, 0.000027f, 0.000021f, - 0.000016f, 0.000013f, 0.000010f, 0.000008f, 0.000083f, 0.000183f, 0.000352f, 0.000355f, - 0.000362f, 0.000365f, 0.000528f, 0.000790f, 0.001469f, 0.003029f, 0.005970f, 0.017242f, - 0.089050f, 0.728516f, 0.980957f, 0.981445f, 0.981445f, 0.980957f, 0.980957f, 0.981445f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000033f, 0.000041f, 0.000073f, - 0.000083f, 0.000088f, 0.000097f, 0.000102f, 0.000105f, 0.000108f, 0.000108f, 0.000111f, - 0.000112f, 0.000113f, 0.000113f, 0.000114f, 0.000097f, 0.000068f, 0.000049f, 0.000038f, - 0.000028f, 0.000021f, 0.000016f, 0.000013f, 0.000010f, 0.000056f, 0.000151f, 0.000243f, - 0.000264f, 0.000221f, 0.000328f, 0.000449f, 0.000850f, 0.001612f, 0.003340f, 0.009361f, - 0.043121f, 0.548340f, 0.976074f, 0.976562f, 0.975586f, 0.976074f, 0.976074f, 0.976562f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000019f, 0.000052f, 0.000065f, 0.000077f, 0.000088f, 0.000094f, 0.000098f, - 0.000100f, 0.000104f, 0.000106f, 0.000108f, 0.000109f, 0.000110f, 0.000095f, 0.000069f, - 0.000052f, 0.000037f, 0.000028f, 0.000021f, 0.000017f, 0.000013f, 0.000025f, 0.000063f, - 0.000195f, 0.000233f, 0.000205f, 0.000264f, 0.000401f, 0.000789f, 0.001532f, 0.004520f, - 0.020844f, 0.321289f, 0.969238f, 0.968750f, 0.969238f, 0.968750f, 0.969238f, 0.969238f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000018f, 0.000039f, 0.000053f, - 0.000066f, 0.000079f, 0.000086f, 0.000090f, 0.000096f, 0.000100f, 0.000102f, 0.000105f, - 0.000098f, 0.000074f, 0.000053f, 0.000041f, 0.000031f, 0.000023f, 0.000017f, 0.000013f, - 0.000028f, 0.000139f, 0.000189f, 0.000179f, 0.000219f, 0.000333f, 0.000840f, 0.002119f, - 0.009193f, 0.144775f, 0.958496f, 0.958496f, 0.958008f, 0.958496f, 0.958008f, 0.958008f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000025f, 0.000040f, 0.000052f, 0.000067f, 0.000077f, 0.000082f, - 0.000089f, 0.000093f, 0.000097f, 0.000079f, 0.000059f, 0.000044f, 0.000033f, 0.000024f, - 0.000018f, 0.000014f, 0.000034f, 0.000084f, 0.000157f, 0.000199f, 0.000309f, 0.000817f, - 0.003424f, 0.054901f, 0.940918f, 0.940918f, 0.940918f, 0.940918f, 0.941406f, 0.940430f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000021f, - 0.000040f, 0.000054f, 0.000063f, 0.000072f, 0.000078f, 0.000085f, 0.000065f, 0.000049f, - 0.000036f, 0.000026f, 0.000019f, 0.000014f, 0.000042f, 0.000114f, 0.000122f, 0.000276f, - 0.001024f, 0.016357f, 0.912109f, 0.912598f, 0.911621f, 0.912598f, 0.911621f, 0.913086f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000016f, 0.000032f, 0.000045f, 0.000056f, - 0.000065f, 0.000054f, 0.000039f, 0.000028f, 0.000019f, 0.000013f, 0.000049f, 0.000079f, - 0.000226f, 0.003199f, 0.860840f, 0.859863f, 0.860352f, 0.860840f, 0.860840f, 0.860352f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000004f, 0.000021f, 0.000035f, 0.000040f, 0.000027f, 0.000018f, 0.000013f, - 0.000033f, 0.000333f, 0.764160f, 0.765137f, 0.764648f, 0.764648f, 0.764648f, 0.765137f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000006f, - 0.000011f, 0.000009f, 0.600586f, 0.602051f, 0.602051f, 0.601562f, 0.601074f, 0.601074f, - }, - { - 0.142456f, 0.713867f, 0.883789f, 0.933105f, 0.953613f, 0.964844f, 0.972168f, 0.977539f, - 0.980957f, 0.983398f, 0.985352f, 0.987305f, 0.989258f, 0.989746f, 0.990723f, 0.991699f, - 0.992676f, 0.993164f, 0.993652f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, 0.995605f, - 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.012886f, 0.087646f, 0.360840f, 0.709473f, 0.859863f, 0.916992f, 0.943848f, 0.958496f, - 0.967773f, 0.973633f, 0.978516f, 0.980957f, 0.984375f, 0.986328f, 0.987793f, 0.988770f, - 0.990234f, 0.991211f, 0.992188f, 0.993164f, 0.993164f, 0.993652f, 0.994141f, 0.994629f, - 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, - 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.003895f, 0.020126f, 0.063599f, 0.188721f, 0.464844f, 0.727539f, 0.853027f, 0.909668f, - 0.938477f, 0.954590f, 0.965332f, 0.971680f, 0.976562f, 0.979980f, 0.982910f, 0.985840f, - 0.986816f, 0.988770f, 0.990234f, 0.990723f, 0.991699f, 0.992188f, 0.993164f, 0.993652f, - 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, - 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, - 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.002062f, 0.008438f, 0.021774f, 0.049713f, 0.117676f, 0.279541f, 0.541016f, 0.751465f, - 0.855469f, 0.909180f, 0.936035f, 0.952637f, 0.963379f, 0.970703f, 0.975098f, 0.979492f, - 0.982910f, 0.984863f, 0.986328f, 0.987793f, 0.989258f, 0.990234f, 0.990723f, 0.992188f, - 0.992676f, 0.993164f, 0.993652f, 0.994629f, 0.995117f, 0.995117f, 0.996094f, 0.996094f, - 0.996582f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, - 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.001335f, 0.004597f, 0.010628f, 0.020844f, 0.040283f, 0.082764f, 0.177612f, 0.366211f, - 0.605469f, 0.773926f, 0.863281f, 0.910156f, 0.936035f, 0.952148f, 0.962402f, 0.969727f, - 0.975098f, 0.979004f, 0.982422f, 0.984863f, 0.986328f, 0.988281f, 0.988770f, 0.989746f, - 0.991211f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.994629f, 0.995117f, 0.995117f, - 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.996582f, 0.997070f, 0.997559f, - 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000851f, 0.002769f, 0.006130f, 0.010994f, 0.019394f, 0.034943f, 0.063293f, 0.122253f, - 0.244019f, 0.448242f, 0.660156f, 0.798828f, 0.872559f, 0.914062f, 0.937988f, 0.954102f, - 0.961914f, 0.970215f, 0.974609f, 0.978516f, 0.981934f, 0.984375f, 0.986328f, 0.987793f, - 0.988770f, 0.989746f, 0.991211f, 0.991699f, 0.992676f, 0.993164f, 0.994141f, 0.994629f, - 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, - 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000466f, 0.001933f, 0.003809f, 0.007095f, 0.011353f, 0.018204f, 0.030029f, 0.050568f, - 0.090759f, 0.170898f, 0.318848f, 0.526367f, 0.708496f, 0.820801f, 0.884277f, 0.918457f, - 0.940918f, 0.954102f, 0.963867f, 0.970215f, 0.975098f, 0.978516f, 0.981934f, 0.984863f, - 0.986328f, 0.988281f, 0.988770f, 0.990234f, 0.991211f, 0.991699f, 0.993164f, 0.993652f, - 0.994141f, 0.994629f, 0.994629f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, - 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000487f, 0.001685f, 0.002766f, 0.004467f, 0.007305f, 0.011215f, 0.017136f, 0.026489f, - 0.042419f, 0.071716f, 0.125244f, 0.228271f, 0.399658f, 0.599609f, 0.751953f, 0.842773f, - 0.894531f, 0.924805f, 0.943359f, 0.955566f, 0.965820f, 0.971191f, 0.976562f, 0.979980f, - 0.981934f, 0.984863f, 0.986816f, 0.988281f, 0.989258f, 0.990723f, 0.991211f, 0.992188f, - 0.992676f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, - 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, - 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.000965f, 0.002024f, 0.003202f, 0.005009f, 0.007050f, 0.011070f, 0.015869f, - 0.023987f, 0.036835f, 0.058563f, 0.097168f, 0.169800f, 0.297852f, 0.484131f, 0.664062f, - 0.789062f, 0.861816f, 0.905273f, 0.930176f, 0.947266f, 0.958984f, 0.967285f, 0.972168f, - 0.976562f, 0.980469f, 0.982910f, 0.984863f, 0.986816f, 0.988770f, 0.989746f, 0.990723f, - 0.992188f, 0.992188f, 0.993652f, 0.993652f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, - 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, - 0.997559f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.000974f, 0.001576f, 0.002403f, 0.003510f, 0.005344f, 0.007332f, 0.010567f, - 0.015099f, 0.022064f, 0.032104f, 0.048706f, 0.078003f, 0.130249f, 0.224243f, 0.378174f, - 0.566406f, 0.720703f, 0.820312f, 0.879883f, 0.915039f, 0.936523f, 0.951660f, 0.961426f, - 0.968262f, 0.974121f, 0.978027f, 0.980957f, 0.983887f, 0.985840f, 0.987793f, 0.989258f, - 0.990234f, 0.991211f, 0.992188f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.995117f, - 0.995605f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, - 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998047f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000240f, 0.000609f, 0.001096f, 0.001580f, 0.002674f, 0.004131f, 0.005245f, 0.007660f, - 0.010757f, 0.014221f, 0.019775f, 0.028381f, 0.041870f, 0.064697f, 0.103638f, 0.173706f, - 0.293945f, 0.466553f, 0.642090f, 0.769531f, 0.849121f, 0.895996f, 0.924316f, 0.942871f, - 0.956055f, 0.963867f, 0.970703f, 0.975098f, 0.979004f, 0.981934f, 0.984863f, 0.986328f, - 0.988770f, 0.989746f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.994629f, - 0.995117f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, - 0.997559f, 0.997559f, 0.998047f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000608f, 0.001062f, 0.001268f, 0.002001f, 0.003099f, 0.003937f, 0.005379f, - 0.007595f, 0.010078f, 0.013176f, 0.018524f, 0.025787f, 0.036896f, 0.054932f, 0.085327f, - 0.137573f, 0.229980f, 0.376953f, 0.555664f, 0.708984f, 0.810547f, 0.873047f, 0.909180f, - 0.933594f, 0.948730f, 0.959961f, 0.967285f, 0.973145f, 0.977539f, 0.980469f, 0.983398f, - 0.985840f, 0.986816f, 0.988770f, 0.989746f, 0.991211f, 0.992188f, 0.993164f, 0.993652f, - 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.996094f, 0.996582f, - 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.000606f, 0.000609f, 0.001317f, 0.001564f, 0.002674f, 0.003273f, 0.004402f, - 0.005630f, 0.007141f, 0.009514f, 0.012398f, 0.016678f, 0.023331f, 0.032776f, 0.047363f, - 0.071594f, 0.112610f, 0.183960f, 0.303711f, 0.470215f, 0.639648f, 0.766113f, 0.844727f, - 0.892090f, 0.921875f, 0.941895f, 0.954590f, 0.963379f, 0.970215f, 0.975098f, 0.979004f, - 0.981934f, 0.984863f, 0.986328f, 0.987793f, 0.989746f, 0.991211f, 0.991699f, 0.992676f, - 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.996094f, - 0.996582f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.000244f, 0.000727f, 0.000803f, 0.001575f, 0.002035f, 0.002821f, 0.003527f, - 0.004475f, 0.005421f, 0.007023f, 0.009491f, 0.011879f, 0.015976f, 0.021530f, 0.029587f, - 0.041809f, 0.061737f, 0.094360f, 0.150146f, 0.246460f, 0.393066f, 0.566406f, 0.712891f, - 0.812500f, 0.872070f, 0.909180f, 0.933105f, 0.948242f, 0.959961f, 0.967773f, 0.972656f, - 0.977539f, 0.980957f, 0.982910f, 0.986328f, 0.987305f, 0.988770f, 0.989746f, 0.991211f, - 0.992188f, 0.993164f, 0.993652f, 0.994629f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, - 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.000244f, 0.000471f, 0.000727f, 0.000967f, 0.001572f, 0.002161f, 0.002680f, - 0.003246f, 0.004337f, 0.005241f, 0.006950f, 0.009087f, 0.011497f, 0.015038f, 0.019913f, - 0.026688f, 0.037537f, 0.054352f, 0.080383f, 0.125122f, 0.202515f, 0.327148f, 0.493652f, - 0.656250f, 0.774414f, 0.849609f, 0.895508f, 0.923828f, 0.942383f, 0.954590f, 0.963867f, - 0.971191f, 0.975586f, 0.979004f, 0.982422f, 0.984863f, 0.987305f, 0.988281f, 0.989746f, - 0.990723f, 0.992188f, 0.992676f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, 0.995605f, - 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999023f, - 0.000121f, 0.000244f, 0.000244f, 0.000715f, 0.001089f, 0.001278f, 0.001781f, 0.002275f, - 0.002548f, 0.003334f, 0.004150f, 0.005314f, 0.006824f, 0.008430f, 0.011200f, 0.014145f, - 0.018631f, 0.024750f, 0.033905f, 0.047760f, 0.069885f, 0.106445f, 0.169312f, 0.273682f, - 0.426270f, 0.596191f, 0.732422f, 0.823242f, 0.879883f, 0.914062f, 0.936035f, 0.950684f, - 0.960938f, 0.968750f, 0.973633f, 0.978516f, 0.981934f, 0.984375f, 0.986328f, 0.988281f, - 0.989258f, 0.990234f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.995117f, - 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, - 0.998047f, 0.998535f, 0.999023f, 0.999512f, 0.999023f, 0.999512f, 0.999512f, 0.999023f, - 0.000241f, 0.000244f, 0.000365f, 0.000600f, 0.000961f, 0.000972f, 0.001621f, 0.001697f, - 0.002274f, 0.002684f, 0.003359f, 0.004238f, 0.005573f, 0.006691f, 0.008057f, 0.010529f, - 0.013832f, 0.017593f, 0.022812f, 0.031174f, 0.042786f, 0.061462f, 0.092407f, 0.143799f, - 0.231201f, 0.366943f, 0.535645f, 0.688477f, 0.794922f, 0.861816f, 0.902832f, 0.928711f, - 0.945801f, 0.957520f, 0.966797f, 0.972656f, 0.976562f, 0.980469f, 0.983398f, 0.985840f, - 0.987793f, 0.989258f, 0.990234f, 0.991699f, 0.992676f, 0.993164f, 0.994141f, 0.994629f, - 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, - 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000243f, 0.000365f, 0.000365f, 0.000798f, 0.000968f, 0.001249f, 0.001528f, - 0.001798f, 0.002457f, 0.002798f, 0.003494f, 0.004353f, 0.005306f, 0.006363f, 0.008141f, - 0.010147f, 0.012596f, 0.016006f, 0.021423f, 0.028503f, 0.039185f, 0.055420f, 0.081116f, - 0.124390f, 0.198120f, 0.316895f, 0.478516f, 0.641113f, 0.763672f, 0.842773f, 0.891113f, - 0.921387f, 0.941406f, 0.954590f, 0.963867f, 0.970215f, 0.975586f, 0.979492f, 0.982910f, - 0.985352f, 0.987305f, 0.988770f, 0.989746f, 0.991211f, 0.992188f, 0.993164f, 0.993652f, - 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000238f, 0.000365f, 0.000365f, 0.000598f, 0.000820f, 0.001200f, 0.001279f, - 0.001631f, 0.001736f, 0.002172f, 0.002874f, 0.003576f, 0.004391f, 0.005096f, 0.006176f, - 0.007545f, 0.009674f, 0.012505f, 0.015945f, 0.020187f, 0.026550f, 0.035706f, 0.049835f, - 0.072510f, 0.109253f, 0.171631f, 0.275391f, 0.426514f, 0.594238f, 0.730469f, 0.822754f, - 0.877930f, 0.913574f, 0.936523f, 0.951172f, 0.961426f, 0.969727f, 0.974609f, 0.978027f, - 0.982422f, 0.984863f, 0.986816f, 0.988770f, 0.989746f, 0.991699f, 0.992188f, 0.993164f, - 0.993652f, 0.994629f, 0.994629f, 0.995117f, 0.996094f, 0.996094f, 0.997070f, 0.997559f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000364f, 0.000486f, 0.000487f, 0.000562f, 0.000822f, 0.000967f, - 0.001213f, 0.001871f, 0.001803f, 0.002485f, 0.002796f, 0.003410f, 0.004242f, 0.005070f, - 0.006153f, 0.007698f, 0.009262f, 0.011635f, 0.014709f, 0.019104f, 0.024521f, 0.033295f, - 0.045746f, 0.065674f, 0.096741f, 0.150635f, 0.241455f, 0.380127f, 0.548828f, 0.698242f, - 0.802246f, 0.867188f, 0.906738f, 0.931152f, 0.948242f, 0.959473f, 0.967285f, 0.973633f, - 0.978516f, 0.981445f, 0.984375f, 0.986328f, 0.988281f, 0.989258f, 0.990723f, 0.992188f, - 0.993164f, 0.993652f, 0.994629f, 0.994629f, 0.995117f, 0.996094f, 0.996582f, 0.996582f, - 0.997559f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000350f, 0.000483f, 0.000486f, 0.000604f, 0.000743f, 0.001093f, - 0.001187f, 0.001297f, 0.001601f, 0.001921f, 0.002501f, 0.002922f, 0.003296f, 0.004200f, - 0.005211f, 0.006054f, 0.007603f, 0.008904f, 0.011169f, 0.014091f, 0.017685f, 0.023331f, - 0.030991f, 0.042358f, 0.059326f, 0.087646f, 0.134521f, 0.213867f, 0.341309f, 0.506348f, - 0.665039f, 0.780762f, 0.854492f, 0.899414f, 0.927246f, 0.945312f, 0.957520f, 0.966309f, - 0.973145f, 0.977539f, 0.981445f, 0.984375f, 0.986328f, 0.988770f, 0.989746f, 0.991211f, - 0.992188f, 0.993164f, 0.993652f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, - 0.997070f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000120f, 0.000360f, 0.000485f, 0.000486f, 0.000487f, 0.000604f, - 0.000947f, 0.001201f, 0.001374f, 0.001715f, 0.002127f, 0.002239f, 0.002876f, 0.003426f, - 0.004063f, 0.005276f, 0.005810f, 0.006744f, 0.008713f, 0.010597f, 0.013680f, 0.016754f, - 0.021744f, 0.028778f, 0.039093f, 0.054901f, 0.079956f, 0.121399f, 0.191895f, 0.307861f, - 0.468262f, 0.633301f, 0.760742f, 0.842285f, 0.892090f, 0.923340f, 0.942383f, 0.956543f, - 0.965332f, 0.972168f, 0.977539f, 0.980469f, 0.983887f, 0.985840f, 0.988281f, 0.989746f, - 0.990723f, 0.992188f, 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.996094f, 0.996582f, - 0.997070f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000121f, 0.000219f, 0.000474f, 0.000484f, 0.000486f, 0.000487f, - 0.000720f, 0.001108f, 0.001199f, 0.001209f, 0.001689f, 0.002253f, 0.002489f, 0.002916f, - 0.003714f, 0.004040f, 0.005054f, 0.006001f, 0.006737f, 0.008713f, 0.010376f, 0.012665f, - 0.016251f, 0.020615f, 0.027145f, 0.036499f, 0.050720f, 0.073181f, 0.110474f, 0.174072f, - 0.280518f, 0.434570f, 0.604980f, 0.742188f, 0.830566f, 0.885742f, 0.918945f, 0.940918f, - 0.954102f, 0.964355f, 0.971680f, 0.977051f, 0.980957f, 0.984375f, 0.986816f, 0.988281f, - 0.989746f, 0.990723f, 0.992188f, 0.993652f, 0.994141f, 0.995117f, 0.995605f, 0.996094f, - 0.996582f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000120f, 0.000239f, 0.000319f, 0.000475f, 0.000484f, 0.000485f, - 0.000618f, 0.000844f, 0.001094f, 0.001201f, 0.001570f, 0.001782f, 0.002010f, 0.002407f, - 0.003046f, 0.003099f, 0.004208f, 0.004700f, 0.005882f, 0.006878f, 0.007980f, 0.009949f, - 0.012344f, 0.015358f, 0.019821f, 0.026047f, 0.034271f, 0.047455f, 0.067993f, 0.102112f, - 0.160034f, 0.258057f, 0.406494f, 0.578613f, 0.723633f, 0.820312f, 0.880371f, 0.916016f, - 0.938965f, 0.953125f, 0.963867f, 0.971191f, 0.976562f, 0.980469f, 0.983887f, 0.985840f, - 0.988770f, 0.989746f, 0.991699f, 0.992676f, 0.993652f, 0.994629f, 0.995117f, 0.995605f, - 0.996094f, 0.996582f, 0.999023f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000242f, 0.000455f, 0.000481f, 0.000583f, - 0.000601f, 0.000804f, 0.000912f, 0.001247f, 0.001319f, 0.001571f, 0.001793f, 0.002337f, - 0.002464f, 0.003099f, 0.003164f, 0.003809f, 0.004627f, 0.005764f, 0.006397f, 0.008118f, - 0.009605f, 0.011917f, 0.015083f, 0.018692f, 0.024384f, 0.032806f, 0.044983f, 0.063477f, - 0.095337f, 0.148560f, 0.240112f, 0.382324f, 0.556641f, 0.708984f, 0.812500f, 0.875488f, - 0.913574f, 0.937500f, 0.953125f, 0.963867f, 0.971191f, 0.977051f, 0.980957f, 0.983887f, - 0.986816f, 0.988281f, 0.990234f, 0.992188f, 0.993164f, 0.993652f, 0.994141f, 0.995605f, - 0.995605f, 0.996094f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000240f, 0.000242f, 0.000524f, 0.000597f, - 0.000604f, 0.000606f, 0.000674f, 0.001040f, 0.001238f, 0.001427f, 0.001637f, 0.001670f, - 0.002104f, 0.002432f, 0.002775f, 0.003416f, 0.003860f, 0.004482f, 0.005573f, 0.006374f, - 0.007828f, 0.009384f, 0.011635f, 0.014175f, 0.018219f, 0.023224f, 0.031052f, 0.042603f, - 0.060730f, 0.089661f, 0.139526f, 0.225464f, 0.363525f, 0.538574f, 0.696289f, 0.806152f, - 0.872559f, 0.912109f, 0.937012f, 0.952637f, 0.963867f, 0.971191f, 0.976562f, 0.981445f, - 0.984863f, 0.987305f, 0.988770f, 0.990723f, 0.992188f, 0.993164f, 0.994141f, 0.994629f, - 0.995117f, 0.996094f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000192f, 0.000240f, 0.000242f, 0.000535f, - 0.000478f, 0.000600f, 0.000843f, 0.000925f, 0.001027f, 0.001236f, 0.001502f, 0.001490f, - 0.001658f, 0.002256f, 0.002430f, 0.002880f, 0.003056f, 0.003983f, 0.004292f, 0.005333f, - 0.006264f, 0.007393f, 0.009064f, 0.011131f, 0.013741f, 0.017242f, 0.022690f, 0.029922f, - 0.040680f, 0.057831f, 0.085022f, 0.132446f, 0.214844f, 0.349121f, 0.524414f, 0.688477f, - 0.801758f, 0.871094f, 0.912109f, 0.937500f, 0.953125f, 0.964355f, 0.971680f, 0.977539f, - 0.981445f, 0.985352f, 0.987305f, 0.989258f, 0.991211f, 0.992188f, 0.993652f, 0.994629f, - 0.995117f, 0.995605f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000232f, 0.000233f, 0.000363f, - 0.000457f, 0.000714f, 0.000724f, 0.000727f, 0.000847f, 0.000992f, 0.001177f, 0.001525f, - 0.001560f, 0.001740f, 0.002090f, 0.002329f, 0.002718f, 0.003372f, 0.003902f, 0.004307f, - 0.005184f, 0.005886f, 0.007446f, 0.008667f, 0.010574f, 0.013588f, 0.016556f, 0.021744f, - 0.028854f, 0.039124f, 0.055176f, 0.081726f, 0.127075f, 0.206421f, 0.338867f, 0.515625f, - 0.683105f, 0.800293f, 0.870605f, 0.912598f, 0.937500f, 0.954590f, 0.965332f, 0.973145f, - 0.978516f, 0.982422f, 0.985840f, 0.988281f, 0.989746f, 0.991211f, 0.992676f, 0.993652f, - 0.994141f, 0.995117f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000103f, 0.000120f, 0.000240f, 0.000240f, - 0.000484f, 0.000574f, 0.000596f, 0.000837f, 0.000820f, 0.000859f, 0.000985f, 0.001070f, - 0.001509f, 0.001554f, 0.001785f, 0.002214f, 0.002476f, 0.002754f, 0.002991f, 0.003487f, - 0.004303f, 0.005074f, 0.005920f, 0.007126f, 0.008743f, 0.010361f, 0.013023f, 0.016403f, - 0.021011f, 0.027817f, 0.037811f, 0.053375f, 0.079041f, 0.123291f, 0.201172f, 0.333252f, - 0.511719f, 0.682129f, 0.801270f, 0.872070f, 0.914062f, 0.939941f, 0.955078f, 0.966309f, - 0.973633f, 0.979004f, 0.982910f, 0.986328f, 0.988770f, 0.990234f, 0.991699f, 0.992676f, - 0.993652f, 0.995117f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000079f, 0.000053f, 0.000118f, 0.000418f, - 0.000358f, 0.000363f, 0.000678f, 0.000708f, 0.000825f, 0.000838f, 0.000878f, 0.001146f, - 0.000978f, 0.001483f, 0.001541f, 0.001769f, 0.001812f, 0.002434f, 0.002699f, 0.003225f, - 0.003298f, 0.004002f, 0.004948f, 0.005932f, 0.007084f, 0.008461f, 0.010414f, 0.012665f, - 0.015915f, 0.020615f, 0.027023f, 0.036743f, 0.051941f, 0.077332f, 0.120789f, 0.198608f, - 0.331543f, 0.512695f, 0.686523f, 0.805664f, 0.875488f, 0.917480f, 0.941406f, 0.957031f, - 0.968262f, 0.975098f, 0.980469f, 0.983887f, 0.986816f, 0.989258f, 0.990723f, 0.992188f, - 0.993164f, 0.994629f, 0.998047f, 0.998047f, 0.998535f, 0.998047f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000109f, 0.000232f, 0.000349f, - 0.000478f, 0.000483f, 0.000483f, 0.000609f, 0.000795f, 0.000835f, 0.000806f, 0.000726f, - 0.001022f, 0.001222f, 0.001442f, 0.001536f, 0.001650f, 0.001714f, 0.002377f, 0.002588f, - 0.003159f, 0.003643f, 0.004036f, 0.004929f, 0.005718f, 0.006813f, 0.008072f, 0.009880f, - 0.012527f, 0.015854f, 0.020035f, 0.026352f, 0.035950f, 0.051178f, 0.076416f, 0.119751f, - 0.198730f, 0.334229f, 0.519531f, 0.694824f, 0.812988f, 0.880859f, 0.920898f, 0.944336f, - 0.958984f, 0.969727f, 0.976562f, 0.980957f, 0.984863f, 0.987793f, 0.989746f, 0.991211f, - 0.992676f, 0.993652f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000068f, 0.000265f, - 0.000361f, 0.000478f, 0.000480f, 0.000479f, 0.000568f, 0.000693f, 0.000714f, 0.000806f, - 0.000843f, 0.000919f, 0.001222f, 0.001376f, 0.001531f, 0.001554f, 0.001987f, 0.002342f, - 0.002558f, 0.002798f, 0.003132f, 0.004021f, 0.004864f, 0.005455f, 0.006664f, 0.008110f, - 0.009613f, 0.011955f, 0.015335f, 0.019608f, 0.025879f, 0.035522f, 0.050629f, 0.075623f, - 0.120239f, 0.201416f, 0.342041f, 0.533203f, 0.707031f, 0.821777f, 0.887695f, 0.925293f, - 0.946777f, 0.961914f, 0.971680f, 0.977539f, 0.982422f, 0.985352f, 0.988281f, 0.989746f, - 0.992188f, 0.993164f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000000f, 0.000122f, - 0.000322f, 0.000241f, 0.000478f, 0.000480f, 0.000480f, 0.000510f, 0.000695f, 0.000710f, - 0.000958f, 0.000765f, 0.001075f, 0.001116f, 0.001318f, 0.001606f, 0.001546f, 0.001916f, - 0.002306f, 0.002499f, 0.002905f, 0.003202f, 0.003914f, 0.004498f, 0.005459f, 0.006611f, - 0.007687f, 0.009331f, 0.011757f, 0.014923f, 0.019241f, 0.025833f, 0.035492f, 0.050507f, - 0.076233f, 0.122131f, 0.207153f, 0.355225f, 0.551758f, 0.724609f, 0.833496f, 0.894531f, - 0.930664f, 0.951660f, 0.964844f, 0.973145f, 0.979492f, 0.983887f, 0.986816f, 0.989258f, - 0.991211f, 0.993164f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000351f, 0.000458f, 0.000476f, 0.000480f, 0.000482f, 0.000528f, 0.000650f, - 0.000704f, 0.000956f, 0.000828f, 0.000963f, 0.001111f, 0.001265f, 0.001474f, 0.001806f, - 0.001872f, 0.002308f, 0.002445f, 0.002701f, 0.003229f, 0.003851f, 0.004375f, 0.005356f, - 0.006317f, 0.007458f, 0.009300f, 0.011574f, 0.014725f, 0.019165f, 0.025696f, 0.035461f, - 0.050812f, 0.077637f, 0.125977f, 0.216797f, 0.374756f, 0.576660f, 0.745117f, 0.848145f, - 0.904785f, 0.936523f, 0.956055f, 0.967773f, 0.975586f, 0.980957f, 0.984863f, 0.987793f, - 0.990234f, 0.992188f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000292f, 0.000224f, 0.000452f, 0.000453f, 0.000479f, 0.000480f, 0.000517f, - 0.000614f, 0.000902f, 0.000712f, 0.000959f, 0.000978f, 0.001100f, 0.001276f, 0.001461f, - 0.001524f, 0.001651f, 0.002041f, 0.002350f, 0.002853f, 0.003433f, 0.003622f, 0.004166f, - 0.005043f, 0.006187f, 0.007534f, 0.009209f, 0.011551f, 0.014908f, 0.019012f, 0.025406f, - 0.035461f, 0.051575f, 0.079651f, 0.131714f, 0.230957f, 0.401367f, 0.607910f, 0.769531f, - 0.863281f, 0.914062f, 0.942871f, 0.959961f, 0.970703f, 0.978027f, 0.982910f, 0.986816f, - 0.988770f, 0.991699f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000238f, 0.000355f, 0.000449f, 0.000462f, 0.000474f, 0.000477f, - 0.000482f, 0.000846f, 0.000726f, 0.000706f, 0.000953f, 0.000889f, 0.001012f, 0.001259f, - 0.001390f, 0.001755f, 0.001658f, 0.002060f, 0.002369f, 0.002539f, 0.003170f, 0.003460f, - 0.004131f, 0.004993f, 0.006008f, 0.007431f, 0.009109f, 0.011444f, 0.014252f, 0.019058f, - 0.025574f, 0.036011f, 0.053162f, 0.083435f, 0.140381f, 0.250488f, 0.436035f, 0.645996f, - 0.795898f, 0.880371f, 0.924316f, 0.949219f, 0.963867f, 0.973145f, 0.980469f, 0.984863f, - 0.988281f, 0.990723f, 0.997070f, 0.997559f, 0.997070f, 0.997559f, 0.997559f, 0.997070f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000239f, 0.000306f, 0.000440f, 0.000437f, 0.000474f, - 0.000478f, 0.000481f, 0.000523f, 0.000664f, 0.000731f, 0.000802f, 0.000935f, 0.001022f, - 0.001173f, 0.001314f, 0.001504f, 0.001831f, 0.001984f, 0.002317f, 0.002472f, 0.003199f, - 0.003370f, 0.004189f, 0.004868f, 0.005924f, 0.007320f, 0.008926f, 0.011421f, 0.014595f, - 0.019119f, 0.026260f, 0.036987f, 0.055176f, 0.088440f, 0.152466f, 0.277832f, 0.479980f, - 0.686523f, 0.823242f, 0.895508f, 0.933105f, 0.955566f, 0.969238f, 0.976562f, 0.982422f, - 0.986816f, 0.989746f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000194f, 0.000280f, 0.000417f, 0.000448f, - 0.000468f, 0.000476f, 0.000479f, 0.000490f, 0.000845f, 0.000688f, 0.000740f, 0.000945f, - 0.000998f, 0.001148f, 0.001266f, 0.001414f, 0.001475f, 0.001667f, 0.002262f, 0.002537f, - 0.003019f, 0.003288f, 0.004223f, 0.004768f, 0.005890f, 0.007259f, 0.009026f, 0.011360f, - 0.014297f, 0.019272f, 0.026474f, 0.038116f, 0.058197f, 0.095032f, 0.168945f, 0.313965f, - 0.533203f, 0.731445f, 0.850098f, 0.911133f, 0.942871f, 0.961914f, 0.972656f, 0.979980f, - 0.984863f, 0.988770f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, - 0.000000f, 0.000000f, 0.000122f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000187f, 0.000233f, 0.000141f, 0.000271f, 0.000341f, - 0.000380f, 0.000465f, 0.000473f, 0.000590f, 0.000605f, 0.000798f, 0.000847f, 0.000934f, - 0.000946f, 0.000836f, 0.001009f, 0.001142f, 0.001430f, 0.001495f, 0.001850f, 0.002111f, - 0.002541f, 0.003035f, 0.003300f, 0.004139f, 0.004913f, 0.005718f, 0.007141f, 0.008934f, - 0.011475f, 0.014832f, 0.019653f, 0.027573f, 0.039917f, 0.062225f, 0.104919f, 0.192017f, - 0.362305f, 0.594238f, 0.775879f, 0.875977f, 0.925293f, 0.952148f, 0.967773f, 0.977051f, - 0.983398f, 0.988281f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.996094f, 0.996582f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000238f, 0.000243f, - 0.000238f, 0.000424f, 0.000453f, 0.000467f, 0.000475f, 0.000581f, 0.000689f, 0.000795f, - 0.000634f, 0.000823f, 0.001014f, 0.000900f, 0.001083f, 0.001485f, 0.001731f, 0.001851f, - 0.002056f, 0.002373f, 0.002621f, 0.003445f, 0.004082f, 0.004578f, 0.005821f, 0.007217f, - 0.008881f, 0.011330f, 0.014778f, 0.020416f, 0.028473f, 0.042419f, 0.067993f, 0.118286f, - 0.225342f, 0.425293f, 0.661621f, 0.818848f, 0.899902f, 0.939453f, 0.960449f, 0.973145f, - 0.980957f, 0.985840f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000205f, 0.000224f, 0.000122f, - 0.000231f, 0.000245f, 0.000411f, 0.000520f, 0.000463f, 0.000470f, 0.000587f, 0.000361f, - 0.000712f, 0.000694f, 0.000815f, 0.000978f, 0.001055f, 0.001105f, 0.001390f, 0.001438f, - 0.001705f, 0.001984f, 0.002333f, 0.002546f, 0.003408f, 0.003876f, 0.004627f, 0.005783f, - 0.007198f, 0.008995f, 0.011383f, 0.015396f, 0.020828f, 0.030029f, 0.045654f, 0.075439f, - 0.137451f, 0.271973f, 0.503418f, 0.728516f, 0.857910f, 0.920410f, 0.951172f, 0.968262f, - 0.977539f, 0.984375f, 0.995117f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000173f, 0.000150f, 0.000278f, 0.000376f, 0.000427f, 0.000470f, 0.000352f, 0.000356f, - 0.000475f, 0.000441f, 0.000709f, 0.000774f, 0.000970f, 0.001013f, 0.000998f, 0.001193f, - 0.001397f, 0.001677f, 0.001957f, 0.002268f, 0.002529f, 0.003353f, 0.003874f, 0.004555f, - 0.005692f, 0.007160f, 0.008987f, 0.011543f, 0.015732f, 0.021896f, 0.032135f, 0.050140f, - 0.086548f, 0.165894f, 0.337646f, 0.593750f, 0.791504f, 0.892090f, 0.938477f, 0.961914f, - 0.974609f, 0.982422f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.995117f, 0.995605f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000187f, 0.000130f, 0.000231f, 0.000315f, 0.000298f, 0.000332f, 0.000343f, - 0.000465f, 0.000472f, 0.000579f, 0.000717f, 0.000839f, 0.000932f, 0.000817f, 0.001086f, - 0.001090f, 0.001545f, 0.001735f, 0.001837f, 0.002485f, 0.002493f, 0.003288f, 0.003828f, - 0.004520f, 0.005833f, 0.007156f, 0.009193f, 0.012123f, 0.015839f, 0.022934f, 0.034760f, - 0.056488f, 0.102600f, 0.208862f, 0.427734f, 0.687988f, 0.846191f, 0.919434f, 0.952637f, - 0.969727f, 0.979980f, 0.993652f, 0.994629f, 0.994141f, 0.994629f, 0.994629f, 0.994629f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000133f, 0.000141f, 0.000234f, 0.000300f, 0.000397f, - 0.000436f, 0.000456f, 0.000465f, 0.000534f, 0.000663f, 0.000810f, 0.000796f, 0.000812f, - 0.001062f, 0.001237f, 0.001428f, 0.001565f, 0.001818f, 0.002182f, 0.002783f, 0.002943f, - 0.003773f, 0.004715f, 0.005482f, 0.007195f, 0.009285f, 0.012207f, 0.016922f, 0.024567f, - 0.038483f, 0.066101f, 0.127563f, 0.274170f, 0.540527f, 0.774414f, 0.891113f, 0.940430f, - 0.965332f, 0.977539f, 0.993652f, 0.994141f, 0.994629f, 0.994141f, 0.994629f, 0.994141f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000124f, 0.000116f, 0.000119f, 0.000125f, 0.000121f, 0.000197f, - 0.000323f, 0.000418f, 0.000446f, 0.000433f, 0.000467f, 0.000612f, 0.000710f, 0.000783f, - 0.000911f, 0.000817f, 0.001161f, 0.001343f, 0.001514f, 0.001707f, 0.002081f, 0.002386f, - 0.002882f, 0.003609f, 0.004627f, 0.005478f, 0.007011f, 0.009384f, 0.012695f, 0.017960f, - 0.026901f, 0.044067f, 0.080078f, 0.167114f, 0.374023f, 0.664062f, 0.845703f, 0.923340f, - 0.957031f, 0.974121f, 0.992676f, 0.993652f, 0.993164f, 0.993652f, 0.993652f, 0.993164f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000121f, 0.000121f, 0.000052f, 0.000039f, 0.000029f, 0.000054f, 0.000045f, 0.000118f, - 0.000128f, 0.000231f, 0.000387f, 0.000429f, 0.000446f, 0.000544f, 0.000539f, 0.000648f, - 0.000749f, 0.000790f, 0.000978f, 0.001102f, 0.001195f, 0.001501f, 0.001761f, 0.001978f, - 0.002661f, 0.003170f, 0.003519f, 0.004509f, 0.005344f, 0.007004f, 0.009361f, 0.013229f, - 0.019196f, 0.030258f, 0.052002f, 0.102661f, 0.234131f, 0.511230f, 0.774902f, 0.898438f, - 0.947754f, 0.970215f, 0.992188f, 0.992676f, 0.993164f, 0.992676f, 0.992188f, 0.992188f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000070f, 0.000052f, 0.000038f, 0.000030f, 0.000023f, 0.000060f, - 0.000116f, 0.000121f, 0.000252f, 0.000337f, 0.000306f, 0.000435f, 0.000450f, 0.000562f, - 0.000584f, 0.000722f, 0.000858f, 0.000888f, 0.000969f, 0.001230f, 0.001429f, 0.001576f, - 0.001827f, 0.002361f, 0.002863f, 0.003267f, 0.004047f, 0.005394f, 0.007256f, 0.009781f, - 0.013855f, 0.021439f, 0.035034f, 0.065063f, 0.141724f, 0.346680f, 0.665527f, 0.859375f, - 0.934570f, 0.965820f, 0.991699f, 0.991699f, 0.991699f, 0.992188f, 0.991699f, 0.991699f, - 0.000000f, 0.000000f, 0.000122f, 0.000121f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000099f, 0.000069f, 0.000051f, 0.000039f, 0.000030f, 0.000023f, - 0.000024f, 0.000115f, 0.000103f, 0.000224f, 0.000204f, 0.000339f, 0.000407f, 0.000437f, - 0.000452f, 0.000489f, 0.000663f, 0.000821f, 0.000922f, 0.001004f, 0.001086f, 0.001279f, - 0.001554f, 0.001651f, 0.001997f, 0.002390f, 0.003136f, 0.004223f, 0.005508f, 0.007339f, - 0.010094f, 0.014854f, 0.024048f, 0.042664f, 0.087036f, 0.213867f, 0.516113f, 0.799805f, - 0.915527f, 0.958984f, 0.990723f, 0.991211f, 0.990723f, 0.990723f, 0.990723f, 0.991211f, - 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000096f, 0.000073f, 0.000053f, 0.000040f, 0.000031f, - 0.000025f, 0.000020f, 0.000017f, 0.000105f, 0.000110f, 0.000135f, 0.000235f, 0.000380f, - 0.000462f, 0.000513f, 0.000556f, 0.000638f, 0.000804f, 0.000868f, 0.000897f, 0.001002f, - 0.001079f, 0.001246f, 0.001596f, 0.002153f, 0.002213f, 0.003094f, 0.004158f, 0.005306f, - 0.007458f, 0.010887f, 0.017166f, 0.028748f, 0.055176f, 0.128174f, 0.350586f, 0.703613f, - 0.888184f, 0.951172f, 0.988770f, 0.989746f, 0.989746f, 0.989746f, 0.989746f, 0.989746f, - 0.000122f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000101f, 0.000073f, 0.000057f, 0.000043f, - 0.000033f, 0.000027f, 0.000021f, 0.000018f, 0.000105f, 0.000112f, 0.000111f, 0.000161f, - 0.000320f, 0.000390f, 0.000421f, 0.000438f, 0.000559f, 0.000665f, 0.000735f, 0.000719f, - 0.000704f, 0.000887f, 0.001223f, 0.001384f, 0.001867f, 0.002462f, 0.003216f, 0.004032f, - 0.005367f, 0.007988f, 0.012054f, 0.019943f, 0.035919f, 0.078064f, 0.215332f, 0.566895f, - 0.845703f, 0.939941f, 0.987793f, 0.988281f, 0.987793f, 0.987793f, 0.988281f, 0.988281f, - 0.000000f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, - 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, - 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000103f, 0.000077f, 0.000061f, - 0.000046f, 0.000037f, 0.000030f, 0.000023f, 0.000019f, 0.000016f, 0.000039f, 0.000094f, - 0.000181f, 0.000205f, 0.000350f, 0.000392f, 0.000423f, 0.000510f, 0.000619f, 0.000672f, - 0.000705f, 0.000632f, 0.000807f, 0.001038f, 0.001278f, 0.001894f, 0.002245f, 0.002758f, - 0.003883f, 0.005863f, 0.008636f, 0.013672f, 0.023880f, 0.048828f, 0.127441f, 0.400879f, - 0.779297f, 0.925781f, 0.985840f, 0.986328f, 0.986328f, 0.985840f, 0.986328f, 0.986328f, - 0.000000f, 0.000100f, 0.000108f, 0.000118f, 0.000119f, 0.000118f, 0.000119f, 0.000119f, - 0.000119f, 0.000119f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, - 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000111f, 0.000086f, - 0.000066f, 0.000051f, 0.000041f, 0.000032f, 0.000026f, 0.000021f, 0.000018f, 0.000015f, - 0.000086f, 0.000131f, 0.000190f, 0.000293f, 0.000419f, 0.000481f, 0.000477f, 0.000438f, - 0.000542f, 0.000564f, 0.000599f, 0.000700f, 0.000916f, 0.001122f, 0.001589f, 0.001997f, - 0.002678f, 0.004017f, 0.005814f, 0.009361f, 0.015808f, 0.031250f, 0.075989f, 0.250732f, - 0.676758f, 0.904297f, 0.983887f, 0.983887f, 0.983887f, 0.984375f, 0.984375f, 0.983887f, - 0.000000f, 0.000000f, 0.000077f, 0.000112f, 0.000104f, 0.000115f, 0.000115f, 0.000117f, - 0.000117f, 0.000117f, 0.000118f, 0.000118f, 0.000118f, 0.000118f, 0.000119f, 0.000118f, - 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, - 0.000097f, 0.000076f, 0.000060f, 0.000046f, 0.000037f, 0.000030f, 0.000024f, 0.000020f, - 0.000045f, 0.000063f, 0.000091f, 0.000140f, 0.000202f, 0.000333f, 0.000305f, 0.000399f, - 0.000462f, 0.000452f, 0.000535f, 0.000531f, 0.000631f, 0.000866f, 0.000858f, 0.001307f, - 0.001844f, 0.002823f, 0.004070f, 0.006264f, 0.010536f, 0.020035f, 0.045990f, 0.145996f, - 0.532227f, 0.874023f, 0.980957f, 0.981445f, 0.980957f, 0.981445f, 0.980957f, 0.981445f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000091f, 0.000103f, 0.000105f, 0.000106f, - 0.000111f, 0.000113f, 0.000115f, 0.000114f, 0.000116f, 0.000116f, 0.000117f, 0.000117f, - 0.000117f, 0.000117f, 0.000117f, 0.000118f, 0.000118f, 0.000118f, 0.000118f, 0.000118f, - 0.000118f, 0.000112f, 0.000084f, 0.000069f, 0.000055f, 0.000043f, 0.000036f, 0.000028f, - 0.000024f, 0.000020f, 0.000028f, 0.000039f, 0.000083f, 0.000141f, 0.000211f, 0.000262f, - 0.000413f, 0.000305f, 0.000370f, 0.000358f, 0.000489f, 0.000564f, 0.000599f, 0.000893f, - 0.001084f, 0.001696f, 0.002697f, 0.004074f, 0.006836f, 0.012878f, 0.028122f, 0.083496f, - 0.364014f, 0.826660f, 0.976562f, 0.977539f, 0.977051f, 0.977539f, 0.978027f, 0.977051f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000015f, 0.000086f, - 0.000077f, 0.000103f, 0.000100f, 0.000109f, 0.000110f, 0.000111f, 0.000112f, 0.000112f, - 0.000114f, 0.000114f, 0.000115f, 0.000115f, 0.000116f, 0.000115f, 0.000116f, 0.000116f, - 0.000117f, 0.000117f, 0.000117f, 0.000100f, 0.000079f, 0.000066f, 0.000053f, 0.000041f, - 0.000035f, 0.000028f, 0.000023f, 0.000019f, 0.000017f, 0.000034f, 0.000113f, 0.000174f, - 0.000257f, 0.000325f, 0.000356f, 0.000324f, 0.000409f, 0.000454f, 0.000474f, 0.000659f, - 0.000778f, 0.001243f, 0.001575f, 0.002472f, 0.004105f, 0.007957f, 0.016800f, 0.047852f, - 0.217529f, 0.755371f, 0.972656f, 0.973145f, 0.973145f, 0.973145f, 0.973145f, 0.973145f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000028f, 0.000049f, 0.000085f, 0.000081f, 0.000096f, 0.000101f, 0.000104f, - 0.000106f, 0.000108f, 0.000109f, 0.000110f, 0.000111f, 0.000112f, 0.000113f, 0.000113f, - 0.000114f, 0.000114f, 0.000114f, 0.000115f, 0.000115f, 0.000096f, 0.000078f, 0.000064f, - 0.000051f, 0.000043f, 0.000035f, 0.000029f, 0.000024f, 0.000020f, 0.000026f, 0.000055f, - 0.000087f, 0.000135f, 0.000248f, 0.000261f, 0.000274f, 0.000258f, 0.000296f, 0.000359f, - 0.000474f, 0.000627f, 0.001012f, 0.001484f, 0.002630f, 0.004536f, 0.010277f, 0.027405f, - 0.119507f, 0.645996f, 0.966797f, 0.967285f, 0.967285f, 0.967285f, 0.966797f, 0.966797f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000014f, 0.000021f, 0.000065f, 0.000074f, - 0.000077f, 0.000091f, 0.000091f, 0.000099f, 0.000098f, 0.000103f, 0.000103f, 0.000106f, - 0.000107f, 0.000108f, 0.000109f, 0.000110f, 0.000111f, 0.000111f, 0.000112f, 0.000096f, - 0.000079f, 0.000064f, 0.000053f, 0.000043f, 0.000036f, 0.000030f, 0.000024f, 0.000021f, - 0.000018f, 0.000028f, 0.000072f, 0.000125f, 0.000233f, 0.000243f, 0.000220f, 0.000258f, - 0.000320f, 0.000353f, 0.000630f, 0.000932f, 0.001324f, 0.002357f, 0.005402f, 0.014534f, - 0.062561f, 0.493164f, 0.958008f, 0.958008f, 0.958984f, 0.958496f, 0.958496f, 0.958008f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000011f, 0.000035f, 0.000041f, 0.000064f, 0.000074f, 0.000081f, 0.000082f, 0.000090f, - 0.000092f, 0.000096f, 0.000099f, 0.000100f, 0.000102f, 0.000104f, 0.000105f, 0.000106f, - 0.000107f, 0.000099f, 0.000082f, 0.000067f, 0.000055f, 0.000047f, 0.000038f, 0.000031f, - 0.000026f, 0.000022f, 0.000018f, 0.000037f, 0.000071f, 0.000111f, 0.000190f, 0.000204f, - 0.000153f, 0.000245f, 0.000299f, 0.000482f, 0.000790f, 0.001330f, 0.002619f, 0.007282f, - 0.031097f, 0.318115f, 0.946289f, 0.946777f, 0.946777f, 0.946777f, 0.946777f, 0.946777f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000008f, 0.000029f, 0.000044f, - 0.000055f, 0.000063f, 0.000073f, 0.000075f, 0.000081f, 0.000087f, 0.000090f, 0.000092f, - 0.000094f, 0.000097f, 0.000099f, 0.000100f, 0.000087f, 0.000071f, 0.000059f, 0.000049f, - 0.000040f, 0.000034f, 0.000028f, 0.000024f, 0.000020f, 0.000016f, 0.000072f, 0.000114f, - 0.000169f, 0.000147f, 0.000181f, 0.000246f, 0.000367f, 0.000626f, 0.001325f, 0.003117f, - 0.013741f, 0.167480f, 0.929688f, 0.929688f, 0.929688f, 0.930176f, 0.930664f, 0.930176f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000019f, 0.000030f, 0.000044f, 0.000049f, 0.000062f, - 0.000068f, 0.000072f, 0.000078f, 0.000081f, 0.000084f, 0.000087f, 0.000090f, 0.000079f, - 0.000065f, 0.000054f, 0.000044f, 0.000037f, 0.000030f, 0.000025f, 0.000021f, 0.000017f, - 0.000052f, 0.000100f, 0.000132f, 0.000130f, 0.000164f, 0.000297f, 0.000552f, 0.001273f, - 0.005009f, 0.071594f, 0.903809f, 0.905273f, 0.904297f, 0.904785f, 0.904785f, 0.904785f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000013f, 0.000028f, 0.000036f, 0.000045f, 0.000053f, 0.000060f, 0.000066f, - 0.000071f, 0.000075f, 0.000071f, 0.000058f, 0.000049f, 0.000040f, 0.000033f, 0.000027f, - 0.000022f, 0.000018f, 0.000032f, 0.000078f, 0.000090f, 0.000123f, 0.000175f, 0.000441f, - 0.001637f, 0.022537f, 0.865234f, 0.865234f, 0.865723f, 0.865723f, 0.865234f, 0.864746f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000004f, - 0.000017f, 0.000027f, 0.000036f, 0.000042f, 0.000050f, 0.000056f, 0.000052f, 0.000043f, - 0.000035f, 0.000028f, 0.000022f, 0.000018f, 0.000049f, 0.000055f, 0.000047f, 0.000108f, - 0.000342f, 0.004566f, 0.802734f, 0.803711f, 0.803711f, 0.803711f, 0.803711f, 0.803711f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000013f, - 0.000022f, 0.000030f, 0.000033f, 0.000027f, 0.000021f, 0.000015f, 0.000011f, 0.000031f, - 0.000045f, 0.000449f, 0.708496f, 0.707520f, 0.708984f, 0.708496f, 0.707520f, 0.708008f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000004f, 0.000011f, - 0.000006f, 0.000007f, 0.575195f, 0.575195f, 0.575195f, 0.575195f, 0.575195f, 0.575195f, - }, - { - 0.158813f, 0.632812f, 0.824219f, 0.891602f, 0.924805f, 0.942383f, 0.954102f, 0.962402f, - 0.968262f, 0.972656f, 0.976074f, 0.978516f, 0.980957f, 0.982910f, 0.984375f, 0.985840f, - 0.986816f, 0.988770f, 0.989746f, 0.989746f, 0.990234f, 0.991211f, 0.992188f, 0.992676f, - 0.993652f, 0.993652f, 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.995605f, - 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.019775f, 0.115845f, 0.361084f, 0.642578f, 0.798340f, 0.872559f, 0.911133f, 0.933594f, - 0.947266f, 0.957031f, 0.964355f, 0.968750f, 0.973145f, 0.976562f, 0.979492f, 0.981934f, - 0.983398f, 0.984863f, 0.986816f, 0.987793f, 0.988770f, 0.989258f, 0.990234f, 0.991211f, - 0.991699f, 0.992676f, 0.993164f, 0.993164f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, - 0.995605f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997070f, - 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.006638f, 0.031082f, 0.089661f, 0.222168f, 0.448242f, 0.663086f, 0.794434f, 0.864258f, - 0.903320f, 0.926758f, 0.942383f, 0.953613f, 0.961426f, 0.966797f, 0.972168f, 0.975586f, - 0.978027f, 0.980469f, 0.982910f, 0.984375f, 0.985840f, 0.986816f, 0.988281f, 0.989258f, - 0.990234f, 0.991211f, 0.991699f, 0.992188f, 0.992676f, 0.993164f, 0.993652f, 0.994141f, - 0.994629f, 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, - 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.003246f, 0.013367f, 0.032806f, 0.072754f, 0.152954f, 0.304199f, 0.509766f, 0.687500f, - 0.797852f, 0.862305f, 0.900391f, 0.923828f, 0.940430f, 0.950684f, 0.959473f, 0.965820f, - 0.970703f, 0.974121f, 0.977051f, 0.979492f, 0.981934f, 0.983887f, 0.985840f, 0.987305f, - 0.987793f, 0.989258f, 0.989746f, 0.990723f, 0.991211f, 0.992188f, 0.992188f, 0.993164f, - 0.993652f, 0.993652f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, - 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, - 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.002029f, 0.007267f, 0.016678f, 0.032288f, 0.061462f, 0.115051f, 0.215088f, 0.376709f, - 0.562988f, 0.712891f, 0.807617f, 0.865234f, 0.901367f, 0.923828f, 0.939453f, 0.950684f, - 0.958984f, 0.965332f, 0.970215f, 0.974609f, 0.977051f, 0.979980f, 0.981934f, 0.983887f, - 0.984863f, 0.986328f, 0.988281f, 0.988770f, 0.989746f, 0.990723f, 0.990723f, 0.991699f, - 0.992188f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995117f, 0.996094f, - 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, - 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.001274f, 0.004623f, 0.009880f, 0.017792f, 0.030869f, 0.052673f, 0.091431f, 0.160645f, - 0.277832f, 0.442383f, 0.610352f, 0.737793f, 0.819824f, 0.870605f, 0.902832f, 0.924805f, - 0.939941f, 0.950195f, 0.958496f, 0.964844f, 0.970215f, 0.973633f, 0.977051f, 0.979980f, - 0.981934f, 0.983398f, 0.984863f, 0.986328f, 0.987305f, 0.988770f, 0.989746f, 0.990723f, - 0.991211f, 0.992188f, 0.992676f, 0.993164f, 0.993652f, 0.994141f, 0.994629f, 0.995117f, - 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, - 0.997559f, 0.998047f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000943f, 0.003231f, 0.006317f, 0.011040f, 0.018051f, 0.029190f, 0.046936f, 0.075867f, - 0.125488f, 0.210449f, 0.341797f, 0.503906f, 0.652344f, 0.761230f, 0.832031f, 0.877441f, - 0.906738f, 0.927734f, 0.940918f, 0.951172f, 0.959473f, 0.965820f, 0.970703f, 0.974121f, - 0.977051f, 0.979492f, 0.981934f, 0.983398f, 0.985352f, 0.987305f, 0.988281f, 0.989258f, - 0.990234f, 0.990723f, 0.991211f, 0.992188f, 0.992676f, 0.993164f, 0.994141f, 0.994629f, - 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, - 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000731f, 0.001970f, 0.004425f, 0.007351f, 0.011627f, 0.017975f, 0.027161f, 0.041779f, - 0.064270f, 0.101685f, 0.164917f, 0.265137f, 0.406494f, 0.561035f, 0.692383f, 0.785156f, - 0.845703f, 0.884766f, 0.911621f, 0.930176f, 0.942871f, 0.953125f, 0.959961f, 0.965332f, - 0.970703f, 0.974121f, 0.977539f, 0.979492f, 0.982422f, 0.983887f, 0.985840f, 0.987305f, - 0.987793f, 0.989258f, 0.990234f, 0.991211f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, - 0.994141f, 0.995117f, 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, - 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000487f, 0.001872f, 0.003445f, 0.005367f, 0.008400f, 0.012405f, 0.017822f, 0.025345f, - 0.037964f, 0.056244f, 0.085327f, 0.132935f, 0.210327f, 0.325928f, 0.471924f, 0.615723f, - 0.729004f, 0.807617f, 0.859375f, 0.894043f, 0.916504f, 0.934570f, 0.945801f, 0.955078f, - 0.961426f, 0.967285f, 0.972168f, 0.975586f, 0.978516f, 0.980957f, 0.982422f, 0.984863f, - 0.985840f, 0.986816f, 0.988770f, 0.989258f, 0.990723f, 0.991699f, 0.992188f, 0.992676f, - 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, - 0.996094f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.997559f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000363f, 0.001300f, 0.002499f, 0.003784f, 0.006153f, 0.008896f, 0.012367f, 0.017227f, - 0.024185f, 0.034241f, 0.049591f, 0.072754f, 0.111023f, 0.170776f, 0.263184f, 0.391113f, - 0.535645f, 0.665527f, 0.761719f, 0.828613f, 0.871582f, 0.902344f, 0.922852f, 0.937988f, - 0.949219f, 0.957031f, 0.963867f, 0.968750f, 0.972656f, 0.976074f, 0.979004f, 0.981445f, - 0.983887f, 0.984863f, 0.986328f, 0.988281f, 0.989258f, 0.990234f, 0.991211f, 0.991699f, - 0.992676f, 0.993652f, 0.993652f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.996094f, - 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999023f, 0.999023f, - 0.000365f, 0.000972f, 0.001874f, 0.003323f, 0.004669f, 0.006599f, 0.008919f, 0.012360f, - 0.016785f, 0.022720f, 0.031616f, 0.044647f, 0.064026f, 0.094055f, 0.141235f, 0.215332f, - 0.323486f, 0.459229f, 0.597168f, 0.710449f, 0.791992f, 0.847656f, 0.885254f, 0.910645f, - 0.929199f, 0.941895f, 0.952148f, 0.960449f, 0.965332f, 0.970703f, 0.974121f, 0.977539f, - 0.979980f, 0.981934f, 0.984375f, 0.985840f, 0.987305f, 0.988770f, 0.989746f, 0.990723f, - 0.991211f, 0.992188f, 0.993164f, 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, - 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, - 0.998047f, 0.998535f, 0.999023f, 0.999512f, 0.999023f, 0.999512f, 0.999512f, 0.999023f, - 0.000244f, 0.000764f, 0.001375f, 0.002415f, 0.003582f, 0.004963f, 0.006973f, 0.008751f, - 0.011726f, 0.016113f, 0.021683f, 0.029129f, 0.040283f, 0.057098f, 0.081421f, 0.119019f, - 0.178955f, 0.268311f, 0.390625f, 0.528809f, 0.654785f, 0.751465f, 0.820312f, 0.866211f, - 0.896973f, 0.919434f, 0.935547f, 0.946777f, 0.956055f, 0.962402f, 0.968262f, 0.972168f, - 0.975098f, 0.979004f, 0.981445f, 0.983398f, 0.985352f, 0.986816f, 0.987793f, 0.989258f, - 0.990723f, 0.991211f, 0.992188f, 0.992188f, 0.993164f, 0.993652f, 0.994629f, 0.995117f, - 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000122f, 0.000606f, 0.001439f, 0.002058f, 0.002743f, 0.004169f, 0.005035f, 0.006775f, - 0.009010f, 0.012085f, 0.015717f, 0.020813f, 0.027573f, 0.037170f, 0.050812f, 0.071472f, - 0.102905f, 0.151489f, 0.225708f, 0.332031f, 0.463623f, 0.596191f, 0.707031f, 0.787598f, - 0.844238f, 0.881348f, 0.908691f, 0.927246f, 0.940918f, 0.951660f, 0.958984f, 0.965820f, - 0.970215f, 0.974121f, 0.977539f, 0.979980f, 0.982422f, 0.984375f, 0.985840f, 0.987305f, - 0.988281f, 0.990234f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.994141f, - 0.994629f, 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000118f, 0.000846f, 0.001303f, 0.001593f, 0.002180f, 0.003050f, 0.004353f, 0.005577f, - 0.006954f, 0.009331f, 0.011826f, 0.015007f, 0.019653f, 0.025391f, 0.034119f, 0.046112f, - 0.063660f, 0.090210f, 0.130737f, 0.192139f, 0.283203f, 0.404053f, 0.537598f, 0.658691f, - 0.753418f, 0.818848f, 0.865234f, 0.896973f, 0.918945f, 0.934570f, 0.946289f, 0.955566f, - 0.962402f, 0.967285f, 0.972168f, 0.976074f, 0.979004f, 0.981445f, 0.983398f, 0.985840f, - 0.986816f, 0.988281f, 0.989258f, 0.990723f, 0.991211f, 0.992676f, 0.993164f, 0.993652f, - 0.994141f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000117f, 0.000487f, 0.000957f, 0.001514f, 0.002008f, 0.002619f, 0.003424f, 0.004551f, - 0.005836f, 0.007381f, 0.009155f, 0.011459f, 0.014366f, 0.018646f, 0.024017f, 0.031281f, - 0.042664f, 0.057068f, 0.080139f, 0.113586f, 0.165894f, 0.243164f, 0.352051f, 0.481934f, - 0.610840f, 0.716309f, 0.793945f, 0.847168f, 0.884766f, 0.910645f, 0.928223f, 0.942383f, - 0.952637f, 0.959961f, 0.965332f, 0.970703f, 0.975098f, 0.978027f, 0.980957f, 0.983398f, - 0.984863f, 0.986816f, 0.988281f, 0.989258f, 0.990723f, 0.991211f, 0.992188f, 0.992676f, - 0.993164f, 0.993652f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, - 0.997559f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000608f, 0.000952f, 0.001111f, 0.001660f, 0.002102f, 0.002817f, 0.003517f, - 0.004742f, 0.005585f, 0.007080f, 0.008980f, 0.011078f, 0.014191f, 0.017838f, 0.022614f, - 0.029404f, 0.038940f, 0.052551f, 0.071533f, 0.100769f, 0.145020f, 0.211548f, 0.307373f, - 0.430176f, 0.561523f, 0.676758f, 0.764648f, 0.828613f, 0.872070f, 0.900879f, 0.921875f, - 0.937012f, 0.948730f, 0.957520f, 0.964355f, 0.969238f, 0.973633f, 0.977539f, 0.979980f, - 0.982422f, 0.984863f, 0.986328f, 0.987793f, 0.988770f, 0.990234f, 0.991211f, 0.991699f, - 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.994629f, 0.995605f, 0.996094f, 0.996582f, - 0.997070f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000244f, 0.000576f, 0.000727f, 0.001083f, 0.001186f, 0.001810f, 0.002558f, 0.002968f, - 0.003725f, 0.004913f, 0.005955f, 0.007011f, 0.008759f, 0.010918f, 0.013718f, 0.016953f, - 0.021423f, 0.027832f, 0.035980f, 0.047913f, 0.064941f, 0.090332f, 0.128174f, 0.185791f, - 0.270264f, 0.384033f, 0.514160f, 0.638184f, 0.736328f, 0.807617f, 0.856934f, 0.891602f, - 0.915039f, 0.932617f, 0.945801f, 0.954102f, 0.962402f, 0.968262f, 0.972168f, 0.976562f, - 0.979492f, 0.981445f, 0.983887f, 0.985840f, 0.987305f, 0.988281f, 0.990234f, 0.990723f, - 0.992188f, 0.992676f, 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, - 0.996582f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000244f, 0.000708f, 0.000903f, 0.001129f, 0.001511f, 0.002031f, 0.002565f, - 0.003189f, 0.004112f, 0.004696f, 0.005989f, 0.006954f, 0.008865f, 0.010826f, 0.013031f, - 0.016312f, 0.020493f, 0.026154f, 0.033966f, 0.044159f, 0.059845f, 0.081665f, 0.114929f, - 0.164917f, 0.239624f, 0.343750f, 0.469971f, 0.598145f, 0.706055f, 0.786133f, 0.842773f, - 0.881348f, 0.908203f, 0.927246f, 0.941895f, 0.952148f, 0.959961f, 0.966797f, 0.971191f, - 0.976074f, 0.978516f, 0.981445f, 0.983887f, 0.985352f, 0.987305f, 0.988281f, 0.989258f, - 0.990723f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.995605f, 0.996094f, - 0.996094f, 0.996582f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000122f, 0.000244f, 0.000482f, 0.000674f, 0.001029f, 0.001440f, 0.001746f, 0.002153f, - 0.002804f, 0.003206f, 0.003859f, 0.004948f, 0.005722f, 0.007206f, 0.008568f, 0.010498f, - 0.012413f, 0.015793f, 0.019989f, 0.024826f, 0.031799f, 0.041382f, 0.054932f, 0.074768f, - 0.103882f, 0.147949f, 0.213867f, 0.308838f, 0.429932f, 0.560059f, 0.675781f, 0.765625f, - 0.827148f, 0.871582f, 0.901367f, 0.923340f, 0.937988f, 0.949707f, 0.958496f, 0.965820f, - 0.969727f, 0.974609f, 0.978027f, 0.980469f, 0.983398f, 0.985840f, 0.986816f, 0.988281f, - 0.989258f, 0.990723f, 0.992188f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.995117f, - 0.995605f, 0.996582f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000244f, 0.000244f, 0.000363f, 0.000604f, 0.000834f, 0.001020f, 0.001548f, 0.001970f, - 0.002262f, 0.002548f, 0.003157f, 0.003914f, 0.004681f, 0.005962f, 0.006943f, 0.008263f, - 0.010277f, 0.012589f, 0.015144f, 0.018951f, 0.023788f, 0.030014f, 0.039001f, 0.051056f, - 0.069092f, 0.094666f, 0.133911f, 0.192993f, 0.279053f, 0.394287f, 0.524414f, 0.646484f, - 0.743652f, 0.812988f, 0.861328f, 0.895020f, 0.917969f, 0.935547f, 0.947754f, 0.957520f, - 0.963867f, 0.969238f, 0.974121f, 0.978027f, 0.980469f, 0.983398f, 0.984863f, 0.987305f, - 0.988281f, 0.989258f, 0.990723f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, - 0.995117f, 0.996094f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000118f, 0.000244f, 0.000244f, 0.000584f, 0.000837f, 0.000847f, 0.001295f, 0.001681f, - 0.002018f, 0.002348f, 0.003014f, 0.003157f, 0.004124f, 0.004547f, 0.005432f, 0.006607f, - 0.008163f, 0.010071f, 0.011925f, 0.014786f, 0.017990f, 0.022659f, 0.028824f, 0.036621f, - 0.047882f, 0.063477f, 0.087158f, 0.122559f, 0.175781f, 0.254639f, 0.363037f, 0.492188f, - 0.618652f, 0.722168f, 0.799805f, 0.852051f, 0.889648f, 0.914551f, 0.932129f, 0.944824f, - 0.955078f, 0.962891f, 0.968262f, 0.973633f, 0.977051f, 0.980469f, 0.982910f, 0.984863f, - 0.987305f, 0.988281f, 0.990234f, 0.991211f, 0.992188f, 0.993164f, 0.993652f, 0.994141f, - 0.995117f, 0.995605f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000242f, 0.000243f, 0.000243f, 0.000481f, 0.000742f, 0.000843f, 0.000969f, 0.001348f, - 0.001726f, 0.001791f, 0.002348f, 0.002853f, 0.003452f, 0.003735f, 0.004757f, 0.005516f, - 0.006744f, 0.008102f, 0.009621f, 0.011948f, 0.014320f, 0.017365f, 0.021698f, 0.027298f, - 0.034546f, 0.044891f, 0.059875f, 0.081055f, 0.112915f, 0.161255f, 0.234009f, 0.335693f, - 0.462646f, 0.592285f, 0.702637f, 0.785645f, 0.843750f, 0.883301f, 0.911133f, 0.929688f, - 0.944336f, 0.954590f, 0.961914f, 0.967773f, 0.973633f, 0.977539f, 0.980469f, 0.982910f, - 0.985352f, 0.986816f, 0.988770f, 0.990234f, 0.991211f, 0.992188f, 0.993164f, 0.993652f, - 0.994629f, 0.995117f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000100f, 0.000216f, 0.000243f, 0.000365f, 0.000517f, 0.000836f, 0.000964f, 0.001148f, - 0.001472f, 0.001674f, 0.001785f, 0.002438f, 0.002815f, 0.003490f, 0.004070f, 0.004837f, - 0.005608f, 0.006630f, 0.008095f, 0.009483f, 0.011551f, 0.013847f, 0.016953f, 0.020584f, - 0.025879f, 0.033051f, 0.042664f, 0.055817f, 0.075500f, 0.105103f, 0.149536f, 0.216553f, - 0.312988f, 0.436768f, 0.568359f, 0.685059f, 0.773926f, 0.835449f, 0.878418f, 0.907227f, - 0.927734f, 0.943359f, 0.953125f, 0.962402f, 0.967285f, 0.973145f, 0.977051f, 0.980469f, - 0.983887f, 0.985352f, 0.987305f, 0.989258f, 0.990234f, 0.991699f, 0.992188f, 0.993164f, - 0.994141f, 0.994629f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000150f, 0.000242f, 0.000364f, 0.000441f, 0.000627f, 0.000916f, 0.000959f, - 0.000968f, 0.001463f, 0.001671f, 0.002222f, 0.002577f, 0.002714f, 0.003479f, 0.004208f, - 0.004723f, 0.005669f, 0.006886f, 0.007637f, 0.009315f, 0.011154f, 0.013596f, 0.016205f, - 0.019821f, 0.024963f, 0.031250f, 0.040375f, 0.053009f, 0.071167f, 0.098511f, 0.139648f, - 0.202271f, 0.293457f, 0.414307f, 0.548340f, 0.669434f, 0.762695f, 0.829590f, 0.874512f, - 0.904785f, 0.926758f, 0.941895f, 0.953613f, 0.961914f, 0.968262f, 0.973633f, 0.977539f, - 0.980957f, 0.983398f, 0.985352f, 0.987793f, 0.989258f, 0.990234f, 0.991211f, 0.992188f, - 0.993164f, 0.994629f, 0.998047f, 0.998535f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000000f, 0.000231f, 0.000232f, 0.000363f, 0.000486f, 0.000503f, 0.000724f, 0.001104f, - 0.001080f, 0.001271f, 0.001509f, 0.001976f, 0.002247f, 0.002476f, 0.002895f, 0.003553f, - 0.004192f, 0.004871f, 0.005623f, 0.006332f, 0.007584f, 0.008957f, 0.010849f, 0.012917f, - 0.015396f, 0.019226f, 0.023941f, 0.030060f, 0.038513f, 0.050385f, 0.067627f, 0.093140f, - 0.131714f, 0.190674f, 0.278076f, 0.395752f, 0.530273f, 0.655762f, 0.753906f, 0.823242f, - 0.870605f, 0.903320f, 0.925781f, 0.941406f, 0.953125f, 0.961914f, 0.969238f, 0.974121f, - 0.978027f, 0.980957f, 0.983887f, 0.985840f, 0.988281f, 0.989258f, 0.990723f, 0.991699f, - 0.992676f, 0.993652f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000000f, 0.000009f, 0.000116f, 0.000360f, 0.000484f, 0.000485f, 0.000536f, 0.000827f, - 0.000935f, 0.001077f, 0.001204f, 0.001561f, 0.001974f, 0.002136f, 0.002777f, 0.002964f, - 0.003517f, 0.004192f, 0.004711f, 0.005505f, 0.006283f, 0.007408f, 0.008713f, 0.010674f, - 0.012375f, 0.015099f, 0.018677f, 0.022797f, 0.028732f, 0.036835f, 0.047974f, 0.064270f, - 0.088318f, 0.124634f, 0.180664f, 0.264893f, 0.380615f, 0.516113f, 0.645020f, 0.747559f, - 0.819824f, 0.870117f, 0.902344f, 0.925293f, 0.941406f, 0.953613f, 0.962402f, 0.969238f, - 0.974121f, 0.978027f, 0.981934f, 0.984375f, 0.986328f, 0.988281f, 0.989746f, 0.990723f, - 0.992676f, 0.993164f, 0.997559f, 0.998047f, 0.998047f, 0.997559f, 0.998047f, 0.998047f, - 0.000000f, 0.000000f, 0.000074f, 0.000337f, 0.000481f, 0.000484f, 0.000485f, 0.000556f, - 0.000823f, 0.001143f, 0.001187f, 0.001391f, 0.001781f, 0.002155f, 0.002327f, 0.002760f, - 0.003008f, 0.003433f, 0.004101f, 0.004681f, 0.005417f, 0.006443f, 0.007393f, 0.008560f, - 0.010345f, 0.012177f, 0.014496f, 0.018127f, 0.022125f, 0.027740f, 0.035736f, 0.046173f, - 0.061920f, 0.084717f, 0.119324f, 0.173218f, 0.254883f, 0.368652f, 0.505371f, 0.637207f, - 0.742676f, 0.818359f, 0.868164f, 0.902832f, 0.925781f, 0.942383f, 0.953613f, 0.963379f, - 0.970215f, 0.975098f, 0.979004f, 0.982422f, 0.984863f, 0.986328f, 0.988770f, 0.990723f, - 0.991699f, 0.992676f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000000f, 0.000188f, 0.000358f, 0.000481f, 0.000484f, 0.000484f, - 0.000704f, 0.000852f, 0.001165f, 0.001316f, 0.001500f, 0.001685f, 0.001933f, 0.002079f, - 0.002720f, 0.003136f, 0.003727f, 0.003723f, 0.004513f, 0.005207f, 0.006275f, 0.007236f, - 0.008453f, 0.010056f, 0.011848f, 0.014191f, 0.017212f, 0.021652f, 0.026978f, 0.034241f, - 0.044678f, 0.058990f, 0.081421f, 0.114929f, 0.167236f, 0.247070f, 0.360596f, 0.498291f, - 0.632812f, 0.741211f, 0.818359f, 0.869629f, 0.903809f, 0.927734f, 0.943848f, 0.955566f, - 0.964355f, 0.970703f, 0.976074f, 0.979492f, 0.982422f, 0.985840f, 0.987793f, 0.989258f, - 0.990723f, 0.992188f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000121f, 0.000120f, 0.000288f, 0.000357f, 0.000479f, 0.000483f, - 0.000535f, 0.000711f, 0.000862f, 0.001256f, 0.001351f, 0.001502f, 0.001719f, 0.002146f, - 0.002037f, 0.002653f, 0.003248f, 0.003222f, 0.003820f, 0.004456f, 0.005173f, 0.006008f, - 0.007072f, 0.008247f, 0.009758f, 0.011826f, 0.013771f, 0.016861f, 0.020935f, 0.025986f, - 0.032928f, 0.043030f, 0.057587f, 0.078918f, 0.111755f, 0.162964f, 0.241943f, 0.355713f, - 0.495117f, 0.632324f, 0.742676f, 0.819336f, 0.871582f, 0.905762f, 0.929688f, 0.945312f, - 0.957031f, 0.965332f, 0.972168f, 0.976562f, 0.980957f, 0.983887f, 0.986328f, 0.988281f, - 0.990234f, 0.991699f, 0.997070f, 0.997559f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000200f, 0.000412f, 0.000471f, 0.000599f, - 0.000598f, 0.000596f, 0.000805f, 0.001099f, 0.001334f, 0.001417f, 0.001456f, 0.001723f, - 0.002102f, 0.002283f, 0.002579f, 0.003208f, 0.003233f, 0.003740f, 0.004574f, 0.005287f, - 0.006012f, 0.006870f, 0.008018f, 0.009354f, 0.011208f, 0.013542f, 0.016495f, 0.020370f, - 0.025284f, 0.032410f, 0.041901f, 0.056183f, 0.077087f, 0.109558f, 0.160278f, 0.239380f, - 0.354492f, 0.496094f, 0.635254f, 0.747070f, 0.823730f, 0.875488f, 0.908691f, 0.931641f, - 0.947266f, 0.958008f, 0.966309f, 0.972656f, 0.978027f, 0.981445f, 0.984863f, 0.986816f, - 0.989258f, 0.990723f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000000f, 0.000000f, 0.000000f, 0.000117f, 0.000237f, 0.000239f, 0.000430f, 0.000465f, - 0.000599f, 0.000724f, 0.000716f, 0.000815f, 0.000981f, 0.001334f, 0.001299f, 0.001545f, - 0.001617f, 0.001935f, 0.002110f, 0.002501f, 0.002823f, 0.003408f, 0.003790f, 0.004467f, - 0.005112f, 0.005848f, 0.006718f, 0.007942f, 0.009514f, 0.011093f, 0.013092f, 0.015945f, - 0.019608f, 0.024689f, 0.031494f, 0.041046f, 0.054901f, 0.075989f, 0.108032f, 0.158936f, - 0.239014f, 0.356201f, 0.500488f, 0.642090f, 0.753418f, 0.830566f, 0.880859f, 0.912598f, - 0.935059f, 0.950195f, 0.960449f, 0.968262f, 0.975098f, 0.979980f, 0.982910f, 0.985352f, - 0.987793f, 0.990234f, 0.996582f, 0.997070f, 0.997070f, 0.996582f, 0.997070f, 0.996582f, - 0.000000f, 0.000000f, 0.000000f, 0.000117f, 0.000120f, 0.000121f, 0.000312f, 0.000407f, - 0.000707f, 0.000597f, 0.000648f, 0.000720f, 0.000941f, 0.001008f, 0.001229f, 0.001289f, - 0.001423f, 0.001726f, 0.002060f, 0.002211f, 0.002506f, 0.002985f, 0.003036f, 0.003683f, - 0.004066f, 0.004833f, 0.005592f, 0.006611f, 0.007675f, 0.008965f, 0.010811f, 0.012833f, - 0.015854f, 0.019485f, 0.024429f, 0.031036f, 0.040466f, 0.054108f, 0.074890f, 0.107727f, - 0.159180f, 0.241699f, 0.362549f, 0.510742f, 0.653809f, 0.763184f, 0.837891f, 0.887207f, - 0.917480f, 0.938477f, 0.953613f, 0.962891f, 0.970703f, 0.976562f, 0.980469f, 0.984375f, - 0.986816f, 0.988770f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, - 0.000000f, 0.000000f, 0.000000f, 0.000117f, 0.000118f, 0.000120f, 0.000129f, 0.000434f, - 0.000536f, 0.000613f, 0.000716f, 0.000799f, 0.000720f, 0.000768f, 0.001024f, 0.001202f, - 0.001501f, 0.001530f, 0.001568f, 0.001897f, 0.002190f, 0.002502f, 0.002893f, 0.003105f, - 0.003551f, 0.004021f, 0.004791f, 0.005405f, 0.006313f, 0.007309f, 0.008720f, 0.010712f, - 0.012657f, 0.015472f, 0.018982f, 0.023697f, 0.030579f, 0.040009f, 0.054138f, 0.075012f, - 0.107849f, 0.161377f, 0.247070f, 0.373047f, 0.525391f, 0.667969f, 0.776855f, 0.847656f, - 0.894043f, 0.923340f, 0.942871f, 0.956543f, 0.965820f, 0.973145f, 0.978027f, 0.982422f, - 0.985352f, 0.987793f, 0.996094f, 0.996094f, 0.996582f, 0.996094f, 0.996582f, 0.996094f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000081f, 0.000116f, 0.000227f, 0.000360f, - 0.000366f, 0.000642f, 0.000691f, 0.000711f, 0.000806f, 0.000721f, 0.000925f, 0.000947f, - 0.001155f, 0.001478f, 0.001554f, 0.001612f, 0.001929f, 0.002354f, 0.002291f, 0.002712f, - 0.003029f, 0.003441f, 0.003876f, 0.004452f, 0.005276f, 0.006256f, 0.007149f, 0.008568f, - 0.010040f, 0.012566f, 0.015160f, 0.018677f, 0.023376f, 0.030411f, 0.039642f, 0.053986f, - 0.075134f, 0.109436f, 0.165527f, 0.255127f, 0.387695f, 0.544434f, 0.686523f, 0.791016f, - 0.858398f, 0.901367f, 0.928711f, 0.947266f, 0.959961f, 0.968262f, 0.975098f, 0.980469f, - 0.983887f, 0.987305f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000088f, 0.000085f, 0.000338f, 0.000351f, - 0.000359f, 0.000480f, 0.000539f, 0.000698f, 0.000798f, 0.000793f, 0.000834f, 0.000891f, - 0.000941f, 0.001143f, 0.001422f, 0.001512f, 0.001833f, 0.001955f, 0.002144f, 0.002426f, - 0.002716f, 0.003262f, 0.003572f, 0.003860f, 0.004456f, 0.005173f, 0.006191f, 0.006939f, - 0.008545f, 0.010162f, 0.012375f, 0.014969f, 0.018555f, 0.023376f, 0.029953f, 0.039673f, - 0.054077f, 0.076477f, 0.112000f, 0.171509f, 0.268066f, 0.408203f, 0.569336f, 0.709961f, - 0.808105f, 0.872070f, 0.910645f, 0.935059f, 0.951660f, 0.963379f, 0.971680f, 0.977539f, - 0.982422f, 0.985840f, 0.995117f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000116f, 0.000340f, - 0.000353f, 0.000349f, 0.000480f, 0.000576f, 0.000668f, 0.000700f, 0.000818f, 0.000833f, - 0.000787f, 0.001125f, 0.001110f, 0.001407f, 0.001489f, 0.001563f, 0.001804f, 0.002073f, - 0.002285f, 0.002409f, 0.002985f, 0.003052f, 0.003853f, 0.004433f, 0.005100f, 0.006046f, - 0.007046f, 0.008156f, 0.009827f, 0.012138f, 0.014740f, 0.018311f, 0.023071f, 0.029770f, - 0.040009f, 0.054810f, 0.078003f, 0.116150f, 0.180176f, 0.284668f, 0.434570f, 0.599121f, - 0.735352f, 0.827637f, 0.885254f, 0.919922f, 0.941895f, 0.957031f, 0.967285f, 0.975098f, - 0.979980f, 0.984375f, 0.995117f, 0.995117f, 0.995117f, 0.995117f, 0.995117f, 0.995605f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000000f, 0.000122f, 0.000235f, - 0.000320f, 0.000351f, 0.000353f, 0.000478f, 0.000602f, 0.000651f, 0.000793f, 0.000706f, - 0.000816f, 0.000814f, 0.000898f, 0.001062f, 0.001259f, 0.001441f, 0.001564f, 0.001772f, - 0.001743f, 0.002134f, 0.002512f, 0.002668f, 0.003193f, 0.003746f, 0.004341f, 0.004902f, - 0.005909f, 0.006920f, 0.008125f, 0.009605f, 0.011711f, 0.014549f, 0.018280f, 0.023163f, - 0.030334f, 0.040375f, 0.055939f, 0.080566f, 0.122070f, 0.192383f, 0.307373f, 0.467773f, - 0.634277f, 0.763184f, 0.846191f, 0.897461f, 0.928711f, 0.948730f, 0.962402f, 0.971680f, - 0.978516f, 0.982422f, 0.994141f, 0.994629f, 0.994629f, 0.995117f, 0.995117f, 0.995117f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000185f, 0.000190f, - 0.000272f, 0.000281f, 0.000464f, 0.000466f, 0.000476f, 0.000521f, 0.000654f, 0.000680f, - 0.000699f, 0.000815f, 0.000814f, 0.000890f, 0.001110f, 0.001283f, 0.001311f, 0.001590f, - 0.001727f, 0.001801f, 0.002020f, 0.002312f, 0.002897f, 0.003267f, 0.003592f, 0.004143f, - 0.004810f, 0.005844f, 0.006618f, 0.008018f, 0.009697f, 0.011597f, 0.014374f, 0.018127f, - 0.023056f, 0.030258f, 0.041107f, 0.057373f, 0.084045f, 0.129517f, 0.208618f, 0.337646f, - 0.508789f, 0.673828f, 0.793457f, 0.866211f, 0.911133f, 0.938965f, 0.955566f, 0.967285f, - 0.975586f, 0.980469f, 0.994141f, 0.994141f, 0.994629f, 0.994629f, 0.994629f, 0.994141f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000226f, 0.000431f, 0.000456f, 0.000467f, 0.000352f, 0.000496f, 0.000588f, - 0.000891f, 0.000771f, 0.000803f, 0.000947f, 0.000972f, 0.001078f, 0.001033f, 0.001279f, - 0.001436f, 0.001483f, 0.001831f, 0.002033f, 0.002264f, 0.002710f, 0.002996f, 0.003582f, - 0.004032f, 0.004665f, 0.005592f, 0.006527f, 0.007820f, 0.009323f, 0.011581f, 0.014328f, - 0.018219f, 0.023239f, 0.030777f, 0.042084f, 0.059448f, 0.089233f, 0.140869f, 0.230713f, - 0.375977f, 0.556641f, 0.715332f, 0.822266f, 0.885742f, 0.924316f, 0.947266f, 0.962402f, - 0.972656f, 0.978516f, 0.993164f, 0.994141f, 0.994141f, 0.994141f, 0.994141f, 0.994141f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000283f, 0.000229f, 0.000425f, 0.000303f, 0.000336f, 0.000469f, 0.000474f, - 0.000728f, 0.000663f, 0.000883f, 0.000695f, 0.000679f, 0.000858f, 0.000919f, 0.000980f, - 0.001218f, 0.001330f, 0.001665f, 0.001637f, 0.002054f, 0.002335f, 0.002508f, 0.002880f, - 0.003323f, 0.004055f, 0.004730f, 0.005463f, 0.006485f, 0.007740f, 0.009293f, 0.011566f, - 0.014175f, 0.017944f, 0.023346f, 0.031433f, 0.043304f, 0.063232f, 0.096313f, 0.155518f, - 0.260498f, 0.424561f, 0.611328f, 0.758789f, 0.852051f, 0.904785f, 0.937012f, 0.955566f, - 0.968262f, 0.977051f, 0.992676f, 0.992676f, 0.993164f, 0.993652f, 0.993164f, 0.993652f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000256f, 0.000216f, 0.000406f, 0.000426f, 0.000457f, 0.000453f, - 0.000472f, 0.000651f, 0.000593f, 0.000876f, 0.000571f, 0.000590f, 0.000819f, 0.000809f, - 0.001000f, 0.001224f, 0.001293f, 0.001637f, 0.001790f, 0.001863f, 0.002298f, 0.002550f, - 0.002995f, 0.003201f, 0.003933f, 0.004677f, 0.005360f, 0.006447f, 0.007763f, 0.009377f, - 0.011330f, 0.014420f, 0.017944f, 0.023560f, 0.032196f, 0.045380f, 0.067383f, 0.105469f, - 0.175659f, 0.301025f, 0.484375f, 0.669922f, 0.801270f, 0.879395f, 0.922852f, 0.948242f, - 0.963379f, 0.974121f, 0.992188f, 0.992188f, 0.992188f, 0.993164f, 0.992188f, 0.993164f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000230f, 0.000206f, 0.000355f, 0.000335f, 0.000305f, - 0.000461f, 0.000565f, 0.000474f, 0.000429f, 0.000520f, 0.000758f, 0.000777f, 0.000668f, - 0.000821f, 0.001013f, 0.001089f, 0.001325f, 0.001570f, 0.001787f, 0.001707f, 0.002037f, - 0.002457f, 0.002892f, 0.003359f, 0.003881f, 0.004616f, 0.005203f, 0.006336f, 0.007477f, - 0.009048f, 0.011345f, 0.014015f, 0.018356f, 0.024307f, 0.033661f, 0.048279f, 0.073303f, - 0.118774f, 0.204102f, 0.354492f, 0.554688f, 0.729492f, 0.840332f, 0.902832f, 0.937988f, - 0.958008f, 0.971191f, 0.991699f, 0.992188f, 0.992188f, 0.991699f, 0.992188f, 0.991699f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000205f, 0.000248f, 0.000213f, 0.000344f, - 0.000437f, 0.000351f, 0.000352f, 0.000359f, 0.000389f, 0.000482f, 0.000676f, 0.000560f, - 0.000806f, 0.000813f, 0.000927f, 0.001230f, 0.001392f, 0.001526f, 0.001627f, 0.001629f, - 0.002047f, 0.002321f, 0.002661f, 0.003317f, 0.003752f, 0.004406f, 0.005119f, 0.005936f, - 0.007156f, 0.009003f, 0.010941f, 0.013985f, 0.018539f, 0.025131f, 0.035248f, 0.051880f, - 0.081543f, 0.137207f, 0.244507f, 0.424561f, 0.632812f, 0.787598f, 0.876465f, 0.924805f, - 0.951172f, 0.966797f, 0.990723f, 0.991211f, 0.991211f, 0.991211f, 0.991211f, 0.991211f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000224f, 0.000171f, 0.000276f, - 0.000278f, 0.000288f, 0.000329f, 0.000365f, 0.000459f, 0.000483f, 0.000626f, 0.000716f, - 0.000767f, 0.000793f, 0.000800f, 0.000897f, 0.000976f, 0.001156f, 0.001322f, 0.001427f, - 0.001799f, 0.001997f, 0.002256f, 0.002773f, 0.002806f, 0.003515f, 0.004040f, 0.004910f, - 0.005730f, 0.007046f, 0.008858f, 0.011124f, 0.014374f, 0.018982f, 0.026123f, 0.037659f, - 0.057129f, 0.093445f, 0.164062f, 0.301514f, 0.511230f, 0.712402f, 0.838867f, 0.906738f, - 0.942383f, 0.961914f, 0.989746f, 0.990234f, 0.989746f, 0.990234f, 0.989746f, 0.990234f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000173f, 0.000140f, - 0.000138f, 0.000232f, 0.000291f, 0.000318f, 0.000338f, 0.000346f, 0.000422f, 0.000368f, - 0.000680f, 0.000722f, 0.000765f, 0.000766f, 0.000803f, 0.001069f, 0.001103f, 0.001185f, - 0.001611f, 0.001593f, 0.001939f, 0.002211f, 0.002569f, 0.003008f, 0.003239f, 0.003952f, - 0.004681f, 0.005630f, 0.007008f, 0.008720f, 0.011200f, 0.014587f, 0.019653f, 0.027527f, - 0.040955f, 0.064514f, 0.110413f, 0.204224f, 0.381104f, 0.609863f, 0.785645f, 0.881836f, - 0.931152f, 0.956543f, 0.988770f, 0.989258f, 0.989258f, 0.989258f, 0.989258f, 0.988770f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000123f, 0.000121f, 0.000090f, - 0.000102f, 0.000063f, 0.000156f, 0.000248f, 0.000333f, 0.000321f, 0.000431f, 0.000392f, - 0.000349f, 0.000434f, 0.000674f, 0.000741f, 0.000776f, 0.000936f, 0.000888f, 0.001049f, - 0.001179f, 0.001326f, 0.001686f, 0.001732f, 0.002050f, 0.002150f, 0.002453f, 0.003016f, - 0.003601f, 0.004444f, 0.005692f, 0.006741f, 0.008324f, 0.011093f, 0.014709f, 0.020752f, - 0.029800f, 0.045654f, 0.074951f, 0.136108f, 0.264893f, 0.486816f, 0.710938f, 0.848145f, - 0.916992f, 0.950684f, 0.987305f, 0.987793f, 0.987793f, 0.988281f, 0.987793f, 0.987793f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000100f, - 0.000049f, 0.000039f, 0.000125f, 0.000121f, 0.000184f, 0.000280f, 0.000366f, 0.000392f, - 0.000333f, 0.000341f, 0.000477f, 0.000597f, 0.000607f, 0.000747f, 0.000767f, 0.000961f, - 0.000936f, 0.001056f, 0.001306f, 0.001388f, 0.001633f, 0.001836f, 0.001997f, 0.002348f, - 0.002878f, 0.003332f, 0.004131f, 0.005165f, 0.006519f, 0.008568f, 0.011444f, 0.015419f, - 0.021881f, 0.032532f, 0.052032f, 0.091187f, 0.177246f, 0.357910f, 0.610352f, 0.800781f, - 0.897461f, 0.942871f, 0.985352f, 0.986328f, 0.986816f, 0.986328f, 0.986328f, 0.986328f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000099f, 0.000076f, - 0.000060f, 0.000108f, 0.000040f, 0.000127f, 0.000127f, 0.000121f, 0.000200f, 0.000265f, - 0.000360f, 0.000316f, 0.000428f, 0.000455f, 0.000456f, 0.000583f, 0.000682f, 0.000750f, - 0.000773f, 0.000824f, 0.000937f, 0.001220f, 0.001262f, 0.001384f, 0.001622f, 0.001862f, - 0.002157f, 0.002817f, 0.003414f, 0.004082f, 0.004993f, 0.006561f, 0.008560f, 0.011696f, - 0.016022f, 0.023529f, 0.036469f, 0.062286f, 0.117126f, 0.245605f, 0.487549f, 0.732910f, - 0.870605f, 0.933105f, 0.983887f, 0.984863f, 0.984863f, 0.984863f, 0.984375f, 0.984863f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000096f, - 0.000075f, 0.000061f, 0.000083f, 0.000096f, 0.000034f, 0.000101f, 0.000121f, 0.000137f, - 0.000211f, 0.000324f, 0.000381f, 0.000373f, 0.000420f, 0.000472f, 0.000494f, 0.000690f, - 0.000793f, 0.000768f, 0.000853f, 0.000867f, 0.000978f, 0.001003f, 0.001145f, 0.001416f, - 0.001888f, 0.002125f, 0.002491f, 0.003004f, 0.003864f, 0.005028f, 0.006500f, 0.008682f, - 0.011856f, 0.016922f, 0.025757f, 0.042603f, 0.078247f, 0.161743f, 0.358398f, 0.641602f, - 0.833496f, 0.920410f, 0.981934f, 0.982910f, 0.982910f, 0.982910f, 0.982910f, 0.982910f, - 0.000122f, 0.000000f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000120f, - 0.000097f, 0.000078f, 0.000062f, 0.000051f, 0.000043f, 0.000072f, 0.000030f, 0.000060f, - 0.000109f, 0.000206f, 0.000216f, 0.000333f, 0.000347f, 0.000395f, 0.000415f, 0.000458f, - 0.000568f, 0.000664f, 0.000709f, 0.000598f, 0.000781f, 0.000628f, 0.001053f, 0.001046f, - 0.001179f, 0.001579f, 0.001649f, 0.002386f, 0.002857f, 0.003727f, 0.004894f, 0.006363f, - 0.008789f, 0.012314f, 0.018616f, 0.029709f, 0.052429f, 0.105652f, 0.244385f, 0.524414f, - 0.782715f, 0.904785f, 0.979492f, 0.980957f, 0.979980f, 0.979980f, 0.980469f, 0.980469f, - 0.000000f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, - 0.000120f, 0.000097f, 0.000079f, 0.000065f, 0.000054f, 0.000045f, 0.000073f, 0.000032f, - 0.000089f, 0.000038f, 0.000134f, 0.000138f, 0.000211f, 0.000333f, 0.000370f, 0.000400f, - 0.000420f, 0.000496f, 0.000566f, 0.000494f, 0.000584f, 0.000714f, 0.000708f, 0.000843f, - 0.001056f, 0.001019f, 0.001327f, 0.001812f, 0.001908f, 0.002798f, 0.003479f, 0.004578f, - 0.006195f, 0.008881f, 0.012901f, 0.020599f, 0.035339f, 0.069214f, 0.159058f, 0.394531f, - 0.709961f, 0.882812f, 0.977051f, 0.978027f, 0.977539f, 0.976562f, 0.977051f, 0.977539f, - 0.000000f, 0.000121f, 0.000120f, 0.000121f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, - 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, - 0.000119f, 0.000120f, 0.000102f, 0.000084f, 0.000071f, 0.000059f, 0.000048f, 0.000041f, - 0.000035f, 0.000062f, 0.000026f, 0.000098f, 0.000103f, 0.000136f, 0.000230f, 0.000327f, - 0.000356f, 0.000338f, 0.000387f, 0.000499f, 0.000577f, 0.000627f, 0.000669f, 0.000611f, - 0.000699f, 0.000904f, 0.000893f, 0.001340f, 0.001666f, 0.002068f, 0.002377f, 0.003105f, - 0.004345f, 0.006218f, 0.009178f, 0.013962f, 0.024170f, 0.045441f, 0.101868f, 0.271973f, - 0.612305f, 0.853027f, 0.973145f, 0.974121f, 0.973633f, 0.974121f, 0.973633f, 0.974121f, - 0.000121f, 0.000120f, 0.000119f, 0.000120f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, - 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, - 0.000119f, 0.000119f, 0.000119f, 0.000108f, 0.000091f, 0.000075f, 0.000063f, 0.000053f, - 0.000045f, 0.000039f, 0.000034f, 0.000040f, 0.000090f, 0.000068f, 0.000104f, 0.000127f, - 0.000220f, 0.000302f, 0.000412f, 0.000316f, 0.000444f, 0.000495f, 0.000428f, 0.000510f, - 0.000463f, 0.000614f, 0.000726f, 0.000719f, 0.001164f, 0.001533f, 0.001707f, 0.002079f, - 0.002848f, 0.004189f, 0.006142f, 0.009491f, 0.016113f, 0.029343f, 0.064758f, 0.175415f, - 0.490723f, 0.812012f, 0.968750f, 0.969727f, 0.969238f, 0.969727f, 0.969727f, 0.969727f, - 0.000000f, 0.000117f, 0.000117f, 0.000115f, 0.000118f, 0.000118f, 0.000117f, 0.000117f, - 0.000117f, 0.000117f, 0.000118f, 0.000117f, 0.000117f, 0.000118f, 0.000117f, 0.000117f, - 0.000117f, 0.000117f, 0.000117f, 0.000118f, 0.000117f, 0.000100f, 0.000082f, 0.000070f, - 0.000060f, 0.000051f, 0.000043f, 0.000038f, 0.000033f, 0.000053f, 0.000027f, 0.000089f, - 0.000105f, 0.000137f, 0.000227f, 0.000277f, 0.000293f, 0.000284f, 0.000300f, 0.000420f, - 0.000367f, 0.000473f, 0.000467f, 0.000555f, 0.000625f, 0.000870f, 0.001177f, 0.001563f, - 0.001982f, 0.002714f, 0.004051f, 0.006134f, 0.010384f, 0.018967f, 0.040314f, 0.108887f, - 0.358643f, 0.755859f, 0.962891f, 0.963867f, 0.964355f, 0.963867f, 0.963379f, 0.963379f, - 0.000000f, 0.000000f, 0.000098f, 0.000103f, 0.000111f, 0.000112f, 0.000112f, 0.000114f, - 0.000113f, 0.000115f, 0.000114f, 0.000115f, 0.000115f, 0.000115f, 0.000115f, 0.000115f, - 0.000116f, 0.000116f, 0.000116f, 0.000116f, 0.000116f, 0.000116f, 0.000109f, 0.000094f, - 0.000078f, 0.000067f, 0.000058f, 0.000050f, 0.000043f, 0.000038f, 0.000033f, 0.000054f, - 0.000025f, 0.000078f, 0.000091f, 0.000173f, 0.000203f, 0.000252f, 0.000331f, 0.000277f, - 0.000264f, 0.000407f, 0.000342f, 0.000444f, 0.000470f, 0.000542f, 0.000773f, 0.001081f, - 0.001245f, 0.001682f, 0.002602f, 0.003744f, 0.006248f, 0.011566f, 0.025040f, 0.065491f, - 0.236938f, 0.678223f, 0.956055f, 0.956543f, 0.956543f, 0.956543f, 0.957031f, 0.957031f, - 0.000000f, 0.000000f, 0.000021f, 0.000080f, 0.000072f, 0.000089f, 0.000100f, 0.000099f, - 0.000105f, 0.000107f, 0.000107f, 0.000110f, 0.000109f, 0.000110f, 0.000111f, 0.000111f, - 0.000112f, 0.000112f, 0.000112f, 0.000113f, 0.000113f, 0.000113f, 0.000113f, 0.000113f, - 0.000105f, 0.000090f, 0.000078f, 0.000067f, 0.000057f, 0.000050f, 0.000043f, 0.000038f, - 0.000033f, 0.000029f, 0.000025f, 0.000055f, 0.000091f, 0.000130f, 0.000225f, 0.000275f, - 0.000254f, 0.000290f, 0.000259f, 0.000378f, 0.000333f, 0.000362f, 0.000458f, 0.000587f, - 0.000876f, 0.001062f, 0.001382f, 0.002398f, 0.003763f, 0.006603f, 0.014496f, 0.038300f, - 0.143677f, 0.573730f, 0.946777f, 0.947266f, 0.947266f, 0.947266f, 0.948242f, 0.947266f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000014f, 0.000036f, 0.000072f, - 0.000082f, 0.000080f, 0.000094f, 0.000096f, 0.000099f, 0.000098f, 0.000103f, 0.000103f, - 0.000103f, 0.000106f, 0.000105f, 0.000107f, 0.000107f, 0.000108f, 0.000108f, 0.000109f, - 0.000109f, 0.000109f, 0.000105f, 0.000090f, 0.000078f, 0.000067f, 0.000059f, 0.000051f, - 0.000045f, 0.000039f, 0.000034f, 0.000030f, 0.000026f, 0.000045f, 0.000086f, 0.000108f, - 0.000143f, 0.000212f, 0.000227f, 0.000204f, 0.000231f, 0.000263f, 0.000315f, 0.000354f, - 0.000481f, 0.000702f, 0.000888f, 0.001257f, 0.002018f, 0.003738f, 0.007675f, 0.021317f, - 0.080933f, 0.444336f, 0.934082f, 0.935059f, 0.935059f, 0.935059f, 0.935059f, 0.935059f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000024f, 0.000038f, 0.000059f, 0.000063f, 0.000076f, 0.000080f, 0.000085f, - 0.000089f, 0.000091f, 0.000092f, 0.000095f, 0.000097f, 0.000099f, 0.000098f, 0.000101f, - 0.000101f, 0.000102f, 0.000103f, 0.000104f, 0.000104f, 0.000091f, 0.000080f, 0.000069f, - 0.000062f, 0.000053f, 0.000046f, 0.000041f, 0.000035f, 0.000032f, 0.000027f, 0.000039f, - 0.000052f, 0.000103f, 0.000139f, 0.000178f, 0.000190f, 0.000178f, 0.000185f, 0.000247f, - 0.000274f, 0.000368f, 0.000528f, 0.000637f, 0.001027f, 0.001937f, 0.003853f, 0.010445f, - 0.041718f, 0.304199f, 0.917480f, 0.917480f, 0.917969f, 0.917480f, 0.918457f, 0.917969f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000023f, 0.000037f, - 0.000048f, 0.000048f, 0.000063f, 0.000063f, 0.000074f, 0.000077f, 0.000080f, 0.000083f, - 0.000086f, 0.000088f, 0.000090f, 0.000091f, 0.000092f, 0.000094f, 0.000095f, 0.000096f, - 0.000084f, 0.000073f, 0.000064f, 0.000057f, 0.000049f, 0.000043f, 0.000037f, 0.000033f, - 0.000029f, 0.000025f, 0.000060f, 0.000061f, 0.000087f, 0.000118f, 0.000156f, 0.000131f, - 0.000175f, 0.000226f, 0.000230f, 0.000373f, 0.000507f, 0.000992f, 0.001814f, 0.004639f, - 0.018799f, 0.176758f, 0.894043f, 0.894531f, 0.895508f, 0.895020f, 0.895020f, 0.895996f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000019f, 0.000028f, 0.000034f, 0.000043f, - 0.000052f, 0.000057f, 0.000062f, 0.000067f, 0.000070f, 0.000074f, 0.000075f, 0.000079f, - 0.000081f, 0.000083f, 0.000085f, 0.000076f, 0.000068f, 0.000059f, 0.000051f, 0.000046f, - 0.000040f, 0.000035f, 0.000030f, 0.000026f, 0.000028f, 0.000038f, 0.000072f, 0.000100f, - 0.000120f, 0.000107f, 0.000152f, 0.000156f, 0.000254f, 0.000436f, 0.000722f, 0.001875f, - 0.007088f, 0.083069f, 0.863281f, 0.862305f, 0.863281f, 0.862305f, 0.863281f, 0.862793f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000005f, 0.000015f, 0.000022f, 0.000030f, 0.000037f, 0.000042f, - 0.000048f, 0.000053f, 0.000058f, 0.000060f, 0.000064f, 0.000067f, 0.000069f, 0.000061f, - 0.000053f, 0.000047f, 0.000041f, 0.000036f, 0.000031f, 0.000027f, 0.000023f, 0.000020f, - 0.000036f, 0.000063f, 0.000082f, 0.000081f, 0.000104f, 0.000149f, 0.000263f, 0.000616f, - 0.002337f, 0.028168f, 0.816406f, 0.816895f, 0.816895f, 0.816895f, 0.817383f, 0.816895f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000003f, 0.000011f, 0.000019f, 0.000026f, 0.000031f, 0.000036f, - 0.000041f, 0.000045f, 0.000050f, 0.000047f, 0.000041f, 0.000036f, 0.000031f, 0.000027f, - 0.000023f, 0.000019f, 0.000028f, 0.000029f, 0.000053f, 0.000052f, 0.000072f, 0.000165f, - 0.000511f, 0.006050f, 0.751465f, 0.752441f, 0.752930f, 0.752441f, 0.752441f, 0.752930f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000004f, 0.000011f, 0.000017f, 0.000021f, 0.000027f, - 0.000028f, 0.000024f, 0.000020f, 0.000017f, 0.000013f, 0.000020f, 0.000021f, 0.000029f, - 0.000057f, 0.000588f, 0.665039f, 0.664551f, 0.665527f, 0.665039f, 0.665039f, 0.665039f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000003f, 0.000009f, 0.000006f, - 0.000004f, 0.000007f, 0.557129f, 0.558105f, 0.557617f, 0.557617f, 0.558594f, 0.558105f, - }, - { - 0.163818f, 0.558105f, 0.755859f, 0.841797f, 0.886230f, 0.912109f, 0.929199f, 0.941406f, - 0.950195f, 0.957031f, 0.961914f, 0.966309f, 0.970215f, 0.972656f, 0.975586f, 0.978027f, - 0.979492f, 0.981445f, 0.982910f, 0.984375f, 0.985840f, 0.986328f, 0.987305f, 0.988770f, - 0.989258f, 0.989746f, 0.990234f, 0.991211f, 0.991699f, 0.992188f, 0.993164f, 0.993652f, - 0.993652f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, 0.995117f, 0.995605f, 0.996094f, - 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, - 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.027023f, 0.138184f, 0.353760f, 0.583984f, 0.735352f, 0.819336f, 0.868652f, 0.898926f, - 0.918945f, 0.933594f, 0.943848f, 0.952148f, 0.958984f, 0.963867f, 0.967773f, 0.971680f, - 0.974121f, 0.976562f, 0.978516f, 0.980469f, 0.982422f, 0.983398f, 0.984863f, 0.986328f, - 0.986816f, 0.988281f, 0.989258f, 0.989746f, 0.990723f, 0.990723f, 0.991699f, 0.992676f, - 0.993164f, 0.993164f, 0.993652f, 0.994141f, 0.994141f, 0.995117f, 0.995117f, 0.995605f, - 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, - 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.009819f, 0.044250f, 0.113525f, 0.244995f, 0.430420f, 0.608887f, 0.733887f, 0.810547f, - 0.860352f, 0.892578f, 0.913086f, 0.929688f, 0.940918f, 0.949219f, 0.956055f, 0.961426f, - 0.966309f, 0.970215f, 0.972656f, 0.975586f, 0.977539f, 0.979980f, 0.980957f, 0.983398f, - 0.983887f, 0.985352f, 0.986328f, 0.987793f, 0.988281f, 0.989746f, 0.989746f, 0.991211f, - 0.991699f, 0.992188f, 0.992676f, 0.993164f, 0.993652f, 0.993652f, 0.994141f, 0.995117f, - 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, - 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.004848f, 0.020447f, 0.046814f, 0.096313f, 0.183228f, 0.319092f, 0.484375f, 0.631836f, - 0.739258f, 0.810547f, 0.857422f, 0.888672f, 0.910645f, 0.925781f, 0.938965f, 0.947754f, - 0.954590f, 0.960449f, 0.964355f, 0.968750f, 0.971191f, 0.974609f, 0.977051f, 0.979004f, - 0.980957f, 0.982422f, 0.983887f, 0.985840f, 0.986816f, 0.987793f, 0.988770f, 0.989258f, - 0.990234f, 0.990723f, 0.991211f, 0.991699f, 0.992676f, 0.992676f, 0.993652f, 0.993652f, - 0.994141f, 0.994629f, 0.995117f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, - 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.003096f, 0.011017f, 0.024399f, 0.046600f, 0.083191f, 0.145386f, 0.243774f, 0.379395f, - 0.529297f, 0.656738f, 0.750977f, 0.813965f, 0.857910f, 0.887695f, 0.909668f, 0.925293f, - 0.937500f, 0.946289f, 0.953613f, 0.959473f, 0.964355f, 0.968262f, 0.971191f, 0.974121f, - 0.976562f, 0.979004f, 0.980957f, 0.982910f, 0.984375f, 0.985840f, 0.986328f, 0.987793f, - 0.988281f, 0.989258f, 0.989746f, 0.991211f, 0.991699f, 0.991699f, 0.992676f, 0.993164f, - 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, - 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.001808f, 0.006992f, 0.014923f, 0.026413f, 0.044403f, 0.073120f, 0.119446f, 0.193115f, - 0.300537f, 0.433594f, 0.568848f, 0.680664f, 0.763184f, 0.821289f, 0.860840f, 0.890137f, - 0.909668f, 0.925293f, 0.937500f, 0.945801f, 0.953613f, 0.959473f, 0.963867f, 0.968262f, - 0.971680f, 0.974609f, 0.977051f, 0.979004f, 0.980957f, 0.982422f, 0.983887f, 0.984863f, - 0.986816f, 0.987305f, 0.987793f, 0.989746f, 0.989746f, 0.991211f, 0.991699f, 0.992188f, - 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.994629f, 0.995605f, 0.996094f, 0.996094f, - 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.001668f, 0.005253f, 0.010010f, 0.016602f, 0.026459f, 0.042023f, 0.065369f, 0.101868f, - 0.158081f, 0.241455f, 0.354248f, 0.483887f, 0.606934f, 0.706055f, 0.777832f, 0.830566f, - 0.867188f, 0.893066f, 0.912109f, 0.926270f, 0.938477f, 0.946289f, 0.953125f, 0.959473f, - 0.964355f, 0.968750f, 0.971680f, 0.975098f, 0.977051f, 0.979492f, 0.980957f, 0.982910f, - 0.984375f, 0.985840f, 0.986328f, 0.987305f, 0.988770f, 0.989746f, 0.990234f, 0.991211f, - 0.992188f, 0.993164f, 0.993164f, 0.994141f, 0.994629f, 0.994629f, 0.995117f, 0.995605f, - 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, - 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999023f, - 0.001086f, 0.003477f, 0.006756f, 0.011604f, 0.018066f, 0.027222f, 0.039978f, 0.059448f, - 0.088257f, 0.132690f, 0.198120f, 0.291504f, 0.408447f, 0.531250f, 0.641602f, 0.728516f, - 0.793457f, 0.839844f, 0.873047f, 0.896973f, 0.915527f, 0.929199f, 0.939941f, 0.948730f, - 0.955566f, 0.960938f, 0.965332f, 0.969238f, 0.972168f, 0.975098f, 0.977539f, 0.979492f, - 0.981445f, 0.983398f, 0.984375f, 0.985840f, 0.986816f, 0.988281f, 0.989258f, 0.989746f, - 0.990723f, 0.991699f, 0.992188f, 0.993164f, 0.993652f, 0.994141f, 0.994629f, 0.994629f, - 0.995605f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997559f, 0.997559f, - 0.997559f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000982f, 0.002764f, 0.004925f, 0.008194f, 0.012703f, 0.018417f, 0.026154f, 0.037964f, - 0.053894f, 0.078552f, 0.113770f, 0.166626f, 0.242310f, 0.343262f, 0.460449f, 0.576660f, - 0.675293f, 0.753418f, 0.809570f, 0.851074f, 0.879883f, 0.902344f, 0.919434f, 0.931152f, - 0.941895f, 0.950195f, 0.956055f, 0.960938f, 0.965820f, 0.969727f, 0.973145f, 0.976074f, - 0.978027f, 0.980469f, 0.981934f, 0.983887f, 0.985352f, 0.986328f, 0.987793f, 0.988770f, - 0.989746f, 0.990234f, 0.991211f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.994141f, - 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997559f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000723f, 0.002268f, 0.003639f, 0.006371f, 0.009392f, 0.013046f, 0.018570f, 0.026016f, - 0.035919f, 0.049957f, 0.070618f, 0.099609f, 0.142212f, 0.204590f, 0.290039f, 0.396973f, - 0.512207f, 0.619141f, 0.707520f, 0.775391f, 0.825195f, 0.860352f, 0.887207f, 0.907715f, - 0.923340f, 0.935547f, 0.944824f, 0.951660f, 0.958496f, 0.963379f, 0.967773f, 0.971191f, - 0.974121f, 0.977051f, 0.979492f, 0.980957f, 0.982910f, 0.984375f, 0.985352f, 0.987305f, - 0.988281f, 0.989258f, 0.989746f, 0.990723f, 0.991699f, 0.992188f, 0.993164f, 0.993164f, - 0.994141f, 0.994629f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, - 0.997559f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000364f, 0.001690f, 0.003056f, 0.004982f, 0.007217f, 0.010124f, 0.013931f, 0.018738f, - 0.025177f, 0.034332f, 0.045990f, 0.063599f, 0.088501f, 0.124146f, 0.175781f, 0.248047f, - 0.341797f, 0.451416f, 0.562012f, 0.659668f, 0.738281f, 0.797852f, 0.841797f, 0.872559f, - 0.896484f, 0.914062f, 0.928711f, 0.938477f, 0.947266f, 0.954590f, 0.959473f, 0.964844f, - 0.969238f, 0.972168f, 0.975098f, 0.977539f, 0.979980f, 0.981934f, 0.983398f, 0.985352f, - 0.986816f, 0.987793f, 0.988770f, 0.989746f, 0.990723f, 0.991211f, 0.992188f, 0.993164f, - 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, - 0.997070f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000365f, 0.001221f, 0.002531f, 0.003979f, 0.005829f, 0.007874f, 0.010475f, 0.013962f, - 0.018402f, 0.024368f, 0.032257f, 0.042847f, 0.057983f, 0.079346f, 0.109375f, 0.153198f, - 0.214233f, 0.295898f, 0.397705f, 0.506836f, 0.609863f, 0.698730f, 0.767578f, 0.817871f, - 0.854980f, 0.883301f, 0.903809f, 0.920410f, 0.933105f, 0.942871f, 0.950195f, 0.957031f, - 0.962402f, 0.966797f, 0.970703f, 0.973633f, 0.976562f, 0.979004f, 0.981445f, 0.982910f, - 0.984375f, 0.985840f, 0.986816f, 0.988281f, 0.989746f, 0.989746f, 0.991211f, 0.992188f, - 0.992676f, 0.993164f, 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, - 0.996582f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000343f, 0.001357f, 0.002039f, 0.003130f, 0.004398f, 0.006432f, 0.008141f, 0.010925f, - 0.014008f, 0.018326f, 0.023331f, 0.030655f, 0.040558f, 0.053680f, 0.071960f, 0.098206f, - 0.134644f, 0.187012f, 0.258057f, 0.349854f, 0.455566f, 0.562012f, 0.656738f, 0.734863f, - 0.792969f, 0.836914f, 0.868652f, 0.894043f, 0.912598f, 0.926758f, 0.937988f, 0.947266f, - 0.954590f, 0.960449f, 0.964355f, 0.968750f, 0.972656f, 0.975586f, 0.978027f, 0.980469f, - 0.981934f, 0.983398f, 0.985840f, 0.986816f, 0.988281f, 0.989258f, 0.990723f, 0.990723f, - 0.991699f, 0.992676f, 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, - 0.996582f, 0.996582f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000244f, 0.001185f, 0.001561f, 0.002504f, 0.003990f, 0.005272f, 0.006573f, 0.008606f, - 0.010933f, 0.013878f, 0.017715f, 0.022415f, 0.029068f, 0.038086f, 0.049774f, 0.066162f, - 0.088257f, 0.120361f, 0.164917f, 0.227173f, 0.308838f, 0.407959f, 0.515137f, 0.615723f, - 0.700684f, 0.767090f, 0.817383f, 0.854492f, 0.882812f, 0.904297f, 0.920898f, 0.932617f, - 0.943359f, 0.951172f, 0.957520f, 0.962891f, 0.967773f, 0.971191f, 0.974121f, 0.977539f, - 0.979492f, 0.981445f, 0.983887f, 0.985352f, 0.986816f, 0.988281f, 0.988770f, 0.989258f, - 0.990723f, 0.991699f, 0.992188f, 0.993164f, 0.993652f, 0.994141f, 0.995117f, 0.995605f, - 0.995605f, 0.996582f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000243f, 0.000847f, 0.001555f, 0.002224f, 0.003141f, 0.004093f, 0.005264f, 0.006817f, - 0.008850f, 0.010948f, 0.014053f, 0.017456f, 0.022339f, 0.028351f, 0.036011f, 0.046326f, - 0.060791f, 0.080444f, 0.107788f, 0.146851f, 0.201660f, 0.274658f, 0.366699f, 0.470215f, - 0.574707f, 0.666016f, 0.740234f, 0.797363f, 0.839355f, 0.871094f, 0.895508f, 0.913574f, - 0.927734f, 0.938965f, 0.947754f, 0.955566f, 0.960449f, 0.965332f, 0.969727f, 0.973145f, - 0.976074f, 0.979004f, 0.981445f, 0.982910f, 0.984863f, 0.986328f, 0.987305f, 0.988770f, - 0.989258f, 0.990723f, 0.991699f, 0.992188f, 0.993164f, 0.993652f, 0.994141f, 0.994629f, - 0.995117f, 0.996094f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000244f, 0.000767f, 0.001042f, 0.001934f, 0.002502f, 0.003588f, 0.004292f, 0.005558f, - 0.006824f, 0.008667f, 0.010872f, 0.013802f, 0.017426f, 0.021637f, 0.027176f, 0.033936f, - 0.043304f, 0.056549f, 0.073914f, 0.098083f, 0.132446f, 0.180664f, 0.245239f, 0.330078f, - 0.429199f, 0.533203f, 0.631348f, 0.711914f, 0.775879f, 0.823242f, 0.860352f, 0.886230f, - 0.907227f, 0.923340f, 0.935059f, 0.944824f, 0.952148f, 0.958984f, 0.964844f, 0.968750f, - 0.972168f, 0.975586f, 0.978516f, 0.980957f, 0.982422f, 0.983887f, 0.985840f, 0.987305f, - 0.988770f, 0.989746f, 0.990234f, 0.992188f, 0.992676f, 0.992676f, 0.994141f, 0.994141f, - 0.995117f, 0.995605f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000485f, 0.001062f, 0.001658f, 0.002398f, 0.002998f, 0.003805f, 0.004723f, - 0.006004f, 0.007084f, 0.009102f, 0.011093f, 0.013489f, 0.016876f, 0.020813f, 0.025803f, - 0.032257f, 0.040924f, 0.052673f, 0.068298f, 0.090149f, 0.120239f, 0.162598f, 0.221313f, - 0.298096f, 0.392822f, 0.496582f, 0.597656f, 0.684082f, 0.754883f, 0.807617f, 0.848145f, - 0.877930f, 0.900391f, 0.917969f, 0.931641f, 0.941406f, 0.950684f, 0.957031f, 0.962402f, - 0.967773f, 0.971680f, 0.974609f, 0.978027f, 0.980469f, 0.982422f, 0.984375f, 0.985840f, - 0.987305f, 0.988281f, 0.989746f, 0.990723f, 0.991699f, 0.992188f, 0.993164f, 0.993652f, - 0.994141f, 0.995117f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000244f, 0.000477f, 0.000852f, 0.001439f, 0.002045f, 0.002424f, 0.003101f, 0.004093f, - 0.004887f, 0.005989f, 0.007751f, 0.008606f, 0.011002f, 0.013420f, 0.016251f, 0.020035f, - 0.024628f, 0.030579f, 0.039093f, 0.049255f, 0.063599f, 0.083191f, 0.109924f, 0.148071f, - 0.200928f, 0.270996f, 0.359863f, 0.461670f, 0.564453f, 0.656738f, 0.732910f, 0.791992f, - 0.836426f, 0.869629f, 0.894531f, 0.913086f, 0.928223f, 0.939453f, 0.949219f, 0.956055f, - 0.961914f, 0.966797f, 0.970703f, 0.975098f, 0.977051f, 0.979492f, 0.982422f, 0.983887f, - 0.985352f, 0.987305f, 0.988770f, 0.989746f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, - 0.993652f, 0.994629f, 0.998047f, 0.998535f, 0.998535f, 0.998047f, 0.998047f, 0.998535f, - 0.000242f, 0.000650f, 0.000847f, 0.001138f, 0.001621f, 0.002239f, 0.002527f, 0.003325f, - 0.004227f, 0.005165f, 0.006462f, 0.007389f, 0.008904f, 0.011024f, 0.013130f, 0.015915f, - 0.019272f, 0.023819f, 0.029205f, 0.036652f, 0.046417f, 0.059418f, 0.077209f, 0.101562f, - 0.136230f, 0.183350f, 0.248047f, 0.331055f, 0.429688f, 0.533203f, 0.630859f, 0.711426f, - 0.776367f, 0.824219f, 0.861328f, 0.887695f, 0.908691f, 0.924805f, 0.937500f, 0.946777f, - 0.954102f, 0.960938f, 0.966309f, 0.970215f, 0.974121f, 0.977539f, 0.979492f, 0.981934f, - 0.983887f, 0.985840f, 0.987305f, 0.989258f, 0.989746f, 0.990723f, 0.991211f, 0.992676f, - 0.993164f, 0.994141f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000089f, 0.000243f, 0.000827f, 0.000964f, 0.001418f, 0.001579f, 0.002296f, 0.002914f, - 0.003632f, 0.004280f, 0.005344f, 0.006130f, 0.007545f, 0.008949f, 0.010498f, 0.012733f, - 0.015686f, 0.018646f, 0.023010f, 0.028229f, 0.034851f, 0.044098f, 0.056122f, 0.072388f, - 0.094788f, 0.125610f, 0.168945f, 0.228271f, 0.306396f, 0.401123f, 0.504883f, 0.604492f, - 0.691895f, 0.760742f, 0.813477f, 0.853027f, 0.881836f, 0.904297f, 0.921387f, 0.934570f, - 0.944824f, 0.953125f, 0.959961f, 0.964844f, 0.969727f, 0.973633f, 0.976562f, 0.979492f, - 0.981934f, 0.983887f, 0.986328f, 0.987305f, 0.988281f, 0.989258f, 0.991211f, 0.992188f, - 0.992676f, 0.993652f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000069f, 0.000461f, 0.000609f, 0.000933f, 0.001088f, 0.001488f, 0.001900f, 0.002378f, - 0.003101f, 0.003687f, 0.004547f, 0.005276f, 0.006233f, 0.007282f, 0.008820f, 0.010239f, - 0.012581f, 0.015312f, 0.018341f, 0.022095f, 0.027344f, 0.034027f, 0.041687f, 0.053467f, - 0.067810f, 0.088440f, 0.117126f, 0.156616f, 0.211426f, 0.284180f, 0.375977f, 0.478760f, - 0.581543f, 0.672363f, 0.746094f, 0.802734f, 0.845703f, 0.877441f, 0.900879f, 0.918457f, - 0.933105f, 0.943848f, 0.951660f, 0.959473f, 0.964355f, 0.968750f, 0.974121f, 0.977051f, - 0.979492f, 0.982422f, 0.984375f, 0.985840f, 0.987305f, 0.988770f, 0.990234f, 0.991211f, - 0.992188f, 0.993164f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000244f, 0.000348f, 0.000606f, 0.000737f, 0.001079f, 0.001458f, 0.001783f, 0.002192f, - 0.002924f, 0.003231f, 0.003862f, 0.004551f, 0.005169f, 0.006367f, 0.007381f, 0.008682f, - 0.010590f, 0.012199f, 0.014900f, 0.017761f, 0.021530f, 0.026108f, 0.032349f, 0.039642f, - 0.050446f, 0.064392f, 0.083313f, 0.109436f, 0.145996f, 0.197021f, 0.266357f, 0.354248f, - 0.455811f, 0.560059f, 0.654785f, 0.732910f, 0.793457f, 0.837891f, 0.873047f, 0.897461f, - 0.917480f, 0.931641f, 0.941895f, 0.951172f, 0.958984f, 0.964844f, 0.969727f, 0.973633f, - 0.977051f, 0.979980f, 0.981934f, 0.984375f, 0.985840f, 0.988281f, 0.989258f, 0.990234f, - 0.991211f, 0.992676f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000244f, 0.000520f, 0.000592f, 0.000720f, 0.000812f, 0.001174f, 0.001500f, 0.001884f, - 0.002178f, 0.002831f, 0.003321f, 0.003885f, 0.004471f, 0.005436f, 0.006275f, 0.007584f, - 0.008675f, 0.010521f, 0.012238f, 0.014557f, 0.017197f, 0.020874f, 0.025467f, 0.030960f, - 0.038208f, 0.047821f, 0.061249f, 0.078552f, 0.103149f, 0.136841f, 0.184937f, 0.249878f, - 0.334473f, 0.435059f, 0.539551f, 0.638184f, 0.720215f, 0.784668f, 0.832031f, 0.868164f, - 0.894531f, 0.914062f, 0.929688f, 0.942383f, 0.950684f, 0.958984f, 0.964844f, 0.970215f, - 0.974121f, 0.977539f, 0.979980f, 0.982422f, 0.984863f, 0.985840f, 0.988281f, 0.989258f, - 0.990723f, 0.992188f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, - 0.000000f, 0.000243f, 0.000351f, 0.000603f, 0.000708f, 0.001079f, 0.001493f, 0.001752f, - 0.001936f, 0.002171f, 0.002911f, 0.003382f, 0.003906f, 0.004578f, 0.005222f, 0.006161f, - 0.007362f, 0.008850f, 0.010010f, 0.011971f, 0.014145f, 0.016983f, 0.020477f, 0.024582f, - 0.029739f, 0.036804f, 0.045837f, 0.057648f, 0.074829f, 0.097534f, 0.130127f, 0.174438f, - 0.236572f, 0.318604f, 0.416992f, 0.523926f, 0.624023f, 0.709961f, 0.777344f, 0.827148f, - 0.865234f, 0.893066f, 0.914062f, 0.929688f, 0.941406f, 0.951660f, 0.958496f, 0.965820f, - 0.969238f, 0.974609f, 0.977539f, 0.980469f, 0.983398f, 0.985352f, 0.986816f, 0.988281f, - 0.989746f, 0.990723f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000243f, 0.000244f, 0.000456f, 0.000592f, 0.000602f, 0.001025f, 0.001282f, 0.001656f, - 0.001856f, 0.002073f, 0.002535f, 0.002768f, 0.003487f, 0.003822f, 0.004574f, 0.005589f, - 0.006519f, 0.007336f, 0.008453f, 0.009911f, 0.011581f, 0.013985f, 0.016373f, 0.019638f, - 0.023819f, 0.028473f, 0.035339f, 0.043945f, 0.055939f, 0.071350f, 0.093140f, 0.123474f, - 0.165771f, 0.225342f, 0.304199f, 0.402344f, 0.509277f, 0.612305f, 0.702148f, 0.771973f, - 0.824219f, 0.863281f, 0.891113f, 0.913086f, 0.930176f, 0.942383f, 0.951660f, 0.959473f, - 0.965820f, 0.970215f, 0.974609f, 0.977539f, 0.980957f, 0.983887f, 0.985352f, 0.987305f, - 0.988770f, 0.990723f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000000f, 0.000243f, 0.000276f, 0.000557f, 0.000594f, 0.000849f, 0.000845f, 0.001282f, - 0.001520f, 0.001774f, 0.002119f, 0.002499f, 0.002840f, 0.003252f, 0.004005f, 0.004555f, - 0.005245f, 0.006168f, 0.007233f, 0.008301f, 0.009911f, 0.011330f, 0.013748f, 0.015945f, - 0.019089f, 0.023071f, 0.027786f, 0.034058f, 0.042542f, 0.053619f, 0.068237f, 0.089539f, - 0.117798f, 0.158325f, 0.215698f, 0.293213f, 0.389893f, 0.498291f, 0.603027f, 0.694824f, - 0.767090f, 0.821777f, 0.862305f, 0.891113f, 0.914062f, 0.930176f, 0.942383f, 0.952148f, - 0.959473f, 0.965820f, 0.971680f, 0.975098f, 0.978516f, 0.981445f, 0.983887f, 0.985840f, - 0.988281f, 0.989258f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.996094f, 0.996582f, - 0.000240f, 0.000240f, 0.000242f, 0.000365f, 0.000678f, 0.000779f, 0.000957f, 0.001003f, - 0.001390f, 0.001656f, 0.001828f, 0.002274f, 0.002455f, 0.003210f, 0.003704f, 0.004097f, - 0.004616f, 0.005409f, 0.006180f, 0.007092f, 0.008453f, 0.009521f, 0.011154f, 0.013397f, - 0.015656f, 0.018509f, 0.022247f, 0.026810f, 0.032928f, 0.041046f, 0.051727f, 0.065613f, - 0.085205f, 0.113098f, 0.152832f, 0.208496f, 0.284424f, 0.380371f, 0.489258f, 0.596680f, - 0.690918f, 0.764648f, 0.821777f, 0.862305f, 0.892578f, 0.914551f, 0.931152f, 0.943848f, - 0.953613f, 0.960938f, 0.967773f, 0.971680f, 0.976074f, 0.979492f, 0.982422f, 0.984863f, - 0.986816f, 0.988281f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.996094f, - 0.000000f, 0.000242f, 0.000242f, 0.000364f, 0.000465f, 0.000803f, 0.000927f, 0.000956f, - 0.001275f, 0.001335f, 0.001570f, 0.001968f, 0.002184f, 0.002726f, 0.003069f, 0.003294f, - 0.003906f, 0.004662f, 0.005245f, 0.006027f, 0.007191f, 0.008202f, 0.009460f, 0.010735f, - 0.012970f, 0.015404f, 0.018051f, 0.021484f, 0.026321f, 0.032135f, 0.039581f, 0.049805f, - 0.063538f, 0.082458f, 0.109497f, 0.147827f, 0.202393f, 0.277344f, 0.373535f, 0.483887f, - 0.593262f, 0.688477f, 0.764648f, 0.821289f, 0.863281f, 0.894043f, 0.916016f, 0.932129f, - 0.944336f, 0.954590f, 0.962402f, 0.968262f, 0.973633f, 0.977051f, 0.980957f, 0.983398f, - 0.985352f, 0.987793f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, - 0.000000f, 0.000239f, 0.000360f, 0.000362f, 0.000363f, 0.000475f, 0.000767f, 0.000931f, - 0.000951f, 0.001211f, 0.001491f, 0.001634f, 0.002129f, 0.002457f, 0.002678f, 0.002995f, - 0.003393f, 0.003922f, 0.004711f, 0.005135f, 0.005955f, 0.006935f, 0.008072f, 0.009270f, - 0.010841f, 0.012558f, 0.014618f, 0.017502f, 0.020828f, 0.025269f, 0.030884f, 0.038269f, - 0.048218f, 0.061554f, 0.080505f, 0.106567f, 0.144287f, 0.197998f, 0.272705f, 0.369141f, - 0.480469f, 0.591797f, 0.690430f, 0.767090f, 0.824707f, 0.866699f, 0.896484f, 0.918457f, - 0.934570f, 0.946777f, 0.956543f, 0.963379f, 0.969727f, 0.974609f, 0.978027f, 0.981934f, - 0.984375f, 0.986328f, 0.995117f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, - 0.000000f, 0.000208f, 0.000238f, 0.000362f, 0.000363f, 0.000555f, 0.000600f, 0.000888f, - 0.001140f, 0.001140f, 0.001272f, 0.001661f, 0.001811f, 0.002041f, 0.002550f, 0.002636f, - 0.002941f, 0.003492f, 0.004032f, 0.004593f, 0.005062f, 0.005875f, 0.007015f, 0.007965f, - 0.009079f, 0.010300f, 0.012291f, 0.014229f, 0.016937f, 0.020248f, 0.024689f, 0.030151f, - 0.037354f, 0.047028f, 0.060211f, 0.078491f, 0.104431f, 0.141602f, 0.195068f, 0.270264f, - 0.367676f, 0.480957f, 0.594238f, 0.693848f, 0.770996f, 0.828613f, 0.869629f, 0.898438f, - 0.921875f, 0.937012f, 0.949219f, 0.958008f, 0.964844f, 0.971680f, 0.976074f, 0.979980f, - 0.982422f, 0.985840f, 0.994629f, 0.995117f, 0.995605f, 0.995605f, 0.995117f, 0.995117f, - 0.000000f, 0.000000f, 0.000229f, 0.000358f, 0.000479f, 0.000362f, 0.000498f, 0.000634f, - 0.000836f, 0.000927f, 0.001288f, 0.001244f, 0.001605f, 0.001732f, 0.002106f, 0.002478f, - 0.002613f, 0.003183f, 0.003510f, 0.004021f, 0.004528f, 0.005047f, 0.005768f, 0.006859f, - 0.007759f, 0.008865f, 0.009933f, 0.011742f, 0.013741f, 0.016678f, 0.019897f, 0.024017f, - 0.029297f, 0.036469f, 0.045990f, 0.058990f, 0.077026f, 0.102722f, 0.140015f, 0.193604f, - 0.269531f, 0.369141f, 0.485107f, 0.600098f, 0.700195f, 0.777344f, 0.833984f, 0.873535f, - 0.903809f, 0.924316f, 0.940430f, 0.951172f, 0.960938f, 0.968262f, 0.973145f, 0.978027f, - 0.980957f, 0.983887f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.995117f, 0.995117f, - 0.000000f, 0.000000f, 0.000078f, 0.000353f, 0.000354f, 0.000360f, 0.000482f, 0.000573f, - 0.000757f, 0.000923f, 0.001230f, 0.001266f, 0.001485f, 0.001679f, 0.001963f, 0.002161f, - 0.002235f, 0.002739f, 0.003115f, 0.003563f, 0.003933f, 0.004436f, 0.004917f, 0.005623f, - 0.006599f, 0.007469f, 0.008484f, 0.010101f, 0.011665f, 0.013695f, 0.016403f, 0.019531f, - 0.023300f, 0.028870f, 0.035889f, 0.045135f, 0.058014f, 0.075928f, 0.101746f, 0.139160f, - 0.193848f, 0.271729f, 0.374023f, 0.492920f, 0.609863f, 0.709473f, 0.786133f, 0.842285f, - 0.880859f, 0.908691f, 0.928711f, 0.943848f, 0.954102f, 0.963867f, 0.969727f, 0.975098f, - 0.979004f, 0.982422f, 0.994141f, 0.994629f, 0.994141f, 0.994141f, 0.994141f, 0.994629f, - 0.000000f, 0.000000f, 0.000000f, 0.000330f, 0.000336f, 0.000352f, 0.000478f, 0.000481f, - 0.000676f, 0.000822f, 0.001072f, 0.001228f, 0.001283f, 0.001417f, 0.001621f, 0.001938f, - 0.001953f, 0.002377f, 0.002737f, 0.002914f, 0.003624f, 0.003721f, 0.004555f, 0.004845f, - 0.005531f, 0.006325f, 0.007244f, 0.008255f, 0.009911f, 0.011467f, 0.013496f, 0.016068f, - 0.018951f, 0.022888f, 0.028183f, 0.035126f, 0.044617f, 0.057220f, 0.075134f, 0.101501f, - 0.139526f, 0.195679f, 0.276123f, 0.381592f, 0.503418f, 0.622070f, 0.721680f, 0.796387f, - 0.850098f, 0.887207f, 0.914551f, 0.933594f, 0.947266f, 0.957520f, 0.966797f, 0.972656f, - 0.977539f, 0.980957f, 0.993164f, 0.994141f, 0.994141f, 0.994141f, 0.994141f, 0.994141f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000243f, 0.000466f, 0.000474f, 0.000475f, - 0.000600f, 0.000740f, 0.000796f, 0.001130f, 0.001333f, 0.001339f, 0.001440f, 0.001575f, - 0.001961f, 0.002031f, 0.002388f, 0.002563f, 0.003174f, 0.003345f, 0.003555f, 0.004143f, - 0.004681f, 0.005333f, 0.006191f, 0.007111f, 0.008278f, 0.009666f, 0.011177f, 0.013451f, - 0.015511f, 0.018707f, 0.022629f, 0.027847f, 0.034515f, 0.043976f, 0.056671f, 0.075012f, - 0.101685f, 0.140869f, 0.199341f, 0.282959f, 0.393311f, 0.519043f, 0.639160f, 0.736328f, - 0.809082f, 0.860352f, 0.896484f, 0.920898f, 0.939453f, 0.951660f, 0.961914f, 0.969238f, - 0.975098f, 0.979492f, 0.993164f, 0.993652f, 0.994141f, 0.993652f, 0.993652f, 0.993652f, - 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000120f, 0.000367f, 0.000448f, 0.000589f, - 0.000595f, 0.000719f, 0.000707f, 0.000809f, 0.000966f, 0.001217f, 0.001369f, 0.001405f, - 0.001579f, 0.001786f, 0.002100f, 0.002260f, 0.002600f, 0.002762f, 0.003023f, 0.003531f, - 0.004219f, 0.004810f, 0.005409f, 0.006092f, 0.007053f, 0.008064f, 0.009163f, 0.010941f, - 0.012733f, 0.015251f, 0.018280f, 0.022202f, 0.027573f, 0.034271f, 0.043732f, 0.056458f, - 0.075134f, 0.102661f, 0.143433f, 0.205078f, 0.293701f, 0.409668f, 0.538574f, 0.658203f, - 0.753418f, 0.823242f, 0.870605f, 0.905273f, 0.927734f, 0.943848f, 0.956055f, 0.964844f, - 0.972168f, 0.977539f, 0.992188f, 0.992676f, 0.993164f, 0.993652f, 0.993164f, 0.992676f, - 0.000000f, 0.000000f, 0.000000f, 0.000111f, 0.000224f, 0.000231f, 0.000314f, 0.000562f, - 0.000589f, 0.000699f, 0.000717f, 0.000776f, 0.000926f, 0.000968f, 0.001242f, 0.001360f, - 0.001487f, 0.001564f, 0.001713f, 0.002073f, 0.002169f, 0.002380f, 0.002941f, 0.003229f, - 0.003534f, 0.003914f, 0.004509f, 0.005127f, 0.005939f, 0.006596f, 0.007812f, 0.009354f, - 0.010559f, 0.012581f, 0.015007f, 0.018021f, 0.022079f, 0.027191f, 0.034119f, 0.043427f, - 0.057190f, 0.075623f, 0.104492f, 0.147949f, 0.213135f, 0.308105f, 0.430664f, 0.562500f, - 0.681641f, 0.772949f, 0.839355f, 0.884277f, 0.913574f, 0.934570f, 0.950195f, 0.961426f, - 0.969238f, 0.975098f, 0.991211f, 0.992676f, 0.992676f, 0.992676f, 0.992676f, 0.992188f, - 0.000000f, 0.000000f, 0.000000f, 0.000084f, 0.000117f, 0.000119f, 0.000367f, 0.000473f, - 0.000555f, 0.000576f, 0.000674f, 0.000713f, 0.000816f, 0.000913f, 0.001049f, 0.001168f, - 0.001263f, 0.001473f, 0.001580f, 0.001781f, 0.002005f, 0.002123f, 0.002316f, 0.002674f, - 0.003094f, 0.003475f, 0.003967f, 0.004318f, 0.004833f, 0.005798f, 0.006699f, 0.007801f, - 0.008888f, 0.010429f, 0.012268f, 0.014824f, 0.017792f, 0.021790f, 0.026978f, 0.033844f, - 0.043518f, 0.057068f, 0.077148f, 0.107605f, 0.154053f, 0.224609f, 0.326904f, 0.456543f, - 0.591797f, 0.708984f, 0.795410f, 0.855957f, 0.895508f, 0.923340f, 0.942383f, 0.955566f, - 0.965332f, 0.973145f, 0.991211f, 0.991699f, 0.992188f, 0.992188f, 0.992188f, 0.991699f, - 0.000000f, 0.000000f, 0.000000f, 0.000092f, 0.000070f, 0.000236f, 0.000119f, 0.000376f, - 0.000433f, 0.000561f, 0.000688f, 0.000586f, 0.000742f, 0.000842f, 0.000881f, 0.000937f, - 0.001141f, 0.001300f, 0.001434f, 0.001464f, 0.001598f, 0.001829f, 0.002062f, 0.002338f, - 0.002583f, 0.003036f, 0.003460f, 0.003704f, 0.004383f, 0.004986f, 0.005615f, 0.006439f, - 0.007267f, 0.008797f, 0.010330f, 0.012146f, 0.014473f, 0.017532f, 0.021622f, 0.026535f, - 0.033539f, 0.043579f, 0.058044f, 0.079041f, 0.111572f, 0.162109f, 0.239746f, 0.350830f, - 0.488770f, 0.625000f, 0.737305f, 0.817871f, 0.871582f, 0.908203f, 0.932129f, 0.949219f, - 0.961914f, 0.970215f, 0.990234f, 0.991211f, 0.991211f, 0.991211f, 0.991211f, 0.991211f, - 0.000000f, 0.000000f, 0.000000f, 0.000080f, 0.000100f, 0.000115f, 0.000335f, 0.000350f, - 0.000355f, 0.000473f, 0.000633f, 0.000678f, 0.000695f, 0.000694f, 0.000812f, 0.000733f, - 0.001109f, 0.001098f, 0.001260f, 0.001452f, 0.001377f, 0.001534f, 0.001972f, 0.001982f, - 0.002232f, 0.002567f, 0.002764f, 0.003273f, 0.003542f, 0.004181f, 0.004738f, 0.005466f, - 0.006268f, 0.007126f, 0.008614f, 0.010170f, 0.012093f, 0.014359f, 0.017075f, 0.021042f, - 0.026459f, 0.033722f, 0.044159f, 0.059113f, 0.082092f, 0.117249f, 0.173218f, 0.259766f, - 0.382080f, 0.526367f, 0.662598f, 0.768066f, 0.840332f, 0.889648f, 0.920410f, 0.940918f, - 0.956543f, 0.966309f, 0.989746f, 0.990234f, 0.990723f, 0.990723f, 0.990723f, 0.990723f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000191f, 0.000236f, 0.000335f, - 0.000337f, 0.000466f, 0.000399f, 0.000608f, 0.000626f, 0.000669f, 0.000696f, 0.000808f, - 0.000859f, 0.000915f, 0.000903f, 0.001168f, 0.001245f, 0.001500f, 0.001525f, 0.001863f, - 0.001941f, 0.002121f, 0.002399f, 0.002861f, 0.002953f, 0.003632f, 0.004105f, 0.004745f, - 0.005333f, 0.006317f, 0.007236f, 0.008255f, 0.009857f, 0.011414f, 0.014015f, 0.016922f, - 0.020828f, 0.026321f, 0.034149f, 0.044861f, 0.061279f, 0.085571f, 0.124878f, 0.187866f, - 0.285645f, 0.420654f, 0.570801f, 0.703125f, 0.799805f, 0.864258f, 0.905273f, 0.932129f, - 0.950684f, 0.963379f, 0.988770f, 0.989258f, 0.989746f, 0.989746f, 0.989746f, 0.989746f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000000f, 0.000122f, 0.000125f, 0.000232f, - 0.000360f, 0.000342f, 0.000463f, 0.000388f, 0.000569f, 0.000638f, 0.000671f, 0.000791f, - 0.000774f, 0.000943f, 0.000774f, 0.001018f, 0.001044f, 0.001245f, 0.001377f, 0.001410f, - 0.001643f, 0.001970f, 0.002041f, 0.002316f, 0.002758f, 0.003023f, 0.003433f, 0.003859f, - 0.004444f, 0.005180f, 0.006134f, 0.006920f, 0.008102f, 0.009354f, 0.011475f, 0.013649f, - 0.016739f, 0.021011f, 0.026566f, 0.034454f, 0.046051f, 0.063843f, 0.090942f, 0.135498f, - 0.207642f, 0.319580f, 0.467529f, 0.620605f, 0.745605f, 0.830566f, 0.886230f, 0.920898f, - 0.943848f, 0.958984f, 0.987793f, 0.988281f, 0.988770f, 0.988770f, 0.988281f, 0.988770f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000188f, 0.000200f, - 0.000332f, 0.000417f, 0.000338f, 0.000459f, 0.000349f, 0.000558f, 0.000642f, 0.000636f, - 0.000629f, 0.000807f, 0.000695f, 0.000747f, 0.000827f, 0.001058f, 0.001182f, 0.001269f, - 0.001422f, 0.001472f, 0.001921f, 0.002100f, 0.002337f, 0.002462f, 0.003073f, 0.003374f, - 0.003708f, 0.004265f, 0.004826f, 0.005646f, 0.006596f, 0.007710f, 0.008926f, 0.011063f, - 0.013580f, 0.016495f, 0.020737f, 0.026459f, 0.035126f, 0.047791f, 0.066833f, 0.097778f, - 0.149170f, 0.233887f, 0.363037f, 0.523438f, 0.674805f, 0.788086f, 0.860352f, 0.906250f, - 0.935547f, 0.954102f, 0.986328f, 0.987305f, 0.987305f, 0.987305f, 0.987305f, 0.987793f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000175f, - 0.000155f, 0.000319f, 0.000241f, 0.000318f, 0.000455f, 0.000462f, 0.000496f, 0.000593f, - 0.000516f, 0.000564f, 0.000667f, 0.000668f, 0.000715f, 0.000749f, 0.000925f, 0.001111f, - 0.001246f, 0.001381f, 0.001443f, 0.001856f, 0.001997f, 0.002264f, 0.002363f, 0.002880f, - 0.003212f, 0.003727f, 0.004208f, 0.004673f, 0.005394f, 0.006367f, 0.007404f, 0.009003f, - 0.010651f, 0.013138f, 0.016312f, 0.020767f, 0.027054f, 0.036377f, 0.050262f, 0.071655f, - 0.107361f, 0.167969f, 0.269287f, 0.418457f, 0.587402f, 0.730957f, 0.828125f, 0.888184f, - 0.924805f, 0.948242f, 0.984863f, 0.986328f, 0.986328f, 0.985840f, 0.986328f, 0.986328f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000202f, 0.000133f, 0.000215f, 0.000263f, 0.000304f, 0.000442f, 0.000332f, 0.000365f, - 0.000403f, 0.000549f, 0.000607f, 0.000750f, 0.000788f, 0.000802f, 0.000841f, 0.000958f, - 0.001049f, 0.001188f, 0.001354f, 0.001318f, 0.001582f, 0.001928f, 0.002064f, 0.002321f, - 0.002594f, 0.003042f, 0.003222f, 0.003796f, 0.004440f, 0.005112f, 0.006081f, 0.007259f, - 0.008736f, 0.010612f, 0.013077f, 0.016464f, 0.020950f, 0.027664f, 0.037506f, 0.052795f, - 0.077698f, 0.120361f, 0.194336f, 0.317627f, 0.486572f, 0.657227f, 0.785156f, 0.865234f, - 0.913086f, 0.942871f, 0.983887f, 0.984863f, 0.984375f, 0.984863f, 0.984375f, 0.984863f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000152f, 0.000257f, 0.000243f, 0.000288f, 0.000345f, 0.000228f, - 0.000358f, 0.000363f, 0.000432f, 0.000494f, 0.000530f, 0.000582f, 0.000762f, 0.000771f, - 0.000913f, 0.000978f, 0.001100f, 0.001305f, 0.001373f, 0.001706f, 0.001712f, 0.001922f, - 0.002155f, 0.002569f, 0.002573f, 0.003094f, 0.003401f, 0.004272f, 0.004978f, 0.005829f, - 0.006924f, 0.008453f, 0.010452f, 0.012871f, 0.016617f, 0.021072f, 0.028427f, 0.039429f, - 0.056732f, 0.086243f, 0.138916f, 0.231812f, 0.381592f, 0.566406f, 0.726562f, 0.833496f, - 0.896973f, 0.933594f, 0.981934f, 0.982910f, 0.982910f, 0.982910f, 0.982910f, 0.982910f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000121f, 0.000127f, 0.000215f, 0.000159f, 0.000233f, 0.000284f, 0.000326f, - 0.000339f, 0.000339f, 0.000352f, 0.000394f, 0.000623f, 0.000622f, 0.000731f, 0.000730f, - 0.000741f, 0.000829f, 0.000914f, 0.001017f, 0.001151f, 0.001469f, 0.001263f, 0.001480f, - 0.001740f, 0.002069f, 0.002104f, 0.002443f, 0.002831f, 0.003519f, 0.003929f, 0.004627f, - 0.005455f, 0.006634f, 0.008316f, 0.009949f, 0.012596f, 0.016495f, 0.021729f, 0.029877f, - 0.042084f, 0.062805f, 0.098694f, 0.165283f, 0.284668f, 0.465088f, 0.654297f, 0.793945f, - 0.877930f, 0.924805f, 0.979980f, 0.980957f, 0.980957f, 0.981445f, 0.981445f, 0.980957f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, - 0.000121f, 0.000121f, 0.000150f, 0.000163f, 0.000069f, 0.000057f, 0.000121f, 0.000231f, - 0.000291f, 0.000304f, 0.000334f, 0.000339f, 0.000346f, 0.000569f, 0.000648f, 0.000674f, - 0.000649f, 0.000697f, 0.000772f, 0.000834f, 0.000972f, 0.001005f, 0.001189f, 0.001359f, - 0.001237f, 0.001567f, 0.001794f, 0.001963f, 0.002378f, 0.002712f, 0.002867f, 0.003853f, - 0.004330f, 0.005196f, 0.006516f, 0.008026f, 0.009888f, 0.012703f, 0.016479f, 0.022110f, - 0.031158f, 0.045746f, 0.070557f, 0.117004f, 0.204956f, 0.360596f, 0.564453f, 0.740723f, - 0.852051f, 0.912598f, 0.977539f, 0.979492f, 0.979492f, 0.979004f, 0.979492f, 0.979004f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000098f, 0.000082f, 0.000067f, 0.000056f, 0.000124f, - 0.000193f, 0.000240f, 0.000258f, 0.000310f, 0.000326f, 0.000335f, 0.000341f, 0.000471f, - 0.000613f, 0.000494f, 0.000716f, 0.000742f, 0.000804f, 0.000873f, 0.000832f, 0.001070f, - 0.001120f, 0.001146f, 0.001225f, 0.001696f, 0.001814f, 0.002041f, 0.002419f, 0.002941f, - 0.003433f, 0.004154f, 0.004818f, 0.006077f, 0.007652f, 0.009521f, 0.012444f, 0.017029f, - 0.023193f, 0.033539f, 0.050690f, 0.082092f, 0.144043f, 0.265869f, 0.463379f, 0.672363f, - 0.818848f, 0.898438f, 0.975586f, 0.976562f, 0.976562f, 0.976562f, 0.976074f, 0.976562f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000114f, 0.000096f, 0.000079f, 0.000125f, 0.000056f, - 0.000142f, 0.000120f, 0.000195f, 0.000246f, 0.000321f, 0.000305f, 0.000319f, 0.000395f, - 0.000442f, 0.000540f, 0.000642f, 0.000638f, 0.000696f, 0.000674f, 0.000687f, 0.000857f, - 0.000955f, 0.001128f, 0.001224f, 0.001364f, 0.001347f, 0.001555f, 0.001910f, 0.002245f, - 0.002714f, 0.003229f, 0.003824f, 0.004673f, 0.005676f, 0.007225f, 0.009293f, 0.012802f, - 0.017273f, 0.024368f, 0.036682f, 0.058075f, 0.100952f, 0.188721f, 0.358154f, 0.587891f, - 0.775879f, 0.881348f, 0.972168f, 0.972656f, 0.972656f, 0.973145f, 0.973145f, 0.973633f, - 0.000000f, 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000120f, 0.000112f, 0.000093f, 0.000079f, 0.000067f, - 0.000057f, 0.000049f, 0.000133f, 0.000137f, 0.000163f, 0.000244f, 0.000328f, 0.000366f, - 0.000356f, 0.000415f, 0.000436f, 0.000543f, 0.000555f, 0.000638f, 0.000597f, 0.000702f, - 0.000786f, 0.000648f, 0.000891f, 0.000804f, 0.001218f, 0.001070f, 0.001355f, 0.001731f, - 0.002171f, 0.002352f, 0.002796f, 0.003546f, 0.004189f, 0.005558f, 0.006939f, 0.009209f, - 0.012337f, 0.017776f, 0.026016f, 0.040833f, 0.069946f, 0.130981f, 0.262207f, 0.489258f, - 0.719238f, 0.859375f, 0.968262f, 0.969238f, 0.969727f, 0.969727f, 0.969727f, 0.969727f, - 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000110f, 0.000093f, 0.000080f, - 0.000068f, 0.000094f, 0.000119f, 0.000117f, 0.000120f, 0.000123f, 0.000173f, 0.000263f, - 0.000263f, 0.000359f, 0.000386f, 0.000390f, 0.000401f, 0.000556f, 0.000549f, 0.000573f, - 0.000502f, 0.000707f, 0.000789f, 0.000629f, 0.000847f, 0.001003f, 0.001024f, 0.001242f, - 0.001423f, 0.001877f, 0.002012f, 0.002571f, 0.003071f, 0.003925f, 0.005131f, 0.006767f, - 0.009140f, 0.012672f, 0.018509f, 0.028992f, 0.048309f, 0.089233f, 0.183838f, 0.383545f, - 0.646973f, 0.830078f, 0.963867f, 0.964844f, 0.964844f, 0.965820f, 0.965820f, 0.965820f, - 0.000000f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000120f, - 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000119f, 0.000119f, 0.000113f, 0.000095f, - 0.000083f, 0.000070f, 0.000061f, 0.000054f, 0.000048f, 0.000042f, 0.000115f, 0.000112f, - 0.000151f, 0.000213f, 0.000309f, 0.000298f, 0.000359f, 0.000337f, 0.000382f, 0.000440f, - 0.000576f, 0.000477f, 0.000453f, 0.000690f, 0.000687f, 0.000795f, 0.000776f, 0.000911f, - 0.001117f, 0.001119f, 0.001352f, 0.002001f, 0.002140f, 0.002832f, 0.003609f, 0.004715f, - 0.006302f, 0.008835f, 0.013115f, 0.020004f, 0.032867f, 0.060333f, 0.124512f, 0.281982f, - 0.557617f, 0.794434f, 0.959473f, 0.959961f, 0.960449f, 0.960449f, 0.960449f, 0.959961f, - 0.000122f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000120f, 0.000119f, 0.000119f, - 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000118f, 0.000118f, 0.000118f, 0.000116f, - 0.000098f, 0.000087f, 0.000076f, 0.000065f, 0.000057f, 0.000050f, 0.000045f, 0.000091f, - 0.000074f, 0.000106f, 0.000185f, 0.000193f, 0.000228f, 0.000328f, 0.000323f, 0.000399f, - 0.000429f, 0.000498f, 0.000552f, 0.000432f, 0.000542f, 0.000592f, 0.000599f, 0.000729f, - 0.000734f, 0.000885f, 0.001304f, 0.001273f, 0.001756f, 0.001931f, 0.002445f, 0.003120f, - 0.004456f, 0.006165f, 0.008751f, 0.013466f, 0.022141f, 0.040192f, 0.082397f, 0.195679f, - 0.455322f, 0.745117f, 0.952637f, 0.953613f, 0.953613f, 0.954102f, 0.952637f, 0.953613f, - 0.000000f, 0.000120f, 0.000120f, 0.000119f, 0.000119f, 0.000119f, 0.000118f, 0.000118f, - 0.000118f, 0.000118f, 0.000118f, 0.000117f, 0.000117f, 0.000117f, 0.000117f, 0.000117f, - 0.000117f, 0.000104f, 0.000092f, 0.000079f, 0.000071f, 0.000062f, 0.000055f, 0.000049f, - 0.000044f, 0.000039f, 0.000099f, 0.000106f, 0.000158f, 0.000169f, 0.000241f, 0.000274f, - 0.000293f, 0.000389f, 0.000360f, 0.000399f, 0.000387f, 0.000446f, 0.000401f, 0.000530f, - 0.000565f, 0.000691f, 0.000722f, 0.000848f, 0.001147f, 0.001418f, 0.001677f, 0.002087f, - 0.002972f, 0.004169f, 0.005623f, 0.008835f, 0.014404f, 0.026077f, 0.053467f, 0.129395f, - 0.346924f, 0.685059f, 0.943848f, 0.945801f, 0.945801f, 0.945312f, 0.945801f, 0.945801f, - 0.000000f, 0.000000f, 0.000117f, 0.000116f, 0.000117f, 0.000117f, 0.000116f, 0.000116f, - 0.000115f, 0.000116f, 0.000115f, 0.000116f, 0.000115f, 0.000115f, 0.000115f, 0.000115f, - 0.000115f, 0.000115f, 0.000110f, 0.000097f, 0.000086f, 0.000077f, 0.000067f, 0.000060f, - 0.000053f, 0.000048f, 0.000043f, 0.000061f, 0.000090f, 0.000083f, 0.000139f, 0.000139f, - 0.000216f, 0.000254f, 0.000307f, 0.000358f, 0.000269f, 0.000377f, 0.000324f, 0.000369f, - 0.000405f, 0.000455f, 0.000524f, 0.000706f, 0.000701f, 0.001012f, 0.001206f, 0.001316f, - 0.001663f, 0.002350f, 0.003571f, 0.005505f, 0.008873f, 0.016006f, 0.033234f, 0.081848f, - 0.244751f, 0.605469f, 0.934082f, 0.935059f, 0.936035f, 0.935547f, 0.935547f, 0.935547f, - 0.000105f, 0.000114f, 0.000113f, 0.000113f, 0.000111f, 0.000111f, 0.000112f, 0.000111f, - 0.000112f, 0.000112f, 0.000112f, 0.000112f, 0.000111f, 0.000112f, 0.000112f, 0.000112f, - 0.000112f, 0.000112f, 0.000112f, 0.000112f, 0.000105f, 0.000093f, 0.000083f, 0.000074f, - 0.000066f, 0.000059f, 0.000053f, 0.000048f, 0.000043f, 0.000062f, 0.000052f, 0.000063f, - 0.000092f, 0.000146f, 0.000176f, 0.000216f, 0.000227f, 0.000263f, 0.000244f, 0.000267f, - 0.000370f, 0.000326f, 0.000360f, 0.000391f, 0.000505f, 0.000618f, 0.000726f, 0.000969f, - 0.001117f, 0.001651f, 0.002131f, 0.003090f, 0.005188f, 0.009499f, 0.019836f, 0.049042f, - 0.159180f, 0.509766f, 0.921875f, 0.922852f, 0.922852f, 0.922363f, 0.923340f, 0.922852f, - 0.000000f, 0.000000f, 0.000065f, 0.000098f, 0.000096f, 0.000101f, 0.000100f, 0.000104f, - 0.000104f, 0.000103f, 0.000106f, 0.000106f, 0.000106f, 0.000105f, 0.000107f, 0.000107f, - 0.000106f, 0.000107f, 0.000107f, 0.000108f, 0.000107f, 0.000108f, 0.000104f, 0.000092f, - 0.000082f, 0.000075f, 0.000067f, 0.000059f, 0.000054f, 0.000048f, 0.000044f, 0.000039f, - 0.000037f, 0.000058f, 0.000066f, 0.000122f, 0.000137f, 0.000175f, 0.000208f, 0.000194f, - 0.000208f, 0.000240f, 0.000270f, 0.000281f, 0.000323f, 0.000364f, 0.000479f, 0.000591f, - 0.000712f, 0.000986f, 0.001224f, 0.001896f, 0.002996f, 0.005196f, 0.010506f, 0.027527f, - 0.095581f, 0.399658f, 0.905762f, 0.906738f, 0.906250f, 0.905762f, 0.905762f, 0.907227f, - 0.000000f, 0.000000f, 0.000000f, 0.000017f, 0.000030f, 0.000054f, 0.000061f, 0.000081f, - 0.000087f, 0.000088f, 0.000089f, 0.000093f, 0.000093f, 0.000096f, 0.000096f, 0.000097f, - 0.000098f, 0.000099f, 0.000098f, 0.000100f, 0.000100f, 0.000101f, 0.000100f, 0.000101f, - 0.000101f, 0.000092f, 0.000082f, 0.000074f, 0.000067f, 0.000060f, 0.000054f, 0.000049f, - 0.000045f, 0.000040f, 0.000036f, 0.000037f, 0.000059f, 0.000077f, 0.000093f, 0.000143f, - 0.000155f, 0.000188f, 0.000178f, 0.000184f, 0.000231f, 0.000234f, 0.000272f, 0.000352f, - 0.000420f, 0.000525f, 0.000764f, 0.001091f, 0.001653f, 0.002705f, 0.005474f, 0.013939f, - 0.051880f, 0.283691f, 0.883789f, 0.884766f, 0.885254f, 0.885254f, 0.885742f, 0.885254f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000013f, - 0.000032f, 0.000046f, 0.000050f, 0.000060f, 0.000065f, 0.000065f, 0.000075f, 0.000078f, - 0.000080f, 0.000079f, 0.000084f, 0.000083f, 0.000087f, 0.000087f, 0.000089f, 0.000090f, - 0.000091f, 0.000091f, 0.000092f, 0.000092f, 0.000083f, 0.000075f, 0.000068f, 0.000062f, - 0.000056f, 0.000050f, 0.000046f, 0.000042f, 0.000037f, 0.000039f, 0.000044f, 0.000072f, - 0.000068f, 0.000089f, 0.000125f, 0.000124f, 0.000126f, 0.000153f, 0.000183f, 0.000212f, - 0.000219f, 0.000311f, 0.000363f, 0.000566f, 0.000846f, 0.001332f, 0.002522f, 0.006252f, - 0.023834f, 0.175415f, 0.855957f, 0.856934f, 0.856934f, 0.856934f, 0.857422f, 0.856934f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000007f, 0.000024f, 0.000028f, - 0.000040f, 0.000044f, 0.000051f, 0.000053f, 0.000060f, 0.000063f, 0.000064f, 0.000067f, - 0.000071f, 0.000072f, 0.000074f, 0.000076f, 0.000077f, 0.000079f, 0.000079f, 0.000075f, - 0.000068f, 0.000062f, 0.000056f, 0.000051f, 0.000046f, 0.000042f, 0.000038f, 0.000034f, - 0.000031f, 0.000030f, 0.000045f, 0.000079f, 0.000081f, 0.000107f, 0.000114f, 0.000106f, - 0.000144f, 0.000136f, 0.000171f, 0.000254f, 0.000377f, 0.000531f, 0.001037f, 0.002504f, - 0.009140f, 0.088379f, 0.818848f, 0.820801f, 0.819824f, 0.820312f, 0.819336f, 0.820801f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000007f, 0.000014f, 0.000021f, 0.000028f, - 0.000034f, 0.000036f, 0.000042f, 0.000046f, 0.000049f, 0.000052f, 0.000054f, 0.000056f, - 0.000059f, 0.000061f, 0.000064f, 0.000061f, 0.000055f, 0.000050f, 0.000045f, 0.000041f, - 0.000037f, 0.000033f, 0.000030f, 0.000027f, 0.000024f, 0.000033f, 0.000060f, 0.000059f, - 0.000075f, 0.000073f, 0.000101f, 0.000089f, 0.000144f, 0.000226f, 0.000384f, 0.000847f, - 0.003033f, 0.031860f, 0.770020f, 0.770996f, 0.772461f, 0.771973f, 0.772461f, 0.771973f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000006f, 0.000010f, 0.000016f, - 0.000021f, 0.000023f, 0.000029f, 0.000032f, 0.000036f, 0.000039f, 0.000042f, 0.000044f, - 0.000042f, 0.000038f, 0.000035f, 0.000031f, 0.000028f, 0.000025f, 0.000022f, 0.000020f, - 0.000017f, 0.000024f, 0.000040f, 0.000047f, 0.000053f, 0.000063f, 0.000087f, 0.000190f, - 0.000666f, 0.007278f, 0.708496f, 0.709961f, 0.710449f, 0.710938f, 0.710938f, 0.710449f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, - 0.000005f, 0.000010f, 0.000014f, 0.000018f, 0.000021f, 0.000024f, 0.000024f, 0.000021f, - 0.000018f, 0.000016f, 0.000014f, 0.000012f, 0.000008f, 0.000020f, 0.000022f, 0.000025f, - 0.000073f, 0.000744f, 0.632324f, 0.632812f, 0.633789f, 0.633789f, 0.633301f, 0.632812f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000003f, 0.000007f, 0.000006f, 0.000004f, - 0.000005f, 0.000007f, 0.543945f, 0.545410f, 0.545410f, 0.545410f, 0.546387f, 0.545898f, - }, - { - 0.159546f, 0.492676f, 0.684570f, 0.783203f, 0.838379f, 0.873535f, 0.897949f, 0.913574f, - 0.926270f, 0.936035f, 0.943359f, 0.950195f, 0.955566f, 0.959473f, 0.963379f, 0.966797f, - 0.969238f, 0.972168f, 0.973633f, 0.976562f, 0.978027f, 0.979492f, 0.980957f, 0.982422f, - 0.983887f, 0.984863f, 0.985840f, 0.986816f, 0.987793f, 0.988770f, 0.989258f, 0.989746f, - 0.990234f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.993652f, 0.994141f, - 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, - 0.997070f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.034119f, 0.154175f, 0.341309f, 0.532227f, 0.672363f, 0.763184f, 0.820801f, 0.858398f, - 0.885742f, 0.904297f, 0.918945f, 0.929199f, 0.938965f, 0.945801f, 0.951660f, 0.956543f, - 0.961426f, 0.964355f, 0.968262f, 0.970703f, 0.973145f, 0.975586f, 0.977539f, 0.979004f, - 0.980469f, 0.981934f, 0.983398f, 0.984375f, 0.985352f, 0.986328f, 0.987305f, 0.988281f, - 0.988770f, 0.989746f, 0.990234f, 0.991211f, 0.991699f, 0.992676f, 0.993164f, 0.993164f, - 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, - 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.013390f, 0.056915f, 0.134155f, 0.257080f, 0.412109f, 0.560547f, 0.675781f, 0.755859f, - 0.812012f, 0.851074f, 0.877930f, 0.898926f, 0.913574f, 0.925781f, 0.935059f, 0.942871f, - 0.949707f, 0.954590f, 0.959473f, 0.963379f, 0.966797f, 0.969238f, 0.971680f, 0.975098f, - 0.976562f, 0.978516f, 0.979980f, 0.980957f, 0.982422f, 0.984375f, 0.985352f, 0.985840f, - 0.987305f, 0.987793f, 0.988770f, 0.989746f, 0.990723f, 0.991211f, 0.991699f, 0.992188f, - 0.992676f, 0.993164f, 0.993652f, 0.994141f, 0.994629f, 0.995605f, 0.995605f, 0.995605f, - 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998535f, - 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.006939f, 0.027863f, 0.061951f, 0.117859f, 0.204834f, 0.324707f, 0.460205f, 0.585449f, - 0.684570f, 0.757324f, 0.810059f, 0.847168f, 0.874023f, 0.895996f, 0.910645f, 0.922852f, - 0.933105f, 0.940918f, 0.947754f, 0.953613f, 0.958496f, 0.961914f, 0.965820f, 0.968750f, - 0.971680f, 0.974121f, 0.976074f, 0.978027f, 0.979492f, 0.981445f, 0.982910f, 0.983887f, - 0.984863f, 0.986328f, 0.987305f, 0.988281f, 0.988770f, 0.989746f, 0.990234f, 0.990723f, - 0.991699f, 0.992188f, 0.993164f, 0.993652f, 0.993652f, 0.994141f, 0.995117f, 0.995605f, - 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.004211f, 0.016022f, 0.034119f, 0.061432f, 0.104797f, 0.170288f, 0.262695f, 0.377686f, - 0.499756f, 0.608887f, 0.696777f, 0.762207f, 0.810547f, 0.847168f, 0.873535f, 0.893066f, - 0.910156f, 0.922852f, 0.932617f, 0.939941f, 0.946777f, 0.953125f, 0.958496f, 0.961914f, - 0.965332f, 0.968750f, 0.971680f, 0.973633f, 0.975586f, 0.977539f, 0.979492f, 0.981445f, - 0.982910f, 0.984375f, 0.985840f, 0.986328f, 0.987793f, 0.987793f, 0.989258f, 0.989746f, - 0.990723f, 0.991211f, 0.992188f, 0.992676f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, - 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, - 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999023f, 0.999512f, 0.999023f, 0.999023f, - 0.002724f, 0.010384f, 0.020813f, 0.036285f, 0.059784f, 0.093933f, 0.145508f, 0.218018f, - 0.313232f, 0.424072f, 0.534180f, 0.632812f, 0.709961f, 0.769531f, 0.815918f, 0.848145f, - 0.874512f, 0.894043f, 0.909668f, 0.922363f, 0.932129f, 0.939941f, 0.946777f, 0.953125f, - 0.958008f, 0.961914f, 0.965332f, 0.968750f, 0.971680f, 0.973633f, 0.976562f, 0.978516f, - 0.979980f, 0.981445f, 0.982910f, 0.984863f, 0.985352f, 0.986816f, 0.987793f, 0.988281f, - 0.988770f, 0.989746f, 0.990723f, 0.991211f, 0.992188f, 0.992676f, 0.993652f, 0.994141f, - 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997559f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.002113f, 0.007004f, 0.014091f, 0.023895f, 0.037811f, 0.057373f, 0.085632f, 0.127075f, - 0.185425f, 0.263672f, 0.360596f, 0.465576f, 0.566895f, 0.655762f, 0.725586f, 0.779297f, - 0.822266f, 0.853516f, 0.877441f, 0.895996f, 0.911621f, 0.923828f, 0.933105f, 0.940918f, - 0.947754f, 0.953613f, 0.957520f, 0.962402f, 0.965820f, 0.968750f, 0.972168f, 0.974121f, - 0.976074f, 0.978027f, 0.980469f, 0.981934f, 0.983398f, 0.984863f, 0.985352f, 0.986328f, - 0.988281f, 0.988281f, 0.989258f, 0.990234f, 0.991211f, 0.992188f, 0.992676f, 0.993164f, - 0.993652f, 0.994629f, 0.994629f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.001575f, 0.005211f, 0.010040f, 0.016220f, 0.025665f, 0.037415f, 0.054138f, 0.078491f, - 0.112915f, 0.160156f, 0.225464f, 0.308594f, 0.405029f, 0.506348f, 0.599121f, 0.678711f, - 0.743164f, 0.791016f, 0.829590f, 0.859375f, 0.881836f, 0.899414f, 0.913086f, 0.924805f, - 0.934570f, 0.942383f, 0.948730f, 0.955078f, 0.958984f, 0.963379f, 0.966797f, 0.970215f, - 0.972168f, 0.974609f, 0.977051f, 0.979004f, 0.980957f, 0.981934f, 0.983398f, 0.984863f, - 0.986328f, 0.987305f, 0.988281f, 0.989258f, 0.990234f, 0.991211f, 0.991699f, 0.992188f, - 0.993164f, 0.993652f, 0.994629f, 0.994629f, 0.995117f, 0.995605f, 0.995605f, 0.996094f, - 0.996582f, 0.997559f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000985f, 0.004086f, 0.007362f, 0.011887f, 0.018127f, 0.026199f, 0.036804f, 0.052002f, - 0.072754f, 0.101318f, 0.140747f, 0.195190f, 0.266113f, 0.352539f, 0.448730f, 0.543945f, - 0.630371f, 0.702637f, 0.759277f, 0.803711f, 0.839355f, 0.865234f, 0.886719f, 0.903320f, - 0.916504f, 0.927734f, 0.936523f, 0.944336f, 0.950195f, 0.955566f, 0.959961f, 0.964355f, - 0.967773f, 0.970215f, 0.973145f, 0.975586f, 0.978027f, 0.979004f, 0.980957f, 0.982910f, - 0.984375f, 0.985352f, 0.987305f, 0.987305f, 0.988770f, 0.990234f, 0.990234f, 0.991699f, - 0.991699f, 0.993164f, 0.993164f, 0.993652f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, - 0.996582f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.998535f, 0.999023f, - 0.000829f, 0.002878f, 0.005596f, 0.009109f, 0.013359f, 0.019089f, 0.026901f, 0.036774f, - 0.049347f, 0.067200f, 0.091736f, 0.125854f, 0.171631f, 0.232544f, 0.308594f, 0.397461f, - 0.491455f, 0.581055f, 0.659668f, 0.724609f, 0.775879f, 0.817383f, 0.848633f, 0.873047f, - 0.892090f, 0.907715f, 0.920410f, 0.930664f, 0.939453f, 0.946289f, 0.951660f, 0.957520f, - 0.960938f, 0.965820f, 0.968750f, 0.972168f, 0.974609f, 0.976562f, 0.978516f, 0.980469f, - 0.981934f, 0.983887f, 0.984863f, 0.986328f, 0.986816f, 0.988770f, 0.989746f, 0.990234f, - 0.991211f, 0.991699f, 0.992676f, 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, - 0.995605f, 0.996582f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000836f, 0.002403f, 0.004837f, 0.006950f, 0.010269f, 0.014679f, 0.019699f, 0.026291f, - 0.035431f, 0.046875f, 0.062744f, 0.084045f, 0.113403f, 0.152588f, 0.204712f, 0.271729f, - 0.353271f, 0.443115f, 0.532715f, 0.617188f, 0.688477f, 0.748047f, 0.793945f, 0.829102f, - 0.857422f, 0.880371f, 0.898438f, 0.912598f, 0.924316f, 0.934082f, 0.941406f, 0.948242f, - 0.954590f, 0.959473f, 0.963379f, 0.967285f, 0.970215f, 0.973145f, 0.975586f, 0.977539f, - 0.979980f, 0.981445f, 0.982910f, 0.984375f, 0.985840f, 0.987305f, 0.988281f, 0.988770f, - 0.990234f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.994141f, 0.995117f, - 0.995605f, 0.996094f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000698f, 0.002052f, 0.003618f, 0.005703f, 0.008430f, 0.011230f, 0.015083f, 0.019821f, - 0.026474f, 0.034393f, 0.044922f, 0.059204f, 0.077698f, 0.102661f, 0.136963f, 0.182373f, - 0.241089f, 0.314941f, 0.398926f, 0.489014f, 0.575195f, 0.652344f, 0.717285f, 0.769043f, - 0.810059f, 0.842773f, 0.869141f, 0.888672f, 0.904785f, 0.917969f, 0.928711f, 0.936523f, - 0.945312f, 0.951660f, 0.957031f, 0.961426f, 0.964844f, 0.968750f, 0.971680f, 0.974121f, - 0.976562f, 0.979004f, 0.980469f, 0.982422f, 0.983887f, 0.985352f, 0.986816f, 0.987793f, - 0.988770f, 0.990234f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, 0.994141f, 0.994141f, - 0.994629f, 0.995605f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000244f, 0.001565f, 0.002975f, 0.004433f, 0.006596f, 0.008957f, 0.012215f, 0.015533f, - 0.020294f, 0.026062f, 0.033722f, 0.042816f, 0.055237f, 0.071960f, 0.094543f, 0.124023f, - 0.164185f, 0.216309f, 0.281738f, 0.360352f, 0.446533f, 0.534180f, 0.615234f, 0.686523f, - 0.743652f, 0.790527f, 0.825684f, 0.855957f, 0.878418f, 0.895996f, 0.911133f, 0.923340f, - 0.933105f, 0.941406f, 0.948242f, 0.953613f, 0.959473f, 0.963379f, 0.966797f, 0.970703f, - 0.973145f, 0.976074f, 0.978516f, 0.980469f, 0.982422f, 0.983398f, 0.984863f, 0.986328f, - 0.987305f, 0.989258f, 0.989746f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, - 0.994141f, 0.995117f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998047f, - 0.000365f, 0.001394f, 0.002546f, 0.004055f, 0.005394f, 0.007465f, 0.009674f, 0.012070f, - 0.015556f, 0.019913f, 0.025696f, 0.032623f, 0.041046f, 0.052643f, 0.067383f, 0.087463f, - 0.113708f, 0.148315f, 0.194946f, 0.254395f, 0.326416f, 0.408691f, 0.495117f, 0.579102f, - 0.654297f, 0.716797f, 0.768066f, 0.809570f, 0.843262f, 0.868652f, 0.888184f, 0.904785f, - 0.918457f, 0.929199f, 0.937500f, 0.945801f, 0.951660f, 0.957520f, 0.961914f, 0.965820f, - 0.969238f, 0.972656f, 0.975098f, 0.978027f, 0.979492f, 0.981934f, 0.983398f, 0.984863f, - 0.986328f, 0.987793f, 0.989258f, 0.989746f, 0.991211f, 0.991211f, 0.992188f, 0.993164f, - 0.993652f, 0.994629f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000596f, 0.001077f, 0.001882f, 0.003033f, 0.004559f, 0.006241f, 0.007805f, 0.010002f, - 0.012840f, 0.015900f, 0.019974f, 0.025131f, 0.031250f, 0.039337f, 0.049988f, 0.063843f, - 0.080933f, 0.105164f, 0.135986f, 0.176880f, 0.230103f, 0.296631f, 0.374268f, 0.459961f, - 0.544434f, 0.623535f, 0.691895f, 0.748535f, 0.792969f, 0.829102f, 0.857422f, 0.880371f, - 0.897949f, 0.913086f, 0.924805f, 0.934570f, 0.942383f, 0.949219f, 0.955566f, 0.960938f, - 0.964844f, 0.968750f, 0.971191f, 0.974121f, 0.977051f, 0.979004f, 0.980957f, 0.982910f, - 0.984863f, 0.985840f, 0.987305f, 0.989258f, 0.989746f, 0.991211f, 0.991211f, 0.992676f, - 0.993164f, 0.993652f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000243f, 0.001173f, 0.001889f, 0.002661f, 0.003933f, 0.005131f, 0.006496f, 0.008324f, - 0.010574f, 0.013115f, 0.015839f, 0.019913f, 0.024445f, 0.030609f, 0.037781f, 0.047333f, - 0.059906f, 0.075928f, 0.097229f, 0.124939f, 0.161743f, 0.209595f, 0.271240f, 0.343994f, - 0.426758f, 0.511719f, 0.592773f, 0.666504f, 0.727051f, 0.776855f, 0.815918f, 0.847656f, - 0.871582f, 0.892090f, 0.907715f, 0.920898f, 0.931152f, 0.940918f, 0.947754f, 0.953613f, - 0.958496f, 0.963867f, 0.967773f, 0.970703f, 0.974121f, 0.976074f, 0.979004f, 0.980469f, - 0.982910f, 0.984375f, 0.985840f, 0.987305f, 0.988770f, 0.990234f, 0.990234f, 0.992188f, - 0.992188f, 0.993164f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000351f, 0.000842f, 0.001560f, 0.002363f, 0.003258f, 0.004131f, 0.005272f, 0.007179f, - 0.008682f, 0.010643f, 0.013016f, 0.016037f, 0.019516f, 0.024078f, 0.029602f, 0.036591f, - 0.045044f, 0.056641f, 0.071350f, 0.090576f, 0.116211f, 0.149414f, 0.193237f, 0.248779f, - 0.317871f, 0.396973f, 0.481201f, 0.564453f, 0.640137f, 0.705566f, 0.759766f, 0.802734f, - 0.836914f, 0.863281f, 0.885742f, 0.902832f, 0.916992f, 0.927734f, 0.937012f, 0.945801f, - 0.952637f, 0.958008f, 0.961914f, 0.966309f, 0.970703f, 0.974121f, 0.976074f, 0.978516f, - 0.980957f, 0.982910f, 0.984863f, 0.985840f, 0.987305f, 0.988281f, 0.989746f, 0.990723f, - 0.991211f, 0.992676f, 0.997070f, 0.997559f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000886f, 0.001405f, 0.001915f, 0.002651f, 0.003870f, 0.004845f, 0.006035f, - 0.006912f, 0.008812f, 0.010887f, 0.013229f, 0.016022f, 0.019196f, 0.023590f, 0.028992f, - 0.035248f, 0.043304f, 0.053711f, 0.066956f, 0.085083f, 0.107727f, 0.138428f, 0.178589f, - 0.229980f, 0.293945f, 0.370117f, 0.453369f, 0.537109f, 0.616699f, 0.685059f, 0.743164f, - 0.790039f, 0.826660f, 0.856445f, 0.878906f, 0.897949f, 0.913574f, 0.925293f, 0.935547f, - 0.943848f, 0.951172f, 0.957031f, 0.961914f, 0.966797f, 0.970215f, 0.973145f, 0.976562f, - 0.979004f, 0.980469f, 0.982910f, 0.984375f, 0.985840f, 0.987305f, 0.988770f, 0.989746f, - 0.991211f, 0.992188f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000104f, 0.000719f, 0.001065f, 0.001970f, 0.002544f, 0.003149f, 0.004230f, 0.005138f, - 0.006119f, 0.007580f, 0.009201f, 0.010902f, 0.013260f, 0.015526f, 0.019272f, 0.022858f, - 0.027512f, 0.033569f, 0.041199f, 0.050873f, 0.063782f, 0.079895f, 0.101135f, 0.128906f, - 0.165771f, 0.213745f, 0.273193f, 0.345703f, 0.427002f, 0.511719f, 0.592773f, 0.666016f, - 0.727051f, 0.776367f, 0.817871f, 0.848633f, 0.875000f, 0.894531f, 0.909668f, 0.922852f, - 0.934082f, 0.942383f, 0.949707f, 0.956055f, 0.961914f, 0.966309f, 0.970215f, 0.973145f, - 0.976562f, 0.978516f, 0.980957f, 0.982910f, 0.984375f, 0.986328f, 0.987305f, 0.988281f, - 0.989746f, 0.991211f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000240f, 0.000686f, 0.001052f, 0.001375f, 0.002308f, 0.002735f, 0.003510f, 0.004269f, - 0.005173f, 0.006649f, 0.007442f, 0.009109f, 0.011246f, 0.012886f, 0.015732f, 0.018829f, - 0.022354f, 0.026672f, 0.032867f, 0.039764f, 0.048492f, 0.060455f, 0.075806f, 0.095276f, - 0.121033f, 0.155273f, 0.199097f, 0.255859f, 0.324463f, 0.404053f, 0.488525f, 0.571289f, - 0.646484f, 0.711426f, 0.765625f, 0.808105f, 0.841797f, 0.869141f, 0.890137f, 0.907227f, - 0.920898f, 0.931641f, 0.940918f, 0.948730f, 0.955078f, 0.960449f, 0.965820f, 0.969727f, - 0.972656f, 0.976562f, 0.978516f, 0.980957f, 0.982910f, 0.984863f, 0.986328f, 0.987793f, - 0.989746f, 0.990723f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, - 0.000244f, 0.000597f, 0.000939f, 0.001369f, 0.001999f, 0.002329f, 0.003105f, 0.003786f, - 0.004395f, 0.005413f, 0.006474f, 0.007793f, 0.009254f, 0.010971f, 0.012970f, 0.015526f, - 0.018112f, 0.022049f, 0.026581f, 0.031586f, 0.038666f, 0.046967f, 0.057617f, 0.071777f, - 0.089783f, 0.113953f, 0.145264f, 0.186646f, 0.239990f, 0.305908f, 0.383301f, 0.467285f, - 0.551270f, 0.629883f, 0.697266f, 0.754883f, 0.799805f, 0.835938f, 0.864258f, 0.886719f, - 0.905273f, 0.918945f, 0.931152f, 0.940918f, 0.948242f, 0.955078f, 0.961426f, 0.965332f, - 0.969727f, 0.973633f, 0.976074f, 0.979004f, 0.980957f, 0.983398f, 0.984863f, 0.987305f, - 0.988281f, 0.989258f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, - 0.000000f, 0.000475f, 0.000891f, 0.001390f, 0.001730f, 0.002060f, 0.002501f, 0.003109f, - 0.003836f, 0.004837f, 0.005852f, 0.006859f, 0.007740f, 0.009216f, 0.010918f, 0.012863f, - 0.014915f, 0.017731f, 0.021317f, 0.025482f, 0.030930f, 0.037262f, 0.044891f, 0.055115f, - 0.068298f, 0.085510f, 0.107910f, 0.137207f, 0.176025f, 0.226929f, 0.289551f, 0.364746f, - 0.447998f, 0.532715f, 0.613770f, 0.685547f, 0.744629f, 0.791992f, 0.830078f, 0.860352f, - 0.884277f, 0.903320f, 0.917969f, 0.930176f, 0.939941f, 0.947754f, 0.954590f, 0.961426f, - 0.966309f, 0.970215f, 0.973145f, 0.976562f, 0.979492f, 0.981445f, 0.983398f, 0.985352f, - 0.987793f, 0.988281f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996094f, 0.996094f, - 0.000102f, 0.000243f, 0.000844f, 0.001124f, 0.001554f, 0.002077f, 0.002098f, 0.002682f, - 0.003357f, 0.004280f, 0.005035f, 0.005764f, 0.006805f, 0.007633f, 0.009354f, 0.010872f, - 0.012665f, 0.015099f, 0.017258f, 0.020599f, 0.024887f, 0.029495f, 0.035522f, 0.042999f, - 0.053070f, 0.065125f, 0.081299f, 0.102661f, 0.130371f, 0.166992f, 0.215088f, 0.275635f, - 0.348877f, 0.431641f, 0.517578f, 0.600098f, 0.672852f, 0.735352f, 0.785645f, 0.826172f, - 0.856934f, 0.881836f, 0.900879f, 0.916992f, 0.930176f, 0.940430f, 0.947754f, 0.955078f, - 0.960938f, 0.966309f, 0.969238f, 0.973633f, 0.977051f, 0.979492f, 0.981934f, 0.983887f, - 0.986328f, 0.987793f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, - 0.000241f, 0.000242f, 0.000823f, 0.000956f, 0.001225f, 0.001549f, 0.002031f, 0.002613f, - 0.003124f, 0.003574f, 0.004467f, 0.004955f, 0.005672f, 0.006752f, 0.007603f, 0.009186f, - 0.010704f, 0.012741f, 0.014366f, 0.017487f, 0.020142f, 0.024002f, 0.028915f, 0.034943f, - 0.041656f, 0.050964f, 0.062622f, 0.077881f, 0.097961f, 0.124207f, 0.158936f, 0.204590f, - 0.263184f, 0.334961f, 0.416748f, 0.502930f, 0.587891f, 0.664062f, 0.728516f, 0.780762f, - 0.822266f, 0.854492f, 0.879395f, 0.900879f, 0.916504f, 0.928711f, 0.940430f, 0.948730f, - 0.955566f, 0.961914f, 0.967285f, 0.970215f, 0.974121f, 0.977539f, 0.979980f, 0.982422f, - 0.984863f, 0.986816f, 0.994629f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, - 0.000000f, 0.000473f, 0.000607f, 0.000921f, 0.000957f, 0.001448f, 0.001884f, 0.002270f, - 0.002703f, 0.002998f, 0.003862f, 0.004307f, 0.005074f, 0.005665f, 0.006737f, 0.007851f, - 0.009216f, 0.010735f, 0.012459f, 0.014572f, 0.016998f, 0.019821f, 0.023605f, 0.027969f, - 0.033783f, 0.040192f, 0.049286f, 0.060303f, 0.074829f, 0.093750f, 0.118774f, 0.152222f, - 0.195801f, 0.252441f, 0.322754f, 0.404053f, 0.491943f, 0.577637f, 0.655273f, 0.722168f, - 0.776367f, 0.820312f, 0.854004f, 0.878906f, 0.900879f, 0.916992f, 0.929688f, 0.940430f, - 0.949707f, 0.956055f, 0.962402f, 0.967285f, 0.971191f, 0.975586f, 0.978516f, 0.980957f, - 0.983398f, 0.985352f, 0.994141f, 0.995117f, 0.995117f, 0.995605f, 0.995117f, 0.995605f, - 0.000000f, 0.000444f, 0.000605f, 0.000649f, 0.000926f, 0.001096f, 0.001624f, 0.001669f, - 0.002373f, 0.002716f, 0.003231f, 0.003769f, 0.004395f, 0.005005f, 0.005878f, 0.006710f, - 0.007793f, 0.008957f, 0.010712f, 0.012230f, 0.014244f, 0.016693f, 0.019531f, 0.022827f, - 0.027100f, 0.032318f, 0.038971f, 0.047302f, 0.058105f, 0.072021f, 0.089966f, 0.114319f, - 0.146362f, 0.188965f, 0.244019f, 0.312988f, 0.394287f, 0.482178f, 0.569824f, 0.650391f, - 0.718262f, 0.774414f, 0.819336f, 0.853027f, 0.880371f, 0.900879f, 0.917969f, 0.930664f, - 0.940918f, 0.950684f, 0.957031f, 0.962891f, 0.968262f, 0.972656f, 0.976562f, 0.979004f, - 0.981934f, 0.984375f, 0.994141f, 0.994629f, 0.994629f, 0.995117f, 0.994629f, 0.995117f, - 0.000000f, 0.000336f, 0.000601f, 0.000712f, 0.000810f, 0.001174f, 0.001286f, 0.001618f, - 0.002037f, 0.002592f, 0.002920f, 0.003223f, 0.003847f, 0.004463f, 0.005119f, 0.006020f, - 0.006783f, 0.007957f, 0.008888f, 0.010590f, 0.012230f, 0.013885f, 0.016220f, 0.019318f, - 0.022278f, 0.026474f, 0.031403f, 0.037781f, 0.046021f, 0.055969f, 0.069397f, 0.086975f, - 0.110413f, 0.140991f, 0.182739f, 0.236694f, 0.304932f, 0.385986f, 0.475586f, 0.563965f, - 0.646484f, 0.716797f, 0.772461f, 0.818359f, 0.853027f, 0.880859f, 0.901855f, 0.918945f, - 0.932129f, 0.942383f, 0.951172f, 0.958496f, 0.964355f, 0.969238f, 0.973633f, 0.977051f, - 0.979980f, 0.982910f, 0.993652f, 0.994141f, 0.994629f, 0.994141f, 0.994141f, 0.994629f, - 0.000000f, 0.000244f, 0.000418f, 0.000597f, 0.000600f, 0.001085f, 0.001236f, 0.001535f, - 0.001970f, 0.002096f, 0.002354f, 0.002834f, 0.003323f, 0.003822f, 0.004463f, 0.005146f, - 0.005798f, 0.006859f, 0.007587f, 0.008827f, 0.009956f, 0.011833f, 0.013725f, 0.015945f, - 0.018585f, 0.021988f, 0.025665f, 0.030807f, 0.036774f, 0.044373f, 0.054108f, 0.067383f, - 0.084229f, 0.106812f, 0.137207f, 0.177734f, 0.230835f, 0.299072f, 0.380127f, 0.470215f, - 0.560547f, 0.644531f, 0.715820f, 0.774414f, 0.820312f, 0.854980f, 0.882324f, 0.903809f, - 0.921387f, 0.933594f, 0.944824f, 0.952637f, 0.960449f, 0.965820f, 0.971191f, 0.974609f, - 0.978027f, 0.981934f, 0.993164f, 0.994629f, 0.994141f, 0.994141f, 0.994141f, 0.994141f, - 0.000000f, 0.000244f, 0.000411f, 0.000589f, 0.000820f, 0.000729f, 0.001086f, 0.001301f, - 0.001677f, 0.001935f, 0.002312f, 0.002678f, 0.002846f, 0.003590f, 0.003914f, 0.004578f, - 0.005020f, 0.005753f, 0.006706f, 0.007710f, 0.008911f, 0.010155f, 0.011528f, 0.013504f, - 0.015747f, 0.018036f, 0.021408f, 0.024994f, 0.029816f, 0.035858f, 0.043152f, 0.053009f, - 0.065491f, 0.082031f, 0.104065f, 0.133789f, 0.174072f, 0.226929f, 0.294434f, 0.376465f, - 0.467773f, 0.560059f, 0.644531f, 0.717285f, 0.777344f, 0.823242f, 0.857910f, 0.885742f, - 0.906738f, 0.922852f, 0.936523f, 0.947266f, 0.955078f, 0.961426f, 0.967285f, 0.972656f, - 0.976562f, 0.979980f, 0.992676f, 0.993164f, 0.993652f, 0.993652f, 0.993652f, 0.993652f, - 0.000000f, 0.000243f, 0.000243f, 0.000442f, 0.000695f, 0.000759f, 0.000837f, 0.001089f, - 0.001625f, 0.001702f, 0.002045f, 0.002176f, 0.002756f, 0.003063f, 0.003687f, 0.003893f, - 0.004456f, 0.005337f, 0.006062f, 0.006523f, 0.007572f, 0.008430f, 0.009880f, 0.011612f, - 0.013237f, 0.015114f, 0.017487f, 0.020584f, 0.024445f, 0.028931f, 0.034729f, 0.042023f, - 0.051788f, 0.063843f, 0.079956f, 0.102295f, 0.131592f, 0.171021f, 0.223877f, 0.292236f, - 0.375000f, 0.468018f, 0.562012f, 0.648438f, 0.721191f, 0.781250f, 0.826660f, 0.862305f, - 0.888672f, 0.909668f, 0.926270f, 0.938965f, 0.949707f, 0.957520f, 0.964355f, 0.969727f, - 0.974121f, 0.978027f, 0.992676f, 0.993164f, 0.993164f, 0.992676f, 0.993164f, 0.993164f, - 0.000000f, 0.000242f, 0.000242f, 0.000242f, 0.000564f, 0.000692f, 0.000826f, 0.001094f, - 0.001280f, 0.001457f, 0.001673f, 0.002232f, 0.002411f, 0.002789f, 0.003174f, 0.003649f, - 0.003859f, 0.004349f, 0.004990f, 0.005898f, 0.006622f, 0.007496f, 0.008209f, 0.009583f, - 0.011284f, 0.013062f, 0.014763f, 0.017120f, 0.020020f, 0.023804f, 0.028412f, 0.033905f, - 0.041016f, 0.050140f, 0.062469f, 0.078552f, 0.100159f, 0.129272f, 0.169067f, 0.222290f, - 0.291504f, 0.376465f, 0.470703f, 0.566406f, 0.653320f, 0.728027f, 0.786621f, 0.832031f, - 0.866699f, 0.893555f, 0.914062f, 0.929688f, 0.942383f, 0.952148f, 0.959961f, 0.966797f, - 0.972168f, 0.976074f, 0.991211f, 0.992188f, 0.992676f, 0.992188f, 0.992676f, 0.992676f, - 0.000241f, 0.000241f, 0.000240f, 0.000242f, 0.000486f, 0.000637f, 0.000916f, 0.000933f, - 0.001003f, 0.001284f, 0.001584f, 0.001925f, 0.002134f, 0.002502f, 0.002731f, 0.003134f, - 0.003435f, 0.004036f, 0.004379f, 0.005077f, 0.005688f, 0.006557f, 0.007347f, 0.007942f, - 0.009506f, 0.010712f, 0.012527f, 0.014603f, 0.016693f, 0.019592f, 0.023285f, 0.027512f, - 0.033173f, 0.040283f, 0.049347f, 0.061432f, 0.077271f, 0.098938f, 0.128052f, 0.168091f, - 0.222168f, 0.292725f, 0.379150f, 0.476807f, 0.573730f, 0.662598f, 0.735840f, 0.794434f, - 0.839844f, 0.873535f, 0.898926f, 0.918945f, 0.934082f, 0.945312f, 0.955566f, 0.962402f, - 0.969238f, 0.974609f, 0.990723f, 0.991699f, 0.992188f, 0.992188f, 0.992188f, 0.992188f, - 0.000000f, 0.000238f, 0.000240f, 0.000362f, 0.000362f, 0.000521f, 0.000631f, 0.000909f, - 0.000937f, 0.001249f, 0.001373f, 0.001693f, 0.001746f, 0.002184f, 0.002436f, 0.002680f, - 0.003094f, 0.003576f, 0.003828f, 0.004463f, 0.004990f, 0.005589f, 0.006439f, 0.006943f, - 0.008217f, 0.009384f, 0.010719f, 0.012184f, 0.014130f, 0.016373f, 0.019241f, 0.022675f, - 0.027161f, 0.032379f, 0.039307f, 0.048645f, 0.060455f, 0.076416f, 0.097778f, 0.127441f, - 0.168213f, 0.223633f, 0.296387f, 0.385986f, 0.485107f, 0.583984f, 0.673340f, 0.746582f, - 0.804199f, 0.848633f, 0.880371f, 0.905273f, 0.923828f, 0.938477f, 0.949707f, 0.958984f, - 0.965820f, 0.972656f, 0.990234f, 0.991211f, 0.991211f, 0.991211f, 0.991211f, 0.991211f, - 0.000000f, 0.000234f, 0.000238f, 0.000236f, 0.000360f, 0.000482f, 0.000614f, 0.000786f, - 0.000900f, 0.001056f, 0.001336f, 0.001466f, 0.001671f, 0.001907f, 0.002333f, 0.002546f, - 0.002871f, 0.003067f, 0.003500f, 0.003813f, 0.004425f, 0.004574f, 0.005459f, 0.006092f, - 0.006660f, 0.007660f, 0.008987f, 0.010071f, 0.011841f, 0.013847f, 0.016022f, 0.018829f, - 0.022339f, 0.026779f, 0.031677f, 0.038910f, 0.047913f, 0.059601f, 0.075684f, 0.097290f, - 0.127319f, 0.169189f, 0.226807f, 0.302490f, 0.394775f, 0.497314f, 0.598633f, 0.686523f, - 0.759766f, 0.814941f, 0.857422f, 0.888672f, 0.912109f, 0.930176f, 0.943359f, 0.954102f, - 0.962402f, 0.968750f, 0.988770f, 0.990234f, 0.990234f, 0.990234f, 0.991211f, 0.990723f, - 0.000000f, 0.000036f, 0.000166f, 0.000357f, 0.000356f, 0.000478f, 0.000566f, 0.000638f, - 0.000893f, 0.001146f, 0.001242f, 0.001330f, 0.001502f, 0.001773f, 0.001918f, 0.002024f, - 0.002501f, 0.002604f, 0.003067f, 0.003334f, 0.003708f, 0.004044f, 0.004646f, 0.005268f, - 0.006241f, 0.006931f, 0.007774f, 0.008911f, 0.010277f, 0.011475f, 0.013542f, 0.015732f, - 0.018417f, 0.022049f, 0.026154f, 0.031189f, 0.038269f, 0.047119f, 0.059265f, 0.075256f, - 0.097534f, 0.128906f, 0.172119f, 0.231934f, 0.311035f, 0.407715f, 0.513184f, 0.615723f, - 0.703613f, 0.773926f, 0.827637f, 0.867188f, 0.897461f, 0.919434f, 0.936035f, 0.948730f, - 0.958984f, 0.966309f, 0.988770f, 0.989746f, 0.989746f, 0.990234f, 0.989746f, 0.989746f, - 0.000000f, 0.000028f, 0.000093f, 0.000334f, 0.000465f, 0.000472f, 0.000373f, 0.000685f, - 0.000695f, 0.001027f, 0.001128f, 0.001155f, 0.001419f, 0.001435f, 0.001760f, 0.001850f, - 0.002241f, 0.002373f, 0.002604f, 0.002821f, 0.003334f, 0.003666f, 0.004139f, 0.004627f, - 0.005207f, 0.005886f, 0.006596f, 0.007580f, 0.008705f, 0.009911f, 0.011520f, 0.013237f, - 0.015427f, 0.017944f, 0.021423f, 0.025497f, 0.030945f, 0.037537f, 0.046692f, 0.058624f, - 0.075317f, 0.098267f, 0.130493f, 0.176025f, 0.239136f, 0.323242f, 0.424561f, 0.533691f, - 0.636230f, 0.723145f, 0.790039f, 0.841797f, 0.880371f, 0.906738f, 0.926758f, 0.941406f, - 0.953613f, 0.963379f, 0.987793f, 0.988770f, 0.988770f, 0.989258f, 0.989258f, 0.989258f, - 0.000000f, 0.000000f, 0.000047f, 0.000321f, 0.000332f, 0.000351f, 0.000470f, 0.000596f, - 0.000655f, 0.000727f, 0.001008f, 0.001112f, 0.001350f, 0.001379f, 0.001380f, 0.001751f, - 0.002008f, 0.002151f, 0.002327f, 0.002548f, 0.002691f, 0.003056f, 0.003475f, 0.003925f, - 0.004749f, 0.005161f, 0.005863f, 0.006538f, 0.007153f, 0.008453f, 0.009789f, 0.010986f, - 0.013168f, 0.015121f, 0.017563f, 0.020966f, 0.025009f, 0.030151f, 0.037048f, 0.046570f, - 0.058624f, 0.075623f, 0.099243f, 0.133667f, 0.181641f, 0.249756f, 0.338623f, 0.445312f, - 0.556641f, 0.659180f, 0.744141f, 0.808594f, 0.855957f, 0.890137f, 0.916992f, 0.934570f, - 0.949219f, 0.959473f, 0.986816f, 0.987793f, 0.987793f, 0.987793f, 0.987793f, 0.988281f, - 0.000000f, 0.000000f, 0.000000f, 0.000244f, 0.000429f, 0.000440f, 0.000348f, 0.000592f, - 0.000606f, 0.000755f, 0.000690f, 0.000935f, 0.001172f, 0.001257f, 0.001368f, 0.001458f, - 0.001786f, 0.001809f, 0.002060f, 0.002274f, 0.002478f, 0.002642f, 0.002987f, 0.003435f, - 0.003866f, 0.004337f, 0.005066f, 0.005409f, 0.006355f, 0.007111f, 0.008011f, 0.009392f, - 0.011032f, 0.012321f, 0.014717f, 0.017319f, 0.020432f, 0.024551f, 0.029953f, 0.036835f, - 0.045929f, 0.058716f, 0.076416f, 0.101562f, 0.137695f, 0.189453f, 0.262451f, 0.358154f, - 0.470215f, 0.584961f, 0.686523f, 0.767578f, 0.828125f, 0.871582f, 0.903809f, 0.926270f, - 0.941895f, 0.956055f, 0.985352f, 0.986328f, 0.986816f, 0.986816f, 0.986816f, 0.986816f, - 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000237f, 0.000314f, 0.000570f, 0.000575f, - 0.000583f, 0.000632f, 0.000651f, 0.000789f, 0.000947f, 0.001097f, 0.001300f, 0.001320f, - 0.001384f, 0.001443f, 0.001641f, 0.001869f, 0.002047f, 0.002396f, 0.002634f, 0.003025f, - 0.003412f, 0.003757f, 0.004238f, 0.004620f, 0.005463f, 0.006168f, 0.007072f, 0.008080f, - 0.009155f, 0.010590f, 0.012306f, 0.014175f, 0.016769f, 0.020081f, 0.023972f, 0.029495f, - 0.036560f, 0.045959f, 0.059265f, 0.078125f, 0.104797f, 0.143677f, 0.199951f, 0.279785f, - 0.382812f, 0.500977f, 0.616699f, 0.716309f, 0.791992f, 0.847168f, 0.887207f, 0.915527f, - 0.936523f, 0.950684f, 0.984375f, 0.985352f, 0.986328f, 0.985840f, 0.986328f, 0.985840f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000205f, 0.000239f, 0.000299f, 0.000537f, - 0.000574f, 0.000696f, 0.000583f, 0.000740f, 0.000778f, 0.000867f, 0.001013f, 0.001257f, - 0.001325f, 0.001277f, 0.001416f, 0.001718f, 0.001965f, 0.002079f, 0.002356f, 0.002577f, - 0.002771f, 0.003305f, 0.003693f, 0.004028f, 0.004593f, 0.005234f, 0.005905f, 0.006802f, - 0.007698f, 0.008553f, 0.009995f, 0.011635f, 0.013824f, 0.016174f, 0.019547f, 0.023544f, - 0.029114f, 0.036377f, 0.046417f, 0.060211f, 0.080017f, 0.108643f, 0.151611f, 0.213379f, - 0.301758f, 0.414062f, 0.537598f, 0.653320f, 0.748047f, 0.817871f, 0.868164f, 0.903320f, - 0.928711f, 0.945801f, 0.982910f, 0.983887f, 0.984375f, 0.984375f, 0.984863f, 0.984375f, - 0.000000f, 0.000000f, 0.000045f, 0.000105f, 0.000114f, 0.000340f, 0.000371f, 0.000501f, - 0.000639f, 0.000554f, 0.000687f, 0.000675f, 0.000711f, 0.000738f, 0.000824f, 0.001092f, - 0.001040f, 0.001185f, 0.001212f, 0.001408f, 0.001624f, 0.001813f, 0.001982f, 0.002182f, - 0.002634f, 0.002748f, 0.003252f, 0.003540f, 0.004089f, 0.004505f, 0.005001f, 0.005657f, - 0.006500f, 0.007195f, 0.008286f, 0.009750f, 0.011208f, 0.013420f, 0.015762f, 0.019226f, - 0.023209f, 0.029144f, 0.036591f, 0.047150f, 0.061615f, 0.082947f, 0.114014f, 0.161621f, - 0.231323f, 0.329834f, 0.451416f, 0.579590f, 0.692871f, 0.780273f, 0.844238f, 0.888184f, - 0.917969f, 0.939453f, 0.981445f, 0.982422f, 0.982910f, 0.982910f, 0.982910f, 0.982910f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000208f, 0.000311f, 0.000238f, 0.000337f, - 0.000524f, 0.000617f, 0.000533f, 0.000675f, 0.000665f, 0.000776f, 0.000840f, 0.000819f, - 0.000902f, 0.001169f, 0.001130f, 0.001178f, 0.001382f, 0.001571f, 0.001941f, 0.001932f, - 0.002138f, 0.002306f, 0.002586f, 0.002937f, 0.003468f, 0.003740f, 0.004292f, 0.004704f, - 0.005444f, 0.006081f, 0.007019f, 0.008255f, 0.009521f, 0.010796f, 0.012840f, 0.015503f, - 0.018784f, 0.023178f, 0.029129f, 0.036774f, 0.047699f, 0.063416f, 0.086548f, 0.121399f, - 0.175293f, 0.254883f, 0.365234f, 0.496582f, 0.626953f, 0.733398f, 0.813477f, 0.869629f, - 0.906738f, 0.933105f, 0.979980f, 0.980957f, 0.981445f, 0.981445f, 0.980957f, 0.981445f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000208f, 0.000312f, 0.000236f, - 0.000343f, 0.000475f, 0.000496f, 0.000528f, 0.000659f, 0.000582f, 0.000685f, 0.000710f, - 0.000761f, 0.000784f, 0.000941f, 0.001013f, 0.001117f, 0.001339f, 0.001500f, 0.001623f, - 0.001769f, 0.002039f, 0.002298f, 0.002565f, 0.002802f, 0.003119f, 0.003471f, 0.003857f, - 0.004658f, 0.005177f, 0.005836f, 0.006752f, 0.007324f, 0.008911f, 0.010422f, 0.012527f, - 0.015373f, 0.018585f, 0.022964f, 0.029037f, 0.037231f, 0.049072f, 0.066345f, 0.091492f, - 0.131470f, 0.193359f, 0.285645f, 0.409912f, 0.548828f, 0.676758f, 0.776367f, 0.845703f, - 0.893066f, 0.924805f, 0.978027f, 0.979492f, 0.979492f, 0.979004f, 0.979492f, 0.979492f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000166f, 0.000228f, 0.000227f, - 0.000369f, 0.000337f, 0.000368f, 0.000452f, 0.000500f, 0.000547f, 0.000543f, 0.000575f, - 0.000623f, 0.000723f, 0.000783f, 0.000874f, 0.001141f, 0.001226f, 0.001279f, 0.001336f, - 0.001499f, 0.001655f, 0.001922f, 0.002090f, 0.002453f, 0.002298f, 0.003139f, 0.003181f, - 0.003674f, 0.004166f, 0.004814f, 0.005447f, 0.006348f, 0.007179f, 0.008736f, 0.010406f, - 0.012321f, 0.014984f, 0.018219f, 0.022934f, 0.028824f, 0.037598f, 0.050476f, 0.069397f, - 0.098694f, 0.144775f, 0.218018f, 0.325439f, 0.464111f, 0.607910f, 0.729492f, 0.817383f, - 0.876953f, 0.915527f, 0.976562f, 0.977539f, 0.977539f, 0.977051f, 0.977051f, 0.977539f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000154f, 0.000200f, - 0.000267f, 0.000316f, 0.000324f, 0.000449f, 0.000319f, 0.000379f, 0.000515f, 0.000519f, - 0.000558f, 0.000628f, 0.000645f, 0.000690f, 0.000777f, 0.000940f, 0.001096f, 0.001204f, - 0.001278f, 0.001485f, 0.001670f, 0.001929f, 0.001961f, 0.002016f, 0.002367f, 0.002785f, - 0.003025f, 0.003248f, 0.003805f, 0.004539f, 0.004845f, 0.005733f, 0.006851f, 0.008278f, - 0.010017f, 0.011841f, 0.014542f, 0.017807f, 0.022705f, 0.029190f, 0.038544f, 0.052612f, - 0.073853f, 0.108093f, 0.162842f, 0.250977f, 0.377930f, 0.529785f, 0.672363f, 0.782715f, - 0.855957f, 0.904297f, 0.973145f, 0.974121f, 0.974609f, 0.975586f, 0.974609f, 0.975098f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000158f, 0.000121f, - 0.000190f, 0.000238f, 0.000397f, 0.000354f, 0.000364f, 0.000365f, 0.000440f, 0.000474f, - 0.000509f, 0.000612f, 0.000611f, 0.000648f, 0.000804f, 0.000755f, 0.000943f, 0.001050f, - 0.001221f, 0.001340f, 0.001338f, 0.001443f, 0.001635f, 0.001822f, 0.002083f, 0.002226f, - 0.002480f, 0.002682f, 0.003185f, 0.003609f, 0.003948f, 0.005074f, 0.005558f, 0.006741f, - 0.007904f, 0.009384f, 0.011360f, 0.014000f, 0.017883f, 0.022675f, 0.029648f, 0.039917f, - 0.055695f, 0.080261f, 0.120728f, 0.188354f, 0.296143f, 0.443848f, 0.603027f, 0.737793f, - 0.831055f, 0.891113f, 0.970703f, 0.971680f, 0.972168f, 0.972656f, 0.971680f, 0.972168f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, - 0.000121f, 0.000251f, 0.000260f, 0.000278f, 0.000315f, 0.000334f, 0.000235f, 0.000357f, - 0.000442f, 0.000513f, 0.000504f, 0.000598f, 0.000556f, 0.000771f, 0.000831f, 0.000886f, - 0.000977f, 0.001145f, 0.001105f, 0.001244f, 0.001281f, 0.001431f, 0.001544f, 0.001850f, - 0.001986f, 0.002131f, 0.002537f, 0.002737f, 0.003252f, 0.003826f, 0.004555f, 0.005184f, - 0.006199f, 0.007195f, 0.009041f, 0.011337f, 0.013878f, 0.017395f, 0.022552f, 0.030502f, - 0.041962f, 0.059875f, 0.089111f, 0.139404f, 0.224609f, 0.357910f, 0.524902f, 0.684082f, - 0.800781f, 0.875977f, 0.967773f, 0.968750f, 0.968262f, 0.968750f, 0.969238f, 0.969238f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000095f, 0.000081f, 0.000217f, 0.000149f, 0.000204f, 0.000212f, 0.000338f, - 0.000345f, 0.000348f, 0.000456f, 0.000463f, 0.000495f, 0.000570f, 0.000583f, 0.000748f, - 0.000799f, 0.000731f, 0.000965f, 0.001041f, 0.001071f, 0.001210f, 0.001318f, 0.001238f, - 0.001410f, 0.001631f, 0.001932f, 0.002327f, 0.002577f, 0.003057f, 0.003452f, 0.003956f, - 0.004639f, 0.005714f, 0.006817f, 0.008446f, 0.010605f, 0.013443f, 0.017319f, 0.022964f, - 0.031021f, 0.044281f, 0.065857f, 0.102112f, 0.166504f, 0.277344f, 0.439941f, 0.617188f, - 0.762207f, 0.856445f, 0.963379f, 0.964355f, 0.965332f, 0.964844f, 0.965332f, 0.965332f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000107f, 0.000091f, 0.000161f, 0.000119f, 0.000184f, 0.000266f, 0.000284f, - 0.000314f, 0.000319f, 0.000334f, 0.000344f, 0.000565f, 0.000455f, 0.000488f, 0.000667f, - 0.000710f, 0.000713f, 0.000787f, 0.000755f, 0.000849f, 0.000972f, 0.001097f, 0.001286f, - 0.001427f, 0.001556f, 0.001667f, 0.001687f, 0.002155f, 0.002369f, 0.002674f, 0.003086f, - 0.003710f, 0.004536f, 0.005585f, 0.006783f, 0.007957f, 0.010262f, 0.013115f, 0.017212f, - 0.023102f, 0.032715f, 0.047943f, 0.074158f, 0.121155f, 0.207520f, 0.353027f, 0.541504f, - 0.715332f, 0.834473f, 0.959473f, 0.960449f, 0.960938f, 0.960938f, 0.960938f, 0.961426f, - 0.000000f, 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000120f, 0.000120f, 0.000103f, 0.000089f, 0.000077f, 0.000080f, 0.000121f, 0.000218f, - 0.000209f, 0.000245f, 0.000303f, 0.000316f, 0.000388f, 0.000341f, 0.000549f, 0.000594f, - 0.000604f, 0.000679f, 0.000625f, 0.000628f, 0.000795f, 0.000883f, 0.000857f, 0.000991f, - 0.001166f, 0.000955f, 0.001194f, 0.001347f, 0.001548f, 0.001804f, 0.002048f, 0.002388f, - 0.002911f, 0.003130f, 0.003933f, 0.004845f, 0.006031f, 0.007385f, 0.009705f, 0.012688f, - 0.017044f, 0.023788f, 0.034882f, 0.053284f, 0.086670f, 0.151123f, 0.271484f, 0.457031f, - 0.658203f, 0.805176f, 0.954102f, 0.955078f, 0.956055f, 0.956055f, 0.956055f, 0.955566f, - 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, - 0.000120f, 0.000120f, 0.000116f, 0.000101f, 0.000088f, 0.000077f, 0.000131f, 0.000071f, - 0.000146f, 0.000200f, 0.000237f, 0.000270f, 0.000289f, 0.000302f, 0.000311f, 0.000441f, - 0.000396f, 0.000588f, 0.000630f, 0.000570f, 0.000575f, 0.000537f, 0.000589f, 0.000750f, - 0.000721f, 0.001048f, 0.001122f, 0.000951f, 0.001243f, 0.001346f, 0.001703f, 0.001592f, - 0.001880f, 0.002340f, 0.002804f, 0.003637f, 0.004356f, 0.005329f, 0.006805f, 0.009094f, - 0.012566f, 0.017181f, 0.025040f, 0.038147f, 0.061249f, 0.107788f, 0.200195f, 0.369629f, - 0.587891f, 0.771973f, 0.948242f, 0.949707f, 0.950195f, 0.949707f, 0.950195f, 0.950195f, - 0.000000f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000120f, - 0.000120f, 0.000119f, 0.000119f, 0.000114f, 0.000101f, 0.000088f, 0.000079f, 0.000070f, - 0.000063f, 0.000136f, 0.000136f, 0.000183f, 0.000207f, 0.000277f, 0.000271f, 0.000291f, - 0.000369f, 0.000344f, 0.000494f, 0.000459f, 0.000515f, 0.000509f, 0.000532f, 0.000504f, - 0.000716f, 0.000589f, 0.000691f, 0.000902f, 0.000972f, 0.000968f, 0.001067f, 0.001483f, - 0.001780f, 0.001652f, 0.002090f, 0.002602f, 0.003113f, 0.003738f, 0.004738f, 0.006420f, - 0.008522f, 0.012100f, 0.017334f, 0.026489f, 0.042786f, 0.074524f, 0.142578f, 0.283936f, - 0.509277f, 0.729492f, 0.940918f, 0.941895f, 0.942383f, 0.942383f, 0.942383f, 0.942871f, - 0.000122f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000120f, 0.000119f, 0.000119f, - 0.000119f, 0.000118f, 0.000118f, 0.000118f, 0.000116f, 0.000102f, 0.000090f, 0.000081f, - 0.000091f, 0.000066f, 0.000059f, 0.000110f, 0.000109f, 0.000155f, 0.000184f, 0.000227f, - 0.000297f, 0.000333f, 0.000355f, 0.000349f, 0.000344f, 0.000421f, 0.000459f, 0.000561f, - 0.000600f, 0.000563f, 0.000630f, 0.000563f, 0.000682f, 0.000737f, 0.000892f, 0.001037f, - 0.001026f, 0.001163f, 0.001743f, 0.001782f, 0.002117f, 0.002573f, 0.003389f, 0.004429f, - 0.005871f, 0.007942f, 0.011841f, 0.018066f, 0.029190f, 0.050842f, 0.098511f, 0.207397f, - 0.422363f, 0.677734f, 0.932129f, 0.933594f, 0.933594f, 0.934082f, 0.934082f, 0.934082f, - 0.000000f, 0.000121f, 0.000120f, 0.000119f, 0.000119f, 0.000119f, 0.000118f, 0.000118f, - 0.000118f, 0.000117f, 0.000117f, 0.000117f, 0.000117f, 0.000116f, 0.000104f, 0.000093f, - 0.000084f, 0.000076f, 0.000069f, 0.000091f, 0.000057f, 0.000051f, 0.000112f, 0.000120f, - 0.000179f, 0.000232f, 0.000225f, 0.000283f, 0.000301f, 0.000308f, 0.000353f, 0.000437f, - 0.000395f, 0.000523f, 0.000486f, 0.000504f, 0.000469f, 0.000614f, 0.000581f, 0.000755f, - 0.000789f, 0.001121f, 0.000981f, 0.001218f, 0.001565f, 0.001795f, 0.002296f, 0.002958f, - 0.003866f, 0.005329f, 0.007675f, 0.011658f, 0.019043f, 0.033478f, 0.065430f, 0.144043f, - 0.331299f, 0.613770f, 0.921387f, 0.922852f, 0.923340f, 0.923340f, 0.923340f, 0.923340f, - 0.000000f, 0.000000f, 0.000119f, 0.000118f, 0.000118f, 0.000117f, 0.000116f, 0.000116f, - 0.000116f, 0.000116f, 0.000115f, 0.000115f, 0.000115f, 0.000115f, 0.000114f, 0.000108f, - 0.000097f, 0.000087f, 0.000079f, 0.000072f, 0.000065f, 0.000060f, 0.000094f, 0.000050f, - 0.000104f, 0.000104f, 0.000121f, 0.000164f, 0.000195f, 0.000247f, 0.000265f, 0.000328f, - 0.000290f, 0.000355f, 0.000395f, 0.000356f, 0.000361f, 0.000459f, 0.000470f, 0.000515f, - 0.000580f, 0.000624f, 0.000751f, 0.000964f, 0.001105f, 0.001279f, 0.001413f, 0.001823f, - 0.002441f, 0.003407f, 0.004852f, 0.007210f, 0.011803f, 0.021225f, 0.041473f, 0.095032f, - 0.244019f, 0.537598f, 0.907715f, 0.910156f, 0.910156f, 0.909180f, 0.909668f, 0.911133f, - 0.000120f, 0.000118f, 0.000117f, 0.000116f, 0.000114f, 0.000114f, 0.000114f, 0.000113f, - 0.000113f, 0.000112f, 0.000112f, 0.000112f, 0.000111f, 0.000112f, 0.000111f, 0.000111f, - 0.000111f, 0.000101f, 0.000093f, 0.000084f, 0.000077f, 0.000070f, 0.000064f, 0.000059f, - 0.000074f, 0.000079f, 0.000059f, 0.000087f, 0.000097f, 0.000128f, 0.000185f, 0.000213f, - 0.000265f, 0.000235f, 0.000239f, 0.000288f, 0.000299f, 0.000371f, 0.000341f, 0.000369f, - 0.000460f, 0.000446f, 0.000490f, 0.000602f, 0.000694f, 0.000904f, 0.001012f, 0.001234f, - 0.001544f, 0.002096f, 0.002989f, 0.004299f, 0.006840f, 0.012383f, 0.024948f, 0.059204f, - 0.166626f, 0.452637f, 0.892578f, 0.894043f, 0.894043f, 0.894531f, 0.894531f, 0.894043f, - 0.000115f, 0.000107f, 0.000108f, 0.000111f, 0.000108f, 0.000109f, 0.000108f, 0.000108f, - 0.000108f, 0.000107f, 0.000108f, 0.000107f, 0.000107f, 0.000106f, 0.000107f, 0.000107f, - 0.000106f, 0.000107f, 0.000106f, 0.000097f, 0.000090f, 0.000082f, 0.000075f, 0.000069f, - 0.000063f, 0.000058f, 0.000053f, 0.000070f, 0.000073f, 0.000085f, 0.000077f, 0.000088f, - 0.000136f, 0.000168f, 0.000190f, 0.000204f, 0.000199f, 0.000252f, 0.000233f, 0.000270f, - 0.000325f, 0.000295f, 0.000348f, 0.000383f, 0.000435f, 0.000534f, 0.000581f, 0.000803f, - 0.001004f, 0.001330f, 0.001812f, 0.002489f, 0.003944f, 0.006832f, 0.013748f, 0.033997f, - 0.104858f, 0.356689f, 0.873047f, 0.873047f, 0.875000f, 0.874023f, 0.874023f, 0.874023f, - 0.000000f, 0.000071f, 0.000063f, 0.000094f, 0.000092f, 0.000094f, 0.000093f, 0.000098f, - 0.000098f, 0.000098f, 0.000098f, 0.000099f, 0.000098f, 0.000099f, 0.000099f, 0.000099f, - 0.000099f, 0.000099f, 0.000099f, 0.000100f, 0.000100f, 0.000094f, 0.000087f, 0.000080f, - 0.000074f, 0.000068f, 0.000062f, 0.000058f, 0.000053f, 0.000049f, 0.000059f, 0.000059f, - 0.000045f, 0.000078f, 0.000082f, 0.000118f, 0.000155f, 0.000160f, 0.000174f, 0.000180f, - 0.000226f, 0.000213f, 0.000248f, 0.000258f, 0.000288f, 0.000352f, 0.000396f, 0.000465f, - 0.000566f, 0.000789f, 0.000941f, 0.001343f, 0.002199f, 0.003616f, 0.006912f, 0.017380f, - 0.058960f, 0.259521f, 0.847656f, 0.849121f, 0.850586f, 0.850098f, 0.849121f, 0.850586f, - 0.000000f, 0.000000f, 0.000019f, 0.000044f, 0.000048f, 0.000061f, 0.000071f, 0.000073f, - 0.000076f, 0.000079f, 0.000079f, 0.000082f, 0.000082f, 0.000082f, 0.000085f, 0.000086f, - 0.000087f, 0.000086f, 0.000088f, 0.000087f, 0.000089f, 0.000089f, 0.000089f, 0.000090f, - 0.000084f, 0.000078f, 0.000072f, 0.000067f, 0.000062f, 0.000057f, 0.000052f, 0.000049f, - 0.000045f, 0.000041f, 0.000038f, 0.000040f, 0.000062f, 0.000092f, 0.000100f, 0.000121f, - 0.000144f, 0.000133f, 0.000137f, 0.000170f, 0.000181f, 0.000168f, 0.000215f, 0.000286f, - 0.000327f, 0.000397f, 0.000504f, 0.000738f, 0.001039f, 0.001729f, 0.003317f, 0.007721f, - 0.028458f, 0.166626f, 0.815430f, 0.818359f, 0.818359f, 0.817383f, 0.818848f, 0.818359f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000008f, - 0.000016f, 0.000031f, 0.000035f, 0.000048f, 0.000050f, 0.000053f, 0.000058f, 0.000059f, - 0.000063f, 0.000064f, 0.000067f, 0.000067f, 0.000070f, 0.000071f, 0.000072f, 0.000073f, - 0.000075f, 0.000075f, 0.000076f, 0.000075f, 0.000069f, 0.000064f, 0.000060f, 0.000055f, - 0.000051f, 0.000047f, 0.000043f, 0.000040f, 0.000037f, 0.000034f, 0.000040f, 0.000041f, - 0.000054f, 0.000069f, 0.000096f, 0.000111f, 0.000109f, 0.000113f, 0.000142f, 0.000136f, - 0.000158f, 0.000196f, 0.000237f, 0.000349f, 0.000423f, 0.000744f, 0.001380f, 0.003214f, - 0.011124f, 0.088135f, 0.777344f, 0.779297f, 0.780273f, 0.779785f, 0.779785f, 0.779785f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000003f, 0.000007f, - 0.000021f, 0.000023f, 0.000031f, 0.000034f, 0.000038f, 0.000041f, 0.000043f, 0.000047f, - 0.000049f, 0.000050f, 0.000053f, 0.000055f, 0.000056f, 0.000057f, 0.000059f, 0.000060f, - 0.000055f, 0.000051f, 0.000048f, 0.000044f, 0.000041f, 0.000038f, 0.000035f, 0.000032f, - 0.000029f, 0.000028f, 0.000028f, 0.000037f, 0.000044f, 0.000064f, 0.000078f, 0.000072f, - 0.000089f, 0.000098f, 0.000104f, 0.000146f, 0.000200f, 0.000272f, 0.000479f, 0.001077f, - 0.003733f, 0.033752f, 0.729492f, 0.730957f, 0.732422f, 0.731934f, 0.732422f, 0.732422f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000002f, - 0.000006f, 0.000009f, 0.000013f, 0.000019f, 0.000021f, 0.000025f, 0.000027f, 0.000030f, - 0.000033f, 0.000034f, 0.000037f, 0.000039f, 0.000041f, 0.000039f, 0.000036f, 0.000033f, - 0.000031f, 0.000028f, 0.000026f, 0.000024f, 0.000021f, 0.000019f, 0.000017f, 0.000023f, - 0.000033f, 0.000041f, 0.000043f, 0.000058f, 0.000061f, 0.000081f, 0.000121f, 0.000248f, - 0.000821f, 0.008255f, 0.673340f, 0.674805f, 0.674316f, 0.674805f, 0.674805f, 0.673828f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000004f, 0.000006f, 0.000010f, 0.000013f, - 0.000015f, 0.000017f, 0.000020f, 0.000022f, 0.000021f, 0.000019f, 0.000017f, 0.000015f, - 0.000013f, 0.000012f, 0.000010f, 0.000011f, 0.000016f, 0.000019f, 0.000019f, 0.000036f, - 0.000090f, 0.000897f, 0.606934f, 0.609863f, 0.609375f, 0.609863f, 0.609863f, 0.610352f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000001f, 0.000003f, 0.000006f, 0.000005f, 0.000004f, 0.000003f, - 0.000004f, 0.000008f, 0.534668f, 0.536621f, 0.537109f, 0.537109f, 0.536621f, 0.536621f, - }, - { - 0.149292f, 0.432373f, 0.614258f, 0.719238f, 0.784180f, 0.826660f, 0.856934f, 0.879883f, - 0.896484f, 0.909180f, 0.919922f, 0.928711f, 0.936035f, 0.942383f, 0.947266f, 0.952148f, - 0.956055f, 0.959473f, 0.962891f, 0.965820f, 0.968262f, 0.970703f, 0.972656f, 0.974609f, - 0.976562f, 0.978027f, 0.979492f, 0.980469f, 0.981934f, 0.983398f, 0.984863f, 0.985352f, - 0.986328f, 0.987305f, 0.988281f, 0.989258f, 0.989746f, 0.990234f, 0.990723f, 0.991699f, - 0.992676f, 0.993164f, 0.993652f, 0.993652f, 0.994629f, 0.995117f, 0.995117f, 0.996094f, - 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999023f, - 0.040161f, 0.161255f, 0.324951f, 0.486572f, 0.612305f, 0.704590f, 0.767090f, 0.811523f, - 0.844238f, 0.868652f, 0.887695f, 0.902344f, 0.913574f, 0.924316f, 0.932129f, 0.937988f, - 0.944336f, 0.949707f, 0.954102f, 0.957520f, 0.960938f, 0.964355f, 0.966797f, 0.969727f, - 0.971191f, 0.973633f, 0.975586f, 0.977539f, 0.979004f, 0.980469f, 0.981445f, 0.982910f, - 0.983887f, 0.985352f, 0.985840f, 0.987305f, 0.987793f, 0.988770f, 0.989258f, 0.990234f, - 0.991211f, 0.992188f, 0.992676f, 0.993164f, 0.993164f, 0.993652f, 0.994141f, 0.995117f, - 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998535f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999023f, - 0.017395f, 0.068542f, 0.149292f, 0.262451f, 0.392822f, 0.518066f, 0.621582f, 0.700195f, - 0.759766f, 0.803711f, 0.836426f, 0.862305f, 0.880859f, 0.896484f, 0.909668f, 0.919434f, - 0.929199f, 0.935547f, 0.941895f, 0.947754f, 0.952637f, 0.956055f, 0.959961f, 0.963867f, - 0.965820f, 0.968750f, 0.970703f, 0.973145f, 0.975098f, 0.977051f, 0.979004f, 0.979980f, - 0.981934f, 0.983398f, 0.983887f, 0.984863f, 0.985840f, 0.986816f, 0.987793f, 0.989258f, - 0.989746f, 0.990234f, 0.991211f, 0.991699f, 0.992188f, 0.992676f, 0.993652f, 0.994141f, - 0.994629f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, - 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999023f, - 0.009125f, 0.035492f, 0.075806f, 0.135864f, 0.219971f, 0.324707f, 0.437012f, 0.543457f, - 0.633789f, 0.704102f, 0.758789f, 0.802246f, 0.833496f, 0.857910f, 0.878418f, 0.894043f, - 0.906738f, 0.917480f, 0.925781f, 0.933594f, 0.940918f, 0.946777f, 0.951172f, 0.954590f, - 0.959473f, 0.962891f, 0.965820f, 0.968262f, 0.971191f, 0.973145f, 0.975098f, 0.976562f, - 0.978516f, 0.979980f, 0.981445f, 0.982422f, 0.983887f, 0.985840f, 0.986328f, 0.987305f, - 0.988281f, 0.988770f, 0.989746f, 0.990234f, 0.991699f, 0.992188f, 0.992676f, 0.993652f, - 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.997559f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.005848f, 0.021225f, 0.043640f, 0.076782f, 0.124084f, 0.189575f, 0.274414f, 0.372559f, - 0.473633f, 0.567383f, 0.646973f, 0.711426f, 0.761230f, 0.801758f, 0.833496f, 0.857422f, - 0.876953f, 0.893066f, 0.905273f, 0.916504f, 0.925293f, 0.932617f, 0.939941f, 0.945801f, - 0.950684f, 0.955566f, 0.958984f, 0.962402f, 0.965820f, 0.968262f, 0.970703f, 0.972656f, - 0.975098f, 0.977051f, 0.978516f, 0.980469f, 0.981934f, 0.982422f, 0.983887f, 0.985840f, - 0.986328f, 0.987305f, 0.988281f, 0.989258f, 0.989746f, 0.990723f, 0.991211f, 0.992188f, - 0.993164f, 0.993652f, 0.994629f, 0.995117f, 0.995117f, 0.996094f, 0.996094f, 0.997070f, - 0.997559f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.998535f, 0.998535f, - 0.003937f, 0.014107f, 0.027664f, 0.047211f, 0.075195f, 0.113953f, 0.166748f, 0.236328f, - 0.320312f, 0.412354f, 0.504395f, 0.589844f, 0.661621f, 0.719727f, 0.768066f, 0.805664f, - 0.834961f, 0.858398f, 0.877441f, 0.893066f, 0.906738f, 0.916992f, 0.926270f, 0.933105f, - 0.940430f, 0.946289f, 0.951172f, 0.955566f, 0.959473f, 0.962891f, 0.965820f, 0.968262f, - 0.970703f, 0.973145f, 0.975098f, 0.977051f, 0.979004f, 0.980469f, 0.981934f, 0.983398f, - 0.984375f, 0.985840f, 0.986328f, 0.987305f, 0.988770f, 0.989746f, 0.990723f, 0.991211f, - 0.992188f, 0.992676f, 0.993652f, 0.994629f, 0.994629f, 0.995117f, 0.995605f, 0.995605f, - 0.996582f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.998535f, 0.998535f, - 0.002962f, 0.009674f, 0.019348f, 0.031708f, 0.049255f, 0.072754f, 0.105164f, 0.149048f, - 0.206665f, 0.278076f, 0.361572f, 0.448730f, 0.534668f, 0.611816f, 0.677734f, 0.730957f, - 0.775879f, 0.809570f, 0.837891f, 0.861328f, 0.879395f, 0.894531f, 0.907227f, 0.916992f, - 0.926270f, 0.934082f, 0.940918f, 0.946289f, 0.951172f, 0.956055f, 0.959473f, 0.962891f, - 0.966797f, 0.969238f, 0.971191f, 0.973633f, 0.976074f, 0.977539f, 0.979492f, 0.980957f, - 0.982422f, 0.983398f, 0.984863f, 0.986328f, 0.986816f, 0.988281f, 0.989746f, 0.989746f, - 0.991211f, 0.991699f, 0.992676f, 0.993164f, 0.994141f, 0.994629f, 0.994629f, 0.995605f, - 0.996094f, 0.997070f, 0.998535f, 0.999023f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.001900f, 0.007225f, 0.013733f, 0.022552f, 0.033661f, 0.049164f, 0.070374f, 0.097534f, - 0.135132f, 0.183350f, 0.244507f, 0.317871f, 0.400146f, 0.483643f, 0.562988f, 0.633301f, - 0.693848f, 0.743652f, 0.784180f, 0.816895f, 0.842773f, 0.865234f, 0.882812f, 0.896973f, - 0.908691f, 0.919434f, 0.927734f, 0.935547f, 0.942383f, 0.947266f, 0.952637f, 0.957031f, - 0.960938f, 0.964355f, 0.967285f, 0.969727f, 0.971680f, 0.974609f, 0.976074f, 0.978027f, - 0.979980f, 0.981445f, 0.982910f, 0.984375f, 0.985840f, 0.986328f, 0.988281f, 0.988770f, - 0.989746f, 0.990723f, 0.991699f, 0.992188f, 0.993164f, 0.993652f, 0.994629f, 0.995117f, - 0.995605f, 0.996094f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998047f, - 0.001921f, 0.005543f, 0.010223f, 0.016312f, 0.024918f, 0.035217f, 0.049164f, 0.067017f, - 0.091125f, 0.122986f, 0.164673f, 0.217896f, 0.282471f, 0.356934f, 0.436768f, 0.516602f, - 0.590820f, 0.656250f, 0.711426f, 0.757812f, 0.794922f, 0.825684f, 0.850098f, 0.870605f, - 0.885742f, 0.900879f, 0.912109f, 0.921387f, 0.929688f, 0.937500f, 0.943848f, 0.949219f, - 0.953125f, 0.958496f, 0.961426f, 0.964844f, 0.967773f, 0.970703f, 0.973145f, 0.975098f, - 0.977539f, 0.979004f, 0.980957f, 0.982422f, 0.983887f, 0.985352f, 0.986328f, 0.987793f, - 0.988770f, 0.989258f, 0.990723f, 0.991211f, 0.992188f, 0.993164f, 0.993652f, 0.994141f, - 0.994629f, 0.995117f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998047f, 0.998047f, - 0.001360f, 0.004257f, 0.007988f, 0.013092f, 0.018753f, 0.026352f, 0.035645f, 0.048096f, - 0.064270f, 0.085449f, 0.113770f, 0.149292f, 0.195190f, 0.251953f, 0.320557f, 0.395020f, - 0.474121f, 0.549316f, 0.618652f, 0.678223f, 0.729492f, 0.770996f, 0.805176f, 0.833496f, - 0.855957f, 0.875977f, 0.891113f, 0.904785f, 0.915039f, 0.924316f, 0.933105f, 0.939453f, - 0.945312f, 0.950684f, 0.955078f, 0.959473f, 0.962891f, 0.966309f, 0.969727f, 0.972168f, - 0.974121f, 0.976562f, 0.978516f, 0.979980f, 0.981934f, 0.983398f, 0.984375f, 0.986328f, - 0.986816f, 0.988281f, 0.989746f, 0.990234f, 0.991699f, 0.992188f, 0.992676f, 0.994141f, - 0.994141f, 0.994629f, 0.998047f, 0.998047f, 0.998535f, 0.998047f, 0.998047f, 0.998047f, - 0.001075f, 0.003492f, 0.006275f, 0.010223f, 0.014473f, 0.019821f, 0.026581f, 0.035492f, - 0.046967f, 0.061829f, 0.080750f, 0.105164f, 0.136475f, 0.177246f, 0.227783f, 0.288818f, - 0.358154f, 0.433594f, 0.509277f, 0.581543f, 0.645508f, 0.701172f, 0.747070f, 0.783691f, - 0.817383f, 0.842773f, 0.864258f, 0.881836f, 0.896484f, 0.908691f, 0.918945f, 0.928223f, - 0.935547f, 0.941895f, 0.948730f, 0.952637f, 0.957031f, 0.962402f, 0.964844f, 0.967773f, - 0.970703f, 0.973633f, 0.975586f, 0.977539f, 0.979492f, 0.981445f, 0.982910f, 0.984375f, - 0.985840f, 0.986816f, 0.988281f, 0.988770f, 0.990234f, 0.991211f, 0.992188f, 0.992676f, - 0.993164f, 0.994141f, 0.997559f, 0.997559f, 0.998047f, 0.997559f, 0.997559f, 0.998047f, - 0.000967f, 0.002928f, 0.005283f, 0.007759f, 0.011612f, 0.015823f, 0.020966f, 0.027802f, - 0.035461f, 0.045959f, 0.059235f, 0.075928f, 0.097778f, 0.126099f, 0.162598f, 0.207153f, - 0.261963f, 0.326416f, 0.398193f, 0.471680f, 0.543945f, 0.612305f, 0.671875f, 0.722656f, - 0.765137f, 0.799805f, 0.828125f, 0.854004f, 0.872070f, 0.888184f, 0.902344f, 0.914062f, - 0.923340f, 0.931641f, 0.938965f, 0.945312f, 0.950684f, 0.955566f, 0.958984f, 0.962891f, - 0.966309f, 0.969727f, 0.972168f, 0.974609f, 0.977051f, 0.978516f, 0.980469f, 0.982422f, - 0.984375f, 0.985352f, 0.987305f, 0.987793f, 0.988770f, 0.990234f, 0.991211f, 0.992188f, - 0.992676f, 0.993164f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.997559f, 0.998047f, - 0.000602f, 0.002605f, 0.004345f, 0.006706f, 0.009590f, 0.012650f, 0.016617f, 0.021423f, - 0.027893f, 0.035004f, 0.044495f, 0.056610f, 0.072327f, 0.092285f, 0.116821f, 0.148926f, - 0.189697f, 0.238892f, 0.298340f, 0.365723f, 0.437988f, 0.511230f, 0.579590f, 0.642090f, - 0.698242f, 0.744141f, 0.781738f, 0.814453f, 0.840332f, 0.861816f, 0.880371f, 0.895996f, - 0.907715f, 0.918945f, 0.928223f, 0.935547f, 0.942871f, 0.948730f, 0.953125f, 0.958008f, - 0.961914f, 0.965332f, 0.968750f, 0.971680f, 0.973633f, 0.976562f, 0.978516f, 0.979980f, - 0.981934f, 0.983398f, 0.985352f, 0.986816f, 0.988281f, 0.988770f, 0.989746f, 0.990723f, - 0.991699f, 0.992676f, 0.997070f, 0.997559f, 0.997559f, 0.997070f, 0.997070f, 0.997070f, - 0.000607f, 0.001955f, 0.003616f, 0.005772f, 0.007656f, 0.010269f, 0.013496f, 0.017273f, - 0.022018f, 0.027466f, 0.034729f, 0.043488f, 0.054932f, 0.068359f, 0.086365f, 0.108765f, - 0.137939f, 0.174316f, 0.219360f, 0.273926f, 0.336670f, 0.406494f, 0.478516f, 0.549316f, - 0.614746f, 0.673340f, 0.722656f, 0.765137f, 0.800293f, 0.828125f, 0.853516f, 0.872070f, - 0.888672f, 0.902832f, 0.914551f, 0.924316f, 0.932129f, 0.940430f, 0.946289f, 0.951660f, - 0.956055f, 0.960449f, 0.964355f, 0.967773f, 0.970703f, 0.972656f, 0.975586f, 0.978027f, - 0.980469f, 0.981934f, 0.983398f, 0.985352f, 0.986328f, 0.988281f, 0.988770f, 0.990234f, - 0.990723f, 0.992188f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000600f, 0.001813f, 0.003101f, 0.004559f, 0.006580f, 0.008873f, 0.011047f, 0.014091f, - 0.017639f, 0.022049f, 0.027557f, 0.033997f, 0.042297f, 0.052704f, 0.065369f, 0.081238f, - 0.101929f, 0.127930f, 0.161255f, 0.202515f, 0.252686f, 0.311523f, 0.378174f, 0.449707f, - 0.519531f, 0.587891f, 0.647949f, 0.701660f, 0.746582f, 0.784668f, 0.817383f, 0.843262f, - 0.864746f, 0.882324f, 0.896973f, 0.910156f, 0.920898f, 0.929688f, 0.937012f, 0.943848f, - 0.949707f, 0.955078f, 0.959473f, 0.963379f, 0.966797f, 0.970215f, 0.973145f, 0.975098f, - 0.978027f, 0.980469f, 0.982422f, 0.983887f, 0.984863f, 0.986328f, 0.987793f, 0.988770f, - 0.989746f, 0.991211f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000604f, 0.001429f, 0.002676f, 0.003708f, 0.005745f, 0.006973f, 0.009270f, 0.011452f, - 0.014503f, 0.018295f, 0.022369f, 0.027222f, 0.033417f, 0.040833f, 0.050171f, 0.062744f, - 0.077454f, 0.095886f, 0.119995f, 0.150391f, 0.187622f, 0.234253f, 0.289307f, 0.353027f, - 0.421631f, 0.492676f, 0.561523f, 0.625488f, 0.681152f, 0.730469f, 0.770996f, 0.806152f, - 0.833984f, 0.857422f, 0.876465f, 0.893066f, 0.906250f, 0.916992f, 0.926758f, 0.935059f, - 0.942871f, 0.948242f, 0.954102f, 0.958496f, 0.962891f, 0.966309f, 0.969727f, 0.972168f, - 0.975098f, 0.977539f, 0.979492f, 0.981934f, 0.983398f, 0.984863f, 0.986328f, 0.987793f, - 0.989258f, 0.990234f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, - 0.000365f, 0.001367f, 0.002123f, 0.003353f, 0.004692f, 0.006054f, 0.007675f, 0.009819f, - 0.012314f, 0.014862f, 0.018066f, 0.022064f, 0.026901f, 0.032471f, 0.039764f, 0.048584f, - 0.060089f, 0.073730f, 0.090698f, 0.112854f, 0.140381f, 0.175415f, 0.218018f, 0.269775f, - 0.329834f, 0.396240f, 0.467285f, 0.537598f, 0.603516f, 0.662109f, 0.712891f, 0.757324f, - 0.793945f, 0.823730f, 0.849121f, 0.869629f, 0.887695f, 0.902344f, 0.914062f, 0.924805f, - 0.932129f, 0.940430f, 0.947266f, 0.952148f, 0.957031f, 0.962402f, 0.966309f, 0.969238f, - 0.972656f, 0.975586f, 0.977051f, 0.979492f, 0.981934f, 0.983398f, 0.984863f, 0.986328f, - 0.988281f, 0.988770f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, - 0.000356f, 0.001341f, 0.001913f, 0.002897f, 0.003983f, 0.005322f, 0.006607f, 0.008514f, - 0.010399f, 0.012451f, 0.015282f, 0.018356f, 0.021912f, 0.026443f, 0.031982f, 0.038635f, - 0.047150f, 0.057495f, 0.070007f, 0.086609f, 0.106689f, 0.131714f, 0.164429f, 0.203613f, - 0.252441f, 0.310059f, 0.374512f, 0.444092f, 0.514160f, 0.582031f, 0.643066f, 0.697266f, - 0.743652f, 0.783691f, 0.814941f, 0.842773f, 0.865234f, 0.882812f, 0.897949f, 0.910645f, - 0.922363f, 0.931152f, 0.938965f, 0.945801f, 0.952148f, 0.957520f, 0.961426f, 0.965820f, - 0.969727f, 0.972168f, 0.975098f, 0.977539f, 0.979980f, 0.981934f, 0.983887f, 0.985352f, - 0.986816f, 0.988281f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, - 0.000243f, 0.000937f, 0.001662f, 0.002617f, 0.003527f, 0.004555f, 0.005642f, 0.007217f, - 0.008820f, 0.010483f, 0.012383f, 0.015175f, 0.018341f, 0.022049f, 0.026245f, 0.031067f, - 0.037903f, 0.045563f, 0.054962f, 0.066956f, 0.082092f, 0.101074f, 0.124939f, 0.154663f, - 0.191528f, 0.237305f, 0.291992f, 0.354492f, 0.422852f, 0.492676f, 0.562012f, 0.625488f, - 0.682617f, 0.731934f, 0.772949f, 0.807129f, 0.835449f, 0.859863f, 0.878906f, 0.895020f, - 0.908203f, 0.920898f, 0.929199f, 0.937988f, 0.945312f, 0.951660f, 0.957031f, 0.961914f, - 0.965332f, 0.968750f, 0.972656f, 0.975098f, 0.977539f, 0.979980f, 0.982422f, 0.983887f, - 0.986328f, 0.987793f, 0.995117f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, - 0.000362f, 0.000970f, 0.001489f, 0.002251f, 0.002892f, 0.003727f, 0.004978f, 0.006264f, - 0.007530f, 0.009125f, 0.010551f, 0.012756f, 0.015259f, 0.018097f, 0.021637f, 0.025986f, - 0.030594f, 0.036804f, 0.044006f, 0.053162f, 0.064148f, 0.078003f, 0.096130f, 0.118042f, - 0.146118f, 0.181030f, 0.224487f, 0.276123f, 0.336670f, 0.403320f, 0.473633f, 0.543457f, - 0.609375f, 0.667480f, 0.719238f, 0.763184f, 0.799316f, 0.829590f, 0.854492f, 0.875488f, - 0.892578f, 0.906738f, 0.918945f, 0.928711f, 0.937012f, 0.944336f, 0.951172f, 0.956543f, - 0.961426f, 0.965820f, 0.968750f, 0.972656f, 0.975098f, 0.978027f, 0.980469f, 0.982910f, - 0.984375f, 0.985840f, 0.994629f, 0.995117f, 0.995117f, 0.995117f, 0.995117f, 0.995117f, - 0.000346f, 0.000923f, 0.001273f, 0.002010f, 0.002619f, 0.003689f, 0.004452f, 0.005177f, - 0.006290f, 0.007561f, 0.009033f, 0.010902f, 0.012970f, 0.015495f, 0.018280f, 0.021576f, - 0.024948f, 0.030304f, 0.035400f, 0.042480f, 0.051086f, 0.061401f, 0.074890f, 0.091187f, - 0.112427f, 0.138794f, 0.171631f, 0.212158f, 0.262451f, 0.320557f, 0.385986f, 0.456055f, - 0.525391f, 0.593262f, 0.654297f, 0.708984f, 0.754883f, 0.792969f, 0.824707f, 0.850098f, - 0.872070f, 0.890137f, 0.904785f, 0.917480f, 0.927734f, 0.937012f, 0.944336f, 0.951172f, - 0.956055f, 0.961914f, 0.966309f, 0.969727f, 0.973145f, 0.976074f, 0.978516f, 0.980469f, - 0.982910f, 0.984863f, 0.993652f, 0.995117f, 0.994629f, 0.994629f, 0.994629f, 0.994629f, - 0.000242f, 0.000666f, 0.001081f, 0.001806f, 0.002512f, 0.003397f, 0.003866f, 0.004894f, - 0.005566f, 0.006859f, 0.007957f, 0.009506f, 0.011009f, 0.013046f, 0.015266f, 0.018173f, - 0.021027f, 0.024811f, 0.029526f, 0.034790f, 0.041443f, 0.049835f, 0.059265f, 0.071899f, - 0.087769f, 0.107422f, 0.132202f, 0.163208f, 0.201782f, 0.249512f, 0.305908f, 0.370361f, - 0.440430f, 0.511230f, 0.578613f, 0.642090f, 0.698730f, 0.746582f, 0.787109f, 0.819824f, - 0.848145f, 0.869141f, 0.888672f, 0.903809f, 0.916992f, 0.927246f, 0.936523f, 0.943848f, - 0.951660f, 0.957031f, 0.961426f, 0.965820f, 0.970215f, 0.973145f, 0.976074f, 0.979004f, - 0.981445f, 0.983398f, 0.994141f, 0.994141f, 0.994629f, 0.994141f, 0.994629f, 0.994141f, - 0.000242f, 0.000709f, 0.000917f, 0.001194f, 0.002018f, 0.002634f, 0.003504f, 0.003918f, - 0.005020f, 0.005726f, 0.006935f, 0.008141f, 0.009666f, 0.011040f, 0.012848f, 0.014961f, - 0.017624f, 0.020660f, 0.024368f, 0.028381f, 0.033905f, 0.040283f, 0.047760f, 0.057312f, - 0.069214f, 0.083984f, 0.102539f, 0.126221f, 0.155640f, 0.193359f, 0.238892f, 0.293701f, - 0.356689f, 0.425537f, 0.497070f, 0.568359f, 0.632812f, 0.690918f, 0.739746f, 0.782227f, - 0.816406f, 0.845703f, 0.868652f, 0.887695f, 0.903320f, 0.916992f, 0.927734f, 0.937012f, - 0.944824f, 0.951660f, 0.957031f, 0.962891f, 0.966797f, 0.971191f, 0.973633f, 0.976562f, - 0.979492f, 0.981934f, 0.992676f, 0.993652f, 0.994141f, 0.993652f, 0.993652f, 0.994141f, - 0.000244f, 0.000660f, 0.000918f, 0.001343f, 0.002117f, 0.002407f, 0.002779f, 0.003626f, - 0.004246f, 0.005207f, 0.005913f, 0.007145f, 0.008163f, 0.009438f, 0.011101f, 0.012871f, - 0.014999f, 0.017426f, 0.020096f, 0.024185f, 0.027725f, 0.032623f, 0.038910f, 0.046387f, - 0.055298f, 0.066467f, 0.080627f, 0.098328f, 0.120972f, 0.149658f, 0.184814f, 0.229492f, - 0.282715f, 0.344727f, 0.414062f, 0.486084f, 0.556641f, 0.624023f, 0.683594f, 0.735352f, - 0.778320f, 0.814453f, 0.843750f, 0.867188f, 0.887207f, 0.903320f, 0.916504f, 0.928223f, - 0.937500f, 0.945312f, 0.953125f, 0.958008f, 0.964355f, 0.967285f, 0.971680f, 0.975098f, - 0.978516f, 0.980957f, 0.992676f, 0.993652f, 0.994141f, 0.993652f, 0.993652f, 0.993164f, - 0.000200f, 0.000480f, 0.000808f, 0.001303f, 0.001680f, 0.002104f, 0.002510f, 0.002934f, - 0.003468f, 0.004429f, 0.005539f, 0.006046f, 0.006889f, 0.008438f, 0.009415f, 0.011108f, - 0.012787f, 0.014572f, 0.017517f, 0.020279f, 0.023483f, 0.027359f, 0.031860f, 0.037964f, - 0.045227f, 0.053711f, 0.064148f, 0.077759f, 0.095093f, 0.116272f, 0.143311f, 0.177856f, - 0.221191f, 0.273193f, 0.334473f, 0.403320f, 0.476318f, 0.548828f, 0.617188f, 0.677734f, - 0.730957f, 0.775879f, 0.812500f, 0.842285f, 0.866699f, 0.887695f, 0.903809f, 0.916992f, - 0.928711f, 0.938477f, 0.946777f, 0.953125f, 0.959473f, 0.963867f, 0.968750f, 0.972656f, - 0.976074f, 0.979004f, 0.992188f, 0.992676f, 0.993164f, 0.993164f, 0.992676f, 0.993164f, - 0.000243f, 0.000469f, 0.000878f, 0.001158f, 0.001382f, 0.001801f, 0.002220f, 0.002699f, - 0.003273f, 0.004063f, 0.004715f, 0.005447f, 0.005917f, 0.007099f, 0.008385f, 0.009521f, - 0.011032f, 0.012627f, 0.014870f, 0.016922f, 0.019836f, 0.023010f, 0.026642f, 0.031174f, - 0.036926f, 0.043549f, 0.051941f, 0.062561f, 0.075317f, 0.091553f, 0.112427f, 0.138428f, - 0.172485f, 0.213867f, 0.265381f, 0.326172f, 0.394775f, 0.467773f, 0.541504f, 0.610840f, - 0.673340f, 0.728516f, 0.774414f, 0.812012f, 0.842773f, 0.867676f, 0.887695f, 0.904297f, - 0.918457f, 0.929688f, 0.939453f, 0.948242f, 0.955078f, 0.959961f, 0.965820f, 0.970215f, - 0.974121f, 0.977051f, 0.991211f, 0.993164f, 0.993164f, 0.992188f, 0.993164f, 0.992188f, - 0.000000f, 0.000242f, 0.000799f, 0.000998f, 0.001273f, 0.001671f, 0.002069f, 0.002485f, - 0.003212f, 0.003578f, 0.003948f, 0.004559f, 0.005524f, 0.006321f, 0.007046f, 0.008438f, - 0.009438f, 0.010986f, 0.012390f, 0.014320f, 0.016663f, 0.019165f, 0.022476f, 0.025833f, - 0.030487f, 0.035675f, 0.042358f, 0.050018f, 0.060211f, 0.072693f, 0.088379f, 0.108948f, - 0.134766f, 0.166626f, 0.208008f, 0.258545f, 0.318848f, 0.387451f, 0.461670f, 0.536621f, - 0.606934f, 0.671387f, 0.727539f, 0.773438f, 0.811523f, 0.843750f, 0.868164f, 0.889160f, - 0.906250f, 0.920410f, 0.932617f, 0.941895f, 0.949707f, 0.956055f, 0.962402f, 0.967285f, - 0.971680f, 0.975586f, 0.990723f, 0.991699f, 0.991699f, 0.992188f, 0.992188f, 0.991699f, - 0.000237f, 0.000482f, 0.000772f, 0.000877f, 0.001109f, 0.001494f, 0.001991f, 0.002041f, - 0.002537f, 0.002975f, 0.003469f, 0.004128f, 0.004841f, 0.005550f, 0.006306f, 0.007359f, - 0.008369f, 0.009415f, 0.010788f, 0.012306f, 0.014160f, 0.016571f, 0.018921f, 0.021896f, - 0.025497f, 0.029587f, 0.034576f, 0.041260f, 0.049011f, 0.058319f, 0.070557f, 0.086060f, - 0.105774f, 0.130737f, 0.162720f, 0.203247f, 0.252930f, 0.313477f, 0.382568f, 0.457275f, - 0.532715f, 0.605469f, 0.671387f, 0.728027f, 0.774902f, 0.814453f, 0.844727f, 0.870605f, - 0.891113f, 0.909180f, 0.922852f, 0.934082f, 0.943359f, 0.951660f, 0.958008f, 0.964355f, - 0.968750f, 0.973145f, 0.990234f, 0.990723f, 0.991699f, 0.991211f, 0.991211f, 0.991211f, - 0.000235f, 0.000461f, 0.000484f, 0.000891f, 0.001105f, 0.001346f, 0.001634f, 0.001936f, - 0.002438f, 0.002874f, 0.003353f, 0.003925f, 0.004189f, 0.004887f, 0.005684f, 0.006279f, - 0.007298f, 0.008339f, 0.009384f, 0.010674f, 0.012360f, 0.013901f, 0.016113f, 0.018677f, - 0.021469f, 0.024841f, 0.029144f, 0.033783f, 0.039948f, 0.047272f, 0.056915f, 0.068726f, - 0.083801f, 0.102905f, 0.127563f, 0.159058f, 0.199341f, 0.248901f, 0.309570f, 0.379395f, - 0.454834f, 0.532715f, 0.606934f, 0.672852f, 0.729980f, 0.778320f, 0.817383f, 0.849121f, - 0.874512f, 0.895020f, 0.911621f, 0.924805f, 0.937012f, 0.946289f, 0.954102f, 0.960938f, - 0.965820f, 0.971191f, 0.989258f, 0.990234f, 0.990723f, 0.991211f, 0.990723f, 0.990723f, - 0.000000f, 0.000360f, 0.000477f, 0.000756f, 0.000896f, 0.001065f, 0.001570f, 0.001622f, - 0.002064f, 0.002525f, 0.002819f, 0.003004f, 0.003700f, 0.004356f, 0.005077f, 0.005428f, - 0.006283f, 0.007370f, 0.008339f, 0.009323f, 0.010567f, 0.012070f, 0.013672f, 0.015839f, - 0.018066f, 0.020844f, 0.024002f, 0.028183f, 0.033051f, 0.039246f, 0.046417f, 0.055450f, - 0.067200f, 0.082031f, 0.100586f, 0.125122f, 0.156250f, 0.196167f, 0.245972f, 0.307129f, - 0.378174f, 0.454834f, 0.533203f, 0.608398f, 0.675781f, 0.734375f, 0.782715f, 0.821777f, - 0.853516f, 0.878906f, 0.898926f, 0.915039f, 0.929199f, 0.939941f, 0.948730f, 0.956055f, - 0.963379f, 0.968262f, 0.988770f, 0.989746f, 0.990234f, 0.989746f, 0.989746f, 0.990234f, - 0.000000f, 0.000256f, 0.000467f, 0.000590f, 0.000772f, 0.001095f, 0.001356f, 0.001781f, - 0.001984f, 0.002161f, 0.002546f, 0.002956f, 0.003338f, 0.003899f, 0.004440f, 0.004986f, - 0.005486f, 0.006310f, 0.006969f, 0.008148f, 0.009148f, 0.010284f, 0.011902f, 0.013573f, - 0.015465f, 0.017853f, 0.020340f, 0.023590f, 0.027298f, 0.032227f, 0.038208f, 0.045563f, - 0.054047f, 0.065796f, 0.080322f, 0.098999f, 0.122864f, 0.153809f, 0.193970f, 0.244629f, - 0.306396f, 0.378662f, 0.457031f, 0.536621f, 0.613770f, 0.681641f, 0.740723f, 0.788574f, - 0.827637f, 0.858398f, 0.884277f, 0.903320f, 0.919922f, 0.932129f, 0.942871f, 0.951660f, - 0.959961f, 0.965820f, 0.987305f, 0.988281f, 0.989258f, 0.989258f, 0.989258f, 0.989258f, - 0.000244f, 0.000243f, 0.000583f, 0.000585f, 0.000822f, 0.001073f, 0.001159f, 0.001452f, - 0.001525f, 0.002001f, 0.002201f, 0.002714f, 0.002932f, 0.003525f, 0.003904f, 0.004482f, - 0.004997f, 0.005581f, 0.006233f, 0.006954f, 0.007820f, 0.008949f, 0.009941f, 0.011482f, - 0.013168f, 0.015099f, 0.017151f, 0.020111f, 0.022949f, 0.026947f, 0.031647f, 0.037354f, - 0.044342f, 0.053375f, 0.064331f, 0.078857f, 0.097351f, 0.121033f, 0.152588f, 0.192749f, - 0.244263f, 0.307129f, 0.380615f, 0.461426f, 0.543457f, 0.621582f, 0.690430f, 0.748047f, - 0.796387f, 0.834961f, 0.865723f, 0.889160f, 0.908691f, 0.924316f, 0.937500f, 0.946777f, - 0.955078f, 0.962891f, 0.986328f, 0.987793f, 0.988770f, 0.988770f, 0.988770f, 0.988770f, - 0.000000f, 0.000243f, 0.000308f, 0.000541f, 0.000801f, 0.000827f, 0.001057f, 0.001280f, - 0.001460f, 0.001781f, 0.002090f, 0.002481f, 0.002756f, 0.003054f, 0.003321f, 0.003948f, - 0.004303f, 0.004898f, 0.005306f, 0.006405f, 0.006954f, 0.007851f, 0.008537f, 0.009918f, - 0.011208f, 0.012825f, 0.014534f, 0.016861f, 0.019379f, 0.022629f, 0.026276f, 0.030838f, - 0.036407f, 0.043488f, 0.051819f, 0.063416f, 0.077209f, 0.095825f, 0.119812f, 0.151489f, - 0.192749f, 0.245361f, 0.309814f, 0.385986f, 0.469238f, 0.552246f, 0.630859f, 0.699707f, - 0.757324f, 0.805176f, 0.842773f, 0.873047f, 0.895508f, 0.914062f, 0.929688f, 0.941406f, - 0.952148f, 0.959473f, 0.985840f, 0.986816f, 0.987305f, 0.987305f, 0.987305f, 0.987305f, - 0.000000f, 0.000243f, 0.000242f, 0.000548f, 0.000695f, 0.000803f, 0.001053f, 0.001198f, - 0.001363f, 0.001513f, 0.001886f, 0.002069f, 0.002447f, 0.002676f, 0.003138f, 0.003551f, - 0.003868f, 0.004261f, 0.004936f, 0.005337f, 0.005852f, 0.006615f, 0.007519f, 0.008575f, - 0.009705f, 0.010872f, 0.012688f, 0.014397f, 0.016479f, 0.019119f, 0.022064f, 0.025589f, - 0.030304f, 0.035828f, 0.042603f, 0.050812f, 0.062012f, 0.076355f, 0.094971f, 0.119263f, - 0.151367f, 0.193726f, 0.247925f, 0.314941f, 0.393311f, 0.478271f, 0.563965f, 0.642578f, - 0.711914f, 0.769043f, 0.815430f, 0.851562f, 0.881348f, 0.902832f, 0.921387f, 0.934570f, - 0.945801f, 0.955078f, 0.984375f, 0.986328f, 0.986328f, 0.986328f, 0.986328f, 0.986328f, - 0.000000f, 0.000234f, 0.000239f, 0.000308f, 0.000597f, 0.000690f, 0.000868f, 0.000937f, - 0.001189f, 0.001404f, 0.001696f, 0.001854f, 0.002180f, 0.002249f, 0.002672f, 0.002979f, - 0.003494f, 0.003761f, 0.004257f, 0.004745f, 0.005154f, 0.005821f, 0.006561f, 0.007557f, - 0.008575f, 0.009575f, 0.010963f, 0.012238f, 0.014130f, 0.016113f, 0.018539f, 0.021545f, - 0.025162f, 0.029404f, 0.034851f, 0.041626f, 0.050354f, 0.061218f, 0.075562f, 0.094482f, - 0.119507f, 0.152344f, 0.196167f, 0.252197f, 0.322266f, 0.404053f, 0.490967f, 0.577637f, - 0.658203f, 0.726074f, 0.782715f, 0.827637f, 0.861816f, 0.889648f, 0.910645f, 0.926758f, - 0.940918f, 0.950684f, 0.983398f, 0.985352f, 0.984863f, 0.985352f, 0.985840f, 0.985352f, - 0.000000f, 0.000240f, 0.000237f, 0.000239f, 0.000436f, 0.000648f, 0.000661f, 0.000892f, - 0.001089f, 0.001484f, 0.001446f, 0.001586f, 0.001896f, 0.002176f, 0.002325f, 0.002634f, - 0.003057f, 0.003315f, 0.003561f, 0.004150f, 0.004578f, 0.005180f, 0.005768f, 0.006485f, - 0.007286f, 0.008400f, 0.009453f, 0.010429f, 0.011795f, 0.013680f, 0.015671f, 0.018005f, - 0.020981f, 0.024521f, 0.028748f, 0.034119f, 0.040863f, 0.049622f, 0.060303f, 0.074829f, - 0.094116f, 0.119995f, 0.154297f, 0.199341f, 0.258301f, 0.331787f, 0.416504f, 0.507812f, - 0.595703f, 0.675781f, 0.743164f, 0.797852f, 0.840820f, 0.873535f, 0.899414f, 0.919434f, - 0.934082f, 0.947266f, 0.982422f, 0.983887f, 0.983887f, 0.984375f, 0.984375f, 0.983887f, - 0.000136f, 0.000115f, 0.000237f, 0.000238f, 0.000358f, 0.000452f, 0.000759f, 0.000961f, - 0.001026f, 0.001113f, 0.001433f, 0.001564f, 0.001659f, 0.001955f, 0.002024f, 0.002384f, - 0.002647f, 0.002974f, 0.003267f, 0.003611f, 0.003971f, 0.004498f, 0.005043f, 0.005539f, - 0.006344f, 0.007168f, 0.007942f, 0.009010f, 0.010353f, 0.011711f, 0.013458f, 0.015213f, - 0.017548f, 0.020279f, 0.023926f, 0.028061f, 0.033356f, 0.040283f, 0.048615f, 0.060455f, - 0.074890f, 0.094727f, 0.121216f, 0.156860f, 0.204102f, 0.266846f, 0.344238f, 0.433105f, - 0.526855f, 0.616699f, 0.696289f, 0.761230f, 0.813965f, 0.854492f, 0.884766f, 0.909180f, - 0.927734f, 0.941895f, 0.980957f, 0.982422f, 0.982910f, 0.982422f, 0.982422f, 0.982910f, - 0.000000f, 0.000103f, 0.000208f, 0.000356f, 0.000355f, 0.000400f, 0.000454f, 0.000861f, - 0.000922f, 0.001202f, 0.001088f, 0.001401f, 0.001493f, 0.001779f, 0.001881f, 0.002180f, - 0.002329f, 0.002483f, 0.002846f, 0.003178f, 0.003542f, 0.003914f, 0.004406f, 0.004871f, - 0.005352f, 0.006119f, 0.006927f, 0.007904f, 0.008759f, 0.009972f, 0.011284f, 0.013046f, - 0.014938f, 0.016998f, 0.019943f, 0.023224f, 0.027161f, 0.032776f, 0.039917f, 0.048218f, - 0.059937f, 0.075134f, 0.095642f, 0.123169f, 0.160767f, 0.211670f, 0.278320f, 0.360352f, - 0.454102f, 0.550293f, 0.640625f, 0.718262f, 0.781738f, 0.831055f, 0.869141f, 0.897461f, - 0.919434f, 0.936035f, 0.979492f, 0.980957f, 0.980957f, 0.981934f, 0.981445f, 0.981445f, - 0.000000f, 0.000192f, 0.000191f, 0.000350f, 0.000352f, 0.000354f, 0.000599f, 0.000721f, - 0.000835f, 0.001044f, 0.000988f, 0.001141f, 0.001255f, 0.001479f, 0.001705f, 0.001815f, - 0.001843f, 0.002151f, 0.002369f, 0.002831f, 0.003067f, 0.003431f, 0.003698f, 0.004295f, - 0.004738f, 0.005352f, 0.005859f, 0.006615f, 0.007587f, 0.008583f, 0.009682f, 0.010735f, - 0.012405f, 0.014381f, 0.016708f, 0.018921f, 0.022736f, 0.026947f, 0.032104f, 0.039032f, - 0.048004f, 0.059784f, 0.075500f, 0.096924f, 0.125977f, 0.166626f, 0.221069f, 0.292969f, - 0.380371f, 0.479004f, 0.577637f, 0.667969f, 0.743164f, 0.803711f, 0.849609f, 0.883789f, - 0.910645f, 0.930176f, 0.977539f, 0.979492f, 0.979492f, 0.979492f, 0.979980f, 0.979492f, - 0.000000f, 0.000000f, 0.000191f, 0.000214f, 0.000441f, 0.000465f, 0.000351f, 0.000656f, - 0.000672f, 0.000957f, 0.000881f, 0.001092f, 0.001209f, 0.001259f, 0.001315f, 0.001583f, - 0.001630f, 0.001834f, 0.002033f, 0.002367f, 0.002596f, 0.002924f, 0.003387f, 0.003693f, - 0.004063f, 0.004601f, 0.004986f, 0.005676f, 0.006557f, 0.006973f, 0.007801f, 0.008781f, - 0.010475f, 0.012100f, 0.013817f, 0.015625f, 0.018784f, 0.021927f, 0.026260f, 0.031677f, - 0.038879f, 0.048004f, 0.059845f, 0.076233f, 0.098633f, 0.130005f, 0.173950f, 0.233032f, - 0.311035f, 0.405518f, 0.507812f, 0.608887f, 0.698242f, 0.769531f, 0.826172f, 0.868164f, - 0.899414f, 0.922852f, 0.976074f, 0.977539f, 0.977539f, 0.977051f, 0.978027f, 0.978027f, - 0.000000f, 0.000000f, 0.000117f, 0.000211f, 0.000326f, 0.000573f, 0.000574f, 0.000583f, - 0.000584f, 0.000659f, 0.000901f, 0.001014f, 0.001064f, 0.001033f, 0.001163f, 0.001234f, - 0.001546f, 0.001585f, 0.001894f, 0.002085f, 0.002361f, 0.002504f, 0.003023f, 0.003147f, - 0.003580f, 0.004032f, 0.004314f, 0.004936f, 0.005215f, 0.006081f, 0.006725f, 0.007927f, - 0.008743f, 0.009918f, 0.011642f, 0.013367f, 0.015404f, 0.018219f, 0.021545f, 0.025787f, - 0.031174f, 0.038361f, 0.047577f, 0.060425f, 0.077881f, 0.102051f, 0.135376f, 0.182861f, - 0.249023f, 0.333984f, 0.436035f, 0.542969f, 0.644043f, 0.730469f, 0.798340f, 0.848633f, - 0.886719f, 0.914062f, 0.973633f, 0.974609f, 0.975098f, 0.976074f, 0.975098f, 0.976074f, - 0.000000f, 0.000000f, 0.000114f, 0.000112f, 0.000271f, 0.000510f, 0.000450f, 0.000565f, - 0.000572f, 0.000581f, 0.000654f, 0.000825f, 0.000954f, 0.001085f, 0.001050f, 0.001087f, - 0.001282f, 0.001547f, 0.001585f, 0.001825f, 0.002066f, 0.002182f, 0.002384f, 0.002659f, - 0.003172f, 0.003357f, 0.003721f, 0.004238f, 0.004505f, 0.005024f, 0.005878f, 0.006512f, - 0.007324f, 0.008293f, 0.009201f, 0.011040f, 0.012993f, 0.015007f, 0.017639f, 0.020920f, - 0.025131f, 0.030899f, 0.038269f, 0.047760f, 0.061188f, 0.079651f, 0.105469f, 0.142944f, - 0.195801f, 0.268799f, 0.363525f, 0.472168f, 0.582520f, 0.683594f, 0.765137f, 0.826660f, - 0.872070f, 0.905273f, 0.972168f, 0.973633f, 0.973145f, 0.973633f, 0.973633f, 0.973633f, - 0.000000f, 0.000000f, 0.000000f, 0.000111f, 0.000224f, 0.000412f, 0.000494f, 0.000543f, - 0.000561f, 0.000680f, 0.000665f, 0.000675f, 0.000679f, 0.000797f, 0.000926f, 0.001122f, - 0.001132f, 0.001207f, 0.001375f, 0.001606f, 0.001838f, 0.001963f, 0.002163f, 0.002314f, - 0.002480f, 0.002956f, 0.003189f, 0.003489f, 0.003744f, 0.004311f, 0.004749f, 0.005276f, - 0.005867f, 0.006962f, 0.008186f, 0.008987f, 0.010498f, 0.012283f, 0.014374f, 0.017075f, - 0.020355f, 0.024719f, 0.030640f, 0.037720f, 0.048309f, 0.062134f, 0.082336f, 0.110840f, - 0.151978f, 0.212891f, 0.294922f, 0.399170f, 0.515137f, 0.628418f, 0.724609f, 0.799805f, - 0.854980f, 0.894043f, 0.968750f, 0.970215f, 0.970703f, 0.971191f, 0.970703f, 0.970703f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000228f, 0.000233f, 0.000436f, 0.000457f, - 0.000621f, 0.000546f, 0.000622f, 0.000633f, 0.000576f, 0.000644f, 0.000717f, 0.000909f, - 0.000994f, 0.001127f, 0.001179f, 0.001267f, 0.001513f, 0.001628f, 0.001742f, 0.001974f, - 0.002111f, 0.002403f, 0.002810f, 0.003139f, 0.003231f, 0.003466f, 0.004021f, 0.004459f, - 0.004971f, 0.005581f, 0.006809f, 0.007568f, 0.008759f, 0.010002f, 0.011665f, 0.013847f, - 0.016342f, 0.019714f, 0.024368f, 0.030106f, 0.037811f, 0.048706f, 0.063843f, 0.085327f, - 0.118042f, 0.164917f, 0.234131f, 0.328125f, 0.443359f, 0.565430f, 0.677246f, 0.767578f, - 0.833496f, 0.882812f, 0.965820f, 0.967285f, 0.967773f, 0.968262f, 0.967773f, 0.968262f, - 0.000000f, 0.000000f, 0.000000f, 0.000214f, 0.000210f, 0.000296f, 0.000309f, 0.000386f, - 0.000462f, 0.000482f, 0.000525f, 0.000572f, 0.000525f, 0.000558f, 0.000689f, 0.000685f, - 0.000841f, 0.000934f, 0.001008f, 0.001182f, 0.001271f, 0.001412f, 0.001757f, 0.001787f, - 0.001769f, 0.002110f, 0.002321f, 0.002331f, 0.002737f, 0.002951f, 0.003189f, 0.003588f, - 0.004253f, 0.004627f, 0.005505f, 0.006119f, 0.006969f, 0.008018f, 0.009583f, 0.010971f, - 0.013245f, 0.015915f, 0.019257f, 0.023651f, 0.030014f, 0.038086f, 0.049683f, 0.066406f, - 0.091125f, 0.127441f, 0.182617f, 0.262939f, 0.370605f, 0.497070f, 0.623047f, 0.729004f, - 0.810547f, 0.867188f, 0.962891f, 0.963867f, 0.964844f, 0.964844f, 0.964355f, 0.964355f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000200f, 0.000215f, 0.000229f, 0.000319f, - 0.000330f, 0.000411f, 0.000491f, 0.000527f, 0.000547f, 0.000560f, 0.000634f, 0.000648f, - 0.000716f, 0.000778f, 0.000855f, 0.000998f, 0.001182f, 0.001111f, 0.001274f, 0.001625f, - 0.001584f, 0.001559f, 0.001864f, 0.002037f, 0.002296f, 0.002438f, 0.002600f, 0.002993f, - 0.003290f, 0.003801f, 0.004467f, 0.005085f, 0.005508f, 0.006519f, 0.007645f, 0.008743f, - 0.010757f, 0.012558f, 0.014946f, 0.018661f, 0.023422f, 0.029556f, 0.038574f, 0.050964f, - 0.069702f, 0.097351f, 0.140015f, 0.205566f, 0.301025f, 0.424561f, 0.559082f, 0.683594f, - 0.781250f, 0.852051f, 0.958496f, 0.960449f, 0.960938f, 0.960938f, 0.960938f, 0.960449f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000194f, 0.000214f, 0.000251f, - 0.000302f, 0.000365f, 0.000370f, 0.000429f, 0.000495f, 0.000521f, 0.000504f, 0.000547f, - 0.000632f, 0.000656f, 0.000695f, 0.000795f, 0.000922f, 0.001074f, 0.001125f, 0.001192f, - 0.001166f, 0.001303f, 0.001555f, 0.001575f, 0.001763f, 0.001970f, 0.002232f, 0.002560f, - 0.002657f, 0.003082f, 0.003559f, 0.003799f, 0.004620f, 0.005241f, 0.006081f, 0.007103f, - 0.008385f, 0.009796f, 0.012192f, 0.014702f, 0.018234f, 0.022934f, 0.029556f, 0.039307f, - 0.053009f, 0.073547f, 0.106628f, 0.157715f, 0.237793f, 0.351318f, 0.490479f, 0.629883f, - 0.746094f, 0.832031f, 0.954590f, 0.956055f, 0.956055f, 0.957031f, 0.956543f, 0.956055f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000146f, 0.000191f, 0.000200f, - 0.000255f, 0.000232f, 0.000252f, 0.000359f, 0.000291f, 0.000342f, 0.000406f, 0.000498f, - 0.000520f, 0.000533f, 0.000632f, 0.000605f, 0.000689f, 0.000768f, 0.000908f, 0.001013f, - 0.001087f, 0.001030f, 0.001211f, 0.001318f, 0.001497f, 0.001609f, 0.001753f, 0.001957f, - 0.002234f, 0.002352f, 0.002663f, 0.003040f, 0.003635f, 0.004082f, 0.004723f, 0.005516f, - 0.006367f, 0.007675f, 0.009224f, 0.011360f, 0.013695f, 0.017868f, 0.022598f, 0.029724f, - 0.040222f, 0.055542f, 0.080078f, 0.119202f, 0.182617f, 0.281738f, 0.417725f, 0.568848f, - 0.705566f, 0.807129f, 0.948730f, 0.951172f, 0.951172f, 0.951172f, 0.951660f, 0.951660f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000203f, 0.000186f, 0.000184f, 0.000321f, 0.000231f, 0.000337f, 0.000359f, 0.000430f, - 0.000455f, 0.000531f, 0.000502f, 0.000517f, 0.000728f, 0.000643f, 0.000673f, 0.000816f, - 0.000930f, 0.000991f, 0.001028f, 0.001161f, 0.001284f, 0.001369f, 0.001474f, 0.001719f, - 0.001781f, 0.001883f, 0.002258f, 0.002518f, 0.002831f, 0.003201f, 0.003744f, 0.004349f, - 0.005127f, 0.006130f, 0.007210f, 0.008423f, 0.010696f, 0.013405f, 0.017136f, 0.022522f, - 0.030029f, 0.041321f, 0.059631f, 0.089050f, 0.138062f, 0.218994f, 0.343750f, 0.500488f, - 0.657227f, 0.780762f, 0.943848f, 0.945312f, 0.945312f, 0.945801f, 0.945801f, 0.946289f, - 0.000000f, 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000120f, - 0.000118f, 0.000137f, 0.000139f, 0.000241f, 0.000202f, 0.000304f, 0.000313f, 0.000332f, - 0.000357f, 0.000420f, 0.000435f, 0.000463f, 0.000645f, 0.000544f, 0.000700f, 0.000717f, - 0.000669f, 0.000834f, 0.000865f, 0.000916f, 0.001109f, 0.001193f, 0.001246f, 0.001300f, - 0.001488f, 0.001538f, 0.001806f, 0.001929f, 0.002001f, 0.002462f, 0.002666f, 0.003260f, - 0.003904f, 0.004364f, 0.005325f, 0.006306f, 0.008041f, 0.009720f, 0.012718f, 0.016525f, - 0.022217f, 0.030579f, 0.043854f, 0.065247f, 0.101929f, 0.166016f, 0.273193f, 0.428223f, - 0.600586f, 0.748047f, 0.936523f, 0.938477f, 0.938965f, 0.939453f, 0.938965f, 0.938965f, - 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000120f, - 0.000114f, 0.000102f, 0.000090f, 0.000096f, 0.000131f, 0.000245f, 0.000276f, 0.000257f, - 0.000307f, 0.000316f, 0.000322f, 0.000373f, 0.000411f, 0.000440f, 0.000433f, 0.000650f, - 0.000578f, 0.000704f, 0.000746f, 0.000723f, 0.000819f, 0.000756f, 0.000758f, 0.000878f, - 0.001009f, 0.001270f, 0.001399f, 0.001530f, 0.001798f, 0.001803f, 0.002151f, 0.002317f, - 0.002728f, 0.003222f, 0.003782f, 0.004612f, 0.005951f, 0.006985f, 0.009308f, 0.011955f, - 0.016052f, 0.022324f, 0.031525f, 0.047272f, 0.073853f, 0.122192f, 0.209717f, 0.352783f, - 0.537109f, 0.709473f, 0.928223f, 0.930664f, 0.931152f, 0.930664f, 0.931641f, 0.931152f, - 0.000000f, 0.000000f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000120f, 0.000119f, - 0.000119f, 0.000111f, 0.000100f, 0.000139f, 0.000082f, 0.000154f, 0.000121f, 0.000216f, - 0.000147f, 0.000271f, 0.000288f, 0.000298f, 0.000386f, 0.000463f, 0.000370f, 0.000485f, - 0.000555f, 0.000530f, 0.000578f, 0.000574f, 0.000612f, 0.000712f, 0.000776f, 0.000716f, - 0.000931f, 0.000831f, 0.000967f, 0.001154f, 0.001176f, 0.001284f, 0.001497f, 0.001884f, - 0.002270f, 0.002415f, 0.002947f, 0.003412f, 0.004032f, 0.005066f, 0.006485f, 0.008400f, - 0.011215f, 0.015404f, 0.022079f, 0.033264f, 0.052124f, 0.087646f, 0.155029f, 0.279297f, - 0.465820f, 0.664062f, 0.918945f, 0.921387f, 0.921875f, 0.922363f, 0.922363f, 0.921875f, - 0.000000f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000119f, 0.000119f, 0.000119f, - 0.000118f, 0.000118f, 0.000110f, 0.000100f, 0.000091f, 0.000082f, 0.000075f, 0.000095f, - 0.000166f, 0.000113f, 0.000163f, 0.000248f, 0.000258f, 0.000277f, 0.000336f, 0.000301f, - 0.000445f, 0.000495f, 0.000473f, 0.000505f, 0.000494f, 0.000470f, 0.000584f, 0.000752f, - 0.000821f, 0.000814f, 0.000845f, 0.000807f, 0.000932f, 0.000996f, 0.001380f, 0.001481f, - 0.001507f, 0.001757f, 0.002146f, 0.002443f, 0.002869f, 0.003546f, 0.004559f, 0.005878f, - 0.007561f, 0.010475f, 0.015320f, 0.022675f, 0.036133f, 0.060883f, 0.110352f, 0.211670f, - 0.389160f, 0.610352f, 0.908691f, 0.909180f, 0.910645f, 0.912109f, 0.909668f, 0.910156f, - 0.000000f, 0.000121f, 0.000120f, 0.000119f, 0.000119f, 0.000118f, 0.000118f, 0.000117f, - 0.000117f, 0.000117f, 0.000116f, 0.000110f, 0.000100f, 0.000099f, 0.000083f, 0.000077f, - 0.000071f, 0.000081f, 0.000087f, 0.000166f, 0.000177f, 0.000233f, 0.000238f, 0.000273f, - 0.000325f, 0.000357f, 0.000292f, 0.000406f, 0.000418f, 0.000440f, 0.000428f, 0.000568f, - 0.000459f, 0.000628f, 0.000678f, 0.000688f, 0.000647f, 0.000830f, 0.000925f, 0.001111f, - 0.001011f, 0.001420f, 0.001504f, 0.001771f, 0.001997f, 0.002495f, 0.003147f, 0.003944f, - 0.005077f, 0.006958f, 0.010040f, 0.015053f, 0.023727f, 0.040680f, 0.075989f, 0.153076f, - 0.312012f, 0.547363f, 0.894531f, 0.897461f, 0.897949f, 0.897949f, 0.897949f, 0.898438f, - 0.000000f, 0.000000f, 0.000119f, 0.000118f, 0.000118f, 0.000117f, 0.000116f, 0.000116f, - 0.000115f, 0.000115f, 0.000114f, 0.000114f, 0.000111f, 0.000101f, 0.000093f, 0.000086f, - 0.000079f, 0.000095f, 0.000095f, 0.000090f, 0.000117f, 0.000109f, 0.000158f, 0.000199f, - 0.000207f, 0.000223f, 0.000286f, 0.000288f, 0.000267f, 0.000347f, 0.000368f, 0.000450f, - 0.000377f, 0.000460f, 0.000504f, 0.000498f, 0.000494f, 0.000616f, 0.000632f, 0.000699f, - 0.000755f, 0.000938f, 0.000978f, 0.001222f, 0.001355f, 0.001673f, 0.002016f, 0.002539f, - 0.003258f, 0.004410f, 0.006332f, 0.009285f, 0.014847f, 0.025864f, 0.049042f, 0.104736f, - 0.236572f, 0.477295f, 0.879395f, 0.881348f, 0.882324f, 0.881836f, 0.882324f, 0.882324f, - 0.000000f, 0.000119f, 0.000118f, 0.000116f, 0.000115f, 0.000114f, 0.000114f, 0.000113f, - 0.000112f, 0.000112f, 0.000111f, 0.000111f, 0.000110f, 0.000110f, 0.000103f, 0.000095f, - 0.000088f, 0.000081f, 0.000076f, 0.000070f, 0.000065f, 0.000100f, 0.000104f, 0.000099f, - 0.000120f, 0.000145f, 0.000190f, 0.000204f, 0.000213f, 0.000230f, 0.000241f, 0.000279f, - 0.000325f, 0.000322f, 0.000328f, 0.000381f, 0.000351f, 0.000466f, 0.000452f, 0.000516f, - 0.000591f, 0.000622f, 0.000733f, 0.000882f, 0.000895f, 0.001092f, 0.001456f, 0.001765f, - 0.002069f, 0.002821f, 0.003851f, 0.005558f, 0.008865f, 0.015579f, 0.029999f, 0.066895f, - 0.167480f, 0.400391f, 0.860352f, 0.862793f, 0.863281f, 0.864258f, 0.863281f, 0.863770f, - 0.000119f, 0.000114f, 0.000113f, 0.000113f, 0.000111f, 0.000110f, 0.000109f, 0.000109f, - 0.000108f, 0.000107f, 0.000107f, 0.000107f, 0.000106f, 0.000105f, 0.000106f, 0.000105f, - 0.000098f, 0.000090f, 0.000084f, 0.000078f, 0.000073f, 0.000068f, 0.000063f, 0.000063f, - 0.000066f, 0.000053f, 0.000080f, 0.000107f, 0.000126f, 0.000150f, 0.000188f, 0.000187f, - 0.000206f, 0.000205f, 0.000235f, 0.000242f, 0.000277f, 0.000340f, 0.000323f, 0.000308f, - 0.000417f, 0.000411f, 0.000445f, 0.000536f, 0.000622f, 0.000673f, 0.000887f, 0.000985f, - 0.001289f, 0.001623f, 0.002337f, 0.003241f, 0.004929f, 0.008560f, 0.016739f, 0.039307f, - 0.109619f, 0.317383f, 0.837402f, 0.840332f, 0.841309f, 0.840820f, 0.840820f, 0.841309f, - 0.000000f, 0.000106f, 0.000099f, 0.000104f, 0.000102f, 0.000101f, 0.000100f, 0.000101f, - 0.000101f, 0.000100f, 0.000099f, 0.000100f, 0.000099f, 0.000099f, 0.000099f, 0.000098f, - 0.000098f, 0.000098f, 0.000093f, 0.000086f, 0.000080f, 0.000075f, 0.000070f, 0.000065f, - 0.000061f, 0.000057f, 0.000059f, 0.000054f, 0.000061f, 0.000080f, 0.000087f, 0.000101f, - 0.000136f, 0.000147f, 0.000163f, 0.000171f, 0.000179f, 0.000205f, 0.000223f, 0.000237f, - 0.000281f, 0.000272f, 0.000299f, 0.000364f, 0.000373f, 0.000448f, 0.000507f, 0.000643f, - 0.000801f, 0.001000f, 0.001276f, 0.001765f, 0.002712f, 0.004585f, 0.008492f, 0.020462f, - 0.063721f, 0.233643f, 0.811035f, 0.813477f, 0.814453f, 0.813965f, 0.813965f, 0.814453f, - 0.000000f, 0.000057f, 0.000085f, 0.000085f, 0.000083f, 0.000085f, 0.000087f, 0.000086f, - 0.000087f, 0.000087f, 0.000086f, 0.000087f, 0.000087f, 0.000086f, 0.000087f, 0.000087f, - 0.000088f, 0.000086f, 0.000088f, 0.000087f, 0.000087f, 0.000081f, 0.000076f, 0.000071f, - 0.000067f, 0.000063f, 0.000058f, 0.000055f, 0.000051f, 0.000048f, 0.000046f, 0.000042f, - 0.000051f, 0.000063f, 0.000081f, 0.000101f, 0.000122f, 0.000137f, 0.000147f, 0.000143f, - 0.000157f, 0.000183f, 0.000205f, 0.000188f, 0.000196f, 0.000249f, 0.000310f, 0.000329f, - 0.000413f, 0.000534f, 0.000679f, 0.000944f, 0.001365f, 0.002199f, 0.004150f, 0.009369f, - 0.031677f, 0.153564f, 0.779297f, 0.781250f, 0.782227f, 0.782715f, 0.781738f, 0.781250f, - 0.000000f, 0.000000f, 0.000000f, 0.000009f, 0.000030f, 0.000048f, 0.000051f, 0.000054f, - 0.000055f, 0.000059f, 0.000060f, 0.000065f, 0.000065f, 0.000066f, 0.000068f, 0.000068f, - 0.000070f, 0.000070f, 0.000071f, 0.000071f, 0.000072f, 0.000073f, 0.000073f, 0.000073f, - 0.000071f, 0.000066f, 0.000062f, 0.000058f, 0.000055f, 0.000051f, 0.000048f, 0.000045f, - 0.000042f, 0.000039f, 0.000044f, 0.000036f, 0.000046f, 0.000056f, 0.000067f, 0.000085f, - 0.000099f, 0.000108f, 0.000107f, 0.000113f, 0.000139f, 0.000144f, 0.000165f, 0.000169f, - 0.000196f, 0.000266f, 0.000311f, 0.000426f, 0.000598f, 0.000948f, 0.001744f, 0.003975f, - 0.012856f, 0.084351f, 0.739746f, 0.743164f, 0.743652f, 0.743652f, 0.743652f, 0.743164f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000012f, 0.000012f, 0.000020f, 0.000028f, 0.000030f, 0.000033f, 0.000034f, - 0.000041f, 0.000041f, 0.000045f, 0.000047f, 0.000048f, 0.000049f, 0.000051f, 0.000052f, - 0.000054f, 0.000054f, 0.000056f, 0.000057f, 0.000056f, 0.000052f, 0.000049f, 0.000046f, - 0.000043f, 0.000041f, 0.000038f, 0.000035f, 0.000033f, 0.000031f, 0.000029f, 0.000029f, - 0.000036f, 0.000055f, 0.000048f, 0.000067f, 0.000067f, 0.000073f, 0.000075f, 0.000097f, - 0.000085f, 0.000111f, 0.000137f, 0.000191f, 0.000233f, 0.000371f, 0.000609f, 0.001319f, - 0.004341f, 0.033844f, 0.696289f, 0.698730f, 0.699219f, 0.698242f, 0.698730f, 0.698730f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000003f, 0.000007f, 0.000009f, 0.000012f, 0.000015f, 0.000020f, - 0.000022f, 0.000023f, 0.000026f, 0.000029f, 0.000030f, 0.000032f, 0.000033f, 0.000035f, - 0.000037f, 0.000037f, 0.000036f, 0.000034f, 0.000032f, 0.000030f, 0.000028f, 0.000026f, - 0.000024f, 0.000022f, 0.000021f, 0.000019f, 0.000024f, 0.000024f, 0.000029f, 0.000037f, - 0.000043f, 0.000046f, 0.000059f, 0.000058f, 0.000075f, 0.000095f, 0.000160f, 0.000306f, - 0.001006f, 0.008865f, 0.643066f, 0.647461f, 0.647949f, 0.647461f, 0.647949f, 0.648438f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, - 0.000003f, 0.000005f, 0.000007f, 0.000010f, 0.000012f, 0.000013f, 0.000015f, 0.000017f, - 0.000019f, 0.000020f, 0.000018f, 0.000017f, 0.000015f, 0.000014f, 0.000013f, 0.000012f, - 0.000010f, 0.000012f, 0.000014f, 0.000018f, 0.000018f, 0.000025f, 0.000028f, 0.000045f, - 0.000110f, 0.001030f, 0.586914f, 0.589844f, 0.590820f, 0.591309f, 0.591309f, 0.590820f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000002f, 0.000004f, 0.000005f, 0.000004f, 0.000004f, 0.000003f, 0.000003f, - 0.000004f, 0.000009f, 0.527344f, 0.529785f, 0.529785f, 0.530273f, 0.530762f, 0.530762f, - }, - { - 0.135132f, 0.377441f, 0.544434f, 0.653320f, 0.724609f, 0.773926f, 0.811035f, 0.838867f, - 0.860840f, 0.876465f, 0.891113f, 0.902832f, 0.912109f, 0.920898f, 0.928223f, 0.934082f, - 0.938965f, 0.943848f, 0.948242f, 0.952637f, 0.955566f, 0.958984f, 0.961914f, 0.964844f, - 0.966797f, 0.969238f, 0.971191f, 0.973145f, 0.975098f, 0.976562f, 0.978027f, 0.979492f, - 0.980469f, 0.982422f, 0.983398f, 0.984863f, 0.985840f, 0.986328f, 0.987793f, 0.988770f, - 0.989746f, 0.989746f, 0.990234f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.994141f, - 0.994629f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998535f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.044891f, 0.163330f, 0.306885f, 0.444336f, 0.559570f, 0.645020f, 0.710938f, 0.760742f, - 0.797852f, 0.827148f, 0.850098f, 0.868652f, 0.883789f, 0.895996f, 0.907227f, 0.916016f, - 0.923340f, 0.930176f, 0.936523f, 0.941406f, 0.946777f, 0.950684f, 0.954102f, 0.957031f, - 0.960938f, 0.963379f, 0.965820f, 0.968262f, 0.970703f, 0.972168f, 0.974609f, 0.976562f, - 0.977539f, 0.979492f, 0.980469f, 0.981934f, 0.982910f, 0.984375f, 0.985840f, 0.986816f, - 0.987793f, 0.988770f, 0.988770f, 0.990234f, 0.991211f, 0.991699f, 0.992676f, 0.993164f, - 0.993164f, 0.994141f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, - 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999023f, 0.999023f, 0.999023f, - 0.020325f, 0.077820f, 0.158936f, 0.260498f, 0.372314f, 0.479736f, 0.572754f, 0.648438f, - 0.707520f, 0.754883f, 0.791016f, 0.820312f, 0.843750f, 0.862793f, 0.878906f, 0.891602f, - 0.903320f, 0.912598f, 0.920898f, 0.928223f, 0.933594f, 0.939941f, 0.944824f, 0.949219f, - 0.952637f, 0.956543f, 0.959961f, 0.962402f, 0.965332f, 0.967773f, 0.970215f, 0.971680f, - 0.974121f, 0.976074f, 0.977539f, 0.979004f, 0.980957f, 0.981445f, 0.983398f, 0.984375f, - 0.985352f, 0.986328f, 0.987793f, 0.988770f, 0.989746f, 0.990234f, 0.991211f, 0.992188f, - 0.992676f, 0.993164f, 0.994141f, 0.994629f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.998535f, 0.998535f, - 0.012032f, 0.042908f, 0.088196f, 0.149292f, 0.228027f, 0.319824f, 0.415527f, 0.506348f, - 0.586914f, 0.653809f, 0.709473f, 0.752441f, 0.787598f, 0.817383f, 0.840820f, 0.860352f, - 0.876465f, 0.889648f, 0.900879f, 0.910156f, 0.918945f, 0.926270f, 0.933105f, 0.938965f, - 0.944336f, 0.948730f, 0.952637f, 0.956055f, 0.958984f, 0.962402f, 0.965332f, 0.967773f, - 0.970215f, 0.972656f, 0.974609f, 0.976562f, 0.978027f, 0.979492f, 0.980957f, 0.982422f, - 0.983887f, 0.984375f, 0.985352f, 0.986816f, 0.987793f, 0.988770f, 0.989746f, 0.990234f, - 0.991211f, 0.992188f, 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.996094f, 0.996094f, - 0.996582f, 0.997559f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.007637f, 0.026825f, 0.053436f, 0.090759f, 0.140137f, 0.203125f, 0.279053f, 0.363281f, - 0.449463f, 0.529785f, 0.601562f, 0.663574f, 0.713379f, 0.756348f, 0.789551f, 0.816895f, - 0.840332f, 0.858887f, 0.875488f, 0.887695f, 0.900391f, 0.909668f, 0.918945f, 0.926270f, - 0.932617f, 0.938477f, 0.943848f, 0.948242f, 0.952148f, 0.955566f, 0.959473f, 0.962402f, - 0.965332f, 0.967773f, 0.970215f, 0.972168f, 0.974121f, 0.976562f, 0.978516f, 0.979492f, - 0.980957f, 0.981934f, 0.984375f, 0.985352f, 0.985840f, 0.987793f, 0.988281f, 0.989258f, - 0.990723f, 0.991211f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.995605f, - 0.996094f, 0.997070f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998047f, - 0.004784f, 0.018082f, 0.035400f, 0.058868f, 0.089783f, 0.130981f, 0.183716f, 0.248047f, - 0.321289f, 0.400391f, 0.478760f, 0.552734f, 0.617188f, 0.673828f, 0.720703f, 0.759766f, - 0.792480f, 0.818359f, 0.840820f, 0.859863f, 0.875000f, 0.888184f, 0.899902f, 0.910645f, - 0.918945f, 0.926270f, 0.931641f, 0.938965f, 0.943848f, 0.948242f, 0.952148f, 0.957031f, - 0.959473f, 0.962891f, 0.965332f, 0.968262f, 0.970215f, 0.972656f, 0.975098f, 0.977051f, - 0.978516f, 0.979980f, 0.981445f, 0.982910f, 0.984863f, 0.985352f, 0.986328f, 0.987305f, - 0.988770f, 0.989746f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, 0.994141f, 0.994629f, - 0.995605f, 0.996094f, 0.998047f, 0.998535f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.004044f, 0.012550f, 0.024628f, 0.040466f, 0.060760f, 0.087708f, 0.122742f, 0.167236f, - 0.222534f, 0.287109f, 0.358643f, 0.432617f, 0.506348f, 0.573242f, 0.632812f, 0.685059f, - 0.728516f, 0.766602f, 0.797363f, 0.822266f, 0.843750f, 0.861328f, 0.877441f, 0.890625f, - 0.901367f, 0.910645f, 0.919434f, 0.926758f, 0.933105f, 0.940430f, 0.944824f, 0.948730f, - 0.953125f, 0.957520f, 0.960449f, 0.963867f, 0.966309f, 0.969238f, 0.970703f, 0.973633f, - 0.976074f, 0.977539f, 0.979004f, 0.980469f, 0.982422f, 0.983398f, 0.984863f, 0.986816f, - 0.986816f, 0.988281f, 0.989746f, 0.990723f, 0.991211f, 0.992188f, 0.993164f, 0.994141f, - 0.994629f, 0.995117f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.002975f, 0.009315f, 0.017868f, 0.029129f, 0.043243f, 0.062012f, 0.084961f, 0.115540f, - 0.154419f, 0.201660f, 0.257812f, 0.322754f, 0.391846f, 0.463135f, 0.530762f, 0.594727f, - 0.650391f, 0.698730f, 0.739258f, 0.773926f, 0.803711f, 0.826660f, 0.847656f, 0.865723f, - 0.879883f, 0.892090f, 0.903809f, 0.913086f, 0.921387f, 0.928223f, 0.935059f, 0.940918f, - 0.945801f, 0.950684f, 0.954102f, 0.958008f, 0.961426f, 0.964844f, 0.967285f, 0.970215f, - 0.972168f, 0.974609f, 0.976074f, 0.978027f, 0.979980f, 0.981934f, 0.983398f, 0.984375f, - 0.985352f, 0.987305f, 0.988281f, 0.989258f, 0.990234f, 0.991211f, 0.992188f, 0.993164f, - 0.993652f, 0.994629f, 0.997559f, 0.998047f, 0.998047f, 0.997559f, 0.997559f, 0.997559f, - 0.002329f, 0.007256f, 0.013611f, 0.021790f, 0.032043f, 0.044617f, 0.061554f, 0.082336f, - 0.108765f, 0.142578f, 0.184448f, 0.234375f, 0.292725f, 0.357422f, 0.424805f, 0.493164f, - 0.556641f, 0.615723f, 0.666504f, 0.711914f, 0.750977f, 0.782715f, 0.809570f, 0.832520f, - 0.853516f, 0.868652f, 0.882812f, 0.895508f, 0.905762f, 0.916016f, 0.923340f, 0.931152f, - 0.936523f, 0.942383f, 0.947266f, 0.951172f, 0.956055f, 0.958984f, 0.962402f, 0.965820f, - 0.968750f, 0.971191f, 0.973633f, 0.975586f, 0.977539f, 0.979980f, 0.980957f, 0.982422f, - 0.983887f, 0.985352f, 0.985840f, 0.988281f, 0.989746f, 0.990234f, 0.991211f, 0.991699f, - 0.993164f, 0.993652f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.001871f, 0.006084f, 0.010963f, 0.016953f, 0.024277f, 0.033722f, 0.046234f, 0.060669f, - 0.079224f, 0.103638f, 0.132812f, 0.169678f, 0.214478f, 0.267090f, 0.326172f, 0.390137f, - 0.456543f, 0.519531f, 0.581543f, 0.636230f, 0.685547f, 0.726562f, 0.762207f, 0.792969f, - 0.818359f, 0.839844f, 0.858398f, 0.874023f, 0.887695f, 0.898926f, 0.909668f, 0.918945f, - 0.926270f, 0.933105f, 0.938965f, 0.944336f, 0.949219f, 0.953613f, 0.958008f, 0.961426f, - 0.964844f, 0.967773f, 0.969727f, 0.972168f, 0.974609f, 0.976074f, 0.979004f, 0.979980f, - 0.981934f, 0.983887f, 0.985352f, 0.986328f, 0.987793f, 0.989746f, 0.989746f, 0.990723f, - 0.991211f, 0.992676f, 0.996582f, 0.997070f, 0.997559f, 0.997070f, 0.997070f, 0.997070f, - 0.001322f, 0.004795f, 0.008530f, 0.013504f, 0.018921f, 0.026154f, 0.035065f, 0.045807f, - 0.059662f, 0.076416f, 0.098267f, 0.124512f, 0.157715f, 0.197388f, 0.244873f, 0.299805f, - 0.359619f, 0.423096f, 0.487549f, 0.549316f, 0.605957f, 0.657715f, 0.703125f, 0.741211f, - 0.774902f, 0.802734f, 0.827148f, 0.847656f, 0.865234f, 0.879883f, 0.893066f, 0.903320f, - 0.913086f, 0.920898f, 0.929199f, 0.935547f, 0.941406f, 0.947266f, 0.951172f, 0.956055f, - 0.959473f, 0.962891f, 0.965332f, 0.969238f, 0.971191f, 0.974121f, 0.976562f, 0.977539f, - 0.979980f, 0.981445f, 0.982910f, 0.984863f, 0.986328f, 0.988281f, 0.988281f, 0.989746f, - 0.990723f, 0.991699f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.996582f, - 0.001077f, 0.003971f, 0.006985f, 0.010750f, 0.015579f, 0.020920f, 0.027420f, 0.035522f, - 0.045776f, 0.058228f, 0.074097f, 0.093140f, 0.117310f, 0.146851f, 0.182495f, 0.225952f, - 0.276611f, 0.332764f, 0.394287f, 0.456543f, 0.518555f, 0.577637f, 0.630371f, 0.679199f, - 0.720703f, 0.756836f, 0.787598f, 0.813477f, 0.836426f, 0.855469f, 0.872070f, 0.885742f, - 0.897949f, 0.908203f, 0.917480f, 0.925293f, 0.933105f, 0.939453f, 0.944336f, 0.949219f, - 0.954590f, 0.957520f, 0.961426f, 0.964844f, 0.968262f, 0.970703f, 0.974121f, 0.975586f, - 0.978027f, 0.979492f, 0.981445f, 0.983398f, 0.984863f, 0.986328f, 0.987793f, 0.988770f, - 0.989746f, 0.991211f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, - 0.000954f, 0.003330f, 0.005733f, 0.008904f, 0.012505f, 0.016617f, 0.022446f, 0.028351f, - 0.036041f, 0.045807f, 0.056854f, 0.071350f, 0.088867f, 0.110596f, 0.137451f, 0.170654f, - 0.209717f, 0.256592f, 0.309326f, 0.366943f, 0.427979f, 0.489502f, 0.549316f, 0.604980f, - 0.655762f, 0.700195f, 0.738770f, 0.772461f, 0.801270f, 0.825195f, 0.845703f, 0.864258f, - 0.879395f, 0.893066f, 0.903809f, 0.914062f, 0.922363f, 0.929688f, 0.936523f, 0.942871f, - 0.947266f, 0.952148f, 0.956055f, 0.960449f, 0.963867f, 0.966797f, 0.969727f, 0.972656f, - 0.975586f, 0.976562f, 0.979004f, 0.981445f, 0.982910f, 0.984375f, 0.985840f, 0.986816f, - 0.988770f, 0.989746f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, - 0.000949f, 0.002804f, 0.004730f, 0.007236f, 0.010384f, 0.014160f, 0.018478f, 0.023102f, - 0.028992f, 0.036346f, 0.044647f, 0.055542f, 0.068481f, 0.085144f, 0.105286f, 0.130005f, - 0.159668f, 0.195557f, 0.238647f, 0.287842f, 0.343018f, 0.402588f, 0.463135f, 0.522949f, - 0.580566f, 0.632812f, 0.680664f, 0.721680f, 0.757812f, 0.788574f, 0.814453f, 0.836914f, - 0.856934f, 0.872070f, 0.887207f, 0.899414f, 0.909668f, 0.918945f, 0.926758f, 0.933594f, - 0.940430f, 0.946289f, 0.950684f, 0.954590f, 0.959473f, 0.963379f, 0.966797f, 0.969238f, - 0.972168f, 0.975098f, 0.977051f, 0.979492f, 0.980957f, 0.982910f, 0.984375f, 0.986328f, - 0.987793f, 0.988770f, 0.995117f, 0.996094f, 0.995605f, 0.996094f, 0.996094f, 0.995605f, - 0.000828f, 0.002361f, 0.004116f, 0.006119f, 0.008797f, 0.011391f, 0.014854f, 0.018890f, - 0.023666f, 0.029083f, 0.036011f, 0.044434f, 0.053986f, 0.066589f, 0.081543f, 0.100159f, - 0.122314f, 0.149536f, 0.183350f, 0.222900f, 0.269043f, 0.321533f, 0.378418f, 0.438477f, - 0.499023f, 0.556641f, 0.611328f, 0.661133f, 0.703613f, 0.742188f, 0.775391f, 0.804199f, - 0.828613f, 0.849121f, 0.866211f, 0.881348f, 0.894043f, 0.905762f, 0.916016f, 0.924316f, - 0.931641f, 0.938477f, 0.944336f, 0.949707f, 0.954590f, 0.958496f, 0.962402f, 0.966309f, - 0.969238f, 0.972168f, 0.974121f, 0.977051f, 0.979004f, 0.980957f, 0.982910f, 0.984863f, - 0.985840f, 0.987793f, 0.995117f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, - 0.000606f, 0.001948f, 0.003483f, 0.005394f, 0.007290f, 0.009735f, 0.012352f, 0.015747f, - 0.019485f, 0.023788f, 0.029358f, 0.035706f, 0.043732f, 0.053162f, 0.064331f, 0.077942f, - 0.094971f, 0.116089f, 0.140991f, 0.172485f, 0.209473f, 0.252686f, 0.302002f, 0.356934f, - 0.415283f, 0.475830f, 0.534180f, 0.589844f, 0.641602f, 0.687500f, 0.728516f, 0.763184f, - 0.792969f, 0.819336f, 0.841309f, 0.860840f, 0.876953f, 0.890625f, 0.902344f, 0.913086f, - 0.921875f, 0.930176f, 0.937012f, 0.943359f, 0.948242f, 0.954102f, 0.958008f, 0.961914f, - 0.965820f, 0.969238f, 0.971680f, 0.974609f, 0.977051f, 0.979004f, 0.981445f, 0.983398f, - 0.984863f, 0.986816f, 0.994141f, 0.994629f, 0.995117f, 0.995117f, 0.995117f, 0.994629f, - 0.000672f, 0.001569f, 0.002895f, 0.004528f, 0.006180f, 0.008324f, 0.010864f, 0.013161f, - 0.016357f, 0.020096f, 0.024216f, 0.029327f, 0.035583f, 0.042664f, 0.051453f, 0.062073f, - 0.075012f, 0.091125f, 0.110291f, 0.134155f, 0.162476f, 0.197266f, 0.238037f, 0.285156f, - 0.337646f, 0.395020f, 0.454590f, 0.513672f, 0.570312f, 0.624023f, 0.672363f, 0.714844f, - 0.750977f, 0.783691f, 0.811035f, 0.834473f, 0.854004f, 0.872070f, 0.886230f, 0.899414f, - 0.911133f, 0.918945f, 0.928223f, 0.936035f, 0.942871f, 0.948242f, 0.953613f, 0.957031f, - 0.961426f, 0.965820f, 0.968750f, 0.972168f, 0.974121f, 0.976562f, 0.979492f, 0.981445f, - 0.983398f, 0.985352f, 0.994141f, 0.994629f, 0.995117f, 0.995117f, 0.995117f, 0.994629f, - 0.000413f, 0.001430f, 0.002577f, 0.004269f, 0.005703f, 0.007137f, 0.008888f, 0.011124f, - 0.013885f, 0.016891f, 0.020355f, 0.024384f, 0.029221f, 0.035217f, 0.041748f, 0.049988f, - 0.060059f, 0.072083f, 0.086914f, 0.105286f, 0.126953f, 0.154175f, 0.186523f, 0.224731f, - 0.269287f, 0.320557f, 0.375732f, 0.434570f, 0.493896f, 0.552246f, 0.606934f, 0.655762f, - 0.701660f, 0.740723f, 0.774902f, 0.803711f, 0.827637f, 0.848633f, 0.867188f, 0.882812f, - 0.895996f, 0.908203f, 0.917969f, 0.926758f, 0.934570f, 0.941895f, 0.947266f, 0.952637f, - 0.957520f, 0.960938f, 0.965820f, 0.968750f, 0.971680f, 0.974609f, 0.977051f, 0.979980f, - 0.981934f, 0.983887f, 0.993652f, 0.994629f, 0.994141f, 0.994141f, 0.994141f, 0.994141f, - 0.000240f, 0.001406f, 0.002373f, 0.003283f, 0.004620f, 0.006264f, 0.007744f, 0.009552f, - 0.011711f, 0.014069f, 0.017273f, 0.020584f, 0.024429f, 0.028946f, 0.034393f, 0.041046f, - 0.048798f, 0.058289f, 0.070312f, 0.083618f, 0.100403f, 0.121338f, 0.146118f, 0.177002f, - 0.213257f, 0.255371f, 0.304443f, 0.358887f, 0.416504f, 0.476562f, 0.534668f, 0.590332f, - 0.642090f, 0.688965f, 0.729492f, 0.766113f, 0.796387f, 0.822754f, 0.844727f, 0.862305f, - 0.880371f, 0.894043f, 0.905762f, 0.916992f, 0.926270f, 0.934082f, 0.940918f, 0.946777f, - 0.953125f, 0.956543f, 0.961426f, 0.964844f, 0.969238f, 0.972656f, 0.974609f, 0.977539f, - 0.979980f, 0.982422f, 0.992676f, 0.994141f, 0.993652f, 0.993652f, 0.993652f, 0.993652f, - 0.000242f, 0.001257f, 0.001991f, 0.003138f, 0.004299f, 0.005302f, 0.006584f, 0.008308f, - 0.010048f, 0.012283f, 0.014526f, 0.017578f, 0.020340f, 0.023972f, 0.028671f, 0.033661f, - 0.040161f, 0.047821f, 0.056213f, 0.067261f, 0.080444f, 0.096191f, 0.115784f, 0.139771f, - 0.168457f, 0.203125f, 0.243286f, 0.290527f, 0.343506f, 0.400879f, 0.459473f, 0.519043f, - 0.576172f, 0.629395f, 0.678223f, 0.721191f, 0.757324f, 0.789062f, 0.816895f, 0.839844f, - 0.859863f, 0.877930f, 0.892578f, 0.904297f, 0.915527f, 0.925293f, 0.933105f, 0.940430f, - 0.946777f, 0.952148f, 0.957031f, 0.961914f, 0.965820f, 0.969238f, 0.973145f, 0.975586f, - 0.978516f, 0.980469f, 0.992188f, 0.993652f, 0.993164f, 0.993164f, 0.993652f, 0.993164f, - 0.000434f, 0.001172f, 0.001865f, 0.002825f, 0.003633f, 0.004757f, 0.005722f, 0.007175f, - 0.009010f, 0.010651f, 0.012520f, 0.014412f, 0.017532f, 0.020599f, 0.024139f, 0.028488f, - 0.033356f, 0.039001f, 0.046295f, 0.054749f, 0.064758f, 0.077209f, 0.092834f, 0.111084f, - 0.134033f, 0.160767f, 0.193604f, 0.233032f, 0.278320f, 0.329590f, 0.386230f, 0.445068f, - 0.504395f, 0.563477f, 0.617188f, 0.666504f, 0.711426f, 0.750000f, 0.783691f, 0.812500f, - 0.836426f, 0.857422f, 0.875488f, 0.891113f, 0.903809f, 0.915039f, 0.924805f, 0.933105f, - 0.940430f, 0.947266f, 0.953125f, 0.958496f, 0.962402f, 0.966309f, 0.969727f, 0.973145f, - 0.976562f, 0.978516f, 0.991699f, 0.992188f, 0.992676f, 0.993164f, 0.993164f, 0.992676f, - 0.000358f, 0.000835f, 0.001738f, 0.002270f, 0.002996f, 0.004078f, 0.005157f, 0.006416f, - 0.007904f, 0.009331f, 0.010826f, 0.012245f, 0.014938f, 0.017303f, 0.020233f, 0.023926f, - 0.027954f, 0.032715f, 0.038147f, 0.045166f, 0.053070f, 0.062561f, 0.074768f, 0.089661f, - 0.106689f, 0.128052f, 0.154175f, 0.185547f, 0.223022f, 0.266846f, 0.317383f, 0.373047f, - 0.431152f, 0.491943f, 0.550293f, 0.606445f, 0.658203f, 0.704102f, 0.744141f, 0.779297f, - 0.809082f, 0.833984f, 0.855957f, 0.875000f, 0.889648f, 0.903320f, 0.915039f, 0.924805f, - 0.933594f, 0.940918f, 0.947754f, 0.954102f, 0.958984f, 0.962402f, 0.966797f, 0.970703f, - 0.974121f, 0.977539f, 0.990723f, 0.992188f, 0.992676f, 0.992676f, 0.992188f, 0.992676f, - 0.000428f, 0.000789f, 0.001460f, 0.002172f, 0.002695f, 0.003561f, 0.004608f, 0.005848f, - 0.006886f, 0.007736f, 0.009560f, 0.011078f, 0.012817f, 0.015015f, 0.017563f, 0.020157f, - 0.023666f, 0.027145f, 0.031891f, 0.037384f, 0.044189f, 0.051788f, 0.061188f, 0.072327f, - 0.085999f, 0.102966f, 0.123413f, 0.148071f, 0.178101f, 0.214478f, 0.256836f, 0.306396f, - 0.360840f, 0.419678f, 0.479736f, 0.540527f, 0.597656f, 0.649902f, 0.697754f, 0.738770f, - 0.775391f, 0.805664f, 0.831543f, 0.854004f, 0.873535f, 0.889160f, 0.902832f, 0.915039f, - 0.925293f, 0.934082f, 0.941895f, 0.948730f, 0.954102f, 0.959961f, 0.963867f, 0.968262f, - 0.971680f, 0.975586f, 0.990723f, 0.991699f, 0.991699f, 0.991699f, 0.991699f, 0.991211f, - 0.000237f, 0.000782f, 0.001245f, 0.001923f, 0.002417f, 0.003225f, 0.004101f, 0.005062f, - 0.005920f, 0.007030f, 0.008102f, 0.009743f, 0.011009f, 0.013054f, 0.015190f, 0.017380f, - 0.020126f, 0.023346f, 0.027161f, 0.031464f, 0.036316f, 0.042664f, 0.050110f, 0.058807f, - 0.069946f, 0.083191f, 0.099121f, 0.118835f, 0.142822f, 0.171997f, 0.206665f, 0.248413f, - 0.296143f, 0.350586f, 0.408936f, 0.469727f, 0.530762f, 0.589844f, 0.643555f, 0.691895f, - 0.734375f, 0.772461f, 0.803223f, 0.830566f, 0.854492f, 0.873047f, 0.889648f, 0.903809f, - 0.916016f, 0.926270f, 0.935059f, 0.943359f, 0.949219f, 0.955566f, 0.960938f, 0.965332f, - 0.969727f, 0.973145f, 0.989746f, 0.990723f, 0.990723f, 0.990723f, 0.991211f, 0.990723f, - 0.000243f, 0.000793f, 0.001210f, 0.001616f, 0.002260f, 0.003069f, 0.003649f, 0.004444f, - 0.005322f, 0.006088f, 0.006954f, 0.008278f, 0.009766f, 0.011139f, 0.012970f, 0.014908f, - 0.016968f, 0.019897f, 0.023193f, 0.026962f, 0.030792f, 0.035522f, 0.041931f, 0.048920f, - 0.057404f, 0.067993f, 0.080383f, 0.095825f, 0.114929f, 0.137695f, 0.165771f, 0.199585f, - 0.241089f, 0.287842f, 0.341553f, 0.400391f, 0.462402f, 0.523438f, 0.583008f, 0.638184f, - 0.687988f, 0.732422f, 0.770020f, 0.802246f, 0.830566f, 0.854004f, 0.873047f, 0.891113f, - 0.904785f, 0.916992f, 0.926758f, 0.936523f, 0.943848f, 0.951172f, 0.956543f, 0.961914f, - 0.966797f, 0.971191f, 0.989258f, 0.990234f, 0.990234f, 0.990234f, 0.990234f, 0.989746f, - 0.000000f, 0.000484f, 0.000973f, 0.001453f, 0.001999f, 0.002689f, 0.003359f, 0.003864f, - 0.004726f, 0.005444f, 0.006516f, 0.007404f, 0.008461f, 0.009720f, 0.011261f, 0.012985f, - 0.014908f, 0.017120f, 0.019699f, 0.022614f, 0.026093f, 0.030228f, 0.034668f, 0.040619f, - 0.047699f, 0.055756f, 0.066284f, 0.078308f, 0.092834f, 0.111328f, 0.133423f, 0.160889f, - 0.194214f, 0.233765f, 0.281006f, 0.334473f, 0.392822f, 0.455078f, 0.517090f, 0.578125f, - 0.634766f, 0.686035f, 0.730957f, 0.768555f, 0.803223f, 0.831055f, 0.854492f, 0.875488f, - 0.892090f, 0.906250f, 0.918457f, 0.929688f, 0.937988f, 0.945801f, 0.952148f, 0.958496f, - 0.963867f, 0.968750f, 0.988281f, 0.989258f, 0.989746f, 0.989258f, 0.989746f, 0.989258f, - 0.000241f, 0.000699f, 0.000835f, 0.001354f, 0.002066f, 0.002405f, 0.003073f, 0.003466f, - 0.003847f, 0.004868f, 0.005798f, 0.006325f, 0.007446f, 0.008553f, 0.009789f, 0.011375f, - 0.013031f, 0.014702f, 0.016937f, 0.019455f, 0.022171f, 0.025467f, 0.029541f, 0.034271f, - 0.039734f, 0.046295f, 0.054291f, 0.063904f, 0.075745f, 0.089966f, 0.107727f, 0.129395f, - 0.156250f, 0.188965f, 0.228394f, 0.274658f, 0.327637f, 0.386963f, 0.449219f, 0.512695f, - 0.574707f, 0.632324f, 0.684570f, 0.730469f, 0.770508f, 0.804688f, 0.832520f, 0.857422f, - 0.876953f, 0.893066f, 0.908691f, 0.920410f, 0.931152f, 0.940430f, 0.947754f, 0.954590f, - 0.960938f, 0.965820f, 0.986816f, 0.988770f, 0.988770f, 0.988770f, 0.988770f, 0.988770f, - 0.000122f, 0.000480f, 0.000793f, 0.001184f, 0.001847f, 0.002220f, 0.002459f, 0.003109f, - 0.003740f, 0.004234f, 0.005127f, 0.005730f, 0.006557f, 0.007458f, 0.008469f, 0.009911f, - 0.011162f, 0.012848f, 0.014519f, 0.016693f, 0.019135f, 0.021820f, 0.025024f, 0.028931f, - 0.033508f, 0.038757f, 0.045135f, 0.052856f, 0.062042f, 0.073547f, 0.087646f, 0.104736f, - 0.126099f, 0.152588f, 0.184570f, 0.223511f, 0.269775f, 0.323242f, 0.382324f, 0.445801f, - 0.510254f, 0.573242f, 0.631348f, 0.685059f, 0.731934f, 0.772461f, 0.806641f, 0.834961f, - 0.859375f, 0.879883f, 0.897461f, 0.911133f, 0.923828f, 0.933594f, 0.942383f, 0.950195f, - 0.956055f, 0.962402f, 0.985840f, 0.987305f, 0.987793f, 0.987793f, 0.988281f, 0.987793f, - 0.000244f, 0.000471f, 0.000666f, 0.001267f, 0.001592f, 0.001838f, 0.002251f, 0.002855f, - 0.003225f, 0.003828f, 0.004372f, 0.005112f, 0.005695f, 0.006340f, 0.007534f, 0.008797f, - 0.009895f, 0.011215f, 0.012604f, 0.014503f, 0.016602f, 0.018738f, 0.021408f, 0.024567f, - 0.028305f, 0.032654f, 0.037872f, 0.043732f, 0.051239f, 0.060669f, 0.071716f, 0.085510f, - 0.102356f, 0.123230f, 0.149170f, 0.180664f, 0.219849f, 0.265869f, 0.319092f, 0.379150f, - 0.443604f, 0.508789f, 0.572754f, 0.633301f, 0.686523f, 0.734863f, 0.775391f, 0.809570f, - 0.838379f, 0.862305f, 0.883301f, 0.900391f, 0.914551f, 0.926270f, 0.937012f, 0.944824f, - 0.953125f, 0.959473f, 0.985352f, 0.986816f, 0.986816f, 0.986816f, 0.986816f, 0.986816f, - 0.000242f, 0.000346f, 0.000827f, 0.001065f, 0.001428f, 0.001572f, 0.001984f, 0.002367f, - 0.002851f, 0.003277f, 0.003786f, 0.004501f, 0.005253f, 0.005955f, 0.006573f, 0.007736f, - 0.008659f, 0.009880f, 0.011177f, 0.012459f, 0.014153f, 0.016403f, 0.018173f, 0.020859f, - 0.024017f, 0.027496f, 0.031708f, 0.036682f, 0.042877f, 0.050446f, 0.059174f, 0.070068f, - 0.083374f, 0.100159f, 0.120728f, 0.145874f, 0.177612f, 0.216187f, 0.262695f, 0.316650f, - 0.377686f, 0.443115f, 0.509766f, 0.575195f, 0.635742f, 0.691406f, 0.738281f, 0.779785f, - 0.813965f, 0.843750f, 0.866699f, 0.887207f, 0.904297f, 0.918945f, 0.930176f, 0.940918f, - 0.948730f, 0.956055f, 0.984375f, 0.985840f, 0.985840f, 0.985840f, 0.986328f, 0.985840f, - 0.000242f, 0.000540f, 0.000708f, 0.000830f, 0.001143f, 0.001451f, 0.001861f, 0.002249f, - 0.002661f, 0.003010f, 0.003435f, 0.003922f, 0.004707f, 0.005165f, 0.005787f, 0.006840f, - 0.007374f, 0.008545f, 0.009651f, 0.011147f, 0.012581f, 0.014084f, 0.015991f, 0.017899f, - 0.020325f, 0.023392f, 0.026978f, 0.031113f, 0.035919f, 0.042023f, 0.049103f, 0.057831f, - 0.068420f, 0.081543f, 0.098145f, 0.118530f, 0.143921f, 0.175293f, 0.213989f, 0.260742f, - 0.316162f, 0.377441f, 0.444336f, 0.512207f, 0.579590f, 0.641113f, 0.696289f, 0.744629f, - 0.786621f, 0.820801f, 0.849609f, 0.872559f, 0.892578f, 0.908691f, 0.922363f, 0.934570f, - 0.944336f, 0.951660f, 0.982910f, 0.984375f, 0.984863f, 0.984863f, 0.985352f, 0.984863f, - 0.000106f, 0.000477f, 0.000649f, 0.000901f, 0.001110f, 0.001206f, 0.001630f, 0.002121f, - 0.002192f, 0.002743f, 0.003128f, 0.003538f, 0.003941f, 0.004688f, 0.005276f, 0.005905f, - 0.006546f, 0.007568f, 0.008461f, 0.009483f, 0.010674f, 0.011864f, 0.013649f, 0.015549f, - 0.017731f, 0.020111f, 0.023010f, 0.026199f, 0.030304f, 0.035278f, 0.040833f, 0.047821f, - 0.056580f, 0.066895f, 0.079895f, 0.096191f, 0.116760f, 0.141968f, 0.173584f, 0.212646f, - 0.260498f, 0.316162f, 0.379883f, 0.447754f, 0.517578f, 0.584961f, 0.647949f, 0.704102f, - 0.752930f, 0.792969f, 0.827148f, 0.855957f, 0.877930f, 0.898438f, 0.914062f, 0.928223f, - 0.938965f, 0.948242f, 0.981445f, 0.983398f, 0.983887f, 0.983887f, 0.983887f, 0.983398f, - 0.000208f, 0.000456f, 0.000582f, 0.000788f, 0.001016f, 0.001428f, 0.001507f, 0.001769f, - 0.002203f, 0.002525f, 0.002718f, 0.003187f, 0.003761f, 0.004238f, 0.004635f, 0.005348f, - 0.005901f, 0.006805f, 0.007500f, 0.008545f, 0.009270f, 0.010437f, 0.011742f, 0.013344f, - 0.015198f, 0.017242f, 0.019516f, 0.022430f, 0.025665f, 0.029922f, 0.034180f, 0.040161f, - 0.046936f, 0.055420f, 0.065735f, 0.078552f, 0.094666f, 0.114563f, 0.140503f, 0.172485f, - 0.212646f, 0.260986f, 0.318359f, 0.383545f, 0.453125f, 0.524414f, 0.593750f, 0.656738f, - 0.712891f, 0.761230f, 0.801270f, 0.835938f, 0.862305f, 0.885742f, 0.904785f, 0.919922f, - 0.933594f, 0.943359f, 0.980469f, 0.982422f, 0.982422f, 0.981934f, 0.982422f, 0.982422f, - 0.000170f, 0.000350f, 0.000583f, 0.000682f, 0.000845f, 0.001036f, 0.001265f, 0.001821f, - 0.001953f, 0.002163f, 0.002525f, 0.002771f, 0.003418f, 0.003729f, 0.004040f, 0.004871f, - 0.005188f, 0.005726f, 0.006512f, 0.007130f, 0.008087f, 0.009018f, 0.010216f, 0.011490f, - 0.013084f, 0.014565f, 0.016891f, 0.019073f, 0.021851f, 0.025253f, 0.029022f, 0.033539f, - 0.039124f, 0.045563f, 0.054230f, 0.064270f, 0.077271f, 0.093323f, 0.113403f, 0.139648f, - 0.172485f, 0.213379f, 0.262939f, 0.322266f, 0.389404f, 0.461426f, 0.534180f, 0.604492f, - 0.668457f, 0.724609f, 0.772461f, 0.812500f, 0.845703f, 0.872070f, 0.894043f, 0.911621f, - 0.926758f, 0.938477f, 0.979004f, 0.980469f, 0.980957f, 0.980957f, 0.980957f, 0.980957f, - 0.000000f, 0.000332f, 0.000583f, 0.000583f, 0.000848f, 0.000959f, 0.001125f, 0.001425f, - 0.001810f, 0.001899f, 0.002300f, 0.002529f, 0.002996f, 0.003162f, 0.003607f, 0.004150f, - 0.004761f, 0.005146f, 0.005791f, 0.006329f, 0.007099f, 0.008110f, 0.008949f, 0.009941f, - 0.011253f, 0.012756f, 0.014565f, 0.016434f, 0.018707f, 0.021271f, 0.024475f, 0.028290f, - 0.032745f, 0.037964f, 0.044769f, 0.052795f, 0.063416f, 0.076050f, 0.092102f, 0.113464f, - 0.139526f, 0.172974f, 0.214600f, 0.266602f, 0.327637f, 0.397461f, 0.471191f, 0.546387f, - 0.617188f, 0.682129f, 0.737793f, 0.784668f, 0.823730f, 0.854980f, 0.881348f, 0.902344f, - 0.918945f, 0.933105f, 0.977539f, 0.979492f, 0.979492f, 0.979492f, 0.979492f, 0.979492f, - 0.000000f, 0.000243f, 0.000553f, 0.000575f, 0.000591f, 0.000798f, 0.000991f, 0.001234f, - 0.001419f, 0.001812f, 0.001935f, 0.002186f, 0.002518f, 0.002975f, 0.003202f, 0.003614f, - 0.004047f, 0.004425f, 0.005013f, 0.005718f, 0.006172f, 0.007046f, 0.007740f, 0.008835f, - 0.009819f, 0.011192f, 0.012444f, 0.014114f, 0.015884f, 0.018204f, 0.020844f, 0.023392f, - 0.027420f, 0.031921f, 0.037170f, 0.043610f, 0.052032f, 0.062408f, 0.075256f, 0.091675f, - 0.112610f, 0.140015f, 0.173950f, 0.217651f, 0.271973f, 0.335693f, 0.407715f, 0.484619f, - 0.561035f, 0.633789f, 0.698242f, 0.752930f, 0.798828f, 0.836426f, 0.867676f, 0.891602f, - 0.911621f, 0.926270f, 0.975098f, 0.977539f, 0.978516f, 0.977539f, 0.977539f, 0.978027f, - 0.000121f, 0.000121f, 0.000241f, 0.000385f, 0.000684f, 0.000693f, 0.000932f, 0.001156f, - 0.001410f, 0.001648f, 0.001893f, 0.002184f, 0.002367f, 0.002579f, 0.002872f, 0.003319f, - 0.003653f, 0.003922f, 0.004425f, 0.004925f, 0.005436f, 0.006180f, 0.006836f, 0.007645f, - 0.008278f, 0.009476f, 0.010788f, 0.012169f, 0.013695f, 0.015305f, 0.017319f, 0.020111f, - 0.022858f, 0.026718f, 0.030975f, 0.036255f, 0.042938f, 0.051270f, 0.061493f, 0.074768f, - 0.091187f, 0.112976f, 0.140747f, 0.176392f, 0.222168f, 0.278809f, 0.345703f, 0.421387f, - 0.500488f, 0.578613f, 0.651855f, 0.715820f, 0.769531f, 0.813965f, 0.850586f, 0.878418f, - 0.901855f, 0.920410f, 0.973633f, 0.975586f, 0.976074f, 0.976562f, 0.976562f, 0.975098f, - 0.000240f, 0.000120f, 0.000281f, 0.000333f, 0.000498f, 0.000680f, 0.000684f, 0.001083f, - 0.001312f, 0.001618f, 0.001606f, 0.001834f, 0.002087f, 0.002316f, 0.002735f, 0.002792f, - 0.003084f, 0.003386f, 0.003944f, 0.004353f, 0.004761f, 0.005390f, 0.005997f, 0.006615f, - 0.007389f, 0.008324f, 0.008987f, 0.010284f, 0.011703f, 0.013382f, 0.014717f, 0.016953f, - 0.019424f, 0.022278f, 0.026047f, 0.030029f, 0.035492f, 0.042145f, 0.050446f, 0.060608f, - 0.073975f, 0.091187f, 0.113831f, 0.142700f, 0.180176f, 0.228271f, 0.288086f, 0.359131f, - 0.437988f, 0.519531f, 0.600098f, 0.673340f, 0.735352f, 0.787598f, 0.830566f, 0.865234f, - 0.891602f, 0.913086f, 0.971680f, 0.974121f, 0.974121f, 0.974121f, 0.974121f, 0.974609f, - 0.000000f, 0.000239f, 0.000236f, 0.000425f, 0.000487f, 0.000608f, 0.000850f, 0.001012f, - 0.001140f, 0.001260f, 0.001410f, 0.001640f, 0.001953f, 0.002003f, 0.002342f, 0.002434f, - 0.002686f, 0.002934f, 0.003305f, 0.003771f, 0.004169f, 0.004692f, 0.005028f, 0.005817f, - 0.006371f, 0.007179f, 0.007919f, 0.008965f, 0.009857f, 0.011261f, 0.012703f, 0.014229f, - 0.016312f, 0.018494f, 0.021744f, 0.025024f, 0.029633f, 0.034790f, 0.041199f, 0.049561f, - 0.060242f, 0.073608f, 0.091675f, 0.114502f, 0.144897f, 0.185547f, 0.236328f, 0.300049f, - 0.375732f, 0.458496f, 0.542969f, 0.624023f, 0.696289f, 0.758301f, 0.808105f, 0.847656f, - 0.879395f, 0.903809f, 0.968750f, 0.971191f, 0.972168f, 0.971680f, 0.972168f, 0.971680f, - 0.000000f, 0.000217f, 0.000235f, 0.000235f, 0.000321f, 0.000560f, 0.000588f, 0.000897f, - 0.001034f, 0.001040f, 0.001246f, 0.001369f, 0.001611f, 0.001692f, 0.001942f, 0.002153f, - 0.002337f, 0.002638f, 0.002878f, 0.003330f, 0.003672f, 0.003986f, 0.004498f, 0.004826f, - 0.005535f, 0.006176f, 0.006561f, 0.007538f, 0.008362f, 0.009544f, 0.010612f, 0.011879f, - 0.013794f, 0.015839f, 0.018326f, 0.020889f, 0.024567f, 0.028625f, 0.033783f, 0.040527f, - 0.049133f, 0.059998f, 0.073608f, 0.092041f, 0.116394f, 0.148682f, 0.191528f, 0.246582f, - 0.315186f, 0.395508f, 0.482910f, 0.570312f, 0.651367f, 0.722168f, 0.781738f, 0.828613f, - 0.866211f, 0.895508f, 0.966797f, 0.968750f, 0.969238f, 0.969727f, 0.969238f, 0.969238f, - 0.000000f, 0.000108f, 0.000215f, 0.000346f, 0.000352f, 0.000501f, 0.000783f, 0.000828f, - 0.000954f, 0.000980f, 0.001130f, 0.001353f, 0.001429f, 0.001522f, 0.001690f, 0.001760f, - 0.002172f, 0.002363f, 0.002522f, 0.002777f, 0.003202f, 0.003550f, 0.004040f, 0.004364f, - 0.004734f, 0.005192f, 0.005909f, 0.006271f, 0.007015f, 0.007957f, 0.008774f, 0.010185f, - 0.011681f, 0.013306f, 0.015327f, 0.017517f, 0.020264f, 0.023636f, 0.027740f, 0.033234f, - 0.039856f, 0.048340f, 0.059387f, 0.074097f, 0.093567f, 0.118896f, 0.153931f, 0.200073f, - 0.260254f, 0.334473f, 0.420410f, 0.511719f, 0.601562f, 0.682129f, 0.750488f, 0.807617f, - 0.851074f, 0.884277f, 0.963867f, 0.966309f, 0.966797f, 0.966797f, 0.966797f, 0.966797f, - 0.000000f, 0.000059f, 0.000292f, 0.000331f, 0.000344f, 0.000613f, 0.000532f, 0.000703f, - 0.000853f, 0.000915f, 0.000936f, 0.001102f, 0.001284f, 0.001430f, 0.001417f, 0.001475f, - 0.001791f, 0.001989f, 0.002161f, 0.002388f, 0.002775f, 0.003017f, 0.003357f, 0.003763f, - 0.004124f, 0.004383f, 0.004917f, 0.005436f, 0.005840f, 0.006733f, 0.007511f, 0.008667f, - 0.009567f, 0.011032f, 0.012474f, 0.014610f, 0.016739f, 0.019379f, 0.022873f, 0.027252f, - 0.032410f, 0.039062f, 0.048065f, 0.059296f, 0.074646f, 0.094971f, 0.123108f, 0.161011f, - 0.211426f, 0.277344f, 0.358154f, 0.450195f, 0.545410f, 0.636230f, 0.715332f, 0.781250f, - 0.832520f, 0.872070f, 0.960449f, 0.962402f, 0.963867f, 0.963379f, 0.962891f, 0.963379f, - 0.000000f, 0.000000f, 0.000098f, 0.000301f, 0.000315f, 0.000566f, 0.000587f, 0.000627f, - 0.000643f, 0.000795f, 0.000974f, 0.001023f, 0.000987f, 0.001031f, 0.001245f, 0.001470f, - 0.001637f, 0.001820f, 0.001884f, 0.002146f, 0.002357f, 0.002630f, 0.002913f, 0.003164f, - 0.003380f, 0.003824f, 0.004189f, 0.004353f, 0.004940f, 0.005688f, 0.006409f, 0.007347f, - 0.008018f, 0.009163f, 0.010559f, 0.012039f, 0.013695f, 0.016144f, 0.018723f, 0.022354f, - 0.026337f, 0.031433f, 0.038818f, 0.047546f, 0.059662f, 0.075623f, 0.097473f, 0.127808f, - 0.169556f, 0.225830f, 0.299072f, 0.387451f, 0.486084f, 0.583984f, 0.674805f, 0.751465f, - 0.812012f, 0.859375f, 0.957031f, 0.958984f, 0.959473f, 0.959961f, 0.959961f, 0.959961f, - 0.000000f, 0.000000f, 0.000004f, 0.000078f, 0.000408f, 0.000432f, 0.000563f, 0.000560f, - 0.000566f, 0.000623f, 0.000782f, 0.000829f, 0.000896f, 0.000956f, 0.001056f, 0.001249f, - 0.001414f, 0.001473f, 0.001646f, 0.001764f, 0.002066f, 0.002230f, 0.002436f, 0.002651f, - 0.003012f, 0.003252f, 0.003414f, 0.004055f, 0.004143f, 0.004784f, 0.005356f, 0.006077f, - 0.006870f, 0.007538f, 0.008728f, 0.009834f, 0.011322f, 0.013130f, 0.015427f, 0.017914f, - 0.021271f, 0.025436f, 0.030960f, 0.038086f, 0.047485f, 0.060303f, 0.077087f, 0.101196f, - 0.134521f, 0.180786f, 0.244507f, 0.326172f, 0.423584f, 0.527832f, 0.628418f, 0.716797f, - 0.788086f, 0.843262f, 0.953125f, 0.955566f, 0.955566f, 0.956543f, 0.956055f, 0.956543f, - 0.000000f, 0.000000f, 0.000000f, 0.000236f, 0.000320f, 0.000484f, 0.000521f, 0.000549f, - 0.000556f, 0.000584f, 0.000574f, 0.000690f, 0.000758f, 0.000841f, 0.001003f, 0.001013f, - 0.001169f, 0.001292f, 0.001437f, 0.001658f, 0.001830f, 0.002001f, 0.002081f, 0.002146f, - 0.002434f, 0.002712f, 0.002964f, 0.003220f, 0.003513f, 0.003963f, 0.004410f, 0.004875f, - 0.005608f, 0.006245f, 0.007179f, 0.008118f, 0.009201f, 0.010582f, 0.012360f, 0.014343f, - 0.016968f, 0.020401f, 0.024628f, 0.030365f, 0.037567f, 0.047455f, 0.060913f, 0.079529f, - 0.105774f, 0.143555f, 0.196167f, 0.268799f, 0.361084f, 0.467041f, 0.576172f, 0.676758f, - 0.760254f, 0.825195f, 0.948242f, 0.951660f, 0.951660f, 0.951660f, 0.951660f, 0.951660f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000257f, 0.000334f, 0.000390f, 0.000496f, - 0.000520f, 0.000539f, 0.000590f, 0.000602f, 0.000646f, 0.000725f, 0.000909f, 0.000949f, - 0.001023f, 0.001121f, 0.001181f, 0.001308f, 0.001474f, 0.001457f, 0.001714f, 0.002007f, - 0.001929f, 0.002039f, 0.002468f, 0.002672f, 0.003025f, 0.003317f, 0.003635f, 0.004047f, - 0.004433f, 0.004864f, 0.005756f, 0.006493f, 0.007515f, 0.008331f, 0.009697f, 0.011383f, - 0.014000f, 0.016235f, 0.019653f, 0.024185f, 0.029465f, 0.037109f, 0.047699f, 0.062164f, - 0.082642f, 0.112488f, 0.155151f, 0.216919f, 0.300049f, 0.404541f, 0.520020f, 0.631836f, - 0.728516f, 0.805664f, 0.943848f, 0.946289f, 0.946777f, 0.946777f, 0.947266f, 0.947266f, - 0.000000f, 0.000000f, 0.000122f, 0.000088f, 0.000219f, 0.000229f, 0.000355f, 0.000414f, - 0.000482f, 0.000545f, 0.000559f, 0.000568f, 0.000481f, 0.000668f, 0.000636f, 0.000728f, - 0.000924f, 0.000980f, 0.001017f, 0.001109f, 0.001258f, 0.001353f, 0.001451f, 0.001564f, - 0.001621f, 0.001740f, 0.002066f, 0.002289f, 0.002459f, 0.002621f, 0.002975f, 0.003349f, - 0.003588f, 0.003998f, 0.004723f, 0.005116f, 0.006035f, 0.006859f, 0.007957f, 0.009064f, - 0.010658f, 0.012711f, 0.015511f, 0.018555f, 0.023026f, 0.028854f, 0.037140f, 0.048035f, - 0.064026f, 0.086914f, 0.121033f, 0.171387f, 0.244141f, 0.341797f, 0.458740f, 0.580078f, - 0.691895f, 0.780762f, 0.937988f, 0.940430f, 0.941406f, 0.940918f, 0.941895f, 0.941406f, - 0.000000f, 0.000000f, 0.000000f, 0.000080f, 0.000211f, 0.000221f, 0.000225f, 0.000192f, - 0.000352f, 0.000368f, 0.000397f, 0.000529f, 0.000510f, 0.000504f, 0.000540f, 0.000671f, - 0.000694f, 0.000763f, 0.000902f, 0.000998f, 0.001063f, 0.001074f, 0.001128f, 0.001407f, - 0.001370f, 0.001449f, 0.001682f, 0.001635f, 0.001976f, 0.002108f, 0.002335f, 0.002558f, - 0.002905f, 0.003176f, 0.003637f, 0.003948f, 0.004650f, 0.005341f, 0.006237f, 0.007034f, - 0.008415f, 0.009811f, 0.012032f, 0.014565f, 0.017731f, 0.022324f, 0.028427f, 0.036713f, - 0.048859f, 0.066406f, 0.092957f, 0.133057f, 0.193848f, 0.281250f, 0.395508f, 0.524902f, - 0.648926f, 0.754395f, 0.931152f, 0.934570f, 0.934570f, 0.934570f, 0.935547f, 0.935059f, - 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000181f, 0.000196f, 0.000236f, 0.000250f, - 0.000226f, 0.000281f, 0.000335f, 0.000457f, 0.000406f, 0.000511f, 0.000522f, 0.000593f, - 0.000539f, 0.000663f, 0.000661f, 0.000779f, 0.000978f, 0.000855f, 0.000937f, 0.001128f, - 0.001163f, 0.001253f, 0.001241f, 0.001531f, 0.001595f, 0.001796f, 0.001888f, 0.002226f, - 0.002350f, 0.002609f, 0.002787f, 0.003260f, 0.003656f, 0.004303f, 0.004910f, 0.005577f, - 0.006683f, 0.007603f, 0.009102f, 0.011017f, 0.013603f, 0.016968f, 0.021652f, 0.027939f, - 0.037109f, 0.050262f, 0.070374f, 0.101624f, 0.150391f, 0.225220f, 0.331543f, 0.463867f, - 0.601074f, 0.723145f, 0.923828f, 0.927246f, 0.927246f, 0.928223f, 0.927734f, 0.928223f, - 0.000000f, 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000174f, 0.000156f, 0.000204f, - 0.000180f, 0.000221f, 0.000246f, 0.000346f, 0.000313f, 0.000426f, 0.000468f, 0.000482f, - 0.000559f, 0.000582f, 0.000536f, 0.000611f, 0.000770f, 0.000666f, 0.000919f, 0.000947f, - 0.001013f, 0.000948f, 0.001129f, 0.001169f, 0.001463f, 0.001579f, 0.001540f, 0.001555f, - 0.001888f, 0.002007f, 0.002390f, 0.002623f, 0.002708f, 0.003235f, 0.003584f, 0.004223f, - 0.005001f, 0.005791f, 0.006905f, 0.008118f, 0.010117f, 0.012512f, 0.015961f, 0.020798f, - 0.027374f, 0.037628f, 0.052673f, 0.076172f, 0.114197f, 0.175659f, 0.270752f, 0.399658f, - 0.546875f, 0.687012f, 0.915527f, 0.918457f, 0.919434f, 0.919434f, 0.919434f, 0.919434f, - 0.000000f, 0.000000f, 0.000121f, 0.000121f, 0.000121f, 0.000120f, 0.000139f, 0.000141f, - 0.000152f, 0.000186f, 0.000209f, 0.000222f, 0.000297f, 0.000330f, 0.000367f, 0.000403f, - 0.000433f, 0.000456f, 0.000457f, 0.000484f, 0.000521f, 0.000544f, 0.000594f, 0.000807f, - 0.000790f, 0.000841f, 0.000784f, 0.001025f, 0.001112f, 0.001014f, 0.001146f, 0.001287f, - 0.001485f, 0.001541f, 0.001740f, 0.002014f, 0.002264f, 0.002460f, 0.002825f, 0.003124f, - 0.003683f, 0.004177f, 0.005024f, 0.006004f, 0.007454f, 0.009041f, 0.011833f, 0.014839f, - 0.019791f, 0.027283f, 0.038361f, 0.055817f, 0.084656f, 0.133057f, 0.213013f, 0.334717f, - 0.488770f, 0.645996f, 0.905762f, 0.909668f, 0.909668f, 0.909180f, 0.910645f, 0.908691f, - 0.000000f, 0.000000f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000119f, 0.000115f, - 0.000104f, 0.000105f, 0.000203f, 0.000235f, 0.000185f, 0.000290f, 0.000201f, 0.000306f, - 0.000259f, 0.000370f, 0.000401f, 0.000428f, 0.000596f, 0.000617f, 0.000474f, 0.000593f, - 0.000641f, 0.000676f, 0.000682f, 0.000826f, 0.000897f, 0.000934f, 0.000972f, 0.000972f, - 0.001213f, 0.001281f, 0.001410f, 0.001451f, 0.001562f, 0.001786f, 0.002031f, 0.002417f, - 0.002764f, 0.003162f, 0.003763f, 0.004406f, 0.005310f, 0.006454f, 0.008156f, 0.010849f, - 0.014305f, 0.019318f, 0.027328f, 0.039856f, 0.061310f, 0.097717f, 0.162354f, 0.270752f, - 0.424805f, 0.599609f, 0.894043f, 0.897949f, 0.898438f, 0.898438f, 0.898926f, 0.898438f, - 0.000000f, 0.000121f, 0.000121f, 0.000120f, 0.000119f, 0.000119f, 0.000118f, 0.000118f, - 0.000112f, 0.000102f, 0.000094f, 0.000109f, 0.000131f, 0.000145f, 0.000232f, 0.000171f, - 0.000278f, 0.000230f, 0.000347f, 0.000331f, 0.000379f, 0.000381f, 0.000512f, 0.000427f, - 0.000541f, 0.000566f, 0.000547f, 0.000613f, 0.000706f, 0.000660f, 0.000809f, 0.000941f, - 0.000950f, 0.001035f, 0.001069f, 0.001220f, 0.001149f, 0.001314f, 0.001603f, 0.001801f, - 0.002062f, 0.002394f, 0.002737f, 0.003057f, 0.003771f, 0.004471f, 0.005875f, 0.007217f, - 0.009651f, 0.013344f, 0.018829f, 0.027710f, 0.043091f, 0.069214f, 0.119141f, 0.210571f, - 0.358398f, 0.544922f, 0.881348f, 0.883789f, 0.885254f, 0.885742f, 0.885254f, 0.885254f, - 0.000000f, 0.000121f, 0.000120f, 0.000119f, 0.000119f, 0.000118f, 0.000117f, 0.000116f, - 0.000116f, 0.000110f, 0.000101f, 0.000094f, 0.000087f, 0.000157f, 0.000151f, 0.000168f, - 0.000146f, 0.000219f, 0.000214f, 0.000261f, 0.000313f, 0.000363f, 0.000311f, 0.000415f, - 0.000476f, 0.000448f, 0.000429f, 0.000460f, 0.000481f, 0.000560f, 0.000544f, 0.000695f, - 0.000626f, 0.000789f, 0.000877f, 0.000894f, 0.000948f, 0.001177f, 0.001175f, 0.001366f, - 0.001487f, 0.001738f, 0.002008f, 0.002304f, 0.002663f, 0.003250f, 0.004002f, 0.004932f, - 0.006416f, 0.008636f, 0.012344f, 0.018127f, 0.028610f, 0.047150f, 0.083923f, 0.156860f, - 0.291260f, 0.487305f, 0.866211f, 0.869141f, 0.870605f, 0.870117f, 0.871094f, 0.870117f, - 0.000000f, 0.000000f, 0.000119f, 0.000118f, 0.000117f, 0.000116f, 0.000115f, 0.000115f, - 0.000114f, 0.000114f, 0.000109f, 0.000101f, 0.000094f, 0.000087f, 0.000081f, 0.000085f, - 0.000129f, 0.000150f, 0.000176f, 0.000193f, 0.000216f, 0.000257f, 0.000241f, 0.000302f, - 0.000259f, 0.000299f, 0.000397f, 0.000403f, 0.000384f, 0.000402f, 0.000425f, 0.000582f, - 0.000467f, 0.000614f, 0.000660f, 0.000625f, 0.000650f, 0.000819f, 0.000790f, 0.000879f, - 0.001001f, 0.001140f, 0.001403f, 0.001555f, 0.001844f, 0.002213f, 0.002636f, 0.003235f, - 0.004082f, 0.005604f, 0.007896f, 0.011292f, 0.018005f, 0.030472f, 0.055786f, 0.109985f, - 0.224976f, 0.421875f, 0.848145f, 0.852539f, 0.853027f, 0.852539f, 0.852539f, 0.853027f, - 0.000000f, 0.000119f, 0.000118f, 0.000116f, 0.000115f, 0.000114f, 0.000113f, 0.000112f, - 0.000111f, 0.000111f, 0.000110f, 0.000108f, 0.000101f, 0.000094f, 0.000088f, 0.000082f, - 0.000077f, 0.000109f, 0.000068f, 0.000102f, 0.000127f, 0.000158f, 0.000177f, 0.000192f, - 0.000207f, 0.000214f, 0.000249f, 0.000278f, 0.000296f, 0.000320f, 0.000330f, 0.000342f, - 0.000415f, 0.000371f, 0.000389f, 0.000508f, 0.000463f, 0.000586f, 0.000606f, 0.000649f, - 0.000724f, 0.000841f, 0.000910f, 0.001065f, 0.001236f, 0.001475f, 0.001807f, 0.002138f, - 0.002716f, 0.003622f, 0.004921f, 0.006950f, 0.010574f, 0.018433f, 0.034607f, 0.072449f, - 0.163818f, 0.352295f, 0.827637f, 0.831055f, 0.831543f, 0.832031f, 0.833008f, 0.832520f, - 0.000120f, 0.000116f, 0.000114f, 0.000113f, 0.000111f, 0.000110f, 0.000109f, 0.000108f, - 0.000107f, 0.000106f, 0.000106f, 0.000105f, 0.000104f, 0.000101f, 0.000094f, 0.000088f, - 0.000083f, 0.000078f, 0.000073f, 0.000092f, 0.000064f, 0.000097f, 0.000073f, 0.000105f, - 0.000125f, 0.000162f, 0.000179f, 0.000177f, 0.000191f, 0.000221f, 0.000241f, 0.000235f, - 0.000270f, 0.000277f, 0.000287f, 0.000329f, 0.000319f, 0.000428f, 0.000417f, 0.000409f, - 0.000524f, 0.000537f, 0.000612f, 0.000750f, 0.000770f, 0.000961f, 0.001153f, 0.001347f, - 0.001702f, 0.002081f, 0.002903f, 0.003956f, 0.006184f, 0.010368f, 0.019592f, 0.043427f, - 0.109924f, 0.280518f, 0.803223f, 0.806152f, 0.807617f, 0.808594f, 0.809082f, 0.808105f, - 0.000000f, 0.000111f, 0.000106f, 0.000107f, 0.000104f, 0.000103f, 0.000101f, 0.000101f, - 0.000101f, 0.000100f, 0.000099f, 0.000098f, 0.000097f, 0.000097f, 0.000097f, 0.000094f, - 0.000088f, 0.000083f, 0.000078f, 0.000073f, 0.000069f, 0.000070f, 0.000061f, 0.000068f, - 0.000059f, 0.000067f, 0.000084f, 0.000097f, 0.000128f, 0.000137f, 0.000165f, 0.000160f, - 0.000176f, 0.000185f, 0.000217f, 0.000239f, 0.000237f, 0.000238f, 0.000272f, 0.000281f, - 0.000314f, 0.000372f, 0.000395f, 0.000430f, 0.000504f, 0.000578f, 0.000665f, 0.000856f, - 0.000969f, 0.001210f, 0.001594f, 0.002216f, 0.003370f, 0.005527f, 0.010170f, 0.023239f, - 0.066101f, 0.207275f, 0.775391f, 0.779785f, 0.780273f, 0.780762f, 0.780273f, 0.780762f, - 0.000000f, 0.000094f, 0.000097f, 0.000095f, 0.000092f, 0.000091f, 0.000091f, 0.000090f, - 0.000089f, 0.000089f, 0.000088f, 0.000088f, 0.000087f, 0.000086f, 0.000087f, 0.000086f, - 0.000086f, 0.000085f, 0.000081f, 0.000076f, 0.000072f, 0.000068f, 0.000064f, 0.000060f, - 0.000057f, 0.000054f, 0.000058f, 0.000048f, 0.000048f, 0.000069f, 0.000068f, 0.000092f, - 0.000110f, 0.000122f, 0.000133f, 0.000136f, 0.000146f, 0.000154f, 0.000175f, 0.000194f, - 0.000204f, 0.000206f, 0.000238f, 0.000262f, 0.000266f, 0.000338f, 0.000361f, 0.000432f, - 0.000527f, 0.000659f, 0.000848f, 0.001183f, 0.001713f, 0.002661f, 0.004921f, 0.010887f, - 0.033936f, 0.138428f, 0.743652f, 0.747559f, 0.748047f, 0.748535f, 0.749512f, 0.749023f, - 0.000045f, 0.000047f, 0.000059f, 0.000059f, 0.000063f, 0.000068f, 0.000068f, 0.000068f, - 0.000067f, 0.000069f, 0.000068f, 0.000070f, 0.000070f, 0.000070f, 0.000071f, 0.000070f, - 0.000071f, 0.000071f, 0.000071f, 0.000071f, 0.000071f, 0.000069f, 0.000065f, 0.000062f, - 0.000058f, 0.000055f, 0.000052f, 0.000049f, 0.000046f, 0.000044f, 0.000041f, 0.000050f, - 0.000051f, 0.000048f, 0.000061f, 0.000070f, 0.000084f, 0.000095f, 0.000107f, 0.000104f, - 0.000111f, 0.000128f, 0.000143f, 0.000154f, 0.000157f, 0.000186f, 0.000198f, 0.000216f, - 0.000268f, 0.000315f, 0.000414f, 0.000537f, 0.000735f, 0.001149f, 0.002075f, 0.004669f, - 0.014175f, 0.077881f, 0.707031f, 0.710449f, 0.712402f, 0.711914f, 0.712891f, 0.712402f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000012f, 0.000013f, 0.000029f, - 0.000028f, 0.000037f, 0.000035f, 0.000039f, 0.000043f, 0.000043f, 0.000045f, 0.000045f, - 0.000048f, 0.000048f, 0.000050f, 0.000051f, 0.000052f, 0.000052f, 0.000053f, 0.000054f, - 0.000054f, 0.000053f, 0.000050f, 0.000048f, 0.000045f, 0.000043f, 0.000040f, 0.000038f, - 0.000036f, 0.000034f, 0.000032f, 0.000030f, 0.000028f, 0.000030f, 0.000038f, 0.000043f, - 0.000057f, 0.000069f, 0.000072f, 0.000073f, 0.000082f, 0.000095f, 0.000101f, 0.000099f, - 0.000116f, 0.000130f, 0.000184f, 0.000211f, 0.000301f, 0.000443f, 0.000737f, 0.001601f, - 0.004978f, 0.032593f, 0.666504f, 0.669922f, 0.669922f, 0.672363f, 0.670898f, 0.670410f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000006f, 0.000010f, - 0.000012f, 0.000015f, 0.000018f, 0.000021f, 0.000022f, 0.000023f, 0.000025f, 0.000028f, - 0.000029f, 0.000029f, 0.000031f, 0.000033f, 0.000033f, 0.000035f, 0.000035f, 0.000035f, - 0.000033f, 0.000031f, 0.000029f, 0.000028f, 0.000026f, 0.000024f, 0.000023f, 0.000021f, - 0.000020f, 0.000019f, 0.000022f, 0.000022f, 0.000030f, 0.000038f, 0.000042f, 0.000041f, - 0.000052f, 0.000047f, 0.000064f, 0.000072f, 0.000078f, 0.000129f, 0.000201f, 0.000382f, - 0.001180f, 0.009117f, 0.620605f, 0.624512f, 0.625000f, 0.625000f, 0.625000f, 0.625488f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000003f, 0.000005f, 0.000007f, 0.000008f, - 0.000010f, 0.000011f, 0.000012f, 0.000014f, 0.000016f, 0.000016f, 0.000018f, 0.000017f, - 0.000016f, 0.000015f, 0.000014f, 0.000013f, 0.000012f, 0.000011f, 0.000010f, 0.000009f, - 0.000011f, 0.000014f, 0.000018f, 0.000018f, 0.000021f, 0.000028f, 0.000035f, 0.000053f, - 0.000136f, 0.001152f, 0.571777f, 0.575684f, 0.575684f, 0.576172f, 0.576660f, 0.576660f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, - 0.000002f, 0.000004f, 0.000004f, 0.000004f, 0.000003f, 0.000003f, 0.000002f, 0.000004f, - 0.000003f, 0.000011f, 0.520020f, 0.523926f, 0.524902f, 0.524902f, 0.524902f, 0.524902f, - }, - { - 0.119934f, 0.328857f, 0.480713f, 0.586914f, 0.663086f, 0.717773f, 0.759766f, 0.791504f, - 0.818359f, 0.838867f, 0.856934f, 0.871094f, 0.883301f, 0.894043f, 0.902832f, 0.911621f, - 0.917969f, 0.924805f, 0.930664f, 0.936035f, 0.939941f, 0.944824f, 0.948242f, 0.951660f, - 0.954590f, 0.958008f, 0.961426f, 0.962891f, 0.966309f, 0.967285f, 0.970215f, 0.972656f, - 0.973633f, 0.975586f, 0.977539f, 0.978516f, 0.979980f, 0.981445f, 0.982910f, 0.984375f, - 0.985352f, 0.986328f, 0.987793f, 0.988770f, 0.989746f, 0.990234f, 0.991699f, 0.992676f, - 0.993164f, 0.993652f, 0.994629f, 0.995117f, 0.996094f, 0.996582f, 0.997559f, 0.998047f, - 0.998535f, 0.999023f, 0.999512f, 0.999023f, 0.999023f, 0.998535f, 0.998535f, 0.998047f, - 0.046875f, 0.160400f, 0.286621f, 0.405518f, 0.507812f, 0.590820f, 0.656250f, 0.708008f, - 0.748535f, 0.781250f, 0.809082f, 0.830566f, 0.848633f, 0.864258f, 0.877441f, 0.888672f, - 0.898926f, 0.906738f, 0.915039f, 0.921387f, 0.928223f, 0.933105f, 0.937988f, 0.942871f, - 0.946777f, 0.950684f, 0.954102f, 0.957031f, 0.959961f, 0.962402f, 0.965332f, 0.966797f, - 0.969727f, 0.971191f, 0.973145f, 0.975098f, 0.977539f, 0.978027f, 0.980469f, 0.981934f, - 0.982910f, 0.984375f, 0.985352f, 0.986816f, 0.987793f, 0.988770f, 0.989258f, 0.990723f, - 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.994629f, 0.995605f, 0.996582f, 0.996582f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.998535f, 0.998535f, 0.998047f, - 0.023788f, 0.084473f, 0.163696f, 0.255615f, 0.351807f, 0.445312f, 0.527832f, 0.597656f, - 0.656738f, 0.703613f, 0.742676f, 0.775879f, 0.802734f, 0.824707f, 0.843262f, 0.858887f, - 0.873047f, 0.884766f, 0.895508f, 0.903809f, 0.913086f, 0.919434f, 0.925781f, 0.931641f, - 0.937012f, 0.941406f, 0.945801f, 0.949707f, 0.953125f, 0.956543f, 0.959473f, 0.962402f, - 0.964844f, 0.967285f, 0.969238f, 0.972168f, 0.973633f, 0.975098f, 0.977539f, 0.979492f, - 0.980469f, 0.981445f, 0.982910f, 0.984375f, 0.985840f, 0.986816f, 0.988281f, 0.988770f, - 0.989746f, 0.990723f, 0.992188f, 0.992676f, 0.993652f, 0.994629f, 0.995605f, 0.996094f, - 0.996582f, 0.997559f, 0.998535f, 0.998535f, 0.998535f, 0.998047f, 0.998047f, 0.997559f, - 0.014595f, 0.050110f, 0.097717f, 0.158569f, 0.230347f, 0.311523f, 0.394531f, 0.473145f, - 0.544922f, 0.606934f, 0.660645f, 0.705566f, 0.743164f, 0.775391f, 0.800781f, 0.822266f, - 0.841309f, 0.856934f, 0.870605f, 0.883301f, 0.894043f, 0.902832f, 0.911133f, 0.918945f, - 0.925293f, 0.931152f, 0.936035f, 0.941406f, 0.945801f, 0.949707f, 0.953125f, 0.956055f, - 0.959473f, 0.962402f, 0.964844f, 0.967285f, 0.970215f, 0.972168f, 0.974121f, 0.975098f, - 0.977539f, 0.979004f, 0.980957f, 0.981934f, 0.983398f, 0.984375f, 0.985840f, 0.987305f, - 0.988281f, 0.989258f, 0.990723f, 0.991699f, 0.992676f, 0.993652f, 0.994629f, 0.995117f, - 0.995605f, 0.996582f, 0.998535f, 0.998535f, 0.998535f, 0.998047f, 0.998047f, 0.997559f, - 0.009178f, 0.032379f, 0.062561f, 0.102417f, 0.151611f, 0.210938f, 0.279785f, 0.352783f, - 0.426758f, 0.496826f, 0.561035f, 0.618164f, 0.666992f, 0.708496f, 0.744141f, 0.773926f, - 0.800781f, 0.821777f, 0.840820f, 0.856445f, 0.870117f, 0.882324f, 0.893066f, 0.901855f, - 0.910645f, 0.918457f, 0.925293f, 0.930176f, 0.935547f, 0.941406f, 0.946289f, 0.949707f, - 0.953125f, 0.956543f, 0.959961f, 0.962891f, 0.965332f, 0.967773f, 0.969727f, 0.972656f, - 0.974121f, 0.976074f, 0.977539f, 0.979492f, 0.981445f, 0.982422f, 0.984375f, 0.985840f, - 0.986328f, 0.987793f, 0.989258f, 0.990234f, 0.991211f, 0.992188f, 0.993164f, 0.994141f, - 0.994629f, 0.995605f, 0.998047f, 0.998047f, 0.998047f, 0.997559f, 0.997559f, 0.997559f, - 0.006382f, 0.022430f, 0.042908f, 0.068970f, 0.102844f, 0.144653f, 0.195557f, 0.253906f, - 0.318848f, 0.386230f, 0.454590f, 0.518066f, 0.577148f, 0.628906f, 0.675293f, 0.714844f, - 0.748535f, 0.777344f, 0.802246f, 0.823730f, 0.841797f, 0.856934f, 0.871094f, 0.882812f, - 0.893555f, 0.902832f, 0.911133f, 0.918457f, 0.925293f, 0.930176f, 0.937012f, 0.940918f, - 0.945801f, 0.950195f, 0.953613f, 0.957031f, 0.960449f, 0.963379f, 0.966309f, 0.968262f, - 0.970703f, 0.973145f, 0.974609f, 0.976562f, 0.978516f, 0.980469f, 0.981934f, 0.983398f, - 0.984375f, 0.985840f, 0.988281f, 0.988770f, 0.989746f, 0.990723f, 0.991699f, 0.992676f, - 0.993652f, 0.994629f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997070f, - 0.004585f, 0.015961f, 0.030930f, 0.049133f, 0.072144f, 0.101013f, 0.137451f, 0.181519f, - 0.232544f, 0.290039f, 0.352539f, 0.416748f, 0.479736f, 0.538574f, 0.592773f, 0.641602f, - 0.684570f, 0.723145f, 0.754395f, 0.782715f, 0.805176f, 0.825195f, 0.843750f, 0.859863f, - 0.872559f, 0.884766f, 0.895020f, 0.904297f, 0.912109f, 0.919922f, 0.926270f, 0.932129f, - 0.937500f, 0.942383f, 0.946289f, 0.950195f, 0.955078f, 0.958008f, 0.961426f, 0.964355f, - 0.967285f, 0.969238f, 0.971680f, 0.974121f, 0.975586f, 0.977539f, 0.979492f, 0.980957f, - 0.982910f, 0.984375f, 0.985840f, 0.986328f, 0.988281f, 0.989746f, 0.990723f, 0.992188f, - 0.992676f, 0.993164f, 0.997559f, 0.997559f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.003483f, 0.012291f, 0.023209f, 0.036041f, 0.052429f, 0.073486f, 0.099182f, 0.131226f, - 0.169678f, 0.214844f, 0.266846f, 0.323242f, 0.383545f, 0.444580f, 0.503418f, 0.559082f, - 0.609375f, 0.655762f, 0.695312f, 0.730957f, 0.760254f, 0.788086f, 0.810059f, 0.829590f, - 0.847168f, 0.862793f, 0.875488f, 0.886719f, 0.896973f, 0.906250f, 0.914551f, 0.921387f, - 0.927734f, 0.933594f, 0.938965f, 0.944336f, 0.948242f, 0.952148f, 0.956543f, 0.958984f, - 0.961914f, 0.965332f, 0.968262f, 0.970703f, 0.972656f, 0.974609f, 0.977051f, 0.979004f, - 0.980469f, 0.981934f, 0.983887f, 0.985352f, 0.986328f, 0.987793f, 0.989746f, 0.990234f, - 0.991699f, 0.992676f, 0.996582f, 0.997070f, 0.997070f, 0.996582f, 0.996582f, 0.996094f, - 0.002962f, 0.009613f, 0.017792f, 0.027481f, 0.039429f, 0.055176f, 0.073914f, 0.096985f, - 0.125610f, 0.159180f, 0.199707f, 0.246216f, 0.297607f, 0.353760f, 0.412842f, 0.470215f, - 0.526367f, 0.578613f, 0.626953f, 0.669434f, 0.707031f, 0.740723f, 0.769043f, 0.794922f, - 0.814941f, 0.835449f, 0.851074f, 0.866699f, 0.879395f, 0.890137f, 0.899902f, 0.909180f, - 0.916992f, 0.924316f, 0.929688f, 0.936035f, 0.941406f, 0.945312f, 0.950195f, 0.953613f, - 0.957520f, 0.960938f, 0.963867f, 0.966797f, 0.969238f, 0.971680f, 0.974121f, 0.976562f, - 0.979004f, 0.979980f, 0.981934f, 0.982910f, 0.984375f, 0.986816f, 0.987793f, 0.988770f, - 0.990234f, 0.991699f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996094f, 0.996094f, - 0.002077f, 0.007637f, 0.013802f, 0.021606f, 0.031006f, 0.042419f, 0.055969f, 0.073242f, - 0.094055f, 0.119446f, 0.150513f, 0.186401f, 0.228638f, 0.276123f, 0.328857f, 0.384277f, - 0.440674f, 0.496338f, 0.549805f, 0.598633f, 0.644043f, 0.683594f, 0.719727f, 0.750977f, - 0.779297f, 0.802246f, 0.823730f, 0.840820f, 0.855957f, 0.871582f, 0.882324f, 0.893555f, - 0.903809f, 0.911621f, 0.920410f, 0.926758f, 0.932617f, 0.938477f, 0.943359f, 0.947754f, - 0.953125f, 0.955566f, 0.959473f, 0.962402f, 0.965332f, 0.968262f, 0.970703f, 0.972656f, - 0.976074f, 0.977051f, 0.979492f, 0.981445f, 0.983398f, 0.984863f, 0.986328f, 0.987793f, - 0.989258f, 0.990723f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.995605f, - 0.002014f, 0.006035f, 0.011299f, 0.017410f, 0.024368f, 0.033020f, 0.043701f, 0.056458f, - 0.072205f, 0.091431f, 0.114807f, 0.141968f, 0.174316f, 0.213257f, 0.256836f, 0.306152f, - 0.358887f, 0.413330f, 0.468018f, 0.520996f, 0.572266f, 0.618652f, 0.661621f, 0.699707f, - 0.732910f, 0.762695f, 0.788574f, 0.810547f, 0.830078f, 0.848145f, 0.862305f, 0.875977f, - 0.887695f, 0.898438f, 0.907227f, 0.915527f, 0.922852f, 0.929199f, 0.936035f, 0.940918f, - 0.946289f, 0.950684f, 0.953613f, 0.958496f, 0.960938f, 0.964355f, 0.967285f, 0.970215f, - 0.972656f, 0.975586f, 0.977539f, 0.979492f, 0.980957f, 0.982910f, 0.984863f, 0.986328f, - 0.987793f, 0.988770f, 0.995117f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, - 0.001496f, 0.005196f, 0.009201f, 0.013985f, 0.019806f, 0.026413f, 0.034943f, 0.044647f, - 0.056641f, 0.070923f, 0.088623f, 0.109680f, 0.135254f, 0.164795f, 0.200073f, 0.240845f, - 0.285645f, 0.335449f, 0.387939f, 0.441650f, 0.495850f, 0.546875f, 0.595215f, 0.639160f, - 0.679199f, 0.715820f, 0.746582f, 0.774414f, 0.798828f, 0.819824f, 0.837402f, 0.854492f, - 0.869629f, 0.881348f, 0.893066f, 0.902832f, 0.912109f, 0.918945f, 0.926758f, 0.933105f, - 0.938477f, 0.943359f, 0.948730f, 0.952637f, 0.956055f, 0.960449f, 0.963379f, 0.966797f, - 0.969238f, 0.972656f, 0.975098f, 0.977051f, 0.979004f, 0.981445f, 0.982910f, 0.984375f, - 0.986328f, 0.987305f, 0.994629f, 0.995605f, 0.995117f, 0.995117f, 0.995117f, 0.994629f, - 0.001187f, 0.004314f, 0.007740f, 0.011337f, 0.016373f, 0.021759f, 0.028198f, 0.035889f, - 0.045197f, 0.056580f, 0.069946f, 0.085938f, 0.105408f, 0.128784f, 0.155884f, 0.187866f, - 0.225830f, 0.268066f, 0.315186f, 0.365479f, 0.418213f, 0.471680f, 0.522949f, 0.572754f, - 0.617676f, 0.659668f, 0.697754f, 0.730957f, 0.760742f, 0.787109f, 0.809570f, 0.830078f, - 0.846680f, 0.862793f, 0.875488f, 0.888184f, 0.898926f, 0.907715f, 0.916016f, 0.923340f, - 0.930664f, 0.936523f, 0.941895f, 0.947754f, 0.951660f, 0.955566f, 0.959473f, 0.963867f, - 0.966309f, 0.969238f, 0.972168f, 0.974121f, 0.976562f, 0.979004f, 0.980957f, 0.982910f, - 0.984863f, 0.986816f, 0.994141f, 0.994629f, 0.994629f, 0.994629f, 0.994629f, 0.994141f, - 0.001187f, 0.003733f, 0.006496f, 0.009918f, 0.013634f, 0.017899f, 0.023026f, 0.029343f, - 0.036621f, 0.045227f, 0.055786f, 0.068298f, 0.083740f, 0.101135f, 0.122314f, 0.147827f, - 0.177612f, 0.212891f, 0.252686f, 0.297119f, 0.345215f, 0.395996f, 0.448730f, 0.500488f, - 0.550781f, 0.597656f, 0.641113f, 0.680664f, 0.716309f, 0.747559f, 0.774414f, 0.799316f, - 0.820312f, 0.838867f, 0.855957f, 0.870117f, 0.883301f, 0.894531f, 0.904785f, 0.913086f, - 0.920898f, 0.928223f, 0.935059f, 0.940430f, 0.945312f, 0.950684f, 0.955566f, 0.958496f, - 0.962891f, 0.965820f, 0.968750f, 0.971680f, 0.974609f, 0.976562f, 0.978516f, 0.980957f, - 0.982910f, 0.984863f, 0.994141f, 0.994141f, 0.994629f, 0.994141f, 0.994141f, 0.994629f, - 0.000998f, 0.003178f, 0.005444f, 0.008179f, 0.011337f, 0.015091f, 0.019058f, 0.024368f, - 0.029587f, 0.037140f, 0.045197f, 0.055115f, 0.066772f, 0.080688f, 0.097229f, 0.117371f, - 0.140869f, 0.169312f, 0.201538f, 0.238770f, 0.280762f, 0.326660f, 0.376709f, 0.427490f, - 0.479248f, 0.530273f, 0.578613f, 0.623535f, 0.664551f, 0.701660f, 0.733887f, 0.763672f, - 0.790039f, 0.812500f, 0.832520f, 0.849121f, 0.865234f, 0.878906f, 0.890625f, 0.901367f, - 0.910645f, 0.919434f, 0.926758f, 0.933105f, 0.939453f, 0.944824f, 0.949707f, 0.954590f, - 0.958008f, 0.961914f, 0.965332f, 0.968750f, 0.971680f, 0.974121f, 0.977051f, 0.979004f, - 0.980957f, 0.982910f, 0.993164f, 0.993164f, 0.994141f, 0.993652f, 0.993652f, 0.993164f, - 0.000948f, 0.002638f, 0.004784f, 0.007153f, 0.009590f, 0.012505f, 0.016388f, 0.020599f, - 0.025299f, 0.031097f, 0.037323f, 0.045197f, 0.054047f, 0.065002f, 0.078674f, 0.094055f, - 0.112305f, 0.134399f, 0.160889f, 0.191040f, 0.226318f, 0.265869f, 0.310303f, 0.358154f, - 0.409180f, 0.459473f, 0.510254f, 0.559082f, 0.606445f, 0.648926f, 0.687500f, 0.722168f, - 0.753418f, 0.781250f, 0.804199f, 0.825684f, 0.843262f, 0.860840f, 0.874512f, 0.886719f, - 0.898926f, 0.907227f, 0.916992f, 0.924805f, 0.932129f, 0.937988f, 0.943848f, 0.949219f, - 0.954102f, 0.958496f, 0.961426f, 0.965332f, 0.968750f, 0.972168f, 0.974609f, 0.977051f, - 0.979492f, 0.981445f, 0.992188f, 0.993164f, 0.993164f, 0.993164f, 0.993164f, 0.992676f, - 0.000696f, 0.002352f, 0.004002f, 0.006138f, 0.008446f, 0.010826f, 0.013840f, 0.017258f, - 0.021194f, 0.025970f, 0.031128f, 0.037140f, 0.044281f, 0.053436f, 0.063660f, 0.076050f, - 0.090271f, 0.107727f, 0.128662f, 0.152832f, 0.182007f, 0.214111f, 0.252930f, 0.295166f, - 0.341553f, 0.390625f, 0.442139f, 0.492676f, 0.541992f, 0.589844f, 0.633301f, 0.674316f, - 0.710938f, 0.743652f, 0.772461f, 0.796875f, 0.819824f, 0.839355f, 0.854980f, 0.870605f, - 0.884277f, 0.895508f, 0.906738f, 0.915527f, 0.923828f, 0.931152f, 0.937500f, 0.944336f, - 0.949219f, 0.953613f, 0.958008f, 0.962402f, 0.965332f, 0.968750f, 0.972168f, 0.974609f, - 0.977051f, 0.979980f, 0.991211f, 0.992676f, 0.992188f, 0.992188f, 0.992188f, 0.992676f, - 0.000838f, 0.002033f, 0.003664f, 0.005077f, 0.007282f, 0.009415f, 0.011749f, 0.014931f, - 0.017853f, 0.021606f, 0.025864f, 0.031219f, 0.037231f, 0.044464f, 0.052338f, 0.062500f, - 0.073853f, 0.087463f, 0.104065f, 0.123230f, 0.146362f, 0.173340f, 0.205078f, 0.240845f, - 0.281982f, 0.326660f, 0.374756f, 0.425049f, 0.476807f, 0.526855f, 0.574219f, 0.620117f, - 0.662598f, 0.699219f, 0.733398f, 0.764160f, 0.791016f, 0.813965f, 0.833984f, 0.851074f, - 0.867676f, 0.880859f, 0.893555f, 0.904785f, 0.914062f, 0.922852f, 0.930176f, 0.937012f, - 0.942383f, 0.948242f, 0.953125f, 0.957520f, 0.962402f, 0.966309f, 0.969238f, 0.973145f, - 0.975098f, 0.978027f, 0.991699f, 0.991699f, 0.992676f, 0.992188f, 0.991699f, 0.992188f, - 0.000600f, 0.001687f, 0.003023f, 0.004963f, 0.006405f, 0.008163f, 0.010368f, 0.012718f, - 0.015480f, 0.018311f, 0.022064f, 0.026169f, 0.031097f, 0.036926f, 0.043457f, 0.051392f, - 0.060669f, 0.071350f, 0.084473f, 0.100220f, 0.118103f, 0.140259f, 0.166016f, 0.195679f, - 0.230469f, 0.269531f, 0.313232f, 0.360596f, 0.410156f, 0.460693f, 0.511719f, 0.560547f, - 0.607422f, 0.650879f, 0.689941f, 0.724609f, 0.756348f, 0.784180f, 0.808594f, 0.828613f, - 0.847656f, 0.864258f, 0.879395f, 0.892090f, 0.903320f, 0.912598f, 0.921875f, 0.929688f, - 0.936523f, 0.942871f, 0.947754f, 0.953125f, 0.957520f, 0.961914f, 0.966309f, 0.969238f, - 0.972656f, 0.975586f, 0.990234f, 0.991211f, 0.991211f, 0.991699f, 0.991211f, 0.991211f, - 0.000269f, 0.001538f, 0.002800f, 0.003868f, 0.005524f, 0.007179f, 0.008987f, 0.011063f, - 0.013084f, 0.015747f, 0.019211f, 0.022324f, 0.026474f, 0.031311f, 0.036530f, 0.042969f, - 0.050201f, 0.059174f, 0.069641f, 0.081543f, 0.096680f, 0.114075f, 0.134644f, 0.158691f, - 0.187622f, 0.220581f, 0.258301f, 0.300781f, 0.347168f, 0.395996f, 0.447266f, 0.498291f, - 0.547852f, 0.595215f, 0.640625f, 0.680176f, 0.717285f, 0.749512f, 0.778320f, 0.803223f, - 0.825684f, 0.845215f, 0.862793f, 0.877441f, 0.890625f, 0.901855f, 0.912109f, 0.920898f, - 0.929688f, 0.937012f, 0.942871f, 0.949707f, 0.954102f, 0.958496f, 0.962402f, 0.966309f, - 0.970215f, 0.974121f, 0.989746f, 0.990234f, 0.990723f, 0.990723f, 0.990723f, 0.990234f, - 0.000341f, 0.001337f, 0.002573f, 0.003475f, 0.004765f, 0.006329f, 0.007717f, 0.009499f, - 0.011642f, 0.014107f, 0.016556f, 0.019470f, 0.022491f, 0.026169f, 0.030945f, 0.036011f, - 0.042389f, 0.049042f, 0.057678f, 0.067993f, 0.079468f, 0.093384f, 0.110046f, 0.129883f, - 0.152710f, 0.180420f, 0.212158f, 0.248291f, 0.289551f, 0.334961f, 0.383301f, 0.434570f, - 0.485596f, 0.536133f, 0.584473f, 0.630371f, 0.671875f, 0.710449f, 0.743652f, 0.773926f, - 0.799316f, 0.823242f, 0.843262f, 0.860352f, 0.875977f, 0.889648f, 0.901367f, 0.911621f, - 0.921387f, 0.929688f, 0.937012f, 0.943848f, 0.950195f, 0.955078f, 0.959473f, 0.963379f, - 0.967773f, 0.971191f, 0.988770f, 0.989746f, 0.990234f, 0.990234f, 0.990234f, 0.990234f, - 0.000564f, 0.001324f, 0.002092f, 0.003191f, 0.004471f, 0.005348f, 0.007069f, 0.008438f, - 0.010201f, 0.011810f, 0.014297f, 0.016586f, 0.019470f, 0.022644f, 0.026428f, 0.030579f, - 0.035797f, 0.041718f, 0.048248f, 0.056213f, 0.065857f, 0.076782f, 0.090271f, 0.106262f, - 0.125122f, 0.147095f, 0.173462f, 0.204224f, 0.239746f, 0.279785f, 0.323730f, 0.372314f, - 0.422607f, 0.474121f, 0.526367f, 0.575195f, 0.621582f, 0.664062f, 0.703613f, 0.738770f, - 0.769043f, 0.796387f, 0.820312f, 0.841797f, 0.858887f, 0.875488f, 0.889648f, 0.900879f, - 0.912598f, 0.921875f, 0.930664f, 0.937500f, 0.944336f, 0.950195f, 0.955566f, 0.959961f, - 0.964844f, 0.968750f, 0.987305f, 0.989258f, 0.989258f, 0.989258f, 0.989258f, 0.988770f, - 0.000369f, 0.001128f, 0.001871f, 0.002792f, 0.003712f, 0.004723f, 0.006016f, 0.007542f, - 0.008896f, 0.010773f, 0.012421f, 0.014381f, 0.016632f, 0.019791f, 0.022354f, 0.025955f, - 0.030609f, 0.035065f, 0.040924f, 0.047333f, 0.055084f, 0.064209f, 0.075012f, 0.087769f, - 0.102966f, 0.120911f, 0.142456f, 0.167358f, 0.197144f, 0.231812f, 0.270752f, 0.314209f, - 0.362549f, 0.412598f, 0.464844f, 0.515625f, 0.566895f, 0.614258f, 0.657715f, 0.698730f, - 0.734863f, 0.766602f, 0.794922f, 0.818848f, 0.839844f, 0.858887f, 0.875000f, 0.889648f, - 0.901855f, 0.912598f, 0.922852f, 0.931152f, 0.938965f, 0.945312f, 0.951660f, 0.957520f, - 0.961426f, 0.966309f, 0.986816f, 0.988281f, 0.988281f, 0.988770f, 0.988281f, 0.988281f, - 0.000466f, 0.000900f, 0.001792f, 0.002695f, 0.003458f, 0.004204f, 0.005356f, 0.006512f, - 0.007896f, 0.009300f, 0.010895f, 0.012459f, 0.014786f, 0.016739f, 0.019424f, 0.022461f, - 0.026062f, 0.029831f, 0.034851f, 0.039764f, 0.046417f, 0.053711f, 0.062164f, 0.072388f, - 0.085205f, 0.099365f, 0.117004f, 0.137573f, 0.162231f, 0.190674f, 0.224121f, 0.262451f, - 0.305664f, 0.353027f, 0.403809f, 0.456055f, 0.508301f, 0.559082f, 0.608398f, 0.652832f, - 0.694824f, 0.731445f, 0.764160f, 0.793945f, 0.817871f, 0.839355f, 0.858398f, 0.875488f, - 0.890137f, 0.902832f, 0.913574f, 0.923828f, 0.932617f, 0.940918f, 0.946777f, 0.953613f, - 0.958984f, 0.963379f, 0.985840f, 0.987305f, 0.987305f, 0.987793f, 0.987305f, 0.987305f, - 0.000234f, 0.001040f, 0.001661f, 0.002392f, 0.003101f, 0.003681f, 0.004944f, 0.005844f, - 0.007065f, 0.008217f, 0.009247f, 0.010925f, 0.012894f, 0.014549f, 0.017090f, 0.019455f, - 0.022385f, 0.025650f, 0.029449f, 0.033936f, 0.039215f, 0.045135f, 0.052612f, 0.060944f, - 0.070312f, 0.082397f, 0.096924f, 0.113525f, 0.133179f, 0.156860f, 0.184814f, 0.217773f, - 0.255127f, 0.298340f, 0.345215f, 0.395996f, 0.448242f, 0.501953f, 0.553223f, 0.603516f, - 0.649414f, 0.691895f, 0.729980f, 0.763184f, 0.792480f, 0.818359f, 0.841309f, 0.858887f, - 0.877441f, 0.891113f, 0.904785f, 0.915527f, 0.925781f, 0.933594f, 0.941895f, 0.949219f, - 0.955566f, 0.960449f, 0.984863f, 0.985840f, 0.986328f, 0.986816f, 0.986328f, 0.986816f, - 0.000241f, 0.000808f, 0.001395f, 0.001986f, 0.002731f, 0.003429f, 0.004131f, 0.005402f, - 0.006077f, 0.007347f, 0.008522f, 0.009544f, 0.011345f, 0.013046f, 0.014534f, 0.016953f, - 0.019241f, 0.022339f, 0.025208f, 0.029175f, 0.033691f, 0.038300f, 0.044067f, 0.051331f, - 0.059143f, 0.068726f, 0.080322f, 0.093567f, 0.109802f, 0.129883f, 0.152466f, 0.179810f, - 0.211792f, 0.249390f, 0.291748f, 0.338623f, 0.389404f, 0.442139f, 0.496338f, 0.548340f, - 0.599121f, 0.645996f, 0.689941f, 0.728516f, 0.762695f, 0.792969f, 0.818848f, 0.842285f, - 0.862793f, 0.878906f, 0.894043f, 0.906250f, 0.917969f, 0.927734f, 0.935547f, 0.944336f, - 0.951172f, 0.957031f, 0.983398f, 0.985352f, 0.985840f, 0.985352f, 0.985840f, 0.985352f, - 0.000340f, 0.000735f, 0.001377f, 0.001853f, 0.002382f, 0.003159f, 0.004021f, 0.004642f, - 0.005604f, 0.006340f, 0.007298f, 0.008591f, 0.009895f, 0.011154f, 0.012871f, 0.014580f, - 0.016876f, 0.019180f, 0.022141f, 0.024979f, 0.028748f, 0.032745f, 0.037964f, 0.043213f, - 0.050171f, 0.057831f, 0.066833f, 0.078247f, 0.091553f, 0.107178f, 0.125977f, 0.148315f, - 0.175415f, 0.207153f, 0.244019f, 0.286377f, 0.333008f, 0.383789f, 0.437744f, 0.491943f, - 0.545410f, 0.597168f, 0.645508f, 0.688965f, 0.729004f, 0.764160f, 0.794434f, 0.821289f, - 0.843750f, 0.864258f, 0.881348f, 0.895996f, 0.909180f, 0.920898f, 0.929199f, 0.938965f, - 0.946777f, 0.952637f, 0.982910f, 0.983887f, 0.984863f, 0.984863f, 0.984375f, 0.984863f, - 0.000236f, 0.000605f, 0.001135f, 0.001415f, 0.002329f, 0.002747f, 0.003551f, 0.004158f, - 0.004723f, 0.005535f, 0.006687f, 0.007534f, 0.008545f, 0.009979f, 0.011375f, 0.012993f, - 0.014656f, 0.016754f, 0.018921f, 0.021759f, 0.024506f, 0.028183f, 0.032043f, 0.036743f, - 0.042236f, 0.048645f, 0.056030f, 0.065125f, 0.075928f, 0.089050f, 0.104370f, 0.122681f, - 0.145142f, 0.171509f, 0.202759f, 0.239258f, 0.281250f, 0.328369f, 0.379639f, 0.433838f, - 0.489014f, 0.543945f, 0.596191f, 0.645020f, 0.690430f, 0.730957f, 0.766113f, 0.797852f, - 0.824219f, 0.846680f, 0.867188f, 0.884766f, 0.899414f, 0.912109f, 0.923828f, 0.933105f, - 0.942383f, 0.949707f, 0.980957f, 0.982910f, 0.983398f, 0.983398f, 0.983887f, 0.982910f, - 0.000214f, 0.000710f, 0.001021f, 0.001429f, 0.001858f, 0.002607f, 0.003220f, 0.003738f, - 0.004459f, 0.005032f, 0.005726f, 0.006748f, 0.007748f, 0.008659f, 0.010002f, 0.011368f, - 0.012985f, 0.014656f, 0.016525f, 0.018921f, 0.021286f, 0.024231f, 0.027649f, 0.031464f, - 0.035858f, 0.041321f, 0.047363f, 0.054840f, 0.063538f, 0.074097f, 0.086609f, 0.101990f, - 0.120117f, 0.141846f, 0.168213f, 0.199219f, 0.235352f, 0.277344f, 0.324707f, 0.376953f, - 0.432373f, 0.488037f, 0.543457f, 0.597168f, 0.646973f, 0.692871f, 0.732910f, 0.769531f, - 0.801270f, 0.828125f, 0.850586f, 0.871582f, 0.888184f, 0.903809f, 0.915527f, 0.927246f, - 0.936523f, 0.946289f, 0.979492f, 0.981445f, 0.981934f, 0.982422f, 0.981934f, 0.981934f, - 0.000000f, 0.000468f, 0.001076f, 0.001489f, 0.002048f, 0.002413f, 0.002853f, 0.003468f, - 0.003952f, 0.004444f, 0.005211f, 0.005917f, 0.006733f, 0.007763f, 0.008713f, 0.010262f, - 0.011368f, 0.012733f, 0.014458f, 0.016296f, 0.018478f, 0.021072f, 0.023666f, 0.026810f, - 0.030746f, 0.035278f, 0.040131f, 0.046295f, 0.053711f, 0.062195f, 0.072327f, 0.084717f, - 0.099487f, 0.117371f, 0.139038f, 0.164795f, 0.195923f, 0.232422f, 0.274414f, 0.322266f, - 0.374756f, 0.431641f, 0.488525f, 0.545410f, 0.599121f, 0.650879f, 0.697754f, 0.738770f, - 0.774414f, 0.806641f, 0.832520f, 0.856445f, 0.875488f, 0.893555f, 0.907715f, 0.920410f, - 0.931152f, 0.940918f, 0.978027f, 0.980469f, 0.980469f, 0.980957f, 0.980957f, 0.980957f, - 0.000279f, 0.000497f, 0.000763f, 0.001353f, 0.001794f, 0.002079f, 0.002451f, 0.002956f, - 0.003498f, 0.004150f, 0.004589f, 0.005310f, 0.006130f, 0.006958f, 0.007828f, 0.008888f, - 0.009895f, 0.011124f, 0.012772f, 0.014282f, 0.016235f, 0.018127f, 0.020630f, 0.022873f, - 0.026321f, 0.029938f, 0.034241f, 0.039368f, 0.045319f, 0.052338f, 0.060852f, 0.070801f, - 0.082947f, 0.097595f, 0.115051f, 0.136353f, 0.162231f, 0.193481f, 0.229858f, 0.272217f, - 0.321777f, 0.375000f, 0.432373f, 0.490479f, 0.548340f, 0.604004f, 0.655762f, 0.702637f, - 0.743652f, 0.780273f, 0.812500f, 0.838867f, 0.862305f, 0.881348f, 0.897949f, 0.912598f, - 0.925293f, 0.935547f, 0.976562f, 0.978516f, 0.979492f, 0.979980f, 0.979492f, 0.979004f, - 0.000110f, 0.000473f, 0.000781f, 0.001262f, 0.001584f, 0.001890f, 0.002270f, 0.002607f, - 0.003241f, 0.003704f, 0.004055f, 0.004795f, 0.005356f, 0.005997f, 0.006760f, 0.007896f, - 0.008896f, 0.009918f, 0.011200f, 0.012451f, 0.013802f, 0.015556f, 0.017838f, 0.020065f, - 0.022751f, 0.025864f, 0.029358f, 0.033600f, 0.038574f, 0.044342f, 0.050995f, 0.059296f, - 0.069214f, 0.081116f, 0.095459f, 0.113159f, 0.133911f, 0.160400f, 0.191406f, 0.228638f, - 0.272217f, 0.321289f, 0.375732f, 0.434326f, 0.493896f, 0.552734f, 0.609863f, 0.662109f, - 0.709961f, 0.750977f, 0.787598f, 0.819336f, 0.846680f, 0.868164f, 0.887695f, 0.904297f, - 0.917969f, 0.930176f, 0.975098f, 0.977539f, 0.977051f, 0.977539f, 0.977539f, 0.977539f, - 0.000242f, 0.000464f, 0.000831f, 0.001027f, 0.001271f, 0.001722f, 0.001965f, 0.002243f, - 0.002714f, 0.003036f, 0.003651f, 0.004025f, 0.004902f, 0.005638f, 0.006176f, 0.006943f, - 0.007763f, 0.008789f, 0.009804f, 0.010872f, 0.012070f, 0.013695f, 0.015381f, 0.017395f, - 0.019608f, 0.022232f, 0.025009f, 0.028885f, 0.032623f, 0.037659f, 0.043182f, 0.050018f, - 0.058167f, 0.067810f, 0.079224f, 0.093811f, 0.111328f, 0.132324f, 0.158569f, 0.190063f, - 0.228149f, 0.271973f, 0.322510f, 0.378906f, 0.438477f, 0.499756f, 0.560059f, 0.618164f, - 0.671387f, 0.718750f, 0.760742f, 0.796875f, 0.826660f, 0.854492f, 0.875000f, 0.894531f, - 0.911133f, 0.923828f, 0.973145f, 0.976074f, 0.975586f, 0.976074f, 0.976074f, 0.977051f, - 0.000242f, 0.000552f, 0.000701f, 0.001063f, 0.001186f, 0.001462f, 0.001690f, 0.002340f, - 0.002703f, 0.002728f, 0.003325f, 0.003828f, 0.004333f, 0.004913f, 0.005474f, 0.006077f, - 0.006943f, 0.007607f, 0.008553f, 0.009460f, 0.010582f, 0.011871f, 0.013451f, 0.015091f, - 0.016983f, 0.019165f, 0.021637f, 0.024673f, 0.027863f, 0.031525f, 0.036713f, 0.041962f, - 0.048615f, 0.056396f, 0.066162f, 0.077942f, 0.092590f, 0.110046f, 0.130981f, 0.157593f, - 0.189331f, 0.228394f, 0.273926f, 0.325684f, 0.383301f, 0.444580f, 0.507324f, 0.569824f, - 0.627441f, 0.682129f, 0.729980f, 0.770508f, 0.807129f, 0.837402f, 0.863281f, 0.884766f, - 0.902832f, 0.917969f, 0.971191f, 0.973633f, 0.974609f, 0.974121f, 0.974609f, 0.974609f, - 0.000239f, 0.000239f, 0.000658f, 0.000899f, 0.001204f, 0.001252f, 0.001629f, 0.001815f, - 0.002470f, 0.002430f, 0.003134f, 0.003321f, 0.003925f, 0.004238f, 0.004856f, 0.005341f, - 0.006161f, 0.006615f, 0.007511f, 0.008224f, 0.009277f, 0.010445f, 0.011818f, 0.013046f, - 0.014473f, 0.016510f, 0.018814f, 0.021057f, 0.023834f, 0.027237f, 0.030853f, 0.035675f, - 0.040894f, 0.047241f, 0.055145f, 0.064758f, 0.076782f, 0.090942f, 0.108398f, 0.130371f, - 0.157104f, 0.189819f, 0.229248f, 0.276367f, 0.329834f, 0.390137f, 0.453125f, 0.517578f, - 0.580566f, 0.640625f, 0.694336f, 0.741699f, 0.782715f, 0.817871f, 0.848145f, 0.872559f, - 0.893555f, 0.910645f, 0.969727f, 0.971191f, 0.972656f, 0.972168f, 0.972168f, 0.972168f, - 0.000222f, 0.000463f, 0.000620f, 0.000837f, 0.000900f, 0.001048f, 0.001381f, 0.001820f, - 0.001957f, 0.002329f, 0.002747f, 0.002964f, 0.003330f, 0.003986f, 0.004322f, 0.004677f, - 0.005302f, 0.005760f, 0.006569f, 0.007359f, 0.008141f, 0.009293f, 0.010101f, 0.011452f, - 0.012779f, 0.014496f, 0.016144f, 0.018097f, 0.020157f, 0.023148f, 0.026611f, 0.029785f, - 0.034515f, 0.039856f, 0.046478f, 0.054016f, 0.063843f, 0.075378f, 0.089233f, 0.107666f, - 0.129639f, 0.156860f, 0.190674f, 0.231445f, 0.280518f, 0.336426f, 0.398193f, 0.463379f, - 0.530273f, 0.595215f, 0.654785f, 0.708984f, 0.755371f, 0.796875f, 0.831543f, 0.860352f, - 0.883789f, 0.903809f, 0.966797f, 0.968750f, 0.969727f, 0.970215f, 0.970215f, 0.969727f, - 0.000000f, 0.000345f, 0.000464f, 0.000686f, 0.000782f, 0.001030f, 0.001139f, 0.001598f, - 0.001846f, 0.002237f, 0.002489f, 0.002684f, 0.003067f, 0.003344f, 0.003895f, 0.004158f, - 0.004845f, 0.005131f, 0.005886f, 0.006561f, 0.007195f, 0.007912f, 0.008965f, 0.009941f, - 0.010956f, 0.012383f, 0.013893f, 0.015602f, 0.017303f, 0.019623f, 0.022156f, 0.025452f, - 0.028976f, 0.033722f, 0.038910f, 0.045288f, 0.052887f, 0.062561f, 0.074097f, 0.088623f, - 0.106812f, 0.129639f, 0.157715f, 0.192261f, 0.235107f, 0.285889f, 0.344482f, 0.408691f, - 0.476807f, 0.545410f, 0.610840f, 0.671387f, 0.725098f, 0.771484f, 0.811035f, 0.843750f, - 0.871582f, 0.894043f, 0.964355f, 0.967285f, 0.967285f, 0.967773f, 0.967773f, 0.967773f, - 0.000000f, 0.000320f, 0.000576f, 0.000572f, 0.000767f, 0.000945f, 0.001066f, 0.001375f, - 0.001848f, 0.001980f, 0.002190f, 0.002399f, 0.002695f, 0.002943f, 0.003397f, 0.003664f, - 0.004063f, 0.004566f, 0.005119f, 0.005688f, 0.006130f, 0.007057f, 0.007778f, 0.008675f, - 0.009590f, 0.010666f, 0.011971f, 0.013443f, 0.015129f, 0.016953f, 0.018875f, 0.021576f, - 0.024658f, 0.028488f, 0.032959f, 0.037811f, 0.043793f, 0.051819f, 0.061371f, 0.073181f, - 0.088257f, 0.106506f, 0.129883f, 0.159180f, 0.195679f, 0.240479f, 0.293457f, 0.355225f, - 0.422852f, 0.492432f, 0.563477f, 0.629883f, 0.690918f, 0.743652f, 0.789062f, 0.827148f, - 0.858398f, 0.884277f, 0.961914f, 0.964844f, 0.964355f, 0.964844f, 0.964355f, 0.965332f, - 0.000000f, 0.000242f, 0.000435f, 0.000547f, 0.000688f, 0.000803f, 0.001175f, 0.001318f, - 0.001593f, 0.001652f, 0.001961f, 0.002209f, 0.002481f, 0.002716f, 0.002911f, 0.003210f, - 0.003595f, 0.004005f, 0.004490f, 0.004894f, 0.005508f, 0.006107f, 0.006714f, 0.007462f, - 0.008438f, 0.009277f, 0.010170f, 0.011436f, 0.012756f, 0.014145f, 0.016205f, 0.018433f, - 0.020966f, 0.023819f, 0.027405f, 0.031464f, 0.036713f, 0.043152f, 0.050842f, 0.060577f, - 0.071960f, 0.087219f, 0.106689f, 0.130371f, 0.161377f, 0.199585f, 0.246948f, 0.303467f, - 0.367920f, 0.439697f, 0.512207f, 0.584473f, 0.651855f, 0.712402f, 0.764160f, 0.808105f, - 0.844727f, 0.875000f, 0.958008f, 0.961426f, 0.961914f, 0.961914f, 0.962402f, 0.961914f, - 0.000000f, 0.000237f, 0.000266f, 0.000387f, 0.000557f, 0.000691f, 0.000774f, 0.001221f, - 0.001455f, 0.001492f, 0.001769f, 0.001896f, 0.002151f, 0.002386f, 0.002529f, 0.002911f, - 0.003147f, 0.003523f, 0.003862f, 0.004311f, 0.004848f, 0.005260f, 0.005795f, 0.006416f, - 0.007114f, 0.007942f, 0.008667f, 0.009666f, 0.010818f, 0.012184f, 0.013718f, 0.015541f, - 0.017685f, 0.020126f, 0.023056f, 0.026306f, 0.030853f, 0.035797f, 0.042053f, 0.049683f, - 0.059784f, 0.072144f, 0.086914f, 0.106873f, 0.132202f, 0.164429f, 0.205200f, 0.255615f, - 0.315918f, 0.384521f, 0.458984f, 0.534668f, 0.607910f, 0.676758f, 0.735840f, 0.785645f, - 0.828125f, 0.862305f, 0.955566f, 0.958008f, 0.958984f, 0.958496f, 0.958984f, 0.958984f, - 0.000000f, 0.000119f, 0.000234f, 0.000484f, 0.000603f, 0.000758f, 0.000934f, 0.000999f, - 0.001200f, 0.001343f, 0.001534f, 0.001725f, 0.001860f, 0.002056f, 0.002235f, 0.002445f, - 0.002783f, 0.003115f, 0.003448f, 0.003757f, 0.004192f, 0.004723f, 0.005077f, 0.005653f, - 0.006172f, 0.006527f, 0.007328f, 0.008247f, 0.009140f, 0.010368f, 0.011711f, 0.013351f, - 0.014702f, 0.016937f, 0.019226f, 0.022156f, 0.025604f, 0.029877f, 0.034668f, 0.040710f, - 0.048920f, 0.058624f, 0.071289f, 0.087219f, 0.107727f, 0.134521f, 0.168701f, 0.212769f, - 0.267090f, 0.331543f, 0.404785f, 0.482910f, 0.561523f, 0.635742f, 0.702637f, 0.760742f, - 0.809570f, 0.849121f, 0.951660f, 0.954590f, 0.955566f, 0.955566f, 0.956055f, 0.955566f, - 0.000238f, 0.000218f, 0.000229f, 0.000242f, 0.000313f, 0.000859f, 0.000623f, 0.000978f, - 0.001021f, 0.001150f, 0.001320f, 0.001431f, 0.001546f, 0.001746f, 0.001895f, 0.002106f, - 0.002502f, 0.002630f, 0.002926f, 0.003296f, 0.003651f, 0.003918f, 0.004391f, 0.004910f, - 0.005249f, 0.005558f, 0.006413f, 0.007114f, 0.007866f, 0.008789f, 0.009872f, 0.011093f, - 0.012413f, 0.013939f, 0.015945f, 0.018692f, 0.021225f, 0.024643f, 0.028687f, 0.033936f, - 0.040192f, 0.047791f, 0.058014f, 0.070923f, 0.087585f, 0.109131f, 0.137573f, 0.174683f, - 0.222290f, 0.280762f, 0.350830f, 0.428955f, 0.511230f, 0.592285f, 0.666992f, 0.733398f, - 0.789062f, 0.834473f, 0.947754f, 0.951172f, 0.951660f, 0.951172f, 0.951660f, 0.951172f, - 0.000000f, 0.000205f, 0.000222f, 0.000344f, 0.000301f, 0.000775f, 0.000827f, 0.000719f, - 0.000944f, 0.000976f, 0.001306f, 0.001249f, 0.001404f, 0.001569f, 0.001604f, 0.001819f, - 0.002182f, 0.002354f, 0.002569f, 0.002857f, 0.003113f, 0.003426f, 0.003649f, 0.004112f, - 0.004307f, 0.004925f, 0.005508f, 0.005802f, 0.006565f, 0.007450f, 0.008125f, 0.009079f, - 0.010269f, 0.011665f, 0.013565f, 0.015213f, 0.017410f, 0.020203f, 0.023743f, 0.028168f, - 0.032684f, 0.039062f, 0.047058f, 0.057404f, 0.070984f, 0.088623f, 0.111389f, 0.142090f, - 0.182373f, 0.234253f, 0.298828f, 0.375000f, 0.458008f, 0.543945f, 0.627441f, 0.702148f, - 0.765137f, 0.818359f, 0.942871f, 0.946289f, 0.947266f, 0.947266f, 0.946777f, 0.947266f, - 0.000064f, 0.000095f, 0.000197f, 0.000213f, 0.000459f, 0.000491f, 0.000647f, 0.000696f, - 0.000884f, 0.000911f, 0.001121f, 0.001115f, 0.001234f, 0.001371f, 0.001410f, 0.001743f, - 0.001905f, 0.002016f, 0.002207f, 0.002438f, 0.002714f, 0.002939f, 0.003183f, 0.003323f, - 0.003727f, 0.004143f, 0.004555f, 0.005276f, 0.005531f, 0.006264f, 0.006702f, 0.007572f, - 0.008705f, 0.009712f, 0.011238f, 0.012650f, 0.014320f, 0.016815f, 0.019516f, 0.022400f, - 0.026566f, 0.031799f, 0.038055f, 0.046417f, 0.057037f, 0.071350f, 0.089722f, 0.114868f, - 0.148193f, 0.192749f, 0.249878f, 0.321045f, 0.404053f, 0.493408f, 0.583008f, 0.666016f, - 0.739258f, 0.799316f, 0.937988f, 0.941406f, 0.941895f, 0.942383f, 0.942383f, 0.942383f, - 0.000000f, 0.000007f, 0.000144f, 0.000427f, 0.000443f, 0.000566f, 0.000589f, 0.000615f, - 0.000725f, 0.000731f, 0.000896f, 0.000953f, 0.001062f, 0.001167f, 0.001344f, 0.001345f, - 0.001636f, 0.001774f, 0.001893f, 0.002069f, 0.002350f, 0.002457f, 0.002678f, 0.002743f, - 0.003105f, 0.003513f, 0.003830f, 0.004227f, 0.004589f, 0.005047f, 0.005669f, 0.006176f, - 0.007153f, 0.007896f, 0.008911f, 0.010231f, 0.011818f, 0.013618f, 0.015465f, 0.018188f, - 0.021576f, 0.025452f, 0.030533f, 0.037048f, 0.045685f, 0.056915f, 0.071533f, 0.091675f, - 0.118958f, 0.156006f, 0.205444f, 0.270020f, 0.349609f, 0.439941f, 0.533691f, 0.625977f, - 0.708984f, 0.778320f, 0.931641f, 0.936035f, 0.936523f, 0.937012f, 0.937012f, 0.937012f, - 0.000000f, 0.000000f, 0.000137f, 0.000262f, 0.000432f, 0.000437f, 0.000444f, 0.000590f, - 0.000558f, 0.000606f, 0.000817f, 0.000877f, 0.000909f, 0.000951f, 0.001191f, 0.001244f, - 0.001373f, 0.001506f, 0.001702f, 0.001690f, 0.001955f, 0.001940f, 0.002283f, 0.002340f, - 0.002571f, 0.002871f, 0.003265f, 0.003475f, 0.003910f, 0.004181f, 0.004608f, 0.005112f, - 0.005833f, 0.006416f, 0.007145f, 0.008209f, 0.009636f, 0.010750f, 0.012642f, 0.014481f, - 0.017197f, 0.020203f, 0.024353f, 0.029694f, 0.036041f, 0.045105f, 0.056702f, 0.072388f, - 0.094482f, 0.124329f, 0.166504f, 0.223022f, 0.295898f, 0.384766f, 0.482910f, 0.582031f, - 0.675293f, 0.754883f, 0.926270f, 0.929688f, 0.930664f, 0.930664f, 0.931152f, 0.930664f, - 0.000000f, 0.000000f, 0.000000f, 0.000232f, 0.000357f, 0.000411f, 0.000513f, 0.000527f, - 0.000490f, 0.000504f, 0.000653f, 0.000750f, 0.000780f, 0.000976f, 0.000942f, 0.000967f, - 0.001180f, 0.001252f, 0.001385f, 0.001425f, 0.001559f, 0.001801f, 0.001886f, 0.002144f, - 0.002111f, 0.002354f, 0.002645f, 0.002827f, 0.003187f, 0.003414f, 0.003792f, 0.004360f, - 0.004662f, 0.005146f, 0.005875f, 0.006783f, 0.007610f, 0.008797f, 0.010033f, 0.011566f, - 0.013565f, 0.016006f, 0.019165f, 0.023163f, 0.028320f, 0.035400f, 0.044647f, 0.057129f, - 0.074402f, 0.098572f, 0.132812f, 0.180542f, 0.245728f, 0.330078f, 0.428955f, 0.535156f, - 0.638184f, 0.728516f, 0.919434f, 0.922852f, 0.923828f, 0.923828f, 0.923828f, 0.924316f, - 0.000000f, 0.000000f, 0.000000f, 0.000114f, 0.000248f, 0.000359f, 0.000386f, 0.000342f, - 0.000465f, 0.000461f, 0.000490f, 0.000609f, 0.000638f, 0.000694f, 0.000807f, 0.000923f, - 0.000961f, 0.001074f, 0.001123f, 0.001268f, 0.001311f, 0.001494f, 0.001537f, 0.001754f, - 0.001899f, 0.001917f, 0.002199f, 0.002241f, 0.002583f, 0.002769f, 0.003101f, 0.003441f, - 0.003775f, 0.004200f, 0.004787f, 0.005272f, 0.006062f, 0.006702f, 0.007732f, 0.009102f, - 0.010582f, 0.012466f, 0.014984f, 0.017990f, 0.021957f, 0.027222f, 0.034332f, 0.044128f, - 0.057434f, 0.076538f, 0.104126f, 0.143799f, 0.199829f, 0.275879f, 0.373047f, 0.482422f, - 0.594727f, 0.698730f, 0.910645f, 0.914551f, 0.916504f, 0.916016f, 0.916504f, 0.915527f, - 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000221f, 0.000222f, 0.000392f, 0.000402f, - 0.000396f, 0.000434f, 0.000476f, 0.000548f, 0.000536f, 0.000644f, 0.000642f, 0.000793f, - 0.000795f, 0.000912f, 0.000953f, 0.000989f, 0.001164f, 0.001197f, 0.001285f, 0.001480f, - 0.001511f, 0.001674f, 0.001703f, 0.001901f, 0.002075f, 0.002340f, 0.002499f, 0.002800f, - 0.003019f, 0.003296f, 0.003695f, 0.004093f, 0.004780f, 0.005260f, 0.006207f, 0.006939f, - 0.008034f, 0.009598f, 0.011353f, 0.013702f, 0.016678f, 0.020874f, 0.026062f, 0.033539f, - 0.044006f, 0.058746f, 0.080139f, 0.111877f, 0.158447f, 0.226318f, 0.317627f, 0.428711f, - 0.548828f, 0.665039f, 0.901367f, 0.907227f, 0.907715f, 0.908203f, 0.908203f, 0.907227f, - 0.000000f, 0.000000f, 0.000122f, 0.000173f, 0.000191f, 0.000215f, 0.000224f, 0.000261f, - 0.000340f, 0.000374f, 0.000380f, 0.000496f, 0.000416f, 0.000535f, 0.000592f, 0.000622f, - 0.000701f, 0.000772f, 0.000742f, 0.000774f, 0.000990f, 0.000945f, 0.001088f, 0.001105f, - 0.001348f, 0.001231f, 0.001460f, 0.001620f, 0.001758f, 0.001941f, 0.002008f, 0.002092f, - 0.002430f, 0.002615f, 0.002886f, 0.003208f, 0.003519f, 0.004112f, 0.004704f, 0.005371f, - 0.006149f, 0.007351f, 0.008659f, 0.010201f, 0.012550f, 0.015549f, 0.019577f, 0.025436f, - 0.032928f, 0.044220f, 0.060608f, 0.084961f, 0.123474f, 0.180664f, 0.263184f, 0.372314f, - 0.498291f, 0.626465f, 0.892578f, 0.895996f, 0.896973f, 0.896973f, 0.897949f, 0.897949f, - 0.000000f, 0.000000f, 0.000121f, 0.000121f, 0.000120f, 0.000192f, 0.000201f, 0.000222f, - 0.000222f, 0.000276f, 0.000295f, 0.000344f, 0.000433f, 0.000470f, 0.000485f, 0.000549f, - 0.000555f, 0.000558f, 0.000566f, 0.000639f, 0.000678f, 0.000757f, 0.000840f, 0.000905f, - 0.000999f, 0.000946f, 0.001018f, 0.001309f, 0.001402f, 0.001417f, 0.001624f, 0.001692f, - 0.001869f, 0.002003f, 0.002184f, 0.002602f, 0.002851f, 0.003157f, 0.003595f, 0.004063f, - 0.004734f, 0.005398f, 0.006275f, 0.007542f, 0.009148f, 0.011383f, 0.014275f, 0.018250f, - 0.024063f, 0.032135f, 0.044922f, 0.063721f, 0.093811f, 0.139648f, 0.211914f, 0.314697f, - 0.444092f, 0.584961f, 0.879883f, 0.884766f, 0.885254f, 0.885742f, 0.886230f, 0.885742f, - 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000120f, 0.000154f, 0.000150f, 0.000160f, - 0.000202f, 0.000217f, 0.000308f, 0.000319f, 0.000278f, 0.000392f, 0.000362f, 0.000432f, - 0.000416f, 0.000448f, 0.000495f, 0.000526f, 0.000710f, 0.000754f, 0.000657f, 0.000755f, - 0.000806f, 0.000919f, 0.000815f, 0.001080f, 0.001152f, 0.001207f, 0.001218f, 0.001373f, - 0.001320f, 0.001685f, 0.001764f, 0.001819f, 0.002068f, 0.002380f, 0.002668f, 0.003033f, - 0.003584f, 0.003979f, 0.004829f, 0.005402f, 0.006630f, 0.008080f, 0.010254f, 0.013069f, - 0.017044f, 0.023422f, 0.031647f, 0.046417f, 0.068604f, 0.104919f, 0.165161f, 0.258789f, - 0.387207f, 0.537598f, 0.867188f, 0.871582f, 0.872559f, 0.872559f, 0.872559f, 0.873047f, - 0.000000f, 0.000121f, 0.000120f, 0.000120f, 0.000119f, 0.000118f, 0.000122f, 0.000108f, - 0.000143f, 0.000149f, 0.000184f, 0.000194f, 0.000189f, 0.000210f, 0.000321f, 0.000282f, - 0.000376f, 0.000420f, 0.000533f, 0.000437f, 0.000467f, 0.000477f, 0.000587f, 0.000519f, - 0.000673f, 0.000662f, 0.000679f, 0.000845f, 0.000881f, 0.000863f, 0.001016f, 0.001093f, - 0.001176f, 0.001191f, 0.001336f, 0.001561f, 0.001573f, 0.001754f, 0.001919f, 0.002264f, - 0.002596f, 0.002911f, 0.003372f, 0.003870f, 0.004723f, 0.005733f, 0.007092f, 0.008965f, - 0.011650f, 0.015701f, 0.022339f, 0.032043f, 0.048370f, 0.076050f, 0.124084f, 0.204834f, - 0.328369f, 0.485596f, 0.852539f, 0.856934f, 0.858887f, 0.858887f, 0.858887f, 0.858398f, - 0.000000f, 0.000121f, 0.000120f, 0.000119f, 0.000118f, 0.000117f, 0.000116f, 0.000114f, - 0.000105f, 0.000110f, 0.000165f, 0.000133f, 0.000157f, 0.000240f, 0.000256f, 0.000257f, - 0.000249f, 0.000303f, 0.000342f, 0.000346f, 0.000485f, 0.000510f, 0.000398f, 0.000493f, - 0.000492f, 0.000524f, 0.000590f, 0.000585f, 0.000601f, 0.000740f, 0.000647f, 0.000871f, - 0.000834f, 0.000969f, 0.001020f, 0.001190f, 0.001244f, 0.001432f, 0.001393f, 0.001702f, - 0.001912f, 0.002171f, 0.002445f, 0.002958f, 0.003330f, 0.004025f, 0.004860f, 0.006161f, - 0.007896f, 0.010742f, 0.014671f, 0.021378f, 0.032928f, 0.052612f, 0.089050f, 0.155884f, - 0.268555f, 0.430664f, 0.836426f, 0.841309f, 0.841309f, 0.842285f, 0.842773f, 0.842285f, - 0.000000f, 0.000000f, 0.000119f, 0.000117f, 0.000116f, 0.000115f, 0.000114f, 0.000114f, - 0.000111f, 0.000103f, 0.000097f, 0.000118f, 0.000115f, 0.000130f, 0.000176f, 0.000130f, - 0.000223f, 0.000235f, 0.000244f, 0.000252f, 0.000274f, 0.000389f, 0.000309f, 0.000430f, - 0.000340f, 0.000399f, 0.000408f, 0.000459f, 0.000514f, 0.000501f, 0.000519f, 0.000657f, - 0.000588f, 0.000775f, 0.000813f, 0.000789f, 0.000904f, 0.001076f, 0.001027f, 0.001170f, - 0.001342f, 0.001425f, 0.001662f, 0.002005f, 0.002298f, 0.002699f, 0.003227f, 0.003990f, - 0.005062f, 0.006855f, 0.009415f, 0.013504f, 0.020905f, 0.034424f, 0.060333f, 0.112000f, - 0.210693f, 0.371094f, 0.816406f, 0.822754f, 0.822754f, 0.823242f, 0.823242f, 0.823730f, - 0.000000f, 0.000119f, 0.000117f, 0.000116f, 0.000114f, 0.000113f, 0.000112f, 0.000111f, - 0.000110f, 0.000109f, 0.000102f, 0.000095f, 0.000090f, 0.000084f, 0.000093f, 0.000103f, - 0.000118f, 0.000165f, 0.000162f, 0.000190f, 0.000204f, 0.000218f, 0.000223f, 0.000237f, - 0.000256f, 0.000272f, 0.000344f, 0.000365f, 0.000365f, 0.000396f, 0.000386f, 0.000412f, - 0.000530f, 0.000466f, 0.000492f, 0.000615f, 0.000611f, 0.000748f, 0.000712f, 0.000795f, - 0.000908f, 0.000971f, 0.001106f, 0.001353f, 0.001572f, 0.001822f, 0.002251f, 0.002676f, - 0.003290f, 0.004349f, 0.005951f, 0.008316f, 0.012543f, 0.021149f, 0.038025f, 0.075500f, - 0.156006f, 0.308838f, 0.794922f, 0.800293f, 0.800781f, 0.801270f, 0.801758f, 0.802246f, - 0.000121f, 0.000116f, 0.000114f, 0.000113f, 0.000111f, 0.000109f, 0.000108f, 0.000107f, - 0.000106f, 0.000104f, 0.000104f, 0.000100f, 0.000094f, 0.000088f, 0.000083f, 0.000078f, - 0.000074f, 0.000105f, 0.000078f, 0.000122f, 0.000113f, 0.000153f, 0.000174f, 0.000175f, - 0.000207f, 0.000216f, 0.000225f, 0.000215f, 0.000262f, 0.000308f, 0.000297f, 0.000287f, - 0.000307f, 0.000342f, 0.000363f, 0.000411f, 0.000401f, 0.000453f, 0.000522f, 0.000555f, - 0.000680f, 0.000701f, 0.000751f, 0.000873f, 0.000966f, 0.001181f, 0.001445f, 0.001666f, - 0.002077f, 0.002512f, 0.003359f, 0.004856f, 0.007347f, 0.012001f, 0.022049f, 0.046417f, - 0.107117f, 0.245361f, 0.770508f, 0.775879f, 0.776367f, 0.776855f, 0.777344f, 0.777832f, - 0.000000f, 0.000113f, 0.000108f, 0.000107f, 0.000104f, 0.000103f, 0.000101f, 0.000100f, - 0.000099f, 0.000098f, 0.000097f, 0.000096f, 0.000095f, 0.000091f, 0.000086f, 0.000081f, - 0.000077f, 0.000073f, 0.000069f, 0.000079f, 0.000084f, 0.000091f, 0.000074f, 0.000100f, - 0.000117f, 0.000140f, 0.000144f, 0.000166f, 0.000174f, 0.000178f, 0.000225f, 0.000197f, - 0.000234f, 0.000239f, 0.000273f, 0.000289f, 0.000283f, 0.000293f, 0.000338f, 0.000386f, - 0.000386f, 0.000432f, 0.000459f, 0.000525f, 0.000625f, 0.000691f, 0.000800f, 0.001004f, - 0.001227f, 0.001479f, 0.001984f, 0.002745f, 0.003983f, 0.006413f, 0.011642f, 0.025269f, - 0.066040f, 0.182495f, 0.743164f, 0.748535f, 0.749023f, 0.749512f, 0.750000f, 0.749512f, - 0.000000f, 0.000102f, 0.000101f, 0.000098f, 0.000094f, 0.000093f, 0.000092f, 0.000090f, - 0.000089f, 0.000088f, 0.000087f, 0.000086f, 0.000085f, 0.000084f, 0.000085f, 0.000082f, - 0.000078f, 0.000074f, 0.000070f, 0.000066f, 0.000063f, 0.000060f, 0.000057f, 0.000056f, - 0.000061f, 0.000060f, 0.000073f, 0.000087f, 0.000100f, 0.000105f, 0.000124f, 0.000136f, - 0.000140f, 0.000140f, 0.000159f, 0.000179f, 0.000186f, 0.000205f, 0.000214f, 0.000229f, - 0.000248f, 0.000267f, 0.000299f, 0.000344f, 0.000367f, 0.000422f, 0.000496f, 0.000557f, - 0.000639f, 0.000837f, 0.001037f, 0.001419f, 0.002081f, 0.003202f, 0.005730f, 0.012199f, - 0.034943f, 0.122925f, 0.711426f, 0.716797f, 0.718750f, 0.718262f, 0.718262f, 0.718750f, - 0.000094f, 0.000079f, 0.000078f, 0.000074f, 0.000074f, 0.000075f, 0.000074f, 0.000073f, - 0.000071f, 0.000072f, 0.000070f, 0.000071f, 0.000071f, 0.000070f, 0.000070f, 0.000069f, - 0.000070f, 0.000069f, 0.000068f, 0.000065f, 0.000062f, 0.000059f, 0.000056f, 0.000053f, - 0.000050f, 0.000048f, 0.000045f, 0.000044f, 0.000041f, 0.000050f, 0.000050f, 0.000061f, - 0.000068f, 0.000085f, 0.000091f, 0.000101f, 0.000102f, 0.000107f, 0.000119f, 0.000129f, - 0.000144f, 0.000151f, 0.000160f, 0.000184f, 0.000212f, 0.000213f, 0.000235f, 0.000294f, - 0.000315f, 0.000392f, 0.000505f, 0.000637f, 0.000880f, 0.001400f, 0.002462f, 0.005333f, - 0.015160f, 0.070312f, 0.678223f, 0.683105f, 0.684082f, 0.684570f, 0.684570f, 0.684570f, - 0.000000f, 0.000000f, 0.000023f, 0.000034f, 0.000032f, 0.000038f, 0.000037f, 0.000044f, - 0.000043f, 0.000047f, 0.000045f, 0.000047f, 0.000049f, 0.000049f, 0.000049f, 0.000048f, - 0.000051f, 0.000050f, 0.000051f, 0.000051f, 0.000052f, 0.000052f, 0.000052f, 0.000049f, - 0.000047f, 0.000045f, 0.000042f, 0.000040f, 0.000038f, 0.000036f, 0.000035f, 0.000033f, - 0.000031f, 0.000029f, 0.000038f, 0.000037f, 0.000042f, 0.000051f, 0.000055f, 0.000067f, - 0.000074f, 0.000073f, 0.000083f, 0.000093f, 0.000088f, 0.000102f, 0.000122f, 0.000122f, - 0.000142f, 0.000169f, 0.000206f, 0.000265f, 0.000355f, 0.000531f, 0.000897f, 0.001822f, - 0.005493f, 0.030579f, 0.640137f, 0.644531f, 0.647461f, 0.647949f, 0.647461f, 0.648438f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000001f, 0.000000f, 0.000008f, 0.000012f, 0.000014f, 0.000014f, 0.000019f, 0.000021f, - 0.000022f, 0.000024f, 0.000026f, 0.000027f, 0.000027f, 0.000028f, 0.000029f, 0.000031f, - 0.000031f, 0.000032f, 0.000032f, 0.000033f, 0.000033f, 0.000032f, 0.000030f, 0.000029f, - 0.000027f, 0.000026f, 0.000024f, 0.000023f, 0.000022f, 0.000021f, 0.000019f, 0.000018f, - 0.000021f, 0.000024f, 0.000028f, 0.000033f, 0.000043f, 0.000041f, 0.000046f, 0.000053f, - 0.000050f, 0.000059f, 0.000068f, 0.000094f, 0.000096f, 0.000140f, 0.000239f, 0.000447f, - 0.001340f, 0.009087f, 0.600098f, 0.605957f, 0.606934f, 0.606934f, 0.607422f, 0.606934f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000002f, 0.000004f, 0.000006f, 0.000006f, 0.000009f, 0.000010f, 0.000011f, 0.000012f, - 0.000013f, 0.000014f, 0.000015f, 0.000016f, 0.000017f, 0.000016f, 0.000015f, 0.000014f, - 0.000013f, 0.000012f, 0.000012f, 0.000011f, 0.000010f, 0.000009f, 0.000008f, 0.000012f, - 0.000014f, 0.000018f, 0.000017f, 0.000022f, 0.000022f, 0.000026f, 0.000040f, 0.000060f, - 0.000157f, 0.001244f, 0.557129f, 0.563477f, 0.563477f, 0.564941f, 0.564941f, 0.564941f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000002f, 0.000003f, - 0.000003f, 0.000004f, 0.000003f, 0.000003f, 0.000003f, 0.000002f, 0.000003f, 0.000003f, - 0.000003f, 0.000012f, 0.513672f, 0.520020f, 0.520020f, 0.520508f, 0.521484f, 0.521484f, - }, - { - 0.103943f, 0.284912f, 0.422119f, 0.523438f, 0.600586f, 0.659668f, 0.705078f, 0.741699f, - 0.771484f, 0.795898f, 0.816895f, 0.834961f, 0.850586f, 0.862793f, 0.874512f, 0.884277f, - 0.894043f, 0.901855f, 0.909180f, 0.915039f, 0.921387f, 0.926270f, 0.932129f, 0.936035f, - 0.940430f, 0.944336f, 0.948242f, 0.951660f, 0.954590f, 0.957520f, 0.959961f, 0.962891f, - 0.965332f, 0.967285f, 0.969727f, 0.971680f, 0.973145f, 0.975586f, 0.977051f, 0.979004f, - 0.979980f, 0.981934f, 0.983887f, 0.984375f, 0.985840f, 0.986816f, 0.988770f, 0.989258f, - 0.990723f, 0.992188f, 0.992676f, 0.993652f, 0.994629f, 0.995605f, 0.996582f, 0.997559f, - 0.998535f, 0.999023f, 0.999512f, 0.999023f, 0.998535f, 0.998047f, 0.997559f, 0.997070f, - 0.046997f, 0.153564f, 0.264160f, 0.369385f, 0.460205f, 0.538574f, 0.602051f, 0.654785f, - 0.697754f, 0.733398f, 0.762695f, 0.787598f, 0.809082f, 0.827637f, 0.843262f, 0.856934f, - 0.868652f, 0.880859f, 0.889648f, 0.898438f, 0.906738f, 0.912598f, 0.918945f, 0.924805f, - 0.929688f, 0.935059f, 0.938965f, 0.943359f, 0.947266f, 0.951172f, 0.954102f, 0.956543f, - 0.959961f, 0.961914f, 0.964844f, 0.966797f, 0.969727f, 0.971191f, 0.974121f, 0.975098f, - 0.977051f, 0.979492f, 0.980469f, 0.981934f, 0.983887f, 0.985352f, 0.985840f, 0.987305f, - 0.989258f, 0.990234f, 0.991211f, 0.992188f, 0.993164f, 0.994141f, 0.995117f, 0.996094f, - 0.996582f, 0.997559f, 0.999023f, 0.998535f, 0.998047f, 0.997559f, 0.997070f, 0.997070f, - 0.025940f, 0.088501f, 0.162964f, 0.246094f, 0.331055f, 0.411865f, 0.486328f, 0.550293f, - 0.606934f, 0.655762f, 0.695312f, 0.729980f, 0.758301f, 0.783691f, 0.804199f, 0.823730f, - 0.838867f, 0.853027f, 0.865723f, 0.877441f, 0.887207f, 0.895996f, 0.904785f, 0.911133f, - 0.916992f, 0.923828f, 0.928223f, 0.933594f, 0.937988f, 0.942871f, 0.946777f, 0.950195f, - 0.953613f, 0.956543f, 0.959473f, 0.962402f, 0.964844f, 0.967285f, 0.970215f, 0.971680f, - 0.973633f, 0.976074f, 0.977539f, 0.979492f, 0.980469f, 0.982422f, 0.984863f, 0.985352f, - 0.986816f, 0.987793f, 0.989258f, 0.990234f, 0.991699f, 0.992676f, 0.994141f, 0.995117f, - 0.995605f, 0.996582f, 0.998535f, 0.998047f, 0.998047f, 0.997559f, 0.997070f, 0.996582f, - 0.016159f, 0.055176f, 0.104126f, 0.162720f, 0.229126f, 0.300781f, 0.372803f, 0.442871f, - 0.506836f, 0.563477f, 0.613281f, 0.657715f, 0.696289f, 0.729004f, 0.757324f, 0.782227f, - 0.802734f, 0.821289f, 0.837402f, 0.852539f, 0.865234f, 0.875977f, 0.885742f, 0.895508f, - 0.903320f, 0.910156f, 0.917480f, 0.922852f, 0.928711f, 0.934082f, 0.937988f, 0.942871f, - 0.947266f, 0.950195f, 0.954102f, 0.957031f, 0.959473f, 0.962402f, 0.964844f, 0.968262f, - 0.969727f, 0.972168f, 0.974121f, 0.976562f, 0.978516f, 0.979980f, 0.981934f, 0.982910f, - 0.983887f, 0.985840f, 0.986816f, 0.988770f, 0.989746f, 0.991211f, 0.992188f, 0.993652f, - 0.994141f, 0.995117f, 0.998047f, 0.997559f, 0.997559f, 0.997070f, 0.996582f, 0.996582f, - 0.010841f, 0.036865f, 0.070007f, 0.110962f, 0.159546f, 0.214355f, 0.276367f, 0.340576f, - 0.405029f, 0.465820f, 0.523926f, 0.576172f, 0.623535f, 0.664062f, 0.699707f, 0.731445f, - 0.758301f, 0.782227f, 0.803223f, 0.821289f, 0.837891f, 0.852051f, 0.864258f, 0.875488f, - 0.884766f, 0.894531f, 0.903320f, 0.910156f, 0.916992f, 0.923828f, 0.928223f, 0.933594f, - 0.938477f, 0.943359f, 0.947266f, 0.950684f, 0.954102f, 0.957520f, 0.960449f, 0.962891f, - 0.965820f, 0.968750f, 0.971191f, 0.973145f, 0.975586f, 0.977539f, 0.978516f, 0.980957f, - 0.982422f, 0.984375f, 0.985352f, 0.987305f, 0.988281f, 0.989746f, 0.990723f, 0.992188f, - 0.993164f, 0.994141f, 0.997559f, 0.997559f, 0.997070f, 0.996582f, 0.996582f, 0.996094f, - 0.007637f, 0.026566f, 0.049896f, 0.078247f, 0.113403f, 0.154663f, 0.202637f, 0.255371f, - 0.313232f, 0.372314f, 0.431152f, 0.488037f, 0.540039f, 0.588867f, 0.633301f, 0.670898f, - 0.704102f, 0.734375f, 0.761230f, 0.785156f, 0.804688f, 0.822754f, 0.838867f, 0.852539f, - 0.864746f, 0.876953f, 0.886230f, 0.895996f, 0.903320f, 0.910645f, 0.917480f, 0.923828f, - 0.929199f, 0.935059f, 0.938965f, 0.943359f, 0.948730f, 0.952148f, 0.954590f, 0.958496f, - 0.961426f, 0.964355f, 0.966797f, 0.969238f, 0.971680f, 0.974121f, 0.976074f, 0.978027f, - 0.979980f, 0.981445f, 0.982910f, 0.984863f, 0.986816f, 0.987793f, 0.989258f, 0.990723f, - 0.991699f, 0.993164f, 0.996582f, 0.996582f, 0.996094f, 0.996094f, 0.996094f, 0.995605f, - 0.005714f, 0.019485f, 0.036194f, 0.056976f, 0.082336f, 0.113342f, 0.149048f, 0.191284f, - 0.238770f, 0.290039f, 0.344727f, 0.400391f, 0.454590f, 0.507324f, 0.557129f, 0.602539f, - 0.642578f, 0.679199f, 0.711426f, 0.740234f, 0.766602f, 0.788574f, 0.807617f, 0.825195f, - 0.841309f, 0.854980f, 0.867676f, 0.877930f, 0.888184f, 0.896484f, 0.904785f, 0.912109f, - 0.918945f, 0.925293f, 0.930176f, 0.935547f, 0.940918f, 0.944336f, 0.948730f, 0.952637f, - 0.956055f, 0.959473f, 0.962402f, 0.965332f, 0.967773f, 0.970703f, 0.972656f, 0.975098f, - 0.977051f, 0.979004f, 0.981445f, 0.982910f, 0.984375f, 0.985840f, 0.987793f, 0.989258f, - 0.990234f, 0.991211f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.995605f, 0.995117f, - 0.004505f, 0.014908f, 0.027634f, 0.043274f, 0.061707f, 0.084045f, 0.111694f, 0.143921f, - 0.180542f, 0.223877f, 0.270996f, 0.320557f, 0.373291f, 0.425781f, 0.478027f, 0.526855f, - 0.573242f, 0.615723f, 0.654785f, 0.688965f, 0.720215f, 0.747559f, 0.771973f, 0.793457f, - 0.812500f, 0.829102f, 0.844238f, 0.858398f, 0.870117f, 0.881348f, 0.890625f, 0.898926f, - 0.906738f, 0.914062f, 0.921387f, 0.926758f, 0.932617f, 0.937500f, 0.942383f, 0.945801f, - 0.950684f, 0.954102f, 0.958008f, 0.960938f, 0.964355f, 0.966797f, 0.969727f, 0.972656f, - 0.974609f, 0.976562f, 0.978516f, 0.980469f, 0.981934f, 0.984375f, 0.985840f, 0.987793f, - 0.988281f, 0.990234f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995117f, 0.994629f, - 0.003691f, 0.011925f, 0.021622f, 0.033203f, 0.047241f, 0.065247f, 0.085266f, 0.109558f, - 0.138550f, 0.172363f, 0.210205f, 0.253418f, 0.299805f, 0.348877f, 0.400146f, 0.450195f, - 0.499512f, 0.546387f, 0.589844f, 0.629883f, 0.666016f, 0.700195f, 0.728516f, 0.755371f, - 0.778320f, 0.798828f, 0.817383f, 0.833984f, 0.848145f, 0.861816f, 0.874023f, 0.883789f, - 0.893555f, 0.902344f, 0.910645f, 0.916992f, 0.922852f, 0.929688f, 0.934570f, 0.938965f, - 0.944336f, 0.948730f, 0.951660f, 0.956543f, 0.959473f, 0.962891f, 0.965820f, 0.968262f, - 0.970703f, 0.974121f, 0.976074f, 0.978516f, 0.979980f, 0.981934f, 0.983887f, 0.985840f, - 0.987305f, 0.988281f, 0.994629f, 0.995117f, 0.995117f, 0.994629f, 0.994629f, 0.994141f, - 0.002726f, 0.009560f, 0.017136f, 0.026871f, 0.037415f, 0.050079f, 0.066406f, 0.084717f, - 0.107849f, 0.133423f, 0.164062f, 0.198853f, 0.238281f, 0.281250f, 0.327148f, 0.375977f, - 0.424805f, 0.473877f, 0.521973f, 0.564941f, 0.606934f, 0.644531f, 0.679199f, 0.710449f, - 0.738770f, 0.764160f, 0.786133f, 0.805664f, 0.824219f, 0.838867f, 0.853516f, 0.866211f, - 0.876953f, 0.887695f, 0.896484f, 0.905762f, 0.912598f, 0.919922f, 0.925781f, 0.932129f, - 0.937500f, 0.942383f, 0.946777f, 0.951660f, 0.955078f, 0.958984f, 0.961426f, 0.965332f, - 0.967773f, 0.970703f, 0.972656f, 0.975586f, 0.978027f, 0.979492f, 0.981934f, 0.983887f, - 0.984863f, 0.986816f, 0.994629f, 0.994629f, 0.994629f, 0.994141f, 0.994141f, 0.993652f, - 0.002487f, 0.007553f, 0.013863f, 0.021439f, 0.029755f, 0.040771f, 0.052643f, 0.067444f, - 0.084473f, 0.104980f, 0.128784f, 0.157227f, 0.189087f, 0.224609f, 0.265381f, 0.308838f, - 0.354004f, 0.401611f, 0.450439f, 0.496582f, 0.541992f, 0.583984f, 0.623047f, 0.660645f, - 0.693359f, 0.722168f, 0.749512f, 0.772949f, 0.793457f, 0.812988f, 0.830078f, 0.845215f, - 0.859375f, 0.871094f, 0.882812f, 0.892090f, 0.900879f, 0.908691f, 0.916504f, 0.922852f, - 0.930176f, 0.935547f, 0.940430f, 0.944824f, 0.949219f, 0.952637f, 0.956543f, 0.960449f, - 0.963867f, 0.967285f, 0.970215f, 0.972656f, 0.974609f, 0.977539f, 0.979492f, 0.981934f, - 0.983887f, 0.985352f, 0.993652f, 0.994141f, 0.994141f, 0.993652f, 0.993652f, 0.993164f, - 0.001893f, 0.006641f, 0.011551f, 0.017319f, 0.024612f, 0.032959f, 0.042023f, 0.053772f, - 0.067444f, 0.083435f, 0.102356f, 0.123840f, 0.150024f, 0.179688f, 0.213501f, 0.250488f, - 0.291992f, 0.335938f, 0.381592f, 0.427246f, 0.473877f, 0.518555f, 0.563477f, 0.603027f, - 0.640625f, 0.676270f, 0.707031f, 0.735352f, 0.760254f, 0.782715f, 0.802734f, 0.821777f, - 0.838379f, 0.851562f, 0.865234f, 0.876953f, 0.886719f, 0.896484f, 0.905273f, 0.913086f, - 0.921387f, 0.927734f, 0.933105f, 0.938477f, 0.942871f, 0.948242f, 0.951660f, 0.955566f, - 0.959961f, 0.963867f, 0.966309f, 0.969238f, 0.972168f, 0.975098f, 0.977539f, 0.979492f, - 0.981934f, 0.983887f, 0.993164f, 0.993652f, 0.993164f, 0.993164f, 0.993164f, 0.992676f, - 0.001740f, 0.005634f, 0.009407f, 0.014992f, 0.020157f, 0.026840f, 0.035156f, 0.043793f, - 0.054718f, 0.067505f, 0.082092f, 0.099731f, 0.120239f, 0.143921f, 0.171265f, 0.202393f, - 0.237915f, 0.276367f, 0.318848f, 0.362793f, 0.407959f, 0.454346f, 0.499023f, 0.542480f, - 0.583984f, 0.623535f, 0.659180f, 0.691895f, 0.721680f, 0.748047f, 0.772461f, 0.793457f, - 0.812988f, 0.829102f, 0.845215f, 0.859863f, 0.872559f, 0.883789f, 0.893555f, 0.902344f, - 0.911133f, 0.918457f, 0.924805f, 0.930664f, 0.937012f, 0.941895f, 0.947266f, 0.951172f, - 0.956055f, 0.959473f, 0.962402f, 0.966309f, 0.968750f, 0.972168f, 0.974609f, 0.977051f, - 0.979492f, 0.981934f, 0.992188f, 0.992676f, 0.992676f, 0.992676f, 0.992188f, 0.992676f, - 0.001502f, 0.004482f, 0.008278f, 0.012276f, 0.016800f, 0.022644f, 0.029129f, 0.036194f, - 0.045197f, 0.055298f, 0.067017f, 0.080750f, 0.096863f, 0.115906f, 0.138184f, 0.163940f, - 0.192993f, 0.225952f, 0.262695f, 0.302490f, 0.344971f, 0.389648f, 0.434814f, 0.480469f, - 0.523926f, 0.566406f, 0.605957f, 0.643066f, 0.677246f, 0.708496f, 0.736816f, 0.761719f, - 0.784668f, 0.804688f, 0.823242f, 0.840332f, 0.854004f, 0.867188f, 0.878906f, 0.890137f, - 0.898438f, 0.907715f, 0.916016f, 0.922852f, 0.930176f, 0.935547f, 0.940918f, 0.946289f, - 0.950684f, 0.955078f, 0.959473f, 0.961914f, 0.966309f, 0.969238f, 0.972168f, 0.974609f, - 0.977539f, 0.979492f, 0.991211f, 0.992188f, 0.991699f, 0.992188f, 0.991699f, 0.991211f, - 0.001411f, 0.003645f, 0.007160f, 0.010414f, 0.014397f, 0.018677f, 0.024338f, 0.030426f, - 0.037384f, 0.045654f, 0.055054f, 0.066101f, 0.079529f, 0.094543f, 0.112793f, 0.133057f, - 0.157227f, 0.183960f, 0.215210f, 0.250488f, 0.288086f, 0.329102f, 0.372314f, 0.416992f, - 0.461914f, 0.505859f, 0.549316f, 0.589355f, 0.627930f, 0.664062f, 0.695801f, 0.725098f, - 0.752441f, 0.775879f, 0.797363f, 0.815918f, 0.833984f, 0.849121f, 0.863281f, 0.875488f, - 0.886230f, 0.895996f, 0.904785f, 0.914062f, 0.920898f, 0.928223f, 0.935059f, 0.940918f, - 0.945312f, 0.950195f, 0.954102f, 0.958984f, 0.962402f, 0.966309f, 0.969238f, 0.972656f, - 0.974609f, 0.977539f, 0.990234f, 0.992188f, 0.991211f, 0.991211f, 0.990723f, 0.991211f, - 0.000926f, 0.003523f, 0.006207f, 0.008949f, 0.012718f, 0.016312f, 0.020447f, 0.025467f, - 0.031128f, 0.037994f, 0.045532f, 0.054901f, 0.065430f, 0.077576f, 0.091797f, 0.109131f, - 0.128418f, 0.151245f, 0.176636f, 0.206055f, 0.238525f, 0.275146f, 0.314697f, 0.357178f, - 0.400391f, 0.445312f, 0.489746f, 0.531738f, 0.574219f, 0.613281f, 0.650391f, 0.683594f, - 0.714355f, 0.742188f, 0.768066f, 0.790039f, 0.810059f, 0.828125f, 0.843262f, 0.858398f, - 0.871582f, 0.883789f, 0.893555f, 0.903809f, 0.912598f, 0.919434f, 0.926758f, 0.933594f, - 0.939453f, 0.944336f, 0.950195f, 0.954590f, 0.958008f, 0.962402f, 0.966309f, 0.969727f, - 0.972656f, 0.975586f, 0.989746f, 0.990723f, 0.990723f, 0.990234f, 0.990234f, 0.990234f, - 0.001140f, 0.003021f, 0.005527f, 0.008102f, 0.010445f, 0.013977f, 0.017349f, 0.021637f, - 0.026535f, 0.031677f, 0.038330f, 0.045776f, 0.054382f, 0.064392f, 0.076233f, 0.089844f, - 0.105713f, 0.123840f, 0.145020f, 0.169556f, 0.196899f, 0.229248f, 0.263672f, 0.302002f, - 0.342529f, 0.385986f, 0.429932f, 0.473877f, 0.517578f, 0.560547f, 0.600586f, 0.638184f, - 0.672852f, 0.704590f, 0.733398f, 0.759277f, 0.782715f, 0.803711f, 0.823242f, 0.840820f, - 0.854980f, 0.869141f, 0.881348f, 0.892090f, 0.902344f, 0.910645f, 0.919922f, 0.927246f, - 0.933105f, 0.938965f, 0.944824f, 0.949707f, 0.954102f, 0.959473f, 0.962891f, 0.966309f, - 0.969727f, 0.972168f, 0.988770f, 0.990234f, 0.989746f, 0.989746f, 0.989746f, 0.989258f, - 0.000870f, 0.002666f, 0.004578f, 0.006737f, 0.009430f, 0.012077f, 0.015381f, 0.018463f, - 0.022293f, 0.027313f, 0.032654f, 0.038727f, 0.045746f, 0.053619f, 0.063232f, 0.074524f, - 0.087219f, 0.102356f, 0.119324f, 0.139648f, 0.162842f, 0.189941f, 0.219482f, 0.253174f, - 0.289795f, 0.329346f, 0.372070f, 0.415039f, 0.459717f, 0.503418f, 0.546387f, 0.587402f, - 0.625977f, 0.661621f, 0.694336f, 0.725586f, 0.752441f, 0.776855f, 0.798828f, 0.818359f, - 0.837402f, 0.852539f, 0.866699f, 0.878906f, 0.891113f, 0.900879f, 0.910156f, 0.918457f, - 0.926270f, 0.932617f, 0.938965f, 0.944824f, 0.950195f, 0.955078f, 0.958984f, 0.962891f, - 0.966797f, 0.970703f, 0.987793f, 0.988770f, 0.989258f, 0.989258f, 0.988770f, 0.988770f, - 0.000835f, 0.002302f, 0.004078f, 0.005802f, 0.008026f, 0.010490f, 0.013153f, 0.016235f, - 0.019485f, 0.023636f, 0.027847f, 0.033081f, 0.038849f, 0.045441f, 0.053253f, 0.062500f, - 0.072571f, 0.085205f, 0.098999f, 0.115662f, 0.135254f, 0.156860f, 0.182373f, 0.211060f, - 0.243042f, 0.279053f, 0.318115f, 0.359619f, 0.402832f, 0.447021f, 0.490234f, 0.533691f, - 0.575195f, 0.615234f, 0.651855f, 0.686035f, 0.717285f, 0.746094f, 0.771484f, 0.793945f, - 0.813965f, 0.833496f, 0.848633f, 0.864258f, 0.877930f, 0.889648f, 0.900391f, 0.909180f, - 0.918945f, 0.926270f, 0.932129f, 0.939453f, 0.945312f, 0.950684f, 0.955566f, 0.959473f, - 0.963867f, 0.967773f, 0.987305f, 0.988281f, 0.988281f, 0.988281f, 0.988281f, 0.987793f, - 0.000815f, 0.001984f, 0.003475f, 0.005302f, 0.007103f, 0.009354f, 0.011528f, 0.013977f, - 0.017197f, 0.020111f, 0.023788f, 0.027771f, 0.033447f, 0.038452f, 0.045013f, 0.052704f, - 0.061066f, 0.071228f, 0.082886f, 0.096313f, 0.112488f, 0.130737f, 0.151245f, 0.175659f, - 0.203125f, 0.234619f, 0.269043f, 0.306885f, 0.347656f, 0.390381f, 0.434570f, 0.478760f, - 0.522461f, 0.564453f, 0.605957f, 0.644043f, 0.678223f, 0.710449f, 0.739746f, 0.766602f, - 0.791016f, 0.811035f, 0.831055f, 0.847168f, 0.862793f, 0.875977f, 0.888672f, 0.899414f, - 0.909180f, 0.917480f, 0.926270f, 0.933105f, 0.939941f, 0.945801f, 0.950684f, 0.955566f, - 0.960938f, 0.964844f, 0.985840f, 0.987305f, 0.987793f, 0.987305f, 0.987305f, 0.987305f, - 0.000587f, 0.002005f, 0.003122f, 0.004707f, 0.006283f, 0.007778f, 0.009972f, 0.012581f, - 0.014435f, 0.017426f, 0.020691f, 0.024475f, 0.028519f, 0.033203f, 0.038513f, 0.044708f, - 0.051727f, 0.060028f, 0.069763f, 0.080627f, 0.093506f, 0.109009f, 0.125977f, 0.146362f, - 0.169678f, 0.196533f, 0.226685f, 0.259766f, 0.297119f, 0.337646f, 0.380127f, 0.424072f, - 0.468018f, 0.512207f, 0.555176f, 0.596680f, 0.635254f, 0.671387f, 0.704590f, 0.734863f, - 0.762207f, 0.787109f, 0.809082f, 0.828613f, 0.846191f, 0.860840f, 0.875977f, 0.888184f, - 0.899902f, 0.908691f, 0.918457f, 0.926270f, 0.934082f, 0.940430f, 0.947266f, 0.951660f, - 0.958008f, 0.961914f, 0.984863f, 0.986328f, 0.986816f, 0.986816f, 0.986328f, 0.986328f, - 0.000475f, 0.001671f, 0.003019f, 0.004379f, 0.005592f, 0.006882f, 0.008682f, 0.010757f, - 0.012856f, 0.015343f, 0.018112f, 0.021164f, 0.024353f, 0.028595f, 0.033020f, 0.038086f, - 0.044006f, 0.050812f, 0.058594f, 0.067993f, 0.078735f, 0.091248f, 0.105530f, 0.122009f, - 0.142212f, 0.164062f, 0.189697f, 0.219238f, 0.251953f, 0.288330f, 0.328125f, 0.369629f, - 0.413818f, 0.458008f, 0.503418f, 0.547363f, 0.588867f, 0.628418f, 0.665039f, 0.699707f, - 0.730469f, 0.758301f, 0.784668f, 0.807129f, 0.826660f, 0.844727f, 0.862305f, 0.875977f, - 0.888672f, 0.900879f, 0.910156f, 0.919434f, 0.927734f, 0.935059f, 0.941406f, 0.947754f, - 0.953125f, 0.958496f, 0.983887f, 0.985352f, 0.985352f, 0.985352f, 0.984863f, 0.985352f, - 0.000325f, 0.001517f, 0.002554f, 0.003811f, 0.004990f, 0.006638f, 0.007706f, 0.009399f, - 0.011177f, 0.013580f, 0.015671f, 0.018478f, 0.021393f, 0.024612f, 0.028442f, 0.032990f, - 0.037750f, 0.043427f, 0.050354f, 0.057861f, 0.066101f, 0.076294f, 0.088684f, 0.102417f, - 0.119080f, 0.137451f, 0.159058f, 0.183838f, 0.212524f, 0.244385f, 0.280273f, 0.319336f, - 0.361084f, 0.405029f, 0.449707f, 0.494873f, 0.539551f, 0.582031f, 0.622559f, 0.660156f, - 0.695801f, 0.727539f, 0.756348f, 0.782715f, 0.805664f, 0.826172f, 0.845215f, 0.861328f, - 0.875977f, 0.889648f, 0.901367f, 0.910645f, 0.920410f, 0.928711f, 0.937012f, 0.942871f, - 0.949219f, 0.955078f, 0.982422f, 0.983887f, 0.984375f, 0.984375f, 0.983887f, 0.983887f, - 0.000349f, 0.001533f, 0.002413f, 0.003326f, 0.004463f, 0.005524f, 0.006954f, 0.008202f, - 0.010025f, 0.011864f, 0.013924f, 0.015884f, 0.018478f, 0.021484f, 0.024658f, 0.028671f, - 0.032562f, 0.037170f, 0.042969f, 0.049194f, 0.056641f, 0.065063f, 0.074951f, 0.086182f, - 0.099731f, 0.115662f, 0.133789f, 0.154175f, 0.178589f, 0.206421f, 0.237671f, 0.272949f, - 0.312012f, 0.352783f, 0.396973f, 0.442627f, 0.487793f, 0.532227f, 0.576660f, 0.617188f, - 0.657227f, 0.692383f, 0.725586f, 0.754395f, 0.780762f, 0.805664f, 0.826172f, 0.845215f, - 0.861816f, 0.876465f, 0.890137f, 0.902344f, 0.912598f, 0.921875f, 0.930176f, 0.937988f, - 0.945312f, 0.952148f, 0.981445f, 0.982910f, 0.982910f, 0.983398f, 0.983398f, 0.983398f, - 0.000475f, 0.001141f, 0.002058f, 0.002846f, 0.004120f, 0.005013f, 0.006207f, 0.007664f, - 0.009193f, 0.010368f, 0.012222f, 0.014404f, 0.016403f, 0.018799f, 0.021439f, 0.024567f, - 0.028076f, 0.032379f, 0.036652f, 0.042145f, 0.048157f, 0.055389f, 0.063660f, 0.073059f, - 0.083740f, 0.097046f, 0.112366f, 0.129517f, 0.149780f, 0.173584f, 0.200684f, 0.231812f, - 0.266357f, 0.304688f, 0.346680f, 0.390137f, 0.435547f, 0.481445f, 0.526367f, 0.572266f, - 0.613770f, 0.653320f, 0.690430f, 0.723633f, 0.754395f, 0.781250f, 0.806152f, 0.826172f, - 0.847168f, 0.862793f, 0.878906f, 0.892090f, 0.904297f, 0.914551f, 0.924316f, 0.933105f, - 0.940430f, 0.947754f, 0.979492f, 0.981934f, 0.981934f, 0.981934f, 0.981445f, 0.981445f, - 0.000239f, 0.000882f, 0.001744f, 0.002878f, 0.003819f, 0.004532f, 0.005550f, 0.006653f, - 0.007942f, 0.009277f, 0.010628f, 0.012421f, 0.014397f, 0.016312f, 0.018845f, 0.021576f, - 0.024536f, 0.027817f, 0.031860f, 0.036346f, 0.041595f, 0.047333f, 0.054138f, 0.062317f, - 0.071350f, 0.081970f, 0.094299f, 0.109070f, 0.126221f, 0.146118f, 0.169067f, 0.195801f, - 0.226196f, 0.260742f, 0.298584f, 0.340088f, 0.384277f, 0.429688f, 0.476807f, 0.522461f, - 0.568359f, 0.611328f, 0.651855f, 0.689453f, 0.723633f, 0.754395f, 0.782715f, 0.807617f, - 0.829590f, 0.848145f, 0.865723f, 0.880859f, 0.894531f, 0.906738f, 0.917969f, 0.927246f, - 0.936035f, 0.943359f, 0.978027f, 0.979980f, 0.980469f, 0.980469f, 0.980469f, 0.980469f, - 0.000240f, 0.000948f, 0.001495f, 0.002592f, 0.003241f, 0.004055f, 0.004856f, 0.006111f, - 0.007133f, 0.008125f, 0.009445f, 0.011108f, 0.012474f, 0.014374f, 0.016586f, 0.018784f, - 0.021286f, 0.024475f, 0.027481f, 0.031403f, 0.035828f, 0.040710f, 0.046204f, 0.052704f, - 0.060577f, 0.069519f, 0.079651f, 0.092224f, 0.106506f, 0.122986f, 0.142456f, 0.165161f, - 0.191284f, 0.221924f, 0.255615f, 0.293457f, 0.335205f, 0.379395f, 0.425537f, 0.472900f, - 0.519531f, 0.566406f, 0.610840f, 0.652344f, 0.689941f, 0.724609f, 0.755371f, 0.784180f, - 0.808594f, 0.831055f, 0.851562f, 0.869141f, 0.884277f, 0.897461f, 0.909668f, 0.920410f, - 0.930176f, 0.937988f, 0.976562f, 0.979004f, 0.979492f, 0.979492f, 0.979492f, 0.979492f, - 0.000302f, 0.000863f, 0.001315f, 0.002195f, 0.002905f, 0.003592f, 0.004784f, 0.005478f, - 0.006199f, 0.007389f, 0.008545f, 0.009811f, 0.011185f, 0.012787f, 0.014603f, 0.016342f, - 0.018784f, 0.021347f, 0.024033f, 0.027496f, 0.031006f, 0.034790f, 0.039856f, 0.045288f, - 0.051636f, 0.059052f, 0.067566f, 0.078003f, 0.089905f, 0.103760f, 0.119934f, 0.139282f, - 0.161865f, 0.187622f, 0.217407f, 0.251221f, 0.288818f, 0.330811f, 0.375244f, 0.422607f, - 0.470703f, 0.518066f, 0.565430f, 0.609863f, 0.651855f, 0.691406f, 0.726562f, 0.758301f, - 0.787109f, 0.812500f, 0.835449f, 0.855957f, 0.872559f, 0.887695f, 0.901367f, 0.913574f, - 0.923828f, 0.933105f, 0.975098f, 0.977539f, 0.977539f, 0.977539f, 0.978027f, 0.977051f, - 0.000240f, 0.000808f, 0.001537f, 0.002106f, 0.002493f, 0.003729f, 0.004036f, 0.004982f, - 0.005539f, 0.006454f, 0.007526f, 0.008690f, 0.009987f, 0.011421f, 0.012894f, 0.014618f, - 0.016464f, 0.018539f, 0.021118f, 0.023865f, 0.026794f, 0.030487f, 0.034241f, 0.038879f, - 0.044067f, 0.050690f, 0.057678f, 0.066040f, 0.076111f, 0.087524f, 0.101379f, 0.117737f, - 0.136353f, 0.158325f, 0.183594f, 0.213501f, 0.247192f, 0.284912f, 0.327393f, 0.372803f, - 0.420410f, 0.468750f, 0.518066f, 0.565430f, 0.611328f, 0.654297f, 0.694336f, 0.729980f, - 0.762207f, 0.791504f, 0.817383f, 0.839844f, 0.859863f, 0.876953f, 0.891602f, 0.905762f, - 0.917480f, 0.928711f, 0.973633f, 0.975098f, 0.976562f, 0.975586f, 0.976562f, 0.976562f, - 0.000240f, 0.000587f, 0.001223f, 0.001691f, 0.002499f, 0.003008f, 0.003643f, 0.004295f, - 0.004795f, 0.005726f, 0.006649f, 0.007671f, 0.008766f, 0.010002f, 0.011307f, 0.012764f, - 0.014465f, 0.016388f, 0.018387f, 0.020599f, 0.023453f, 0.026291f, 0.029572f, 0.033417f, - 0.037964f, 0.043427f, 0.049316f, 0.056519f, 0.064819f, 0.074219f, 0.085693f, 0.099121f, - 0.115112f, 0.133301f, 0.155273f, 0.180420f, 0.210205f, 0.244751f, 0.282715f, 0.324951f, - 0.371338f, 0.419434f, 0.468994f, 0.518555f, 0.566895f, 0.613770f, 0.658203f, 0.698242f, - 0.735352f, 0.766602f, 0.796875f, 0.821289f, 0.844238f, 0.863770f, 0.881836f, 0.896973f, - 0.910156f, 0.922363f, 0.971191f, 0.974121f, 0.974609f, 0.974121f, 0.974609f, 0.974609f, - 0.000228f, 0.000671f, 0.001122f, 0.001607f, 0.002291f, 0.002836f, 0.003319f, 0.003817f, - 0.004509f, 0.005253f, 0.005894f, 0.006840f, 0.007820f, 0.008972f, 0.010086f, 0.011391f, - 0.012848f, 0.014328f, 0.016266f, 0.018158f, 0.020447f, 0.022720f, 0.026031f, 0.029053f, - 0.032593f, 0.037109f, 0.042236f, 0.048340f, 0.055115f, 0.063049f, 0.072632f, 0.083801f, - 0.097351f, 0.112488f, 0.130493f, 0.152222f, 0.178101f, 0.208008f, 0.241943f, 0.280762f, - 0.323730f, 0.370117f, 0.419434f, 0.470459f, 0.520996f, 0.570801f, 0.617676f, 0.663086f, - 0.704102f, 0.740234f, 0.773438f, 0.802246f, 0.829102f, 0.850098f, 0.870117f, 0.887695f, - 0.902832f, 0.916016f, 0.969238f, 0.972168f, 0.972168f, 0.972656f, 0.972656f, 0.972168f, - 0.000121f, 0.000526f, 0.001092f, 0.001670f, 0.001744f, 0.002420f, 0.002945f, 0.003237f, - 0.004013f, 0.004894f, 0.005421f, 0.005932f, 0.006996f, 0.007904f, 0.008873f, 0.009995f, - 0.011391f, 0.012756f, 0.014053f, 0.015884f, 0.017715f, 0.019775f, 0.022324f, 0.025406f, - 0.028290f, 0.032349f, 0.036560f, 0.041412f, 0.047058f, 0.053772f, 0.061493f, 0.070862f, - 0.081848f, 0.094666f, 0.110229f, 0.128662f, 0.150024f, 0.175903f, 0.205566f, 0.239990f, - 0.279785f, 0.323486f, 0.370850f, 0.421143f, 0.473633f, 0.524902f, 0.576172f, 0.625000f, - 0.668457f, 0.710938f, 0.748535f, 0.781250f, 0.810059f, 0.835449f, 0.857910f, 0.877441f, - 0.894531f, 0.908691f, 0.966797f, 0.970215f, 0.970703f, 0.970703f, 0.970703f, 0.970215f, - 0.000127f, 0.000521f, 0.001083f, 0.001460f, 0.001684f, 0.002111f, 0.002563f, 0.003048f, - 0.003618f, 0.004124f, 0.004936f, 0.005543f, 0.006340f, 0.007111f, 0.008049f, 0.008774f, - 0.009865f, 0.011162f, 0.012360f, 0.013840f, 0.015465f, 0.017181f, 0.019531f, 0.021973f, - 0.024582f, 0.027847f, 0.031342f, 0.035706f, 0.040100f, 0.045990f, 0.052521f, 0.060089f, - 0.069214f, 0.080017f, 0.093079f, 0.108521f, 0.126709f, 0.148071f, 0.174072f, 0.204224f, - 0.239502f, 0.279541f, 0.324219f, 0.373047f, 0.424805f, 0.477295f, 0.530762f, 0.583008f, - 0.632324f, 0.677246f, 0.719727f, 0.756348f, 0.789551f, 0.819336f, 0.842773f, 0.866211f, - 0.885742f, 0.901855f, 0.965332f, 0.967773f, 0.968262f, 0.967773f, 0.968750f, 0.968262f, - 0.000244f, 0.000397f, 0.001001f, 0.001181f, 0.001642f, 0.001872f, 0.002460f, 0.002712f, - 0.003061f, 0.003723f, 0.004520f, 0.005043f, 0.005547f, 0.006451f, 0.007057f, 0.007828f, - 0.008942f, 0.009872f, 0.010857f, 0.012131f, 0.013557f, 0.015198f, 0.017059f, 0.019241f, - 0.021454f, 0.024048f, 0.027069f, 0.030594f, 0.034332f, 0.039001f, 0.044952f, 0.050873f, - 0.058716f, 0.067505f, 0.078369f, 0.091309f, 0.106506f, 0.124695f, 0.146484f, 0.172852f, - 0.203369f, 0.239014f, 0.280273f, 0.326172f, 0.376465f, 0.429443f, 0.483643f, 0.538574f, - 0.591309f, 0.641602f, 0.687500f, 0.729492f, 0.766602f, 0.800293f, 0.828613f, 0.854004f, - 0.874512f, 0.893555f, 0.961914f, 0.965332f, 0.965820f, 0.966309f, 0.966309f, 0.965820f, - 0.000243f, 0.000453f, 0.000888f, 0.001245f, 0.001342f, 0.001847f, 0.002060f, 0.002541f, - 0.002991f, 0.003355f, 0.003679f, 0.004379f, 0.005177f, 0.005413f, 0.006283f, 0.007038f, - 0.007896f, 0.008507f, 0.009552f, 0.010628f, 0.011909f, 0.013306f, 0.015038f, 0.016388f, - 0.018433f, 0.020752f, 0.023254f, 0.026413f, 0.029617f, 0.033447f, 0.037842f, 0.043701f, - 0.049896f, 0.057190f, 0.066101f, 0.076660f, 0.089600f, 0.104553f, 0.123230f, 0.145386f, - 0.171387f, 0.202637f, 0.239624f, 0.281982f, 0.329346f, 0.380859f, 0.436035f, 0.491943f, - 0.547852f, 0.602539f, 0.653809f, 0.699707f, 0.741699f, 0.778320f, 0.811035f, 0.838867f, - 0.862793f, 0.884766f, 0.959961f, 0.963379f, 0.963379f, 0.963379f, 0.964355f, 0.963379f, - 0.000241f, 0.000452f, 0.000798f, 0.001119f, 0.001220f, 0.001430f, 0.001902f, 0.002277f, - 0.002737f, 0.002893f, 0.003624f, 0.003937f, 0.004436f, 0.005089f, 0.005669f, 0.006226f, - 0.006680f, 0.007519f, 0.008568f, 0.009384f, 0.010422f, 0.011795f, 0.012840f, 0.014526f, - 0.016235f, 0.017929f, 0.020218f, 0.022736f, 0.025146f, 0.028580f, 0.032684f, 0.036896f, - 0.042511f, 0.048431f, 0.055634f, 0.064453f, 0.075317f, 0.088196f, 0.103333f, 0.121948f, - 0.144287f, 0.171143f, 0.203491f, 0.241577f, 0.285156f, 0.334229f, 0.387939f, 0.444580f, - 0.501953f, 0.559570f, 0.614746f, 0.666504f, 0.712402f, 0.755371f, 0.791504f, 0.823242f, - 0.851074f, 0.875000f, 0.956543f, 0.959961f, 0.960938f, 0.960449f, 0.960449f, 0.960449f, - 0.000000f, 0.000263f, 0.000693f, 0.000873f, 0.001183f, 0.001447f, 0.001476f, 0.002068f, - 0.002171f, 0.002857f, 0.003164f, 0.003542f, 0.003778f, 0.004326f, 0.004906f, 0.005436f, - 0.006126f, 0.006687f, 0.007229f, 0.008377f, 0.009232f, 0.010223f, 0.011436f, 0.012527f, - 0.013832f, 0.015747f, 0.017365f, 0.019363f, 0.021667f, 0.024231f, 0.027695f, 0.031769f, - 0.035889f, 0.041016f, 0.047028f, 0.054504f, 0.063110f, 0.073975f, 0.086487f, 0.101807f, - 0.120972f, 0.143555f, 0.171753f, 0.204956f, 0.244263f, 0.289551f, 0.340576f, 0.396484f, - 0.455078f, 0.514648f, 0.573730f, 0.630371f, 0.681152f, 0.729004f, 0.770020f, 0.806641f, - 0.837402f, 0.863770f, 0.953613f, 0.956543f, 0.957520f, 0.957031f, 0.957031f, 0.958008f, - 0.000000f, 0.000356f, 0.000641f, 0.000870f, 0.000998f, 0.001134f, 0.001495f, 0.001724f, - 0.002436f, 0.002478f, 0.002775f, 0.003113f, 0.003435f, 0.003864f, 0.004314f, 0.004704f, - 0.005276f, 0.005886f, 0.006599f, 0.007309f, 0.008003f, 0.008987f, 0.009987f, 0.010941f, - 0.012192f, 0.013466f, 0.015030f, 0.016708f, 0.018906f, 0.021103f, 0.023788f, 0.026886f, - 0.030457f, 0.034943f, 0.040009f, 0.045959f, 0.053162f, 0.061920f, 0.072144f, 0.085205f, - 0.101257f, 0.120422f, 0.143555f, 0.172363f, 0.206909f, 0.248047f, 0.295410f, 0.349121f, - 0.407715f, 0.468750f, 0.530762f, 0.589844f, 0.647949f, 0.699707f, 0.746094f, 0.786621f, - 0.823242f, 0.852051f, 0.950195f, 0.953125f, 0.954102f, 0.954102f, 0.954102f, 0.954102f, - 0.000231f, 0.000449f, 0.000516f, 0.000760f, 0.000868f, 0.001152f, 0.001403f, 0.001773f, - 0.002165f, 0.002245f, 0.002550f, 0.002783f, 0.003277f, 0.003660f, 0.003782f, 0.004120f, - 0.004631f, 0.005268f, 0.005795f, 0.006344f, 0.007053f, 0.007835f, 0.008598f, 0.009460f, - 0.010689f, 0.011551f, 0.012726f, 0.014359f, 0.016052f, 0.017975f, 0.020218f, 0.022812f, - 0.025803f, 0.029251f, 0.033386f, 0.038574f, 0.044556f, 0.051941f, 0.060577f, 0.071045f, - 0.084106f, 0.100342f, 0.119751f, 0.144043f, 0.174194f, 0.209961f, 0.253418f, 0.303467f, - 0.359619f, 0.420898f, 0.483887f, 0.547852f, 0.609375f, 0.667480f, 0.719727f, 0.765625f, - 0.804688f, 0.839844f, 0.946289f, 0.949707f, 0.950195f, 0.950684f, 0.950684f, 0.950195f, - 0.000201f, 0.000336f, 0.000452f, 0.000627f, 0.000793f, 0.000966f, 0.001134f, 0.001578f, - 0.001790f, 0.001896f, 0.002254f, 0.002464f, 0.002825f, 0.003012f, 0.003414f, 0.003626f, - 0.004131f, 0.004608f, 0.005058f, 0.005642f, 0.006191f, 0.006771f, 0.007378f, 0.008057f, - 0.009132f, 0.009918f, 0.010826f, 0.012314f, 0.013794f, 0.015381f, 0.017197f, 0.019257f, - 0.021912f, 0.024841f, 0.028259f, 0.032318f, 0.037262f, 0.043427f, 0.050537f, 0.059021f, - 0.070007f, 0.083191f, 0.099609f, 0.120239f, 0.145508f, 0.176636f, 0.214600f, 0.260254f, - 0.313232f, 0.372803f, 0.437012f, 0.503418f, 0.568359f, 0.631836f, 0.688965f, 0.741211f, - 0.786621f, 0.825195f, 0.941406f, 0.946289f, 0.946289f, 0.946777f, 0.946289f, 0.947266f, - 0.000000f, 0.000317f, 0.000445f, 0.000453f, 0.000781f, 0.000794f, 0.001183f, 0.001289f, - 0.001479f, 0.001832f, 0.001874f, 0.002256f, 0.002270f, 0.002716f, 0.002960f, 0.003273f, - 0.003630f, 0.003948f, 0.004467f, 0.004833f, 0.005451f, 0.005962f, 0.006367f, 0.007088f, - 0.007717f, 0.008400f, 0.009506f, 0.010445f, 0.011658f, 0.012993f, 0.014618f, 0.016357f, - 0.018524f, 0.021210f, 0.023712f, 0.027252f, 0.031219f, 0.036041f, 0.041962f, 0.049194f, - 0.057892f, 0.068604f, 0.082642f, 0.099304f, 0.120728f, 0.147217f, 0.180054f, 0.221191f, - 0.269287f, 0.325928f, 0.388916f, 0.457275f, 0.525391f, 0.593262f, 0.657715f, 0.714355f, - 0.766113f, 0.809082f, 0.937500f, 0.940918f, 0.941895f, 0.941895f, 0.941895f, 0.942383f, - 0.000243f, 0.000238f, 0.000411f, 0.000532f, 0.000530f, 0.000764f, 0.000853f, 0.001171f, - 0.001417f, 0.001545f, 0.001799f, 0.001900f, 0.002094f, 0.002354f, 0.002577f, 0.002703f, - 0.003155f, 0.003428f, 0.003809f, 0.004227f, 0.004677f, 0.004997f, 0.005386f, 0.005913f, - 0.006741f, 0.007225f, 0.008057f, 0.008873f, 0.009819f, 0.011101f, 0.012253f, 0.013725f, - 0.015488f, 0.017410f, 0.019791f, 0.022598f, 0.025635f, 0.030014f, 0.034973f, 0.040527f, - 0.047729f, 0.056702f, 0.067505f, 0.081848f, 0.099609f, 0.121521f, 0.149902f, 0.185181f, - 0.228516f, 0.280762f, 0.341553f, 0.408936f, 0.480225f, 0.552246f, 0.622070f, 0.686035f, - 0.742188f, 0.792480f, 0.932129f, 0.935547f, 0.937012f, 0.937012f, 0.936523f, 0.937500f, - 0.000000f, 0.000232f, 0.000330f, 0.000512f, 0.000523f, 0.000907f, 0.000953f, 0.001018f, - 0.001234f, 0.001344f, 0.001610f, 0.001612f, 0.001845f, 0.002054f, 0.002218f, 0.002453f, - 0.002829f, 0.003105f, 0.003300f, 0.003712f, 0.003853f, 0.004280f, 0.004631f, 0.005112f, - 0.005665f, 0.006279f, 0.006779f, 0.007481f, 0.008362f, 0.009270f, 0.010338f, 0.011505f, - 0.012848f, 0.014549f, 0.016403f, 0.018936f, 0.021622f, 0.024750f, 0.028900f, 0.033447f, - 0.039185f, 0.046448f, 0.055603f, 0.067078f, 0.081238f, 0.100037f, 0.123230f, 0.153564f, - 0.191284f, 0.238525f, 0.295166f, 0.361084f, 0.432861f, 0.507812f, 0.582520f, 0.653320f, - 0.717285f, 0.772461f, 0.926270f, 0.931152f, 0.931152f, 0.932129f, 0.932129f, 0.932129f, - 0.000118f, 0.000219f, 0.000227f, 0.000405f, 0.000689f, 0.000726f, 0.000910f, 0.000847f, - 0.001072f, 0.001114f, 0.001388f, 0.001447f, 0.001656f, 0.001811f, 0.001897f, 0.002253f, - 0.002373f, 0.002617f, 0.002796f, 0.003054f, 0.003414f, 0.003681f, 0.003929f, 0.004353f, - 0.004902f, 0.005322f, 0.005863f, 0.006424f, 0.007000f, 0.007755f, 0.008675f, 0.009506f, - 0.010704f, 0.012215f, 0.013557f, 0.015686f, 0.017807f, 0.020630f, 0.023376f, 0.027328f, - 0.032013f, 0.038177f, 0.045288f, 0.054626f, 0.066284f, 0.081543f, 0.100891f, 0.125977f, - 0.158447f, 0.199951f, 0.251465f, 0.313965f, 0.384521f, 0.461670f, 0.540527f, 0.617188f, - 0.688965f, 0.750977f, 0.920410f, 0.924805f, 0.925781f, 0.926270f, 0.926758f, 0.925781f, - 0.000230f, 0.000198f, 0.000217f, 0.000338f, 0.000584f, 0.000786f, 0.000699f, 0.000893f, - 0.000954f, 0.000959f, 0.001153f, 0.001165f, 0.001375f, 0.001545f, 0.001752f, 0.001752f, - 0.002062f, 0.002235f, 0.002399f, 0.002699f, 0.002853f, 0.002995f, 0.003372f, 0.003603f, - 0.003944f, 0.004513f, 0.004704f, 0.005226f, 0.005878f, 0.006527f, 0.006992f, 0.007889f, - 0.008919f, 0.010002f, 0.011124f, 0.012604f, 0.014526f, 0.016510f, 0.019104f, 0.022308f, - 0.026077f, 0.030701f, 0.036774f, 0.044098f, 0.053558f, 0.065735f, 0.081299f, 0.101990f, - 0.129517f, 0.164917f, 0.210938f, 0.268066f, 0.336914f, 0.413818f, 0.496094f, 0.579102f, - 0.657227f, 0.727539f, 0.913574f, 0.917969f, 0.918945f, 0.919434f, 0.919922f, 0.919922f, - 0.000000f, 0.000101f, 0.000214f, 0.000208f, 0.000339f, 0.000461f, 0.000577f, 0.000780f, - 0.000777f, 0.000840f, 0.000853f, 0.001064f, 0.001198f, 0.001327f, 0.001489f, 0.001687f, - 0.001809f, 0.001884f, 0.002008f, 0.002129f, 0.002434f, 0.002514f, 0.002949f, 0.003000f, - 0.003351f, 0.003674f, 0.003918f, 0.004356f, 0.004875f, 0.005310f, 0.005768f, 0.006458f, - 0.007244f, 0.008255f, 0.008949f, 0.010361f, 0.011589f, 0.013290f, 0.015335f, 0.017776f, - 0.020828f, 0.024521f, 0.029236f, 0.035431f, 0.042694f, 0.052490f, 0.065369f, 0.082336f, - 0.104492f, 0.134277f, 0.173828f, 0.225464f, 0.290039f, 0.365234f, 0.449707f, 0.536133f, - 0.623047f, 0.702637f, 0.905273f, 0.911133f, 0.912598f, 0.913086f, 0.913086f, 0.913086f, - 0.000000f, 0.000167f, 0.000167f, 0.000316f, 0.000432f, 0.000444f, 0.000608f, 0.000611f, - 0.000678f, 0.000750f, 0.000899f, 0.000925f, 0.001043f, 0.001125f, 0.001222f, 0.001343f, - 0.001470f, 0.001608f, 0.001679f, 0.001804f, 0.001976f, 0.002234f, 0.002361f, 0.002710f, - 0.002748f, 0.003035f, 0.003290f, 0.003647f, 0.003990f, 0.004295f, 0.004745f, 0.005318f, - 0.005920f, 0.006618f, 0.007347f, 0.008270f, 0.009361f, 0.010719f, 0.012291f, 0.014221f, - 0.016693f, 0.019592f, 0.023239f, 0.027969f, 0.033752f, 0.041534f, 0.051666f, 0.065369f, - 0.083618f, 0.108276f, 0.141357f, 0.186035f, 0.244141f, 0.316650f, 0.400635f, 0.491699f, - 0.585938f, 0.672852f, 0.897461f, 0.903320f, 0.904297f, 0.903809f, 0.903809f, 0.904297f, - 0.000000f, 0.000098f, 0.000145f, 0.000289f, 0.000399f, 0.000424f, 0.000429f, 0.000382f, - 0.000529f, 0.000613f, 0.000660f, 0.000836f, 0.000907f, 0.000940f, 0.001005f, 0.001188f, - 0.001306f, 0.001451f, 0.001420f, 0.001554f, 0.001667f, 0.001783f, 0.001955f, 0.002125f, - 0.002357f, 0.002493f, 0.002760f, 0.002867f, 0.003298f, 0.003626f, 0.003878f, 0.004341f, - 0.004704f, 0.005356f, 0.005905f, 0.006512f, 0.007435f, 0.008377f, 0.009598f, 0.011055f, - 0.012978f, 0.015388f, 0.018036f, 0.021698f, 0.026337f, 0.032532f, 0.040192f, 0.050995f, - 0.065125f, 0.085510f, 0.113037f, 0.150513f, 0.201538f, 0.268799f, 0.351318f, 0.444824f, - 0.543457f, 0.641602f, 0.888672f, 0.894043f, 0.894531f, 0.895508f, 0.895020f, 0.895508f, - 0.000000f, 0.000000f, 0.000032f, 0.000169f, 0.000338f, 0.000372f, 0.000468f, 0.000471f, - 0.000460f, 0.000493f, 0.000588f, 0.000715f, 0.000762f, 0.000912f, 0.000831f, 0.001001f, - 0.001043f, 0.001133f, 0.001242f, 0.001312f, 0.001446f, 0.001529f, 0.001647f, 0.001829f, - 0.001982f, 0.002121f, 0.002165f, 0.002438f, 0.002628f, 0.002865f, 0.003113f, 0.003424f, - 0.003622f, 0.004131f, 0.004639f, 0.005222f, 0.005875f, 0.006622f, 0.007496f, 0.008575f, - 0.009987f, 0.011665f, 0.013985f, 0.016617f, 0.019913f, 0.024704f, 0.030960f, 0.039185f, - 0.050323f, 0.066284f, 0.088196f, 0.119568f, 0.163208f, 0.223511f, 0.302002f, 0.395752f, - 0.499756f, 0.605957f, 0.878418f, 0.883301f, 0.884766f, 0.884766f, 0.885254f, 0.885254f, - 0.000000f, 0.000000f, 0.000000f, 0.000216f, 0.000237f, 0.000338f, 0.000387f, 0.000341f, - 0.000435f, 0.000441f, 0.000461f, 0.000577f, 0.000544f, 0.000720f, 0.000813f, 0.000823f, - 0.000912f, 0.000936f, 0.000994f, 0.001026f, 0.001240f, 0.001268f, 0.001365f, 0.001415f, - 0.001590f, 0.001565f, 0.001870f, 0.001929f, 0.002123f, 0.002377f, 0.002430f, 0.002565f, - 0.002947f, 0.003384f, 0.003662f, 0.004105f, 0.004513f, 0.005047f, 0.005741f, 0.006550f, - 0.007549f, 0.008865f, 0.010612f, 0.012466f, 0.015350f, 0.018677f, 0.023270f, 0.029800f, - 0.038361f, 0.050323f, 0.067932f, 0.092590f, 0.129395f, 0.181274f, 0.253418f, 0.345459f, - 0.452637f, 0.567383f, 0.866699f, 0.872559f, 0.873047f, 0.873535f, 0.873047f, 0.873535f, - 0.000000f, 0.000000f, 0.000121f, 0.000182f, 0.000187f, 0.000237f, 0.000264f, 0.000360f, - 0.000360f, 0.000397f, 0.000398f, 0.000412f, 0.000432f, 0.000546f, 0.000575f, 0.000690f, - 0.000731f, 0.000727f, 0.000807f, 0.000843f, 0.000924f, 0.001034f, 0.001093f, 0.001111f, - 0.001251f, 0.001249f, 0.001334f, 0.001612f, 0.001717f, 0.001820f, 0.002090f, 0.002161f, - 0.002354f, 0.002600f, 0.002787f, 0.003119f, 0.003586f, 0.003878f, 0.004452f, 0.004913f, - 0.005772f, 0.006508f, 0.007679f, 0.009285f, 0.011086f, 0.013840f, 0.016968f, 0.021820f, - 0.028259f, 0.037628f, 0.050812f, 0.070129f, 0.099670f, 0.143433f, 0.207031f, 0.294922f, - 0.403076f, 0.525879f, 0.853516f, 0.859375f, 0.860840f, 0.860352f, 0.862305f, 0.861328f, - 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000181f, 0.000198f, 0.000181f, 0.000240f, - 0.000275f, 0.000311f, 0.000427f, 0.000447f, 0.000395f, 0.000472f, 0.000456f, 0.000557f, - 0.000518f, 0.000562f, 0.000635f, 0.000664f, 0.000868f, 0.000887f, 0.000865f, 0.001025f, - 0.001014f, 0.001164f, 0.001096f, 0.001317f, 0.001382f, 0.001432f, 0.001445f, 0.001765f, - 0.001744f, 0.002100f, 0.002144f, 0.002350f, 0.002655f, 0.002947f, 0.003294f, 0.003780f, - 0.004265f, 0.004971f, 0.005699f, 0.006786f, 0.007957f, 0.009636f, 0.011932f, 0.015823f, - 0.020142f, 0.026749f, 0.036530f, 0.051392f, 0.073792f, 0.109375f, 0.164185f, 0.244629f, - 0.351562f, 0.479980f, 0.839355f, 0.844727f, 0.846680f, 0.847656f, 0.847168f, 0.846680f, - 0.000000f, 0.000121f, 0.000120f, 0.000119f, 0.000162f, 0.000133f, 0.000170f, 0.000201f, - 0.000204f, 0.000222f, 0.000258f, 0.000285f, 0.000324f, 0.000327f, 0.000422f, 0.000395f, - 0.000431f, 0.000517f, 0.000632f, 0.000529f, 0.000589f, 0.000592f, 0.000735f, 0.000714f, - 0.000795f, 0.000778f, 0.000823f, 0.001063f, 0.001080f, 0.001141f, 0.001154f, 0.001308f, - 0.001439f, 0.001546f, 0.001689f, 0.001886f, 0.001978f, 0.002174f, 0.002377f, 0.002798f, - 0.003277f, 0.003519f, 0.004181f, 0.004780f, 0.005768f, 0.006863f, 0.008644f, 0.010750f, - 0.014030f, 0.018448f, 0.025635f, 0.036194f, 0.053223f, 0.080811f, 0.125610f, 0.196533f, - 0.299316f, 0.430176f, 0.822754f, 0.830078f, 0.831055f, 0.831543f, 0.832031f, 0.831543f, - 0.000000f, 0.000121f, 0.000120f, 0.000118f, 0.000117f, 0.000120f, 0.000123f, 0.000151f, - 0.000154f, 0.000175f, 0.000254f, 0.000190f, 0.000211f, 0.000306f, 0.000335f, 0.000358f, - 0.000394f, 0.000417f, 0.000443f, 0.000410f, 0.000565f, 0.000565f, 0.000491f, 0.000623f, - 0.000616f, 0.000631f, 0.000738f, 0.000676f, 0.000759f, 0.000924f, 0.000895f, 0.001030f, - 0.001064f, 0.001176f, 0.001267f, 0.001438f, 0.001518f, 0.001704f, 0.001742f, 0.002028f, - 0.002384f, 0.002703f, 0.002972f, 0.003393f, 0.004051f, 0.004959f, 0.005993f, 0.007271f, - 0.009277f, 0.012390f, 0.016968f, 0.024368f, 0.036560f, 0.056610f, 0.091797f, 0.151245f, - 0.246460f, 0.379639f, 0.805664f, 0.812500f, 0.813477f, 0.813965f, 0.813965f, 0.813965f, - 0.000000f, 0.000000f, 0.000118f, 0.000117f, 0.000116f, 0.000114f, 0.000113f, 0.000108f, - 0.000127f, 0.000153f, 0.000133f, 0.000202f, 0.000217f, 0.000223f, 0.000242f, 0.000186f, - 0.000280f, 0.000304f, 0.000318f, 0.000342f, 0.000338f, 0.000473f, 0.000360f, 0.000484f, - 0.000422f, 0.000514f, 0.000527f, 0.000571f, 0.000633f, 0.000568f, 0.000639f, 0.000816f, - 0.000789f, 0.000889f, 0.000891f, 0.000966f, 0.001125f, 0.001276f, 0.001316f, 0.001496f, - 0.001658f, 0.001818f, 0.002047f, 0.002502f, 0.002781f, 0.003201f, 0.003914f, 0.004795f, - 0.006096f, 0.007996f, 0.010918f, 0.015617f, 0.023697f, 0.037567f, 0.063477f, 0.111084f, - 0.194824f, 0.324951f, 0.786133f, 0.792969f, 0.794434f, 0.793945f, 0.794922f, 0.794434f, - 0.000000f, 0.000119f, 0.000117f, 0.000115f, 0.000113f, 0.000112f, 0.000110f, 0.000109f, - 0.000104f, 0.000098f, 0.000099f, 0.000136f, 0.000112f, 0.000126f, 0.000175f, 0.000189f, - 0.000196f, 0.000220f, 0.000216f, 0.000247f, 0.000258f, 0.000274f, 0.000285f, 0.000309f, - 0.000308f, 0.000321f, 0.000381f, 0.000390f, 0.000475f, 0.000511f, 0.000485f, 0.000501f, - 0.000641f, 0.000588f, 0.000652f, 0.000764f, 0.000808f, 0.000952f, 0.000906f, 0.001037f, - 0.001110f, 0.001249f, 0.001411f, 0.001647f, 0.001894f, 0.002159f, 0.002687f, 0.003223f, - 0.004036f, 0.005150f, 0.006989f, 0.009644f, 0.014420f, 0.023361f, 0.040802f, 0.076050f, - 0.146362f, 0.269287f, 0.763184f, 0.770996f, 0.771973f, 0.771973f, 0.772461f, 0.772461f, - 0.000121f, 0.000116f, 0.000114f, 0.000112f, 0.000109f, 0.000108f, 0.000106f, 0.000105f, - 0.000104f, 0.000101f, 0.000095f, 0.000090f, 0.000085f, 0.000083f, 0.000104f, 0.000097f, - 0.000094f, 0.000154f, 0.000127f, 0.000178f, 0.000197f, 0.000194f, 0.000233f, 0.000213f, - 0.000279f, 0.000294f, 0.000293f, 0.000258f, 0.000319f, 0.000394f, 0.000344f, 0.000369f, - 0.000394f, 0.000410f, 0.000438f, 0.000509f, 0.000514f, 0.000580f, 0.000617f, 0.000684f, - 0.000807f, 0.000812f, 0.000914f, 0.001094f, 0.001183f, 0.001436f, 0.001639f, 0.002033f, - 0.002523f, 0.003073f, 0.004063f, 0.005680f, 0.008560f, 0.013466f, 0.024109f, 0.047791f, - 0.102051f, 0.213867f, 0.740234f, 0.746582f, 0.748047f, 0.748535f, 0.749023f, 0.749023f, - 0.000000f, 0.000113f, 0.000108f, 0.000107f, 0.000104f, 0.000102f, 0.000099f, 0.000099f, - 0.000097f, 0.000096f, 0.000095f, 0.000091f, 0.000086f, 0.000081f, 0.000077f, 0.000073f, - 0.000085f, 0.000091f, 0.000070f, 0.000102f, 0.000117f, 0.000131f, 0.000145f, 0.000148f, - 0.000171f, 0.000178f, 0.000178f, 0.000207f, 0.000225f, 0.000209f, 0.000285f, 0.000238f, - 0.000260f, 0.000298f, 0.000331f, 0.000360f, 0.000371f, 0.000346f, 0.000407f, 0.000443f, - 0.000494f, 0.000516f, 0.000578f, 0.000662f, 0.000767f, 0.000847f, 0.001004f, 0.001149f, - 0.001451f, 0.001783f, 0.002310f, 0.003262f, 0.004593f, 0.007309f, 0.012985f, 0.026703f, - 0.064026f, 0.158813f, 0.712891f, 0.719238f, 0.722168f, 0.721680f, 0.722168f, 0.722656f, - 0.000000f, 0.000105f, 0.000102f, 0.000098f, 0.000094f, 0.000092f, 0.000091f, 0.000089f, - 0.000088f, 0.000086f, 0.000085f, 0.000084f, 0.000083f, 0.000080f, 0.000076f, 0.000073f, - 0.000069f, 0.000065f, 0.000062f, 0.000059f, 0.000068f, 0.000063f, 0.000069f, 0.000074f, - 0.000087f, 0.000102f, 0.000112f, 0.000130f, 0.000137f, 0.000129f, 0.000143f, 0.000168f, - 0.000180f, 0.000178f, 0.000189f, 0.000198f, 0.000222f, 0.000240f, 0.000262f, 0.000285f, - 0.000304f, 0.000317f, 0.000339f, 0.000399f, 0.000439f, 0.000490f, 0.000570f, 0.000658f, - 0.000781f, 0.000988f, 0.001235f, 0.001674f, 0.002407f, 0.003725f, 0.006485f, 0.013199f, - 0.034546f, 0.107605f, 0.682129f, 0.691406f, 0.692871f, 0.691406f, 0.692871f, 0.692871f, - 0.000105f, 0.000089f, 0.000085f, 0.000080f, 0.000078f, 0.000078f, 0.000075f, 0.000074f, - 0.000072f, 0.000072f, 0.000070f, 0.000071f, 0.000069f, 0.000069f, 0.000069f, 0.000068f, - 0.000066f, 0.000063f, 0.000060f, 0.000057f, 0.000054f, 0.000052f, 0.000049f, 0.000047f, - 0.000046f, 0.000045f, 0.000048f, 0.000055f, 0.000060f, 0.000068f, 0.000083f, 0.000087f, - 0.000092f, 0.000103f, 0.000109f, 0.000117f, 0.000130f, 0.000150f, 0.000148f, 0.000142f, - 0.000167f, 0.000186f, 0.000210f, 0.000213f, 0.000232f, 0.000280f, 0.000292f, 0.000329f, - 0.000391f, 0.000456f, 0.000596f, 0.000764f, 0.001065f, 0.001633f, 0.002806f, 0.005909f, - 0.015488f, 0.062378f, 0.651367f, 0.659668f, 0.661133f, 0.661133f, 0.660645f, 0.661621f, - 0.000034f, 0.000037f, 0.000048f, 0.000051f, 0.000047f, 0.000049f, 0.000047f, 0.000051f, - 0.000049f, 0.000051f, 0.000049f, 0.000050f, 0.000051f, 0.000050f, 0.000050f, 0.000049f, - 0.000051f, 0.000050f, 0.000051f, 0.000050f, 0.000049f, 0.000047f, 0.000045f, 0.000043f, - 0.000041f, 0.000039f, 0.000037f, 0.000035f, 0.000033f, 0.000032f, 0.000030f, 0.000029f, - 0.000034f, 0.000041f, 0.000046f, 0.000057f, 0.000063f, 0.000067f, 0.000065f, 0.000072f, - 0.000083f, 0.000093f, 0.000096f, 0.000102f, 0.000102f, 0.000135f, 0.000134f, 0.000151f, - 0.000184f, 0.000198f, 0.000245f, 0.000306f, 0.000425f, 0.000607f, 0.001032f, 0.002081f, - 0.005886f, 0.027924f, 0.617188f, 0.625977f, 0.627441f, 0.627930f, 0.626953f, 0.628418f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000006f, 0.000010f, 0.000014f, - 0.000016f, 0.000014f, 0.000019f, 0.000022f, 0.000022f, 0.000022f, 0.000025f, 0.000026f, - 0.000027f, 0.000028f, 0.000029f, 0.000029f, 0.000029f, 0.000030f, 0.000030f, 0.000031f, - 0.000032f, 0.000032f, 0.000031f, 0.000030f, 0.000028f, 0.000027f, 0.000026f, 0.000024f, - 0.000023f, 0.000022f, 0.000021f, 0.000020f, 0.000019f, 0.000021f, 0.000022f, 0.000024f, - 0.000027f, 0.000035f, 0.000041f, 0.000034f, 0.000041f, 0.000052f, 0.000051f, 0.000051f, - 0.000058f, 0.000070f, 0.000074f, 0.000103f, 0.000119f, 0.000169f, 0.000277f, 0.000510f, - 0.001495f, 0.008766f, 0.583008f, 0.590332f, 0.591797f, 0.591797f, 0.592285f, 0.592285f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000002f, 0.000003f, 0.000005f, 0.000006f, - 0.000008f, 0.000009f, 0.000010f, 0.000010f, 0.000012f, 0.000012f, 0.000013f, 0.000014f, - 0.000015f, 0.000015f, 0.000015f, 0.000015f, 0.000014f, 0.000013f, 0.000013f, 0.000012f, - 0.000011f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000014f, 0.000011f, 0.000015f, - 0.000017f, 0.000017f, 0.000021f, 0.000020f, 0.000026f, 0.000026f, 0.000042f, 0.000069f, - 0.000178f, 0.001302f, 0.544434f, 0.553711f, 0.554688f, 0.554688f, 0.556152f, 0.556641f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000002f, 0.000003f, 0.000003f, - 0.000003f, 0.000003f, 0.000003f, 0.000002f, 0.000002f, 0.000001f, 0.000003f, 0.000003f, - 0.000004f, 0.000014f, 0.506836f, 0.515137f, 0.516113f, 0.516602f, 0.517090f, 0.517578f, - }, - { - 0.089539f, 0.244873f, 0.368164f, 0.464355f, 0.539551f, 0.599121f, 0.648438f, 0.688477f, - 0.721680f, 0.749512f, 0.772461f, 0.793945f, 0.811523f, 0.826172f, 0.841309f, 0.854004f, - 0.863770f, 0.874512f, 0.883301f, 0.891602f, 0.898438f, 0.906250f, 0.912109f, 0.917969f, - 0.922852f, 0.928223f, 0.932617f, 0.937012f, 0.940918f, 0.944336f, 0.948242f, 0.951660f, - 0.954590f, 0.957520f, 0.960449f, 0.962891f, 0.965820f, 0.967773f, 0.970215f, 0.972656f, - 0.974609f, 0.976074f, 0.978516f, 0.979492f, 0.981934f, 0.983398f, 0.984863f, 0.986328f, - 0.987793f, 0.988770f, 0.990234f, 0.991699f, 0.993164f, 0.994141f, 0.995117f, 0.996582f, - 0.997559f, 0.998535f, 0.999023f, 0.998535f, 0.997559f, 0.997070f, 0.996582f, 0.995605f, - 0.045563f, 0.143921f, 0.242798f, 0.334717f, 0.417969f, 0.489258f, 0.550293f, 0.602051f, - 0.646484f, 0.683594f, 0.715820f, 0.743652f, 0.767090f, 0.788086f, 0.805664f, 0.822266f, - 0.836426f, 0.849609f, 0.861328f, 0.870117f, 0.879883f, 0.889160f, 0.896973f, 0.903320f, - 0.909668f, 0.916016f, 0.921875f, 0.926758f, 0.931641f, 0.936523f, 0.940430f, 0.943848f, - 0.947266f, 0.951172f, 0.954102f, 0.957520f, 0.960449f, 0.962891f, 0.965820f, 0.968262f, - 0.970215f, 0.973145f, 0.974121f, 0.976074f, 0.979004f, 0.980469f, 0.982422f, 0.983887f, - 0.985352f, 0.986816f, 0.988281f, 0.989746f, 0.991211f, 0.992188f, 0.994141f, 0.995117f, - 0.996094f, 0.997070f, 0.998535f, 0.997559f, 0.997070f, 0.996582f, 0.996094f, 0.995117f, - 0.026855f, 0.089233f, 0.159790f, 0.234619f, 0.308838f, 0.381348f, 0.447754f, 0.507812f, - 0.561035f, 0.606934f, 0.646484f, 0.683105f, 0.712402f, 0.740234f, 0.763184f, 0.784668f, - 0.802246f, 0.819336f, 0.833984f, 0.846680f, 0.857910f, 0.868652f, 0.878418f, 0.886719f, - 0.895508f, 0.903320f, 0.909668f, 0.915527f, 0.920410f, 0.926270f, 0.931152f, 0.935547f, - 0.940430f, 0.943848f, 0.947754f, 0.951172f, 0.954590f, 0.958008f, 0.960449f, 0.963379f, - 0.966309f, 0.968750f, 0.971191f, 0.973145f, 0.975586f, 0.977051f, 0.979004f, 0.981445f, - 0.982910f, 0.983887f, 0.985840f, 0.987305f, 0.988770f, 0.990723f, 0.992188f, 0.993164f, - 0.994629f, 0.996094f, 0.998047f, 0.997070f, 0.996582f, 0.996094f, 0.995605f, 0.995117f, - 0.017746f, 0.058746f, 0.108276f, 0.163818f, 0.224365f, 0.288086f, 0.351562f, 0.413086f, - 0.470947f, 0.522949f, 0.569824f, 0.612793f, 0.650879f, 0.684570f, 0.713867f, 0.739258f, - 0.762695f, 0.783203f, 0.800781f, 0.817871f, 0.833008f, 0.845215f, 0.857422f, 0.868164f, - 0.877441f, 0.886230f, 0.894043f, 0.902832f, 0.908691f, 0.915039f, 0.921387f, 0.925781f, - 0.930664f, 0.936035f, 0.939941f, 0.944336f, 0.948242f, 0.951660f, 0.955078f, 0.957520f, - 0.961426f, 0.964355f, 0.967285f, 0.968750f, 0.971680f, 0.974121f, 0.975586f, 0.978027f, - 0.979980f, 0.981934f, 0.983887f, 0.985352f, 0.987305f, 0.988770f, 0.989746f, 0.991211f, - 0.992676f, 0.993652f, 0.997070f, 0.996582f, 0.996582f, 0.996094f, 0.995117f, 0.994629f, - 0.012337f, 0.041229f, 0.075928f, 0.117065f, 0.163208f, 0.214478f, 0.270020f, 0.327148f, - 0.383301f, 0.437500f, 0.490234f, 0.536621f, 0.581543f, 0.621094f, 0.656250f, 0.688477f, - 0.716797f, 0.741699f, 0.763672f, 0.784668f, 0.802246f, 0.818359f, 0.832520f, 0.845703f, - 0.857422f, 0.868164f, 0.877930f, 0.886230f, 0.895020f, 0.902344f, 0.909668f, 0.915039f, - 0.921875f, 0.926758f, 0.931641f, 0.937012f, 0.940430f, 0.946289f, 0.949219f, 0.952637f, - 0.956055f, 0.958984f, 0.961914f, 0.964844f, 0.967773f, 0.970215f, 0.972656f, 0.974609f, - 0.976562f, 0.979004f, 0.980957f, 0.982910f, 0.984863f, 0.986816f, 0.987793f, 0.989746f, - 0.990723f, 0.992676f, 0.996582f, 0.996094f, 0.995605f, 0.995117f, 0.994629f, 0.994141f, - 0.009315f, 0.030411f, 0.055756f, 0.085632f, 0.121094f, 0.160889f, 0.206055f, 0.254150f, - 0.305664f, 0.357422f, 0.408447f, 0.459717f, 0.506836f, 0.551270f, 0.592773f, 0.629395f, - 0.662598f, 0.692871f, 0.719727f, 0.745117f, 0.767090f, 0.786133f, 0.804688f, 0.819336f, - 0.834473f, 0.847168f, 0.858398f, 0.869629f, 0.879395f, 0.888672f, 0.895020f, 0.903320f, - 0.910156f, 0.916016f, 0.922363f, 0.928223f, 0.933105f, 0.937012f, 0.941406f, 0.946289f, - 0.950195f, 0.954102f, 0.957031f, 0.960449f, 0.963379f, 0.965820f, 0.969238f, 0.971191f, - 0.974121f, 0.976074f, 0.978027f, 0.979980f, 0.982422f, 0.984375f, 0.985840f, 0.987793f, - 0.989258f, 0.990723f, 0.995605f, 0.995605f, 0.995117f, 0.994629f, 0.994629f, 0.993652f, - 0.006634f, 0.022736f, 0.041962f, 0.064026f, 0.090759f, 0.122192f, 0.157593f, 0.197510f, - 0.240356f, 0.287354f, 0.335693f, 0.384766f, 0.432373f, 0.479736f, 0.523438f, 0.565430f, - 0.604004f, 0.639160f, 0.670898f, 0.699219f, 0.726562f, 0.749023f, 0.770508f, 0.790527f, - 0.806641f, 0.822754f, 0.836426f, 0.848633f, 0.859863f, 0.871582f, 0.881348f, 0.889160f, - 0.897949f, 0.905273f, 0.912598f, 0.918945f, 0.924316f, 0.929199f, 0.935059f, 0.938965f, - 0.943848f, 0.947266f, 0.951660f, 0.955078f, 0.958496f, 0.961914f, 0.964844f, 0.967773f, - 0.970703f, 0.973145f, 0.975098f, 0.977539f, 0.979492f, 0.981445f, 0.983887f, 0.985352f, - 0.987305f, 0.989258f, 0.995117f, 0.994629f, 0.994141f, 0.994141f, 0.993652f, 0.993164f, - 0.005428f, 0.017807f, 0.032166f, 0.049652f, 0.070007f, 0.093811f, 0.121765f, 0.153564f, - 0.189087f, 0.228516f, 0.270752f, 0.316162f, 0.362061f, 0.408936f, 0.453857f, 0.498779f, - 0.540527f, 0.579590f, 0.615723f, 0.649902f, 0.679688f, 0.707520f, 0.732422f, 0.755371f, - 0.775391f, 0.794922f, 0.811035f, 0.826172f, 0.839844f, 0.852051f, 0.864258f, 0.875000f, - 0.883301f, 0.892578f, 0.899902f, 0.907715f, 0.914062f, 0.920410f, 0.926270f, 0.931641f, - 0.936035f, 0.940918f, 0.945312f, 0.949219f, 0.954102f, 0.957031f, 0.960938f, 0.963379f, - 0.966797f, 0.969238f, 0.972168f, 0.974609f, 0.977051f, 0.979492f, 0.980957f, 0.983398f, - 0.985352f, 0.987305f, 0.994141f, 0.994141f, 0.994141f, 0.993652f, 0.993164f, 0.992676f, - 0.004223f, 0.014046f, 0.025452f, 0.039062f, 0.055115f, 0.073608f, 0.095642f, 0.120239f, - 0.149292f, 0.182251f, 0.217529f, 0.257080f, 0.298828f, 0.342773f, 0.387207f, 0.431152f, - 0.474609f, 0.516602f, 0.556641f, 0.593750f, 0.628418f, 0.660156f, 0.689453f, 0.715820f, - 0.740723f, 0.762207f, 0.782227f, 0.799805f, 0.816406f, 0.830566f, 0.844727f, 0.855469f, - 0.867188f, 0.877441f, 0.886230f, 0.895020f, 0.903809f, 0.910645f, 0.917480f, 0.923340f, - 0.928711f, 0.934570f, 0.939453f, 0.943848f, 0.948242f, 0.952148f, 0.956055f, 0.959473f, - 0.961914f, 0.965820f, 0.968750f, 0.971680f, 0.974121f, 0.975586f, 0.979004f, 0.980957f, - 0.983398f, 0.985352f, 0.993652f, 0.993652f, 0.993164f, 0.993164f, 0.992676f, 0.991699f, - 0.003532f, 0.011536f, 0.020645f, 0.031342f, 0.044098f, 0.058624f, 0.075989f, 0.096252f, - 0.119141f, 0.145386f, 0.175049f, 0.208130f, 0.244385f, 0.283203f, 0.324463f, 0.367432f, - 0.410400f, 0.453369f, 0.495361f, 0.534668f, 0.572266f, 0.607910f, 0.641602f, 0.672852f, - 0.700195f, 0.725098f, 0.748047f, 0.769531f, 0.789062f, 0.806152f, 0.821777f, 0.835938f, - 0.848633f, 0.860352f, 0.872070f, 0.881836f, 0.890625f, 0.898926f, 0.906738f, 0.913086f, - 0.919922f, 0.925781f, 0.931641f, 0.936523f, 0.941406f, 0.946289f, 0.950684f, 0.954590f, - 0.958008f, 0.961426f, 0.964844f, 0.968262f, 0.970703f, 0.973633f, 0.976074f, 0.978516f, - 0.980469f, 0.982910f, 0.992676f, 0.992676f, 0.992188f, 0.992188f, 0.991699f, 0.990723f, - 0.002850f, 0.009483f, 0.016647f, 0.025833f, 0.035889f, 0.047424f, 0.061646f, 0.076660f, - 0.095642f, 0.117065f, 0.141113f, 0.168457f, 0.198975f, 0.233032f, 0.269775f, 0.308838f, - 0.349854f, 0.391357f, 0.432861f, 0.474121f, 0.515625f, 0.552734f, 0.589355f, 0.622559f, - 0.654785f, 0.683594f, 0.710938f, 0.735352f, 0.757812f, 0.777344f, 0.795898f, 0.812988f, - 0.827637f, 0.842285f, 0.854492f, 0.866211f, 0.876953f, 0.886719f, 0.895508f, 0.902832f, - 0.911133f, 0.917969f, 0.924316f, 0.929688f, 0.935059f, 0.940430f, 0.945312f, 0.949219f, - 0.953125f, 0.958008f, 0.961426f, 0.964844f, 0.967285f, 0.970703f, 0.973633f, 0.975586f, - 0.978516f, 0.981445f, 0.991699f, 0.992188f, 0.991699f, 0.991211f, 0.991211f, 0.990723f, - 0.002628f, 0.007713f, 0.014069f, 0.021484f, 0.029709f, 0.038910f, 0.050201f, 0.063171f, - 0.078186f, 0.094849f, 0.114563f, 0.137329f, 0.162720f, 0.190918f, 0.222656f, 0.257568f, - 0.293945f, 0.332764f, 0.372803f, 0.414551f, 0.455078f, 0.495361f, 0.533691f, 0.571289f, - 0.606445f, 0.639160f, 0.668457f, 0.697754f, 0.723633f, 0.746094f, 0.767090f, 0.787598f, - 0.804199f, 0.820801f, 0.834473f, 0.848633f, 0.860352f, 0.872559f, 0.882324f, 0.891602f, - 0.899902f, 0.907715f, 0.915039f, 0.921387f, 0.927734f, 0.934082f, 0.938965f, 0.944824f, - 0.948730f, 0.953125f, 0.956543f, 0.960938f, 0.963867f, 0.967285f, 0.970215f, 0.973145f, - 0.976074f, 0.978516f, 0.990234f, 0.990723f, 0.990723f, 0.991211f, 0.990234f, 0.990234f, - 0.002131f, 0.006535f, 0.012016f, 0.017670f, 0.024780f, 0.032837f, 0.041199f, 0.051819f, - 0.063904f, 0.077759f, 0.093689f, 0.112610f, 0.133057f, 0.156860f, 0.183472f, 0.213257f, - 0.245605f, 0.281006f, 0.318115f, 0.357422f, 0.397217f, 0.437500f, 0.478271f, 0.516602f, - 0.554688f, 0.589844f, 0.623535f, 0.654785f, 0.684082f, 0.710938f, 0.734375f, 0.757812f, - 0.777832f, 0.795898f, 0.813477f, 0.828613f, 0.843262f, 0.855957f, 0.867676f, 0.878906f, - 0.888184f, 0.897461f, 0.905273f, 0.912598f, 0.919922f, 0.926758f, 0.932129f, 0.937988f, - 0.942871f, 0.947754f, 0.951660f, 0.955566f, 0.960449f, 0.964355f, 0.967285f, 0.970215f, - 0.973145f, 0.976074f, 0.989746f, 0.990234f, 0.990234f, 0.990234f, 0.989746f, 0.988770f, - 0.001566f, 0.005798f, 0.010231f, 0.015259f, 0.020920f, 0.027176f, 0.034607f, 0.043335f, - 0.052887f, 0.064392f, 0.077576f, 0.092712f, 0.109802f, 0.129639f, 0.151611f, 0.176758f, - 0.204346f, 0.235474f, 0.269043f, 0.304688f, 0.342529f, 0.381836f, 0.421143f, 0.460449f, - 0.500488f, 0.538086f, 0.574219f, 0.608887f, 0.640625f, 0.670898f, 0.699219f, 0.725098f, - 0.748535f, 0.769043f, 0.788574f, 0.807129f, 0.823242f, 0.837402f, 0.850586f, 0.863281f, - 0.874512f, 0.885254f, 0.894043f, 0.902832f, 0.910645f, 0.917969f, 0.924805f, 0.931152f, - 0.936523f, 0.941895f, 0.947266f, 0.951172f, 0.955566f, 0.960449f, 0.963867f, 0.966797f, - 0.970703f, 0.973145f, 0.988281f, 0.989258f, 0.989258f, 0.989258f, 0.988770f, 0.988281f, - 0.001427f, 0.004749f, 0.008934f, 0.012833f, 0.017670f, 0.023483f, 0.029114f, 0.036438f, - 0.044556f, 0.054047f, 0.064453f, 0.077148f, 0.091309f, 0.107544f, 0.125854f, 0.146729f, - 0.170776f, 0.197266f, 0.226440f, 0.257568f, 0.292236f, 0.329346f, 0.367188f, 0.405762f, - 0.445557f, 0.484619f, 0.522949f, 0.559570f, 0.595215f, 0.627441f, 0.659180f, 0.687012f, - 0.714355f, 0.739258f, 0.761719f, 0.781738f, 0.800781f, 0.817383f, 0.833984f, 0.847168f, - 0.859375f, 0.872070f, 0.882324f, 0.891602f, 0.900879f, 0.909668f, 0.916504f, 0.923828f, - 0.930176f, 0.936523f, 0.941895f, 0.946777f, 0.951172f, 0.956055f, 0.960449f, 0.963867f, - 0.967285f, 0.970703f, 0.987305f, 0.988770f, 0.988281f, 0.987793f, 0.987793f, 0.987793f, - 0.001357f, 0.004501f, 0.007557f, 0.011284f, 0.015236f, 0.019791f, 0.025101f, 0.030838f, - 0.037628f, 0.045532f, 0.054596f, 0.064636f, 0.076355f, 0.089905f, 0.105042f, 0.122498f, - 0.142334f, 0.164307f, 0.189697f, 0.217896f, 0.248413f, 0.281494f, 0.316406f, 0.354004f, - 0.391846f, 0.430664f, 0.469971f, 0.508301f, 0.545898f, 0.582031f, 0.615723f, 0.647461f, - 0.677734f, 0.704590f, 0.731445f, 0.754395f, 0.775391f, 0.794922f, 0.811523f, 0.829102f, - 0.842773f, 0.856934f, 0.868652f, 0.880371f, 0.891113f, 0.899414f, 0.908203f, 0.915527f, - 0.922852f, 0.930176f, 0.936035f, 0.941406f, 0.947266f, 0.951660f, 0.957031f, 0.960449f, - 0.963867f, 0.968262f, 0.986328f, 0.987305f, 0.987793f, 0.987305f, 0.987305f, 0.986816f, - 0.001239f, 0.003864f, 0.006699f, 0.009621f, 0.013008f, 0.017059f, 0.021805f, 0.026703f, - 0.032562f, 0.039185f, 0.045807f, 0.054352f, 0.064514f, 0.075439f, 0.088257f, 0.102478f, - 0.119263f, 0.138306f, 0.159546f, 0.183228f, 0.209961f, 0.239258f, 0.271484f, 0.305176f, - 0.341797f, 0.379639f, 0.417480f, 0.456787f, 0.495605f, 0.532227f, 0.570801f, 0.604980f, - 0.637207f, 0.666992f, 0.696289f, 0.722656f, 0.746582f, 0.768555f, 0.789062f, 0.808105f, - 0.824219f, 0.839844f, 0.854492f, 0.865723f, 0.878418f, 0.888672f, 0.897461f, 0.906738f, - 0.915039f, 0.922363f, 0.929199f, 0.935547f, 0.941895f, 0.946289f, 0.952148f, 0.956543f, - 0.960449f, 0.964844f, 0.985352f, 0.986816f, 0.986816f, 0.986328f, 0.986328f, 0.985840f, - 0.001151f, 0.003429f, 0.005753f, 0.008400f, 0.011391f, 0.014877f, 0.018494f, 0.022858f, - 0.028046f, 0.033112f, 0.039642f, 0.046661f, 0.054565f, 0.064026f, 0.074280f, 0.086243f, - 0.100403f, 0.116150f, 0.133789f, 0.154053f, 0.176636f, 0.202393f, 0.230957f, 0.261719f, - 0.295166f, 0.330322f, 0.367432f, 0.405518f, 0.445312f, 0.483398f, 0.520996f, 0.558105f, - 0.594238f, 0.626465f, 0.659668f, 0.688477f, 0.714844f, 0.740723f, 0.763672f, 0.784180f, - 0.804199f, 0.821289f, 0.837402f, 0.852051f, 0.864258f, 0.876465f, 0.886719f, 0.897949f, - 0.906250f, 0.915039f, 0.922363f, 0.929199f, 0.935547f, 0.941406f, 0.946777f, 0.952637f, - 0.958008f, 0.961914f, 0.983887f, 0.985840f, 0.985352f, 0.985352f, 0.984863f, 0.984863f, - 0.001000f, 0.002768f, 0.005127f, 0.007515f, 0.010155f, 0.013283f, 0.016205f, 0.019714f, - 0.023987f, 0.028854f, 0.033905f, 0.040161f, 0.046814f, 0.054199f, 0.063110f, 0.073303f, - 0.084839f, 0.098145f, 0.112854f, 0.129883f, 0.149292f, 0.171387f, 0.195435f, 0.222778f, - 0.252686f, 0.285400f, 0.320312f, 0.356689f, 0.394531f, 0.433105f, 0.471924f, 0.510742f, - 0.547852f, 0.584473f, 0.617676f, 0.650879f, 0.680664f, 0.708984f, 0.734375f, 0.759277f, - 0.780762f, 0.799805f, 0.817383f, 0.834473f, 0.849121f, 0.862793f, 0.875488f, 0.886719f, - 0.896484f, 0.906250f, 0.915039f, 0.923828f, 0.930176f, 0.936035f, 0.942871f, 0.948242f, - 0.953613f, 0.958008f, 0.982910f, 0.983887f, 0.984375f, 0.983887f, 0.984375f, 0.983398f, - 0.000799f, 0.002705f, 0.004459f, 0.006573f, 0.008842f, 0.011375f, 0.014099f, 0.017487f, - 0.020798f, 0.024963f, 0.029465f, 0.034637f, 0.039703f, 0.046478f, 0.054047f, 0.062256f, - 0.072388f, 0.082947f, 0.095764f, 0.110229f, 0.126099f, 0.144775f, 0.165771f, 0.189697f, - 0.216187f, 0.244995f, 0.276123f, 0.310303f, 0.346191f, 0.384521f, 0.422607f, 0.461670f, - 0.500000f, 0.538574f, 0.575195f, 0.609863f, 0.643555f, 0.673828f, 0.702637f, 0.730469f, - 0.754395f, 0.777344f, 0.797363f, 0.815430f, 0.833008f, 0.848633f, 0.861328f, 0.875000f, - 0.886719f, 0.896973f, 0.906738f, 0.915039f, 0.923340f, 0.930176f, 0.936523f, 0.943848f, - 0.948730f, 0.954102f, 0.981445f, 0.983398f, 0.982910f, 0.983398f, 0.982910f, 0.982910f, - 0.000774f, 0.002554f, 0.003899f, 0.005875f, 0.007759f, 0.009949f, 0.012733f, 0.015060f, - 0.018280f, 0.021667f, 0.025574f, 0.029678f, 0.034698f, 0.040405f, 0.046570f, 0.053650f, - 0.061462f, 0.071106f, 0.081360f, 0.093323f, 0.107300f, 0.122864f, 0.140747f, 0.160522f, - 0.183960f, 0.209229f, 0.237305f, 0.268799f, 0.302002f, 0.337402f, 0.374023f, 0.413330f, - 0.451904f, 0.490967f, 0.529785f, 0.567383f, 0.603027f, 0.636719f, 0.668457f, 0.698242f, - 0.725586f, 0.750977f, 0.773926f, 0.793945f, 0.813965f, 0.831543f, 0.847656f, 0.861816f, - 0.874512f, 0.886719f, 0.897461f, 0.906738f, 0.915527f, 0.923828f, 0.931641f, 0.937988f, - 0.944824f, 0.949707f, 0.979980f, 0.981934f, 0.981934f, 0.981934f, 0.981934f, 0.981445f, - 0.000657f, 0.001934f, 0.003330f, 0.005280f, 0.006748f, 0.009079f, 0.010994f, 0.013763f, - 0.015945f, 0.019150f, 0.022003f, 0.026001f, 0.030350f, 0.034790f, 0.040253f, 0.045898f, - 0.052795f, 0.060852f, 0.069641f, 0.079346f, 0.091187f, 0.104492f, 0.119751f, 0.136963f, - 0.156372f, 0.178345f, 0.203247f, 0.230957f, 0.260742f, 0.294189f, 0.328613f, 0.365723f, - 0.403564f, 0.443115f, 0.482910f, 0.521484f, 0.559570f, 0.596680f, 0.630859f, 0.664062f, - 0.694336f, 0.722168f, 0.747559f, 0.771484f, 0.793457f, 0.813477f, 0.830078f, 0.846191f, - 0.861816f, 0.874023f, 0.887207f, 0.898438f, 0.908691f, 0.916992f, 0.925293f, 0.933594f, - 0.939941f, 0.946777f, 0.978516f, 0.980469f, 0.980469f, 0.980469f, 0.980469f, 0.980469f, - 0.000818f, 0.001935f, 0.003246f, 0.004658f, 0.006229f, 0.007912f, 0.010017f, 0.012093f, - 0.014259f, 0.016586f, 0.019653f, 0.022659f, 0.026413f, 0.030289f, 0.034790f, 0.039917f, - 0.045441f, 0.052338f, 0.059479f, 0.068115f, 0.077759f, 0.089050f, 0.102051f, 0.116272f, - 0.133179f, 0.152344f, 0.173340f, 0.197876f, 0.224243f, 0.254150f, 0.286621f, 0.321533f, - 0.357666f, 0.396729f, 0.436279f, 0.475830f, 0.514648f, 0.553711f, 0.590332f, 0.626465f, - 0.659180f, 0.689941f, 0.719238f, 0.746094f, 0.770020f, 0.792480f, 0.812500f, 0.830566f, - 0.846680f, 0.862305f, 0.875977f, 0.888184f, 0.899414f, 0.910156f, 0.918945f, 0.927246f, - 0.935059f, 0.941895f, 0.977051f, 0.979004f, 0.979492f, 0.979004f, 0.979492f, 0.979004f, - 0.000583f, 0.001696f, 0.003044f, 0.004276f, 0.005394f, 0.007111f, 0.009048f, 0.010727f, - 0.012802f, 0.014549f, 0.017319f, 0.019943f, 0.023132f, 0.026459f, 0.030212f, 0.034576f, - 0.039612f, 0.045105f, 0.051422f, 0.058594f, 0.066833f, 0.076416f, 0.087341f, 0.099792f, - 0.113647f, 0.130005f, 0.147827f, 0.168945f, 0.192261f, 0.218750f, 0.247803f, 0.280029f, - 0.314209f, 0.351074f, 0.389404f, 0.429199f, 0.468750f, 0.508301f, 0.547852f, 0.585938f, - 0.622070f, 0.655762f, 0.687988f, 0.718262f, 0.744629f, 0.769531f, 0.792480f, 0.812500f, - 0.832520f, 0.848633f, 0.863770f, 0.877441f, 0.890137f, 0.901367f, 0.912109f, 0.921387f, - 0.929199f, 0.937500f, 0.975586f, 0.978027f, 0.978027f, 0.977539f, 0.977539f, 0.977051f, - 0.000463f, 0.001634f, 0.002899f, 0.003574f, 0.004932f, 0.006233f, 0.007866f, 0.009644f, - 0.011055f, 0.012894f, 0.015518f, 0.017792f, 0.020279f, 0.023178f, 0.026657f, 0.030136f, - 0.034271f, 0.039062f, 0.044586f, 0.050446f, 0.057739f, 0.065613f, 0.074646f, 0.084900f, - 0.097107f, 0.111023f, 0.126099f, 0.143921f, 0.164673f, 0.187500f, 0.213257f, 0.242065f, - 0.273926f, 0.308594f, 0.344971f, 0.383301f, 0.423340f, 0.463623f, 0.503906f, 0.543945f, - 0.582520f, 0.619629f, 0.653809f, 0.686523f, 0.717285f, 0.744629f, 0.770020f, 0.792969f, - 0.814453f, 0.833496f, 0.850098f, 0.866211f, 0.879395f, 0.893066f, 0.904297f, 0.914551f, - 0.923828f, 0.932129f, 0.973145f, 0.976074f, 0.976562f, 0.976074f, 0.976074f, 0.976074f, - 0.000472f, 0.001289f, 0.002508f, 0.003481f, 0.004459f, 0.005894f, 0.007042f, 0.008232f, - 0.009972f, 0.011719f, 0.013435f, 0.015884f, 0.017899f, 0.020386f, 0.023422f, 0.026428f, - 0.030411f, 0.034180f, 0.038757f, 0.043854f, 0.049652f, 0.056549f, 0.064270f, 0.073303f, - 0.083252f, 0.095093f, 0.107910f, 0.123169f, 0.141113f, 0.160645f, 0.183472f, 0.208618f, - 0.237305f, 0.268799f, 0.302734f, 0.339600f, 0.377930f, 0.418457f, 0.459473f, 0.500000f, - 0.540527f, 0.579102f, 0.617188f, 0.652832f, 0.685547f, 0.716309f, 0.745117f, 0.771484f, - 0.794922f, 0.815918f, 0.834961f, 0.853027f, 0.868652f, 0.882324f, 0.895996f, 0.907227f, - 0.916992f, 0.927246f, 0.972168f, 0.974121f, 0.975098f, 0.973633f, 0.974609f, 0.973633f, - 0.000238f, 0.001453f, 0.002047f, 0.002985f, 0.004227f, 0.005272f, 0.006096f, 0.007309f, - 0.008957f, 0.010437f, 0.012184f, 0.014214f, 0.015793f, 0.018082f, 0.020538f, 0.023270f, - 0.026505f, 0.029648f, 0.033813f, 0.038300f, 0.043457f, 0.049042f, 0.055298f, 0.062744f, - 0.070984f, 0.081299f, 0.092590f, 0.105591f, 0.120361f, 0.137695f, 0.156982f, 0.179443f, - 0.204346f, 0.232788f, 0.263672f, 0.297363f, 0.334229f, 0.373047f, 0.414307f, 0.455322f, - 0.497314f, 0.538086f, 0.578613f, 0.616211f, 0.653320f, 0.686523f, 0.718262f, 0.747559f, - 0.773438f, 0.797363f, 0.818848f, 0.838867f, 0.856934f, 0.871582f, 0.885742f, 0.898926f, - 0.910645f, 0.920410f, 0.970215f, 0.971680f, 0.972656f, 0.972656f, 0.972168f, 0.972168f, - 0.000376f, 0.001075f, 0.002052f, 0.002823f, 0.003603f, 0.004509f, 0.005619f, 0.007008f, - 0.008064f, 0.009132f, 0.010849f, 0.012314f, 0.013817f, 0.015945f, 0.018188f, 0.020676f, - 0.022995f, 0.026230f, 0.029587f, 0.033234f, 0.037598f, 0.042328f, 0.048004f, 0.054230f, - 0.061188f, 0.069824f, 0.079468f, 0.090454f, 0.103271f, 0.117493f, 0.134644f, 0.153931f, - 0.175293f, 0.200806f, 0.228149f, 0.259277f, 0.293945f, 0.330566f, 0.370117f, 0.410889f, - 0.453369f, 0.495605f, 0.537109f, 0.578125f, 0.616699f, 0.653809f, 0.689453f, 0.721191f, - 0.750000f, 0.776855f, 0.800293f, 0.822754f, 0.841309f, 0.859863f, 0.876465f, 0.890137f, - 0.902832f, 0.914062f, 0.967773f, 0.970703f, 0.970703f, 0.970703f, 0.970703f, 0.970703f, - 0.000237f, 0.000972f, 0.001674f, 0.002413f, 0.003336f, 0.003956f, 0.005093f, 0.006039f, - 0.007069f, 0.008202f, 0.009613f, 0.011017f, 0.012520f, 0.014282f, 0.016068f, 0.017853f, - 0.020508f, 0.023117f, 0.025986f, 0.029160f, 0.032898f, 0.036865f, 0.041565f, 0.046997f, - 0.052887f, 0.060089f, 0.068176f, 0.077515f, 0.088257f, 0.100586f, 0.114929f, 0.131592f, - 0.150635f, 0.172241f, 0.196411f, 0.224731f, 0.255859f, 0.290039f, 0.327393f, 0.367188f, - 0.409180f, 0.451172f, 0.493896f, 0.536621f, 0.578613f, 0.618164f, 0.655762f, 0.691406f, - 0.724121f, 0.753906f, 0.781738f, 0.805176f, 0.827637f, 0.847656f, 0.864746f, 0.880859f, - 0.895508f, 0.907715f, 0.965332f, 0.968262f, 0.968750f, 0.969238f, 0.967773f, 0.967773f, - 0.000450f, 0.001033f, 0.001554f, 0.002131f, 0.002939f, 0.003662f, 0.004551f, 0.005722f, - 0.006405f, 0.007542f, 0.008484f, 0.009750f, 0.011017f, 0.012596f, 0.014046f, 0.015854f, - 0.017975f, 0.020264f, 0.022736f, 0.025497f, 0.028671f, 0.031952f, 0.036011f, 0.040741f, - 0.045746f, 0.051910f, 0.058868f, 0.066772f, 0.075867f, 0.086304f, 0.098328f, 0.112244f, - 0.128784f, 0.147217f, 0.168945f, 0.193848f, 0.221558f, 0.252441f, 0.287109f, 0.324951f, - 0.365234f, 0.407715f, 0.450684f, 0.494629f, 0.539062f, 0.580566f, 0.621094f, 0.659668f, - 0.695801f, 0.729004f, 0.758789f, 0.786133f, 0.810547f, 0.833008f, 0.852539f, 0.870117f, - 0.886719f, 0.900879f, 0.962891f, 0.966309f, 0.966309f, 0.966797f, 0.966797f, 0.966309f, - 0.000304f, 0.001050f, 0.001257f, 0.002295f, 0.002689f, 0.003885f, 0.004284f, 0.004726f, - 0.005547f, 0.006721f, 0.007595f, 0.008667f, 0.009811f, 0.011330f, 0.012642f, 0.014130f, - 0.016098f, 0.017975f, 0.019867f, 0.022247f, 0.024811f, 0.028030f, 0.031403f, 0.035461f, - 0.039642f, 0.044800f, 0.050720f, 0.057495f, 0.065002f, 0.073914f, 0.084290f, 0.095947f, - 0.109985f, 0.126343f, 0.144409f, 0.166138f, 0.190918f, 0.218750f, 0.250244f, 0.285400f, - 0.323730f, 0.364258f, 0.407471f, 0.452148f, 0.496338f, 0.540527f, 0.584473f, 0.625977f, - 0.665039f, 0.701172f, 0.735352f, 0.765137f, 0.792480f, 0.817383f, 0.840332f, 0.859863f, - 0.876953f, 0.893066f, 0.959961f, 0.963379f, 0.963867f, 0.964355f, 0.963867f, 0.963867f, - 0.000228f, 0.000682f, 0.001293f, 0.001717f, 0.002352f, 0.003160f, 0.003626f, 0.004360f, - 0.005348f, 0.005871f, 0.006870f, 0.007660f, 0.008957f, 0.010002f, 0.011299f, 0.012375f, - 0.014099f, 0.015900f, 0.017670f, 0.019363f, 0.022034f, 0.024216f, 0.027420f, 0.030930f, - 0.034454f, 0.038910f, 0.044006f, 0.049530f, 0.055878f, 0.063477f, 0.072083f, 0.082275f, - 0.094177f, 0.107666f, 0.123840f, 0.142090f, 0.163452f, 0.188477f, 0.216919f, 0.248047f, - 0.283447f, 0.322754f, 0.364990f, 0.408447f, 0.453613f, 0.500000f, 0.544922f, 0.589355f, - 0.631348f, 0.671387f, 0.708008f, 0.742188f, 0.773438f, 0.800781f, 0.824219f, 0.846680f, - 0.866699f, 0.884277f, 0.958008f, 0.960938f, 0.961426f, 0.962402f, 0.961914f, 0.960938f, - 0.000239f, 0.000731f, 0.001204f, 0.001637f, 0.002144f, 0.002913f, 0.003521f, 0.003828f, - 0.004517f, 0.005291f, 0.006203f, 0.006954f, 0.007740f, 0.008911f, 0.010239f, 0.011017f, - 0.012413f, 0.013863f, 0.015396f, 0.017181f, 0.019196f, 0.021439f, 0.024078f, 0.026993f, - 0.030182f, 0.033752f, 0.038055f, 0.042664f, 0.048004f, 0.054657f, 0.061920f, 0.070312f, - 0.080688f, 0.092041f, 0.105774f, 0.121094f, 0.140015f, 0.161255f, 0.186523f, 0.214966f, - 0.246948f, 0.283203f, 0.322998f, 0.365967f, 0.410400f, 0.457275f, 0.503906f, 0.550781f, - 0.596191f, 0.638672f, 0.678711f, 0.716797f, 0.750488f, 0.781738f, 0.809082f, 0.833496f, - 0.855469f, 0.874512f, 0.954590f, 0.958008f, 0.958984f, 0.958984f, 0.958984f, 0.958984f, - 0.000226f, 0.000663f, 0.001073f, 0.001420f, 0.002163f, 0.002567f, 0.003052f, 0.003433f, - 0.004181f, 0.004734f, 0.005516f, 0.006424f, 0.007050f, 0.008003f, 0.008659f, 0.009827f, - 0.011086f, 0.012398f, 0.013649f, 0.015266f, 0.016891f, 0.018921f, 0.021118f, 0.023560f, - 0.026505f, 0.029556f, 0.032715f, 0.036865f, 0.041077f, 0.046570f, 0.053314f, 0.060150f, - 0.068787f, 0.078552f, 0.090027f, 0.103638f, 0.119690f, 0.138184f, 0.159546f, 0.184692f, - 0.213745f, 0.245972f, 0.283203f, 0.324219f, 0.367920f, 0.414062f, 0.461914f, 0.509766f, - 0.557129f, 0.604492f, 0.647461f, 0.688965f, 0.727051f, 0.761230f, 0.791504f, 0.819824f, - 0.844238f, 0.865234f, 0.951660f, 0.955566f, 0.955566f, 0.956055f, 0.955078f, 0.956543f, - 0.000156f, 0.000587f, 0.001056f, 0.001499f, 0.001647f, 0.002380f, 0.002594f, 0.003469f, - 0.003777f, 0.004112f, 0.004925f, 0.005699f, 0.006180f, 0.007019f, 0.007957f, 0.008942f, - 0.009560f, 0.010727f, 0.011963f, 0.013123f, 0.014885f, 0.016556f, 0.018494f, 0.020355f, - 0.022766f, 0.025330f, 0.028320f, 0.031830f, 0.035736f, 0.040161f, 0.045532f, 0.052032f, - 0.059113f, 0.066833f, 0.076782f, 0.088501f, 0.101868f, 0.117310f, 0.136108f, 0.157959f, - 0.183105f, 0.212769f, 0.247070f, 0.284424f, 0.326660f, 0.371338f, 0.419189f, 0.468994f, - 0.518066f, 0.567383f, 0.613770f, 0.658691f, 0.700684f, 0.738770f, 0.771973f, 0.803223f, - 0.829590f, 0.854492f, 0.947266f, 0.952637f, 0.952637f, 0.952637f, 0.953125f, 0.952637f, - 0.000155f, 0.000358f, 0.000859f, 0.001402f, 0.001830f, 0.002092f, 0.002499f, 0.002672f, - 0.003410f, 0.003763f, 0.004375f, 0.005077f, 0.005535f, 0.006554f, 0.007004f, 0.007874f, - 0.008537f, 0.009529f, 0.010742f, 0.011749f, 0.013016f, 0.014427f, 0.015945f, 0.017929f, - 0.019775f, 0.022018f, 0.024460f, 0.027618f, 0.030640f, 0.034668f, 0.039154f, 0.044250f, - 0.050293f, 0.057068f, 0.065491f, 0.074951f, 0.086487f, 0.099670f, 0.115906f, 0.134277f, - 0.156860f, 0.182495f, 0.213135f, 0.248047f, 0.286621f, 0.329834f, 0.376709f, 0.426025f, - 0.476562f, 0.527832f, 0.577637f, 0.626465f, 0.671387f, 0.713379f, 0.752441f, 0.784668f, - 0.815430f, 0.841797f, 0.944336f, 0.948242f, 0.949219f, 0.949219f, 0.949219f, 0.949707f, - 0.000233f, 0.000639f, 0.000930f, 0.001277f, 0.001579f, 0.001916f, 0.002041f, 0.002625f, - 0.003035f, 0.003571f, 0.004124f, 0.004375f, 0.004978f, 0.005379f, 0.006348f, 0.006886f, - 0.007526f, 0.008430f, 0.009216f, 0.010262f, 0.011436f, 0.012779f, 0.014160f, 0.015549f, - 0.017120f, 0.019089f, 0.021164f, 0.023621f, 0.026352f, 0.029724f, 0.033447f, 0.037842f, - 0.042603f, 0.048737f, 0.055573f, 0.063721f, 0.073364f, 0.084778f, 0.098206f, 0.114197f, - 0.133423f, 0.155762f, 0.182739f, 0.213623f, 0.249512f, 0.289795f, 0.335205f, 0.383789f, - 0.434814f, 0.487305f, 0.540039f, 0.591797f, 0.640137f, 0.686035f, 0.727539f, 0.765137f, - 0.800293f, 0.830078f, 0.940430f, 0.944336f, 0.945312f, 0.946289f, 0.945801f, 0.945312f, - 0.000217f, 0.000519f, 0.000848f, 0.001180f, 0.001366f, 0.001589f, 0.001986f, 0.002354f, - 0.002987f, 0.003170f, 0.003576f, 0.003901f, 0.004440f, 0.004738f, 0.005543f, 0.006058f, - 0.006508f, 0.007511f, 0.008163f, 0.009132f, 0.010078f, 0.011246f, 0.012390f, 0.013412f, - 0.014938f, 0.016632f, 0.018433f, 0.020676f, 0.022995f, 0.025726f, 0.028702f, 0.032227f, - 0.036377f, 0.041992f, 0.047394f, 0.053986f, 0.062195f, 0.071716f, 0.082825f, 0.096802f, - 0.112732f, 0.132202f, 0.155273f, 0.182861f, 0.215210f, 0.252441f, 0.294678f, 0.341553f, - 0.392090f, 0.445557f, 0.499512f, 0.553711f, 0.606445f, 0.656250f, 0.703125f, 0.745605f, - 0.782715f, 0.816895f, 0.935547f, 0.939941f, 0.941406f, 0.941406f, 0.941406f, 0.940918f, - 0.000242f, 0.000678f, 0.000781f, 0.000928f, 0.001200f, 0.001592f, 0.001694f, 0.002096f, - 0.002703f, 0.002903f, 0.003170f, 0.003531f, 0.003918f, 0.004433f, 0.004955f, 0.005390f, - 0.005939f, 0.006454f, 0.007298f, 0.007782f, 0.008759f, 0.009567f, 0.010559f, 0.011650f, - 0.013046f, 0.014420f, 0.015793f, 0.017715f, 0.019699f, 0.021774f, 0.024460f, 0.027481f, - 0.031082f, 0.035065f, 0.039917f, 0.045715f, 0.052246f, 0.060486f, 0.070129f, 0.081482f, - 0.095093f, 0.111755f, 0.131714f, 0.155273f, 0.183838f, 0.217285f, 0.256348f, 0.300781f, - 0.350342f, 0.403076f, 0.458252f, 0.514160f, 0.570312f, 0.624512f, 0.675781f, 0.722168f, - 0.763672f, 0.800293f, 0.930664f, 0.935547f, 0.937500f, 0.937012f, 0.937500f, 0.937012f, - 0.000239f, 0.000297f, 0.000667f, 0.000785f, 0.001044f, 0.001269f, 0.001569f, 0.001950f, - 0.002224f, 0.002419f, 0.002810f, 0.003063f, 0.003626f, 0.003895f, 0.004261f, 0.004749f, - 0.005066f, 0.005726f, 0.006260f, 0.007019f, 0.007771f, 0.008369f, 0.008919f, 0.009941f, - 0.011101f, 0.012375f, 0.013519f, 0.015190f, 0.016891f, 0.018631f, 0.021011f, 0.023590f, - 0.026581f, 0.029892f, 0.033875f, 0.038757f, 0.044281f, 0.051147f, 0.058746f, 0.068481f, - 0.079834f, 0.094116f, 0.110779f, 0.131348f, 0.155884f, 0.185669f, 0.220825f, 0.261963f, - 0.308594f, 0.360352f, 0.416260f, 0.473877f, 0.532715f, 0.589844f, 0.645508f, 0.696289f, - 0.743652f, 0.784668f, 0.925781f, 0.930664f, 0.932129f, 0.932129f, 0.932129f, 0.932129f, - 0.000226f, 0.000351f, 0.000434f, 0.000624f, 0.000887f, 0.001040f, 0.001246f, 0.001665f, - 0.001856f, 0.002384f, 0.002420f, 0.002842f, 0.002874f, 0.003471f, 0.003735f, 0.004078f, - 0.004639f, 0.004910f, 0.005531f, 0.006065f, 0.006664f, 0.007370f, 0.007690f, 0.008690f, - 0.009544f, 0.010536f, 0.011795f, 0.012833f, 0.014183f, 0.015900f, 0.017899f, 0.019684f, - 0.022430f, 0.025253f, 0.028412f, 0.032410f, 0.037201f, 0.042633f, 0.049316f, 0.057159f, - 0.066772f, 0.078186f, 0.092590f, 0.110107f, 0.131348f, 0.156982f, 0.188232f, 0.225342f, - 0.269043f, 0.318604f, 0.373535f, 0.431641f, 0.492188f, 0.554199f, 0.613281f, 0.668945f, - 0.720703f, 0.766602f, 0.919922f, 0.925781f, 0.926758f, 0.926758f, 0.927246f, 0.926758f, - 0.000000f, 0.000340f, 0.000458f, 0.000715f, 0.000823f, 0.000895f, 0.001165f, 0.001518f, - 0.001636f, 0.001876f, 0.002190f, 0.002472f, 0.002640f, 0.002964f, 0.003340f, 0.003527f, - 0.004005f, 0.004227f, 0.004803f, 0.005260f, 0.005878f, 0.006042f, 0.006805f, 0.007500f, - 0.008469f, 0.009132f, 0.009949f, 0.011009f, 0.012077f, 0.013687f, 0.014938f, 0.016785f, - 0.018997f, 0.021194f, 0.023895f, 0.027283f, 0.030945f, 0.035583f, 0.040955f, 0.047760f, - 0.055573f, 0.065247f, 0.077209f, 0.091736f, 0.109619f, 0.131470f, 0.159058f, 0.192017f, - 0.231812f, 0.278076f, 0.331543f, 0.389404f, 0.450928f, 0.513672f, 0.577637f, 0.638672f, - 0.695801f, 0.746582f, 0.914062f, 0.919922f, 0.920898f, 0.921387f, 0.921387f, 0.921387f, - 0.000146f, 0.000319f, 0.000443f, 0.000458f, 0.000704f, 0.000894f, 0.001199f, 0.001324f, - 0.001549f, 0.001592f, 0.002081f, 0.002092f, 0.002237f, 0.002604f, 0.002815f, 0.003159f, - 0.003510f, 0.003937f, 0.004147f, 0.004425f, 0.004814f, 0.005318f, 0.005878f, 0.006413f, - 0.006924f, 0.007782f, 0.008408f, 0.009239f, 0.010414f, 0.011505f, 0.012642f, 0.014015f, - 0.015884f, 0.017563f, 0.019852f, 0.022598f, 0.025650f, 0.029663f, 0.033875f, 0.039307f, - 0.045898f, 0.053955f, 0.063782f, 0.075928f, 0.090820f, 0.109497f, 0.132690f, 0.161621f, - 0.196777f, 0.239624f, 0.290039f, 0.346436f, 0.408203f, 0.473633f, 0.540527f, 0.605957f, - 0.667969f, 0.725586f, 0.907715f, 0.914062f, 0.914062f, 0.915039f, 0.915039f, 0.915039f, - 0.000121f, 0.000251f, 0.000506f, 0.000532f, 0.000665f, 0.000830f, 0.001190f, 0.001164f, - 0.001290f, 0.001413f, 0.001755f, 0.001900f, 0.002157f, 0.002319f, 0.002422f, 0.002853f, - 0.003042f, 0.003254f, 0.003529f, 0.003725f, 0.004288f, 0.004585f, 0.005043f, 0.005539f, - 0.005970f, 0.006386f, 0.007126f, 0.007812f, 0.008652f, 0.009598f, 0.010651f, 0.011803f, - 0.013130f, 0.014702f, 0.016510f, 0.018814f, 0.021011f, 0.024368f, 0.028122f, 0.032379f, - 0.037506f, 0.044128f, 0.052277f, 0.062042f, 0.075073f, 0.090088f, 0.110107f, 0.134766f, - 0.165405f, 0.203613f, 0.249268f, 0.303955f, 0.365234f, 0.431396f, 0.501465f, 0.571777f, - 0.638672f, 0.702148f, 0.900879f, 0.906738f, 0.907227f, 0.908203f, 0.907227f, 0.908203f, - 0.000241f, 0.000122f, 0.000417f, 0.000505f, 0.000741f, 0.000782f, 0.000916f, 0.001145f, - 0.001189f, 0.001289f, 0.001331f, 0.001565f, 0.001779f, 0.002020f, 0.002171f, 0.002228f, - 0.002623f, 0.002752f, 0.002949f, 0.003157f, 0.003515f, 0.003847f, 0.004082f, 0.004429f, - 0.004990f, 0.005405f, 0.006008f, 0.006603f, 0.007103f, 0.007889f, 0.008789f, 0.009766f, - 0.010605f, 0.012177f, 0.013672f, 0.015305f, 0.017487f, 0.019913f, 0.022781f, 0.026245f, - 0.030670f, 0.035980f, 0.042389f, 0.050812f, 0.060883f, 0.073792f, 0.090088f, 0.111145f, - 0.138062f, 0.171143f, 0.212524f, 0.262695f, 0.322266f, 0.388184f, 0.460205f, 0.533203f, - 0.606445f, 0.676758f, 0.893066f, 0.898926f, 0.899414f, 0.899414f, 0.900879f, 0.900391f, - 0.000000f, 0.000114f, 0.000227f, 0.000407f, 0.000532f, 0.000732f, 0.000714f, 0.000922f, - 0.000993f, 0.001072f, 0.001190f, 0.001412f, 0.001569f, 0.001726f, 0.001959f, 0.002071f, - 0.002159f, 0.002350f, 0.002565f, 0.002729f, 0.003090f, 0.003248f, 0.003702f, 0.003761f, - 0.004192f, 0.004585f, 0.004925f, 0.005272f, 0.005966f, 0.006405f, 0.007275f, 0.007965f, - 0.008850f, 0.009872f, 0.011017f, 0.012383f, 0.014275f, 0.015900f, 0.018463f, 0.021194f, - 0.024673f, 0.028870f, 0.034271f, 0.040955f, 0.048981f, 0.059723f, 0.073059f, 0.090149f, - 0.112549f, 0.141357f, 0.178467f, 0.223755f, 0.280029f, 0.345215f, 0.417969f, 0.494385f, - 0.572266f, 0.648438f, 0.884277f, 0.890137f, 0.891602f, 0.891602f, 0.893066f, 0.892090f, - 0.000000f, 0.000219f, 0.000211f, 0.000333f, 0.000559f, 0.000609f, 0.000788f, 0.000805f, - 0.000869f, 0.000903f, 0.001101f, 0.001166f, 0.001302f, 0.001399f, 0.001456f, 0.001668f, - 0.001853f, 0.001999f, 0.002102f, 0.002256f, 0.002447f, 0.002728f, 0.002943f, 0.003178f, - 0.003515f, 0.003836f, 0.004074f, 0.004475f, 0.004745f, 0.005325f, 0.005970f, 0.006569f, - 0.007248f, 0.008102f, 0.008888f, 0.010132f, 0.011169f, 0.012947f, 0.014763f, 0.016891f, - 0.019760f, 0.023087f, 0.027176f, 0.032562f, 0.038940f, 0.047516f, 0.058167f, 0.072754f, - 0.090698f, 0.114929f, 0.146851f, 0.187744f, 0.239258f, 0.301514f, 0.373291f, 0.452637f, - 0.535645f, 0.617676f, 0.874512f, 0.880859f, 0.882324f, 0.883301f, 0.883301f, 0.882324f, - 0.000204f, 0.000207f, 0.000204f, 0.000322f, 0.000435f, 0.000480f, 0.000556f, 0.000615f, - 0.000747f, 0.000782f, 0.000844f, 0.001006f, 0.001159f, 0.001191f, 0.001231f, 0.001450f, - 0.001585f, 0.001633f, 0.001790f, 0.001919f, 0.002117f, 0.002298f, 0.002432f, 0.002651f, - 0.002939f, 0.003172f, 0.003399f, 0.003614f, 0.003944f, 0.004421f, 0.004704f, 0.005203f, - 0.005886f, 0.006454f, 0.007160f, 0.008049f, 0.009041f, 0.010201f, 0.011627f, 0.013237f, - 0.015404f, 0.018097f, 0.021469f, 0.025284f, 0.030884f, 0.036987f, 0.045990f, 0.056915f, - 0.072083f, 0.092163f, 0.119141f, 0.154419f, 0.200928f, 0.259277f, 0.328857f, 0.409424f, - 0.495605f, 0.584473f, 0.864258f, 0.871094f, 0.872070f, 0.873047f, 0.872559f, 0.873047f, - 0.000000f, 0.000044f, 0.000176f, 0.000290f, 0.000410f, 0.000390f, 0.000513f, 0.000546f, - 0.000647f, 0.000680f, 0.000827f, 0.000858f, 0.000958f, 0.001131f, 0.001102f, 0.001223f, - 0.001367f, 0.001401f, 0.001525f, 0.001610f, 0.001826f, 0.001821f, 0.002039f, 0.002253f, - 0.002459f, 0.002617f, 0.002708f, 0.003036f, 0.003279f, 0.003431f, 0.003805f, 0.004219f, - 0.004471f, 0.004929f, 0.005569f, 0.006310f, 0.007107f, 0.007988f, 0.009003f, 0.010384f, - 0.011856f, 0.014015f, 0.016418f, 0.019669f, 0.023666f, 0.028809f, 0.035583f, 0.044159f, - 0.056458f, 0.072571f, 0.094604f, 0.124329f, 0.164917f, 0.218018f, 0.284912f, 0.364746f, - 0.454102f, 0.549316f, 0.853027f, 0.859863f, 0.861328f, 0.861816f, 0.861816f, 0.861816f, - 0.000000f, 0.000069f, 0.000120f, 0.000345f, 0.000371f, 0.000398f, 0.000452f, 0.000396f, - 0.000498f, 0.000530f, 0.000596f, 0.000648f, 0.000781f, 0.000921f, 0.000995f, 0.001007f, - 0.001101f, 0.001146f, 0.001282f, 0.001278f, 0.001471f, 0.001554f, 0.001710f, 0.001811f, - 0.001995f, 0.001986f, 0.002314f, 0.002399f, 0.002499f, 0.002903f, 0.002975f, 0.003305f, - 0.003605f, 0.004086f, 0.004425f, 0.005081f, 0.005402f, 0.006035f, 0.006889f, 0.007755f, - 0.009041f, 0.010422f, 0.012672f, 0.014885f, 0.017746f, 0.021530f, 0.026733f, 0.033691f, - 0.043060f, 0.055847f, 0.073181f, 0.097473f, 0.132324f, 0.179077f, 0.241821f, 0.320068f, - 0.410400f, 0.510742f, 0.839844f, 0.847656f, 0.849121f, 0.849609f, 0.849121f, 0.849609f, - 0.000000f, 0.000000f, 0.000121f, 0.000243f, 0.000321f, 0.000354f, 0.000341f, 0.000431f, - 0.000423f, 0.000444f, 0.000473f, 0.000508f, 0.000595f, 0.000706f, 0.000737f, 0.000861f, - 0.000869f, 0.000926f, 0.001055f, 0.001104f, 0.001199f, 0.001306f, 0.001360f, 0.001433f, - 0.001530f, 0.001555f, 0.001673f, 0.001942f, 0.002138f, 0.002247f, 0.002562f, 0.002609f, - 0.002911f, 0.003204f, 0.003466f, 0.003757f, 0.004192f, 0.004845f, 0.005482f, 0.006008f, - 0.006874f, 0.007904f, 0.009171f, 0.011124f, 0.013260f, 0.015839f, 0.019821f, 0.024872f, - 0.031982f, 0.041534f, 0.055054f, 0.075012f, 0.103516f, 0.143677f, 0.199951f, 0.273438f, - 0.364502f, 0.469482f, 0.825684f, 0.834473f, 0.834961f, 0.835938f, 0.835938f, 0.835938f, - 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000199f, 0.000272f, 0.000265f, 0.000363f, - 0.000379f, 0.000388f, 0.000489f, 0.000500f, 0.000488f, 0.000569f, 0.000604f, 0.000700f, - 0.000683f, 0.000720f, 0.000784f, 0.000844f, 0.001009f, 0.001047f, 0.001108f, 0.001258f, - 0.001276f, 0.001388f, 0.001410f, 0.001565f, 0.001592f, 0.001814f, 0.001800f, 0.002167f, - 0.002192f, 0.002556f, 0.002665f, 0.002905f, 0.003195f, 0.003574f, 0.004028f, 0.004513f, - 0.005127f, 0.005859f, 0.006847f, 0.008018f, 0.009491f, 0.011452f, 0.014099f, 0.017792f, - 0.022995f, 0.030258f, 0.040588f, 0.055878f, 0.078308f, 0.111450f, 0.160278f, 0.229248f, - 0.318359f, 0.425781f, 0.810547f, 0.818359f, 0.820312f, 0.821777f, 0.821777f, 0.820801f, - 0.000000f, 0.000121f, 0.000120f, 0.000172f, 0.000195f, 0.000171f, 0.000208f, 0.000272f, - 0.000316f, 0.000333f, 0.000348f, 0.000355f, 0.000412f, 0.000410f, 0.000515f, 0.000485f, - 0.000545f, 0.000656f, 0.000777f, 0.000659f, 0.000705f, 0.000762f, 0.000874f, 0.000927f, - 0.000959f, 0.000978f, 0.001045f, 0.001228f, 0.001294f, 0.001398f, 0.001443f, 0.001637f, - 0.001752f, 0.001925f, 0.002005f, 0.002230f, 0.002407f, 0.002670f, 0.002895f, 0.003267f, - 0.003933f, 0.004280f, 0.005051f, 0.005772f, 0.006718f, 0.008141f, 0.010117f, 0.012383f, - 0.015930f, 0.020920f, 0.028671f, 0.039673f, 0.056702f, 0.083313f, 0.124695f, 0.185791f, - 0.270996f, 0.379639f, 0.793457f, 0.801270f, 0.803711f, 0.803711f, 0.804688f, 0.804688f, - 0.000000f, 0.000121f, 0.000119f, 0.000144f, 0.000149f, 0.000166f, 0.000173f, 0.000167f, - 0.000214f, 0.000245f, 0.000334f, 0.000287f, 0.000303f, 0.000391f, 0.000401f, 0.000440f, - 0.000469f, 0.000493f, 0.000534f, 0.000513f, 0.000690f, 0.000682f, 0.000645f, 0.000712f, - 0.000715f, 0.000747f, 0.000842f, 0.000849f, 0.000967f, 0.000995f, 0.001178f, 0.001167f, - 0.001273f, 0.001395f, 0.001586f, 0.001748f, 0.001796f, 0.001986f, 0.002132f, 0.002476f, - 0.002893f, 0.003294f, 0.003653f, 0.004086f, 0.004890f, 0.005821f, 0.006927f, 0.008553f, - 0.010857f, 0.014137f, 0.019211f, 0.027084f, 0.039642f, 0.059448f, 0.092468f, 0.144775f, - 0.224487f, 0.332764f, 0.775391f, 0.784668f, 0.786133f, 0.786133f, 0.787109f, 0.786621f, - 0.000000f, 0.000000f, 0.000118f, 0.000116f, 0.000115f, 0.000113f, 0.000140f, 0.000140f, - 0.000149f, 0.000220f, 0.000171f, 0.000255f, 0.000274f, 0.000292f, 0.000318f, 0.000295f, - 0.000346f, 0.000352f, 0.000380f, 0.000406f, 0.000401f, 0.000533f, 0.000490f, 0.000551f, - 0.000558f, 0.000648f, 0.000628f, 0.000723f, 0.000788f, 0.000749f, 0.000836f, 0.000941f, - 0.000997f, 0.001065f, 0.001112f, 0.001207f, 0.001328f, 0.001535f, 0.001621f, 0.001840f, - 0.002022f, 0.002163f, 0.002522f, 0.002825f, 0.003391f, 0.003830f, 0.004616f, 0.005665f, - 0.007172f, 0.009247f, 0.012482f, 0.017532f, 0.025970f, 0.040161f, 0.064941f, 0.107422f, - 0.178833f, 0.283447f, 0.754883f, 0.764648f, 0.766113f, 0.767090f, 0.767578f, 0.767090f, - 0.000000f, 0.000119f, 0.000116f, 0.000114f, 0.000112f, 0.000110f, 0.000109f, 0.000117f, - 0.000114f, 0.000117f, 0.000125f, 0.000193f, 0.000141f, 0.000196f, 0.000221f, 0.000235f, - 0.000259f, 0.000278f, 0.000308f, 0.000316f, 0.000323f, 0.000315f, 0.000329f, 0.000351f, - 0.000388f, 0.000422f, 0.000465f, 0.000512f, 0.000571f, 0.000568f, 0.000588f, 0.000633f, - 0.000747f, 0.000751f, 0.000829f, 0.000958f, 0.000914f, 0.001104f, 0.001145f, 0.001255f, - 0.001337f, 0.001499f, 0.001701f, 0.001966f, 0.002275f, 0.002609f, 0.003119f, 0.003773f, - 0.004658f, 0.005920f, 0.007935f, 0.010948f, 0.015900f, 0.025284f, 0.042511f, 0.075012f, - 0.135010f, 0.234619f, 0.733398f, 0.743164f, 0.744629f, 0.745117f, 0.745605f, 0.745605f, - 0.000000f, 0.000116f, 0.000113f, 0.000111f, 0.000108f, 0.000106f, 0.000104f, 0.000103f, - 0.000098f, 0.000092f, 0.000099f, 0.000085f, 0.000098f, 0.000105f, 0.000163f, 0.000162f, - 0.000128f, 0.000193f, 0.000203f, 0.000214f, 0.000284f, 0.000239f, 0.000303f, 0.000268f, - 0.000327f, 0.000326f, 0.000329f, 0.000330f, 0.000407f, 0.000486f, 0.000406f, 0.000454f, - 0.000465f, 0.000495f, 0.000535f, 0.000592f, 0.000648f, 0.000727f, 0.000753f, 0.000807f, - 0.000956f, 0.000992f, 0.001108f, 0.001294f, 0.001418f, 0.001703f, 0.001978f, 0.002390f, - 0.002930f, 0.003643f, 0.004753f, 0.006519f, 0.009499f, 0.014824f, 0.025497f, 0.048065f, - 0.095154f, 0.185425f, 0.709961f, 0.719727f, 0.721191f, 0.721191f, 0.721680f, 0.721680f, - 0.000000f, 0.000113f, 0.000107f, 0.000106f, 0.000102f, 0.000100f, 0.000097f, 0.000096f, - 0.000095f, 0.000092f, 0.000087f, 0.000083f, 0.000078f, 0.000098f, 0.000077f, 0.000091f, - 0.000114f, 0.000128f, 0.000114f, 0.000147f, 0.000154f, 0.000162f, 0.000186f, 0.000174f, - 0.000220f, 0.000233f, 0.000235f, 0.000245f, 0.000250f, 0.000253f, 0.000321f, 0.000296f, - 0.000311f, 0.000354f, 0.000417f, 0.000419f, 0.000438f, 0.000443f, 0.000495f, 0.000513f, - 0.000585f, 0.000634f, 0.000705f, 0.000778f, 0.000912f, 0.001002f, 0.001163f, 0.001379f, - 0.001745f, 0.002092f, 0.002697f, 0.003721f, 0.005230f, 0.008194f, 0.013870f, 0.027359f, - 0.061066f, 0.138062f, 0.685547f, 0.694336f, 0.696777f, 0.696289f, 0.697754f, 0.697754f, - 0.000000f, 0.000106f, 0.000102f, 0.000097f, 0.000093f, 0.000091f, 0.000089f, 0.000087f, - 0.000085f, 0.000084f, 0.000082f, 0.000080f, 0.000076f, 0.000072f, 0.000069f, 0.000074f, - 0.000076f, 0.000059f, 0.000075f, 0.000062f, 0.000085f, 0.000091f, 0.000103f, 0.000111f, - 0.000121f, 0.000135f, 0.000128f, 0.000159f, 0.000171f, 0.000160f, 0.000178f, 0.000193f, - 0.000196f, 0.000202f, 0.000220f, 0.000230f, 0.000273f, 0.000289f, 0.000312f, 0.000330f, - 0.000335f, 0.000397f, 0.000408f, 0.000463f, 0.000517f, 0.000577f, 0.000691f, 0.000771f, - 0.000919f, 0.001150f, 0.001436f, 0.001955f, 0.002737f, 0.004185f, 0.007103f, 0.013863f, - 0.033661f, 0.093628f, 0.657227f, 0.667480f, 0.668945f, 0.669434f, 0.670898f, 0.669922f, - 0.000108f, 0.000093f, 0.000087f, 0.000082f, 0.000079f, 0.000078f, 0.000075f, 0.000073f, - 0.000071f, 0.000070f, 0.000069f, 0.000069f, 0.000067f, 0.000066f, 0.000064f, 0.000061f, - 0.000059f, 0.000056f, 0.000053f, 0.000051f, 0.000053f, 0.000049f, 0.000044f, 0.000047f, - 0.000055f, 0.000058f, 0.000071f, 0.000077f, 0.000093f, 0.000094f, 0.000103f, 0.000102f, - 0.000110f, 0.000126f, 0.000130f, 0.000138f, 0.000143f, 0.000166f, 0.000166f, 0.000178f, - 0.000194f, 0.000217f, 0.000228f, 0.000231f, 0.000265f, 0.000330f, 0.000341f, 0.000411f, - 0.000459f, 0.000549f, 0.000705f, 0.000867f, 0.001228f, 0.001863f, 0.003143f, 0.006283f, - 0.015594f, 0.054993f, 0.628418f, 0.638184f, 0.640137f, 0.640137f, 0.641602f, 0.641602f, - 0.000071f, 0.000058f, 0.000059f, 0.000058f, 0.000054f, 0.000054f, 0.000051f, 0.000053f, - 0.000051f, 0.000052f, 0.000050f, 0.000050f, 0.000051f, 0.000050f, 0.000049f, 0.000049f, - 0.000049f, 0.000049f, 0.000047f, 0.000045f, 0.000043f, 0.000041f, 0.000039f, 0.000038f, - 0.000036f, 0.000034f, 0.000035f, 0.000037f, 0.000033f, 0.000034f, 0.000038f, 0.000047f, - 0.000054f, 0.000061f, 0.000064f, 0.000068f, 0.000069f, 0.000076f, 0.000083f, 0.000092f, - 0.000098f, 0.000103f, 0.000112f, 0.000129f, 0.000113f, 0.000139f, 0.000152f, 0.000185f, - 0.000204f, 0.000238f, 0.000282f, 0.000365f, 0.000503f, 0.000685f, 0.001178f, 0.002274f, - 0.006100f, 0.025162f, 0.597656f, 0.607910f, 0.610840f, 0.611816f, 0.610352f, 0.611328f, - 0.000000f, 0.000000f, 0.000004f, 0.000012f, 0.000014f, 0.000020f, 0.000022f, 0.000023f, - 0.000024f, 0.000022f, 0.000025f, 0.000027f, 0.000027f, 0.000026f, 0.000028f, 0.000029f, - 0.000029f, 0.000029f, 0.000030f, 0.000030f, 0.000030f, 0.000030f, 0.000030f, 0.000030f, - 0.000029f, 0.000028f, 0.000027f, 0.000026f, 0.000024f, 0.000023f, 0.000022f, 0.000021f, - 0.000020f, 0.000019f, 0.000018f, 0.000019f, 0.000023f, 0.000024f, 0.000027f, 0.000032f, - 0.000038f, 0.000040f, 0.000041f, 0.000045f, 0.000054f, 0.000052f, 0.000055f, 0.000060f, - 0.000068f, 0.000089f, 0.000089f, 0.000115f, 0.000146f, 0.000198f, 0.000318f, 0.000586f, - 0.001614f, 0.008278f, 0.565918f, 0.576660f, 0.578125f, 0.579102f, 0.579590f, 0.580078f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, - 0.000003f, 0.000003f, 0.000005f, 0.000005f, 0.000006f, 0.000007f, 0.000009f, 0.000009f, - 0.000010f, 0.000011f, 0.000012f, 0.000012f, 0.000013f, 0.000014f, 0.000014f, 0.000015f, - 0.000014f, 0.000014f, 0.000013f, 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000010f, - 0.000009f, 0.000009f, 0.000008f, 0.000010f, 0.000013f, 0.000013f, 0.000013f, 0.000017f, - 0.000017f, 0.000022f, 0.000021f, 0.000023f, 0.000031f, 0.000032f, 0.000049f, 0.000079f, - 0.000204f, 0.001328f, 0.533203f, 0.543945f, 0.545410f, 0.546387f, 0.546875f, 0.546875f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000001f, 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000003f, - 0.000003f, 0.000003f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000003f, - 0.000004f, 0.000016f, 0.499756f, 0.510254f, 0.513184f, 0.513672f, 0.514160f, 0.514160f, - }, - { - 0.076172f, 0.209839f, 0.320312f, 0.408691f, 0.481689f, 0.541016f, 0.591309f, 0.633789f, - 0.668945f, 0.699707f, 0.727051f, 0.749512f, 0.770020f, 0.788086f, 0.803711f, 0.817871f, - 0.832520f, 0.843750f, 0.854492f, 0.864258f, 0.873535f, 0.881836f, 0.889160f, 0.895996f, - 0.903320f, 0.909180f, 0.914551f, 0.920410f, 0.925781f, 0.929199f, 0.933594f, 0.938965f, - 0.942383f, 0.946289f, 0.949219f, 0.953125f, 0.955566f, 0.959473f, 0.961914f, 0.964355f, - 0.967285f, 0.970215f, 0.971680f, 0.974609f, 0.976562f, 0.978516f, 0.980469f, 0.982422f, - 0.984375f, 0.986328f, 0.987793f, 0.989746f, 0.990723f, 0.992676f, 0.993652f, 0.995117f, - 0.996582f, 0.998047f, 0.999023f, 0.997559f, 0.996582f, 0.995605f, 0.994629f, 0.993652f, - 0.043396f, 0.133301f, 0.221313f, 0.303223f, 0.377441f, 0.442871f, 0.500000f, 0.550781f, - 0.595215f, 0.632812f, 0.666992f, 0.696777f, 0.723145f, 0.745605f, 0.765137f, 0.783691f, - 0.799805f, 0.815430f, 0.828613f, 0.839844f, 0.851562f, 0.861328f, 0.871582f, 0.879395f, - 0.887207f, 0.894531f, 0.901855f, 0.907227f, 0.914062f, 0.919434f, 0.924316f, 0.928711f, - 0.933594f, 0.937988f, 0.942383f, 0.945801f, 0.949219f, 0.953125f, 0.956055f, 0.959473f, - 0.962402f, 0.964355f, 0.967773f, 0.970215f, 0.972656f, 0.975098f, 0.977051f, 0.979492f, - 0.980957f, 0.983398f, 0.985352f, 0.986816f, 0.988281f, 0.990234f, 0.991699f, 0.993652f, - 0.995117f, 0.996094f, 0.998047f, 0.997070f, 0.996094f, 0.995117f, 0.994141f, 0.993164f, - 0.027832f, 0.088440f, 0.153198f, 0.221313f, 0.288086f, 0.352051f, 0.411621f, 0.466797f, - 0.515625f, 0.561523f, 0.601074f, 0.637207f, 0.667969f, 0.695312f, 0.721680f, 0.743652f, - 0.763184f, 0.781738f, 0.797852f, 0.812500f, 0.826172f, 0.838867f, 0.850098f, 0.859863f, - 0.869141f, 0.877930f, 0.886230f, 0.893555f, 0.900879f, 0.907227f, 0.912598f, 0.918457f, - 0.922852f, 0.928711f, 0.934082f, 0.938477f, 0.942383f, 0.946289f, 0.950195f, 0.953125f, - 0.956543f, 0.959961f, 0.962402f, 0.965820f, 0.968262f, 0.970703f, 0.973145f, 0.975586f, - 0.978027f, 0.979980f, 0.982422f, 0.984375f, 0.985840f, 0.987793f, 0.989746f, 0.991211f, - 0.993164f, 0.994141f, 0.997559f, 0.996582f, 0.995605f, 0.994629f, 0.993652f, 0.993164f, - 0.018921f, 0.061493f, 0.109497f, 0.161987f, 0.217041f, 0.273438f, 0.330811f, 0.384521f, - 0.437500f, 0.486084f, 0.530273f, 0.570312f, 0.607910f, 0.640137f, 0.670410f, 0.697266f, - 0.722656f, 0.743652f, 0.763672f, 0.781250f, 0.797363f, 0.812012f, 0.825684f, 0.837891f, - 0.848633f, 0.859863f, 0.869141f, 0.878418f, 0.886719f, 0.893066f, 0.900879f, 0.906738f, - 0.913574f, 0.919434f, 0.924316f, 0.930176f, 0.934082f, 0.939453f, 0.942871f, 0.946777f, - 0.950684f, 0.954590f, 0.958008f, 0.960449f, 0.963379f, 0.966797f, 0.969238f, 0.971680f, - 0.974121f, 0.977051f, 0.978516f, 0.980957f, 0.983398f, 0.985352f, 0.987305f, 0.989258f, - 0.991211f, 0.992676f, 0.996094f, 0.995605f, 0.994629f, 0.993652f, 0.993164f, 0.992188f, - 0.013596f, 0.044495f, 0.080017f, 0.119873f, 0.164307f, 0.211670f, 0.261475f, 0.311523f, - 0.362793f, 0.410645f, 0.458008f, 0.501953f, 0.542969f, 0.580078f, 0.614746f, 0.645996f, - 0.674805f, 0.701172f, 0.723633f, 0.745117f, 0.765625f, 0.782227f, 0.798828f, 0.812988f, - 0.826172f, 0.838867f, 0.849609f, 0.861328f, 0.870605f, 0.878906f, 0.887695f, 0.895020f, - 0.901855f, 0.907715f, 0.914551f, 0.920898f, 0.925781f, 0.930664f, 0.934570f, 0.940918f, - 0.943848f, 0.947754f, 0.951660f, 0.955566f, 0.958984f, 0.961914f, 0.964844f, 0.967773f, - 0.970703f, 0.973145f, 0.975586f, 0.978027f, 0.979980f, 0.982422f, 0.984863f, 0.986328f, - 0.988770f, 0.990234f, 0.995117f, 0.995117f, 0.994141f, 0.993652f, 0.992676f, 0.991699f, - 0.010414f, 0.033203f, 0.060364f, 0.090942f, 0.125610f, 0.163818f, 0.206421f, 0.250488f, - 0.295898f, 0.341797f, 0.388428f, 0.433350f, 0.475830f, 0.517090f, 0.555176f, 0.589844f, - 0.622559f, 0.652344f, 0.680176f, 0.704590f, 0.729004f, 0.748535f, 0.767578f, 0.784668f, - 0.800293f, 0.814941f, 0.828125f, 0.839844f, 0.852051f, 0.861816f, 0.871582f, 0.879883f, - 0.888672f, 0.895996f, 0.903320f, 0.909180f, 0.916016f, 0.921387f, 0.927246f, 0.931641f, - 0.937012f, 0.940918f, 0.946289f, 0.950195f, 0.953125f, 0.957520f, 0.960449f, 0.963867f, - 0.966309f, 0.969238f, 0.972168f, 0.975098f, 0.976562f, 0.979492f, 0.981934f, 0.983887f, - 0.985840f, 0.988281f, 0.994629f, 0.994141f, 0.993652f, 0.992676f, 0.991699f, 0.990723f, - 0.007889f, 0.025772f, 0.046539f, 0.070312f, 0.097168f, 0.128540f, 0.162354f, 0.200195f, - 0.239868f, 0.281738f, 0.325195f, 0.368896f, 0.411621f, 0.453125f, 0.493652f, 0.531738f, - 0.566406f, 0.601074f, 0.631836f, 0.659668f, 0.687988f, 0.709961f, 0.732422f, 0.753418f, - 0.770996f, 0.788086f, 0.804199f, 0.818359f, 0.831543f, 0.843750f, 0.854492f, 0.864746f, - 0.873535f, 0.882812f, 0.890137f, 0.898438f, 0.905273f, 0.912598f, 0.917969f, 0.923828f, - 0.929199f, 0.934570f, 0.938477f, 0.942871f, 0.948242f, 0.951660f, 0.955078f, 0.958496f, - 0.961914f, 0.965332f, 0.968262f, 0.971680f, 0.973633f, 0.976562f, 0.979492f, 0.981445f, - 0.983398f, 0.985352f, 0.993164f, 0.993164f, 0.992676f, 0.991699f, 0.991211f, 0.990234f, - 0.006332f, 0.020325f, 0.036438f, 0.055573f, 0.077026f, 0.101562f, 0.129028f, 0.160278f, - 0.194458f, 0.230347f, 0.268555f, 0.309326f, 0.350830f, 0.391846f, 0.432373f, 0.472412f, - 0.509277f, 0.545410f, 0.579102f, 0.611816f, 0.640625f, 0.668945f, 0.693848f, 0.716797f, - 0.739258f, 0.758789f, 0.775879f, 0.793945f, 0.807617f, 0.821777f, 0.834961f, 0.846680f, - 0.857422f, 0.867676f, 0.877441f, 0.885742f, 0.893555f, 0.900391f, 0.908203f, 0.915039f, - 0.920898f, 0.926270f, 0.931152f, 0.937012f, 0.940918f, 0.946289f, 0.949219f, 0.954102f, - 0.958008f, 0.960938f, 0.964355f, 0.967773f, 0.970703f, 0.973145f, 0.975586f, 0.978516f, - 0.981445f, 0.983398f, 0.992188f, 0.992188f, 0.991699f, 0.990723f, 0.990723f, 0.989746f, - 0.005226f, 0.016647f, 0.029556f, 0.044434f, 0.061523f, 0.081543f, 0.103760f, 0.129150f, - 0.157837f, 0.188477f, 0.221924f, 0.257812f, 0.295654f, 0.334473f, 0.374023f, 0.412842f, - 0.451904f, 0.489990f, 0.525391f, 0.560059f, 0.593262f, 0.623047f, 0.651855f, 0.678223f, - 0.702148f, 0.725098f, 0.745605f, 0.764160f, 0.781738f, 0.799316f, 0.812500f, 0.827148f, - 0.838867f, 0.851074f, 0.861328f, 0.871582f, 0.880371f, 0.889648f, 0.896973f, 0.904297f, - 0.911621f, 0.917480f, 0.923340f, 0.929688f, 0.934570f, 0.939941f, 0.943848f, 0.948242f, - 0.951660f, 0.957031f, 0.959473f, 0.963379f, 0.966797f, 0.969727f, 0.972656f, 0.976074f, - 0.979004f, 0.980957f, 0.991699f, 0.991211f, 0.990723f, 0.990234f, 0.989746f, 0.988770f, - 0.004108f, 0.013542f, 0.023819f, 0.036194f, 0.050262f, 0.066223f, 0.084717f, 0.104797f, - 0.128174f, 0.153809f, 0.182861f, 0.213989f, 0.247437f, 0.282471f, 0.319580f, 0.357422f, - 0.395508f, 0.433350f, 0.470947f, 0.506348f, 0.542480f, 0.575684f, 0.605957f, 0.635254f, - 0.662109f, 0.687988f, 0.711426f, 0.732910f, 0.753418f, 0.771973f, 0.789062f, 0.804688f, - 0.819336f, 0.831543f, 0.843750f, 0.855469f, 0.866211f, 0.875488f, 0.884766f, 0.893066f, - 0.901367f, 0.907715f, 0.914062f, 0.921387f, 0.927246f, 0.932129f, 0.937012f, 0.942383f, - 0.946777f, 0.951660f, 0.956055f, 0.959473f, 0.962891f, 0.966309f, 0.969238f, 0.972168f, - 0.975098f, 0.978027f, 0.989746f, 0.990234f, 0.990234f, 0.989258f, 0.989258f, 0.988281f, - 0.003597f, 0.011330f, 0.020065f, 0.029938f, 0.041412f, 0.054504f, 0.068970f, 0.086182f, - 0.105469f, 0.126709f, 0.151123f, 0.177612f, 0.206909f, 0.237915f, 0.271484f, 0.305664f, - 0.342529f, 0.378906f, 0.416748f, 0.453125f, 0.489502f, 0.524414f, 0.558105f, 0.589844f, - 0.619629f, 0.646973f, 0.673828f, 0.698242f, 0.721191f, 0.742676f, 0.761230f, 0.778809f, - 0.796387f, 0.810547f, 0.824707f, 0.837891f, 0.850098f, 0.861328f, 0.871094f, 0.881348f, - 0.889648f, 0.896973f, 0.904785f, 0.912109f, 0.919434f, 0.924316f, 0.931152f, 0.936523f, - 0.941895f, 0.946289f, 0.951172f, 0.955078f, 0.959473f, 0.962402f, 0.965820f, 0.969238f, - 0.972656f, 0.975586f, 0.988770f, 0.989258f, 0.989258f, 0.988770f, 0.987793f, 0.987305f, - 0.002836f, 0.009857f, 0.016693f, 0.025208f, 0.034668f, 0.045288f, 0.057617f, 0.071106f, - 0.087463f, 0.104858f, 0.125000f, 0.147461f, 0.172119f, 0.199829f, 0.229248f, 0.260742f, - 0.294434f, 0.329102f, 0.365479f, 0.400879f, 0.437012f, 0.472656f, 0.508301f, 0.541992f, - 0.574219f, 0.604980f, 0.634766f, 0.660645f, 0.686523f, 0.709473f, 0.731445f, 0.751953f, - 0.770996f, 0.789062f, 0.804199f, 0.817871f, 0.832520f, 0.844727f, 0.856445f, 0.867188f, - 0.876953f, 0.886719f, 0.895020f, 0.902832f, 0.909668f, 0.916504f, 0.923340f, 0.929688f, - 0.935547f, 0.939941f, 0.944824f, 0.949707f, 0.954102f, 0.958496f, 0.961914f, 0.965820f, - 0.969238f, 0.972656f, 0.987793f, 0.988281f, 0.988281f, 0.987793f, 0.986816f, 0.986328f, - 0.002541f, 0.008118f, 0.014244f, 0.021194f, 0.029480f, 0.037811f, 0.048584f, 0.060028f, - 0.073242f, 0.088196f, 0.104370f, 0.123047f, 0.144531f, 0.167114f, 0.193237f, 0.220947f, - 0.250977f, 0.282227f, 0.316162f, 0.351074f, 0.386719f, 0.422119f, 0.457520f, 0.492432f, - 0.526367f, 0.559082f, 0.590332f, 0.621094f, 0.648438f, 0.674316f, 0.698730f, 0.721191f, - 0.742188f, 0.762207f, 0.780762f, 0.797363f, 0.812500f, 0.826172f, 0.840332f, 0.852051f, - 0.863770f, 0.873535f, 0.883301f, 0.892090f, 0.900391f, 0.908203f, 0.915039f, 0.922363f, - 0.928711f, 0.933594f, 0.939453f, 0.944824f, 0.950195f, 0.953125f, 0.958008f, 0.962402f, - 0.965332f, 0.969238f, 0.986816f, 0.987305f, 0.986816f, 0.986328f, 0.985840f, 0.984863f, - 0.002115f, 0.007030f, 0.012138f, 0.017944f, 0.024521f, 0.032318f, 0.040955f, 0.050476f, - 0.061676f, 0.073914f, 0.087769f, 0.103271f, 0.121033f, 0.140747f, 0.162598f, 0.187256f, - 0.213379f, 0.242065f, 0.272705f, 0.305176f, 0.338623f, 0.373047f, 0.408691f, 0.443848f, - 0.478760f, 0.512695f, 0.545898f, 0.577637f, 0.607910f, 0.636719f, 0.663086f, 0.688965f, - 0.712402f, 0.734863f, 0.754395f, 0.774414f, 0.791016f, 0.806641f, 0.822266f, 0.835449f, - 0.848145f, 0.859863f, 0.870605f, 0.880371f, 0.890137f, 0.898438f, 0.906250f, 0.914551f, - 0.921387f, 0.926758f, 0.933594f, 0.938965f, 0.944336f, 0.949219f, 0.954102f, 0.958984f, - 0.961914f, 0.965820f, 0.985840f, 0.986328f, 0.985840f, 0.985352f, 0.985352f, 0.984375f, - 0.001999f, 0.006226f, 0.010384f, 0.015594f, 0.021027f, 0.027435f, 0.034637f, 0.042969f, - 0.052124f, 0.062469f, 0.074097f, 0.087646f, 0.102173f, 0.119141f, 0.137695f, 0.158203f, - 0.181396f, 0.206543f, 0.233643f, 0.263184f, 0.295166f, 0.327148f, 0.360596f, 0.395264f, - 0.430420f, 0.464600f, 0.499023f, 0.532227f, 0.564941f, 0.595703f, 0.625000f, 0.651855f, - 0.679199f, 0.703613f, 0.726074f, 0.747559f, 0.766602f, 0.784668f, 0.801758f, 0.816895f, - 0.831055f, 0.843750f, 0.856934f, 0.867188f, 0.878418f, 0.887207f, 0.896484f, 0.904785f, - 0.913086f, 0.919922f, 0.926270f, 0.932617f, 0.938477f, 0.944336f, 0.949707f, 0.953613f, - 0.958496f, 0.962891f, 0.983887f, 0.984863f, 0.984863f, 0.984375f, 0.983887f, 0.983398f, - 0.001891f, 0.004959f, 0.009300f, 0.013786f, 0.018433f, 0.023560f, 0.029892f, 0.037018f, - 0.044586f, 0.053284f, 0.062805f, 0.074341f, 0.086975f, 0.100586f, 0.116760f, 0.133789f, - 0.154175f, 0.176025f, 0.200317f, 0.226318f, 0.254395f, 0.284424f, 0.316650f, 0.349365f, - 0.383301f, 0.418213f, 0.452393f, 0.487061f, 0.520508f, 0.553223f, 0.584473f, 0.613770f, - 0.643066f, 0.668945f, 0.695312f, 0.718262f, 0.740234f, 0.761230f, 0.778809f, 0.797363f, - 0.812988f, 0.827148f, 0.840332f, 0.854004f, 0.865723f, 0.875977f, 0.886230f, 0.895020f, - 0.904297f, 0.912598f, 0.919922f, 0.926270f, 0.932617f, 0.938965f, 0.943359f, 0.949219f, - 0.955078f, 0.958984f, 0.982422f, 0.983887f, 0.983398f, 0.982910f, 0.982910f, 0.981934f, - 0.001368f, 0.004715f, 0.008041f, 0.011948f, 0.016235f, 0.020889f, 0.025848f, 0.031921f, - 0.038391f, 0.045563f, 0.054108f, 0.063477f, 0.074036f, 0.085815f, 0.099304f, 0.114563f, - 0.131104f, 0.150146f, 0.170654f, 0.193970f, 0.219360f, 0.246338f, 0.275146f, 0.306396f, - 0.338867f, 0.372559f, 0.406494f, 0.440918f, 0.474609f, 0.508789f, 0.541992f, 0.574219f, - 0.604492f, 0.634277f, 0.661133f, 0.687500f, 0.710938f, 0.733887f, 0.754883f, 0.774414f, - 0.792480f, 0.809570f, 0.824707f, 0.838379f, 0.852051f, 0.862793f, 0.874023f, 0.885254f, - 0.895020f, 0.903320f, 0.912109f, 0.919434f, 0.926758f, 0.932617f, 0.939941f, 0.945312f, - 0.951172f, 0.955078f, 0.980957f, 0.982910f, 0.982422f, 0.982422f, 0.981445f, 0.981445f, - 0.001393f, 0.004227f, 0.007011f, 0.010323f, 0.014107f, 0.018234f, 0.022766f, 0.027649f, - 0.032898f, 0.039581f, 0.046539f, 0.054230f, 0.063293f, 0.073608f, 0.085144f, 0.097961f, - 0.112305f, 0.127930f, 0.146362f, 0.166260f, 0.188599f, 0.212524f, 0.238647f, 0.266846f, - 0.297363f, 0.328369f, 0.361816f, 0.395752f, 0.429932f, 0.464844f, 0.498535f, 0.531250f, - 0.564453f, 0.596191f, 0.625488f, 0.653320f, 0.680176f, 0.704590f, 0.728027f, 0.750977f, - 0.770020f, 0.788574f, 0.805176f, 0.821289f, 0.835449f, 0.849609f, 0.862793f, 0.874023f, - 0.884277f, 0.894043f, 0.903320f, 0.911621f, 0.919434f, 0.926758f, 0.933594f, 0.939453f, - 0.945312f, 0.951172f, 0.979492f, 0.980957f, 0.980957f, 0.980957f, 0.980469f, 0.979980f, - 0.001163f, 0.003527f, 0.006229f, 0.009323f, 0.012199f, 0.015808f, 0.019928f, 0.024200f, - 0.028870f, 0.033997f, 0.040161f, 0.046967f, 0.054871f, 0.063477f, 0.073181f, 0.083618f, - 0.096252f, 0.109863f, 0.125122f, 0.142334f, 0.161743f, 0.182739f, 0.206421f, 0.232300f, - 0.259277f, 0.288086f, 0.320068f, 0.352783f, 0.386475f, 0.420410f, 0.454590f, 0.489258f, - 0.521973f, 0.555176f, 0.586914f, 0.617188f, 0.646484f, 0.673828f, 0.699707f, 0.723633f, - 0.746094f, 0.766113f, 0.785645f, 0.803223f, 0.819336f, 0.834961f, 0.848633f, 0.861328f, - 0.873535f, 0.884766f, 0.893555f, 0.903809f, 0.911621f, 0.920410f, 0.928223f, 0.934082f, - 0.939941f, 0.946777f, 0.978027f, 0.979492f, 0.979492f, 0.979004f, 0.979004f, 0.978516f, - 0.000981f, 0.002987f, 0.005329f, 0.008186f, 0.010895f, 0.013832f, 0.017532f, 0.021149f, - 0.025253f, 0.029999f, 0.035034f, 0.040985f, 0.047485f, 0.054993f, 0.063049f, 0.072510f, - 0.082581f, 0.094421f, 0.107727f, 0.122498f, 0.138794f, 0.157471f, 0.178467f, 0.200562f, - 0.225586f, 0.251953f, 0.281250f, 0.311279f, 0.343750f, 0.377197f, 0.411621f, 0.445557f, - 0.479736f, 0.513672f, 0.546875f, 0.579590f, 0.610352f, 0.640625f, 0.668457f, 0.694336f, - 0.718750f, 0.742188f, 0.762695f, 0.782715f, 0.801270f, 0.817871f, 0.833496f, 0.847168f, - 0.860840f, 0.872559f, 0.884277f, 0.894531f, 0.904297f, 0.912598f, 0.920898f, 0.928711f, - 0.935547f, 0.942383f, 0.976074f, 0.978027f, 0.978516f, 0.978027f, 0.977539f, 0.977051f, - 0.000880f, 0.002707f, 0.005089f, 0.007305f, 0.010147f, 0.012596f, 0.015160f, 0.018616f, - 0.022507f, 0.026230f, 0.030777f, 0.035767f, 0.041351f, 0.047455f, 0.054565f, 0.062256f, - 0.071289f, 0.081299f, 0.092346f, 0.105408f, 0.119812f, 0.135620f, 0.153320f, 0.173462f, - 0.195068f, 0.219482f, 0.245361f, 0.273682f, 0.303711f, 0.335938f, 0.368896f, 0.402588f, - 0.437500f, 0.472168f, 0.505859f, 0.539551f, 0.573242f, 0.604492f, 0.634766f, 0.663086f, - 0.689453f, 0.714844f, 0.738770f, 0.760254f, 0.780762f, 0.799316f, 0.817383f, 0.833496f, - 0.847168f, 0.860840f, 0.873535f, 0.884766f, 0.895508f, 0.905273f, 0.914062f, 0.922363f, - 0.930176f, 0.937012f, 0.974609f, 0.976074f, 0.976074f, 0.976562f, 0.976074f, 0.975586f, - 0.000851f, 0.002659f, 0.004692f, 0.006466f, 0.008545f, 0.011055f, 0.013649f, 0.016403f, - 0.019714f, 0.023056f, 0.026962f, 0.031235f, 0.035828f, 0.041656f, 0.047699f, 0.054077f, - 0.061859f, 0.070496f, 0.080200f, 0.091125f, 0.103088f, 0.116882f, 0.132446f, 0.149780f, - 0.168701f, 0.190430f, 0.213379f, 0.239258f, 0.267334f, 0.296631f, 0.328369f, 0.360840f, - 0.395020f, 0.429932f, 0.464355f, 0.499512f, 0.533203f, 0.566406f, 0.599121f, 0.629883f, - 0.658203f, 0.687012f, 0.712402f, 0.735840f, 0.758789f, 0.779297f, 0.798828f, 0.816406f, - 0.832520f, 0.847168f, 0.861328f, 0.874023f, 0.886230f, 0.896973f, 0.907227f, 0.915527f, - 0.924805f, 0.931641f, 0.972168f, 0.975586f, 0.975586f, 0.974609f, 0.974121f, 0.973633f, - 0.000762f, 0.002214f, 0.004040f, 0.005859f, 0.007790f, 0.009689f, 0.012161f, 0.014786f, - 0.017441f, 0.020493f, 0.023956f, 0.027618f, 0.031860f, 0.036255f, 0.041595f, 0.047394f, - 0.053894f, 0.061188f, 0.069214f, 0.078735f, 0.089050f, 0.101135f, 0.114441f, 0.129150f, - 0.145874f, 0.164673f, 0.185303f, 0.208862f, 0.233765f, 0.260742f, 0.290283f, 0.321045f, - 0.354248f, 0.388184f, 0.422607f, 0.457764f, 0.493652f, 0.526855f, 0.561523f, 0.594238f, - 0.625977f, 0.655273f, 0.683594f, 0.710449f, 0.734863f, 0.758301f, 0.779297f, 0.798828f, - 0.817383f, 0.833984f, 0.848145f, 0.862793f, 0.875488f, 0.887207f, 0.899414f, 0.908691f, - 0.917969f, 0.926270f, 0.970215f, 0.972656f, 0.974121f, 0.973145f, 0.972656f, 0.972168f, - 0.000732f, 0.001928f, 0.003513f, 0.005234f, 0.007042f, 0.008629f, 0.010620f, 0.012985f, - 0.015244f, 0.018158f, 0.020935f, 0.024475f, 0.027908f, 0.032013f, 0.036316f, 0.041290f, - 0.046661f, 0.053040f, 0.060089f, 0.068115f, 0.077087f, 0.087463f, 0.099121f, 0.111633f, - 0.126221f, 0.142578f, 0.160767f, 0.181396f, 0.203003f, 0.228149f, 0.255127f, 0.284180f, - 0.315186f, 0.347900f, 0.381836f, 0.416748f, 0.451904f, 0.487549f, 0.522949f, 0.556641f, - 0.590332f, 0.623047f, 0.652832f, 0.682129f, 0.708984f, 0.733887f, 0.757324f, 0.779785f, - 0.799316f, 0.818359f, 0.835449f, 0.850586f, 0.865234f, 0.877441f, 0.890137f, 0.901367f, - 0.912109f, 0.920410f, 0.968262f, 0.970703f, 0.971191f, 0.970703f, 0.971191f, 0.971191f, - 0.000524f, 0.001758f, 0.003185f, 0.004864f, 0.006081f, 0.007820f, 0.009705f, 0.011467f, - 0.013634f, 0.016068f, 0.018707f, 0.021378f, 0.024597f, 0.028030f, 0.032135f, 0.036224f, - 0.041016f, 0.046692f, 0.052399f, 0.059265f, 0.067505f, 0.076050f, 0.085510f, 0.096558f, - 0.109253f, 0.123657f, 0.138794f, 0.157227f, 0.176880f, 0.198730f, 0.223267f, 0.250000f, - 0.278809f, 0.309326f, 0.342041f, 0.375977f, 0.410889f, 0.447021f, 0.483154f, 0.518555f, - 0.554199f, 0.586914f, 0.620117f, 0.650879f, 0.681641f, 0.708496f, 0.734375f, 0.757324f, - 0.780762f, 0.801270f, 0.819336f, 0.837891f, 0.852539f, 0.867188f, 0.880371f, 0.893066f, - 0.903809f, 0.914551f, 0.966309f, 0.968750f, 0.969238f, 0.969727f, 0.968750f, 0.968750f, - 0.000503f, 0.001896f, 0.002653f, 0.004128f, 0.005627f, 0.007004f, 0.008797f, 0.010361f, - 0.012230f, 0.014175f, 0.016647f, 0.019348f, 0.021454f, 0.024872f, 0.028290f, 0.031830f, - 0.036163f, 0.040649f, 0.045715f, 0.051941f, 0.058319f, 0.065979f, 0.074402f, 0.083618f, - 0.094360f, 0.106812f, 0.120239f, 0.135742f, 0.153320f, 0.172974f, 0.194824f, 0.218506f, - 0.245117f, 0.273926f, 0.304688f, 0.336426f, 0.371094f, 0.406982f, 0.442627f, 0.479492f, - 0.514648f, 0.550781f, 0.584961f, 0.618652f, 0.650879f, 0.681152f, 0.709473f, 0.735352f, - 0.760742f, 0.782715f, 0.803711f, 0.821777f, 0.838867f, 0.855957f, 0.870605f, 0.884277f, - 0.895996f, 0.906738f, 0.964355f, 0.966309f, 0.967285f, 0.966797f, 0.966309f, 0.966309f, - 0.000636f, 0.001421f, 0.002768f, 0.003761f, 0.004944f, 0.006462f, 0.007889f, 0.009262f, - 0.010780f, 0.013000f, 0.014946f, 0.017029f, 0.019516f, 0.022049f, 0.024933f, 0.028091f, - 0.031616f, 0.035553f, 0.040161f, 0.045380f, 0.051239f, 0.057281f, 0.064270f, 0.072693f, - 0.081970f, 0.092468f, 0.104736f, 0.117859f, 0.132690f, 0.150391f, 0.169189f, 0.190796f, - 0.214233f, 0.240601f, 0.268555f, 0.299561f, 0.332520f, 0.367188f, 0.402344f, 0.438965f, - 0.476074f, 0.512695f, 0.549805f, 0.584473f, 0.619141f, 0.651367f, 0.681152f, 0.709961f, - 0.737305f, 0.762695f, 0.785156f, 0.806641f, 0.826172f, 0.843262f, 0.859375f, 0.874023f, - 0.888184f, 0.900391f, 0.961426f, 0.964355f, 0.965332f, 0.964844f, 0.964355f, 0.964844f, - 0.000295f, 0.001419f, 0.002342f, 0.003471f, 0.004539f, 0.005821f, 0.006882f, 0.008354f, - 0.010155f, 0.011574f, 0.013283f, 0.015129f, 0.017090f, 0.019333f, 0.022125f, 0.024643f, - 0.028122f, 0.031586f, 0.035522f, 0.039825f, 0.044586f, 0.050110f, 0.056091f, 0.063354f, - 0.071045f, 0.080078f, 0.090637f, 0.102112f, 0.115479f, 0.130127f, 0.147217f, 0.165649f, - 0.186768f, 0.210571f, 0.236694f, 0.265137f, 0.295654f, 0.328857f, 0.363770f, 0.399902f, - 0.436523f, 0.474365f, 0.511230f, 0.548828f, 0.584961f, 0.619141f, 0.652344f, 0.684082f, - 0.712891f, 0.741211f, 0.766113f, 0.789062f, 0.810547f, 0.830078f, 0.848633f, 0.864258f, - 0.879395f, 0.892578f, 0.958496f, 0.962402f, 0.962402f, 0.962402f, 0.961914f, 0.962402f, - 0.000464f, 0.001313f, 0.002159f, 0.003134f, 0.004463f, 0.005001f, 0.006466f, 0.007595f, - 0.008842f, 0.010277f, 0.011971f, 0.013550f, 0.015434f, 0.017242f, 0.019348f, 0.021805f, - 0.024734f, 0.027817f, 0.031174f, 0.034821f, 0.039124f, 0.043823f, 0.049164f, 0.055237f, - 0.062164f, 0.069336f, 0.078430f, 0.088501f, 0.099976f, 0.112854f, 0.127319f, 0.143555f, - 0.162354f, 0.183350f, 0.207031f, 0.233032f, 0.260986f, 0.291992f, 0.325195f, 0.361084f, - 0.397217f, 0.435059f, 0.473389f, 0.510742f, 0.549316f, 0.586426f, 0.620605f, 0.654785f, - 0.686523f, 0.716797f, 0.744629f, 0.769043f, 0.793945f, 0.815918f, 0.834961f, 0.852539f, - 0.869141f, 0.884277f, 0.955078f, 0.959473f, 0.959473f, 0.959473f, 0.959961f, 0.959961f, - 0.000541f, 0.001223f, 0.002172f, 0.002886f, 0.003679f, 0.004681f, 0.005512f, 0.006683f, - 0.008049f, 0.009346f, 0.010704f, 0.012024f, 0.013626f, 0.015213f, 0.017227f, 0.019516f, - 0.022079f, 0.024612f, 0.027313f, 0.030731f, 0.034180f, 0.038239f, 0.042969f, 0.048187f, - 0.053864f, 0.060516f, 0.068298f, 0.076843f, 0.086670f, 0.097473f, 0.110107f, 0.124268f, - 0.140869f, 0.159302f, 0.180420f, 0.203613f, 0.229614f, 0.258057f, 0.289062f, 0.323486f, - 0.358398f, 0.395996f, 0.434082f, 0.472900f, 0.511719f, 0.550293f, 0.587402f, 0.624023f, - 0.658203f, 0.690918f, 0.721191f, 0.749512f, 0.774902f, 0.799316f, 0.821289f, 0.840820f, - 0.859375f, 0.875488f, 0.952637f, 0.956543f, 0.957520f, 0.957520f, 0.957520f, 0.957031f, - 0.000252f, 0.001056f, 0.001923f, 0.002523f, 0.003414f, 0.003960f, 0.005146f, 0.006172f, - 0.007130f, 0.008179f, 0.009567f, 0.010735f, 0.012077f, 0.013878f, 0.015640f, 0.017456f, - 0.019638f, 0.021622f, 0.024170f, 0.026978f, 0.030121f, 0.033630f, 0.037445f, 0.042053f, - 0.047119f, 0.052826f, 0.059174f, 0.066711f, 0.075012f, 0.084473f, 0.095276f, 0.107727f, - 0.122070f, 0.138184f, 0.156250f, 0.177246f, 0.200928f, 0.226929f, 0.255371f, 0.286865f, - 0.321289f, 0.356934f, 0.395264f, 0.434326f, 0.473877f, 0.514160f, 0.553711f, 0.591797f, - 0.628418f, 0.663574f, 0.696777f, 0.728027f, 0.755859f, 0.782715f, 0.806152f, 0.829102f, - 0.847656f, 0.867188f, 0.949707f, 0.954102f, 0.954590f, 0.954590f, 0.954102f, 0.954590f, - 0.000365f, 0.000963f, 0.001581f, 0.002337f, 0.002996f, 0.003952f, 0.004608f, 0.005459f, - 0.006489f, 0.007351f, 0.008484f, 0.009544f, 0.011108f, 0.012413f, 0.013901f, 0.015388f, - 0.017181f, 0.019012f, 0.021439f, 0.023727f, 0.026520f, 0.029449f, 0.032898f, 0.036835f, - 0.041046f, 0.045868f, 0.051575f, 0.058075f, 0.064758f, 0.073120f, 0.082520f, 0.093079f, - 0.105652f, 0.119385f, 0.135620f, 0.153687f, 0.174683f, 0.198364f, 0.224365f, 0.253662f, - 0.285400f, 0.320557f, 0.357178f, 0.395752f, 0.435791f, 0.476318f, 0.516602f, 0.557129f, - 0.596191f, 0.633789f, 0.669434f, 0.703613f, 0.734375f, 0.763672f, 0.790039f, 0.812988f, - 0.836914f, 0.855957f, 0.946289f, 0.949707f, 0.951172f, 0.951172f, 0.951172f, 0.951172f, - 0.000404f, 0.001028f, 0.001410f, 0.002098f, 0.002657f, 0.003445f, 0.004391f, 0.005039f, - 0.005665f, 0.006569f, 0.007549f, 0.008614f, 0.009743f, 0.011108f, 0.012390f, 0.013611f, - 0.015396f, 0.017044f, 0.018921f, 0.020874f, 0.023453f, 0.025833f, 0.028809f, 0.032501f, - 0.036011f, 0.040161f, 0.044952f, 0.050018f, 0.056091f, 0.063477f, 0.071533f, 0.080200f, - 0.091064f, 0.103027f, 0.117065f, 0.133057f, 0.151489f, 0.171997f, 0.196045f, 0.222290f, - 0.251709f, 0.284424f, 0.319824f, 0.357422f, 0.397217f, 0.438232f, 0.479492f, 0.521484f, - 0.562500f, 0.602051f, 0.641113f, 0.677734f, 0.711914f, 0.743164f, 0.772461f, 0.799316f, - 0.822754f, 0.845215f, 0.942383f, 0.946777f, 0.947754f, 0.947754f, 0.948242f, 0.948242f, - 0.000406f, 0.000992f, 0.001447f, 0.001986f, 0.002499f, 0.003149f, 0.003769f, 0.004272f, - 0.005016f, 0.005981f, 0.006924f, 0.007675f, 0.008766f, 0.009727f, 0.010765f, 0.011986f, - 0.013588f, 0.014915f, 0.016724f, 0.018478f, 0.020508f, 0.022873f, 0.025497f, 0.028336f, - 0.031525f, 0.034882f, 0.038818f, 0.043243f, 0.048615f, 0.054626f, 0.061707f, 0.069214f, - 0.078430f, 0.089111f, 0.101013f, 0.115112f, 0.130859f, 0.148926f, 0.170166f, 0.193604f, - 0.220947f, 0.250732f, 0.283936f, 0.320068f, 0.358887f, 0.400391f, 0.442139f, 0.483887f, - 0.527344f, 0.569824f, 0.610352f, 0.649414f, 0.686523f, 0.722168f, 0.753906f, 0.782227f, - 0.809570f, 0.833496f, 0.938477f, 0.942871f, 0.944824f, 0.944336f, 0.943848f, 0.943848f, - 0.000235f, 0.000984f, 0.001204f, 0.001706f, 0.002239f, 0.002998f, 0.003462f, 0.004093f, - 0.004372f, 0.005371f, 0.006149f, 0.006962f, 0.007736f, 0.008766f, 0.009804f, 0.010780f, - 0.011887f, 0.013336f, 0.014618f, 0.016159f, 0.018158f, 0.020050f, 0.022232f, 0.024597f, - 0.027313f, 0.030334f, 0.033752f, 0.037872f, 0.042389f, 0.047516f, 0.053192f, 0.059937f, - 0.067749f, 0.076599f, 0.086975f, 0.098755f, 0.112610f, 0.128662f, 0.146973f, 0.168091f, - 0.192383f, 0.220215f, 0.250732f, 0.284668f, 0.322021f, 0.361572f, 0.403564f, 0.446777f, - 0.490723f, 0.534668f, 0.577637f, 0.619629f, 0.660156f, 0.697754f, 0.731934f, 0.764648f, - 0.794922f, 0.820312f, 0.934082f, 0.939453f, 0.939941f, 0.941406f, 0.940430f, 0.940918f, - 0.000237f, 0.000591f, 0.001098f, 0.001619f, 0.002241f, 0.002636f, 0.003176f, 0.003521f, - 0.004101f, 0.004631f, 0.005398f, 0.006378f, 0.007000f, 0.007767f, 0.008713f, 0.009758f, - 0.010475f, 0.011734f, 0.013016f, 0.014404f, 0.015762f, 0.017517f, 0.019440f, 0.021469f, - 0.023651f, 0.026199f, 0.029495f, 0.033112f, 0.036499f, 0.040955f, 0.045959f, 0.051849f, - 0.058197f, 0.065552f, 0.074585f, 0.085022f, 0.096680f, 0.110535f, 0.126709f, 0.145264f, - 0.166626f, 0.191406f, 0.219482f, 0.250488f, 0.286133f, 0.323975f, 0.365723f, 0.408447f, - 0.453125f, 0.498779f, 0.542969f, 0.588379f, 0.631836f, 0.671387f, 0.709473f, 0.745117f, - 0.777344f, 0.807617f, 0.930176f, 0.935059f, 0.936523f, 0.936523f, 0.936523f, 0.936035f, - 0.000242f, 0.000761f, 0.000943f, 0.001624f, 0.001858f, 0.002390f, 0.002638f, 0.003054f, - 0.003805f, 0.004559f, 0.005035f, 0.005493f, 0.006157f, 0.006878f, 0.007687f, 0.008530f, - 0.009178f, 0.010406f, 0.011406f, 0.012520f, 0.014053f, 0.015579f, 0.017105f, 0.018661f, - 0.020737f, 0.022903f, 0.025650f, 0.028259f, 0.031433f, 0.035065f, 0.039581f, 0.044342f, - 0.049988f, 0.056366f, 0.064026f, 0.072632f, 0.082825f, 0.094666f, 0.108582f, 0.124634f, - 0.143799f, 0.165405f, 0.190796f, 0.219360f, 0.251953f, 0.287842f, 0.328125f, 0.370605f, - 0.415283f, 0.461670f, 0.507812f, 0.555176f, 0.600586f, 0.645020f, 0.685547f, 0.724121f, - 0.759277f, 0.792969f, 0.924805f, 0.931152f, 0.931641f, 0.932129f, 0.932129f, 0.931641f, - 0.000240f, 0.000685f, 0.000955f, 0.001395f, 0.001768f, 0.002157f, 0.002533f, 0.002970f, - 0.003223f, 0.003813f, 0.004601f, 0.004993f, 0.005428f, 0.005981f, 0.006878f, 0.007484f, - 0.008110f, 0.009132f, 0.009964f, 0.011208f, 0.012138f, 0.013374f, 0.015099f, 0.016190f, - 0.018112f, 0.020187f, 0.022202f, 0.024780f, 0.027573f, 0.030411f, 0.034119f, 0.037964f, - 0.042755f, 0.048553f, 0.054474f, 0.061890f, 0.070984f, 0.080688f, 0.092590f, 0.106812f, - 0.123291f, 0.142456f, 0.164551f, 0.190430f, 0.220459f, 0.253418f, 0.291504f, 0.332520f, - 0.376709f, 0.423340f, 0.471436f, 0.520508f, 0.567383f, 0.614746f, 0.660156f, 0.702148f, - 0.741211f, 0.776367f, 0.920410f, 0.925293f, 0.926270f, 0.926758f, 0.927246f, 0.926758f, - 0.000244f, 0.000431f, 0.000799f, 0.001309f, 0.001587f, 0.001945f, 0.002317f, 0.002514f, - 0.003290f, 0.003548f, 0.004082f, 0.004349f, 0.004707f, 0.005348f, 0.006027f, 0.006565f, - 0.007141f, 0.008011f, 0.008850f, 0.009552f, 0.010757f, 0.011650f, 0.012794f, 0.014145f, - 0.015778f, 0.017303f, 0.019028f, 0.021088f, 0.023575f, 0.026169f, 0.029175f, 0.032562f, - 0.036713f, 0.041382f, 0.046448f, 0.052948f, 0.060303f, 0.068787f, 0.079041f, 0.090942f, - 0.105103f, 0.121643f, 0.141113f, 0.164185f, 0.190308f, 0.221191f, 0.256836f, 0.295898f, - 0.339355f, 0.385010f, 0.433838f, 0.484619f, 0.534668f, 0.583496f, 0.631348f, 0.678223f, - 0.719727f, 0.759766f, 0.913574f, 0.920410f, 0.921387f, 0.921875f, 0.921875f, 0.921387f, - 0.000243f, 0.000496f, 0.000847f, 0.001157f, 0.001426f, 0.001634f, 0.002020f, 0.002338f, - 0.002607f, 0.003035f, 0.003502f, 0.003872f, 0.004459f, 0.004726f, 0.005402f, 0.005779f, - 0.006325f, 0.007095f, 0.007767f, 0.008568f, 0.009331f, 0.010086f, 0.011009f, 0.012314f, - 0.013611f, 0.015060f, 0.016312f, 0.018158f, 0.020401f, 0.022476f, 0.024979f, 0.027863f, - 0.031036f, 0.034943f, 0.039581f, 0.044830f, 0.050903f, 0.058289f, 0.066895f, 0.076782f, - 0.088989f, 0.103210f, 0.120422f, 0.140259f, 0.164185f, 0.191772f, 0.223877f, 0.260742f, - 0.301758f, 0.347168f, 0.395508f, 0.446533f, 0.497803f, 0.551270f, 0.601562f, 0.651855f, - 0.697754f, 0.741211f, 0.908203f, 0.915039f, 0.916016f, 0.916016f, 0.916504f, 0.915527f, - 0.000239f, 0.000345f, 0.000690f, 0.000913f, 0.001250f, 0.001343f, 0.001579f, 0.002050f, - 0.002331f, 0.002861f, 0.003048f, 0.003616f, 0.003696f, 0.004211f, 0.004723f, 0.005074f, - 0.005657f, 0.006100f, 0.006893f, 0.007290f, 0.008118f, 0.008659f, 0.009552f, 0.010704f, - 0.011681f, 0.012764f, 0.014114f, 0.015533f, 0.017227f, 0.018982f, 0.021286f, 0.023560f, - 0.026489f, 0.029861f, 0.033417f, 0.037933f, 0.043121f, 0.049286f, 0.056519f, 0.065002f, - 0.075073f, 0.087158f, 0.101624f, 0.118835f, 0.139648f, 0.164185f, 0.193481f, 0.226929f, - 0.265625f, 0.309570f, 0.356934f, 0.408203f, 0.461426f, 0.516113f, 0.569824f, 0.623047f, - 0.674316f, 0.720703f, 0.902344f, 0.908203f, 0.909668f, 0.910645f, 0.910645f, 0.911133f, - 0.000000f, 0.000281f, 0.000560f, 0.000977f, 0.001063f, 0.001171f, 0.001569f, 0.001903f, - 0.002075f, 0.002413f, 0.002695f, 0.003004f, 0.003399f, 0.003553f, 0.003998f, 0.004333f, - 0.004971f, 0.005314f, 0.005806f, 0.006340f, 0.007015f, 0.007492f, 0.008377f, 0.009186f, - 0.010094f, 0.010910f, 0.012199f, 0.013351f, 0.014618f, 0.016266f, 0.018082f, 0.019852f, - 0.022491f, 0.025085f, 0.028168f, 0.031799f, 0.036041f, 0.041107f, 0.047394f, 0.054321f, - 0.062866f, 0.073181f, 0.085327f, 0.100525f, 0.118408f, 0.139648f, 0.165527f, 0.196411f, - 0.231812f, 0.273193f, 0.318848f, 0.369629f, 0.423828f, 0.480225f, 0.536621f, 0.592773f, - 0.647949f, 0.699707f, 0.894043f, 0.900879f, 0.903809f, 0.903320f, 0.903320f, 0.902832f, - 0.000232f, 0.000227f, 0.000555f, 0.000656f, 0.000937f, 0.000985f, 0.001351f, 0.001723f, - 0.001925f, 0.002010f, 0.002445f, 0.002625f, 0.002760f, 0.003220f, 0.003551f, 0.003870f, - 0.004303f, 0.004826f, 0.005028f, 0.005451f, 0.005985f, 0.006523f, 0.007000f, 0.007744f, - 0.008499f, 0.009361f, 0.010109f, 0.011185f, 0.012413f, 0.013603f, 0.015121f, 0.016891f, - 0.018753f, 0.020920f, 0.023407f, 0.026764f, 0.030197f, 0.034302f, 0.039429f, 0.044891f, - 0.052368f, 0.060822f, 0.071167f, 0.083557f, 0.098877f, 0.117493f, 0.139893f, 0.167725f, - 0.200195f, 0.238037f, 0.281982f, 0.331543f, 0.385010f, 0.442627f, 0.501465f, 0.561523f, - 0.620605f, 0.675781f, 0.887207f, 0.894531f, 0.895020f, 0.896484f, 0.896484f, 0.895996f, - 0.000000f, 0.000332f, 0.000577f, 0.000723f, 0.000720f, 0.001210f, 0.001469f, 0.001456f, - 0.001546f, 0.001775f, 0.002159f, 0.002291f, 0.002659f, 0.002916f, 0.003046f, 0.003439f, - 0.003752f, 0.003883f, 0.004375f, 0.004635f, 0.005241f, 0.005638f, 0.006054f, 0.006630f, - 0.007191f, 0.007744f, 0.008545f, 0.009178f, 0.010498f, 0.011536f, 0.012802f, 0.013931f, - 0.015808f, 0.017548f, 0.019379f, 0.022110f, 0.025040f, 0.028473f, 0.032471f, 0.037323f, - 0.043152f, 0.050476f, 0.058807f, 0.069214f, 0.082520f, 0.098145f, 0.116821f, 0.141602f, - 0.170044f, 0.204834f, 0.245728f, 0.293213f, 0.346436f, 0.403564f, 0.464111f, 0.527832f, - 0.589844f, 0.650879f, 0.878418f, 0.886719f, 0.888184f, 0.887695f, 0.888672f, 0.888672f, - 0.000243f, 0.000307f, 0.000526f, 0.000561f, 0.000923f, 0.000980f, 0.001143f, 0.001386f, - 0.001414f, 0.001683f, 0.001735f, 0.001972f, 0.002232f, 0.002481f, 0.002657f, 0.002754f, - 0.003193f, 0.003359f, 0.003603f, 0.003956f, 0.004368f, 0.004692f, 0.005119f, 0.005596f, - 0.005955f, 0.006634f, 0.007256f, 0.007881f, 0.008652f, 0.009552f, 0.010376f, 0.011719f, - 0.012634f, 0.014595f, 0.016113f, 0.018219f, 0.020554f, 0.023254f, 0.026520f, 0.030502f, - 0.035553f, 0.041168f, 0.048065f, 0.057190f, 0.067261f, 0.080811f, 0.097107f, 0.117737f, - 0.143066f, 0.173950f, 0.211182f, 0.256592f, 0.307129f, 0.364502f, 0.427002f, 0.491943f, - 0.557617f, 0.624023f, 0.869629f, 0.877930f, 0.879883f, 0.879883f, 0.879883f, 0.880371f, - 0.000000f, 0.000270f, 0.000342f, 0.000509f, 0.000668f, 0.000989f, 0.000945f, 0.001105f, - 0.001230f, 0.001335f, 0.001492f, 0.001757f, 0.001917f, 0.002140f, 0.002386f, 0.002501f, - 0.002644f, 0.002884f, 0.003199f, 0.003441f, 0.003620f, 0.003891f, 0.004337f, 0.004631f, - 0.005119f, 0.005520f, 0.006100f, 0.006504f, 0.007301f, 0.007771f, 0.008751f, 0.009521f, - 0.010658f, 0.011765f, 0.013145f, 0.014641f, 0.016785f, 0.018829f, 0.021545f, 0.024719f, - 0.028381f, 0.033203f, 0.038849f, 0.046112f, 0.055084f, 0.065552f, 0.079529f, 0.096985f, - 0.118530f, 0.145630f, 0.179321f, 0.220337f, 0.269287f, 0.325439f, 0.387207f, 0.454102f, - 0.524414f, 0.595215f, 0.859863f, 0.868652f, 0.870605f, 0.869629f, 0.870117f, 0.870605f, - 0.000000f, 0.000230f, 0.000334f, 0.000416f, 0.000700f, 0.000726f, 0.000921f, 0.001008f, - 0.001065f, 0.001186f, 0.001365f, 0.001471f, 0.001627f, 0.001796f, 0.001843f, 0.002069f, - 0.002266f, 0.002438f, 0.002596f, 0.002831f, 0.003000f, 0.003298f, 0.003597f, 0.003887f, - 0.004265f, 0.004581f, 0.004986f, 0.005505f, 0.005947f, 0.006454f, 0.007069f, 0.007801f, - 0.008621f, 0.009575f, 0.010612f, 0.011848f, 0.013321f, 0.015259f, 0.017410f, 0.019775f, - 0.022934f, 0.026550f, 0.031464f, 0.036713f, 0.043945f, 0.052887f, 0.064209f, 0.078735f, - 0.096924f, 0.120361f, 0.149536f, 0.186768f, 0.232422f, 0.285889f, 0.347656f, 0.415527f, - 0.488281f, 0.563965f, 0.849121f, 0.857910f, 0.859375f, 0.860840f, 0.860840f, 0.860352f, - 0.000233f, 0.000225f, 0.000219f, 0.000431f, 0.000579f, 0.000648f, 0.000671f, 0.000744f, - 0.000946f, 0.000994f, 0.001091f, 0.001307f, 0.001364f, 0.001490f, 0.001561f, 0.001712f, - 0.001892f, 0.001999f, 0.002190f, 0.002369f, 0.002512f, 0.002733f, 0.003014f, 0.003145f, - 0.003553f, 0.003822f, 0.004135f, 0.004326f, 0.004799f, 0.005344f, 0.005718f, 0.006378f, - 0.007008f, 0.007721f, 0.008400f, 0.009537f, 0.010597f, 0.011917f, 0.013542f, 0.015579f, - 0.018051f, 0.020889f, 0.024765f, 0.029236f, 0.034668f, 0.041779f, 0.051056f, 0.062439f, - 0.077576f, 0.097595f, 0.122864f, 0.155273f, 0.196655f, 0.247437f, 0.307617f, 0.375977f, - 0.450684f, 0.531250f, 0.837891f, 0.847168f, 0.848633f, 0.849609f, 0.849121f, 0.849609f, - 0.000202f, 0.000180f, 0.000206f, 0.000339f, 0.000479f, 0.000536f, 0.000687f, 0.000739f, - 0.000771f, 0.000849f, 0.001051f, 0.001060f, 0.001154f, 0.001219f, 0.001389f, 0.001505f, - 0.001469f, 0.001729f, 0.001858f, 0.001980f, 0.002209f, 0.002243f, 0.002483f, 0.002695f, - 0.002951f, 0.003149f, 0.003374f, 0.003654f, 0.004002f, 0.004154f, 0.004539f, 0.005032f, - 0.005428f, 0.005989f, 0.006760f, 0.007549f, 0.008423f, 0.009499f, 0.010620f, 0.012016f, - 0.013992f, 0.016434f, 0.019135f, 0.022583f, 0.026840f, 0.032501f, 0.039551f, 0.048828f, - 0.061066f, 0.077393f, 0.098755f, 0.127075f, 0.163208f, 0.209717f, 0.267578f, 0.334961f, - 0.411133f, 0.494629f, 0.825684f, 0.834473f, 0.836426f, 0.837402f, 0.837402f, 0.837402f, - 0.000000f, 0.000185f, 0.000184f, 0.000404f, 0.000408f, 0.000454f, 0.000480f, 0.000506f, - 0.000660f, 0.000694f, 0.000742f, 0.000801f, 0.000989f, 0.001111f, 0.001167f, 0.001250f, - 0.001311f, 0.001424f, 0.001541f, 0.001574f, 0.001712f, 0.001930f, 0.001982f, 0.002201f, - 0.002375f, 0.002439f, 0.002792f, 0.002905f, 0.003065f, 0.003412f, 0.003653f, 0.003952f, - 0.004463f, 0.004723f, 0.005230f, 0.005936f, 0.006386f, 0.007092f, 0.008240f, 0.009247f, - 0.010765f, 0.012344f, 0.014420f, 0.017090f, 0.020493f, 0.024551f, 0.030014f, 0.037689f, - 0.047302f, 0.060028f, 0.077820f, 0.100830f, 0.132812f, 0.174561f, 0.228516f, 0.294434f, - 0.371582f, 0.457031f, 0.812012f, 0.820801f, 0.823730f, 0.824219f, 0.824707f, 0.824219f, - 0.000000f, 0.000053f, 0.000206f, 0.000360f, 0.000379f, 0.000391f, 0.000379f, 0.000478f, - 0.000549f, 0.000589f, 0.000626f, 0.000674f, 0.000762f, 0.000832f, 0.000894f, 0.001050f, - 0.001111f, 0.001155f, 0.001286f, 0.001345f, 0.001449f, 0.001564f, 0.001666f, 0.001750f, - 0.001856f, 0.001925f, 0.002056f, 0.002359f, 0.002542f, 0.002728f, 0.003042f, 0.003164f, - 0.003460f, 0.003786f, 0.004116f, 0.004578f, 0.005116f, 0.005688f, 0.006508f, 0.007229f, - 0.008125f, 0.009232f, 0.010796f, 0.012741f, 0.015137f, 0.018158f, 0.022186f, 0.028030f, - 0.035248f, 0.045593f, 0.059052f, 0.078308f, 0.105042f, 0.141602f, 0.190308f, 0.252930f, - 0.329102f, 0.417969f, 0.797852f, 0.807129f, 0.810059f, 0.810547f, 0.811035f, 0.810547f, - 0.000000f, 0.000000f, 0.000082f, 0.000195f, 0.000309f, 0.000336f, 0.000324f, 0.000414f, - 0.000439f, 0.000460f, 0.000599f, 0.000643f, 0.000637f, 0.000690f, 0.000733f, 0.000834f, - 0.000821f, 0.000922f, 0.000989f, 0.001067f, 0.001207f, 0.001293f, 0.001327f, 0.001476f, - 0.001581f, 0.001663f, 0.001725f, 0.001906f, 0.001934f, 0.002180f, 0.002258f, 0.002602f, - 0.002701f, 0.003019f, 0.003229f, 0.003502f, 0.003847f, 0.004261f, 0.004795f, 0.005318f, - 0.006130f, 0.007008f, 0.008118f, 0.009277f, 0.011024f, 0.013229f, 0.016205f, 0.020203f, - 0.025620f, 0.033020f, 0.043854f, 0.059021f, 0.080383f, 0.111206f, 0.154419f, 0.212646f, - 0.287354f, 0.378418f, 0.781250f, 0.792480f, 0.793457f, 0.795410f, 0.795898f, 0.794922f, - 0.000000f, 0.000121f, 0.000120f, 0.000198f, 0.000275f, 0.000249f, 0.000290f, 0.000360f, - 0.000375f, 0.000379f, 0.000391f, 0.000438f, 0.000505f, 0.000534f, 0.000669f, 0.000629f, - 0.000659f, 0.000754f, 0.000890f, 0.000833f, 0.000849f, 0.000975f, 0.001029f, 0.001117f, - 0.001193f, 0.001203f, 0.001269f, 0.001424f, 0.001594f, 0.001675f, 0.001737f, 0.001957f, - 0.002094f, 0.002319f, 0.002342f, 0.002609f, 0.002928f, 0.003248f, 0.003523f, 0.003967f, - 0.004547f, 0.005138f, 0.005871f, 0.006760f, 0.007912f, 0.009430f, 0.011528f, 0.014236f, - 0.017899f, 0.023346f, 0.031235f, 0.042694f, 0.059235f, 0.084229f, 0.120972f, 0.173950f, - 0.245239f, 0.334473f, 0.764160f, 0.775391f, 0.777344f, 0.778809f, 0.777832f, 0.778809f, - 0.000000f, 0.000121f, 0.000119f, 0.000182f, 0.000177f, 0.000179f, 0.000262f, 0.000239f, - 0.000309f, 0.000322f, 0.000404f, 0.000370f, 0.000361f, 0.000430f, 0.000458f, 0.000540f, - 0.000589f, 0.000615f, 0.000648f, 0.000632f, 0.000777f, 0.000782f, 0.000798f, 0.000871f, - 0.000857f, 0.000925f, 0.001000f, 0.001045f, 0.001191f, 0.001223f, 0.001426f, 0.001419f, - 0.001512f, 0.001635f, 0.001884f, 0.002092f, 0.002100f, 0.002293f, 0.002577f, 0.003012f, - 0.003258f, 0.003761f, 0.004253f, 0.004814f, 0.005619f, 0.006676f, 0.008064f, 0.009750f, - 0.012268f, 0.015854f, 0.021255f, 0.029282f, 0.041687f, 0.061005f, 0.091370f, 0.136230f, - 0.202759f, 0.291504f, 0.746582f, 0.757324f, 0.759277f, 0.760254f, 0.760254f, 0.760254f, - 0.000000f, 0.000000f, 0.000117f, 0.000126f, 0.000113f, 0.000146f, 0.000158f, 0.000155f, - 0.000189f, 0.000288f, 0.000254f, 0.000336f, 0.000347f, 0.000353f, 0.000370f, 0.000355f, - 0.000390f, 0.000417f, 0.000456f, 0.000480f, 0.000525f, 0.000587f, 0.000596f, 0.000620f, - 0.000676f, 0.000740f, 0.000758f, 0.000852f, 0.000907f, 0.000947f, 0.001057f, 0.001122f, - 0.001170f, 0.001293f, 0.001316f, 0.001437f, 0.001531f, 0.001813f, 0.001952f, 0.002090f, - 0.002346f, 0.002560f, 0.002974f, 0.003334f, 0.003899f, 0.004547f, 0.005360f, 0.006516f, - 0.008179f, 0.010468f, 0.013947f, 0.019241f, 0.027832f, 0.041443f, 0.064941f, 0.102600f, - 0.162231f, 0.247437f, 0.726074f, 0.737793f, 0.739258f, 0.740723f, 0.741211f, 0.741211f, - 0.000000f, 0.000118f, 0.000115f, 0.000113f, 0.000110f, 0.000126f, 0.000121f, 0.000139f, - 0.000147f, 0.000160f, 0.000161f, 0.000233f, 0.000199f, 0.000266f, 0.000286f, 0.000297f, - 0.000329f, 0.000313f, 0.000347f, 0.000358f, 0.000364f, 0.000394f, 0.000435f, 0.000446f, - 0.000489f, 0.000506f, 0.000546f, 0.000625f, 0.000648f, 0.000674f, 0.000723f, 0.000782f, - 0.000865f, 0.000918f, 0.000979f, 0.001104f, 0.001100f, 0.001196f, 0.001352f, 0.001488f, - 0.001586f, 0.001749f, 0.001955f, 0.002275f, 0.002644f, 0.003054f, 0.003563f, 0.004322f, - 0.005314f, 0.006786f, 0.008980f, 0.012115f, 0.017319f, 0.026520f, 0.043121f, 0.072693f, - 0.123535f, 0.203613f, 0.705566f, 0.716797f, 0.719238f, 0.719727f, 0.720703f, 0.721191f, - 0.000000f, 0.000000f, 0.000112f, 0.000109f, 0.000106f, 0.000104f, 0.000102f, 0.000096f, - 0.000091f, 0.000113f, 0.000147f, 0.000129f, 0.000155f, 0.000134f, 0.000196f, 0.000205f, - 0.000181f, 0.000239f, 0.000297f, 0.000255f, 0.000317f, 0.000273f, 0.000335f, 0.000299f, - 0.000379f, 0.000385f, 0.000398f, 0.000402f, 0.000473f, 0.000552f, 0.000489f, 0.000543f, - 0.000557f, 0.000606f, 0.000662f, 0.000698f, 0.000747f, 0.000810f, 0.000902f, 0.000961f, - 0.001063f, 0.001166f, 0.001312f, 0.001523f, 0.001662f, 0.001908f, 0.002298f, 0.002758f, - 0.003365f, 0.004135f, 0.005394f, 0.007290f, 0.010490f, 0.015991f, 0.026215f, 0.047180f, - 0.087646f, 0.160645f, 0.682617f, 0.695801f, 0.697266f, 0.697266f, 0.697266f, 0.698730f, - 0.000000f, 0.000112f, 0.000106f, 0.000104f, 0.000100f, 0.000098f, 0.000095f, 0.000094f, - 0.000090f, 0.000085f, 0.000080f, 0.000081f, 0.000085f, 0.000123f, 0.000123f, 0.000138f, - 0.000151f, 0.000158f, 0.000147f, 0.000171f, 0.000183f, 0.000192f, 0.000242f, 0.000215f, - 0.000253f, 0.000256f, 0.000269f, 0.000278f, 0.000293f, 0.000315f, 0.000377f, 0.000357f, - 0.000357f, 0.000423f, 0.000479f, 0.000493f, 0.000489f, 0.000535f, 0.000579f, 0.000628f, - 0.000683f, 0.000731f, 0.000833f, 0.000935f, 0.001068f, 0.001200f, 0.001347f, 0.001581f, - 0.001995f, 0.002419f, 0.003109f, 0.004147f, 0.005829f, 0.008919f, 0.014641f, 0.027405f, - 0.056885f, 0.119385f, 0.658691f, 0.669922f, 0.673828f, 0.673828f, 0.675293f, 0.675293f, - 0.000000f, 0.000105f, 0.000101f, 0.000096f, 0.000092f, 0.000089f, 0.000087f, 0.000085f, - 0.000083f, 0.000081f, 0.000077f, 0.000073f, 0.000070f, 0.000066f, 0.000080f, 0.000084f, - 0.000089f, 0.000068f, 0.000101f, 0.000094f, 0.000116f, 0.000118f, 0.000125f, 0.000129f, - 0.000150f, 0.000168f, 0.000153f, 0.000192f, 0.000195f, 0.000185f, 0.000200f, 0.000217f, - 0.000226f, 0.000247f, 0.000257f, 0.000262f, 0.000319f, 0.000334f, 0.000347f, 0.000376f, - 0.000395f, 0.000447f, 0.000504f, 0.000544f, 0.000590f, 0.000670f, 0.000789f, 0.000887f, - 0.001069f, 0.001345f, 0.001670f, 0.002167f, 0.003065f, 0.004562f, 0.007660f, 0.014290f, - 0.032135f, 0.081299f, 0.632812f, 0.645996f, 0.648926f, 0.649414f, 0.648926f, 0.649902f, - 0.000109f, 0.000094f, 0.000087f, 0.000082f, 0.000078f, 0.000076f, 0.000074f, 0.000071f, - 0.000069f, 0.000068f, 0.000067f, 0.000066f, 0.000064f, 0.000061f, 0.000058f, 0.000055f, - 0.000053f, 0.000050f, 0.000051f, 0.000046f, 0.000059f, 0.000056f, 0.000057f, 0.000068f, - 0.000078f, 0.000088f, 0.000096f, 0.000096f, 0.000105f, 0.000107f, 0.000128f, 0.000121f, - 0.000133f, 0.000141f, 0.000156f, 0.000151f, 0.000160f, 0.000200f, 0.000209f, 0.000198f, - 0.000222f, 0.000242f, 0.000258f, 0.000275f, 0.000314f, 0.000352f, 0.000410f, 0.000468f, - 0.000537f, 0.000639f, 0.000799f, 0.001002f, 0.001390f, 0.002092f, 0.003466f, 0.006653f, - 0.015305f, 0.048004f, 0.606934f, 0.618652f, 0.622559f, 0.623047f, 0.623535f, 0.624023f, - 0.000084f, 0.000067f, 0.000064f, 0.000062f, 0.000057f, 0.000056f, 0.000053f, 0.000054f, - 0.000051f, 0.000052f, 0.000050f, 0.000050f, 0.000050f, 0.000049f, 0.000048f, 0.000047f, - 0.000046f, 0.000044f, 0.000042f, 0.000040f, 0.000039f, 0.000037f, 0.000035f, 0.000036f, - 0.000037f, 0.000031f, 0.000040f, 0.000041f, 0.000042f, 0.000051f, 0.000058f, 0.000063f, - 0.000067f, 0.000069f, 0.000072f, 0.000079f, 0.000085f, 0.000092f, 0.000093f, 0.000101f, - 0.000107f, 0.000123f, 0.000125f, 0.000139f, 0.000147f, 0.000154f, 0.000181f, 0.000204f, - 0.000229f, 0.000270f, 0.000327f, 0.000425f, 0.000559f, 0.000772f, 0.001265f, 0.002462f, - 0.006191f, 0.022415f, 0.578613f, 0.592285f, 0.595215f, 0.596191f, 0.596191f, 0.597656f, - 0.000008f, 0.000022f, 0.000022f, 0.000024f, 0.000024f, 0.000027f, 0.000028f, 0.000028f, - 0.000028f, 0.000026f, 0.000028f, 0.000029f, 0.000029f, 0.000028f, 0.000029f, 0.000029f, - 0.000029f, 0.000029f, 0.000030f, 0.000030f, 0.000030f, 0.000029f, 0.000028f, 0.000027f, - 0.000026f, 0.000025f, 0.000024f, 0.000023f, 0.000022f, 0.000021f, 0.000020f, 0.000019f, - 0.000021f, 0.000020f, 0.000022f, 0.000026f, 0.000028f, 0.000033f, 0.000037f, 0.000036f, - 0.000039f, 0.000045f, 0.000051f, 0.000046f, 0.000056f, 0.000059f, 0.000061f, 0.000071f, - 0.000084f, 0.000098f, 0.000110f, 0.000133f, 0.000169f, 0.000223f, 0.000356f, 0.000648f, - 0.001702f, 0.007713f, 0.550293f, 0.564453f, 0.566895f, 0.567871f, 0.568359f, 0.568848f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000002f, 0.000003f, 0.000004f, 0.000006f, - 0.000007f, 0.000007f, 0.000008f, 0.000008f, 0.000009f, 0.000010f, 0.000011f, 0.000011f, - 0.000012f, 0.000012f, 0.000013f, 0.000013f, 0.000013f, 0.000014f, 0.000014f, 0.000013f, - 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, - 0.000008f, 0.000008f, 0.000009f, 0.000011f, 0.000014f, 0.000017f, 0.000015f, 0.000018f, - 0.000021f, 0.000022f, 0.000023f, 0.000026f, 0.000035f, 0.000040f, 0.000056f, 0.000089f, - 0.000225f, 0.001332f, 0.520996f, 0.535156f, 0.538086f, 0.540039f, 0.540039f, 0.540039f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000003f, 0.000003f, - 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000001f, 0.000002f, 0.000003f, 0.000003f, - 0.000004f, 0.000017f, 0.491211f, 0.506348f, 0.508789f, 0.510254f, 0.510254f, 0.510742f, - }, - { - 0.064758f, 0.179688f, 0.277344f, 0.358398f, 0.427002f, 0.485107f, 0.535156f, 0.578613f, - 0.615234f, 0.647949f, 0.677734f, 0.703125f, 0.725586f, 0.745605f, 0.763672f, 0.780273f, - 0.795410f, 0.810059f, 0.821777f, 0.833496f, 0.843750f, 0.854004f, 0.862793f, 0.871582f, - 0.879883f, 0.886719f, 0.894043f, 0.900879f, 0.906250f, 0.912109f, 0.917969f, 0.922852f, - 0.927246f, 0.932129f, 0.936523f, 0.940918f, 0.944824f, 0.948242f, 0.951660f, 0.955078f, - 0.958496f, 0.961426f, 0.964844f, 0.967773f, 0.970215f, 0.973145f, 0.975586f, 0.977539f, - 0.979980f, 0.982422f, 0.984863f, 0.986328f, 0.988770f, 0.990234f, 0.992676f, 0.993652f, - 0.995605f, 0.997559f, 0.998535f, 0.996582f, 0.995117f, 0.993652f, 0.992188f, 0.990723f, - 0.040344f, 0.121460f, 0.199341f, 0.272949f, 0.339600f, 0.401123f, 0.455078f, 0.501953f, - 0.546875f, 0.583984f, 0.618164f, 0.648926f, 0.676270f, 0.700195f, 0.723145f, 0.743164f, - 0.761230f, 0.776855f, 0.793457f, 0.806641f, 0.819336f, 0.831543f, 0.842285f, 0.852051f, - 0.861328f, 0.869629f, 0.877930f, 0.886230f, 0.892578f, 0.899902f, 0.905273f, 0.911621f, - 0.917480f, 0.922852f, 0.927246f, 0.932129f, 0.936035f, 0.940430f, 0.945312f, 0.949219f, - 0.952148f, 0.956055f, 0.958984f, 0.961914f, 0.965332f, 0.967773f, 0.970703f, 0.973633f, - 0.976074f, 0.978516f, 0.980957f, 0.983398f, 0.985840f, 0.987305f, 0.989258f, 0.991699f, - 0.993652f, 0.995117f, 0.997070f, 0.995605f, 0.994141f, 0.993164f, 0.991699f, 0.990234f, - 0.027191f, 0.084961f, 0.145630f, 0.206177f, 0.266113f, 0.323242f, 0.377930f, 0.428711f, - 0.474609f, 0.517090f, 0.554688f, 0.591309f, 0.621582f, 0.650391f, 0.676758f, 0.700684f, - 0.723145f, 0.741699f, 0.760254f, 0.776855f, 0.791504f, 0.805664f, 0.818359f, 0.830566f, - 0.841309f, 0.851074f, 0.861816f, 0.870117f, 0.878418f, 0.885254f, 0.892090f, 0.899414f, - 0.906250f, 0.912598f, 0.916992f, 0.922363f, 0.928223f, 0.932617f, 0.937500f, 0.941895f, - 0.945801f, 0.949219f, 0.953613f, 0.957031f, 0.960449f, 0.963379f, 0.966797f, 0.969727f, - 0.971680f, 0.974609f, 0.977539f, 0.979980f, 0.981934f, 0.984375f, 0.986328f, 0.989258f, - 0.991211f, 0.992676f, 0.996094f, 0.994629f, 0.993652f, 0.992188f, 0.990723f, 0.989746f, - 0.019577f, 0.061340f, 0.108337f, 0.156860f, 0.207153f, 0.258789f, 0.310059f, 0.358887f, - 0.405762f, 0.450928f, 0.491211f, 0.530273f, 0.565430f, 0.597656f, 0.627441f, 0.654297f, - 0.680176f, 0.702637f, 0.724121f, 0.743164f, 0.760742f, 0.776855f, 0.791992f, 0.806152f, - 0.817871f, 0.830078f, 0.841797f, 0.852539f, 0.861816f, 0.870117f, 0.878906f, 0.886230f, - 0.893066f, 0.900391f, 0.906738f, 0.912598f, 0.918457f, 0.923340f, 0.928223f, 0.933594f, - 0.938477f, 0.942871f, 0.946777f, 0.950684f, 0.954590f, 0.958496f, 0.960938f, 0.964844f, - 0.967773f, 0.970703f, 0.973633f, 0.976074f, 0.979004f, 0.981445f, 0.983398f, 0.985840f, - 0.987793f, 0.990234f, 0.995117f, 0.993652f, 0.992676f, 0.991699f, 0.990234f, 0.989258f, - 0.014397f, 0.046295f, 0.081543f, 0.120728f, 0.162842f, 0.206177f, 0.250977f, 0.296143f, - 0.342041f, 0.385986f, 0.427979f, 0.468262f, 0.506348f, 0.542480f, 0.575195f, 0.605469f, - 0.633789f, 0.660156f, 0.684570f, 0.706543f, 0.727539f, 0.745117f, 0.763184f, 0.778809f, - 0.793945f, 0.807617f, 0.820312f, 0.833008f, 0.842773f, 0.852539f, 0.862305f, 0.872070f, - 0.879395f, 0.887207f, 0.894531f, 0.900879f, 0.907227f, 0.914551f, 0.919922f, 0.925293f, - 0.930176f, 0.935547f, 0.938965f, 0.943359f, 0.948730f, 0.952637f, 0.956055f, 0.959473f, - 0.962891f, 0.966309f, 0.969238f, 0.972656f, 0.975098f, 0.977539f, 0.980957f, 0.982910f, - 0.984863f, 0.987793f, 0.994141f, 0.993164f, 0.991699f, 0.990723f, 0.989746f, 0.988281f, - 0.010925f, 0.035828f, 0.063660f, 0.094360f, 0.128174f, 0.164551f, 0.203247f, 0.244385f, - 0.285645f, 0.326416f, 0.367432f, 0.409424f, 0.447998f, 0.484131f, 0.520508f, 0.553711f, - 0.584473f, 0.614258f, 0.641113f, 0.666016f, 0.689453f, 0.710938f, 0.730469f, 0.750488f, - 0.766602f, 0.781250f, 0.796387f, 0.809570f, 0.822266f, 0.833496f, 0.844727f, 0.854980f, - 0.864258f, 0.873047f, 0.881348f, 0.889648f, 0.895996f, 0.903809f, 0.910156f, 0.916504f, - 0.921387f, 0.926758f, 0.932129f, 0.937500f, 0.941895f, 0.946777f, 0.950684f, 0.954102f, - 0.958008f, 0.960938f, 0.965332f, 0.968262f, 0.971680f, 0.975098f, 0.977539f, 0.979492f, - 0.982422f, 0.984863f, 0.992676f, 0.991699f, 0.990723f, 0.989746f, 0.988770f, 0.987793f, - 0.008698f, 0.028244f, 0.049866f, 0.074463f, 0.102295f, 0.132935f, 0.165161f, 0.200073f, - 0.236206f, 0.275391f, 0.313477f, 0.352051f, 0.391113f, 0.428955f, 0.465088f, 0.500977f, - 0.534180f, 0.565430f, 0.593750f, 0.622559f, 0.648438f, 0.671875f, 0.694824f, 0.715820f, - 0.734863f, 0.753906f, 0.771484f, 0.784668f, 0.799805f, 0.813477f, 0.825195f, 0.836914f, - 0.847656f, 0.857910f, 0.866699f, 0.875488f, 0.884766f, 0.892090f, 0.898438f, 0.906250f, - 0.913086f, 0.918457f, 0.923828f, 0.929688f, 0.935059f, 0.939941f, 0.944336f, 0.948730f, - 0.952637f, 0.956055f, 0.959961f, 0.963379f, 0.967285f, 0.970703f, 0.973633f, 0.976074f, - 0.979492f, 0.982422f, 0.991211f, 0.990723f, 0.990234f, 0.988770f, 0.987793f, 0.986328f, - 0.007210f, 0.022797f, 0.040039f, 0.060181f, 0.082153f, 0.107300f, 0.134155f, 0.164673f, - 0.196167f, 0.229492f, 0.265381f, 0.301025f, 0.338379f, 0.374756f, 0.411133f, 0.446533f, - 0.481201f, 0.515625f, 0.546387f, 0.576660f, 0.605957f, 0.631348f, 0.656738f, 0.681152f, - 0.702148f, 0.722168f, 0.741699f, 0.758789f, 0.775391f, 0.791016f, 0.803711f, 0.817383f, - 0.829102f, 0.840820f, 0.851562f, 0.860840f, 0.871094f, 0.879395f, 0.887695f, 0.895020f, - 0.901855f, 0.909180f, 0.915527f, 0.921387f, 0.927734f, 0.932129f, 0.937500f, 0.941895f, - 0.947266f, 0.950684f, 0.955078f, 0.958984f, 0.962891f, 0.966797f, 0.969727f, 0.973145f, - 0.976562f, 0.979004f, 0.990234f, 0.989746f, 0.988770f, 0.987793f, 0.986816f, 0.985840f, - 0.005863f, 0.018936f, 0.032898f, 0.049377f, 0.067261f, 0.088257f, 0.110535f, 0.135254f, - 0.162231f, 0.191895f, 0.223389f, 0.255371f, 0.290039f, 0.324707f, 0.359863f, 0.395996f, - 0.429932f, 0.464355f, 0.497314f, 0.529297f, 0.559570f, 0.587891f, 0.616699f, 0.642090f, - 0.665527f, 0.688965f, 0.709961f, 0.729492f, 0.747559f, 0.765625f, 0.780762f, 0.794922f, - 0.809082f, 0.822754f, 0.833984f, 0.844727f, 0.855957f, 0.864746f, 0.875000f, 0.883789f, - 0.891113f, 0.898926f, 0.906250f, 0.912598f, 0.918457f, 0.925293f, 0.930664f, 0.935059f, - 0.940918f, 0.945312f, 0.950195f, 0.954590f, 0.958496f, 0.962402f, 0.965820f, 0.969238f, - 0.972656f, 0.976074f, 0.988770f, 0.988770f, 0.987793f, 0.986816f, 0.985840f, 0.984863f, - 0.004925f, 0.015518f, 0.027451f, 0.041199f, 0.055786f, 0.072998f, 0.091492f, 0.112427f, - 0.135254f, 0.160767f, 0.187500f, 0.216919f, 0.247314f, 0.280273f, 0.313477f, 0.346680f, - 0.381592f, 0.415283f, 0.448730f, 0.481201f, 0.513184f, 0.543945f, 0.573242f, 0.601562f, - 0.627441f, 0.652344f, 0.675293f, 0.697754f, 0.718262f, 0.737793f, 0.754883f, 0.771973f, - 0.787109f, 0.800781f, 0.815430f, 0.828125f, 0.839844f, 0.851074f, 0.860840f, 0.870117f, - 0.879883f, 0.887695f, 0.896484f, 0.902832f, 0.911133f, 0.916992f, 0.922852f, 0.928711f, - 0.934082f, 0.939941f, 0.944336f, 0.948730f, 0.954102f, 0.958008f, 0.961426f, 0.965332f, - 0.969238f, 0.972168f, 0.987305f, 0.987305f, 0.986816f, 0.985840f, 0.984863f, 0.983887f, - 0.004139f, 0.012955f, 0.022781f, 0.034088f, 0.046997f, 0.061005f, 0.076538f, 0.094360f, - 0.113464f, 0.134888f, 0.158203f, 0.183716f, 0.210693f, 0.239990f, 0.270264f, 0.302734f, - 0.334961f, 0.367676f, 0.400635f, 0.434082f, 0.467041f, 0.497803f, 0.528809f, 0.558105f, - 0.586426f, 0.614258f, 0.638672f, 0.663574f, 0.686035f, 0.707520f, 0.728027f, 0.745605f, - 0.762695f, 0.779297f, 0.794434f, 0.808594f, 0.821777f, 0.834473f, 0.845215f, 0.855957f, - 0.866699f, 0.876465f, 0.884766f, 0.892090f, 0.900391f, 0.908203f, 0.915039f, 0.920898f, - 0.927246f, 0.932617f, 0.937988f, 0.943848f, 0.948730f, 0.952637f, 0.957520f, 0.961426f, - 0.965820f, 0.968750f, 0.985840f, 0.985840f, 0.985840f, 0.984375f, 0.983887f, 0.982910f, - 0.003492f, 0.011307f, 0.019608f, 0.028793f, 0.039246f, 0.051544f, 0.064392f, 0.078796f, - 0.095337f, 0.113953f, 0.134033f, 0.155396f, 0.179688f, 0.205200f, 0.232300f, 0.261475f, - 0.291748f, 0.323730f, 0.355225f, 0.387939f, 0.420410f, 0.452637f, 0.483887f, 0.514648f, - 0.544922f, 0.573730f, 0.601074f, 0.626953f, 0.651367f, 0.675293f, 0.697266f, 0.717285f, - 0.736816f, 0.755371f, 0.771973f, 0.786621f, 0.803223f, 0.815430f, 0.828613f, 0.840820f, - 0.851562f, 0.863281f, 0.873047f, 0.880859f, 0.890625f, 0.898438f, 0.905762f, 0.913086f, - 0.919434f, 0.925781f, 0.931641f, 0.937500f, 0.942871f, 0.947754f, 0.952637f, 0.957520f, - 0.960938f, 0.965820f, 0.984375f, 0.984863f, 0.984375f, 0.983398f, 0.982422f, 0.981445f, - 0.002977f, 0.009415f, 0.016708f, 0.024811f, 0.033356f, 0.043457f, 0.054535f, 0.067017f, - 0.080322f, 0.096130f, 0.113708f, 0.132080f, 0.152710f, 0.175415f, 0.199829f, 0.226440f, - 0.253662f, 0.282959f, 0.313232f, 0.343750f, 0.375000f, 0.406982f, 0.439453f, 0.471191f, - 0.501465f, 0.531738f, 0.560547f, 0.587891f, 0.615234f, 0.640625f, 0.664062f, 0.687500f, - 0.708496f, 0.728516f, 0.747559f, 0.765137f, 0.781738f, 0.795898f, 0.811523f, 0.824707f, - 0.836426f, 0.847656f, 0.858887f, 0.869141f, 0.878906f, 0.887695f, 0.895996f, 0.904297f, - 0.911133f, 0.917969f, 0.925293f, 0.931152f, 0.937012f, 0.942383f, 0.947266f, 0.953125f, - 0.957031f, 0.961426f, 0.982910f, 0.983398f, 0.982910f, 0.982422f, 0.981445f, 0.980957f, - 0.002743f, 0.008568f, 0.014305f, 0.021378f, 0.028732f, 0.037201f, 0.046387f, 0.057068f, - 0.068848f, 0.082336f, 0.096924f, 0.113159f, 0.130859f, 0.150146f, 0.171509f, 0.194824f, - 0.219482f, 0.246338f, 0.273926f, 0.302734f, 0.333496f, 0.364502f, 0.395752f, 0.426758f, - 0.458252f, 0.489990f, 0.519531f, 0.548340f, 0.576660f, 0.604004f, 0.630859f, 0.654297f, - 0.678223f, 0.700684f, 0.720215f, 0.740234f, 0.758301f, 0.775391f, 0.790527f, 0.805176f, - 0.818848f, 0.833008f, 0.844238f, 0.855469f, 0.866699f, 0.876953f, 0.886230f, 0.894043f, - 0.902832f, 0.910645f, 0.917480f, 0.924316f, 0.930664f, 0.937012f, 0.941895f, 0.947266f, - 0.952148f, 0.957031f, 0.981445f, 0.982422f, 0.981445f, 0.980957f, 0.980469f, 0.979004f, - 0.002504f, 0.007004f, 0.012634f, 0.018555f, 0.024933f, 0.032654f, 0.040283f, 0.048920f, - 0.059357f, 0.070007f, 0.082642f, 0.096741f, 0.112122f, 0.128906f, 0.147339f, 0.167603f, - 0.189697f, 0.213257f, 0.238770f, 0.265869f, 0.293701f, 0.323242f, 0.354004f, 0.384766f, - 0.415283f, 0.447021f, 0.478516f, 0.507812f, 0.536621f, 0.565918f, 0.593750f, 0.620605f, - 0.645508f, 0.668945f, 0.692383f, 0.712891f, 0.733398f, 0.751465f, 0.769531f, 0.785156f, - 0.801270f, 0.814941f, 0.828125f, 0.841797f, 0.853516f, 0.864746f, 0.874512f, 0.883789f, - 0.893555f, 0.900879f, 0.910156f, 0.917480f, 0.923340f, 0.930664f, 0.936523f, 0.942383f, - 0.947754f, 0.952637f, 0.979492f, 0.980469f, 0.980469f, 0.979492f, 0.978516f, 0.978027f, - 0.002039f, 0.006287f, 0.010864f, 0.016129f, 0.021637f, 0.027786f, 0.034485f, 0.042450f, - 0.051331f, 0.060760f, 0.071594f, 0.082886f, 0.096313f, 0.110840f, 0.126587f, 0.145020f, - 0.164185f, 0.185181f, 0.207520f, 0.232300f, 0.258301f, 0.285889f, 0.314941f, 0.344238f, - 0.374268f, 0.405029f, 0.436035f, 0.466797f, 0.498291f, 0.527344f, 0.555664f, 0.583984f, - 0.611328f, 0.636230f, 0.661133f, 0.684082f, 0.705566f, 0.726562f, 0.745605f, 0.764648f, - 0.781250f, 0.797852f, 0.812500f, 0.825195f, 0.838867f, 0.851074f, 0.862305f, 0.873535f, - 0.883301f, 0.892578f, 0.901367f, 0.908203f, 0.916992f, 0.923828f, 0.931152f, 0.937012f, - 0.942383f, 0.947266f, 0.978027f, 0.978516f, 0.979004f, 0.978027f, 0.977051f, 0.977051f, - 0.001762f, 0.005489f, 0.009804f, 0.013931f, 0.019028f, 0.024445f, 0.030518f, 0.036865f, - 0.044189f, 0.052460f, 0.061432f, 0.071960f, 0.083008f, 0.095642f, 0.109558f, 0.124756f, - 0.141602f, 0.160156f, 0.180664f, 0.202148f, 0.225952f, 0.250977f, 0.278076f, 0.305664f, - 0.334961f, 0.364990f, 0.394775f, 0.425537f, 0.456543f, 0.487061f, 0.517090f, 0.546387f, - 0.575195f, 0.602539f, 0.627930f, 0.653809f, 0.676758f, 0.699707f, 0.721191f, 0.740723f, - 0.759766f, 0.777832f, 0.793945f, 0.809082f, 0.823242f, 0.836426f, 0.849609f, 0.861328f, - 0.872070f, 0.881836f, 0.892578f, 0.900391f, 0.908691f, 0.916992f, 0.924316f, 0.931152f, - 0.937500f, 0.943359f, 0.976074f, 0.977051f, 0.977051f, 0.976562f, 0.976074f, 0.975098f, - 0.001675f, 0.005020f, 0.008400f, 0.012253f, 0.016724f, 0.021469f, 0.026428f, 0.032104f, - 0.039062f, 0.045563f, 0.053741f, 0.062103f, 0.072205f, 0.082947f, 0.094666f, 0.107727f, - 0.122681f, 0.139038f, 0.156250f, 0.176514f, 0.197388f, 0.220581f, 0.244629f, 0.270752f, - 0.297607f, 0.326172f, 0.355957f, 0.386475f, 0.416748f, 0.447754f, 0.478027f, 0.507812f, - 0.538086f, 0.566406f, 0.594727f, 0.621582f, 0.647461f, 0.671387f, 0.694336f, 0.716797f, - 0.737305f, 0.755859f, 0.773438f, 0.791016f, 0.807129f, 0.820801f, 0.834961f, 0.848145f, - 0.860352f, 0.871582f, 0.881836f, 0.891602f, 0.901367f, 0.909180f, 0.917480f, 0.925293f, - 0.932129f, 0.938965f, 0.974609f, 0.975586f, 0.976074f, 0.974609f, 0.974121f, 0.973633f, - 0.001437f, 0.004513f, 0.007427f, 0.010994f, 0.014526f, 0.018829f, 0.023331f, 0.028229f, - 0.034058f, 0.040192f, 0.046844f, 0.054321f, 0.062683f, 0.071716f, 0.082397f, 0.093933f, - 0.106567f, 0.120728f, 0.136230f, 0.153320f, 0.172485f, 0.192627f, 0.214233f, 0.237915f, - 0.263672f, 0.290527f, 0.318115f, 0.347412f, 0.377197f, 0.408203f, 0.438477f, 0.469482f, - 0.499512f, 0.529785f, 0.558594f, 0.586914f, 0.614258f, 0.641602f, 0.665527f, 0.689941f, - 0.711914f, 0.732422f, 0.752930f, 0.771484f, 0.789062f, 0.805664f, 0.819824f, 0.833984f, - 0.847656f, 0.860840f, 0.871094f, 0.881836f, 0.891602f, 0.902344f, 0.910156f, 0.918457f, - 0.926270f, 0.932617f, 0.972168f, 0.973633f, 0.973633f, 0.973145f, 0.973145f, 0.971680f, - 0.001390f, 0.003952f, 0.006779f, 0.009941f, 0.013062f, 0.017029f, 0.020905f, 0.024994f, - 0.029877f, 0.035187f, 0.041077f, 0.047119f, 0.055145f, 0.062500f, 0.071594f, 0.081543f, - 0.092712f, 0.104736f, 0.118530f, 0.133179f, 0.150024f, 0.168091f, 0.187378f, 0.209717f, - 0.232178f, 0.256836f, 0.283447f, 0.311279f, 0.339844f, 0.369873f, 0.399658f, 0.429932f, - 0.461426f, 0.492188f, 0.521973f, 0.551758f, 0.580566f, 0.608887f, 0.635254f, 0.660645f, - 0.685059f, 0.708008f, 0.729492f, 0.750488f, 0.769043f, 0.786621f, 0.802734f, 0.818848f, - 0.832520f, 0.846680f, 0.860352f, 0.871582f, 0.882324f, 0.892578f, 0.902832f, 0.911133f, - 0.919922f, 0.926758f, 0.970703f, 0.971680f, 0.971680f, 0.971680f, 0.971680f, 0.969238f, - 0.001328f, 0.003641f, 0.006138f, 0.008690f, 0.011444f, 0.014786f, 0.018311f, 0.022125f, - 0.026337f, 0.031403f, 0.036011f, 0.041809f, 0.047943f, 0.054901f, 0.062622f, 0.071106f, - 0.081299f, 0.091614f, 0.103455f, 0.116333f, 0.130493f, 0.146484f, 0.164307f, 0.183228f, - 0.204224f, 0.226685f, 0.251221f, 0.277100f, 0.303711f, 0.332764f, 0.361572f, 0.391846f, - 0.422852f, 0.454102f, 0.485352f, 0.515625f, 0.545410f, 0.574707f, 0.603027f, 0.630371f, - 0.656250f, 0.681641f, 0.705078f, 0.726562f, 0.747070f, 0.767578f, 0.784668f, 0.803223f, - 0.818848f, 0.833008f, 0.847656f, 0.860352f, 0.872559f, 0.883301f, 0.894043f, 0.903809f, - 0.913574f, 0.921387f, 0.967773f, 0.970215f, 0.970215f, 0.968750f, 0.969238f, 0.968750f, - 0.001053f, 0.002905f, 0.005432f, 0.007912f, 0.010658f, 0.012901f, 0.016464f, 0.019363f, - 0.023376f, 0.027237f, 0.031799f, 0.036346f, 0.042145f, 0.048248f, 0.054871f, 0.062256f, - 0.070618f, 0.079834f, 0.089844f, 0.101440f, 0.113831f, 0.128174f, 0.143433f, 0.160156f, - 0.179077f, 0.199707f, 0.222046f, 0.245483f, 0.271240f, 0.297363f, 0.325684f, 0.355469f, - 0.385254f, 0.416016f, 0.447754f, 0.479004f, 0.508789f, 0.539551f, 0.570312f, 0.598145f, - 0.626465f, 0.652344f, 0.678223f, 0.702148f, 0.725098f, 0.746094f, 0.765625f, 0.785645f, - 0.803223f, 0.819336f, 0.834961f, 0.848145f, 0.861328f, 0.873535f, 0.884766f, 0.895508f, - 0.905762f, 0.915527f, 0.965332f, 0.967773f, 0.968262f, 0.967773f, 0.967285f, 0.966309f, - 0.001106f, 0.002684f, 0.004913f, 0.006733f, 0.009300f, 0.011955f, 0.014435f, 0.017700f, - 0.020477f, 0.024124f, 0.028091f, 0.032532f, 0.037231f, 0.042511f, 0.048309f, 0.054596f, - 0.061798f, 0.069885f, 0.078857f, 0.089050f, 0.099915f, 0.112183f, 0.125488f, 0.140503f, - 0.157104f, 0.175293f, 0.195068f, 0.216309f, 0.240356f, 0.265381f, 0.291748f, 0.319580f, - 0.348633f, 0.379150f, 0.410156f, 0.441406f, 0.472900f, 0.503418f, 0.534668f, 0.565430f, - 0.594727f, 0.622070f, 0.649902f, 0.676270f, 0.700195f, 0.723633f, 0.746094f, 0.766602f, - 0.786133f, 0.802734f, 0.819824f, 0.835449f, 0.849609f, 0.863281f, 0.875977f, 0.887695f, - 0.898438f, 0.908203f, 0.962891f, 0.965820f, 0.966309f, 0.965332f, 0.964844f, 0.964355f, - 0.000782f, 0.002707f, 0.004574f, 0.006184f, 0.008286f, 0.010681f, 0.012878f, 0.015640f, - 0.018478f, 0.021912f, 0.025208f, 0.028976f, 0.032867f, 0.037598f, 0.042938f, 0.048370f, - 0.054443f, 0.061432f, 0.069214f, 0.077515f, 0.087402f, 0.098145f, 0.109497f, 0.122803f, - 0.137329f, 0.153564f, 0.171509f, 0.190918f, 0.212158f, 0.235352f, 0.259766f, 0.286133f, - 0.314209f, 0.343262f, 0.373535f, 0.404297f, 0.436279f, 0.467773f, 0.499512f, 0.530273f, - 0.561523f, 0.590820f, 0.620117f, 0.647461f, 0.674316f, 0.699219f, 0.722656f, 0.745605f, - 0.766602f, 0.785645f, 0.804688f, 0.821777f, 0.836426f, 0.852051f, 0.865234f, 0.878418f, - 0.890625f, 0.901855f, 0.959961f, 0.962891f, 0.963867f, 0.963379f, 0.962402f, 0.962402f, - 0.000787f, 0.002195f, 0.004250f, 0.005775f, 0.007774f, 0.009445f, 0.011795f, 0.013725f, - 0.016678f, 0.019531f, 0.022018f, 0.025665f, 0.029495f, 0.033142f, 0.037598f, 0.042664f, - 0.048248f, 0.053772f, 0.060699f, 0.067993f, 0.076416f, 0.085815f, 0.095764f, 0.107422f, - 0.120239f, 0.134277f, 0.150269f, 0.167358f, 0.186646f, 0.207764f, 0.230347f, 0.255127f, - 0.281250f, 0.308838f, 0.337891f, 0.368408f, 0.399414f, 0.431396f, 0.463135f, 0.495605f, - 0.526855f, 0.558594f, 0.588379f, 0.618652f, 0.646973f, 0.673828f, 0.699707f, 0.723633f, - 0.746094f, 0.767090f, 0.788086f, 0.806641f, 0.823730f, 0.840332f, 0.854980f, 0.869141f, - 0.881836f, 0.893555f, 0.957520f, 0.960938f, 0.960938f, 0.961426f, 0.960449f, 0.959961f, - 0.000765f, 0.002207f, 0.003666f, 0.005177f, 0.006973f, 0.008301f, 0.010704f, 0.012794f, - 0.015015f, 0.017303f, 0.020309f, 0.022568f, 0.026123f, 0.029587f, 0.033325f, 0.037659f, - 0.042206f, 0.047516f, 0.053223f, 0.059814f, 0.067017f, 0.075195f, 0.083801f, 0.094055f, - 0.105042f, 0.117737f, 0.131470f, 0.146851f, 0.163940f, 0.182739f, 0.203369f, 0.225952f, - 0.250244f, 0.276367f, 0.304199f, 0.333008f, 0.364258f, 0.395264f, 0.427002f, 0.459961f, - 0.491699f, 0.524414f, 0.555664f, 0.586914f, 0.617676f, 0.645996f, 0.673340f, 0.699707f, - 0.724121f, 0.748047f, 0.770020f, 0.790039f, 0.809082f, 0.827148f, 0.842773f, 0.858398f, - 0.873047f, 0.885742f, 0.954102f, 0.958008f, 0.958496f, 0.958496f, 0.958496f, 0.957520f, - 0.000586f, 0.001937f, 0.003107f, 0.004745f, 0.006168f, 0.007610f, 0.009590f, 0.011345f, - 0.013321f, 0.015587f, 0.017593f, 0.020294f, 0.023346f, 0.026154f, 0.029205f, 0.033234f, - 0.037415f, 0.041962f, 0.046906f, 0.052673f, 0.058533f, 0.065796f, 0.073669f, 0.082642f, - 0.092346f, 0.103027f, 0.115234f, 0.128784f, 0.143799f, 0.160889f, 0.179199f, 0.199585f, - 0.221802f, 0.246094f, 0.271973f, 0.299805f, 0.329102f, 0.359863f, 0.391357f, 0.423340f, - 0.456299f, 0.490234f, 0.522949f, 0.555176f, 0.586426f, 0.617188f, 0.645996f, 0.675293f, - 0.701660f, 0.726074f, 0.750488f, 0.773926f, 0.793945f, 0.812988f, 0.831543f, 0.847656f, - 0.862793f, 0.877441f, 0.951660f, 0.955078f, 0.955566f, 0.955566f, 0.955078f, 0.954590f, - 0.000678f, 0.001864f, 0.003138f, 0.004333f, 0.005707f, 0.006893f, 0.008224f, 0.009850f, - 0.012215f, 0.013954f, 0.015747f, 0.018219f, 0.020584f, 0.023148f, 0.026047f, 0.029434f, - 0.033020f, 0.037018f, 0.041626f, 0.046509f, 0.051910f, 0.058105f, 0.064636f, 0.072510f, - 0.080750f, 0.090149f, 0.100891f, 0.112549f, 0.126343f, 0.141113f, 0.157593f, 0.175537f, - 0.195801f, 0.218018f, 0.242554f, 0.268311f, 0.295898f, 0.325195f, 0.355713f, 0.388184f, - 0.421143f, 0.454834f, 0.488281f, 0.522949f, 0.554199f, 0.587402f, 0.618164f, 0.648438f, - 0.676758f, 0.704102f, 0.730957f, 0.754395f, 0.776855f, 0.798340f, 0.817871f, 0.836426f, - 0.852051f, 0.868164f, 0.948242f, 0.952637f, 0.953125f, 0.952637f, 0.952148f, 0.951660f, - 0.000470f, 0.001578f, 0.002934f, 0.003838f, 0.005032f, 0.006310f, 0.007725f, 0.008972f, - 0.010826f, 0.012657f, 0.014359f, 0.015991f, 0.018402f, 0.020721f, 0.023102f, 0.026230f, - 0.029495f, 0.032867f, 0.036743f, 0.040680f, 0.045654f, 0.050812f, 0.056763f, 0.063477f, - 0.071045f, 0.078918f, 0.088440f, 0.098938f, 0.110657f, 0.123535f, 0.138062f, 0.154175f, - 0.172363f, 0.192627f, 0.214478f, 0.238770f, 0.264404f, 0.292236f, 0.322266f, 0.353271f, - 0.385742f, 0.419189f, 0.453857f, 0.487549f, 0.521484f, 0.555664f, 0.588867f, 0.621094f, - 0.651367f, 0.680176f, 0.708008f, 0.733887f, 0.759766f, 0.780762f, 0.802734f, 0.821289f, - 0.840820f, 0.858398f, 0.943848f, 0.949219f, 0.949707f, 0.949707f, 0.949707f, 0.949219f, - 0.000485f, 0.001689f, 0.002386f, 0.003698f, 0.004547f, 0.005936f, 0.006851f, 0.008217f, - 0.009834f, 0.011055f, 0.012810f, 0.014473f, 0.016449f, 0.018509f, 0.020950f, 0.023209f, - 0.025940f, 0.029114f, 0.032410f, 0.036133f, 0.040161f, 0.044861f, 0.050018f, 0.055664f, - 0.061859f, 0.069153f, 0.077515f, 0.086365f, 0.096680f, 0.108093f, 0.120605f, 0.135132f, - 0.151489f, 0.169556f, 0.189209f, 0.211426f, 0.235352f, 0.261475f, 0.289307f, 0.319580f, - 0.351074f, 0.384521f, 0.418701f, 0.452881f, 0.487549f, 0.522461f, 0.556641f, 0.591309f, - 0.623535f, 0.653809f, 0.684570f, 0.712891f, 0.739258f, 0.764160f, 0.787109f, 0.809570f, - 0.829102f, 0.847168f, 0.940918f, 0.945801f, 0.946289f, 0.946777f, 0.946777f, 0.945312f, - 0.000620f, 0.001351f, 0.002413f, 0.003273f, 0.004307f, 0.004971f, 0.006138f, 0.007542f, - 0.008835f, 0.009972f, 0.011581f, 0.013069f, 0.014717f, 0.016495f, 0.018738f, 0.020691f, - 0.023315f, 0.025879f, 0.028793f, 0.031860f, 0.035309f, 0.039246f, 0.043762f, 0.048950f, - 0.054474f, 0.060669f, 0.067932f, 0.075378f, 0.084351f, 0.094055f, 0.105774f, 0.118469f, - 0.132690f, 0.148315f, 0.166504f, 0.186401f, 0.208130f, 0.232544f, 0.258789f, 0.287109f, - 0.317627f, 0.349854f, 0.383057f, 0.417725f, 0.453125f, 0.488770f, 0.523926f, 0.559082f, - 0.594238f, 0.627441f, 0.659180f, 0.689941f, 0.719238f, 0.745117f, 0.770508f, 0.794434f, - 0.815430f, 0.836914f, 0.936523f, 0.941895f, 0.942871f, 0.942871f, 0.942871f, 0.942383f, - 0.000404f, 0.001095f, 0.002087f, 0.002983f, 0.003986f, 0.004673f, 0.005844f, 0.006878f, - 0.007740f, 0.008873f, 0.010323f, 0.011757f, 0.013176f, 0.014915f, 0.016586f, 0.018585f, - 0.020523f, 0.022720f, 0.025391f, 0.028244f, 0.031219f, 0.034821f, 0.038788f, 0.042908f, - 0.047943f, 0.053040f, 0.058960f, 0.066162f, 0.073547f, 0.082397f, 0.092285f, 0.102844f, - 0.115234f, 0.129883f, 0.146118f, 0.163452f, 0.183350f, 0.205688f, 0.229614f, 0.256592f, - 0.285156f, 0.316162f, 0.348633f, 0.383057f, 0.418457f, 0.454590f, 0.490967f, 0.526855f, - 0.563477f, 0.598633f, 0.632812f, 0.665527f, 0.696777f, 0.726074f, 0.752930f, 0.779297f, - 0.803223f, 0.825684f, 0.933105f, 0.938477f, 0.938477f, 0.938965f, 0.938477f, 0.938477f, - 0.000415f, 0.000864f, 0.001907f, 0.002775f, 0.003519f, 0.004204f, 0.005352f, 0.006237f, - 0.007019f, 0.008064f, 0.009239f, 0.010483f, 0.011742f, 0.013130f, 0.014877f, 0.016571f, - 0.018494f, 0.020126f, 0.022537f, 0.024826f, 0.027649f, 0.030701f, 0.033875f, 0.037964f, - 0.042114f, 0.046356f, 0.051605f, 0.057587f, 0.064209f, 0.071777f, 0.080261f, 0.089722f, - 0.100952f, 0.113220f, 0.127075f, 0.143066f, 0.160767f, 0.180664f, 0.202759f, 0.227417f, - 0.254395f, 0.284180f, 0.315674f, 0.348633f, 0.383789f, 0.420166f, 0.457275f, 0.494385f, - 0.531250f, 0.569336f, 0.605469f, 0.639160f, 0.672363f, 0.705078f, 0.735352f, 0.762207f, - 0.788574f, 0.811523f, 0.928711f, 0.934082f, 0.934570f, 0.935059f, 0.935059f, 0.935059f, - 0.000236f, 0.001136f, 0.001664f, 0.002502f, 0.003187f, 0.004082f, 0.004631f, 0.005386f, - 0.006275f, 0.007385f, 0.008217f, 0.009453f, 0.010567f, 0.011787f, 0.013115f, 0.014420f, - 0.016083f, 0.017944f, 0.019867f, 0.022079f, 0.024414f, 0.026962f, 0.029755f, 0.033112f, - 0.036926f, 0.040771f, 0.045258f, 0.050232f, 0.056183f, 0.062500f, 0.069946f, 0.078430f, - 0.087708f, 0.098389f, 0.110779f, 0.124634f, 0.140259f, 0.158203f, 0.178223f, 0.200928f, - 0.225708f, 0.253174f, 0.282715f, 0.315430f, 0.349365f, 0.385254f, 0.422363f, 0.460938f, - 0.499023f, 0.537109f, 0.574707f, 0.612305f, 0.646484f, 0.682129f, 0.713867f, 0.745117f, - 0.772461f, 0.799316f, 0.923828f, 0.930176f, 0.930664f, 0.931152f, 0.930664f, 0.930664f, - 0.000229f, 0.000964f, 0.001582f, 0.002182f, 0.002838f, 0.003653f, 0.004341f, 0.004921f, - 0.005615f, 0.006626f, 0.007423f, 0.008545f, 0.009483f, 0.010666f, 0.011612f, 0.013000f, - 0.014275f, 0.015900f, 0.017487f, 0.019333f, 0.021484f, 0.023773f, 0.026276f, 0.028992f, - 0.032135f, 0.035492f, 0.039398f, 0.044037f, 0.049072f, 0.054443f, 0.061035f, 0.067871f, - 0.076111f, 0.085632f, 0.096252f, 0.108154f, 0.122253f, 0.138306f, 0.156006f, 0.175903f, - 0.199219f, 0.224243f, 0.251953f, 0.282715f, 0.315918f, 0.350830f, 0.387451f, 0.425781f, - 0.465332f, 0.504395f, 0.544434f, 0.583008f, 0.620117f, 0.657715f, 0.692383f, 0.725098f, - 0.755371f, 0.783691f, 0.919434f, 0.925781f, 0.926270f, 0.926758f, 0.926758f, 0.925781f, - 0.000410f, 0.000856f, 0.001542f, 0.001844f, 0.002565f, 0.003380f, 0.003971f, 0.004246f, - 0.005047f, 0.005863f, 0.006653f, 0.007744f, 0.008568f, 0.009407f, 0.010529f, 0.011482f, - 0.012657f, 0.013924f, 0.015602f, 0.017105f, 0.018997f, 0.020859f, 0.022980f, 0.025192f, - 0.028030f, 0.031036f, 0.034515f, 0.038300f, 0.042236f, 0.047180f, 0.052795f, 0.059113f, - 0.065857f, 0.074097f, 0.083374f, 0.094360f, 0.105896f, 0.119873f, 0.135620f, 0.154175f, - 0.174072f, 0.197632f, 0.223267f, 0.251465f, 0.283447f, 0.317139f, 0.353760f, 0.391113f, - 0.431152f, 0.470703f, 0.512207f, 0.552734f, 0.592285f, 0.631348f, 0.669434f, 0.704590f, - 0.737793f, 0.768555f, 0.913574f, 0.919922f, 0.920898f, 0.920898f, 0.921387f, 0.921387f, - 0.000214f, 0.000619f, 0.001172f, 0.001941f, 0.002228f, 0.002960f, 0.003490f, 0.003994f, - 0.004761f, 0.005180f, 0.005806f, 0.006622f, 0.007565f, 0.008301f, 0.009262f, 0.010170f, - 0.011208f, 0.012482f, 0.013855f, 0.015060f, 0.016739f, 0.018311f, 0.020248f, 0.022034f, - 0.024597f, 0.027084f, 0.030045f, 0.033051f, 0.036743f, 0.041016f, 0.045807f, 0.050964f, - 0.056946f, 0.063904f, 0.071899f, 0.080994f, 0.091675f, 0.103699f, 0.117920f, 0.133667f, - 0.151978f, 0.172729f, 0.196533f, 0.222534f, 0.252197f, 0.284424f, 0.319580f, 0.356689f, - 0.396973f, 0.437500f, 0.479492f, 0.521484f, 0.562500f, 0.604004f, 0.644043f, 0.682129f, - 0.718262f, 0.751465f, 0.907715f, 0.915039f, 0.916016f, 0.916504f, 0.916504f, 0.916504f, - 0.000405f, 0.000760f, 0.001116f, 0.001688f, 0.002180f, 0.002670f, 0.003313f, 0.003569f, - 0.003979f, 0.004543f, 0.005466f, 0.005985f, 0.006699f, 0.007359f, 0.008102f, 0.009094f, - 0.009949f, 0.011055f, 0.012047f, 0.013412f, 0.014488f, 0.016068f, 0.017532f, 0.019348f, - 0.021210f, 0.023834f, 0.025986f, 0.028854f, 0.031891f, 0.035339f, 0.039490f, 0.043976f, - 0.049347f, 0.055084f, 0.061951f, 0.069763f, 0.078918f, 0.089478f, 0.101379f, 0.115479f, - 0.131592f, 0.150024f, 0.171387f, 0.195068f, 0.222900f, 0.252686f, 0.286621f, 0.323242f, - 0.362061f, 0.402588f, 0.445312f, 0.488770f, 0.532715f, 0.575684f, 0.618652f, 0.659180f, - 0.698242f, 0.734375f, 0.901367f, 0.909180f, 0.911133f, 0.910645f, 0.911133f, 0.910645f, - 0.000218f, 0.000539f, 0.001187f, 0.001617f, 0.001987f, 0.002316f, 0.002666f, 0.003176f, - 0.003841f, 0.004425f, 0.004917f, 0.005402f, 0.005768f, 0.006462f, 0.007233f, 0.008018f, - 0.008575f, 0.009758f, 0.010582f, 0.011520f, 0.012756f, 0.013832f, 0.015312f, 0.016968f, - 0.018509f, 0.020279f, 0.022644f, 0.024857f, 0.027740f, 0.030472f, 0.033783f, 0.037567f, - 0.042175f, 0.047150f, 0.052979f, 0.059601f, 0.067505f, 0.076538f, 0.087158f, 0.099243f, - 0.113281f, 0.129272f, 0.148315f, 0.170532f, 0.194702f, 0.223267f, 0.254639f, 0.289795f, - 0.327393f, 0.368408f, 0.410889f, 0.455322f, 0.499756f, 0.544434f, 0.590332f, 0.633789f, - 0.676270f, 0.716309f, 0.895508f, 0.902344f, 0.903809f, 0.905762f, 0.903809f, 0.904297f, - 0.000184f, 0.000612f, 0.001122f, 0.001464f, 0.001848f, 0.002150f, 0.002514f, 0.002651f, - 0.003391f, 0.003666f, 0.004368f, 0.004677f, 0.005219f, 0.005882f, 0.006531f, 0.007019f, - 0.007675f, 0.008530f, 0.009224f, 0.010269f, 0.011017f, 0.012146f, 0.013321f, 0.014626f, - 0.016098f, 0.017639f, 0.019440f, 0.021317f, 0.023773f, 0.026123f, 0.029144f, 0.032410f, - 0.036072f, 0.040314f, 0.045013f, 0.051086f, 0.057587f, 0.065308f, 0.074402f, 0.084961f, - 0.097107f, 0.111267f, 0.127930f, 0.147217f, 0.169556f, 0.195312f, 0.224365f, 0.257568f, - 0.294189f, 0.333496f, 0.375977f, 0.420166f, 0.467041f, 0.514160f, 0.561035f, 0.607422f, - 0.652344f, 0.695312f, 0.888672f, 0.896484f, 0.897461f, 0.897461f, 0.897949f, 0.897949f, - 0.000159f, 0.000537f, 0.000830f, 0.001206f, 0.001578f, 0.001760f, 0.002050f, 0.002504f, - 0.002951f, 0.003397f, 0.003674f, 0.004238f, 0.004520f, 0.005245f, 0.005692f, 0.006138f, - 0.006748f, 0.007240f, 0.008087f, 0.008728f, 0.009636f, 0.010437f, 0.011543f, 0.012611f, - 0.013763f, 0.015266f, 0.016617f, 0.018433f, 0.020248f, 0.022354f, 0.024887f, 0.027390f, - 0.030716f, 0.034454f, 0.038422f, 0.043365f, 0.048950f, 0.055511f, 0.062988f, 0.072021f, - 0.082336f, 0.094727f, 0.109375f, 0.125977f, 0.145874f, 0.169556f, 0.195679f, 0.226929f, - 0.260986f, 0.299805f, 0.341309f, 0.385498f, 0.432129f, 0.480957f, 0.529297f, 0.579102f, - 0.627441f, 0.673828f, 0.881348f, 0.889160f, 0.890625f, 0.891113f, 0.891602f, 0.891113f, - 0.000204f, 0.000566f, 0.000741f, 0.001033f, 0.001378f, 0.001599f, 0.001961f, 0.002354f, - 0.002609f, 0.002974f, 0.003300f, 0.003609f, 0.004101f, 0.004463f, 0.004906f, 0.005337f, - 0.006020f, 0.006290f, 0.007023f, 0.007656f, 0.008301f, 0.009140f, 0.009918f, 0.010933f, - 0.011940f, 0.013107f, 0.014252f, 0.015656f, 0.017136f, 0.019058f, 0.021057f, 0.023209f, - 0.025940f, 0.029190f, 0.032715f, 0.036591f, 0.041138f, 0.046661f, 0.053253f, 0.060944f, - 0.069702f, 0.080444f, 0.092651f, 0.107788f, 0.124695f, 0.145630f, 0.169189f, 0.197632f, - 0.229736f, 0.266113f, 0.306396f, 0.350586f, 0.397217f, 0.447021f, 0.497803f, 0.549805f, - 0.600586f, 0.650391f, 0.872559f, 0.881836f, 0.882812f, 0.883301f, 0.884277f, 0.884277f, - 0.000240f, 0.000349f, 0.000795f, 0.000892f, 0.001151f, 0.001377f, 0.001773f, 0.001984f, - 0.002415f, 0.002602f, 0.002932f, 0.003168f, 0.003483f, 0.003906f, 0.004257f, 0.004681f, - 0.005173f, 0.005596f, 0.006119f, 0.006550f, 0.007126f, 0.007759f, 0.008522f, 0.009270f, - 0.010086f, 0.011108f, 0.012138f, 0.013199f, 0.014549f, 0.015884f, 0.017776f, 0.019623f, - 0.022003f, 0.024384f, 0.027237f, 0.030624f, 0.034515f, 0.039215f, 0.044342f, 0.050873f, - 0.058411f, 0.067017f, 0.078003f, 0.090332f, 0.105530f, 0.123718f, 0.144775f, 0.170410f, - 0.200195f, 0.234131f, 0.272461f, 0.315674f, 0.362305f, 0.412354f, 0.465332f, 0.518555f, - 0.572754f, 0.626465f, 0.863770f, 0.873047f, 0.875488f, 0.875488f, 0.875977f, 0.875977f, - 0.000102f, 0.000298f, 0.000604f, 0.000950f, 0.001089f, 0.001472f, 0.001760f, 0.001823f, - 0.001903f, 0.002325f, 0.002611f, 0.002775f, 0.003185f, 0.003405f, 0.003674f, 0.004005f, - 0.004406f, 0.004814f, 0.005203f, 0.005665f, 0.006062f, 0.006702f, 0.007317f, 0.007881f, - 0.008560f, 0.009239f, 0.010193f, 0.010994f, 0.012161f, 0.013588f, 0.015068f, 0.016479f, - 0.018250f, 0.020386f, 0.022781f, 0.025665f, 0.028809f, 0.032501f, 0.037048f, 0.042297f, - 0.048553f, 0.055908f, 0.065491f, 0.075378f, 0.088501f, 0.104248f, 0.122742f, 0.145874f, - 0.171997f, 0.203247f, 0.239990f, 0.281250f, 0.326904f, 0.376953f, 0.430176f, 0.486328f, - 0.542480f, 0.600586f, 0.855469f, 0.864746f, 0.866211f, 0.867188f, 0.867188f, 0.867188f, - 0.000000f, 0.000357f, 0.000576f, 0.000692f, 0.001013f, 0.001069f, 0.001383f, 0.001702f, - 0.001789f, 0.002102f, 0.002182f, 0.002377f, 0.002686f, 0.002985f, 0.003347f, 0.003359f, - 0.003782f, 0.004036f, 0.004436f, 0.004749f, 0.005169f, 0.005672f, 0.006145f, 0.006649f, - 0.007187f, 0.007828f, 0.008644f, 0.009529f, 0.010269f, 0.011200f, 0.012337f, 0.013596f, - 0.015038f, 0.017044f, 0.018784f, 0.021011f, 0.023727f, 0.026871f, 0.030457f, 0.034637f, - 0.039978f, 0.046478f, 0.053436f, 0.062622f, 0.073730f, 0.086792f, 0.102661f, 0.122437f, - 0.146240f, 0.174561f, 0.208252f, 0.247437f, 0.291748f, 0.341064f, 0.395020f, 0.451904f, - 0.511230f, 0.571777f, 0.844238f, 0.854980f, 0.857422f, 0.858887f, 0.857910f, 0.857910f, - 0.000101f, 0.000326f, 0.000535f, 0.000683f, 0.000848f, 0.001161f, 0.001184f, 0.001284f, - 0.001576f, 0.001701f, 0.001839f, 0.002167f, 0.002321f, 0.002584f, 0.002645f, 0.002941f, - 0.003141f, 0.003538f, 0.003817f, 0.004112f, 0.004395f, 0.004646f, 0.005165f, 0.005531f, - 0.006096f, 0.006496f, 0.007217f, 0.007767f, 0.008629f, 0.009163f, 0.010239f, 0.011276f, - 0.012611f, 0.013779f, 0.015213f, 0.017120f, 0.019379f, 0.021606f, 0.024994f, 0.028351f, - 0.032379f, 0.037201f, 0.043640f, 0.050903f, 0.060120f, 0.071045f, 0.084900f, 0.101868f, - 0.122559f, 0.147827f, 0.178223f, 0.214722f, 0.257080f, 0.305664f, 0.358887f, 0.416992f, - 0.478027f, 0.542969f, 0.834473f, 0.845215f, 0.847656f, 0.847656f, 0.847656f, 0.848633f, - 0.000092f, 0.000316f, 0.000410f, 0.000556f, 0.000808f, 0.000918f, 0.001094f, 0.001287f, - 0.001309f, 0.001411f, 0.001671f, 0.001780f, 0.001909f, 0.002092f, 0.002274f, 0.002523f, - 0.002733f, 0.002974f, 0.003101f, 0.003401f, 0.003677f, 0.003956f, 0.004311f, 0.004551f, - 0.004940f, 0.005444f, 0.005768f, 0.006451f, 0.006977f, 0.007568f, 0.008270f, 0.009201f, - 0.010170f, 0.011230f, 0.012566f, 0.013939f, 0.015503f, 0.017761f, 0.020111f, 0.022873f, - 0.025940f, 0.029938f, 0.035217f, 0.040985f, 0.048431f, 0.057770f, 0.069092f, 0.083618f, - 0.100891f, 0.123047f, 0.150146f, 0.183838f, 0.223633f, 0.269531f, 0.322510f, 0.381348f, - 0.444824f, 0.511719f, 0.823730f, 0.834473f, 0.835938f, 0.836914f, 0.836914f, 0.837402f, - 0.000240f, 0.000273f, 0.000326f, 0.000564f, 0.000682f, 0.000807f, 0.000854f, 0.000949f, - 0.001139f, 0.001238f, 0.001404f, 0.001548f, 0.001637f, 0.001840f, 0.001893f, 0.002077f, - 0.002321f, 0.002434f, 0.002642f, 0.002821f, 0.003044f, 0.003271f, 0.003649f, 0.003763f, - 0.004208f, 0.004448f, 0.004986f, 0.005169f, 0.005657f, 0.006279f, 0.006680f, 0.007442f, - 0.008194f, 0.008881f, 0.009895f, 0.010918f, 0.012138f, 0.013924f, 0.015915f, 0.018112f, - 0.020645f, 0.023743f, 0.027817f, 0.032745f, 0.038361f, 0.045990f, 0.055481f, 0.066895f, - 0.082031f, 0.100769f, 0.124573f, 0.154541f, 0.190796f, 0.235107f, 0.286133f, 0.344238f, - 0.408936f, 0.478271f, 0.810547f, 0.822266f, 0.824707f, 0.825195f, 0.825684f, 0.825684f, - 0.000115f, 0.000222f, 0.000252f, 0.000524f, 0.000574f, 0.000673f, 0.000869f, 0.000928f, - 0.000963f, 0.001022f, 0.001246f, 0.001292f, 0.001404f, 0.001477f, 0.001652f, 0.001811f, - 0.001822f, 0.002058f, 0.002237f, 0.002371f, 0.002588f, 0.002645f, 0.003019f, 0.003080f, - 0.003506f, 0.003689f, 0.003904f, 0.004383f, 0.004707f, 0.005020f, 0.005386f, 0.006023f, - 0.006451f, 0.007038f, 0.007809f, 0.008911f, 0.009949f, 0.011200f, 0.012222f, 0.014137f, - 0.016068f, 0.018692f, 0.021683f, 0.025314f, 0.029861f, 0.035889f, 0.043335f, 0.052582f, - 0.065186f, 0.080627f, 0.101501f, 0.127441f, 0.159912f, 0.200806f, 0.250000f, 0.307129f, - 0.371582f, 0.444580f, 0.798340f, 0.809570f, 0.811523f, 0.812988f, 0.812988f, 0.812988f, - 0.000000f, 0.000211f, 0.000204f, 0.000474f, 0.000555f, 0.000583f, 0.000600f, 0.000593f, - 0.000812f, 0.000865f, 0.000941f, 0.001013f, 0.001162f, 0.001348f, 0.001418f, 0.001465f, - 0.001616f, 0.001722f, 0.001856f, 0.001888f, 0.002048f, 0.002321f, 0.002396f, 0.002632f, - 0.002821f, 0.002974f, 0.003265f, 0.003477f, 0.003632f, 0.004051f, 0.004299f, 0.004700f, - 0.005238f, 0.005592f, 0.006199f, 0.006756f, 0.007614f, 0.008324f, 0.009727f, 0.010811f, - 0.012337f, 0.014168f, 0.016434f, 0.019257f, 0.022858f, 0.027451f, 0.033295f, 0.040619f, - 0.050690f, 0.063416f, 0.080261f, 0.102295f, 0.131104f, 0.168335f, 0.214355f, 0.270508f, - 0.334717f, 0.408936f, 0.783691f, 0.795898f, 0.798340f, 0.799316f, 0.800293f, 0.800293f, - 0.000174f, 0.000090f, 0.000281f, 0.000397f, 0.000401f, 0.000450f, 0.000488f, 0.000640f, - 0.000674f, 0.000713f, 0.000753f, 0.000845f, 0.000872f, 0.001020f, 0.001115f, 0.001264f, - 0.001327f, 0.001373f, 0.001520f, 0.001616f, 0.001767f, 0.001875f, 0.001968f, 0.002090f, - 0.002232f, 0.002333f, 0.002472f, 0.002802f, 0.002926f, 0.003189f, 0.003569f, 0.003752f, - 0.004009f, 0.004513f, 0.004860f, 0.005375f, 0.005997f, 0.006561f, 0.007378f, 0.008347f, - 0.009384f, 0.010612f, 0.012466f, 0.014526f, 0.017075f, 0.020447f, 0.024887f, 0.030533f, - 0.038300f, 0.048584f, 0.062042f, 0.080383f, 0.104736f, 0.137329f, 0.180176f, 0.232544f, - 0.296875f, 0.371338f, 0.769043f, 0.781250f, 0.784180f, 0.784668f, 0.786133f, 0.786133f, - 0.000025f, 0.000135f, 0.000154f, 0.000260f, 0.000353f, 0.000364f, 0.000380f, 0.000520f, - 0.000548f, 0.000587f, 0.000712f, 0.000735f, 0.000772f, 0.000822f, 0.000886f, 0.001004f, - 0.000946f, 0.001115f, 0.001177f, 0.001266f, 0.001454f, 0.001527f, 0.001575f, 0.001680f, - 0.001883f, 0.001961f, 0.002043f, 0.002193f, 0.002281f, 0.002520f, 0.002712f, 0.003021f, - 0.003147f, 0.003561f, 0.003786f, 0.004116f, 0.004570f, 0.005058f, 0.005634f, 0.006165f, - 0.007095f, 0.008049f, 0.009201f, 0.010674f, 0.012550f, 0.014854f, 0.018051f, 0.022385f, - 0.027908f, 0.035522f, 0.046295f, 0.061035f, 0.081238f, 0.109131f, 0.146729f, 0.197021f, - 0.258301f, 0.333008f, 0.752441f, 0.766113f, 0.768555f, 0.769531f, 0.770020f, 0.769531f, - 0.000000f, 0.000121f, 0.000209f, 0.000291f, 0.000337f, 0.000307f, 0.000324f, 0.000415f, - 0.000426f, 0.000453f, 0.000491f, 0.000573f, 0.000644f, 0.000650f, 0.000781f, 0.000746f, - 0.000830f, 0.000803f, 0.000997f, 0.001017f, 0.001020f, 0.001158f, 0.001241f, 0.001317f, - 0.001375f, 0.001432f, 0.001524f, 0.001656f, 0.001858f, 0.001955f, 0.002050f, 0.002274f, - 0.002460f, 0.002724f, 0.002831f, 0.003050f, 0.003441f, 0.003790f, 0.004162f, 0.004623f, - 0.005219f, 0.005951f, 0.006721f, 0.007729f, 0.008926f, 0.010620f, 0.013000f, 0.015686f, - 0.019852f, 0.025436f, 0.033295f, 0.044617f, 0.060608f, 0.083313f, 0.116211f, 0.161499f, - 0.220093f, 0.293945f, 0.734863f, 0.749512f, 0.752441f, 0.752930f, 0.753906f, 0.753906f, - 0.000000f, 0.000121f, 0.000118f, 0.000246f, 0.000233f, 0.000252f, 0.000338f, 0.000282f, - 0.000353f, 0.000355f, 0.000448f, 0.000435f, 0.000464f, 0.000530f, 0.000578f, 0.000649f, - 0.000677f, 0.000710f, 0.000749f, 0.000792f, 0.000881f, 0.000903f, 0.000967f, 0.001049f, - 0.001041f, 0.001100f, 0.001176f, 0.001254f, 0.001402f, 0.001451f, 0.001697f, 0.001674f, - 0.001804f, 0.001914f, 0.002195f, 0.002451f, 0.002474f, 0.002758f, 0.003029f, 0.003483f, - 0.003824f, 0.004272f, 0.004833f, 0.005573f, 0.006477f, 0.007629f, 0.009041f, 0.010918f, - 0.013573f, 0.017319f, 0.022842f, 0.031036f, 0.043030f, 0.061096f, 0.088440f, 0.127563f, - 0.182861f, 0.254395f, 0.717285f, 0.731934f, 0.734863f, 0.735352f, 0.735840f, 0.736328f, - 0.000000f, 0.000000f, 0.000117f, 0.000163f, 0.000109f, 0.000208f, 0.000212f, 0.000208f, - 0.000270f, 0.000356f, 0.000324f, 0.000377f, 0.000391f, 0.000420f, 0.000449f, 0.000440f, - 0.000484f, 0.000504f, 0.000534f, 0.000561f, 0.000639f, 0.000667f, 0.000715f, 0.000722f, - 0.000799f, 0.000845f, 0.000939f, 0.000945f, 0.001053f, 0.001149f, 0.001252f, 0.001310f, - 0.001392f, 0.001507f, 0.001526f, 0.001710f, 0.001773f, 0.002111f, 0.002300f, 0.002443f, - 0.002661f, 0.002996f, 0.003376f, 0.003880f, 0.004482f, 0.005150f, 0.006115f, 0.007401f, - 0.009132f, 0.011696f, 0.015076f, 0.020416f, 0.029236f, 0.042389f, 0.063782f, 0.096802f, - 0.146362f, 0.215576f, 0.698242f, 0.712891f, 0.715332f, 0.716797f, 0.717285f, 0.717285f, - 0.000000f, 0.000118f, 0.000115f, 0.000133f, 0.000144f, 0.000147f, 0.000162f, 0.000150f, - 0.000194f, 0.000215f, 0.000228f, 0.000299f, 0.000271f, 0.000313f, 0.000328f, 0.000358f, - 0.000378f, 0.000360f, 0.000407f, 0.000438f, 0.000441f, 0.000488f, 0.000515f, 0.000544f, - 0.000576f, 0.000617f, 0.000659f, 0.000715f, 0.000741f, 0.000773f, 0.000850f, 0.000921f, - 0.000979f, 0.001066f, 0.001128f, 0.001292f, 0.001279f, 0.001400f, 0.001572f, 0.001668f, - 0.001869f, 0.002029f, 0.002295f, 0.002607f, 0.002985f, 0.003464f, 0.004066f, 0.004913f, - 0.006023f, 0.007519f, 0.009827f, 0.013016f, 0.018524f, 0.027481f, 0.042847f, 0.068970f, - 0.111938f, 0.176392f, 0.675781f, 0.692871f, 0.695801f, 0.696777f, 0.698242f, 0.697754f, - 0.000000f, 0.000000f, 0.000111f, 0.000108f, 0.000104f, 0.000102f, 0.000118f, 0.000120f, - 0.000134f, 0.000128f, 0.000188f, 0.000154f, 0.000197f, 0.000188f, 0.000245f, 0.000256f, - 0.000233f, 0.000266f, 0.000345f, 0.000281f, 0.000355f, 0.000322f, 0.000392f, 0.000358f, - 0.000437f, 0.000425f, 0.000458f, 0.000477f, 0.000564f, 0.000636f, 0.000578f, 0.000607f, - 0.000668f, 0.000719f, 0.000769f, 0.000832f, 0.000880f, 0.000953f, 0.001060f, 0.001116f, - 0.001226f, 0.001363f, 0.001486f, 0.001760f, 0.001944f, 0.002216f, 0.002605f, 0.003107f, - 0.003778f, 0.004715f, 0.005989f, 0.007942f, 0.011292f, 0.016632f, 0.026550f, 0.045532f, - 0.079956f, 0.138550f, 0.655762f, 0.671875f, 0.674805f, 0.675293f, 0.675781f, 0.678223f, - 0.000000f, 0.000112f, 0.000105f, 0.000102f, 0.000098f, 0.000095f, 0.000093f, 0.000088f, - 0.000089f, 0.000085f, 0.000095f, 0.000126f, 0.000109f, 0.000154f, 0.000153f, 0.000162f, - 0.000176f, 0.000190f, 0.000202f, 0.000204f, 0.000212f, 0.000214f, 0.000266f, 0.000239f, - 0.000279f, 0.000293f, 0.000329f, 0.000329f, 0.000339f, 0.000365f, 0.000437f, 0.000424f, - 0.000429f, 0.000474f, 0.000525f, 0.000596f, 0.000572f, 0.000612f, 0.000666f, 0.000723f, - 0.000791f, 0.000850f, 0.000977f, 0.001066f, 0.001225f, 0.001351f, 0.001555f, 0.001837f, - 0.002279f, 0.002760f, 0.003445f, 0.004612f, 0.006386f, 0.009438f, 0.015221f, 0.027008f, - 0.052551f, 0.102966f, 0.633789f, 0.649414f, 0.652832f, 0.653809f, 0.655273f, 0.655273f, - 0.000000f, 0.000105f, 0.000099f, 0.000094f, 0.000090f, 0.000087f, 0.000084f, 0.000082f, - 0.000079f, 0.000075f, 0.000071f, 0.000068f, 0.000064f, 0.000072f, 0.000096f, 0.000105f, - 0.000112f, 0.000088f, 0.000123f, 0.000129f, 0.000132f, 0.000140f, 0.000147f, 0.000170f, - 0.000188f, 0.000192f, 0.000171f, 0.000210f, 0.000217f, 0.000223f, 0.000237f, 0.000251f, - 0.000258f, 0.000294f, 0.000298f, 0.000316f, 0.000350f, 0.000382f, 0.000400f, 0.000437f, - 0.000479f, 0.000514f, 0.000576f, 0.000620f, 0.000688f, 0.000782f, 0.000916f, 0.001026f, - 0.001219f, 0.001502f, 0.001892f, 0.002424f, 0.003359f, 0.004974f, 0.008118f, 0.014343f, - 0.030075f, 0.070068f, 0.610352f, 0.626953f, 0.629883f, 0.631348f, 0.632324f, 0.632324f, - 0.000110f, 0.000094f, 0.000087f, 0.000081f, 0.000077f, 0.000075f, 0.000072f, 0.000069f, - 0.000067f, 0.000066f, 0.000064f, 0.000062f, 0.000058f, 0.000056f, 0.000053f, 0.000051f, - 0.000054f, 0.000047f, 0.000057f, 0.000055f, 0.000075f, 0.000078f, 0.000086f, 0.000093f, - 0.000093f, 0.000102f, 0.000112f, 0.000113f, 0.000130f, 0.000128f, 0.000142f, 0.000145f, - 0.000156f, 0.000153f, 0.000180f, 0.000178f, 0.000183f, 0.000223f, 0.000230f, 0.000240f, - 0.000265f, 0.000276f, 0.000300f, 0.000332f, 0.000357f, 0.000411f, 0.000449f, 0.000540f, - 0.000615f, 0.000741f, 0.000916f, 0.001144f, 0.001566f, 0.002310f, 0.003731f, 0.006905f, - 0.014793f, 0.041779f, 0.585938f, 0.603027f, 0.605957f, 0.608398f, 0.608398f, 0.609375f, - 0.000090f, 0.000071f, 0.000066f, 0.000062f, 0.000058f, 0.000056f, 0.000053f, 0.000053f, - 0.000051f, 0.000051f, 0.000049f, 0.000048f, 0.000048f, 0.000047f, 0.000045f, 0.000043f, - 0.000042f, 0.000040f, 0.000038f, 0.000036f, 0.000036f, 0.000033f, 0.000034f, 0.000040f, - 0.000040f, 0.000040f, 0.000048f, 0.000053f, 0.000060f, 0.000064f, 0.000067f, 0.000070f, - 0.000075f, 0.000081f, 0.000085f, 0.000090f, 0.000091f, 0.000103f, 0.000106f, 0.000120f, - 0.000134f, 0.000138f, 0.000142f, 0.000156f, 0.000174f, 0.000180f, 0.000212f, 0.000239f, - 0.000253f, 0.000310f, 0.000377f, 0.000479f, 0.000627f, 0.000875f, 0.001396f, 0.002623f, - 0.006184f, 0.019897f, 0.560547f, 0.578125f, 0.581543f, 0.583008f, 0.583984f, 0.583984f, - 0.000038f, 0.000035f, 0.000031f, 0.000031f, 0.000030f, 0.000031f, 0.000031f, 0.000030f, - 0.000030f, 0.000028f, 0.000029f, 0.000030f, 0.000029f, 0.000028f, 0.000029f, 0.000029f, - 0.000029f, 0.000029f, 0.000029f, 0.000028f, 0.000027f, 0.000026f, 0.000025f, 0.000024f, - 0.000023f, 0.000022f, 0.000021f, 0.000020f, 0.000019f, 0.000021f, 0.000019f, 0.000022f, - 0.000023f, 0.000027f, 0.000031f, 0.000035f, 0.000037f, 0.000039f, 0.000039f, 0.000043f, - 0.000049f, 0.000052f, 0.000056f, 0.000050f, 0.000068f, 0.000062f, 0.000070f, 0.000087f, - 0.000094f, 0.000107f, 0.000122f, 0.000140f, 0.000191f, 0.000247f, 0.000388f, 0.000710f, - 0.001781f, 0.007076f, 0.535156f, 0.553223f, 0.556152f, 0.558105f, 0.559082f, 0.559082f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000003f, 0.000003f, 0.000005f, 0.000006f, 0.000007f, 0.000007f, 0.000009f, - 0.000009f, 0.000009f, 0.000010f, 0.000010f, 0.000011f, 0.000011f, 0.000012f, 0.000012f, - 0.000012f, 0.000013f, 0.000013f, 0.000013f, 0.000013f, 0.000012f, 0.000012f, 0.000011f, - 0.000011f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000009f, 0.000008f, 0.000009f, - 0.000009f, 0.000010f, 0.000011f, 0.000015f, 0.000017f, 0.000016f, 0.000018f, 0.000021f, - 0.000020f, 0.000024f, 0.000024f, 0.000032f, 0.000035f, 0.000045f, 0.000065f, 0.000105f, - 0.000246f, 0.001313f, 0.508789f, 0.527344f, 0.530762f, 0.531738f, 0.532715f, 0.533691f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, - 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000003f, 0.000003f, - 0.000005f, 0.000018f, 0.481934f, 0.500977f, 0.504883f, 0.505859f, 0.507324f, 0.507812f, - }, - { - 0.053833f, 0.152832f, 0.239014f, 0.313477f, 0.377686f, 0.433838f, 0.481689f, 0.524414f, - 0.562988f, 0.596680f, 0.626953f, 0.654785f, 0.678711f, 0.700684f, 0.720703f, 0.739746f, - 0.755859f, 0.771973f, 0.787109f, 0.798828f, 0.812012f, 0.823730f, 0.833984f, 0.844238f, - 0.853027f, 0.862793f, 0.870605f, 0.878418f, 0.885254f, 0.892090f, 0.898926f, 0.904297f, - 0.910645f, 0.916504f, 0.921875f, 0.926270f, 0.931641f, 0.936035f, 0.939941f, 0.944336f, - 0.948242f, 0.952148f, 0.955566f, 0.959961f, 0.962402f, 0.966309f, 0.969238f, 0.972168f, - 0.975098f, 0.978027f, 0.980957f, 0.983398f, 0.985840f, 0.988281f, 0.990723f, 0.992676f, - 0.995117f, 0.996582f, 0.998047f, 0.995117f, 0.993164f, 0.990723f, 0.988770f, 0.986816f, - 0.036804f, 0.109497f, 0.178589f, 0.244751f, 0.305908f, 0.361084f, 0.411621f, 0.457275f, - 0.498535f, 0.536133f, 0.569824f, 0.601562f, 0.629883f, 0.655273f, 0.679688f, 0.700195f, - 0.720215f, 0.737793f, 0.755859f, 0.770508f, 0.785645f, 0.798340f, 0.811035f, 0.822754f, - 0.833008f, 0.843750f, 0.852539f, 0.861328f, 0.869629f, 0.877441f, 0.885742f, 0.892578f, - 0.898926f, 0.905273f, 0.911133f, 0.916504f, 0.921875f, 0.926758f, 0.931641f, 0.936523f, - 0.940430f, 0.945312f, 0.949219f, 0.953613f, 0.956543f, 0.960449f, 0.963867f, 0.967285f, - 0.970703f, 0.973633f, 0.976562f, 0.979004f, 0.981934f, 0.984375f, 0.986816f, 0.989746f, - 0.992188f, 0.994141f, 0.996582f, 0.994141f, 0.992188f, 0.990234f, 0.988281f, 0.986328f, - 0.025787f, 0.080383f, 0.136230f, 0.191650f, 0.245239f, 0.297119f, 0.345947f, 0.392822f, - 0.436035f, 0.476807f, 0.513184f, 0.547363f, 0.578125f, 0.607910f, 0.634766f, 0.658203f, - 0.681152f, 0.702637f, 0.721191f, 0.738770f, 0.755371f, 0.770508f, 0.784668f, 0.798828f, - 0.810547f, 0.821777f, 0.833984f, 0.843262f, 0.852539f, 0.861816f, 0.869629f, 0.877930f, - 0.885254f, 0.893555f, 0.898926f, 0.906250f, 0.911621f, 0.917969f, 0.923340f, 0.928223f, - 0.933105f, 0.937500f, 0.941406f, 0.946289f, 0.950195f, 0.954102f, 0.958496f, 0.961914f, - 0.965820f, 0.968750f, 0.971680f, 0.975098f, 0.978027f, 0.980469f, 0.983887f, 0.985840f, - 0.988770f, 0.991211f, 0.995117f, 0.993164f, 0.991211f, 0.989258f, 0.987305f, 0.985352f, - 0.019455f, 0.060944f, 0.104553f, 0.150513f, 0.196411f, 0.243164f, 0.289062f, 0.333740f, - 0.376709f, 0.417725f, 0.454346f, 0.491211f, 0.524414f, 0.556641f, 0.585938f, 0.613770f, - 0.639160f, 0.662598f, 0.682617f, 0.703613f, 0.723633f, 0.740723f, 0.756836f, 0.771973f, - 0.787109f, 0.798828f, 0.812012f, 0.823242f, 0.833984f, 0.844238f, 0.853516f, 0.863281f, - 0.871094f, 0.879395f, 0.886719f, 0.893555f, 0.899902f, 0.907227f, 0.913086f, 0.918945f, - 0.924805f, 0.928711f, 0.934082f, 0.938965f, 0.943848f, 0.947754f, 0.952637f, 0.955566f, - 0.959961f, 0.963867f, 0.966797f, 0.970215f, 0.973633f, 0.977051f, 0.979004f, 0.982422f, - 0.985840f, 0.987793f, 0.993652f, 0.991699f, 0.989746f, 0.988281f, 0.986328f, 0.984375f, - 0.015221f, 0.047363f, 0.082092f, 0.119202f, 0.159058f, 0.199219f, 0.239380f, 0.280762f, - 0.321533f, 0.362061f, 0.400146f, 0.436768f, 0.472900f, 0.504883f, 0.536621f, 0.566406f, - 0.594238f, 0.621094f, 0.645508f, 0.667969f, 0.688477f, 0.707520f, 0.726562f, 0.742676f, - 0.759277f, 0.773926f, 0.787598f, 0.800781f, 0.812988f, 0.825195f, 0.835938f, 0.846191f, - 0.856445f, 0.865234f, 0.872559f, 0.880859f, 0.888672f, 0.895020f, 0.902832f, 0.908203f, - 0.914551f, 0.919922f, 0.926758f, 0.931152f, 0.937012f, 0.941406f, 0.945312f, 0.949707f, - 0.954102f, 0.958496f, 0.962402f, 0.965820f, 0.969238f, 0.972168f, 0.976074f, 0.978516f, - 0.981934f, 0.984863f, 0.992188f, 0.990723f, 0.988770f, 0.987305f, 0.985352f, 0.983887f, - 0.011658f, 0.037170f, 0.065430f, 0.096008f, 0.128784f, 0.162842f, 0.198975f, 0.235596f, - 0.273926f, 0.310791f, 0.348145f, 0.385010f, 0.420410f, 0.454834f, 0.488037f, 0.519043f, - 0.548828f, 0.577148f, 0.603516f, 0.627441f, 0.650879f, 0.672363f, 0.693848f, 0.712402f, - 0.729980f, 0.748535f, 0.762207f, 0.778809f, 0.791504f, 0.804199f, 0.815918f, 0.827637f, - 0.838867f, 0.848145f, 0.857910f, 0.866211f, 0.875977f, 0.883301f, 0.891602f, 0.898438f, - 0.905273f, 0.911133f, 0.917480f, 0.923340f, 0.928711f, 0.933594f, 0.938477f, 0.942871f, - 0.948242f, 0.952637f, 0.956543f, 0.960449f, 0.964355f, 0.968262f, 0.971191f, 0.974609f, - 0.978027f, 0.980957f, 0.990723f, 0.989258f, 0.987793f, 0.985840f, 0.984375f, 0.983398f, - 0.009758f, 0.030121f, 0.052490f, 0.077576f, 0.104309f, 0.134277f, 0.164917f, 0.197510f, - 0.231812f, 0.266113f, 0.301025f, 0.336426f, 0.372070f, 0.405762f, 0.438721f, 0.471436f, - 0.502441f, 0.531738f, 0.560059f, 0.587402f, 0.612793f, 0.634766f, 0.658691f, 0.679199f, - 0.699219f, 0.718262f, 0.735352f, 0.751953f, 0.767090f, 0.780762f, 0.794922f, 0.808105f, - 0.820801f, 0.831055f, 0.842285f, 0.851562f, 0.861328f, 0.870117f, 0.878906f, 0.886719f, - 0.893555f, 0.900879f, 0.907715f, 0.913574f, 0.919434f, 0.926270f, 0.932129f, 0.936523f, - 0.941895f, 0.945801f, 0.951172f, 0.955078f, 0.959473f, 0.963867f, 0.966797f, 0.970703f, - 0.974121f, 0.977539f, 0.989746f, 0.988281f, 0.986328f, 0.984863f, 0.983398f, 0.982422f, - 0.007744f, 0.024567f, 0.043365f, 0.063782f, 0.086487f, 0.111389f, 0.137451f, 0.166260f, - 0.195435f, 0.226929f, 0.259033f, 0.291748f, 0.324951f, 0.358398f, 0.391113f, 0.424316f, - 0.456299f, 0.486328f, 0.516113f, 0.543945f, 0.571289f, 0.597656f, 0.621094f, 0.644531f, - 0.666504f, 0.686523f, 0.705078f, 0.724121f, 0.741211f, 0.757324f, 0.773438f, 0.786621f, - 0.801270f, 0.812988f, 0.823730f, 0.835938f, 0.846191f, 0.855957f, 0.865723f, 0.873047f, - 0.882324f, 0.889648f, 0.897949f, 0.905762f, 0.911133f, 0.917969f, 0.923828f, 0.929199f, - 0.934082f, 0.940430f, 0.944824f, 0.949707f, 0.954102f, 0.958008f, 0.962891f, 0.966309f, - 0.970215f, 0.974121f, 0.987793f, 0.986816f, 0.985352f, 0.983887f, 0.981934f, 0.980469f, - 0.006672f, 0.020828f, 0.035950f, 0.053345f, 0.071594f, 0.092834f, 0.114624f, 0.139282f, - 0.165649f, 0.192627f, 0.222290f, 0.252197f, 0.283203f, 0.314941f, 0.346680f, 0.377930f, - 0.409668f, 0.441650f, 0.471680f, 0.500977f, 0.529297f, 0.557129f, 0.583008f, 0.607422f, - 0.630859f, 0.654297f, 0.674805f, 0.694824f, 0.713867f, 0.731445f, 0.748535f, 0.763672f, - 0.778320f, 0.791992f, 0.805664f, 0.817871f, 0.829590f, 0.840332f, 0.850098f, 0.860352f, - 0.869141f, 0.878906f, 0.886719f, 0.894043f, 0.901855f, 0.909180f, 0.915527f, 0.920898f, - 0.927246f, 0.933105f, 0.938477f, 0.943848f, 0.948730f, 0.953125f, 0.957520f, 0.961914f, - 0.965820f, 0.970215f, 0.985840f, 0.985352f, 0.983887f, 0.981934f, 0.980957f, 0.979492f, - 0.005592f, 0.017181f, 0.030457f, 0.044739f, 0.060638f, 0.077454f, 0.097046f, 0.117981f, - 0.140625f, 0.164673f, 0.190552f, 0.217896f, 0.246582f, 0.275635f, 0.305176f, 0.336426f, - 0.366943f, 0.397949f, 0.428711f, 0.457764f, 0.487061f, 0.515137f, 0.542480f, 0.568848f, - 0.593750f, 0.619141f, 0.641602f, 0.662598f, 0.683594f, 0.703613f, 0.721191f, 0.738281f, - 0.755859f, 0.770996f, 0.784180f, 0.799316f, 0.811035f, 0.823730f, 0.833984f, 0.845703f, - 0.855957f, 0.865234f, 0.875000f, 0.883301f, 0.891602f, 0.898926f, 0.906738f, 0.912598f, - 0.919922f, 0.926270f, 0.931152f, 0.937988f, 0.942871f, 0.948242f, 0.952148f, 0.957520f, - 0.961914f, 0.966309f, 0.984375f, 0.983398f, 0.982422f, 0.981445f, 0.979492f, 0.978027f, - 0.004829f, 0.014816f, 0.025711f, 0.037964f, 0.051300f, 0.065796f, 0.082458f, 0.100037f, - 0.120178f, 0.141357f, 0.163330f, 0.187622f, 0.213013f, 0.240601f, 0.268311f, 0.296387f, - 0.325928f, 0.356445f, 0.385742f, 0.415771f, 0.445557f, 0.474121f, 0.501465f, 0.530762f, - 0.556152f, 0.581543f, 0.606445f, 0.630859f, 0.651855f, 0.672852f, 0.693359f, 0.712402f, - 0.730469f, 0.746582f, 0.762695f, 0.777832f, 0.791992f, 0.806152f, 0.818359f, 0.830566f, - 0.840820f, 0.852051f, 0.862305f, 0.871094f, 0.880371f, 0.888184f, 0.896484f, 0.904297f, - 0.910645f, 0.917969f, 0.924316f, 0.931152f, 0.936035f, 0.942383f, 0.947266f, 0.951660f, - 0.957031f, 0.960938f, 0.982422f, 0.982422f, 0.981445f, 0.979492f, 0.978516f, 0.977051f, - 0.004040f, 0.012436f, 0.022064f, 0.032440f, 0.044006f, 0.056549f, 0.070068f, 0.085999f, - 0.102539f, 0.120239f, 0.140625f, 0.161621f, 0.184448f, 0.208496f, 0.234253f, 0.260742f, - 0.288086f, 0.316406f, 0.345215f, 0.374512f, 0.404297f, 0.433350f, 0.462402f, 0.490234f, - 0.518066f, 0.543945f, 0.570312f, 0.594727f, 0.618652f, 0.642090f, 0.663086f, 0.683594f, - 0.703613f, 0.721680f, 0.739258f, 0.755859f, 0.772461f, 0.786621f, 0.798828f, 0.812500f, - 0.825195f, 0.836914f, 0.848633f, 0.858887f, 0.869141f, 0.877441f, 0.886230f, 0.894531f, - 0.902832f, 0.909668f, 0.916992f, 0.923340f, 0.929688f, 0.935547f, 0.941406f, 0.947266f, - 0.951660f, 0.957031f, 0.980469f, 0.980469f, 0.979492f, 0.978516f, 0.977051f, 0.976074f, - 0.003536f, 0.010872f, 0.018829f, 0.027893f, 0.037872f, 0.048492f, 0.060883f, 0.073425f, - 0.088074f, 0.103638f, 0.120789f, 0.139038f, 0.159912f, 0.181274f, 0.204102f, 0.227905f, - 0.253906f, 0.280518f, 0.307861f, 0.335938f, 0.364746f, 0.393311f, 0.421631f, 0.451416f, - 0.479004f, 0.505859f, 0.533203f, 0.560059f, 0.584473f, 0.608398f, 0.631836f, 0.653320f, - 0.674805f, 0.695801f, 0.714355f, 0.731934f, 0.749512f, 0.765137f, 0.781250f, 0.794434f, - 0.808594f, 0.821289f, 0.833496f, 0.844238f, 0.855469f, 0.866211f, 0.875000f, 0.883789f, - 0.892578f, 0.901855f, 0.908691f, 0.915527f, 0.922852f, 0.929199f, 0.935059f, 0.941406f, - 0.947266f, 0.951172f, 0.978516f, 0.979004f, 0.978027f, 0.977051f, 0.975586f, 0.974121f, - 0.002989f, 0.009476f, 0.016785f, 0.024246f, 0.032745f, 0.041809f, 0.052246f, 0.063782f, - 0.076111f, 0.089722f, 0.104675f, 0.120605f, 0.138306f, 0.157959f, 0.178101f, 0.200073f, - 0.223145f, 0.247192f, 0.273193f, 0.300293f, 0.327148f, 0.354736f, 0.383545f, 0.411621f, - 0.439941f, 0.468018f, 0.495605f, 0.522949f, 0.548828f, 0.574219f, 0.598145f, 0.622559f, - 0.645508f, 0.666016f, 0.687500f, 0.706543f, 0.725586f, 0.743164f, 0.759766f, 0.775391f, - 0.791016f, 0.803711f, 0.817871f, 0.829590f, 0.841797f, 0.852539f, 0.863281f, 0.873047f, - 0.882812f, 0.891113f, 0.900391f, 0.906738f, 0.915039f, 0.922852f, 0.929688f, 0.936035f, - 0.941895f, 0.946777f, 0.976074f, 0.977051f, 0.976074f, 0.975586f, 0.974121f, 0.972656f, - 0.002846f, 0.008568f, 0.014557f, 0.021484f, 0.028442f, 0.036377f, 0.045074f, 0.055054f, - 0.066101f, 0.077759f, 0.090759f, 0.104797f, 0.120483f, 0.136719f, 0.155029f, 0.175171f, - 0.196045f, 0.218262f, 0.241943f, 0.266357f, 0.292480f, 0.319336f, 0.345703f, 0.373535f, - 0.402100f, 0.429932f, 0.457764f, 0.484863f, 0.512207f, 0.539062f, 0.564941f, 0.589844f, - 0.613281f, 0.636719f, 0.659180f, 0.680664f, 0.700684f, 0.718750f, 0.736816f, 0.754883f, - 0.770508f, 0.785645f, 0.799805f, 0.813965f, 0.826172f, 0.838867f, 0.850586f, 0.861328f, - 0.871582f, 0.881836f, 0.890625f, 0.898926f, 0.906738f, 0.915039f, 0.922363f, 0.928711f, - 0.936035f, 0.941895f, 0.974609f, 0.975098f, 0.974609f, 0.973633f, 0.972656f, 0.971191f, - 0.002285f, 0.007290f, 0.012634f, 0.018280f, 0.024918f, 0.032074f, 0.039673f, 0.048157f, - 0.057220f, 0.067810f, 0.078735f, 0.091248f, 0.104370f, 0.119873f, 0.135742f, 0.152344f, - 0.171631f, 0.191650f, 0.213501f, 0.236206f, 0.260010f, 0.285156f, 0.310547f, 0.338135f, - 0.364746f, 0.392578f, 0.420410f, 0.448242f, 0.476562f, 0.502441f, 0.529785f, 0.555664f, - 0.581543f, 0.605469f, 0.629395f, 0.652344f, 0.673340f, 0.693848f, 0.713867f, 0.732910f, - 0.750000f, 0.767090f, 0.782715f, 0.797852f, 0.811035f, 0.825195f, 0.836914f, 0.848633f, - 0.860840f, 0.870605f, 0.880371f, 0.890137f, 0.898926f, 0.907227f, 0.915527f, 0.923340f, - 0.929688f, 0.936523f, 0.972168f, 0.973145f, 0.972656f, 0.972168f, 0.970703f, 0.969727f, - 0.002064f, 0.006584f, 0.011154f, 0.016266f, 0.022263f, 0.028397f, 0.034973f, 0.042145f, - 0.050232f, 0.059235f, 0.069031f, 0.079346f, 0.091736f, 0.104553f, 0.118652f, 0.133789f, - 0.150635f, 0.168457f, 0.188110f, 0.208984f, 0.230225f, 0.253906f, 0.278076f, 0.303955f, - 0.329346f, 0.356689f, 0.384033f, 0.411865f, 0.439941f, 0.467285f, 0.493896f, 0.520996f, - 0.547363f, 0.573730f, 0.597168f, 0.622559f, 0.645508f, 0.667969f, 0.688965f, 0.709473f, - 0.728027f, 0.746094f, 0.762695f, 0.778809f, 0.794922f, 0.809082f, 0.822754f, 0.834961f, - 0.847168f, 0.858887f, 0.870117f, 0.880371f, 0.889648f, 0.898926f, 0.907227f, 0.915039f, - 0.923828f, 0.930176f, 0.970215f, 0.971680f, 0.970215f, 0.970215f, 0.968750f, 0.968262f, - 0.001935f, 0.005634f, 0.010078f, 0.014389f, 0.019669f, 0.024658f, 0.030716f, 0.037201f, - 0.044098f, 0.051941f, 0.060333f, 0.070129f, 0.080383f, 0.091370f, 0.103638f, 0.116943f, - 0.131714f, 0.148193f, 0.165161f, 0.183838f, 0.203979f, 0.225220f, 0.247803f, 0.271240f, - 0.296631f, 0.322510f, 0.349121f, 0.376221f, 0.403076f, 0.431152f, 0.458984f, 0.485596f, - 0.513672f, 0.540039f, 0.564941f, 0.590820f, 0.616211f, 0.638672f, 0.662109f, 0.683105f, - 0.704102f, 0.723633f, 0.741699f, 0.759766f, 0.776855f, 0.792480f, 0.807617f, 0.821777f, - 0.833496f, 0.847168f, 0.858887f, 0.870117f, 0.880859f, 0.889648f, 0.899414f, 0.908203f, - 0.916992f, 0.924316f, 0.967285f, 0.968262f, 0.968750f, 0.968262f, 0.967285f, 0.966309f, - 0.001805f, 0.005119f, 0.009079f, 0.013023f, 0.017487f, 0.022278f, 0.027130f, 0.032684f, - 0.038666f, 0.045959f, 0.052826f, 0.061401f, 0.070801f, 0.080139f, 0.090698f, 0.102844f, - 0.115845f, 0.130005f, 0.145264f, 0.162476f, 0.180176f, 0.199951f, 0.220459f, 0.242188f, - 0.265869f, 0.290283f, 0.315430f, 0.341309f, 0.368652f, 0.395752f, 0.423584f, 0.451416f, - 0.479248f, 0.505859f, 0.532227f, 0.559082f, 0.584961f, 0.609863f, 0.634277f, 0.656738f, - 0.678711f, 0.700195f, 0.720703f, 0.738281f, 0.757324f, 0.774414f, 0.790527f, 0.805664f, - 0.820312f, 0.834473f, 0.846680f, 0.858887f, 0.869629f, 0.880859f, 0.890625f, 0.899902f, - 0.909668f, 0.917969f, 0.964844f, 0.966797f, 0.967285f, 0.965820f, 0.964844f, 0.963867f, - 0.001437f, 0.004662f, 0.007919f, 0.011681f, 0.015404f, 0.019272f, 0.024261f, 0.029205f, - 0.034515f, 0.040619f, 0.046967f, 0.054138f, 0.061737f, 0.070496f, 0.080200f, 0.090271f, - 0.101807f, 0.114136f, 0.127686f, 0.143188f, 0.159058f, 0.176514f, 0.195190f, 0.215454f, - 0.237305f, 0.260010f, 0.283936f, 0.309326f, 0.334717f, 0.361328f, 0.389160f, 0.416260f, - 0.444336f, 0.471436f, 0.499512f, 0.525879f, 0.552734f, 0.579590f, 0.604004f, 0.628906f, - 0.651855f, 0.674805f, 0.696777f, 0.717773f, 0.737305f, 0.755859f, 0.772949f, 0.789551f, - 0.805664f, 0.819336f, 0.833984f, 0.847168f, 0.859375f, 0.871094f, 0.881836f, 0.892090f, - 0.902344f, 0.910156f, 0.962402f, 0.964355f, 0.964355f, 0.963867f, 0.962891f, 0.961914f, - 0.001264f, 0.004036f, 0.007088f, 0.010170f, 0.013672f, 0.017365f, 0.021423f, 0.025955f, - 0.030533f, 0.035614f, 0.041321f, 0.047791f, 0.054626f, 0.062195f, 0.070679f, 0.080017f, - 0.089600f, 0.100769f, 0.112854f, 0.125977f, 0.139893f, 0.156128f, 0.172852f, 0.191650f, - 0.211060f, 0.232056f, 0.254883f, 0.278076f, 0.302979f, 0.328125f, 0.355225f, 0.381836f, - 0.409912f, 0.437256f, 0.464844f, 0.492676f, 0.520508f, 0.547852f, 0.573242f, 0.599609f, - 0.625000f, 0.649414f, 0.672363f, 0.694336f, 0.714844f, 0.734863f, 0.753418f, 0.771484f, - 0.788574f, 0.804688f, 0.820312f, 0.833496f, 0.847656f, 0.859863f, 0.873047f, 0.883301f, - 0.894043f, 0.903809f, 0.959961f, 0.961914f, 0.962402f, 0.960938f, 0.960449f, 0.959961f, - 0.001297f, 0.003721f, 0.006397f, 0.009308f, 0.012260f, 0.015808f, 0.019302f, 0.023010f, - 0.027267f, 0.032013f, 0.037109f, 0.042419f, 0.048523f, 0.054962f, 0.061920f, 0.070435f, - 0.079407f, 0.088318f, 0.099121f, 0.111084f, 0.124023f, 0.137695f, 0.152832f, 0.169434f, - 0.187378f, 0.206421f, 0.227783f, 0.249268f, 0.272461f, 0.297363f, 0.322754f, 0.348389f, - 0.376221f, 0.403809f, 0.431396f, 0.459229f, 0.487305f, 0.515137f, 0.542480f, 0.569336f, - 0.595215f, 0.621094f, 0.645996f, 0.669434f, 0.691406f, 0.712891f, 0.733887f, 0.753418f, - 0.770996f, 0.789062f, 0.805176f, 0.820801f, 0.835449f, 0.849121f, 0.861328f, 0.874512f, - 0.885742f, 0.895508f, 0.956543f, 0.959473f, 0.958984f, 0.958984f, 0.958008f, 0.957031f, - 0.001267f, 0.003481f, 0.005955f, 0.008568f, 0.011185f, 0.014030f, 0.017151f, 0.020294f, - 0.024246f, 0.028427f, 0.032654f, 0.037476f, 0.042603f, 0.048523f, 0.054871f, 0.062408f, - 0.070129f, 0.078552f, 0.087769f, 0.097534f, 0.109192f, 0.121399f, 0.135010f, 0.150513f, - 0.165894f, 0.183960f, 0.202881f, 0.222656f, 0.244385f, 0.267334f, 0.291260f, 0.317139f, - 0.343506f, 0.370605f, 0.397949f, 0.426025f, 0.454346f, 0.482666f, 0.511230f, 0.538086f, - 0.565918f, 0.592285f, 0.618164f, 0.642578f, 0.667480f, 0.690918f, 0.711914f, 0.732910f, - 0.752930f, 0.771484f, 0.790039f, 0.806641f, 0.821777f, 0.837402f, 0.850586f, 0.864746f, - 0.875977f, 0.887695f, 0.953613f, 0.956543f, 0.957031f, 0.956055f, 0.956055f, 0.955078f, - 0.001068f, 0.003025f, 0.005283f, 0.007442f, 0.009857f, 0.012665f, 0.015930f, 0.018570f, - 0.021820f, 0.025314f, 0.028931f, 0.033325f, 0.038147f, 0.042908f, 0.049011f, 0.055176f, - 0.061859f, 0.069397f, 0.077637f, 0.086792f, 0.096252f, 0.107117f, 0.119385f, 0.132690f, - 0.147095f, 0.162720f, 0.180054f, 0.198486f, 0.218384f, 0.239990f, 0.262207f, 0.287109f, - 0.311523f, 0.337891f, 0.364990f, 0.392822f, 0.420654f, 0.449219f, 0.478027f, 0.505859f, - 0.535156f, 0.562012f, 0.588867f, 0.615723f, 0.641602f, 0.666016f, 0.688965f, 0.711914f, - 0.732910f, 0.753906f, 0.773438f, 0.791016f, 0.808594f, 0.823730f, 0.839355f, 0.854004f, - 0.867188f, 0.879883f, 0.950195f, 0.954102f, 0.954102f, 0.953125f, 0.952637f, 0.952148f, - 0.000884f, 0.003082f, 0.004631f, 0.006931f, 0.008942f, 0.011513f, 0.013779f, 0.016663f, - 0.019806f, 0.022934f, 0.026215f, 0.029999f, 0.033813f, 0.038544f, 0.043365f, 0.048615f, - 0.054352f, 0.061005f, 0.068420f, 0.076477f, 0.085022f, 0.095032f, 0.105469f, 0.117432f, - 0.130127f, 0.143799f, 0.159790f, 0.176270f, 0.194580f, 0.214478f, 0.235229f, 0.257568f, - 0.281982f, 0.306641f, 0.332764f, 0.359863f, 0.388184f, 0.416016f, 0.445557f, 0.474854f, - 0.502441f, 0.531738f, 0.559570f, 0.586914f, 0.614258f, 0.640625f, 0.665039f, 0.689453f, - 0.712891f, 0.734863f, 0.755371f, 0.774902f, 0.793945f, 0.810547f, 0.827637f, 0.842773f, - 0.857910f, 0.871094f, 0.946777f, 0.950684f, 0.951172f, 0.950684f, 0.949707f, 0.949707f, - 0.000848f, 0.002630f, 0.004330f, 0.006386f, 0.008148f, 0.010437f, 0.012436f, 0.014977f, - 0.017731f, 0.020645f, 0.023529f, 0.026413f, 0.030289f, 0.034302f, 0.038391f, 0.043365f, - 0.048737f, 0.054413f, 0.060455f, 0.067383f, 0.075134f, 0.083801f, 0.093262f, 0.103821f, - 0.114746f, 0.127441f, 0.140991f, 0.156372f, 0.172729f, 0.190918f, 0.210449f, 0.231201f, - 0.253662f, 0.277344f, 0.302734f, 0.328857f, 0.355225f, 0.384033f, 0.413086f, 0.440918f, - 0.471191f, 0.500488f, 0.529785f, 0.558594f, 0.586426f, 0.613770f, 0.640137f, 0.666016f, - 0.689453f, 0.714355f, 0.736328f, 0.757812f, 0.777832f, 0.796875f, 0.813965f, 0.831543f, - 0.847168f, 0.860840f, 0.943848f, 0.948242f, 0.947754f, 0.948242f, 0.946777f, 0.946777f, - 0.000747f, 0.002462f, 0.004192f, 0.005573f, 0.007454f, 0.009430f, 0.011253f, 0.013588f, - 0.015762f, 0.018112f, 0.020859f, 0.023758f, 0.027084f, 0.030426f, 0.034332f, 0.038635f, - 0.042999f, 0.048340f, 0.053772f, 0.060028f, 0.066589f, 0.074402f, 0.082764f, 0.091553f, - 0.101685f, 0.112854f, 0.125122f, 0.138184f, 0.153320f, 0.169556f, 0.187500f, 0.206543f, - 0.227539f, 0.249512f, 0.273193f, 0.298340f, 0.324463f, 0.351562f, 0.379883f, 0.409424f, - 0.438477f, 0.468750f, 0.498047f, 0.527832f, 0.556641f, 0.585449f, 0.614258f, 0.641113f, - 0.666992f, 0.692383f, 0.716309f, 0.738281f, 0.760742f, 0.780273f, 0.799805f, 0.818848f, - 0.834473f, 0.851074f, 0.939941f, 0.944824f, 0.944336f, 0.944336f, 0.944336f, 0.943359f, - 0.000670f, 0.002079f, 0.003538f, 0.005146f, 0.006508f, 0.008247f, 0.010223f, 0.012260f, - 0.014153f, 0.016479f, 0.018677f, 0.021515f, 0.024323f, 0.027313f, 0.030518f, 0.034302f, - 0.038422f, 0.042725f, 0.047760f, 0.053101f, 0.059113f, 0.065613f, 0.072937f, 0.080444f, - 0.089722f, 0.099426f, 0.110596f, 0.122314f, 0.135742f, 0.150513f, 0.166260f, 0.183716f, - 0.202759f, 0.223633f, 0.245728f, 0.269287f, 0.294189f, 0.320557f, 0.348633f, 0.376709f, - 0.406494f, 0.436523f, 0.467285f, 0.497070f, 0.528320f, 0.557129f, 0.586426f, 0.614746f, - 0.642090f, 0.668945f, 0.694824f, 0.718750f, 0.742676f, 0.764648f, 0.786133f, 0.805176f, - 0.823242f, 0.840820f, 0.936035f, 0.940918f, 0.941406f, 0.941406f, 0.940430f, 0.939941f, - 0.000645f, 0.001963f, 0.003384f, 0.004719f, 0.006042f, 0.007614f, 0.009384f, 0.011192f, - 0.012665f, 0.015083f, 0.016861f, 0.019165f, 0.021393f, 0.024445f, 0.027451f, 0.030716f, - 0.034149f, 0.038116f, 0.042389f, 0.047028f, 0.052277f, 0.058014f, 0.064270f, 0.071289f, - 0.079041f, 0.087830f, 0.097351f, 0.108337f, 0.119995f, 0.132812f, 0.147217f, 0.163452f, - 0.180420f, 0.199585f, 0.219849f, 0.242065f, 0.265625f, 0.291260f, 0.318115f, 0.345703f, - 0.375000f, 0.404541f, 0.434326f, 0.465820f, 0.496582f, 0.526855f, 0.557617f, 0.587402f, - 0.616699f, 0.645508f, 0.672363f, 0.698242f, 0.723145f, 0.747559f, 0.770020f, 0.791504f, - 0.810059f, 0.828613f, 0.931641f, 0.937012f, 0.937500f, 0.937500f, 0.937012f, 0.936523f, - 0.000692f, 0.001705f, 0.003000f, 0.004238f, 0.005798f, 0.006805f, 0.008659f, 0.009933f, - 0.011681f, 0.013191f, 0.015259f, 0.017166f, 0.019379f, 0.021729f, 0.024796f, 0.027328f, - 0.030380f, 0.033661f, 0.037598f, 0.041718f, 0.046539f, 0.051270f, 0.056946f, 0.062988f, - 0.069885f, 0.077271f, 0.085999f, 0.095398f, 0.105652f, 0.117859f, 0.129883f, 0.144409f, - 0.159912f, 0.177002f, 0.196045f, 0.216553f, 0.239014f, 0.262451f, 0.288086f, 0.314941f, - 0.343262f, 0.372314f, 0.403076f, 0.433594f, 0.465332f, 0.496826f, 0.527832f, 0.559082f, - 0.589355f, 0.619629f, 0.648926f, 0.676758f, 0.703125f, 0.728516f, 0.752930f, 0.775391f, - 0.797363f, 0.817871f, 0.927246f, 0.933105f, 0.934082f, 0.933594f, 0.933594f, 0.933105f, - 0.000460f, 0.001622f, 0.002705f, 0.003983f, 0.004925f, 0.006363f, 0.007652f, 0.008965f, - 0.010521f, 0.011963f, 0.013664f, 0.015480f, 0.017258f, 0.019440f, 0.021912f, 0.024338f, - 0.027084f, 0.030212f, 0.033356f, 0.037018f, 0.040833f, 0.045380f, 0.050110f, 0.055573f, - 0.061829f, 0.068359f, 0.075928f, 0.083984f, 0.093140f, 0.103333f, 0.115112f, 0.127441f, - 0.141602f, 0.156982f, 0.174316f, 0.192871f, 0.213257f, 0.235596f, 0.259766f, 0.285400f, - 0.312256f, 0.341797f, 0.371094f, 0.402100f, 0.434082f, 0.465332f, 0.497314f, 0.529297f, - 0.562012f, 0.592773f, 0.623535f, 0.652832f, 0.681641f, 0.709473f, 0.735352f, 0.759766f, - 0.783203f, 0.803711f, 0.922363f, 0.929199f, 0.929688f, 0.929199f, 0.929688f, 0.928711f, - 0.000341f, 0.001686f, 0.002537f, 0.003769f, 0.004745f, 0.005764f, 0.007034f, 0.008286f, - 0.009369f, 0.010742f, 0.012161f, 0.013931f, 0.015671f, 0.017563f, 0.019440f, 0.021851f, - 0.024231f, 0.026672f, 0.029556f, 0.032776f, 0.036255f, 0.040283f, 0.044464f, 0.049194f, - 0.054413f, 0.060059f, 0.066589f, 0.074036f, 0.081909f, 0.091187f, 0.100769f, 0.112000f, - 0.124512f, 0.139038f, 0.154297f, 0.171265f, 0.189819f, 0.210571f, 0.232788f, 0.257324f, - 0.283203f, 0.311035f, 0.339844f, 0.370850f, 0.402100f, 0.433838f, 0.466797f, 0.499268f, - 0.532227f, 0.565430f, 0.598145f, 0.628418f, 0.659180f, 0.687988f, 0.715820f, 0.742188f, - 0.767090f, 0.791504f, 0.917969f, 0.924805f, 0.925293f, 0.925293f, 0.924805f, 0.924805f, - 0.000405f, 0.001282f, 0.002298f, 0.003269f, 0.004448f, 0.005043f, 0.006294f, 0.007233f, - 0.008606f, 0.009727f, 0.010849f, 0.012421f, 0.013885f, 0.015465f, 0.017426f, 0.019394f, - 0.021667f, 0.023819f, 0.026154f, 0.029175f, 0.032227f, 0.035706f, 0.039062f, 0.043427f, - 0.047913f, 0.052856f, 0.058502f, 0.064880f, 0.071960f, 0.079895f, 0.088867f, 0.098633f, - 0.109619f, 0.122192f, 0.135742f, 0.151489f, 0.168457f, 0.187134f, 0.207764f, 0.230835f, - 0.254883f, 0.281494f, 0.310059f, 0.339355f, 0.370361f, 0.402588f, 0.435547f, 0.468994f, - 0.502930f, 0.537109f, 0.569824f, 0.602051f, 0.634766f, 0.665527f, 0.695801f, 0.724121f, - 0.750488f, 0.776855f, 0.912598f, 0.919434f, 0.920410f, 0.920410f, 0.919922f, 0.920410f, - 0.000529f, 0.001217f, 0.002171f, 0.003035f, 0.003790f, 0.004784f, 0.005711f, 0.006756f, - 0.007782f, 0.008987f, 0.009773f, 0.011185f, 0.012650f, 0.013771f, 0.015656f, 0.017181f, - 0.018890f, 0.021057f, 0.023239f, 0.025848f, 0.028488f, 0.031525f, 0.034607f, 0.038147f, - 0.042023f, 0.046539f, 0.051605f, 0.056793f, 0.063049f, 0.069946f, 0.078064f, 0.086548f, - 0.096313f, 0.107117f, 0.119446f, 0.133301f, 0.148560f, 0.165405f, 0.184570f, 0.205811f, - 0.228394f, 0.253174f, 0.280029f, 0.308594f, 0.339111f, 0.370605f, 0.404053f, 0.437988f, - 0.471680f, 0.506348f, 0.541504f, 0.576172f, 0.609375f, 0.642578f, 0.674316f, 0.705078f, - 0.734375f, 0.761719f, 0.907227f, 0.914062f, 0.915527f, 0.915527f, 0.916016f, 0.915039f, - 0.000402f, 0.001247f, 0.001841f, 0.002651f, 0.003414f, 0.004200f, 0.005337f, 0.005821f, - 0.006733f, 0.008041f, 0.008942f, 0.010201f, 0.011261f, 0.012749f, 0.013893f, 0.015472f, - 0.016663f, 0.018829f, 0.020615f, 0.022873f, 0.025299f, 0.027893f, 0.030533f, 0.033600f, - 0.037140f, 0.040924f, 0.044983f, 0.049927f, 0.055359f, 0.061340f, 0.068176f, 0.075500f, - 0.084106f, 0.093933f, 0.104370f, 0.116638f, 0.130249f, 0.145996f, 0.162842f, 0.181885f, - 0.203735f, 0.226562f, 0.251465f, 0.279297f, 0.308594f, 0.339355f, 0.373047f, 0.406982f, - 0.440918f, 0.477051f, 0.511719f, 0.548340f, 0.583496f, 0.618164f, 0.652344f, 0.684570f, - 0.715332f, 0.745605f, 0.901855f, 0.909180f, 0.910156f, 0.910645f, 0.910156f, 0.910156f, - 0.000371f, 0.001090f, 0.001752f, 0.002409f, 0.003042f, 0.003963f, 0.004898f, 0.005295f, - 0.006077f, 0.006992f, 0.008102f, 0.009338f, 0.010101f, 0.011078f, 0.012375f, 0.013718f, - 0.015099f, 0.016403f, 0.018402f, 0.020203f, 0.022354f, 0.024475f, 0.026825f, 0.029388f, - 0.032623f, 0.035522f, 0.039429f, 0.043762f, 0.048462f, 0.053558f, 0.059265f, 0.065552f, - 0.073120f, 0.081787f, 0.091431f, 0.102112f, 0.114136f, 0.127930f, 0.143066f, 0.160767f, - 0.179810f, 0.200928f, 0.224854f, 0.250732f, 0.279053f, 0.308838f, 0.340820f, 0.374756f, - 0.410156f, 0.446045f, 0.482666f, 0.520020f, 0.556152f, 0.593262f, 0.628906f, 0.663574f, - 0.695801f, 0.728027f, 0.895508f, 0.903809f, 0.904297f, 0.904297f, 0.904297f, 0.904785f, - 0.000425f, 0.000937f, 0.001529f, 0.002129f, 0.002674f, 0.003696f, 0.004257f, 0.004990f, - 0.005726f, 0.006161f, 0.007118f, 0.007919f, 0.009109f, 0.009941f, 0.011055f, 0.011993f, - 0.013191f, 0.014832f, 0.016281f, 0.017868f, 0.019562f, 0.021362f, 0.023514f, 0.025909f, - 0.028549f, 0.031189f, 0.034637f, 0.037994f, 0.042145f, 0.046570f, 0.051453f, 0.057129f, - 0.063965f, 0.070984f, 0.079285f, 0.088806f, 0.099426f, 0.111267f, 0.125366f, 0.140747f, - 0.158203f, 0.178101f, 0.199585f, 0.223755f, 0.250732f, 0.279297f, 0.310059f, 0.343994f, - 0.377686f, 0.414307f, 0.451904f, 0.489258f, 0.527832f, 0.565918f, 0.603027f, 0.640137f, - 0.675781f, 0.710449f, 0.888672f, 0.897461f, 0.899902f, 0.900391f, 0.899414f, 0.899414f, - 0.000317f, 0.000823f, 0.001386f, 0.002108f, 0.002684f, 0.003239f, 0.003883f, 0.004303f, - 0.004730f, 0.005569f, 0.006626f, 0.007214f, 0.008003f, 0.008865f, 0.009590f, 0.010948f, - 0.011856f, 0.012871f, 0.014381f, 0.015640f, 0.017075f, 0.018799f, 0.020569f, 0.022537f, - 0.024704f, 0.027405f, 0.030090f, 0.033142f, 0.036346f, 0.040436f, 0.044830f, 0.049835f, - 0.055450f, 0.061584f, 0.068665f, 0.076904f, 0.086060f, 0.096741f, 0.109192f, 0.122559f, - 0.138428f, 0.155762f, 0.176270f, 0.198242f, 0.223145f, 0.250244f, 0.280518f, 0.312500f, - 0.346680f, 0.382324f, 0.420410f, 0.458740f, 0.498779f, 0.538086f, 0.577637f, 0.616211f, - 0.654297f, 0.690918f, 0.881348f, 0.890625f, 0.892578f, 0.893066f, 0.893066f, 0.892578f, - 0.000385f, 0.000766f, 0.001544f, 0.001925f, 0.002359f, 0.002947f, 0.003176f, 0.003691f, - 0.004288f, 0.005215f, 0.005917f, 0.006214f, 0.007019f, 0.007843f, 0.008469f, 0.009598f, - 0.010345f, 0.011559f, 0.012497f, 0.013634f, 0.014992f, 0.016373f, 0.017853f, 0.019608f, - 0.021515f, 0.023788f, 0.026260f, 0.028931f, 0.031860f, 0.034912f, 0.038635f, 0.042633f, - 0.047638f, 0.053070f, 0.059540f, 0.066284f, 0.074524f, 0.083679f, 0.094177f, 0.106445f, - 0.120361f, 0.135620f, 0.154053f, 0.174072f, 0.197144f, 0.222900f, 0.251221f, 0.281982f, - 0.315430f, 0.351318f, 0.388672f, 0.427734f, 0.468506f, 0.508301f, 0.549805f, 0.591309f, - 0.631348f, 0.670410f, 0.874512f, 0.884766f, 0.885742f, 0.886230f, 0.886230f, 0.886230f, - 0.000230f, 0.000832f, 0.001281f, 0.001865f, 0.002207f, 0.002605f, 0.003212f, 0.003284f, - 0.004124f, 0.004597f, 0.005222f, 0.005703f, 0.006260f, 0.007095f, 0.007790f, 0.008377f, - 0.009010f, 0.010078f, 0.011009f, 0.011925f, 0.013153f, 0.014282f, 0.015610f, 0.017151f, - 0.018951f, 0.020416f, 0.022583f, 0.024826f, 0.027328f, 0.030136f, 0.033508f, 0.036835f, - 0.040985f, 0.045410f, 0.050812f, 0.056854f, 0.063965f, 0.071777f, 0.081177f, 0.091858f, - 0.103699f, 0.117615f, 0.133423f, 0.152588f, 0.172974f, 0.196777f, 0.222900f, 0.252686f, - 0.284912f, 0.319824f, 0.356934f, 0.395996f, 0.436768f, 0.478516f, 0.521484f, 0.564453f, - 0.607422f, 0.649414f, 0.866699f, 0.876953f, 0.877930f, 0.879395f, 0.879883f, 0.878418f, - 0.000228f, 0.000734f, 0.000993f, 0.001416f, 0.001935f, 0.002293f, 0.002541f, 0.003174f, - 0.003508f, 0.004040f, 0.004337f, 0.005039f, 0.005505f, 0.006054f, 0.006840f, 0.007366f, - 0.008041f, 0.008644f, 0.009544f, 0.010460f, 0.011238f, 0.012329f, 0.013542f, 0.014755f, - 0.016083f, 0.017624f, 0.019424f, 0.021408f, 0.023422f, 0.025803f, 0.028366f, 0.031311f, - 0.034912f, 0.039124f, 0.043304f, 0.048492f, 0.054291f, 0.061188f, 0.069397f, 0.078552f, - 0.089233f, 0.101074f, 0.115540f, 0.131226f, 0.150757f, 0.172119f, 0.196533f, 0.224243f, - 0.254883f, 0.288574f, 0.324707f, 0.364014f, 0.405029f, 0.447510f, 0.491699f, 0.536133f, - 0.581543f, 0.627441f, 0.858398f, 0.869141f, 0.870605f, 0.871582f, 0.871094f, 0.871582f, - 0.000118f, 0.000713f, 0.000985f, 0.001328f, 0.001612f, 0.001999f, 0.002399f, 0.002913f, - 0.003139f, 0.003567f, 0.004055f, 0.004406f, 0.004986f, 0.005226f, 0.005856f, 0.006332f, - 0.007042f, 0.007553f, 0.008286f, 0.009064f, 0.009834f, 0.010696f, 0.011658f, 0.012726f, - 0.013817f, 0.015289f, 0.016693f, 0.018265f, 0.019699f, 0.021835f, 0.024307f, 0.026642f, - 0.029770f, 0.033234f, 0.037048f, 0.041351f, 0.046478f, 0.052032f, 0.058960f, 0.066589f, - 0.075745f, 0.086182f, 0.099121f, 0.113037f, 0.129517f, 0.149048f, 0.171387f, 0.196899f, - 0.225464f, 0.257812f, 0.293457f, 0.331787f, 0.373291f, 0.416748f, 0.460938f, 0.507812f, - 0.554688f, 0.602051f, 0.849609f, 0.859863f, 0.862793f, 0.863281f, 0.862793f, 0.862793f, - 0.000211f, 0.000522f, 0.000877f, 0.001204f, 0.001507f, 0.001724f, 0.002062f, 0.002426f, - 0.002867f, 0.003157f, 0.003443f, 0.003752f, 0.004192f, 0.004753f, 0.005154f, 0.005428f, - 0.006065f, 0.006546f, 0.007210f, 0.007725f, 0.008530f, 0.009247f, 0.010025f, 0.010887f, - 0.011909f, 0.012970f, 0.014069f, 0.015335f, 0.017105f, 0.018433f, 0.020554f, 0.022552f, - 0.025116f, 0.027802f, 0.031158f, 0.034485f, 0.038971f, 0.044037f, 0.049469f, 0.055847f, - 0.063843f, 0.072815f, 0.083618f, 0.095947f, 0.110840f, 0.128174f, 0.147949f, 0.171387f, - 0.198242f, 0.228271f, 0.262207f, 0.299805f, 0.340332f, 0.384277f, 0.430176f, 0.477295f, - 0.527344f, 0.577637f, 0.839844f, 0.851074f, 0.853516f, 0.854492f, 0.854980f, 0.854980f, - 0.000218f, 0.000479f, 0.000706f, 0.001109f, 0.001245f, 0.001763f, 0.001800f, 0.002211f, - 0.002377f, 0.002783f, 0.003103f, 0.003223f, 0.003782f, 0.004089f, 0.004326f, 0.004711f, - 0.005306f, 0.005569f, 0.006199f, 0.006653f, 0.007168f, 0.007919f, 0.008560f, 0.009254f, - 0.009979f, 0.010872f, 0.012054f, 0.012810f, 0.014221f, 0.015793f, 0.017181f, 0.018967f, - 0.021088f, 0.023361f, 0.026001f, 0.028915f, 0.032257f, 0.036469f, 0.040924f, 0.046875f, - 0.053375f, 0.061218f, 0.070435f, 0.080811f, 0.093628f, 0.108704f, 0.126709f, 0.147461f, - 0.172241f, 0.199951f, 0.232788f, 0.268799f, 0.308594f, 0.351562f, 0.397705f, 0.447266f, - 0.498291f, 0.550293f, 0.830078f, 0.841797f, 0.843750f, 0.845215f, 0.845215f, 0.845703f, - 0.000139f, 0.000379f, 0.000704f, 0.000896f, 0.001095f, 0.001392f, 0.001649f, 0.002058f, - 0.002235f, 0.002483f, 0.002621f, 0.002878f, 0.003214f, 0.003580f, 0.003820f, 0.004055f, - 0.004498f, 0.004791f, 0.005173f, 0.005692f, 0.006145f, 0.006691f, 0.007175f, 0.007874f, - 0.008499f, 0.009239f, 0.010117f, 0.011032f, 0.011864f, 0.012901f, 0.014282f, 0.015701f, - 0.017242f, 0.019516f, 0.021469f, 0.024002f, 0.026749f, 0.029953f, 0.034027f, 0.038727f, - 0.044250f, 0.050568f, 0.058136f, 0.067139f, 0.078247f, 0.091614f, 0.106689f, 0.125366f, - 0.147339f, 0.172974f, 0.202881f, 0.237671f, 0.275879f, 0.318359f, 0.365234f, 0.415283f, - 0.468018f, 0.521973f, 0.819336f, 0.832031f, 0.834473f, 0.834961f, 0.835449f, 0.835938f, - 0.000115f, 0.000396f, 0.000688f, 0.000885f, 0.000917f, 0.001393f, 0.001478f, 0.001590f, - 0.001944f, 0.002123f, 0.002291f, 0.002644f, 0.002666f, 0.003023f, 0.003197f, 0.003546f, - 0.003714f, 0.004246f, 0.004551f, 0.004837f, 0.005108f, 0.005577f, 0.006054f, 0.006504f, - 0.007023f, 0.007633f, 0.008362f, 0.009148f, 0.009926f, 0.010742f, 0.011917f, 0.013062f, - 0.014351f, 0.015991f, 0.017639f, 0.019455f, 0.021729f, 0.024689f, 0.027740f, 0.031708f, - 0.036102f, 0.041260f, 0.047882f, 0.055450f, 0.064392f, 0.075500f, 0.088928f, 0.104797f, - 0.124756f, 0.147949f, 0.175415f, 0.207275f, 0.244507f, 0.286133f, 0.332520f, 0.381836f, - 0.436279f, 0.492432f, 0.808105f, 0.821289f, 0.822754f, 0.824707f, 0.825195f, 0.824219f, - 0.000209f, 0.000435f, 0.000493f, 0.000669f, 0.001040f, 0.001076f, 0.001254f, 0.001398f, - 0.001603f, 0.001697f, 0.001987f, 0.002140f, 0.002268f, 0.002472f, 0.002769f, 0.002991f, - 0.003302f, 0.003572f, 0.003685f, 0.004002f, 0.004337f, 0.004654f, 0.005062f, 0.005379f, - 0.005871f, 0.006363f, 0.006733f, 0.007416f, 0.008102f, 0.008812f, 0.009727f, 0.010689f, - 0.011566f, 0.013145f, 0.014053f, 0.015762f, 0.017899f, 0.020096f, 0.022552f, 0.025528f, - 0.028992f, 0.033325f, 0.038635f, 0.044952f, 0.052582f, 0.061554f, 0.072998f, 0.086670f, - 0.103577f, 0.124329f, 0.148804f, 0.178467f, 0.213501f, 0.253174f, 0.298828f, 0.348877f, - 0.403076f, 0.461914f, 0.795898f, 0.809570f, 0.812012f, 0.813477f, 0.813477f, 0.814453f, - 0.000243f, 0.000322f, 0.000466f, 0.000710f, 0.000863f, 0.000942f, 0.001051f, 0.001182f, - 0.001369f, 0.001451f, 0.001716f, 0.001851f, 0.001968f, 0.002192f, 0.002323f, 0.002470f, - 0.002773f, 0.002850f, 0.003056f, 0.003399f, 0.003624f, 0.003832f, 0.004192f, 0.004467f, - 0.004955f, 0.005276f, 0.005772f, 0.006084f, 0.006672f, 0.007191f, 0.007828f, 0.008720f, - 0.009575f, 0.010292f, 0.011505f, 0.012535f, 0.014114f, 0.016006f, 0.017838f, 0.020462f, - 0.023193f, 0.026489f, 0.030807f, 0.035858f, 0.041840f, 0.049652f, 0.059174f, 0.070435f, - 0.084839f, 0.102783f, 0.124146f, 0.151489f, 0.183472f, 0.221802f, 0.265137f, 0.315186f, - 0.369629f, 0.430664f, 0.782715f, 0.796875f, 0.799805f, 0.800293f, 0.801758f, 0.801758f, - 0.000119f, 0.000369f, 0.000340f, 0.000595f, 0.000667f, 0.000841f, 0.001010f, 0.001086f, - 0.001179f, 0.001225f, 0.001494f, 0.001555f, 0.001654f, 0.001754f, 0.001965f, 0.002142f, - 0.002197f, 0.002432f, 0.002619f, 0.002811f, 0.003021f, 0.003139f, 0.003567f, 0.003708f, - 0.004066f, 0.004360f, 0.004612f, 0.005123f, 0.005489f, 0.005878f, 0.006306f, 0.006824f, - 0.007576f, 0.008286f, 0.008949f, 0.010155f, 0.011322f, 0.012756f, 0.014046f, 0.015976f, - 0.018250f, 0.020874f, 0.024094f, 0.027878f, 0.032867f, 0.039154f, 0.046509f, 0.055908f, - 0.068054f, 0.082886f, 0.102356f, 0.125732f, 0.155029f, 0.190674f, 0.232422f, 0.281006f, - 0.335693f, 0.397949f, 0.770020f, 0.783691f, 0.786621f, 0.787598f, 0.788086f, 0.789551f, - 0.000000f, 0.000220f, 0.000275f, 0.000562f, 0.000618f, 0.000683f, 0.000733f, 0.000761f, - 0.000966f, 0.001022f, 0.001184f, 0.001237f, 0.001382f, 0.001552f, 0.001688f, 0.001724f, - 0.001918f, 0.002024f, 0.002115f, 0.002243f, 0.002403f, 0.002718f, 0.002840f, 0.003052f, - 0.003330f, 0.003508f, 0.003860f, 0.004097f, 0.004314f, 0.004719f, 0.005074f, 0.005535f, - 0.006058f, 0.006584f, 0.007168f, 0.007874f, 0.008759f, 0.009651f, 0.011086f, 0.012459f, - 0.013992f, 0.015945f, 0.018433f, 0.021408f, 0.025192f, 0.029861f, 0.035950f, 0.043396f, - 0.053406f, 0.065735f, 0.082031f, 0.102234f, 0.128052f, 0.160645f, 0.200073f, 0.247192f, - 0.301025f, 0.363281f, 0.755371f, 0.770996f, 0.772949f, 0.773926f, 0.775879f, 0.775879f, - 0.000216f, 0.000102f, 0.000381f, 0.000487f, 0.000429f, 0.000552f, 0.000579f, 0.000788f, - 0.000804f, 0.000854f, 0.000937f, 0.000996f, 0.001078f, 0.001218f, 0.001315f, 0.001499f, - 0.001532f, 0.001642f, 0.001805f, 0.001825f, 0.002077f, 0.002178f, 0.002312f, 0.002396f, - 0.002575f, 0.002735f, 0.002947f, 0.003317f, 0.003428f, 0.003721f, 0.004185f, 0.004379f, - 0.004704f, 0.005253f, 0.005650f, 0.006145f, 0.006870f, 0.007515f, 0.008415f, 0.009430f, - 0.010612f, 0.012093f, 0.013954f, 0.016052f, 0.018967f, 0.022476f, 0.027115f, 0.032898f, - 0.040649f, 0.050690f, 0.063599f, 0.080811f, 0.103210f, 0.132202f, 0.168823f, 0.213501f, - 0.266602f, 0.329102f, 0.740234f, 0.756348f, 0.758789f, 0.760254f, 0.761230f, 0.761230f, - 0.000179f, 0.000181f, 0.000180f, 0.000289f, 0.000413f, 0.000458f, 0.000497f, 0.000620f, - 0.000646f, 0.000688f, 0.000830f, 0.000868f, 0.000904f, 0.000981f, 0.001024f, 0.001178f, - 0.001146f, 0.001302f, 0.001382f, 0.001523f, 0.001679f, 0.001737f, 0.001824f, 0.001959f, - 0.002195f, 0.002283f, 0.002438f, 0.002579f, 0.002703f, 0.002939f, 0.003181f, 0.003454f, - 0.003677f, 0.004051f, 0.004395f, 0.004738f, 0.005283f, 0.005783f, 0.006420f, 0.007095f, - 0.007988f, 0.009094f, 0.010384f, 0.011955f, 0.013939f, 0.016434f, 0.019836f, 0.024292f, - 0.030029f, 0.037659f, 0.048065f, 0.061890f, 0.080811f, 0.105774f, 0.138672f, 0.180542f, - 0.231934f, 0.293213f, 0.724121f, 0.740234f, 0.744141f, 0.745117f, 0.745605f, 0.746094f, - 0.000000f, 0.000056f, 0.000263f, 0.000339f, 0.000369f, 0.000357f, 0.000376f, 0.000508f, - 0.000519f, 0.000558f, 0.000581f, 0.000678f, 0.000767f, 0.000775f, 0.000905f, 0.000849f, - 0.000992f, 0.000942f, 0.001192f, 0.001169f, 0.001204f, 0.001375f, 0.001439f, 0.001532f, - 0.001634f, 0.001676f, 0.001799f, 0.001904f, 0.002165f, 0.002262f, 0.002377f, 0.002611f, - 0.002836f, 0.003103f, 0.003321f, 0.003550f, 0.004005f, 0.004356f, 0.004772f, 0.005295f, - 0.005962f, 0.006756f, 0.007690f, 0.008690f, 0.010078f, 0.011871f, 0.014252f, 0.017242f, - 0.021393f, 0.027100f, 0.034851f, 0.046051f, 0.060455f, 0.081848f, 0.110474f, 0.148682f, - 0.197632f, 0.257568f, 0.706543f, 0.724121f, 0.727539f, 0.729492f, 0.729980f, 0.729492f, - 0.000000f, 0.000130f, 0.000174f, 0.000312f, 0.000290f, 0.000293f, 0.000372f, 0.000319f, - 0.000397f, 0.000433f, 0.000550f, 0.000552f, 0.000564f, 0.000593f, 0.000638f, 0.000758f, - 0.000784f, 0.000797f, 0.000842f, 0.000937f, 0.001011f, 0.001068f, 0.001125f, 0.001231f, - 0.001228f, 0.001288f, 0.001409f, 0.001465f, 0.001644f, 0.001697f, 0.001965f, 0.001924f, - 0.002136f, 0.002270f, 0.002436f, 0.002697f, 0.002916f, 0.003202f, 0.003492f, 0.003929f, - 0.004391f, 0.004887f, 0.005516f, 0.006233f, 0.007240f, 0.008461f, 0.010094f, 0.012070f, - 0.014854f, 0.018585f, 0.024338f, 0.032379f, 0.043884f, 0.060516f, 0.084656f, 0.118469f, - 0.164185f, 0.222168f, 0.689941f, 0.708008f, 0.710449f, 0.711914f, 0.712891f, 0.712402f, - 0.000000f, 0.000000f, 0.000122f, 0.000226f, 0.000145f, 0.000282f, 0.000255f, 0.000247f, - 0.000323f, 0.000389f, 0.000379f, 0.000435f, 0.000461f, 0.000509f, 0.000535f, 0.000517f, - 0.000557f, 0.000604f, 0.000649f, 0.000690f, 0.000757f, 0.000773f, 0.000836f, 0.000865f, - 0.000924f, 0.000957f, 0.001095f, 0.001104f, 0.001243f, 0.001361f, 0.001458f, 0.001486f, - 0.001619f, 0.001745f, 0.001791f, 0.001993f, 0.002100f, 0.002321f, 0.002539f, 0.002771f, - 0.003084f, 0.003412f, 0.003866f, 0.004368f, 0.005062f, 0.005821f, 0.006882f, 0.008278f, - 0.010071f, 0.012756f, 0.016327f, 0.021774f, 0.029785f, 0.042206f, 0.061462f, 0.090149f, - 0.131348f, 0.187378f, 0.669434f, 0.688965f, 0.692383f, 0.694824f, 0.695801f, 0.695312f, - 0.000000f, 0.000118f, 0.000113f, 0.000158f, 0.000158f, 0.000176f, 0.000224f, 0.000202f, - 0.000251f, 0.000260f, 0.000280f, 0.000332f, 0.000316f, 0.000365f, 0.000389f, 0.000419f, - 0.000454f, 0.000435f, 0.000476f, 0.000494f, 0.000516f, 0.000576f, 0.000609f, 0.000656f, - 0.000678f, 0.000712f, 0.000792f, 0.000800f, 0.000852f, 0.000919f, 0.000961f, 0.001070f, - 0.001120f, 0.001238f, 0.001300f, 0.001480f, 0.001459f, 0.001634f, 0.001798f, 0.001947f, - 0.002111f, 0.002377f, 0.002615f, 0.002966f, 0.003410f, 0.003933f, 0.004585f, 0.005489f, - 0.006706f, 0.008148f, 0.010757f, 0.013962f, 0.019257f, 0.027771f, 0.041931f, 0.065125f, - 0.101135f, 0.152832f, 0.650391f, 0.670898f, 0.674316f, 0.675293f, 0.675781f, 0.677246f, - 0.000000f, 0.000000f, 0.000109f, 0.000106f, 0.000121f, 0.000117f, 0.000130f, 0.000151f, - 0.000161f, 0.000174f, 0.000234f, 0.000197f, 0.000205f, 0.000236f, 0.000272f, 0.000296f, - 0.000267f, 0.000296f, 0.000397f, 0.000344f, 0.000413f, 0.000395f, 0.000433f, 0.000434f, - 0.000504f, 0.000488f, 0.000532f, 0.000550f, 0.000602f, 0.000711f, 0.000675f, 0.000704f, - 0.000752f, 0.000817f, 0.000896f, 0.000955f, 0.001009f, 0.001091f, 0.001223f, 0.001271f, - 0.001415f, 0.001560f, 0.001721f, 0.001989f, 0.002214f, 0.002508f, 0.002930f, 0.003504f, - 0.004208f, 0.005169f, 0.006603f, 0.008606f, 0.011864f, 0.017090f, 0.026367f, 0.043396f, - 0.072571f, 0.119751f, 0.630859f, 0.650879f, 0.653809f, 0.656250f, 0.657227f, 0.657227f, - 0.000000f, 0.000111f, 0.000104f, 0.000100f, 0.000096f, 0.000094f, 0.000105f, 0.000096f, - 0.000101f, 0.000115f, 0.000119f, 0.000155f, 0.000129f, 0.000180f, 0.000186f, 0.000199f, - 0.000208f, 0.000214f, 0.000232f, 0.000230f, 0.000237f, 0.000247f, 0.000303f, 0.000276f, - 0.000324f, 0.000332f, 0.000381f, 0.000371f, 0.000393f, 0.000428f, 0.000490f, 0.000468f, - 0.000512f, 0.000540f, 0.000598f, 0.000670f, 0.000673f, 0.000711f, 0.000767f, 0.000842f, - 0.000894f, 0.000985f, 0.001120f, 0.001200f, 0.001416f, 0.001544f, 0.001768f, 0.002052f, - 0.002510f, 0.003044f, 0.003796f, 0.005016f, 0.006870f, 0.009918f, 0.015335f, 0.026077f, - 0.048004f, 0.088745f, 0.610352f, 0.630859f, 0.634277f, 0.636230f, 0.637207f, 0.638184f, - 0.000000f, 0.000104f, 0.000098f, 0.000092f, 0.000087f, 0.000084f, 0.000081f, 0.000078f, - 0.000074f, 0.000070f, 0.000073f, 0.000075f, 0.000081f, 0.000081f, 0.000119f, 0.000124f, - 0.000129f, 0.000115f, 0.000142f, 0.000169f, 0.000155f, 0.000169f, 0.000172f, 0.000196f, - 0.000209f, 0.000211f, 0.000203f, 0.000238f, 0.000245f, 0.000260f, 0.000282f, 0.000281f, - 0.000297f, 0.000333f, 0.000343f, 0.000374f, 0.000398f, 0.000428f, 0.000473f, 0.000494f, - 0.000534f, 0.000591f, 0.000643f, 0.000708f, 0.000790f, 0.000893f, 0.001040f, 0.001169f, - 0.001381f, 0.001676f, 0.002123f, 0.002686f, 0.003658f, 0.005329f, 0.008347f, 0.014244f, - 0.027954f, 0.060638f, 0.587891f, 0.609375f, 0.613281f, 0.614746f, 0.616699f, 0.616211f, - 0.000110f, 0.000094f, 0.000085f, 0.000079f, 0.000075f, 0.000072f, 0.000069f, 0.000067f, - 0.000065f, 0.000063f, 0.000059f, 0.000059f, 0.000054f, 0.000051f, 0.000055f, 0.000051f, - 0.000066f, 0.000066f, 0.000078f, 0.000074f, 0.000089f, 0.000091f, 0.000102f, 0.000109f, - 0.000114f, 0.000126f, 0.000133f, 0.000130f, 0.000141f, 0.000141f, 0.000156f, 0.000172f, - 0.000180f, 0.000179f, 0.000206f, 0.000199f, 0.000214f, 0.000254f, 0.000247f, 0.000282f, - 0.000300f, 0.000324f, 0.000349f, 0.000374f, 0.000413f, 0.000459f, 0.000513f, 0.000619f, - 0.000711f, 0.000823f, 0.001030f, 0.001269f, 0.001724f, 0.002487f, 0.003948f, 0.007015f, - 0.014122f, 0.036346f, 0.565430f, 0.586426f, 0.592285f, 0.592773f, 0.594238f, 0.594727f, - 0.000092f, 0.000073f, 0.000067f, 0.000062f, 0.000057f, 0.000055f, 0.000052f, 0.000052f, - 0.000049f, 0.000049f, 0.000047f, 0.000046f, 0.000046f, 0.000043f, 0.000041f, 0.000039f, - 0.000038f, 0.000036f, 0.000039f, 0.000036f, 0.000039f, 0.000037f, 0.000039f, 0.000047f, - 0.000051f, 0.000057f, 0.000059f, 0.000060f, 0.000067f, 0.000071f, 0.000078f, 0.000085f, - 0.000087f, 0.000091f, 0.000098f, 0.000095f, 0.000102f, 0.000122f, 0.000122f, 0.000137f, - 0.000143f, 0.000145f, 0.000168f, 0.000171f, 0.000197f, 0.000209f, 0.000234f, 0.000264f, - 0.000295f, 0.000349f, 0.000418f, 0.000520f, 0.000678f, 0.000958f, 0.001512f, 0.002745f, - 0.006092f, 0.017456f, 0.542969f, 0.565430f, 0.568848f, 0.569824f, 0.572266f, 0.572266f, - 0.000052f, 0.000042f, 0.000037f, 0.000035f, 0.000033f, 0.000033f, 0.000032f, 0.000031f, - 0.000031f, 0.000029f, 0.000030f, 0.000030f, 0.000029f, 0.000028f, 0.000028f, 0.000028f, - 0.000028f, 0.000028f, 0.000027f, 0.000026f, 0.000024f, 0.000023f, 0.000022f, 0.000022f, - 0.000021f, 0.000020f, 0.000019f, 0.000022f, 0.000020f, 0.000023f, 0.000024f, 0.000026f, - 0.000028f, 0.000035f, 0.000037f, 0.000038f, 0.000039f, 0.000043f, 0.000048f, 0.000050f, - 0.000053f, 0.000055f, 0.000062f, 0.000059f, 0.000072f, 0.000070f, 0.000087f, 0.000099f, - 0.000100f, 0.000119f, 0.000142f, 0.000162f, 0.000217f, 0.000283f, 0.000425f, 0.000760f, - 0.001818f, 0.006405f, 0.519043f, 0.541504f, 0.546387f, 0.548828f, 0.549316f, 0.550781f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000004f, - 0.000004f, 0.000006f, 0.000006f, 0.000008f, 0.000009f, 0.000009f, 0.000009f, 0.000010f, - 0.000010f, 0.000010f, 0.000011f, 0.000011f, 0.000011f, 0.000012f, 0.000012f, 0.000012f, - 0.000012f, 0.000013f, 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000011f, 0.000010f, - 0.000010f, 0.000009f, 0.000009f, 0.000008f, 0.000008f, 0.000008f, 0.000008f, 0.000011f, - 0.000011f, 0.000012f, 0.000015f, 0.000016f, 0.000016f, 0.000018f, 0.000018f, 0.000020f, - 0.000022f, 0.000024f, 0.000028f, 0.000035f, 0.000036f, 0.000052f, 0.000071f, 0.000117f, - 0.000260f, 0.001269f, 0.495605f, 0.518555f, 0.523926f, 0.525879f, 0.526855f, 0.527344f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, - 0.000002f, 0.000002f, 0.000003f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000003f, - 0.000005f, 0.000021f, 0.473145f, 0.495605f, 0.500000f, 0.502441f, 0.503418f, 0.503906f, - }, - { - 0.045868f, 0.130493f, 0.205322f, 0.272705f, 0.331787f, 0.384521f, 0.431885f, 0.473389f, - 0.511719f, 0.545898f, 0.576660f, 0.605469f, 0.631348f, 0.654785f, 0.676758f, 0.696289f, - 0.714355f, 0.732422f, 0.749023f, 0.763184f, 0.777832f, 0.790527f, 0.802734f, 0.813477f, - 0.824219f, 0.834961f, 0.844238f, 0.853027f, 0.862305f, 0.869629f, 0.877441f, 0.884277f, - 0.892090f, 0.898926f, 0.904297f, 0.910645f, 0.916992f, 0.921875f, 0.926758f, 0.931641f, - 0.937012f, 0.941406f, 0.945801f, 0.950195f, 0.954102f, 0.958496f, 0.962402f, 0.966309f, - 0.969238f, 0.973145f, 0.976074f, 0.979492f, 0.982422f, 0.985352f, 0.988281f, 0.991211f, - 0.993652f, 0.996094f, 0.997070f, 0.993164f, 0.990234f, 0.987305f, 0.984375f, 0.981445f, - 0.033447f, 0.097717f, 0.160400f, 0.219238f, 0.273438f, 0.323486f, 0.371582f, 0.414062f, - 0.454834f, 0.491211f, 0.524414f, 0.555176f, 0.583984f, 0.610840f, 0.635254f, 0.658203f, - 0.678223f, 0.697754f, 0.716309f, 0.732422f, 0.749023f, 0.763184f, 0.776855f, 0.790527f, - 0.802734f, 0.812988f, 0.824707f, 0.834473f, 0.844238f, 0.853516f, 0.862305f, 0.870117f, - 0.877930f, 0.884766f, 0.892090f, 0.897949f, 0.905762f, 0.910645f, 0.917480f, 0.923340f, - 0.927734f, 0.933105f, 0.937988f, 0.942871f, 0.947266f, 0.951172f, 0.955566f, 0.960449f, - 0.963379f, 0.967285f, 0.970703f, 0.974609f, 0.978027f, 0.981445f, 0.984863f, 0.986816f, - 0.989746f, 0.993164f, 0.995605f, 0.992188f, 0.988770f, 0.986328f, 0.983398f, 0.980957f, - 0.024796f, 0.075195f, 0.126221f, 0.176025f, 0.224976f, 0.271729f, 0.317383f, 0.359375f, - 0.399902f, 0.437744f, 0.472656f, 0.505371f, 0.536133f, 0.565430f, 0.591797f, 0.615723f, - 0.639648f, 0.660156f, 0.681152f, 0.699219f, 0.718262f, 0.734375f, 0.749512f, 0.764648f, - 0.777832f, 0.791016f, 0.802734f, 0.813965f, 0.825195f, 0.835449f, 0.844727f, 0.854004f, - 0.862305f, 0.871094f, 0.878418f, 0.886230f, 0.893555f, 0.900391f, 0.906738f, 0.912598f, - 0.917969f, 0.923828f, 0.929688f, 0.935059f, 0.939941f, 0.943848f, 0.949219f, 0.953613f, - 0.958008f, 0.961914f, 0.965332f, 0.969238f, 0.972656f, 0.976074f, 0.979492f, 0.982910f, - 0.986328f, 0.989258f, 0.993652f, 0.990723f, 0.987793f, 0.985352f, 0.982910f, 0.979980f, - 0.019119f, 0.058624f, 0.100220f, 0.142578f, 0.185303f, 0.227417f, 0.269287f, 0.310059f, - 0.348877f, 0.385254f, 0.421875f, 0.455566f, 0.489014f, 0.518555f, 0.546875f, 0.574707f, - 0.598633f, 0.624023f, 0.645508f, 0.666016f, 0.684082f, 0.702637f, 0.720703f, 0.736816f, - 0.751465f, 0.766113f, 0.779785f, 0.792969f, 0.804199f, 0.815918f, 0.826660f, 0.836426f, - 0.846191f, 0.855957f, 0.864746f, 0.872559f, 0.880371f, 0.888184f, 0.895508f, 0.902344f, - 0.908691f, 0.914062f, 0.919922f, 0.925293f, 0.932129f, 0.936035f, 0.941895f, 0.946289f, - 0.951172f, 0.955566f, 0.959473f, 0.963867f, 0.967773f, 0.970703f, 0.975586f, 0.978516f, - 0.981934f, 0.985352f, 0.991699f, 0.988770f, 0.986328f, 0.983887f, 0.981445f, 0.979004f, - 0.015175f, 0.046997f, 0.080688f, 0.116028f, 0.152466f, 0.189819f, 0.227417f, 0.264404f, - 0.301758f, 0.338623f, 0.374268f, 0.407471f, 0.439941f, 0.471924f, 0.501465f, 0.529785f, - 0.556641f, 0.582031f, 0.606445f, 0.629395f, 0.649902f, 0.670898f, 0.688965f, 0.708496f, - 0.725098f, 0.740723f, 0.755371f, 0.769531f, 0.782715f, 0.795410f, 0.807129f, 0.818848f, - 0.829590f, 0.839844f, 0.849121f, 0.857910f, 0.866699f, 0.875488f, 0.882812f, 0.890625f, - 0.897461f, 0.904297f, 0.910645f, 0.916992f, 0.922363f, 0.928223f, 0.933594f, 0.938477f, - 0.944824f, 0.949707f, 0.953613f, 0.958008f, 0.962402f, 0.966309f, 0.970703f, 0.974121f, - 0.977539f, 0.981934f, 0.990234f, 0.987793f, 0.984863f, 0.982910f, 0.980469f, 0.978516f, - 0.012215f, 0.038452f, 0.066101f, 0.095825f, 0.126831f, 0.159180f, 0.192749f, 0.226685f, - 0.260986f, 0.294922f, 0.328857f, 0.363037f, 0.394531f, 0.426270f, 0.457520f, 0.486572f, - 0.514648f, 0.541016f, 0.567871f, 0.590820f, 0.614746f, 0.636230f, 0.657227f, 0.676270f, - 0.694336f, 0.711914f, 0.729492f, 0.744141f, 0.759277f, 0.773438f, 0.786621f, 0.798340f, - 0.811523f, 0.822266f, 0.833496f, 0.842773f, 0.851562f, 0.861816f, 0.869629f, 0.878418f, - 0.885742f, 0.893066f, 0.900879f, 0.907715f, 0.913574f, 0.919922f, 0.925781f, 0.932129f, - 0.937012f, 0.942871f, 0.946777f, 0.951660f, 0.957031f, 0.960938f, 0.965332f, 0.969727f, - 0.973633f, 0.977051f, 0.988281f, 0.986328f, 0.983887f, 0.981445f, 0.979492f, 0.976562f, - 0.009903f, 0.031525f, 0.054626f, 0.078979f, 0.105408f, 0.133789f, 0.162720f, 0.192993f, - 0.224976f, 0.256592f, 0.288330f, 0.320312f, 0.352295f, 0.383545f, 0.414062f, 0.443848f, - 0.473389f, 0.500488f, 0.526367f, 0.553223f, 0.577637f, 0.600586f, 0.622070f, 0.644043f, - 0.664551f, 0.683105f, 0.701660f, 0.718262f, 0.734375f, 0.750000f, 0.764648f, 0.778320f, - 0.791016f, 0.802734f, 0.815430f, 0.826172f, 0.836426f, 0.845703f, 0.855957f, 0.864258f, - 0.874023f, 0.881348f, 0.889648f, 0.896973f, 0.904297f, 0.911621f, 0.917480f, 0.922852f, - 0.929199f, 0.935059f, 0.939941f, 0.944824f, 0.950195f, 0.954590f, 0.959961f, 0.964355f, - 0.968262f, 0.972656f, 0.986328f, 0.984375f, 0.981934f, 0.979980f, 0.978027f, 0.975586f, - 0.008385f, 0.026154f, 0.045319f, 0.066467f, 0.089111f, 0.113220f, 0.138916f, 0.165405f, - 0.192871f, 0.222290f, 0.252197f, 0.281494f, 0.311279f, 0.342285f, 0.372314f, 0.402832f, - 0.431641f, 0.459473f, 0.486572f, 0.513672f, 0.539062f, 0.562988f, 0.587402f, 0.609863f, - 0.631348f, 0.652344f, 0.671875f, 0.689941f, 0.708008f, 0.724609f, 0.740234f, 0.755371f, - 0.768066f, 0.783203f, 0.795410f, 0.808105f, 0.819336f, 0.830078f, 0.840332f, 0.851074f, - 0.860352f, 0.869141f, 0.877930f, 0.885742f, 0.893555f, 0.900879f, 0.907715f, 0.915039f, - 0.920410f, 0.926758f, 0.933105f, 0.938965f, 0.944336f, 0.949707f, 0.953613f, 0.958984f, - 0.962891f, 0.967285f, 0.984375f, 0.982910f, 0.980957f, 0.978516f, 0.976562f, 0.974609f, - 0.006992f, 0.022324f, 0.038544f, 0.056396f, 0.075317f, 0.095947f, 0.117981f, 0.141968f, - 0.166504f, 0.192627f, 0.219238f, 0.246704f, 0.275879f, 0.304443f, 0.333252f, 0.362305f, - 0.390869f, 0.419678f, 0.447266f, 0.474121f, 0.500977f, 0.525879f, 0.551270f, 0.574219f, - 0.597656f, 0.620117f, 0.641602f, 0.661133f, 0.680664f, 0.698242f, 0.715332f, 0.731934f, - 0.746582f, 0.761230f, 0.775391f, 0.789551f, 0.802246f, 0.813477f, 0.825195f, 0.835938f, - 0.846191f, 0.855957f, 0.865723f, 0.873535f, 0.882324f, 0.890625f, 0.898438f, 0.905762f, - 0.912598f, 0.918945f, 0.925781f, 0.931641f, 0.937012f, 0.943848f, 0.948730f, 0.954102f, - 0.957520f, 0.963379f, 0.981934f, 0.980957f, 0.979004f, 0.977051f, 0.975098f, 0.973145f, - 0.006260f, 0.018387f, 0.032684f, 0.047821f, 0.064636f, 0.082153f, 0.101318f, 0.122009f, - 0.143921f, 0.166870f, 0.191406f, 0.216187f, 0.243164f, 0.269287f, 0.297119f, 0.324951f, - 0.352783f, 0.380859f, 0.408691f, 0.435547f, 0.462402f, 0.489258f, 0.514160f, 0.540039f, - 0.563965f, 0.585938f, 0.608398f, 0.629395f, 0.649414f, 0.669434f, 0.689453f, 0.705566f, - 0.722656f, 0.739258f, 0.753418f, 0.769043f, 0.783203f, 0.795898f, 0.807617f, 0.819824f, - 0.830566f, 0.842285f, 0.852051f, 0.862305f, 0.871094f, 0.878906f, 0.888184f, 0.895996f, - 0.902832f, 0.910645f, 0.917480f, 0.924316f, 0.930176f, 0.936523f, 0.942383f, 0.946777f, - 0.953613f, 0.958496f, 0.979980f, 0.979004f, 0.977539f, 0.975586f, 0.973633f, 0.972168f, - 0.005268f, 0.016418f, 0.028091f, 0.041107f, 0.055420f, 0.070435f, 0.087341f, 0.105347f, - 0.124512f, 0.144531f, 0.166260f, 0.189453f, 0.213989f, 0.238037f, 0.263184f, 0.290039f, - 0.317139f, 0.344238f, 0.370850f, 0.398438f, 0.425293f, 0.451660f, 0.477539f, 0.503418f, - 0.528320f, 0.551270f, 0.576172f, 0.598145f, 0.619629f, 0.640137f, 0.659668f, 0.680176f, - 0.697754f, 0.714844f, 0.731934f, 0.748047f, 0.762695f, 0.776367f, 0.790039f, 0.803223f, - 0.814453f, 0.827148f, 0.837891f, 0.847656f, 0.858398f, 0.868164f, 0.876953f, 0.885742f, - 0.893066f, 0.901855f, 0.908691f, 0.916504f, 0.922852f, 0.929199f, 0.935059f, 0.941895f, - 0.947754f, 0.953125f, 0.978027f, 0.977539f, 0.975586f, 0.973633f, 0.971680f, 0.969727f, - 0.004372f, 0.013802f, 0.024185f, 0.036011f, 0.047729f, 0.060944f, 0.075684f, 0.090820f, - 0.107788f, 0.125488f, 0.144653f, 0.165771f, 0.187012f, 0.210205f, 0.233643f, 0.258545f, - 0.283447f, 0.309326f, 0.335449f, 0.362305f, 0.388672f, 0.415771f, 0.441650f, 0.468018f, - 0.492920f, 0.518066f, 0.542480f, 0.564941f, 0.587891f, 0.609863f, 0.630859f, 0.651855f, - 0.670898f, 0.689453f, 0.707520f, 0.724609f, 0.740723f, 0.755859f, 0.770996f, 0.785156f, - 0.799316f, 0.809570f, 0.822754f, 0.834473f, 0.845215f, 0.855469f, 0.865723f, 0.874023f, - 0.883301f, 0.892090f, 0.899902f, 0.907715f, 0.915039f, 0.922363f, 0.928711f, 0.935059f, - 0.941406f, 0.947266f, 0.975586f, 0.975098f, 0.973633f, 0.971680f, 0.969727f, 0.968262f, - 0.003809f, 0.012253f, 0.021240f, 0.030884f, 0.041473f, 0.052887f, 0.065308f, 0.079224f, - 0.094177f, 0.109558f, 0.126709f, 0.145142f, 0.163940f, 0.184814f, 0.207397f, 0.229736f, - 0.252686f, 0.276855f, 0.302246f, 0.327881f, 0.353271f, 0.380127f, 0.405762f, 0.432129f, - 0.457520f, 0.482422f, 0.507324f, 0.531250f, 0.556152f, 0.578125f, 0.600586f, 0.622559f, - 0.642578f, 0.662109f, 0.681641f, 0.700195f, 0.716797f, 0.734375f, 0.750000f, 0.766113f, - 0.779297f, 0.793457f, 0.807129f, 0.819336f, 0.830078f, 0.842285f, 0.853027f, 0.862793f, - 0.872559f, 0.881348f, 0.890625f, 0.899414f, 0.907227f, 0.914551f, 0.920898f, 0.928223f, - 0.935059f, 0.941406f, 0.973633f, 0.973145f, 0.971680f, 0.970215f, 0.968262f, 0.966797f, - 0.003462f, 0.010796f, 0.018646f, 0.026962f, 0.036377f, 0.046173f, 0.057190f, 0.068665f, - 0.081726f, 0.095520f, 0.110962f, 0.127563f, 0.144897f, 0.162476f, 0.182373f, 0.202881f, - 0.225342f, 0.248291f, 0.271729f, 0.294922f, 0.320312f, 0.345459f, 0.370850f, 0.397217f, - 0.422607f, 0.447998f, 0.473145f, 0.498291f, 0.522461f, 0.546875f, 0.569824f, 0.591797f, - 0.614258f, 0.635742f, 0.655273f, 0.674805f, 0.693359f, 0.711426f, 0.729492f, 0.745605f, - 0.760742f, 0.775391f, 0.789551f, 0.803223f, 0.816406f, 0.828125f, 0.839844f, 0.850586f, - 0.861328f, 0.871094f, 0.880371f, 0.889648f, 0.898438f, 0.906250f, 0.915039f, 0.921875f, - 0.928223f, 0.935547f, 0.970703f, 0.970215f, 0.970215f, 0.967773f, 0.966309f, 0.965332f, - 0.002872f, 0.009338f, 0.016174f, 0.024231f, 0.031525f, 0.040558f, 0.050140f, 0.060455f, - 0.071472f, 0.084167f, 0.097168f, 0.111450f, 0.127197f, 0.143433f, 0.160889f, 0.179565f, - 0.199463f, 0.220825f, 0.242554f, 0.265625f, 0.288818f, 0.312744f, 0.338135f, 0.362793f, - 0.387939f, 0.414307f, 0.439453f, 0.464355f, 0.489014f, 0.514648f, 0.537598f, 0.561523f, - 0.583984f, 0.606445f, 0.627930f, 0.648926f, 0.667480f, 0.687988f, 0.705566f, 0.723633f, - 0.740234f, 0.756348f, 0.771484f, 0.786621f, 0.799805f, 0.812012f, 0.825195f, 0.836426f, - 0.849121f, 0.859375f, 0.870605f, 0.879883f, 0.888672f, 0.897461f, 0.905762f, 0.915039f, - 0.921387f, 0.928711f, 0.967773f, 0.969238f, 0.966797f, 0.966797f, 0.964355f, 0.963379f, - 0.002750f, 0.008202f, 0.014519f, 0.021301f, 0.028183f, 0.035828f, 0.044342f, 0.053375f, - 0.063354f, 0.074219f, 0.085876f, 0.098083f, 0.111938f, 0.126343f, 0.142212f, 0.158936f, - 0.177124f, 0.196411f, 0.216553f, 0.237427f, 0.260010f, 0.282715f, 0.306641f, 0.330811f, - 0.355957f, 0.381104f, 0.405518f, 0.431152f, 0.456543f, 0.480957f, 0.504883f, 0.529785f, - 0.553223f, 0.577148f, 0.599121f, 0.620605f, 0.642090f, 0.662598f, 0.682617f, 0.701172f, - 0.718750f, 0.735352f, 0.751953f, 0.768066f, 0.783691f, 0.796875f, 0.810547f, 0.822754f, - 0.835938f, 0.847656f, 0.858398f, 0.869141f, 0.879395f, 0.888672f, 0.897949f, 0.906250f, - 0.914551f, 0.922363f, 0.965820f, 0.966797f, 0.965820f, 0.963867f, 0.963379f, 0.961426f, - 0.002264f, 0.007446f, 0.012741f, 0.018494f, 0.024536f, 0.031769f, 0.039154f, 0.047424f, - 0.056122f, 0.065308f, 0.075623f, 0.087219f, 0.098755f, 0.111328f, 0.125854f, 0.140869f, - 0.157349f, 0.174805f, 0.193115f, 0.212402f, 0.233643f, 0.254883f, 0.276855f, 0.300293f, - 0.324463f, 0.348389f, 0.374023f, 0.398193f, 0.423340f, 0.448242f, 0.473877f, 0.498291f, - 0.521973f, 0.545898f, 0.569824f, 0.592773f, 0.614258f, 0.635742f, 0.657227f, 0.676270f, - 0.695801f, 0.714844f, 0.731445f, 0.749512f, 0.765137f, 0.779785f, 0.793945f, 0.808594f, - 0.821777f, 0.833496f, 0.846191f, 0.858398f, 0.868652f, 0.879395f, 0.888672f, 0.897949f, - 0.906738f, 0.916016f, 0.962402f, 0.963867f, 0.962891f, 0.961914f, 0.960938f, 0.958984f, - 0.002377f, 0.006668f, 0.011467f, 0.016693f, 0.021820f, 0.028091f, 0.034485f, 0.041748f, - 0.049347f, 0.057678f, 0.066589f, 0.076538f, 0.086975f, 0.098816f, 0.111816f, 0.125366f, - 0.139404f, 0.155151f, 0.171875f, 0.190186f, 0.208496f, 0.228760f, 0.250244f, 0.271973f, - 0.294189f, 0.317871f, 0.341797f, 0.365479f, 0.391357f, 0.415771f, 0.440430f, 0.466797f, - 0.491699f, 0.515625f, 0.539551f, 0.563477f, 0.585938f, 0.608887f, 0.630371f, 0.651855f, - 0.672363f, 0.692383f, 0.710449f, 0.729492f, 0.745605f, 0.762695f, 0.778320f, 0.792480f, - 0.807129f, 0.820801f, 0.833984f, 0.846680f, 0.857910f, 0.869141f, 0.879395f, 0.889648f, - 0.899414f, 0.907715f, 0.959473f, 0.961426f, 0.960449f, 0.959961f, 0.958496f, 0.957031f, - 0.002062f, 0.006180f, 0.010201f, 0.015053f, 0.019531f, 0.025116f, 0.030960f, 0.037292f, - 0.043915f, 0.051117f, 0.059570f, 0.067749f, 0.076843f, 0.087708f, 0.099060f, 0.110352f, - 0.123413f, 0.138062f, 0.153198f, 0.169067f, 0.186768f, 0.204956f, 0.224487f, 0.244873f, - 0.265625f, 0.288330f, 0.311768f, 0.335205f, 0.359863f, 0.384521f, 0.409668f, 0.434082f, - 0.459717f, 0.483887f, 0.508789f, 0.533203f, 0.557617f, 0.580566f, 0.603516f, 0.626465f, - 0.646484f, 0.667969f, 0.687500f, 0.708008f, 0.726074f, 0.744141f, 0.760742f, 0.776367f, - 0.791504f, 0.806641f, 0.820312f, 0.833496f, 0.846191f, 0.858398f, 0.869629f, 0.879883f, - 0.890625f, 0.900879f, 0.956543f, 0.958496f, 0.958008f, 0.956543f, 0.955566f, 0.954102f, - 0.001774f, 0.005459f, 0.009155f, 0.013290f, 0.017807f, 0.022537f, 0.027527f, 0.033081f, - 0.038818f, 0.045380f, 0.052643f, 0.060516f, 0.068420f, 0.077942f, 0.087952f, 0.098572f, - 0.109863f, 0.122925f, 0.136230f, 0.150146f, 0.166382f, 0.183105f, 0.201172f, 0.219482f, - 0.240112f, 0.261230f, 0.283203f, 0.305664f, 0.329590f, 0.353027f, 0.377930f, 0.402344f, - 0.427490f, 0.453369f, 0.478516f, 0.502930f, 0.527832f, 0.552246f, 0.575684f, 0.598145f, - 0.621094f, 0.643555f, 0.664551f, 0.685547f, 0.704590f, 0.723633f, 0.742188f, 0.759277f, - 0.775879f, 0.791016f, 0.806152f, 0.820801f, 0.833496f, 0.847168f, 0.859375f, 0.870605f, - 0.881348f, 0.893066f, 0.953125f, 0.956055f, 0.955566f, 0.954102f, 0.953125f, 0.951660f, - 0.001655f, 0.004757f, 0.008308f, 0.011993f, 0.015808f, 0.020187f, 0.024780f, 0.029434f, - 0.034851f, 0.040741f, 0.046997f, 0.053650f, 0.061096f, 0.069397f, 0.078064f, 0.087280f, - 0.097351f, 0.108887f, 0.121033f, 0.134277f, 0.148560f, 0.163330f, 0.180054f, 0.197144f, - 0.215332f, 0.235718f, 0.255859f, 0.277588f, 0.300049f, 0.323730f, 0.347656f, 0.371826f, - 0.396729f, 0.422607f, 0.447021f, 0.472168f, 0.497803f, 0.521973f, 0.547363f, 0.571289f, - 0.594238f, 0.618164f, 0.640137f, 0.662109f, 0.682617f, 0.702637f, 0.722168f, 0.739746f, - 0.758301f, 0.774902f, 0.790527f, 0.806641f, 0.820801f, 0.834961f, 0.848633f, 0.860352f, - 0.872559f, 0.883789f, 0.949707f, 0.953125f, 0.952148f, 0.951172f, 0.950684f, 0.948730f, - 0.001418f, 0.004456f, 0.007584f, 0.010803f, 0.014450f, 0.018005f, 0.022186f, 0.026398f, - 0.031342f, 0.036224f, 0.041687f, 0.048126f, 0.054382f, 0.061676f, 0.069641f, 0.077759f, - 0.086914f, 0.097168f, 0.107910f, 0.119263f, 0.132446f, 0.145752f, 0.161011f, 0.176758f, - 0.193726f, 0.211914f, 0.231201f, 0.251709f, 0.272705f, 0.294922f, 0.318604f, 0.342041f, - 0.366455f, 0.390869f, 0.416992f, 0.441895f, 0.467285f, 0.493164f, 0.517578f, 0.541992f, - 0.566895f, 0.590820f, 0.614746f, 0.637207f, 0.660156f, 0.681152f, 0.701172f, 0.720703f, - 0.739746f, 0.758301f, 0.775391f, 0.791992f, 0.807617f, 0.821289f, 0.836426f, 0.850586f, - 0.863281f, 0.874512f, 0.946777f, 0.949707f, 0.949707f, 0.948730f, 0.947266f, 0.946289f, - 0.001213f, 0.003864f, 0.006721f, 0.009796f, 0.012932f, 0.016037f, 0.020218f, 0.024231f, - 0.028275f, 0.032379f, 0.037567f, 0.042603f, 0.048584f, 0.054993f, 0.061798f, 0.069519f, - 0.077637f, 0.086182f, 0.095703f, 0.106323f, 0.117676f, 0.130127f, 0.143555f, 0.158203f, - 0.173462f, 0.189941f, 0.207886f, 0.226807f, 0.247192f, 0.267822f, 0.290527f, 0.312500f, - 0.336670f, 0.360352f, 0.385742f, 0.410889f, 0.437256f, 0.462646f, 0.488281f, 0.513184f, - 0.539062f, 0.563477f, 0.588379f, 0.612305f, 0.636230f, 0.657715f, 0.679199f, 0.700195f, - 0.720703f, 0.740234f, 0.758301f, 0.775879f, 0.793945f, 0.809082f, 0.824219f, 0.838867f, - 0.852539f, 0.865234f, 0.942871f, 0.946777f, 0.946777f, 0.945312f, 0.944824f, 0.943359f, - 0.001063f, 0.003754f, 0.005909f, 0.008789f, 0.011780f, 0.014671f, 0.017792f, 0.021378f, - 0.025238f, 0.029221f, 0.033417f, 0.038300f, 0.043488f, 0.048828f, 0.054779f, 0.061554f, - 0.068604f, 0.076721f, 0.085388f, 0.094482f, 0.104614f, 0.115845f, 0.128296f, 0.141113f, - 0.155029f, 0.170044f, 0.186401f, 0.204224f, 0.222778f, 0.242188f, 0.263916f, 0.285156f, - 0.308350f, 0.331787f, 0.355957f, 0.381348f, 0.407227f, 0.432617f, 0.459229f, 0.484619f, - 0.509277f, 0.536133f, 0.560547f, 0.585938f, 0.609863f, 0.633301f, 0.657715f, 0.678711f, - 0.699707f, 0.721191f, 0.740723f, 0.759277f, 0.777344f, 0.794922f, 0.811035f, 0.826660f, - 0.841797f, 0.855469f, 0.939453f, 0.943359f, 0.943359f, 0.942871f, 0.941895f, 0.940918f, - 0.001175f, 0.003069f, 0.005558f, 0.007912f, 0.010712f, 0.013199f, 0.016235f, 0.019547f, - 0.022659f, 0.026138f, 0.030151f, 0.034424f, 0.038940f, 0.044067f, 0.049255f, 0.054993f, - 0.061493f, 0.068359f, 0.075928f, 0.084290f, 0.093262f, 0.103760f, 0.114319f, 0.126099f, - 0.138550f, 0.152466f, 0.167114f, 0.183472f, 0.200439f, 0.219238f, 0.239014f, 0.259277f, - 0.281250f, 0.303711f, 0.327148f, 0.351807f, 0.376709f, 0.402344f, 0.428955f, 0.453857f, - 0.480713f, 0.507324f, 0.533203f, 0.558594f, 0.583984f, 0.609375f, 0.633301f, 0.656738f, - 0.678711f, 0.700195f, 0.722168f, 0.742188f, 0.761719f, 0.780273f, 0.797852f, 0.813477f, - 0.830078f, 0.845703f, 0.935547f, 0.939453f, 0.939453f, 0.938965f, 0.937988f, 0.937012f, - 0.001089f, 0.002945f, 0.005066f, 0.007225f, 0.009575f, 0.012016f, 0.014656f, 0.017288f, - 0.020142f, 0.023712f, 0.026764f, 0.030640f, 0.034637f, 0.039490f, 0.043854f, 0.048706f, - 0.054688f, 0.060913f, 0.067871f, 0.075256f, 0.083191f, 0.092163f, 0.101868f, 0.111938f, - 0.123657f, 0.136108f, 0.149658f, 0.164185f, 0.179932f, 0.196777f, 0.215454f, 0.234375f, - 0.255371f, 0.276611f, 0.299805f, 0.323486f, 0.347656f, 0.373047f, 0.398682f, 0.425293f, - 0.451172f, 0.477783f, 0.504883f, 0.530762f, 0.557617f, 0.583008f, 0.607910f, 0.632812f, - 0.657227f, 0.680664f, 0.702637f, 0.724121f, 0.743652f, 0.764160f, 0.783691f, 0.800781f, - 0.818848f, 0.833984f, 0.930664f, 0.936035f, 0.936035f, 0.935547f, 0.934570f, 0.933594f, - 0.000847f, 0.002800f, 0.004562f, 0.006786f, 0.008804f, 0.011017f, 0.013145f, 0.015640f, - 0.018509f, 0.021255f, 0.024277f, 0.027603f, 0.030991f, 0.035248f, 0.039642f, 0.043854f, - 0.048798f, 0.054504f, 0.060516f, 0.067017f, 0.073914f, 0.082092f, 0.090515f, 0.099854f, - 0.109863f, 0.121521f, 0.133545f, 0.146851f, 0.161133f, 0.176514f, 0.192993f, 0.211426f, - 0.230957f, 0.251465f, 0.272705f, 0.295410f, 0.319092f, 0.343994f, 0.369385f, 0.395020f, - 0.421631f, 0.448242f, 0.475342f, 0.501953f, 0.529785f, 0.556152f, 0.582031f, 0.608887f, - 0.633789f, 0.658203f, 0.681152f, 0.704590f, 0.726074f, 0.748535f, 0.768555f, 0.787109f, - 0.804199f, 0.822754f, 0.926758f, 0.931641f, 0.932129f, 0.931641f, 0.931152f, 0.930176f, - 0.001035f, 0.002598f, 0.004147f, 0.006062f, 0.007942f, 0.009933f, 0.012405f, 0.014565f, - 0.016174f, 0.019135f, 0.021988f, 0.024811f, 0.028259f, 0.031616f, 0.035065f, 0.039429f, - 0.043884f, 0.048615f, 0.053833f, 0.059723f, 0.065796f, 0.072693f, 0.080383f, 0.088745f, - 0.098206f, 0.107727f, 0.119080f, 0.130981f, 0.143677f, 0.157959f, 0.173218f, 0.189941f, - 0.207642f, 0.226929f, 0.247437f, 0.269043f, 0.291748f, 0.315674f, 0.340576f, 0.366211f, - 0.392578f, 0.419434f, 0.446533f, 0.473877f, 0.502441f, 0.528320f, 0.556152f, 0.583008f, - 0.609375f, 0.635254f, 0.660156f, 0.684082f, 0.706543f, 0.729980f, 0.751953f, 0.771973f, - 0.792480f, 0.810547f, 0.922363f, 0.927734f, 0.928223f, 0.928223f, 0.927246f, 0.926758f, - 0.000775f, 0.002325f, 0.003843f, 0.005573f, 0.007397f, 0.009163f, 0.010857f, 0.012939f, - 0.015312f, 0.017273f, 0.019684f, 0.022537f, 0.025070f, 0.028183f, 0.031616f, 0.035461f, - 0.038940f, 0.043671f, 0.048096f, 0.053131f, 0.058411f, 0.064941f, 0.071777f, 0.078857f, - 0.086731f, 0.096130f, 0.105835f, 0.116760f, 0.128296f, 0.140747f, 0.154907f, 0.170410f, - 0.186646f, 0.204834f, 0.223633f, 0.243896f, 0.265625f, 0.288330f, 0.312012f, 0.337402f, - 0.363037f, 0.389648f, 0.417480f, 0.444824f, 0.473633f, 0.500000f, 0.529297f, 0.556641f, - 0.583984f, 0.610840f, 0.638184f, 0.662598f, 0.687988f, 0.711914f, 0.734375f, 0.755859f, - 0.777832f, 0.798828f, 0.916992f, 0.922852f, 0.923828f, 0.923828f, 0.923340f, 0.922363f, - 0.000617f, 0.002234f, 0.003510f, 0.005035f, 0.006397f, 0.008156f, 0.010033f, 0.011665f, - 0.013481f, 0.015717f, 0.017700f, 0.020004f, 0.022766f, 0.025391f, 0.028214f, 0.031586f, - 0.035217f, 0.038757f, 0.042999f, 0.047668f, 0.052368f, 0.057434f, 0.063538f, 0.070190f, - 0.077698f, 0.085449f, 0.094299f, 0.103394f, 0.113953f, 0.125610f, 0.137817f, 0.151855f, - 0.167236f, 0.183228f, 0.200806f, 0.219971f, 0.240479f, 0.262451f, 0.285645f, 0.309570f, - 0.334961f, 0.360596f, 0.387939f, 0.416016f, 0.444092f, 0.473145f, 0.501465f, 0.529785f, - 0.558105f, 0.585938f, 0.614258f, 0.640137f, 0.666992f, 0.692383f, 0.716797f, 0.739746f, - 0.763184f, 0.784180f, 0.912109f, 0.918457f, 0.919434f, 0.919434f, 0.918457f, 0.917969f, - 0.000665f, 0.002039f, 0.003386f, 0.004520f, 0.005989f, 0.007511f, 0.009262f, 0.010902f, - 0.012314f, 0.014320f, 0.015869f, 0.018127f, 0.020248f, 0.022476f, 0.025284f, 0.028122f, - 0.030991f, 0.034668f, 0.038239f, 0.042206f, 0.046539f, 0.051361f, 0.056610f, 0.062347f, - 0.068604f, 0.075623f, 0.083313f, 0.092041f, 0.101379f, 0.111572f, 0.122986f, 0.135132f, - 0.148926f, 0.164062f, 0.180054f, 0.197510f, 0.216797f, 0.237183f, 0.259521f, 0.282227f, - 0.307129f, 0.332764f, 0.358887f, 0.386475f, 0.415527f, 0.443604f, 0.473389f, 0.501465f, - 0.530762f, 0.560059f, 0.588867f, 0.617676f, 0.645020f, 0.671387f, 0.698242f, 0.722656f, - 0.746094f, 0.770020f, 0.906738f, 0.913574f, 0.915039f, 0.914551f, 0.914062f, 0.914062f, - 0.000661f, 0.001754f, 0.002831f, 0.004066f, 0.005333f, 0.006668f, 0.008286f, 0.009773f, - 0.011124f, 0.012794f, 0.014320f, 0.016357f, 0.018036f, 0.020386f, 0.022766f, 0.025192f, - 0.027924f, 0.030807f, 0.034027f, 0.037628f, 0.041321f, 0.045349f, 0.050262f, 0.055328f, - 0.060699f, 0.066833f, 0.073669f, 0.081360f, 0.089600f, 0.099060f, 0.108826f, 0.119995f, - 0.132324f, 0.145874f, 0.160889f, 0.176880f, 0.194702f, 0.213379f, 0.234497f, 0.256104f, - 0.280029f, 0.304688f, 0.330811f, 0.358154f, 0.385986f, 0.415039f, 0.444092f, 0.474609f, - 0.503418f, 0.534180f, 0.563965f, 0.592773f, 0.621094f, 0.650391f, 0.678223f, 0.704590f, - 0.730469f, 0.754883f, 0.901855f, 0.908691f, 0.910156f, 0.909668f, 0.909668f, 0.908691f, - 0.000653f, 0.001667f, 0.002666f, 0.003887f, 0.004986f, 0.006359f, 0.007202f, 0.008751f, - 0.010300f, 0.011757f, 0.012939f, 0.014595f, 0.016281f, 0.018234f, 0.020142f, 0.022415f, - 0.025101f, 0.027466f, 0.030182f, 0.033539f, 0.036865f, 0.040680f, 0.044342f, 0.048798f, - 0.053619f, 0.059479f, 0.065491f, 0.071716f, 0.079285f, 0.087341f, 0.096497f, 0.106445f, - 0.117615f, 0.129395f, 0.142822f, 0.157959f, 0.174194f, 0.192139f, 0.210938f, 0.231567f, - 0.253906f, 0.277832f, 0.302979f, 0.329590f, 0.357422f, 0.385986f, 0.415283f, 0.446045f, - 0.475830f, 0.506348f, 0.537109f, 0.567871f, 0.599121f, 0.628418f, 0.657227f, 0.685547f, - 0.712891f, 0.739746f, 0.895508f, 0.902344f, 0.904297f, 0.904785f, 0.904297f, 0.904297f, - 0.000372f, 0.001397f, 0.002384f, 0.003529f, 0.004509f, 0.005505f, 0.007015f, 0.008026f, - 0.009201f, 0.010292f, 0.011536f, 0.013130f, 0.014915f, 0.016266f, 0.018387f, 0.020218f, - 0.022034f, 0.024399f, 0.026901f, 0.029617f, 0.032623f, 0.035950f, 0.039032f, 0.043030f, - 0.047577f, 0.052612f, 0.057556f, 0.063477f, 0.070007f, 0.077209f, 0.085083f, 0.094177f, - 0.103821f, 0.114563f, 0.126709f, 0.140015f, 0.154785f, 0.171143f, 0.188477f, 0.208252f, - 0.229004f, 0.251709f, 0.275879f, 0.302002f, 0.328613f, 0.356445f, 0.385986f, 0.416504f, - 0.447510f, 0.478760f, 0.510254f, 0.542480f, 0.573730f, 0.604980f, 0.635742f, 0.665527f, - 0.694336f, 0.722656f, 0.887695f, 0.897949f, 0.898926f, 0.899414f, 0.897949f, 0.898438f, - 0.000661f, 0.001222f, 0.002275f, 0.003313f, 0.004181f, 0.005119f, 0.006275f, 0.007126f, - 0.007988f, 0.009354f, 0.010300f, 0.012062f, 0.013313f, 0.014786f, 0.016251f, 0.018021f, - 0.019516f, 0.021896f, 0.024017f, 0.026428f, 0.029022f, 0.031799f, 0.034698f, 0.038422f, - 0.042236f, 0.046265f, 0.050598f, 0.055786f, 0.061493f, 0.067871f, 0.074951f, 0.082458f, - 0.091187f, 0.101135f, 0.111694f, 0.123779f, 0.137207f, 0.151978f, 0.167969f, 0.186157f, - 0.205688f, 0.226929f, 0.249756f, 0.274658f, 0.301025f, 0.328613f, 0.357178f, 0.387207f, - 0.418457f, 0.450195f, 0.482422f, 0.516113f, 0.548340f, 0.580566f, 0.612305f, 0.644043f, - 0.674805f, 0.705566f, 0.882812f, 0.890625f, 0.892578f, 0.893066f, 0.892578f, 0.893066f, - 0.000379f, 0.001211f, 0.002066f, 0.003040f, 0.003834f, 0.004616f, 0.005608f, 0.006550f, - 0.007347f, 0.008408f, 0.009529f, 0.010452f, 0.011940f, 0.013039f, 0.014313f, 0.015961f, - 0.017746f, 0.019180f, 0.021210f, 0.023239f, 0.025482f, 0.028030f, 0.030640f, 0.033661f, - 0.036987f, 0.040466f, 0.044617f, 0.048828f, 0.053894f, 0.059235f, 0.065674f, 0.072632f, - 0.079956f, 0.089050f, 0.098267f, 0.109009f, 0.120789f, 0.134521f, 0.148926f, 0.165405f, - 0.183228f, 0.202881f, 0.224731f, 0.248779f, 0.273193f, 0.300049f, 0.329346f, 0.358887f, - 0.390381f, 0.421387f, 0.454590f, 0.488770f, 0.521484f, 0.555176f, 0.588379f, 0.621582f, - 0.654785f, 0.686523f, 0.875488f, 0.885254f, 0.886719f, 0.886230f, 0.886719f, 0.886230f, - 0.000282f, 0.001126f, 0.002010f, 0.002661f, 0.003340f, 0.004269f, 0.005192f, 0.005711f, - 0.006638f, 0.007278f, 0.008377f, 0.009483f, 0.010567f, 0.011742f, 0.012871f, 0.014061f, - 0.015480f, 0.017242f, 0.018799f, 0.020584f, 0.022461f, 0.024490f, 0.027100f, 0.029434f, - 0.032532f, 0.035706f, 0.038971f, 0.042969f, 0.047241f, 0.052094f, 0.057373f, 0.063232f, - 0.070007f, 0.077637f, 0.086243f, 0.095764f, 0.106323f, 0.118164f, 0.131470f, 0.146118f, - 0.162720f, 0.181030f, 0.200928f, 0.223022f, 0.247070f, 0.272705f, 0.300537f, 0.330322f, - 0.360107f, 0.393066f, 0.426270f, 0.459473f, 0.494629f, 0.529297f, 0.564453f, 0.598633f, - 0.633789f, 0.666504f, 0.868652f, 0.878418f, 0.879395f, 0.880371f, 0.879883f, 0.879395f, - 0.000340f, 0.000963f, 0.001826f, 0.002459f, 0.003307f, 0.003847f, 0.004719f, 0.004936f, - 0.005802f, 0.006695f, 0.007748f, 0.008522f, 0.009506f, 0.010376f, 0.011383f, 0.012787f, - 0.013901f, 0.015182f, 0.016663f, 0.018051f, 0.019821f, 0.021759f, 0.023590f, 0.025818f, - 0.028519f, 0.030975f, 0.034210f, 0.037811f, 0.040802f, 0.045349f, 0.050201f, 0.055298f, - 0.061310f, 0.067688f, 0.074768f, 0.083557f, 0.092590f, 0.103149f, 0.115479f, 0.128906f, - 0.142944f, 0.160278f, 0.178345f, 0.198975f, 0.221802f, 0.246094f, 0.272949f, 0.301514f, - 0.331543f, 0.363525f, 0.396729f, 0.430908f, 0.466553f, 0.501953f, 0.538086f, 0.574707f, - 0.610840f, 0.646973f, 0.860352f, 0.870605f, 0.873047f, 0.873047f, 0.873535f, 0.872559f, - 0.000225f, 0.001021f, 0.001653f, 0.002302f, 0.002827f, 0.003448f, 0.003937f, 0.004486f, - 0.004986f, 0.006252f, 0.007000f, 0.007416f, 0.008224f, 0.009300f, 0.009972f, 0.011322f, - 0.012115f, 0.013428f, 0.014557f, 0.015991f, 0.017532f, 0.018982f, 0.020706f, 0.022781f, - 0.024567f, 0.027161f, 0.029770f, 0.032623f, 0.035828f, 0.039551f, 0.043030f, 0.047852f, - 0.052795f, 0.058716f, 0.065125f, 0.072266f, 0.080566f, 0.089661f, 0.100403f, 0.112854f, - 0.125732f, 0.140991f, 0.157349f, 0.176514f, 0.197510f, 0.220581f, 0.245850f, 0.273438f, - 0.302979f, 0.334717f, 0.367676f, 0.401855f, 0.437256f, 0.474609f, 0.512695f, 0.549316f, - 0.588379f, 0.625000f, 0.853027f, 0.863281f, 0.866211f, 0.866211f, 0.866699f, 0.866211f, - 0.000324f, 0.000845f, 0.001534f, 0.002172f, 0.002474f, 0.003115f, 0.003824f, 0.003937f, - 0.004848f, 0.005417f, 0.006222f, 0.006760f, 0.007446f, 0.008186f, 0.009102f, 0.009888f, - 0.010620f, 0.011551f, 0.012878f, 0.013954f, 0.015106f, 0.016495f, 0.018143f, 0.019669f, - 0.021713f, 0.023468f, 0.025818f, 0.028183f, 0.031021f, 0.033783f, 0.037445f, 0.041534f, - 0.045532f, 0.050598f, 0.056152f, 0.062500f, 0.069580f, 0.077698f, 0.086914f, 0.097717f, - 0.108948f, 0.123047f, 0.138184f, 0.155273f, 0.174438f, 0.196167f, 0.219604f, 0.246094f, - 0.274902f, 0.305420f, 0.338379f, 0.372314f, 0.408936f, 0.445801f, 0.484131f, 0.523438f, - 0.562988f, 0.604492f, 0.843262f, 0.856445f, 0.857422f, 0.857910f, 0.858398f, 0.858398f, - 0.000331f, 0.000944f, 0.001288f, 0.001833f, 0.002388f, 0.002769f, 0.003216f, 0.003664f, - 0.004276f, 0.004822f, 0.005173f, 0.005951f, 0.006531f, 0.007156f, 0.007896f, 0.008438f, - 0.009430f, 0.010117f, 0.011208f, 0.012253f, 0.012970f, 0.014297f, 0.015572f, 0.017059f, - 0.018692f, 0.020264f, 0.022125f, 0.024323f, 0.026474f, 0.029343f, 0.032288f, 0.035461f, - 0.039062f, 0.043335f, 0.047821f, 0.053558f, 0.059509f, 0.067078f, 0.074341f, 0.083862f, - 0.094360f, 0.106323f, 0.120117f, 0.135254f, 0.153442f, 0.172852f, 0.195190f, 0.220337f, - 0.246948f, 0.276611f, 0.308594f, 0.343262f, 0.379150f, 0.416992f, 0.455811f, 0.496582f, - 0.537598f, 0.579590f, 0.834473f, 0.847656f, 0.850098f, 0.850098f, 0.849609f, 0.850098f, - 0.000316f, 0.000824f, 0.001088f, 0.001693f, 0.002062f, 0.002403f, 0.003027f, 0.003460f, - 0.003712f, 0.004166f, 0.004765f, 0.005138f, 0.005871f, 0.006218f, 0.006924f, 0.007431f, - 0.008255f, 0.008850f, 0.009781f, 0.010590f, 0.011391f, 0.012367f, 0.013474f, 0.014709f, - 0.015823f, 0.017685f, 0.018982f, 0.020844f, 0.022629f, 0.025070f, 0.027496f, 0.030380f, - 0.033447f, 0.037140f, 0.041168f, 0.045654f, 0.050720f, 0.057251f, 0.063965f, 0.071777f, - 0.080811f, 0.091248f, 0.103638f, 0.117126f, 0.133179f, 0.151001f, 0.171631f, 0.194580f, - 0.220337f, 0.248413f, 0.279785f, 0.313965f, 0.349365f, 0.386963f, 0.426514f, 0.468262f, - 0.510742f, 0.555176f, 0.825684f, 0.838379f, 0.839844f, 0.841309f, 0.841309f, 0.841309f, - 0.000210f, 0.000717f, 0.001084f, 0.001454f, 0.001882f, 0.002096f, 0.002468f, 0.002996f, - 0.003395f, 0.003632f, 0.004066f, 0.004467f, 0.005020f, 0.005569f, 0.005917f, 0.006474f, - 0.006958f, 0.007576f, 0.008453f, 0.009140f, 0.010002f, 0.010689f, 0.011520f, 0.012596f, - 0.013695f, 0.014938f, 0.016220f, 0.017593f, 0.019424f, 0.020996f, 0.023331f, 0.025696f, - 0.028427f, 0.031067f, 0.034668f, 0.038422f, 0.042908f, 0.048096f, 0.054016f, 0.060699f, - 0.068909f, 0.077515f, 0.088501f, 0.100464f, 0.114624f, 0.130615f, 0.149048f, 0.170654f, - 0.194214f, 0.222046f, 0.251465f, 0.283936f, 0.319580f, 0.357422f, 0.397461f, 0.440186f, - 0.484375f, 0.528320f, 0.814941f, 0.828613f, 0.830078f, 0.832031f, 0.831543f, 0.833008f, - 0.000234f, 0.000576f, 0.000939f, 0.001362f, 0.001481f, 0.001999f, 0.002228f, 0.002714f, - 0.002846f, 0.003218f, 0.003555f, 0.003933f, 0.004356f, 0.004787f, 0.005169f, 0.005604f, - 0.006145f, 0.006554f, 0.007275f, 0.007675f, 0.008293f, 0.009201f, 0.009979f, 0.010651f, - 0.011497f, 0.012527f, 0.013893f, 0.014771f, 0.016373f, 0.017975f, 0.019455f, 0.021683f, - 0.023895f, 0.026077f, 0.029114f, 0.032257f, 0.036072f, 0.040405f, 0.045197f, 0.050903f, - 0.057770f, 0.065613f, 0.074524f, 0.085388f, 0.097656f, 0.111694f, 0.128540f, 0.147949f, - 0.170166f, 0.195435f, 0.223389f, 0.255127f, 0.289551f, 0.327393f, 0.367432f, 0.410400f, - 0.455078f, 0.502441f, 0.804199f, 0.818848f, 0.821289f, 0.822266f, 0.822754f, 0.822266f, - 0.000213f, 0.000506f, 0.000756f, 0.001184f, 0.001396f, 0.001697f, 0.002010f, 0.002474f, - 0.002569f, 0.002918f, 0.003090f, 0.003496f, 0.003855f, 0.004139f, 0.004478f, 0.004852f, - 0.005253f, 0.005665f, 0.006100f, 0.006638f, 0.007080f, 0.007744f, 0.008293f, 0.009132f, - 0.009750f, 0.010658f, 0.011536f, 0.012413f, 0.013779f, 0.014908f, 0.016510f, 0.017990f, - 0.019623f, 0.021637f, 0.024109f, 0.026718f, 0.029922f, 0.033539f, 0.037567f, 0.042572f, - 0.048279f, 0.054413f, 0.062042f, 0.071472f, 0.081909f, 0.094604f, 0.109436f, 0.127075f, - 0.146484f, 0.170044f, 0.196533f, 0.226929f, 0.260254f, 0.296875f, 0.337402f, 0.380615f, - 0.426025f, 0.475342f, 0.792969f, 0.807617f, 0.811035f, 0.811523f, 0.812012f, 0.813477f, - 0.000119f, 0.000422f, 0.000883f, 0.001027f, 0.001189f, 0.001604f, 0.001783f, 0.001913f, - 0.002228f, 0.002522f, 0.002645f, 0.003086f, 0.003199f, 0.003534f, 0.003790f, 0.004105f, - 0.004421f, 0.004902f, 0.005283f, 0.005589f, 0.006039f, 0.006401f, 0.007088f, 0.007519f, - 0.008217f, 0.008812f, 0.009712f, 0.010460f, 0.011337f, 0.012413f, 0.013596f, 0.014687f, - 0.016159f, 0.018051f, 0.019913f, 0.022018f, 0.024551f, 0.027359f, 0.030792f, 0.035065f, - 0.039703f, 0.044983f, 0.051392f, 0.059204f, 0.068176f, 0.079102f, 0.092041f, 0.106873f, - 0.125000f, 0.145874f, 0.170532f, 0.198975f, 0.230835f, 0.267090f, 0.306641f, 0.349854f, - 0.395508f, 0.445801f, 0.780762f, 0.796875f, 0.799805f, 0.801270f, 0.801270f, 0.801270f, - 0.000227f, 0.000521f, 0.000698f, 0.000817f, 0.001236f, 0.001359f, 0.001540f, 0.001619f, - 0.001940f, 0.002089f, 0.002430f, 0.002552f, 0.002655f, 0.002932f, 0.003241f, 0.003532f, - 0.003841f, 0.004120f, 0.004292f, 0.004761f, 0.005051f, 0.005459f, 0.005886f, 0.006290f, - 0.006821f, 0.007320f, 0.007889f, 0.008652f, 0.009399f, 0.010063f, 0.010887f, 0.012215f, - 0.013206f, 0.014648f, 0.016037f, 0.017853f, 0.019958f, 0.022491f, 0.024994f, 0.028091f, - 0.032135f, 0.036530f, 0.041809f, 0.048096f, 0.055908f, 0.064941f, 0.076050f, 0.089050f, - 0.104980f, 0.123596f, 0.146118f, 0.172363f, 0.203003f, 0.237183f, 0.276123f, 0.318359f, - 0.365479f, 0.416504f, 0.768555f, 0.784668f, 0.788086f, 0.789551f, 0.790039f, 0.790039f, - 0.000000f, 0.000448f, 0.000566f, 0.000688f, 0.000985f, 0.001144f, 0.001305f, 0.001437f, - 0.001622f, 0.001731f, 0.001989f, 0.002174f, 0.002338f, 0.002552f, 0.002739f, 0.002924f, - 0.003239f, 0.003405f, 0.003628f, 0.003933f, 0.004200f, 0.004463f, 0.004948f, 0.005245f, - 0.005615f, 0.006138f, 0.006699f, 0.006989f, 0.007793f, 0.008247f, 0.008980f, 0.009918f, - 0.010857f, 0.011795f, 0.013016f, 0.014244f, 0.015930f, 0.017868f, 0.019882f, 0.022659f, - 0.025543f, 0.029160f, 0.033417f, 0.038635f, 0.044983f, 0.052338f, 0.061859f, 0.072693f, - 0.086487f, 0.102966f, 0.122864f, 0.146973f, 0.175049f, 0.207764f, 0.245605f, 0.287842f, - 0.334229f, 0.385986f, 0.755371f, 0.771973f, 0.775879f, 0.777344f, 0.777832f, 0.778809f, - 0.000000f, 0.000303f, 0.000512f, 0.000752f, 0.000828f, 0.001036f, 0.001184f, 0.001292f, - 0.001281f, 0.001460f, 0.001717f, 0.001843f, 0.001955f, 0.002060f, 0.002317f, 0.002476f, - 0.002542f, 0.002869f, 0.003088f, 0.003313f, 0.003559f, 0.003693f, 0.004082f, 0.004318f, - 0.004696f, 0.005070f, 0.005245f, 0.005741f, 0.006126f, 0.006771f, 0.007298f, 0.007828f, - 0.008583f, 0.009338f, 0.010246f, 0.011528f, 0.012794f, 0.014160f, 0.015717f, 0.017853f, - 0.019958f, 0.022995f, 0.026291f, 0.030533f, 0.035553f, 0.041565f, 0.048981f, 0.058350f, - 0.069824f, 0.083801f, 0.101685f, 0.122437f, 0.148438f, 0.178833f, 0.215454f, 0.256104f, - 0.302490f, 0.354736f, 0.741699f, 0.758789f, 0.762695f, 0.763672f, 0.764648f, 0.765625f, - 0.000097f, 0.000306f, 0.000370f, 0.000618f, 0.000713f, 0.000810f, 0.000953f, 0.000920f, - 0.001167f, 0.001238f, 0.001406f, 0.001483f, 0.001540f, 0.001794f, 0.001970f, 0.002028f, - 0.002264f, 0.002354f, 0.002459f, 0.002636f, 0.002827f, 0.003096f, 0.003342f, 0.003544f, - 0.003881f, 0.003948f, 0.004459f, 0.004742f, 0.005005f, 0.005394f, 0.005867f, 0.006374f, - 0.006901f, 0.007507f, 0.008202f, 0.008881f, 0.010017f, 0.010986f, 0.012451f, 0.013809f, - 0.015511f, 0.017776f, 0.020325f, 0.023453f, 0.027390f, 0.032349f, 0.038330f, 0.045624f, - 0.055359f, 0.067078f, 0.082275f, 0.101013f, 0.123657f, 0.151611f, 0.185791f, 0.225342f, - 0.270752f, 0.322754f, 0.727051f, 0.746094f, 0.749512f, 0.750977f, 0.751953f, 0.751953f, - 0.000228f, 0.000211f, 0.000504f, 0.000443f, 0.000523f, 0.000672f, 0.000703f, 0.000902f, - 0.000975f, 0.001010f, 0.001122f, 0.001178f, 0.001257f, 0.001424f, 0.001575f, 0.001631f, - 0.001789f, 0.001910f, 0.002090f, 0.002144f, 0.002411f, 0.002520f, 0.002703f, 0.002827f, - 0.003010f, 0.003195f, 0.003403f, 0.003750f, 0.003960f, 0.004276f, 0.004780f, 0.005005f, - 0.005432f, 0.005981f, 0.006428f, 0.007015f, 0.007812f, 0.008537f, 0.009415f, 0.010658f, - 0.011963f, 0.013443f, 0.015396f, 0.017731f, 0.020782f, 0.024414f, 0.029083f, 0.034912f, - 0.042572f, 0.052216f, 0.064392f, 0.080017f, 0.100220f, 0.126099f, 0.157227f, 0.194946f, - 0.239136f, 0.290283f, 0.712402f, 0.731445f, 0.734863f, 0.736816f, 0.737305f, 0.737793f, - 0.000211f, 0.000198f, 0.000195f, 0.000413f, 0.000517f, 0.000531f, 0.000586f, 0.000736f, - 0.000769f, 0.000809f, 0.000970f, 0.001007f, 0.001067f, 0.001134f, 0.001211f, 0.001348f, - 0.001341f, 0.001534f, 0.001617f, 0.001734f, 0.001942f, 0.002010f, 0.002110f, 0.002268f, - 0.002523f, 0.002607f, 0.002829f, 0.003004f, 0.003113f, 0.003403f, 0.003681f, 0.003990f, - 0.004257f, 0.004601f, 0.005039f, 0.005444f, 0.005993f, 0.006561f, 0.007278f, 0.008026f, - 0.009041f, 0.010124f, 0.011513f, 0.013222f, 0.015320f, 0.017914f, 0.021408f, 0.025833f, - 0.031433f, 0.039429f, 0.049255f, 0.062286f, 0.079102f, 0.101135f, 0.130005f, 0.164917f, - 0.207764f, 0.258057f, 0.696289f, 0.716309f, 0.720215f, 0.722168f, 0.722656f, 0.723145f, - 0.000000f, 0.000080f, 0.000286f, 0.000374f, 0.000434f, 0.000457f, 0.000460f, 0.000568f, - 0.000610f, 0.000669f, 0.000715f, 0.000773f, 0.000877f, 0.000918f, 0.001030f, 0.000998f, - 0.001148f, 0.001134f, 0.001305f, 0.001369f, 0.001410f, 0.001534f, 0.001688f, 0.001780f, - 0.001899f, 0.001963f, 0.002081f, 0.002199f, 0.002470f, 0.002563f, 0.002758f, 0.003006f, - 0.003273f, 0.003531f, 0.003817f, 0.004093f, 0.004532f, 0.004993f, 0.005463f, 0.006027f, - 0.006657f, 0.007492f, 0.008537f, 0.009689f, 0.011246f, 0.012985f, 0.015518f, 0.018539f, - 0.022827f, 0.028534f, 0.036072f, 0.046234f, 0.060028f, 0.078918f, 0.103943f, 0.136353f, - 0.176514f, 0.225952f, 0.679199f, 0.699707f, 0.703613f, 0.706055f, 0.706543f, 0.708008f, - 0.000089f, 0.000176f, 0.000232f, 0.000342f, 0.000317f, 0.000319f, 0.000420f, 0.000382f, - 0.000494f, 0.000515f, 0.000612f, 0.000650f, 0.000671f, 0.000701f, 0.000732f, 0.000859f, - 0.000888f, 0.000923f, 0.001002f, 0.001048f, 0.001170f, 0.001234f, 0.001292f, 0.001426f, - 0.001414f, 0.001476f, 0.001622f, 0.001723f, 0.001892f, 0.001976f, 0.002237f, 0.002239f, - 0.002476f, 0.002645f, 0.002817f, 0.003092f, 0.003355f, 0.003626f, 0.003979f, 0.004459f, - 0.004948f, 0.005527f, 0.006256f, 0.007027f, 0.008026f, 0.009270f, 0.010918f, 0.013184f, - 0.016098f, 0.019913f, 0.025253f, 0.033112f, 0.043762f, 0.059113f, 0.079956f, 0.109009f, - 0.146729f, 0.193726f, 0.660645f, 0.682129f, 0.688477f, 0.690430f, 0.689941f, 0.690918f, - 0.000000f, 0.000063f, 0.000194f, 0.000281f, 0.000187f, 0.000325f, 0.000278f, 0.000272f, - 0.000386f, 0.000466f, 0.000462f, 0.000510f, 0.000519f, 0.000587f, 0.000613f, 0.000603f, - 0.000671f, 0.000709f, 0.000744f, 0.000808f, 0.000858f, 0.000913f, 0.000963f, 0.000999f, - 0.001062f, 0.001106f, 0.001262f, 0.001266f, 0.001431f, 0.001562f, 0.001672f, 0.001693f, - 0.001810f, 0.001976f, 0.002090f, 0.002289f, 0.002422f, 0.002666f, 0.002916f, 0.003166f, - 0.003513f, 0.003862f, 0.004318f, 0.004936f, 0.005646f, 0.006493f, 0.007626f, 0.009048f, - 0.010826f, 0.013519f, 0.017166f, 0.022476f, 0.030258f, 0.041687f, 0.058807f, 0.083435f, - 0.117737f, 0.162598f, 0.644043f, 0.666504f, 0.670410f, 0.673340f, 0.674316f, 0.675293f, - 0.000000f, 0.000117f, 0.000112f, 0.000178f, 0.000216f, 0.000222f, 0.000271f, 0.000229f, - 0.000280f, 0.000283f, 0.000326f, 0.000376f, 0.000376f, 0.000443f, 0.000456f, 0.000470f, - 0.000499f, 0.000507f, 0.000547f, 0.000566f, 0.000613f, 0.000667f, 0.000692f, 0.000749f, - 0.000773f, 0.000803f, 0.000917f, 0.000924f, 0.000997f, 0.001055f, 0.001096f, 0.001236f, - 0.001261f, 0.001376f, 0.001466f, 0.001693f, 0.001695f, 0.001826f, 0.002077f, 0.002226f, - 0.002411f, 0.002686f, 0.002985f, 0.003368f, 0.003801f, 0.004353f, 0.005131f, 0.005974f, - 0.007370f, 0.008842f, 0.011345f, 0.014717f, 0.019699f, 0.027893f, 0.040619f, 0.060730f, - 0.090454f, 0.132080f, 0.625488f, 0.649414f, 0.653809f, 0.655273f, 0.656250f, 0.658203f, - 0.000000f, 0.000000f, 0.000108f, 0.000121f, 0.000136f, 0.000154f, 0.000158f, 0.000191f, - 0.000203f, 0.000213f, 0.000270f, 0.000223f, 0.000232f, 0.000270f, 0.000296f, 0.000342f, - 0.000324f, 0.000352f, 0.000453f, 0.000407f, 0.000450f, 0.000459f, 0.000486f, 0.000524f, - 0.000545f, 0.000565f, 0.000630f, 0.000620f, 0.000678f, 0.000803f, 0.000763f, 0.000813f, - 0.000860f, 0.000937f, 0.001035f, 0.001101f, 0.001141f, 0.001254f, 0.001399f, 0.001449f, - 0.001616f, 0.001779f, 0.001942f, 0.002220f, 0.002493f, 0.002808f, 0.003258f, 0.003895f, - 0.004623f, 0.005714f, 0.007111f, 0.009178f, 0.012367f, 0.017319f, 0.025879f, 0.040741f, - 0.065552f, 0.103577f, 0.606934f, 0.630371f, 0.635254f, 0.637695f, 0.638672f, 0.639648f, - 0.000000f, 0.000109f, 0.000102f, 0.000098f, 0.000105f, 0.000110f, 0.000113f, 0.000122f, - 0.000117f, 0.000132f, 0.000147f, 0.000189f, 0.000163f, 0.000212f, 0.000213f, 0.000222f, - 0.000224f, 0.000233f, 0.000258f, 0.000262f, 0.000274f, 0.000305f, 0.000340f, 0.000329f, - 0.000358f, 0.000376f, 0.000445f, 0.000418f, 0.000447f, 0.000478f, 0.000546f, 0.000530f, - 0.000594f, 0.000626f, 0.000679f, 0.000745f, 0.000763f, 0.000804f, 0.000869f, 0.000952f, - 0.001025f, 0.001119f, 0.001254f, 0.001359f, 0.001584f, 0.001728f, 0.001993f, 0.002295f, - 0.002790f, 0.003298f, 0.004135f, 0.005363f, 0.007267f, 0.010277f, 0.015350f, 0.024994f, - 0.043518f, 0.076599f, 0.585938f, 0.611816f, 0.616211f, 0.619141f, 0.619629f, 0.620605f, - 0.000000f, 0.000102f, 0.000095f, 0.000090f, 0.000085f, 0.000081f, 0.000078f, 0.000073f, - 0.000075f, 0.000079f, 0.000087f, 0.000092f, 0.000095f, 0.000094f, 0.000133f, 0.000143f, - 0.000152f, 0.000155f, 0.000161f, 0.000195f, 0.000174f, 0.000183f, 0.000188f, 0.000216f, - 0.000233f, 0.000241f, 0.000241f, 0.000257f, 0.000269f, 0.000302f, 0.000325f, 0.000321f, - 0.000350f, 0.000363f, 0.000405f, 0.000426f, 0.000456f, 0.000486f, 0.000539f, 0.000560f, - 0.000614f, 0.000671f, 0.000722f, 0.000811f, 0.000891f, 0.000989f, 0.001162f, 0.001312f, - 0.001545f, 0.001863f, 0.002340f, 0.002920f, 0.003963f, 0.005615f, 0.008499f, 0.013931f, - 0.025833f, 0.052094f, 0.566406f, 0.591797f, 0.597168f, 0.599609f, 0.601074f, 0.601562f, - 0.000110f, 0.000092f, 0.000084f, 0.000077f, 0.000073f, 0.000070f, 0.000067f, 0.000064f, - 0.000061f, 0.000058f, 0.000055f, 0.000064f, 0.000051f, 0.000054f, 0.000071f, 0.000059f, - 0.000082f, 0.000081f, 0.000090f, 0.000087f, 0.000099f, 0.000103f, 0.000127f, 0.000131f, - 0.000135f, 0.000139f, 0.000142f, 0.000143f, 0.000156f, 0.000162f, 0.000173f, 0.000194f, - 0.000206f, 0.000201f, 0.000233f, 0.000225f, 0.000246f, 0.000294f, 0.000279f, 0.000313f, - 0.000333f, 0.000356f, 0.000395f, 0.000432f, 0.000459f, 0.000511f, 0.000577f, 0.000664f, - 0.000770f, 0.000916f, 0.001114f, 0.001400f, 0.001881f, 0.002665f, 0.004093f, 0.006966f, - 0.013290f, 0.031525f, 0.545410f, 0.571777f, 0.577637f, 0.579102f, 0.580566f, 0.581055f, - 0.000093f, 0.000073f, 0.000066f, 0.000061f, 0.000056f, 0.000054f, 0.000051f, 0.000050f, - 0.000048f, 0.000047f, 0.000045f, 0.000044f, 0.000042f, 0.000040f, 0.000038f, 0.000036f, - 0.000039f, 0.000033f, 0.000041f, 0.000040f, 0.000046f, 0.000048f, 0.000051f, 0.000057f, - 0.000060f, 0.000066f, 0.000062f, 0.000067f, 0.000080f, 0.000085f, 0.000088f, 0.000092f, - 0.000092f, 0.000097f, 0.000109f, 0.000109f, 0.000117f, 0.000132f, 0.000134f, 0.000147f, - 0.000154f, 0.000156f, 0.000188f, 0.000197f, 0.000219f, 0.000234f, 0.000266f, 0.000286f, - 0.000335f, 0.000397f, 0.000472f, 0.000566f, 0.000751f, 0.001039f, 0.001626f, 0.002834f, - 0.005909f, 0.015411f, 0.524414f, 0.551270f, 0.557129f, 0.559570f, 0.561035f, 0.561523f, - 0.000060f, 0.000046f, 0.000039f, 0.000037f, 0.000034f, 0.000034f, 0.000032f, 0.000032f, - 0.000031f, 0.000029f, 0.000029f, 0.000029f, 0.000028f, 0.000028f, 0.000028f, 0.000027f, - 0.000026f, 0.000025f, 0.000024f, 0.000023f, 0.000022f, 0.000021f, 0.000020f, 0.000021f, - 0.000020f, 0.000018f, 0.000018f, 0.000023f, 0.000024f, 0.000028f, 0.000032f, 0.000033f, - 0.000032f, 0.000038f, 0.000039f, 0.000043f, 0.000046f, 0.000050f, 0.000052f, 0.000053f, - 0.000057f, 0.000067f, 0.000073f, 0.000068f, 0.000076f, 0.000083f, 0.000097f, 0.000110f, - 0.000116f, 0.000127f, 0.000157f, 0.000185f, 0.000246f, 0.000319f, 0.000466f, 0.000810f, - 0.001841f, 0.005795f, 0.503418f, 0.531250f, 0.536621f, 0.539062f, 0.540039f, 0.540527f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000004f, 0.000005f, 0.000005f, 0.000008f, - 0.000008f, 0.000009f, 0.000009f, 0.000010f, 0.000010f, 0.000010f, 0.000010f, 0.000011f, - 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000012f, 0.000012f, 0.000012f, 0.000012f, - 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, - 0.000009f, 0.000008f, 0.000008f, 0.000008f, 0.000009f, 0.000009f, 0.000010f, 0.000012f, - 0.000013f, 0.000014f, 0.000015f, 0.000017f, 0.000020f, 0.000021f, 0.000018f, 0.000023f, - 0.000023f, 0.000025f, 0.000030f, 0.000038f, 0.000043f, 0.000059f, 0.000079f, 0.000131f, - 0.000279f, 0.001210f, 0.481934f, 0.510254f, 0.516113f, 0.518555f, 0.520020f, 0.520508f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, - 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000004f, - 0.000006f, 0.000022f, 0.460449f, 0.489258f, 0.495850f, 0.498291f, 0.499512f, 0.500000f, - }, - { - 0.038544f, 0.111450f, 0.177368f, 0.237061f, 0.290771f, 0.339600f, 0.384277f, 0.425293f, - 0.462402f, 0.497070f, 0.527344f, 0.556152f, 0.583496f, 0.607910f, 0.630859f, 0.652344f, - 0.672852f, 0.690918f, 0.708496f, 0.724609f, 0.740723f, 0.754883f, 0.768066f, 0.780273f, - 0.792480f, 0.803711f, 0.815430f, 0.825684f, 0.835449f, 0.844727f, 0.853516f, 0.861816f, - 0.870117f, 0.877930f, 0.885254f, 0.892578f, 0.899414f, 0.905762f, 0.912109f, 0.918945f, - 0.923828f, 0.928711f, 0.934082f, 0.939941f, 0.944824f, 0.949707f, 0.953613f, 0.958496f, - 0.962402f, 0.967285f, 0.971191f, 0.974609f, 0.979004f, 0.982422f, 0.985352f, 0.989258f, - 0.992188f, 0.996094f, 0.996094f, 0.990723f, 0.986328f, 0.982422f, 0.978516f, 0.975098f, - 0.029068f, 0.087219f, 0.142578f, 0.195190f, 0.244629f, 0.291016f, 0.334717f, 0.375000f, - 0.412842f, 0.446533f, 0.481201f, 0.511230f, 0.539062f, 0.565918f, 0.590820f, 0.614258f, - 0.636719f, 0.656250f, 0.675293f, 0.693359f, 0.710449f, 0.726562f, 0.741699f, 0.755371f, - 0.769043f, 0.781738f, 0.793457f, 0.805176f, 0.815918f, 0.826660f, 0.835938f, 0.845703f, - 0.854980f, 0.862793f, 0.871582f, 0.879395f, 0.885742f, 0.894531f, 0.900879f, 0.907227f, - 0.913086f, 0.919434f, 0.925293f, 0.931152f, 0.936523f, 0.941406f, 0.946777f, 0.951172f, - 0.956055f, 0.960449f, 0.964355f, 0.968750f, 0.972656f, 0.976562f, 0.980469f, 0.984375f, - 0.987793f, 0.991211f, 0.994141f, 0.989258f, 0.984863f, 0.981445f, 0.977539f, 0.974121f, - 0.023346f, 0.069641f, 0.115601f, 0.160767f, 0.205078f, 0.248047f, 0.289062f, 0.328125f, - 0.365723f, 0.401367f, 0.435059f, 0.466309f, 0.495361f, 0.523926f, 0.550781f, 0.574707f, - 0.597168f, 0.620117f, 0.641113f, 0.660156f, 0.679688f, 0.696777f, 0.713379f, 0.728516f, - 0.743652f, 0.757324f, 0.770996f, 0.784180f, 0.795410f, 0.806641f, 0.817383f, 0.828125f, - 0.837891f, 0.847168f, 0.855957f, 0.864258f, 0.873047f, 0.880859f, 0.888672f, 0.895996f, - 0.902832f, 0.909668f, 0.915039f, 0.921875f, 0.927246f, 0.934082f, 0.937988f, 0.943848f, - 0.948242f, 0.953613f, 0.958496f, 0.962402f, 0.967285f, 0.971191f, 0.975098f, 0.979492f, - 0.983398f, 0.985840f, 0.992188f, 0.987305f, 0.983398f, 0.979980f, 0.977051f, 0.973633f, - 0.018600f, 0.056366f, 0.094299f, 0.133545f, 0.172729f, 0.211670f, 0.249756f, 0.285889f, - 0.322021f, 0.356934f, 0.390869f, 0.421875f, 0.452148f, 0.481201f, 0.509277f, 0.535156f, - 0.560059f, 0.583496f, 0.605957f, 0.626465f, 0.647949f, 0.665527f, 0.684570f, 0.700684f, - 0.717285f, 0.731934f, 0.746582f, 0.760254f, 0.773926f, 0.786621f, 0.799316f, 0.809082f, - 0.820312f, 0.830566f, 0.840332f, 0.850098f, 0.858887f, 0.867188f, 0.875000f, 0.883789f, - 0.890625f, 0.898926f, 0.904297f, 0.912109f, 0.916992f, 0.924316f, 0.930176f, 0.935547f, - 0.941406f, 0.945801f, 0.951172f, 0.956055f, 0.960938f, 0.964844f, 0.969727f, 0.974609f, - 0.978516f, 0.981934f, 0.989746f, 0.985840f, 0.981934f, 0.978516f, 0.975586f, 0.972168f, - 0.015068f, 0.046143f, 0.077881f, 0.111816f, 0.145264f, 0.179688f, 0.214600f, 0.249023f, - 0.282715f, 0.316406f, 0.348389f, 0.380615f, 0.411133f, 0.440430f, 0.468018f, 0.494873f, - 0.520508f, 0.546387f, 0.568848f, 0.591309f, 0.613281f, 0.634277f, 0.653809f, 0.670898f, - 0.688477f, 0.706055f, 0.721191f, 0.736328f, 0.751465f, 0.764648f, 0.776855f, 0.789551f, - 0.801270f, 0.812500f, 0.823730f, 0.833496f, 0.843262f, 0.853027f, 0.861328f, 0.869629f, - 0.878418f, 0.885742f, 0.893555f, 0.900391f, 0.908203f, 0.914551f, 0.921387f, 0.927246f, - 0.932617f, 0.938965f, 0.943848f, 0.949219f, 0.953613f, 0.959473f, 0.963867f, 0.968262f, - 0.972656f, 0.977051f, 0.987305f, 0.983887f, 0.980957f, 0.977051f, 0.974121f, 0.970703f, - 0.012444f, 0.037933f, 0.065613f, 0.093811f, 0.123474f, 0.153809f, 0.185059f, 0.215820f, - 0.247559f, 0.279297f, 0.310547f, 0.341309f, 0.370361f, 0.399658f, 0.428467f, 0.457031f, - 0.482910f, 0.507812f, 0.533203f, 0.556152f, 0.579590f, 0.600098f, 0.621094f, 0.641113f, - 0.659668f, 0.676270f, 0.695312f, 0.710449f, 0.726074f, 0.740723f, 0.756348f, 0.769043f, - 0.780762f, 0.794434f, 0.805176f, 0.816895f, 0.827637f, 0.837891f, 0.847168f, 0.855957f, - 0.865723f, 0.873535f, 0.882324f, 0.889648f, 0.897949f, 0.904297f, 0.911133f, 0.917480f, - 0.924316f, 0.930176f, 0.936523f, 0.941895f, 0.947266f, 0.952637f, 0.958008f, 0.962891f, - 0.967285f, 0.971680f, 0.984863f, 0.981934f, 0.978516f, 0.975586f, 0.972656f, 0.969238f, - 0.010353f, 0.032043f, 0.055359f, 0.079529f, 0.104980f, 0.131836f, 0.159424f, 0.187866f, - 0.216431f, 0.245239f, 0.275146f, 0.304199f, 0.333496f, 0.362061f, 0.390869f, 0.417969f, - 0.445068f, 0.471191f, 0.496582f, 0.520508f, 0.543457f, 0.566895f, 0.588867f, 0.608398f, - 0.628906f, 0.648438f, 0.666992f, 0.684570f, 0.701660f, 0.716797f, 0.732422f, 0.746582f, - 0.760254f, 0.773438f, 0.786133f, 0.798340f, 0.810547f, 0.821777f, 0.832520f, 0.842773f, - 0.851074f, 0.860352f, 0.869629f, 0.878906f, 0.886230f, 0.894043f, 0.901855f, 0.908691f, - 0.915527f, 0.922363f, 0.928223f, 0.935059f, 0.939941f, 0.945312f, 0.950684f, 0.956055f, - 0.962402f, 0.966797f, 0.982910f, 0.979980f, 0.977051f, 0.973633f, 0.970703f, 0.968262f, - 0.008598f, 0.027328f, 0.046417f, 0.067871f, 0.089905f, 0.113220f, 0.137695f, 0.163330f, - 0.189087f, 0.216064f, 0.243164f, 0.270752f, 0.298340f, 0.326416f, 0.354004f, 0.381348f, - 0.407715f, 0.434082f, 0.460205f, 0.484863f, 0.508789f, 0.532227f, 0.555176f, 0.577637f, - 0.598145f, 0.618652f, 0.637695f, 0.657227f, 0.674805f, 0.691406f, 0.708008f, 0.723633f, - 0.738770f, 0.751953f, 0.766113f, 0.779785f, 0.791992f, 0.804199f, 0.815918f, 0.825684f, - 0.836914f, 0.846680f, 0.856934f, 0.866211f, 0.874512f, 0.882324f, 0.890625f, 0.898438f, - 0.905273f, 0.913086f, 0.919922f, 0.926758f, 0.933105f, 0.938477f, 0.944824f, 0.951172f, - 0.955566f, 0.960938f, 0.980469f, 0.978027f, 0.974609f, 0.972168f, 0.969238f, 0.966797f, - 0.007561f, 0.023315f, 0.040344f, 0.058228f, 0.077148f, 0.097534f, 0.119995f, 0.142212f, - 0.165649f, 0.190063f, 0.214722f, 0.240601f, 0.266846f, 0.293457f, 0.319824f, 0.346924f, - 0.372314f, 0.398438f, 0.424561f, 0.449463f, 0.474609f, 0.498535f, 0.521973f, 0.544434f, - 0.566895f, 0.587402f, 0.608398f, 0.628418f, 0.645996f, 0.665039f, 0.683105f, 0.699219f, - 0.716309f, 0.731445f, 0.745117f, 0.760254f, 0.772949f, 0.786133f, 0.799316f, 0.809570f, - 0.820801f, 0.832031f, 0.843262f, 0.852051f, 0.861816f, 0.871094f, 0.880371f, 0.887695f, - 0.895996f, 0.904297f, 0.911133f, 0.917969f, 0.924805f, 0.931641f, 0.937012f, 0.943848f, - 0.949707f, 0.954590f, 0.978027f, 0.976074f, 0.973145f, 0.970215f, 0.967773f, 0.965332f, - 0.006416f, 0.020065f, 0.034943f, 0.050537f, 0.067078f, 0.084900f, 0.104065f, 0.123962f, - 0.145264f, 0.166748f, 0.189575f, 0.213501f, 0.237305f, 0.262451f, 0.288574f, 0.313477f, - 0.338623f, 0.364502f, 0.389893f, 0.414551f, 0.440186f, 0.464600f, 0.487549f, 0.510742f, - 0.534668f, 0.556641f, 0.578613f, 0.598145f, 0.618652f, 0.637207f, 0.655273f, 0.674805f, - 0.690430f, 0.707031f, 0.724121f, 0.739258f, 0.752930f, 0.767090f, 0.779785f, 0.792969f, - 0.805176f, 0.816895f, 0.827637f, 0.838379f, 0.849121f, 0.858398f, 0.868652f, 0.876465f, - 0.885742f, 0.894043f, 0.901855f, 0.909180f, 0.916992f, 0.923828f, 0.930176f, 0.937012f, - 0.943359f, 0.949707f, 0.975586f, 0.973633f, 0.971191f, 0.968262f, 0.965820f, 0.963379f, - 0.005802f, 0.017502f, 0.030045f, 0.043823f, 0.058014f, 0.074280f, 0.090759f, 0.108459f, - 0.127197f, 0.146484f, 0.167725f, 0.189087f, 0.211304f, 0.234497f, 0.258301f, 0.282471f, - 0.307373f, 0.331299f, 0.356689f, 0.381104f, 0.405762f, 0.430420f, 0.455078f, 0.478516f, - 0.502441f, 0.524414f, 0.545898f, 0.568359f, 0.588867f, 0.608887f, 0.628906f, 0.646973f, - 0.665527f, 0.684082f, 0.701172f, 0.715820f, 0.731934f, 0.746582f, 0.760742f, 0.774414f, - 0.787598f, 0.800781f, 0.812500f, 0.823730f, 0.834961f, 0.845703f, 0.855469f, 0.865234f, - 0.874512f, 0.883789f, 0.892090f, 0.899902f, 0.908203f, 0.916016f, 0.922852f, 0.930176f, - 0.936523f, 0.942871f, 0.972656f, 0.971191f, 0.968750f, 0.966309f, 0.963867f, 0.961426f, - 0.004734f, 0.014984f, 0.026169f, 0.038177f, 0.051208f, 0.065186f, 0.079468f, 0.095276f, - 0.111633f, 0.129639f, 0.148071f, 0.167969f, 0.188599f, 0.208984f, 0.231689f, 0.254639f, - 0.277832f, 0.301025f, 0.325439f, 0.349854f, 0.373779f, 0.397705f, 0.422607f, 0.446045f, - 0.469727f, 0.492676f, 0.514648f, 0.537598f, 0.559570f, 0.580078f, 0.600586f, 0.620117f, - 0.639648f, 0.658203f, 0.676758f, 0.692871f, 0.708984f, 0.725586f, 0.740723f, 0.755859f, - 0.769531f, 0.783691f, 0.796875f, 0.808594f, 0.820801f, 0.832520f, 0.842285f, 0.852539f, - 0.862793f, 0.872070f, 0.881836f, 0.890137f, 0.898926f, 0.906738f, 0.915039f, 0.922363f, - 0.929199f, 0.936523f, 0.969727f, 0.968750f, 0.966797f, 0.964355f, 0.961914f, 0.959473f, - 0.004055f, 0.013588f, 0.023132f, 0.033722f, 0.044891f, 0.057343f, 0.069763f, 0.083923f, - 0.098389f, 0.114441f, 0.131226f, 0.148682f, 0.167603f, 0.186768f, 0.207031f, 0.228516f, - 0.250732f, 0.272949f, 0.295410f, 0.318604f, 0.342285f, 0.365967f, 0.390381f, 0.413574f, - 0.437744f, 0.460938f, 0.484131f, 0.506348f, 0.528320f, 0.550781f, 0.572266f, 0.592773f, - 0.613281f, 0.632812f, 0.651367f, 0.669922f, 0.687500f, 0.704102f, 0.720215f, 0.735840f, - 0.751465f, 0.764160f, 0.778809f, 0.792480f, 0.803711f, 0.816895f, 0.829102f, 0.840332f, - 0.850586f, 0.860352f, 0.870605f, 0.880371f, 0.889648f, 0.897949f, 0.905762f, 0.914551f, - 0.922363f, 0.929199f, 0.967285f, 0.966797f, 0.964844f, 0.961426f, 0.959473f, 0.958008f, - 0.003611f, 0.011971f, 0.020401f, 0.030029f, 0.039185f, 0.050415f, 0.061737f, 0.074341f, - 0.086975f, 0.101074f, 0.115845f, 0.131958f, 0.148682f, 0.166626f, 0.185059f, 0.205200f, - 0.224854f, 0.245483f, 0.267334f, 0.290771f, 0.312988f, 0.335449f, 0.359619f, 0.382080f, - 0.406250f, 0.429443f, 0.452881f, 0.475830f, 0.498779f, 0.520996f, 0.542480f, 0.563477f, - 0.584473f, 0.604980f, 0.625977f, 0.643555f, 0.663086f, 0.681152f, 0.698242f, 0.714355f, - 0.729980f, 0.746582f, 0.760742f, 0.774902f, 0.788086f, 0.801758f, 0.814941f, 0.826660f, - 0.838867f, 0.848633f, 0.859863f, 0.869141f, 0.879395f, 0.889160f, 0.897949f, 0.906250f, - 0.914551f, 0.922363f, 0.963867f, 0.964355f, 0.961914f, 0.959961f, 0.957520f, 0.955078f, - 0.003393f, 0.010361f, 0.018494f, 0.026337f, 0.035187f, 0.044556f, 0.054596f, 0.065186f, - 0.077515f, 0.089783f, 0.102783f, 0.117249f, 0.132446f, 0.148071f, 0.165649f, 0.183838f, - 0.202026f, 0.221313f, 0.241943f, 0.262939f, 0.285156f, 0.307129f, 0.329102f, 0.352539f, - 0.375977f, 0.398438f, 0.421875f, 0.445312f, 0.468750f, 0.490723f, 0.512695f, 0.534668f, - 0.556641f, 0.577637f, 0.598633f, 0.619141f, 0.637695f, 0.656738f, 0.674805f, 0.692383f, - 0.709473f, 0.726074f, 0.742188f, 0.756836f, 0.771973f, 0.786133f, 0.799316f, 0.812012f, - 0.824707f, 0.835938f, 0.848145f, 0.858887f, 0.868164f, 0.878906f, 0.888184f, 0.897949f, - 0.906250f, 0.914551f, 0.960938f, 0.960938f, 0.959473f, 0.957520f, 0.955078f, 0.953125f, - 0.003084f, 0.009521f, 0.016144f, 0.023346f, 0.031204f, 0.039520f, 0.048523f, 0.057953f, - 0.068359f, 0.079895f, 0.091309f, 0.104126f, 0.117920f, 0.132324f, 0.147949f, 0.164062f, - 0.181396f, 0.199219f, 0.218872f, 0.238403f, 0.258545f, 0.279541f, 0.301758f, 0.323486f, - 0.346191f, 0.368408f, 0.391846f, 0.414795f, 0.437256f, 0.460693f, 0.483643f, 0.505371f, - 0.527832f, 0.550293f, 0.571289f, 0.591797f, 0.612305f, 0.632324f, 0.651855f, 0.670898f, - 0.687500f, 0.705566f, 0.722168f, 0.737793f, 0.753418f, 0.768555f, 0.783691f, 0.796875f, - 0.811035f, 0.823242f, 0.834473f, 0.846191f, 0.857422f, 0.868652f, 0.878418f, 0.887695f, - 0.897949f, 0.906250f, 0.958008f, 0.958008f, 0.957031f, 0.954590f, 0.952637f, 0.950684f, - 0.002666f, 0.008293f, 0.014297f, 0.021225f, 0.027847f, 0.035156f, 0.043274f, 0.051666f, - 0.060791f, 0.070801f, 0.081543f, 0.092407f, 0.104858f, 0.118530f, 0.131836f, 0.146606f, - 0.162598f, 0.179443f, 0.196777f, 0.215210f, 0.234375f, 0.254150f, 0.274414f, 0.295898f, - 0.317871f, 0.340088f, 0.362549f, 0.385010f, 0.407959f, 0.430664f, 0.454590f, 0.476562f, - 0.499268f, 0.521484f, 0.543945f, 0.564941f, 0.585938f, 0.606934f, 0.626465f, 0.646484f, - 0.665527f, 0.683594f, 0.701660f, 0.717773f, 0.735352f, 0.751465f, 0.766113f, 0.781738f, - 0.794922f, 0.808105f, 0.821289f, 0.833496f, 0.846191f, 0.857910f, 0.868164f, 0.878906f, - 0.889160f, 0.899414f, 0.954102f, 0.955566f, 0.953613f, 0.952148f, 0.950195f, 0.948730f, - 0.002396f, 0.007427f, 0.012978f, 0.018646f, 0.025024f, 0.031403f, 0.038788f, 0.046112f, - 0.054260f, 0.063354f, 0.072693f, 0.082886f, 0.093689f, 0.105469f, 0.118164f, 0.130859f, - 0.145996f, 0.161011f, 0.177124f, 0.193359f, 0.211670f, 0.230225f, 0.249634f, 0.270020f, - 0.290771f, 0.311768f, 0.333740f, 0.356201f, 0.378906f, 0.401855f, 0.424561f, 0.447754f, - 0.470215f, 0.493408f, 0.515137f, 0.537109f, 0.559570f, 0.580078f, 0.601074f, 0.621582f, - 0.642090f, 0.661621f, 0.679688f, 0.697754f, 0.715820f, 0.732422f, 0.749512f, 0.765137f, - 0.779785f, 0.794434f, 0.808594f, 0.821289f, 0.833496f, 0.846191f, 0.857910f, 0.869141f, - 0.879883f, 0.889648f, 0.950195f, 0.952637f, 0.950684f, 0.948730f, 0.947266f, 0.945801f, - 0.002029f, 0.006672f, 0.011658f, 0.016937f, 0.022476f, 0.028305f, 0.034332f, 0.041351f, - 0.048584f, 0.056671f, 0.064697f, 0.073853f, 0.083923f, 0.094482f, 0.105225f, 0.117798f, - 0.130615f, 0.144287f, 0.159302f, 0.174683f, 0.190430f, 0.208740f, 0.226318f, 0.245483f, - 0.264893f, 0.285400f, 0.307129f, 0.328369f, 0.350342f, 0.372803f, 0.395264f, 0.418701f, - 0.441650f, 0.462891f, 0.486816f, 0.509277f, 0.532227f, 0.553711f, 0.575684f, 0.596680f, - 0.617676f, 0.638672f, 0.657715f, 0.676758f, 0.695312f, 0.712402f, 0.729492f, 0.746582f, - 0.762695f, 0.778320f, 0.793457f, 0.807129f, 0.820801f, 0.833984f, 0.846191f, 0.858887f, - 0.869629f, 0.881836f, 0.947266f, 0.949219f, 0.947754f, 0.946289f, 0.944824f, 0.942871f, - 0.002142f, 0.006401f, 0.010841f, 0.015251f, 0.019760f, 0.025055f, 0.031113f, 0.037201f, - 0.043671f, 0.050598f, 0.057892f, 0.066101f, 0.075012f, 0.084351f, 0.093994f, 0.105164f, - 0.117432f, 0.129517f, 0.142822f, 0.157104f, 0.172119f, 0.188110f, 0.204956f, 0.223145f, - 0.241577f, 0.260498f, 0.280762f, 0.301758f, 0.322998f, 0.345215f, 0.366943f, 0.389893f, - 0.412842f, 0.435791f, 0.458008f, 0.482178f, 0.504395f, 0.526855f, 0.548828f, 0.571289f, - 0.592285f, 0.612793f, 0.634277f, 0.654297f, 0.673340f, 0.692383f, 0.710938f, 0.729004f, - 0.745117f, 0.762207f, 0.777832f, 0.792480f, 0.807129f, 0.821289f, 0.834961f, 0.847168f, - 0.859863f, 0.871582f, 0.943359f, 0.946289f, 0.944824f, 0.943359f, 0.941895f, 0.940430f, - 0.001760f, 0.005562f, 0.009621f, 0.013710f, 0.018417f, 0.022736f, 0.027939f, 0.033264f, - 0.039185f, 0.045166f, 0.052460f, 0.059143f, 0.067261f, 0.075745f, 0.084106f, 0.094177f, - 0.104980f, 0.116455f, 0.128174f, 0.141113f, 0.155151f, 0.169922f, 0.184937f, 0.201660f, - 0.219238f, 0.237549f, 0.256348f, 0.276367f, 0.296875f, 0.317871f, 0.339844f, 0.361572f, - 0.383789f, 0.407227f, 0.430908f, 0.453857f, 0.476807f, 0.498779f, 0.521973f, 0.543945f, - 0.567383f, 0.589355f, 0.609863f, 0.631348f, 0.651855f, 0.671875f, 0.690918f, 0.709961f, - 0.727539f, 0.744141f, 0.761719f, 0.777344f, 0.793457f, 0.808594f, 0.823242f, 0.835449f, - 0.848633f, 0.861328f, 0.938965f, 0.941895f, 0.941406f, 0.940430f, 0.938477f, 0.937012f, - 0.001594f, 0.005283f, 0.008789f, 0.012383f, 0.016342f, 0.020523f, 0.025284f, 0.029968f, - 0.035217f, 0.040741f, 0.046417f, 0.052948f, 0.060120f, 0.067566f, 0.076294f, 0.084534f, - 0.093750f, 0.104614f, 0.115173f, 0.126831f, 0.139160f, 0.152832f, 0.166748f, 0.181885f, - 0.198853f, 0.215698f, 0.233521f, 0.252197f, 0.271973f, 0.291992f, 0.313477f, 0.334717f, - 0.357178f, 0.379395f, 0.401855f, 0.425537f, 0.448242f, 0.471924f, 0.495361f, 0.517578f, - 0.541016f, 0.562988f, 0.585938f, 0.607422f, 0.627930f, 0.649414f, 0.670410f, 0.688965f, - 0.708496f, 0.727539f, 0.744629f, 0.761719f, 0.778809f, 0.794922f, 0.809082f, 0.824219f, - 0.838379f, 0.851074f, 0.935059f, 0.938965f, 0.937988f, 0.937012f, 0.936035f, 0.933594f, - 0.001564f, 0.004665f, 0.007973f, 0.011276f, 0.014908f, 0.018600f, 0.022675f, 0.027176f, - 0.031464f, 0.036621f, 0.042023f, 0.047974f, 0.054108f, 0.060822f, 0.068237f, 0.075684f, - 0.084229f, 0.093567f, 0.103210f, 0.113892f, 0.125000f, 0.137329f, 0.150269f, 0.164307f, - 0.179810f, 0.194946f, 0.212158f, 0.229248f, 0.247925f, 0.267578f, 0.287842f, 0.308350f, - 0.330322f, 0.352051f, 0.374756f, 0.397461f, 0.420654f, 0.444092f, 0.466797f, 0.490723f, - 0.514160f, 0.537109f, 0.560059f, 0.582031f, 0.604980f, 0.626953f, 0.648926f, 0.668457f, - 0.688477f, 0.708008f, 0.727539f, 0.745117f, 0.763672f, 0.779297f, 0.795410f, 0.811523f, - 0.826660f, 0.840332f, 0.930664f, 0.934570f, 0.934082f, 0.933594f, 0.932129f, 0.930664f, - 0.001424f, 0.004261f, 0.007122f, 0.010239f, 0.013374f, 0.016693f, 0.020401f, 0.024368f, - 0.028595f, 0.033325f, 0.037964f, 0.043152f, 0.048340f, 0.054962f, 0.060730f, 0.067749f, - 0.075684f, 0.083862f, 0.092041f, 0.102051f, 0.112305f, 0.123657f, 0.135376f, 0.148071f, - 0.161987f, 0.176270f, 0.192139f, 0.208252f, 0.226196f, 0.244141f, 0.263672f, 0.283447f, - 0.304199f, 0.325195f, 0.346924f, 0.370605f, 0.392822f, 0.416260f, 0.439209f, 0.463623f, - 0.486084f, 0.511230f, 0.534180f, 0.558105f, 0.580566f, 0.603516f, 0.625000f, 0.647461f, - 0.668457f, 0.688965f, 0.708496f, 0.727539f, 0.746582f, 0.764160f, 0.781738f, 0.798340f, - 0.813477f, 0.829590f, 0.926758f, 0.931152f, 0.930664f, 0.929199f, 0.928223f, 0.927246f, - 0.001294f, 0.004196f, 0.006538f, 0.009346f, 0.012306f, 0.015335f, 0.018845f, 0.022003f, - 0.025558f, 0.029816f, 0.034149f, 0.038605f, 0.043915f, 0.049042f, 0.054810f, 0.061188f, - 0.067993f, 0.075256f, 0.083130f, 0.091553f, 0.100769f, 0.110779f, 0.121643f, 0.133057f, - 0.145630f, 0.159058f, 0.173218f, 0.188721f, 0.204590f, 0.222290f, 0.240234f, 0.259277f, - 0.279053f, 0.299561f, 0.321533f, 0.343506f, 0.365723f, 0.389404f, 0.412354f, 0.436035f, - 0.459961f, 0.484131f, 0.508301f, 0.532227f, 0.555176f, 0.579102f, 0.601562f, 0.624512f, - 0.646484f, 0.668457f, 0.688965f, 0.709473f, 0.729004f, 0.748047f, 0.766602f, 0.784668f, - 0.800293f, 0.817383f, 0.921875f, 0.926270f, 0.926270f, 0.925781f, 0.924316f, 0.923340f, - 0.001081f, 0.003603f, 0.006027f, 0.008575f, 0.010979f, 0.013847f, 0.016937f, 0.020020f, - 0.023315f, 0.026917f, 0.030930f, 0.035156f, 0.039429f, 0.044098f, 0.049622f, 0.054779f, - 0.060791f, 0.067566f, 0.074341f, 0.082336f, 0.090515f, 0.099548f, 0.109070f, 0.119263f, - 0.130981f, 0.143188f, 0.156250f, 0.170288f, 0.185303f, 0.201294f, 0.218262f, 0.236450f, - 0.255615f, 0.275391f, 0.295654f, 0.316895f, 0.339111f, 0.362061f, 0.385498f, 0.408936f, - 0.432861f, 0.457275f, 0.481689f, 0.505371f, 0.529785f, 0.553711f, 0.577637f, 0.601074f, - 0.624023f, 0.646484f, 0.669434f, 0.689941f, 0.711426f, 0.731445f, 0.750977f, 0.770020f, - 0.787598f, 0.804688f, 0.916992f, 0.922363f, 0.922363f, 0.921875f, 0.920898f, 0.918945f, - 0.001064f, 0.003231f, 0.005322f, 0.007710f, 0.010323f, 0.012489f, 0.015244f, 0.018051f, - 0.020798f, 0.024338f, 0.027893f, 0.031738f, 0.035553f, 0.039795f, 0.044495f, 0.049133f, - 0.054657f, 0.060608f, 0.066895f, 0.073792f, 0.081421f, 0.089050f, 0.097717f, 0.106934f, - 0.117554f, 0.128540f, 0.140503f, 0.153442f, 0.167236f, 0.182129f, 0.197998f, 0.214966f, - 0.232422f, 0.251465f, 0.271240f, 0.291992f, 0.313232f, 0.335693f, 0.358643f, 0.382080f, - 0.406006f, 0.430176f, 0.454590f, 0.479004f, 0.503906f, 0.528320f, 0.552734f, 0.577637f, - 0.601562f, 0.625000f, 0.648438f, 0.670898f, 0.691895f, 0.713867f, 0.733887f, 0.754883f, - 0.774414f, 0.791992f, 0.912109f, 0.917969f, 0.918457f, 0.916992f, 0.916016f, 0.915039f, - 0.000998f, 0.003012f, 0.005123f, 0.007114f, 0.009438f, 0.011360f, 0.013763f, 0.016510f, - 0.018951f, 0.022171f, 0.025101f, 0.028305f, 0.031830f, 0.035736f, 0.039795f, 0.044067f, - 0.048950f, 0.053864f, 0.059601f, 0.066345f, 0.072815f, 0.079956f, 0.087402f, 0.096375f, - 0.105835f, 0.115479f, 0.126343f, 0.138184f, 0.150635f, 0.164062f, 0.178711f, 0.194214f, - 0.210815f, 0.229004f, 0.247314f, 0.267090f, 0.288330f, 0.309570f, 0.332275f, 0.355469f, - 0.378418f, 0.402832f, 0.427490f, 0.452637f, 0.477783f, 0.501953f, 0.527832f, 0.552734f, - 0.577637f, 0.602051f, 0.626465f, 0.649902f, 0.672852f, 0.695312f, 0.717773f, 0.737793f, - 0.758789f, 0.778809f, 0.906250f, 0.913086f, 0.913574f, 0.912598f, 0.911621f, 0.910645f, - 0.001059f, 0.002985f, 0.004475f, 0.006496f, 0.008545f, 0.010300f, 0.012581f, 0.014969f, - 0.017471f, 0.019852f, 0.022507f, 0.025864f, 0.028824f, 0.032135f, 0.036041f, 0.039795f, - 0.043884f, 0.048706f, 0.053680f, 0.059113f, 0.064819f, 0.071472f, 0.078491f, 0.086365f, - 0.094360f, 0.103577f, 0.113403f, 0.124023f, 0.135620f, 0.147705f, 0.160889f, 0.175537f, - 0.191284f, 0.207764f, 0.225464f, 0.244263f, 0.264160f, 0.284912f, 0.306641f, 0.329102f, - 0.352295f, 0.376465f, 0.400635f, 0.426025f, 0.451416f, 0.476562f, 0.502930f, 0.527344f, - 0.553711f, 0.579102f, 0.603027f, 0.627930f, 0.652344f, 0.675781f, 0.700195f, 0.722168f, - 0.742676f, 0.764648f, 0.901367f, 0.907715f, 0.908691f, 0.908203f, 0.907227f, 0.906250f, - 0.000988f, 0.002577f, 0.004124f, 0.006042f, 0.007603f, 0.009506f, 0.011299f, 0.013680f, - 0.015778f, 0.017883f, 0.020554f, 0.023102f, 0.025940f, 0.028946f, 0.031891f, 0.035431f, - 0.039825f, 0.043671f, 0.048157f, 0.053009f, 0.058075f, 0.063782f, 0.069885f, 0.077087f, - 0.084839f, 0.092712f, 0.101379f, 0.110779f, 0.121155f, 0.132446f, 0.144775f, 0.157837f, - 0.172363f, 0.187744f, 0.204590f, 0.222290f, 0.240601f, 0.260254f, 0.281494f, 0.303223f, - 0.325439f, 0.349609f, 0.373535f, 0.399170f, 0.424561f, 0.450439f, 0.475586f, 0.501953f, - 0.528320f, 0.554688f, 0.580566f, 0.605957f, 0.630859f, 0.656250f, 0.680176f, 0.704102f, - 0.727051f, 0.749512f, 0.895508f, 0.902344f, 0.903320f, 0.902832f, 0.901855f, 0.901855f, - 0.000842f, 0.002253f, 0.003597f, 0.005352f, 0.007195f, 0.008804f, 0.010460f, 0.012100f, - 0.014130f, 0.016281f, 0.018341f, 0.021057f, 0.023193f, 0.025742f, 0.029022f, 0.031830f, - 0.035278f, 0.039246f, 0.042999f, 0.047211f, 0.052032f, 0.056946f, 0.062744f, 0.068848f, - 0.075195f, 0.082642f, 0.090332f, 0.099060f, 0.108215f, 0.118469f, 0.129517f, 0.141724f, - 0.154907f, 0.169434f, 0.184448f, 0.201172f, 0.218506f, 0.237427f, 0.257324f, 0.278320f, - 0.300293f, 0.323242f, 0.347412f, 0.372070f, 0.397217f, 0.423340f, 0.449707f, 0.476807f, - 0.502930f, 0.529785f, 0.556641f, 0.582520f, 0.609863f, 0.635254f, 0.660645f, 0.686035f, - 0.710938f, 0.733887f, 0.889648f, 0.897461f, 0.898926f, 0.896973f, 0.896973f, 0.896484f, - 0.000660f, 0.002014f, 0.003531f, 0.004951f, 0.006424f, 0.007935f, 0.009392f, 0.011322f, - 0.012924f, 0.014824f, 0.016754f, 0.018906f, 0.020935f, 0.023376f, 0.026245f, 0.028809f, - 0.031860f, 0.034821f, 0.038330f, 0.042236f, 0.046387f, 0.050812f, 0.056061f, 0.061279f, - 0.066956f, 0.073547f, 0.080566f, 0.088074f, 0.096802f, 0.106079f, 0.116089f, 0.127075f, - 0.138672f, 0.151855f, 0.165649f, 0.180908f, 0.197754f, 0.215332f, 0.234375f, 0.254150f, - 0.275391f, 0.298096f, 0.321533f, 0.344971f, 0.370361f, 0.396973f, 0.422852f, 0.449219f, - 0.477295f, 0.504395f, 0.532227f, 0.558594f, 0.586914f, 0.614258f, 0.640625f, 0.666016f, - 0.692871f, 0.718262f, 0.882812f, 0.891602f, 0.892578f, 0.892090f, 0.892090f, 0.890625f, - 0.000623f, 0.002073f, 0.003298f, 0.004292f, 0.005589f, 0.007401f, 0.008377f, 0.010315f, - 0.011871f, 0.013596f, 0.015213f, 0.016632f, 0.018829f, 0.020920f, 0.023239f, 0.025726f, - 0.028381f, 0.031250f, 0.034241f, 0.037781f, 0.041473f, 0.045349f, 0.049469f, 0.054199f, - 0.059448f, 0.065186f, 0.071716f, 0.078613f, 0.085999f, 0.093872f, 0.103516f, 0.112976f, - 0.123840f, 0.135620f, 0.148804f, 0.162720f, 0.178223f, 0.194824f, 0.212280f, 0.231079f, - 0.251953f, 0.273193f, 0.295410f, 0.319580f, 0.343994f, 0.370117f, 0.396729f, 0.422852f, - 0.450684f, 0.478516f, 0.507324f, 0.534668f, 0.562988f, 0.591797f, 0.619629f, 0.646484f, - 0.674316f, 0.700195f, 0.875488f, 0.885254f, 0.886719f, 0.886719f, 0.885742f, 0.885254f, - 0.000583f, 0.001746f, 0.002840f, 0.004143f, 0.005234f, 0.006516f, 0.007835f, 0.009460f, - 0.010788f, 0.012062f, 0.013428f, 0.015053f, 0.017349f, 0.018753f, 0.021271f, 0.023163f, - 0.025284f, 0.027924f, 0.030655f, 0.033478f, 0.036957f, 0.040527f, 0.044037f, 0.048309f, - 0.053223f, 0.058319f, 0.063660f, 0.069763f, 0.076172f, 0.083679f, 0.091431f, 0.100647f, - 0.110229f, 0.120667f, 0.132690f, 0.145386f, 0.159668f, 0.174805f, 0.191284f, 0.208984f, - 0.228516f, 0.248535f, 0.270996f, 0.293701f, 0.317383f, 0.342529f, 0.369629f, 0.396240f, - 0.424072f, 0.452148f, 0.480957f, 0.509277f, 0.539551f, 0.567871f, 0.596680f, 0.625977f, - 0.654785f, 0.682129f, 0.868652f, 0.878906f, 0.880371f, 0.879883f, 0.879883f, 0.879395f, - 0.000535f, 0.001538f, 0.002930f, 0.003725f, 0.004986f, 0.005920f, 0.006973f, 0.008247f, - 0.009575f, 0.010841f, 0.012115f, 0.013550f, 0.015343f, 0.016983f, 0.018814f, 0.020523f, - 0.022568f, 0.024887f, 0.027206f, 0.029907f, 0.032959f, 0.035828f, 0.039185f, 0.042877f, - 0.046967f, 0.051605f, 0.056213f, 0.061432f, 0.067749f, 0.073730f, 0.081238f, 0.089111f, - 0.097656f, 0.107300f, 0.118042f, 0.129883f, 0.142334f, 0.156250f, 0.171875f, 0.187866f, - 0.206665f, 0.225708f, 0.246704f, 0.268799f, 0.291992f, 0.316650f, 0.342529f, 0.369629f, - 0.397217f, 0.425537f, 0.454590f, 0.484131f, 0.513672f, 0.544434f, 0.574219f, 0.604492f, - 0.633789f, 0.664062f, 0.861328f, 0.871582f, 0.873535f, 0.874512f, 0.873047f, 0.872559f, - 0.000581f, 0.001668f, 0.002563f, 0.003471f, 0.004494f, 0.005562f, 0.006580f, 0.007782f, - 0.008690f, 0.009766f, 0.011261f, 0.012314f, 0.013901f, 0.014969f, 0.016479f, 0.018265f, - 0.020294f, 0.022156f, 0.024353f, 0.026505f, 0.029053f, 0.031799f, 0.034607f, 0.037964f, - 0.041382f, 0.045471f, 0.049591f, 0.054047f, 0.059326f, 0.065186f, 0.071411f, 0.078735f, - 0.086304f, 0.094971f, 0.104126f, 0.114807f, 0.126587f, 0.138916f, 0.153564f, 0.169067f, - 0.185669f, 0.203613f, 0.223389f, 0.244629f, 0.266602f, 0.291260f, 0.316406f, 0.342773f, - 0.370361f, 0.398926f, 0.427734f, 0.458008f, 0.488770f, 0.520020f, 0.550293f, 0.582031f, - 0.613281f, 0.645020f, 0.854004f, 0.865234f, 0.866699f, 0.867188f, 0.866699f, 0.866699f, - 0.000571f, 0.001365f, 0.002483f, 0.003033f, 0.004120f, 0.005054f, 0.005981f, 0.006737f, - 0.007603f, 0.008675f, 0.009789f, 0.011078f, 0.012413f, 0.013626f, 0.014908f, 0.016174f, - 0.017792f, 0.019699f, 0.021591f, 0.023499f, 0.025635f, 0.028000f, 0.030533f, 0.033417f, - 0.036499f, 0.039948f, 0.043762f, 0.047943f, 0.052460f, 0.057465f, 0.062622f, 0.068848f, - 0.076111f, 0.083557f, 0.092102f, 0.101562f, 0.111816f, 0.123230f, 0.135864f, 0.150024f, - 0.165771f, 0.182373f, 0.200806f, 0.221191f, 0.242920f, 0.265869f, 0.290283f, 0.316406f, - 0.343262f, 0.371582f, 0.400879f, 0.431396f, 0.463623f, 0.494629f, 0.526367f, 0.558105f, - 0.591309f, 0.624023f, 0.845215f, 0.856934f, 0.859375f, 0.859375f, 0.859863f, 0.860352f, - 0.000411f, 0.001296f, 0.002012f, 0.002808f, 0.003754f, 0.004543f, 0.005215f, 0.006012f, - 0.006725f, 0.007851f, 0.008888f, 0.009979f, 0.010994f, 0.012009f, 0.013062f, 0.014549f, - 0.016113f, 0.017441f, 0.019073f, 0.020767f, 0.022598f, 0.024689f, 0.026764f, 0.029358f, - 0.032043f, 0.034760f, 0.038391f, 0.041779f, 0.045380f, 0.050110f, 0.055054f, 0.060394f, - 0.066650f, 0.073120f, 0.080688f, 0.089233f, 0.098450f, 0.108582f, 0.120178f, 0.133057f, - 0.146973f, 0.162354f, 0.179565f, 0.198364f, 0.218750f, 0.240967f, 0.264648f, 0.290039f, - 0.316650f, 0.344971f, 0.374023f, 0.404541f, 0.435791f, 0.467773f, 0.500977f, 0.535156f, - 0.569336f, 0.601562f, 0.836914f, 0.850098f, 0.852051f, 0.852539f, 0.852539f, 0.852051f, - 0.000408f, 0.001071f, 0.001857f, 0.002573f, 0.003338f, 0.004078f, 0.004692f, 0.005379f, - 0.006046f, 0.007275f, 0.007957f, 0.008606f, 0.009598f, 0.010864f, 0.011658f, 0.013084f, - 0.013977f, 0.015366f, 0.016724f, 0.018402f, 0.019669f, 0.021759f, 0.023697f, 0.025726f, - 0.027954f, 0.030640f, 0.033356f, 0.036530f, 0.039948f, 0.043701f, 0.047791f, 0.052704f, - 0.057770f, 0.063782f, 0.070129f, 0.077881f, 0.085999f, 0.095337f, 0.105591f, 0.116882f, - 0.130005f, 0.143921f, 0.159302f, 0.177246f, 0.196411f, 0.217163f, 0.239746f, 0.263916f, - 0.290039f, 0.317871f, 0.346924f, 0.377441f, 0.408936f, 0.442139f, 0.476074f, 0.509766f, - 0.545410f, 0.580078f, 0.828613f, 0.841309f, 0.843262f, 0.844238f, 0.843750f, 0.844238f, - 0.000322f, 0.001009f, 0.001674f, 0.002262f, 0.002949f, 0.003633f, 0.004250f, 0.004780f, - 0.005478f, 0.006256f, 0.007248f, 0.007919f, 0.008720f, 0.009552f, 0.010277f, 0.011391f, - 0.012291f, 0.013466f, 0.014786f, 0.015976f, 0.017288f, 0.019043f, 0.020477f, 0.022385f, - 0.024292f, 0.026276f, 0.029175f, 0.031769f, 0.034546f, 0.037842f, 0.041626f, 0.045868f, - 0.050293f, 0.055084f, 0.060669f, 0.067688f, 0.074585f, 0.083008f, 0.092102f, 0.102234f, - 0.113525f, 0.126587f, 0.140869f, 0.156860f, 0.174805f, 0.194214f, 0.215698f, 0.239014f, - 0.264404f, 0.291016f, 0.320068f, 0.350098f, 0.382080f, 0.414551f, 0.449463f, 0.485107f, - 0.520996f, 0.557617f, 0.818848f, 0.833496f, 0.836426f, 0.836914f, 0.836426f, 0.835938f, - 0.000483f, 0.000841f, 0.001632f, 0.002142f, 0.002678f, 0.003359f, 0.003830f, 0.004333f, - 0.005077f, 0.005527f, 0.006104f, 0.006908f, 0.007675f, 0.008392f, 0.009216f, 0.009789f, - 0.010880f, 0.011719f, 0.012817f, 0.013809f, 0.015068f, 0.016357f, 0.017883f, 0.019485f, - 0.021271f, 0.022995f, 0.025162f, 0.027359f, 0.029755f, 0.032806f, 0.036133f, 0.039459f, - 0.043091f, 0.047821f, 0.052368f, 0.058258f, 0.064514f, 0.071472f, 0.079224f, 0.088623f, - 0.098694f, 0.109924f, 0.123230f, 0.137817f, 0.154053f, 0.172363f, 0.192261f, 0.214478f, - 0.238647f, 0.265137f, 0.292725f, 0.322998f, 0.354492f, 0.387695f, 0.422363f, 0.458740f, - 0.495605f, 0.533691f, 0.809570f, 0.824219f, 0.826660f, 0.827148f, 0.828125f, 0.827148f, - 0.000240f, 0.000906f, 0.001379f, 0.001807f, 0.002495f, 0.002916f, 0.003490f, 0.004139f, - 0.004471f, 0.004898f, 0.005638f, 0.005978f, 0.006874f, 0.007313f, 0.007957f, 0.008698f, - 0.009560f, 0.010178f, 0.011345f, 0.012177f, 0.012985f, 0.014214f, 0.015274f, 0.016708f, - 0.017929f, 0.019882f, 0.021393f, 0.023560f, 0.025406f, 0.028137f, 0.030472f, 0.033752f, - 0.036896f, 0.040619f, 0.044952f, 0.049622f, 0.055298f, 0.061249f, 0.068420f, 0.075928f, - 0.084900f, 0.095398f, 0.107300f, 0.119934f, 0.134766f, 0.151733f, 0.170410f, 0.191284f, - 0.213867f, 0.238647f, 0.265869f, 0.295654f, 0.326660f, 0.359863f, 0.394775f, 0.432129f, - 0.469482f, 0.508789f, 0.798340f, 0.814941f, 0.817871f, 0.818359f, 0.818848f, 0.818848f, - 0.000376f, 0.000870f, 0.001291f, 0.001619f, 0.002251f, 0.002520f, 0.003016f, 0.003502f, - 0.004036f, 0.004299f, 0.004723f, 0.005234f, 0.005840f, 0.006512f, 0.006908f, 0.007595f, - 0.008003f, 0.008797f, 0.009773f, 0.010536f, 0.011284f, 0.012161f, 0.013237f, 0.014465f, - 0.015579f, 0.016968f, 0.018402f, 0.019882f, 0.021759f, 0.023621f, 0.026138f, 0.028488f, - 0.031738f, 0.034668f, 0.038239f, 0.042389f, 0.046783f, 0.052094f, 0.058319f, 0.064941f, - 0.072815f, 0.081726f, 0.092102f, 0.103516f, 0.117188f, 0.132202f, 0.149048f, 0.168091f, - 0.189941f, 0.213745f, 0.239990f, 0.268311f, 0.299316f, 0.332275f, 0.367188f, 0.403076f, - 0.442871f, 0.483398f, 0.788086f, 0.805176f, 0.808105f, 0.808594f, 0.809082f, 0.809082f, - 0.000386f, 0.000765f, 0.000998f, 0.001537f, 0.001833f, 0.002407f, 0.002529f, 0.003113f, - 0.003334f, 0.003841f, 0.004192f, 0.004585f, 0.005096f, 0.005543f, 0.006073f, 0.006405f, - 0.007118f, 0.007641f, 0.008278f, 0.008957f, 0.009651f, 0.010498f, 0.011307f, 0.012184f, - 0.013199f, 0.014343f, 0.015671f, 0.016678f, 0.018585f, 0.019852f, 0.021881f, 0.023987f, - 0.026398f, 0.029099f, 0.032227f, 0.035339f, 0.039246f, 0.043915f, 0.048859f, 0.054688f, - 0.061554f, 0.069519f, 0.078247f, 0.088379f, 0.100037f, 0.113770f, 0.129272f, 0.146606f, - 0.166626f, 0.189575f, 0.214111f, 0.241577f, 0.271973f, 0.304199f, 0.339844f, 0.375977f, - 0.415527f, 0.457275f, 0.776855f, 0.794434f, 0.797363f, 0.797852f, 0.798828f, 0.799316f, - 0.000232f, 0.000636f, 0.000996f, 0.001201f, 0.001721f, 0.002029f, 0.002340f, 0.002802f, - 0.003012f, 0.003462f, 0.003693f, 0.004059f, 0.004295f, 0.004822f, 0.005077f, 0.005623f, - 0.006126f, 0.006653f, 0.007027f, 0.007561f, 0.008049f, 0.008904f, 0.009399f, 0.010300f, - 0.011200f, 0.012115f, 0.013092f, 0.014221f, 0.015671f, 0.016891f, 0.018433f, 0.020294f, - 0.022064f, 0.024277f, 0.026688f, 0.029678f, 0.032654f, 0.036499f, 0.040955f, 0.045715f, - 0.051514f, 0.058014f, 0.065674f, 0.074707f, 0.084717f, 0.096802f, 0.111023f, 0.126709f, - 0.144775f, 0.165771f, 0.189209f, 0.215820f, 0.244385f, 0.275879f, 0.310547f, 0.348145f, - 0.387695f, 0.429932f, 0.765137f, 0.783203f, 0.787109f, 0.788574f, 0.788574f, 0.789551f, - 0.000171f, 0.000518f, 0.001106f, 0.001242f, 0.001475f, 0.001939f, 0.002092f, 0.002254f, - 0.002607f, 0.002930f, 0.003084f, 0.003382f, 0.003674f, 0.004040f, 0.004395f, 0.004780f, - 0.005157f, 0.005653f, 0.006088f, 0.006355f, 0.006870f, 0.007420f, 0.008057f, 0.008667f, - 0.009361f, 0.010040f, 0.011101f, 0.011803f, 0.012711f, 0.013962f, 0.015343f, 0.016586f, - 0.018036f, 0.020142f, 0.022079f, 0.024399f, 0.027023f, 0.030075f, 0.033569f, 0.037750f, - 0.042603f, 0.048096f, 0.054718f, 0.062134f, 0.071045f, 0.081299f, 0.093445f, 0.107605f, - 0.124268f, 0.142944f, 0.165405f, 0.189941f, 0.218262f, 0.249268f, 0.282227f, 0.319336f, - 0.359375f, 0.402832f, 0.752930f, 0.771973f, 0.775879f, 0.776855f, 0.777832f, 0.777832f, - 0.000204f, 0.000608f, 0.000865f, 0.001011f, 0.001362f, 0.001632f, 0.001817f, 0.001930f, - 0.002274f, 0.002491f, 0.002796f, 0.002932f, 0.003139f, 0.003429f, 0.003736f, 0.004055f, - 0.004448f, 0.004829f, 0.004971f, 0.005497f, 0.005859f, 0.006298f, 0.006741f, 0.007080f, - 0.007687f, 0.008308f, 0.009087f, 0.009880f, 0.010735f, 0.011528f, 0.012375f, 0.013664f, - 0.014862f, 0.016464f, 0.017868f, 0.019852f, 0.022156f, 0.024490f, 0.027435f, 0.030853f, - 0.034637f, 0.039154f, 0.044495f, 0.050964f, 0.058441f, 0.067383f, 0.077759f, 0.090332f, - 0.104797f, 0.121826f, 0.142334f, 0.164795f, 0.191528f, 0.221313f, 0.254150f, 0.290771f, - 0.330078f, 0.374268f, 0.740234f, 0.759277f, 0.763672f, 0.766113f, 0.766602f, 0.766113f, - 0.000150f, 0.000514f, 0.000666f, 0.000865f, 0.001163f, 0.001389f, 0.001540f, 0.001672f, - 0.001940f, 0.002110f, 0.002302f, 0.002419f, 0.002745f, 0.002974f, 0.003120f, 0.003366f, - 0.003695f, 0.003815f, 0.004173f, 0.004574f, 0.004879f, 0.005165f, 0.005646f, 0.006058f, - 0.006481f, 0.006969f, 0.007626f, 0.007881f, 0.008751f, 0.009445f, 0.010231f, 0.011246f, - 0.012222f, 0.013268f, 0.014641f, 0.015976f, 0.017792f, 0.019867f, 0.021912f, 0.024704f, - 0.027786f, 0.031494f, 0.036011f, 0.041229f, 0.047363f, 0.054962f, 0.063904f, 0.074463f, - 0.087036f, 0.102295f, 0.120483f, 0.141113f, 0.166260f, 0.194214f, 0.226196f, 0.261719f, - 0.301514f, 0.345459f, 0.727051f, 0.747070f, 0.751953f, 0.753418f, 0.754395f, 0.754883f, - 0.000103f, 0.000251f, 0.000628f, 0.000912f, 0.000978f, 0.001191f, 0.001365f, 0.001507f, - 0.001513f, 0.001757f, 0.001980f, 0.002121f, 0.002316f, 0.002373f, 0.002645f, 0.002909f, - 0.003012f, 0.003305f, 0.003538f, 0.003775f, 0.004070f, 0.004246f, 0.004642f, 0.004986f, - 0.005394f, 0.005802f, 0.006031f, 0.006565f, 0.006969f, 0.007618f, 0.008293f, 0.008980f, - 0.009766f, 0.010612f, 0.011528f, 0.012802f, 0.014198f, 0.015671f, 0.017517f, 0.019592f, - 0.021957f, 0.024918f, 0.028442f, 0.032562f, 0.037567f, 0.043762f, 0.051025f, 0.059753f, - 0.071045f, 0.084412f, 0.099792f, 0.119385f, 0.141846f, 0.167969f, 0.199341f, 0.233521f, - 0.272461f, 0.315674f, 0.712891f, 0.733887f, 0.738770f, 0.740234f, 0.741211f, 0.741699f, - 0.000185f, 0.000434f, 0.000489f, 0.000732f, 0.000874f, 0.000968f, 0.001122f, 0.001124f, - 0.001371f, 0.001423f, 0.001639f, 0.001693f, 0.001805f, 0.002094f, 0.002241f, 0.002356f, - 0.002567f, 0.002691f, 0.002871f, 0.003063f, 0.003195f, 0.003582f, 0.003790f, 0.004089f, - 0.004372f, 0.004536f, 0.005085f, 0.005314f, 0.005699f, 0.006153f, 0.006672f, 0.007202f, - 0.007805f, 0.008522f, 0.009216f, 0.010071f, 0.011086f, 0.012184f, 0.013596f, 0.015297f, - 0.017014f, 0.019363f, 0.021988f, 0.025299f, 0.029282f, 0.033936f, 0.040070f, 0.047028f, - 0.056519f, 0.067932f, 0.080872f, 0.098083f, 0.118469f, 0.143188f, 0.171753f, 0.205200f, - 0.243286f, 0.286133f, 0.698730f, 0.721680f, 0.725098f, 0.727051f, 0.728027f, 0.728516f, - 0.000116f, 0.000267f, 0.000565f, 0.000505f, 0.000648f, 0.000772f, 0.000813f, 0.001031f, - 0.001107f, 0.001184f, 0.001335f, 0.001391f, 0.001451f, 0.001633f, 0.001798f, 0.001874f, - 0.002090f, 0.002192f, 0.002392f, 0.002464f, 0.002707f, 0.002895f, 0.003044f, 0.003206f, - 0.003468f, 0.003666f, 0.003887f, 0.004261f, 0.004524f, 0.004898f, 0.005379f, 0.005711f, - 0.006130f, 0.006721f, 0.007267f, 0.007912f, 0.008659f, 0.009575f, 0.010475f, 0.011749f, - 0.013252f, 0.014717f, 0.016815f, 0.019302f, 0.022369f, 0.025955f, 0.030502f, 0.036285f, - 0.043579f, 0.052795f, 0.064453f, 0.078735f, 0.096497f, 0.118591f, 0.145508f, 0.177368f, - 0.213989f, 0.256592f, 0.683105f, 0.707031f, 0.710938f, 0.713379f, 0.714844f, 0.714844f, - 0.000223f, 0.000239f, 0.000286f, 0.000476f, 0.000580f, 0.000647f, 0.000715f, 0.000843f, - 0.000914f, 0.000950f, 0.001090f, 0.001163f, 0.001259f, 0.001328f, 0.001392f, 0.001560f, - 0.001549f, 0.001775f, 0.001868f, 0.001999f, 0.002199f, 0.002235f, 0.002436f, 0.002575f, - 0.002842f, 0.002892f, 0.003111f, 0.003401f, 0.003563f, 0.003887f, 0.004196f, 0.004505f, - 0.004791f, 0.005142f, 0.005684f, 0.006153f, 0.006710f, 0.007378f, 0.008064f, 0.008881f, - 0.009979f, 0.011177f, 0.012779f, 0.014435f, 0.016647f, 0.019150f, 0.022583f, 0.027252f, - 0.033051f, 0.040039f, 0.049561f, 0.061340f, 0.076843f, 0.096313f, 0.120544f, 0.150513f, - 0.185547f, 0.227173f, 0.668457f, 0.692383f, 0.696289f, 0.698242f, 0.699219f, 0.701172f, - 0.000000f, 0.000109f, 0.000315f, 0.000449f, 0.000511f, 0.000507f, 0.000538f, 0.000653f, - 0.000724f, 0.000749f, 0.000830f, 0.000893f, 0.001007f, 0.001079f, 0.001189f, 0.001163f, - 0.001335f, 0.001307f, 0.001502f, 0.001575f, 0.001627f, 0.001778f, 0.001933f, 0.002029f, - 0.002155f, 0.002254f, 0.002401f, 0.002535f, 0.002829f, 0.002943f, 0.003143f, 0.003422f, - 0.003710f, 0.003990f, 0.004318f, 0.004627f, 0.005108f, 0.005585f, 0.006142f, 0.006641f, - 0.007378f, 0.008354f, 0.009430f, 0.010628f, 0.012123f, 0.014015f, 0.016541f, 0.019836f, - 0.023849f, 0.029312f, 0.036774f, 0.046356f, 0.058868f, 0.075562f, 0.097107f, 0.124634f, - 0.157837f, 0.197754f, 0.653320f, 0.677734f, 0.682129f, 0.684082f, 0.685547f, 0.684570f, - 0.000166f, 0.000195f, 0.000256f, 0.000372f, 0.000386f, 0.000415f, 0.000515f, 0.000432f, - 0.000579f, 0.000606f, 0.000706f, 0.000745f, 0.000764f, 0.000837f, 0.000853f, 0.000993f, - 0.001034f, 0.001066f, 0.001156f, 0.001203f, 0.001339f, 0.001418f, 0.001470f, 0.001612f, - 0.001614f, 0.001707f, 0.001850f, 0.001986f, 0.002151f, 0.002254f, 0.002499f, 0.002560f, - 0.002794f, 0.003000f, 0.003212f, 0.003510f, 0.003761f, 0.004086f, 0.004475f, 0.004967f, - 0.005428f, 0.006134f, 0.006840f, 0.007786f, 0.008858f, 0.010033f, 0.011909f, 0.014137f, - 0.016907f, 0.020767f, 0.025894f, 0.033386f, 0.043274f, 0.056854f, 0.075439f, 0.099548f, - 0.130737f, 0.169434f, 0.634277f, 0.661133f, 0.667480f, 0.668945f, 0.669922f, 0.670898f, - 0.000115f, 0.000119f, 0.000230f, 0.000304f, 0.000221f, 0.000380f, 0.000322f, 0.000351f, - 0.000453f, 0.000527f, 0.000535f, 0.000558f, 0.000595f, 0.000675f, 0.000707f, 0.000670f, - 0.000776f, 0.000812f, 0.000839f, 0.000911f, 0.000974f, 0.001033f, 0.001082f, 0.001154f, - 0.001209f, 0.001268f, 0.001416f, 0.001432f, 0.001607f, 0.001775f, 0.001877f, 0.001911f, - 0.002041f, 0.002207f, 0.002380f, 0.002563f, 0.002741f, 0.002956f, 0.003281f, 0.003513f, - 0.003902f, 0.004353f, 0.004803f, 0.005405f, 0.006256f, 0.007072f, 0.008263f, 0.009659f, - 0.011627f, 0.014221f, 0.017792f, 0.022919f, 0.030075f, 0.040497f, 0.055878f, 0.076721f, - 0.104980f, 0.141357f, 0.618652f, 0.644531f, 0.650391f, 0.652832f, 0.653320f, 0.654785f, - 0.000000f, 0.000122f, 0.000142f, 0.000227f, 0.000248f, 0.000246f, 0.000296f, 0.000254f, - 0.000308f, 0.000329f, 0.000387f, 0.000437f, 0.000443f, 0.000504f, 0.000515f, 0.000535f, - 0.000566f, 0.000592f, 0.000618f, 0.000641f, 0.000706f, 0.000746f, 0.000787f, 0.000839f, - 0.000878f, 0.000920f, 0.001043f, 0.001041f, 0.001136f, 0.001199f, 0.001258f, 0.001393f, - 0.001428f, 0.001549f, 0.001632f, 0.001856f, 0.001945f, 0.002079f, 0.002310f, 0.002489f, - 0.002708f, 0.002996f, 0.003315f, 0.003759f, 0.004177f, 0.004803f, 0.005619f, 0.006527f, - 0.007793f, 0.009468f, 0.011917f, 0.015152f, 0.019897f, 0.027298f, 0.038910f, 0.055908f, - 0.080811f, 0.114563f, 0.600586f, 0.628906f, 0.634277f, 0.636719f, 0.637207f, 0.638672f, - 0.000000f, 0.000000f, 0.000106f, 0.000137f, 0.000172f, 0.000211f, 0.000189f, 0.000226f, - 0.000230f, 0.000248f, 0.000293f, 0.000251f, 0.000264f, 0.000321f, 0.000343f, 0.000399f, - 0.000368f, 0.000401f, 0.000499f, 0.000479f, 0.000498f, 0.000526f, 0.000550f, 0.000595f, - 0.000631f, 0.000645f, 0.000726f, 0.000717f, 0.000786f, 0.000902f, 0.000865f, 0.000916f, - 0.000989f, 0.001059f, 0.001165f, 0.001246f, 0.001279f, 0.001408f, 0.001566f, 0.001628f, - 0.001808f, 0.001991f, 0.002165f, 0.002466f, 0.002766f, 0.003084f, 0.003534f, 0.004250f, - 0.005016f, 0.006130f, 0.007584f, 0.009605f, 0.012718f, 0.017395f, 0.025131f, 0.038269f, - 0.058899f, 0.089661f, 0.582031f, 0.611328f, 0.616699f, 0.620117f, 0.621094f, 0.622559f, - 0.000000f, 0.000108f, 0.000104f, 0.000095f, 0.000117f, 0.000117f, 0.000122f, 0.000143f, - 0.000147f, 0.000164f, 0.000174f, 0.000216f, 0.000191f, 0.000227f, 0.000241f, 0.000250f, - 0.000257f, 0.000271f, 0.000301f, 0.000298f, 0.000317f, 0.000344f, 0.000370f, 0.000392f, - 0.000404f, 0.000427f, 0.000491f, 0.000491f, 0.000519f, 0.000535f, 0.000611f, 0.000601f, - 0.000668f, 0.000698f, 0.000767f, 0.000838f, 0.000865f, 0.000895f, 0.000993f, 0.001066f, - 0.001161f, 0.001242f, 0.001415f, 0.001521f, 0.001743f, 0.001901f, 0.002209f, 0.002523f, - 0.003038f, 0.003601f, 0.004478f, 0.005699f, 0.007545f, 0.010437f, 0.015175f, 0.023682f, - 0.039429f, 0.066406f, 0.563477f, 0.593262f, 0.598633f, 0.602051f, 0.602539f, 0.603516f, - 0.000000f, 0.000101f, 0.000093f, 0.000087f, 0.000082f, 0.000078f, 0.000084f, 0.000087f, - 0.000093f, 0.000094f, 0.000099f, 0.000104f, 0.000114f, 0.000123f, 0.000158f, 0.000163f, - 0.000166f, 0.000178f, 0.000177f, 0.000214f, 0.000191f, 0.000208f, 0.000212f, 0.000247f, - 0.000268f, 0.000263f, 0.000272f, 0.000287f, 0.000310f, 0.000336f, 0.000353f, 0.000368f, - 0.000396f, 0.000408f, 0.000453f, 0.000476f, 0.000511f, 0.000540f, 0.000615f, 0.000635f, - 0.000682f, 0.000751f, 0.000812f, 0.000908f, 0.000987f, 0.001116f, 0.001278f, 0.001431f, - 0.001702f, 0.002047f, 0.002512f, 0.003126f, 0.004181f, 0.005817f, 0.008553f, 0.013489f, - 0.023697f, 0.045288f, 0.544922f, 0.575684f, 0.581543f, 0.584473f, 0.585938f, 0.587402f, - 0.000109f, 0.000091f, 0.000081f, 0.000075f, 0.000070f, 0.000067f, 0.000064f, 0.000061f, - 0.000057f, 0.000054f, 0.000058f, 0.000075f, 0.000062f, 0.000064f, 0.000085f, 0.000068f, - 0.000092f, 0.000094f, 0.000103f, 0.000110f, 0.000113f, 0.000119f, 0.000141f, 0.000141f, - 0.000148f, 0.000152f, 0.000159f, 0.000164f, 0.000175f, 0.000188f, 0.000184f, 0.000218f, - 0.000233f, 0.000223f, 0.000253f, 0.000265f, 0.000282f, 0.000321f, 0.000322f, 0.000351f, - 0.000371f, 0.000405f, 0.000443f, 0.000478f, 0.000515f, 0.000571f, 0.000652f, 0.000733f, - 0.000856f, 0.001011f, 0.001227f, 0.001531f, 0.002029f, 0.002817f, 0.004215f, 0.006874f, - 0.012390f, 0.027405f, 0.525879f, 0.557129f, 0.563477f, 0.566895f, 0.568848f, 0.569824f, - 0.000094f, 0.000073f, 0.000065f, 0.000060f, 0.000055f, 0.000052f, 0.000049f, 0.000048f, - 0.000046f, 0.000045f, 0.000042f, 0.000040f, 0.000040f, 0.000037f, 0.000035f, 0.000035f, - 0.000042f, 0.000036f, 0.000049f, 0.000051f, 0.000055f, 0.000056f, 0.000059f, 0.000062f, - 0.000064f, 0.000078f, 0.000071f, 0.000079f, 0.000088f, 0.000091f, 0.000093f, 0.000099f, - 0.000103f, 0.000110f, 0.000125f, 0.000123f, 0.000127f, 0.000151f, 0.000151f, 0.000161f, - 0.000169f, 0.000179f, 0.000204f, 0.000219f, 0.000240f, 0.000267f, 0.000294f, 0.000321f, - 0.000378f, 0.000438f, 0.000524f, 0.000628f, 0.000818f, 0.001125f, 0.001693f, 0.002888f, - 0.005638f, 0.013580f, 0.505859f, 0.539062f, 0.544922f, 0.548340f, 0.550293f, 0.550781f, - 0.000064f, 0.000048f, 0.000041f, 0.000037f, 0.000035f, 0.000034f, 0.000032f, 0.000031f, - 0.000030f, 0.000029f, 0.000028f, 0.000028f, 0.000027f, 0.000027f, 0.000026f, 0.000025f, - 0.000024f, 0.000023f, 0.000022f, 0.000021f, 0.000020f, 0.000019f, 0.000019f, 0.000023f, - 0.000021f, 0.000022f, 0.000026f, 0.000029f, 0.000032f, 0.000031f, 0.000036f, 0.000037f, - 0.000036f, 0.000044f, 0.000046f, 0.000048f, 0.000052f, 0.000054f, 0.000056f, 0.000061f, - 0.000070f, 0.000073f, 0.000076f, 0.000081f, 0.000082f, 0.000095f, 0.000105f, 0.000120f, - 0.000126f, 0.000143f, 0.000173f, 0.000203f, 0.000267f, 0.000346f, 0.000505f, 0.000853f, - 0.001829f, 0.005222f, 0.487061f, 0.519531f, 0.527344f, 0.529785f, 0.531738f, 0.532715f, - 0.000000f, 0.000002f, 0.000003f, 0.000004f, 0.000008f, 0.000008f, 0.000008f, 0.000010f, - 0.000009f, 0.000010f, 0.000010f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, - 0.000012f, 0.000011f, 0.000012f, 0.000011f, 0.000012f, 0.000012f, 0.000012f, 0.000011f, - 0.000011f, 0.000010f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000009f, 0.000008f, - 0.000008f, 0.000007f, 0.000008f, 0.000009f, 0.000010f, 0.000012f, 0.000012f, 0.000015f, - 0.000013f, 0.000015f, 0.000018f, 0.000020f, 0.000021f, 0.000022f, 0.000022f, 0.000024f, - 0.000026f, 0.000027f, 0.000034f, 0.000043f, 0.000049f, 0.000065f, 0.000089f, 0.000138f, - 0.000293f, 0.001143f, 0.466553f, 0.500488f, 0.508301f, 0.510742f, 0.512207f, 0.513672f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000001f, 0.000001f, - 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000004f, - 0.000006f, 0.000023f, 0.446777f, 0.482178f, 0.489746f, 0.492676f, 0.494629f, 0.496094f, - }, - { - 0.032318f, 0.095032f, 0.152344f, 0.205322f, 0.254883f, 0.299316f, 0.342041f, 0.380859f, - 0.416504f, 0.449707f, 0.481201f, 0.508789f, 0.537109f, 0.562012f, 0.584961f, 0.608398f, - 0.628418f, 0.648926f, 0.666504f, 0.684570f, 0.701172f, 0.716797f, 0.731934f, 0.746094f, - 0.759766f, 0.770996f, 0.784668f, 0.795898f, 0.806641f, 0.817871f, 0.827637f, 0.837402f, - 0.846680f, 0.855469f, 0.863770f, 0.872559f, 0.879883f, 0.887695f, 0.895508f, 0.901367f, - 0.909180f, 0.915527f, 0.921387f, 0.927734f, 0.934082f, 0.939453f, 0.944824f, 0.950684f, - 0.955566f, 0.960449f, 0.965332f, 0.969238f, 0.974121f, 0.978516f, 0.982910f, 0.986816f, - 0.990723f, 0.994629f, 0.994629f, 0.987793f, 0.981934f, 0.976562f, 0.971680f, 0.966797f, - 0.025833f, 0.076965f, 0.125854f, 0.173096f, 0.217896f, 0.259766f, 0.299561f, 0.338135f, - 0.372559f, 0.407471f, 0.437500f, 0.468262f, 0.496582f, 0.522949f, 0.547852f, 0.571289f, - 0.593750f, 0.614746f, 0.633789f, 0.652832f, 0.671387f, 0.687988f, 0.705078f, 0.719727f, - 0.734863f, 0.749023f, 0.761719f, 0.774414f, 0.786621f, 0.797363f, 0.808594f, 0.818848f, - 0.829590f, 0.838867f, 0.848633f, 0.858398f, 0.865723f, 0.874512f, 0.881836f, 0.890137f, - 0.897949f, 0.904297f, 0.910645f, 0.917480f, 0.923828f, 0.929688f, 0.935547f, 0.941895f, - 0.947266f, 0.952637f, 0.957520f, 0.962402f, 0.967285f, 0.971680f, 0.976562f, 0.980957f, - 0.984863f, 0.989258f, 0.992676f, 0.985840f, 0.979980f, 0.975098f, 0.970703f, 0.966309f, - 0.020828f, 0.063049f, 0.104797f, 0.146606f, 0.187134f, 0.225464f, 0.263916f, 0.299072f, - 0.333252f, 0.366943f, 0.398438f, 0.429199f, 0.457031f, 0.484131f, 0.509766f, 0.534668f, - 0.559082f, 0.579590f, 0.600586f, 0.622070f, 0.640625f, 0.659180f, 0.676758f, 0.692383f, - 0.708984f, 0.722656f, 0.737793f, 0.751465f, 0.764648f, 0.776367f, 0.789062f, 0.801270f, - 0.811523f, 0.821289f, 0.832031f, 0.841309f, 0.850586f, 0.860352f, 0.868652f, 0.876953f, - 0.884766f, 0.892090f, 0.899902f, 0.906738f, 0.913086f, 0.920410f, 0.927246f, 0.933105f, - 0.938477f, 0.944336f, 0.950195f, 0.955078f, 0.959961f, 0.965332f, 0.970215f, 0.975098f, - 0.979492f, 0.983887f, 0.989746f, 0.983398f, 0.978516f, 0.973633f, 0.969238f, 0.964844f, - 0.017273f, 0.052429f, 0.088745f, 0.124207f, 0.160034f, 0.195068f, 0.230103f, 0.263916f, - 0.297119f, 0.329102f, 0.360596f, 0.390625f, 0.418945f, 0.446289f, 0.472656f, 0.498535f, - 0.521973f, 0.545898f, 0.567871f, 0.588867f, 0.609375f, 0.629395f, 0.646973f, 0.664551f, - 0.681641f, 0.698242f, 0.712402f, 0.727539f, 0.741699f, 0.755371f, 0.768555f, 0.780762f, - 0.792480f, 0.803711f, 0.814941f, 0.825195f, 0.834961f, 0.844727f, 0.854004f, 0.863281f, - 0.871094f, 0.879883f, 0.887695f, 0.895508f, 0.902832f, 0.909668f, 0.916504f, 0.923828f, - 0.929688f, 0.936035f, 0.941895f, 0.947754f, 0.952637f, 0.958496f, 0.963379f, 0.968750f, - 0.973633f, 0.978027f, 0.986816f, 0.980957f, 0.976562f, 0.972168f, 0.967285f, 0.963379f, - 0.014076f, 0.043915f, 0.074951f, 0.106140f, 0.137573f, 0.169189f, 0.201416f, 0.233154f, - 0.264648f, 0.295166f, 0.324707f, 0.354248f, 0.381836f, 0.410156f, 0.436279f, 0.462891f, - 0.487793f, 0.510742f, 0.534180f, 0.556152f, 0.576660f, 0.598145f, 0.616211f, 0.636719f, - 0.653320f, 0.670410f, 0.687500f, 0.703125f, 0.718262f, 0.733398f, 0.746582f, 0.760742f, - 0.772949f, 0.785156f, 0.796875f, 0.808105f, 0.818848f, 0.829590f, 0.838867f, 0.848145f, - 0.857910f, 0.867188f, 0.875977f, 0.883301f, 0.891602f, 0.899414f, 0.906738f, 0.913086f, - 0.919922f, 0.926270f, 0.932617f, 0.938477f, 0.944824f, 0.951660f, 0.957520f, 0.961914f, - 0.967285f, 0.972168f, 0.984863f, 0.979004f, 0.974609f, 0.970215f, 0.966309f, 0.961914f, - 0.012077f, 0.037445f, 0.063660f, 0.090881f, 0.118774f, 0.147827f, 0.176636f, 0.206055f, - 0.234253f, 0.262939f, 0.291504f, 0.320312f, 0.347168f, 0.374756f, 0.401367f, 0.427734f, - 0.451904f, 0.477051f, 0.500488f, 0.523438f, 0.545898f, 0.566406f, 0.587402f, 0.605957f, - 0.624512f, 0.643555f, 0.662109f, 0.676758f, 0.693848f, 0.708984f, 0.724609f, 0.738770f, - 0.751465f, 0.765137f, 0.777344f, 0.790039f, 0.800781f, 0.812500f, 0.823242f, 0.833984f, - 0.842773f, 0.853027f, 0.861816f, 0.871094f, 0.879395f, 0.887695f, 0.895508f, 0.903320f, - 0.910156f, 0.917969f, 0.924316f, 0.931152f, 0.937988f, 0.943848f, 0.949219f, 0.955566f, - 0.960449f, 0.966309f, 0.981445f, 0.977051f, 0.972168f, 0.968262f, 0.964355f, 0.960938f, - 0.010445f, 0.032562f, 0.054657f, 0.078613f, 0.103333f, 0.128540f, 0.153564f, 0.181274f, - 0.207520f, 0.234619f, 0.261475f, 0.288818f, 0.315674f, 0.342041f, 0.368408f, 0.394287f, - 0.418945f, 0.443604f, 0.467773f, 0.490479f, 0.512695f, 0.534180f, 0.555664f, 0.575684f, - 0.596191f, 0.616211f, 0.633301f, 0.651855f, 0.668457f, 0.685547f, 0.701172f, 0.714844f, - 0.729492f, 0.743652f, 0.758301f, 0.770996f, 0.783203f, 0.794922f, 0.806641f, 0.817383f, - 0.827637f, 0.838867f, 0.847656f, 0.857422f, 0.866699f, 0.875000f, 0.884277f, 0.892578f, - 0.900391f, 0.907227f, 0.914551f, 0.922363f, 0.929199f, 0.935059f, 0.941895f, 0.948242f, - 0.953125f, 0.959473f, 0.978516f, 0.974609f, 0.970215f, 0.966309f, 0.962402f, 0.958984f, - 0.009117f, 0.027466f, 0.047424f, 0.067871f, 0.089783f, 0.112244f, 0.135376f, 0.159668f, - 0.184082f, 0.209106f, 0.233887f, 0.259277f, 0.285400f, 0.311523f, 0.336182f, 0.360840f, - 0.385986f, 0.410889f, 0.435059f, 0.458252f, 0.480713f, 0.503418f, 0.524902f, 0.546387f, - 0.566895f, 0.586426f, 0.605469f, 0.624512f, 0.642578f, 0.659668f, 0.676758f, 0.692383f, - 0.708008f, 0.722168f, 0.736816f, 0.749512f, 0.763184f, 0.776855f, 0.789062f, 0.800781f, - 0.812012f, 0.823730f, 0.833496f, 0.843750f, 0.854004f, 0.863281f, 0.872559f, 0.880371f, - 0.889648f, 0.896973f, 0.905762f, 0.912598f, 0.919922f, 0.927734f, 0.934082f, 0.940918f, - 0.946289f, 0.952637f, 0.976074f, 0.972168f, 0.967773f, 0.963867f, 0.960938f, 0.957031f, - 0.007561f, 0.024231f, 0.041077f, 0.059631f, 0.078369f, 0.098145f, 0.119507f, 0.140747f, - 0.163208f, 0.185913f, 0.209839f, 0.233154f, 0.257324f, 0.281494f, 0.305908f, 0.330566f, - 0.354736f, 0.378906f, 0.402588f, 0.425781f, 0.449219f, 0.471924f, 0.494385f, 0.516602f, - 0.536621f, 0.557617f, 0.576660f, 0.596680f, 0.616211f, 0.632812f, 0.650879f, 0.668457f, - 0.684082f, 0.700684f, 0.715332f, 0.729492f, 0.744141f, 0.757812f, 0.771973f, 0.783691f, - 0.796387f, 0.807129f, 0.818359f, 0.829590f, 0.840820f, 0.850098f, 0.859375f, 0.868652f, - 0.877930f, 0.886719f, 0.894531f, 0.903320f, 0.910645f, 0.918945f, 0.925781f, 0.932617f, - 0.939453f, 0.945801f, 0.972656f, 0.969727f, 0.965820f, 0.961914f, 0.958496f, 0.955078f, - 0.006832f, 0.020676f, 0.036224f, 0.051758f, 0.069214f, 0.086609f, 0.105225f, 0.124146f, - 0.144653f, 0.165527f, 0.186646f, 0.209106f, 0.232178f, 0.254883f, 0.277588f, 0.301758f, - 0.325195f, 0.348633f, 0.371826f, 0.395264f, 0.418213f, 0.440674f, 0.463135f, 0.485596f, - 0.506348f, 0.527832f, 0.548340f, 0.567871f, 0.587891f, 0.606934f, 0.625977f, 0.642578f, - 0.660645f, 0.677734f, 0.692871f, 0.708008f, 0.723633f, 0.737793f, 0.752441f, 0.765137f, - 0.778320f, 0.791504f, 0.802734f, 0.814453f, 0.825684f, 0.835449f, 0.847168f, 0.856934f, - 0.866699f, 0.875488f, 0.884766f, 0.893066f, 0.901367f, 0.910156f, 0.917480f, 0.924805f, - 0.932129f, 0.938965f, 0.970215f, 0.966797f, 0.963379f, 0.959961f, 0.956543f, 0.953125f, - 0.006050f, 0.018585f, 0.031860f, 0.045807f, 0.060883f, 0.076538f, 0.093323f, 0.109985f, - 0.128174f, 0.147949f, 0.167480f, 0.186768f, 0.208496f, 0.230591f, 0.252441f, 0.274170f, - 0.297363f, 0.319824f, 0.342773f, 0.365723f, 0.388672f, 0.411133f, 0.433350f, 0.455811f, - 0.477295f, 0.498291f, 0.519531f, 0.539551f, 0.560059f, 0.580566f, 0.599121f, 0.617676f, - 0.635254f, 0.653320f, 0.669434f, 0.686523f, 0.702148f, 0.717773f, 0.732422f, 0.747070f, - 0.760742f, 0.773926f, 0.786621f, 0.798340f, 0.811035f, 0.822754f, 0.833008f, 0.843750f, - 0.854004f, 0.863770f, 0.873047f, 0.882812f, 0.891602f, 0.900879f, 0.908691f, 0.916504f, - 0.924316f, 0.931152f, 0.966309f, 0.964355f, 0.961426f, 0.957520f, 0.954102f, 0.951172f, - 0.005352f, 0.016388f, 0.027985f, 0.040222f, 0.053436f, 0.067261f, 0.082520f, 0.098022f, - 0.114319f, 0.131836f, 0.150146f, 0.167969f, 0.187744f, 0.208008f, 0.228271f, 0.249634f, - 0.270996f, 0.292969f, 0.314697f, 0.337158f, 0.359375f, 0.380859f, 0.403809f, 0.426025f, - 0.447510f, 0.469482f, 0.490967f, 0.511719f, 0.532227f, 0.552734f, 0.571777f, 0.591309f, - 0.609375f, 0.628418f, 0.645508f, 0.663086f, 0.680664f, 0.696289f, 0.711426f, 0.727051f, - 0.741699f, 0.755859f, 0.768555f, 0.782227f, 0.795410f, 0.807617f, 0.818359f, 0.830078f, - 0.841309f, 0.851074f, 0.861816f, 0.871582f, 0.880859f, 0.890625f, 0.898438f, 0.907715f, - 0.915527f, 0.923828f, 0.962402f, 0.961914f, 0.958496f, 0.955078f, 0.951172f, 0.948730f, - 0.004700f, 0.014397f, 0.025208f, 0.035675f, 0.047485f, 0.060120f, 0.073242f, 0.087097f, - 0.102173f, 0.117249f, 0.133789f, 0.150513f, 0.168823f, 0.186890f, 0.206665f, 0.225830f, - 0.246216f, 0.267334f, 0.288574f, 0.309814f, 0.331299f, 0.353271f, 0.375244f, 0.396729f, - 0.418701f, 0.440674f, 0.461182f, 0.483398f, 0.504883f, 0.524902f, 0.544434f, 0.564941f, - 0.584473f, 0.603027f, 0.621582f, 0.639648f, 0.656738f, 0.673828f, 0.690430f, 0.705566f, - 0.721680f, 0.736816f, 0.750977f, 0.764648f, 0.778809f, 0.791016f, 0.804688f, 0.815918f, - 0.826660f, 0.838867f, 0.850098f, 0.860840f, 0.870605f, 0.879883f, 0.889648f, 0.898438f, - 0.907227f, 0.915527f, 0.959961f, 0.958496f, 0.955078f, 0.952148f, 0.949219f, 0.946777f, - 0.004238f, 0.013138f, 0.022202f, 0.031769f, 0.042358f, 0.053040f, 0.065613f, 0.077637f, - 0.090759f, 0.104980f, 0.119995f, 0.135498f, 0.151855f, 0.167725f, 0.186646f, 0.205078f, - 0.224121f, 0.243042f, 0.263672f, 0.283936f, 0.305176f, 0.326416f, 0.347168f, 0.369629f, - 0.390625f, 0.411865f, 0.433350f, 0.454590f, 0.475830f, 0.497314f, 0.517578f, 0.537109f, - 0.557617f, 0.577637f, 0.596191f, 0.615723f, 0.632812f, 0.651367f, 0.668945f, 0.685059f, - 0.701172f, 0.716797f, 0.732422f, 0.747559f, 0.761230f, 0.775391f, 0.788574f, 0.800781f, - 0.813965f, 0.824707f, 0.837402f, 0.848145f, 0.859375f, 0.869141f, 0.879395f, 0.889160f, - 0.897949f, 0.906250f, 0.956055f, 0.955566f, 0.952148f, 0.950195f, 0.947266f, 0.943848f, - 0.003944f, 0.011490f, 0.019943f, 0.028748f, 0.037964f, 0.047485f, 0.058014f, 0.069702f, - 0.081360f, 0.093994f, 0.107361f, 0.121277f, 0.136353f, 0.151978f, 0.167480f, 0.185669f, - 0.202637f, 0.222168f, 0.240601f, 0.259766f, 0.279541f, 0.300293f, 0.321533f, 0.342285f, - 0.362549f, 0.384033f, 0.405762f, 0.427002f, 0.447998f, 0.469238f, 0.490479f, 0.510742f, - 0.532227f, 0.551758f, 0.570312f, 0.589844f, 0.609375f, 0.628418f, 0.645508f, 0.662598f, - 0.680664f, 0.696777f, 0.712402f, 0.728516f, 0.744141f, 0.757812f, 0.771973f, 0.785156f, - 0.798828f, 0.811523f, 0.824707f, 0.835449f, 0.847168f, 0.858887f, 0.869141f, 0.878906f, - 0.888672f, 0.897949f, 0.952148f, 0.952148f, 0.949219f, 0.946777f, 0.944336f, 0.941406f, - 0.003448f, 0.010574f, 0.017807f, 0.025558f, 0.033875f, 0.042633f, 0.052307f, 0.062134f, - 0.073059f, 0.084045f, 0.096375f, 0.109192f, 0.122803f, 0.136475f, 0.151367f, 0.167603f, - 0.183960f, 0.201416f, 0.218506f, 0.237427f, 0.256104f, 0.275635f, 0.295410f, 0.315918f, - 0.336426f, 0.357178f, 0.378906f, 0.399414f, 0.421143f, 0.442139f, 0.462891f, 0.484375f, - 0.504883f, 0.524902f, 0.544922f, 0.564941f, 0.583984f, 0.603516f, 0.622070f, 0.640625f, - 0.658691f, 0.675781f, 0.692871f, 0.709473f, 0.725098f, 0.740234f, 0.754883f, 0.769531f, - 0.783203f, 0.796875f, 0.809570f, 0.823242f, 0.834473f, 0.846191f, 0.857422f, 0.868164f, - 0.878906f, 0.889160f, 0.948730f, 0.948242f, 0.946289f, 0.944336f, 0.940918f, 0.938477f, - 0.003017f, 0.009422f, 0.015900f, 0.023041f, 0.030380f, 0.038574f, 0.047150f, 0.055969f, - 0.065735f, 0.075684f, 0.086426f, 0.098267f, 0.110535f, 0.123047f, 0.136841f, 0.151489f, - 0.166138f, 0.182495f, 0.198975f, 0.216553f, 0.233765f, 0.252930f, 0.271484f, 0.291016f, - 0.310547f, 0.331299f, 0.351562f, 0.372559f, 0.393555f, 0.415039f, 0.435059f, 0.457275f, - 0.477539f, 0.498047f, 0.519043f, 0.538574f, 0.559570f, 0.579102f, 0.598633f, 0.617188f, - 0.635742f, 0.654297f, 0.672363f, 0.688965f, 0.706055f, 0.721191f, 0.737793f, 0.752930f, - 0.768066f, 0.782227f, 0.795898f, 0.809082f, 0.821289f, 0.833496f, 0.846191f, 0.857422f, - 0.869141f, 0.879883f, 0.944824f, 0.945312f, 0.942871f, 0.940918f, 0.938477f, 0.936035f, - 0.002802f, 0.008575f, 0.014763f, 0.020844f, 0.027557f, 0.034576f, 0.042084f, 0.050476f, - 0.058990f, 0.067993f, 0.077942f, 0.087952f, 0.098999f, 0.111267f, 0.122803f, 0.136719f, - 0.150269f, 0.165527f, 0.180542f, 0.196533f, 0.213257f, 0.230591f, 0.248779f, 0.267334f, - 0.286865f, 0.306152f, 0.325928f, 0.346436f, 0.367188f, 0.387695f, 0.409424f, 0.429199f, - 0.450195f, 0.471680f, 0.492920f, 0.513184f, 0.534180f, 0.553711f, 0.573730f, 0.593750f, - 0.612793f, 0.631836f, 0.649414f, 0.668457f, 0.685059f, 0.703125f, 0.719238f, 0.735352f, - 0.750000f, 0.766113f, 0.781738f, 0.794434f, 0.808105f, 0.821777f, 0.833984f, 0.846191f, - 0.858398f, 0.870117f, 0.940918f, 0.941895f, 0.939941f, 0.937500f, 0.935059f, 0.932617f, - 0.002573f, 0.007603f, 0.013100f, 0.018799f, 0.024719f, 0.031372f, 0.038147f, 0.045105f, - 0.052795f, 0.061127f, 0.069519f, 0.079529f, 0.089355f, 0.099976f, 0.111084f, 0.123718f, - 0.136353f, 0.148926f, 0.163574f, 0.178345f, 0.194214f, 0.210083f, 0.227783f, 0.245361f, - 0.263672f, 0.282471f, 0.301758f, 0.321533f, 0.341797f, 0.361816f, 0.383057f, 0.403320f, - 0.424316f, 0.445557f, 0.466797f, 0.487061f, 0.507812f, 0.528809f, 0.549805f, 0.569336f, - 0.589844f, 0.608887f, 0.627930f, 0.646973f, 0.665527f, 0.682129f, 0.700195f, 0.717773f, - 0.732910f, 0.749512f, 0.765137f, 0.779785f, 0.794434f, 0.808105f, 0.821777f, 0.834473f, - 0.847168f, 0.859375f, 0.936523f, 0.937988f, 0.936035f, 0.933594f, 0.932129f, 0.929688f, - 0.002409f, 0.007107f, 0.011833f, 0.017075f, 0.022278f, 0.028351f, 0.034088f, 0.040558f, - 0.047943f, 0.055389f, 0.063232f, 0.072021f, 0.080322f, 0.090454f, 0.100220f, 0.111389f, - 0.122986f, 0.135010f, 0.148438f, 0.162109f, 0.176270f, 0.191772f, 0.207642f, 0.224121f, - 0.241699f, 0.259277f, 0.278076f, 0.297363f, 0.316650f, 0.336670f, 0.356934f, 0.377686f, - 0.397949f, 0.418701f, 0.439941f, 0.461914f, 0.482178f, 0.502930f, 0.524414f, 0.544922f, - 0.565918f, 0.585938f, 0.605957f, 0.625000f, 0.643066f, 0.662109f, 0.680176f, 0.698730f, - 0.715820f, 0.731934f, 0.748047f, 0.764648f, 0.780273f, 0.794434f, 0.808594f, 0.821777f, - 0.836914f, 0.848145f, 0.932129f, 0.934082f, 0.932617f, 0.930176f, 0.928711f, 0.926270f, - 0.002066f, 0.006329f, 0.010986f, 0.015541f, 0.020294f, 0.025452f, 0.030975f, 0.037201f, - 0.043152f, 0.049835f, 0.056824f, 0.064331f, 0.072998f, 0.081177f, 0.090637f, 0.100525f, - 0.110718f, 0.122131f, 0.134033f, 0.146851f, 0.159912f, 0.173584f, 0.189331f, 0.204468f, - 0.221191f, 0.237671f, 0.255615f, 0.273682f, 0.292969f, 0.312012f, 0.331543f, 0.352295f, - 0.372314f, 0.393311f, 0.413818f, 0.435547f, 0.456055f, 0.477539f, 0.499023f, 0.520508f, - 0.540039f, 0.561523f, 0.581543f, 0.602051f, 0.622070f, 0.641113f, 0.659668f, 0.678223f, - 0.697266f, 0.714844f, 0.731445f, 0.748535f, 0.765137f, 0.778809f, 0.794922f, 0.810059f, - 0.824219f, 0.837402f, 0.926758f, 0.930176f, 0.928711f, 0.926758f, 0.924805f, 0.922852f, - 0.001840f, 0.005703f, 0.009918f, 0.014099f, 0.018311f, 0.023026f, 0.028000f, 0.033508f, - 0.038971f, 0.045044f, 0.051880f, 0.058289f, 0.065796f, 0.073425f, 0.081482f, 0.090698f, - 0.100464f, 0.110413f, 0.121216f, 0.132812f, 0.145142f, 0.158203f, 0.171997f, 0.186401f, - 0.201538f, 0.217651f, 0.234497f, 0.251465f, 0.269287f, 0.288330f, 0.307129f, 0.327148f, - 0.346924f, 0.367920f, 0.388428f, 0.409668f, 0.430420f, 0.451416f, 0.474121f, 0.494873f, - 0.516113f, 0.537598f, 0.558105f, 0.579102f, 0.598633f, 0.619629f, 0.639160f, 0.657715f, - 0.677734f, 0.695801f, 0.713867f, 0.731934f, 0.748047f, 0.764160f, 0.781738f, 0.796875f, - 0.810547f, 0.826172f, 0.922363f, 0.925781f, 0.924805f, 0.922852f, 0.921387f, 0.919434f, - 0.001621f, 0.005188f, 0.008888f, 0.012939f, 0.016724f, 0.021271f, 0.025772f, 0.029984f, - 0.035553f, 0.040741f, 0.046417f, 0.052490f, 0.059265f, 0.066528f, 0.074097f, 0.081482f, - 0.090271f, 0.100220f, 0.109741f, 0.120178f, 0.131226f, 0.143188f, 0.156006f, 0.169189f, - 0.183716f, 0.198486f, 0.214233f, 0.230713f, 0.247925f, 0.265381f, 0.284424f, 0.303711f, - 0.322754f, 0.342773f, 0.363525f, 0.384277f, 0.405518f, 0.427002f, 0.447754f, 0.469727f, - 0.491455f, 0.512207f, 0.534180f, 0.554688f, 0.576172f, 0.597168f, 0.617188f, 0.636719f, - 0.657227f, 0.677734f, 0.695312f, 0.713379f, 0.731934f, 0.749512f, 0.766113f, 0.782715f, - 0.798340f, 0.813477f, 0.917480f, 0.920898f, 0.920410f, 0.919922f, 0.916992f, 0.915039f, - 0.001581f, 0.004616f, 0.008049f, 0.011917f, 0.015556f, 0.019547f, 0.023270f, 0.027908f, - 0.031860f, 0.036652f, 0.041992f, 0.047577f, 0.053528f, 0.060150f, 0.066772f, 0.073914f, - 0.082153f, 0.090088f, 0.099304f, 0.108887f, 0.118835f, 0.129517f, 0.141357f, 0.154297f, - 0.166992f, 0.180908f, 0.195557f, 0.210815f, 0.227173f, 0.244141f, 0.261963f, 0.279785f, - 0.299072f, 0.318359f, 0.338379f, 0.358887f, 0.380127f, 0.401123f, 0.422607f, 0.443848f, - 0.466309f, 0.487793f, 0.509277f, 0.530762f, 0.553223f, 0.573730f, 0.594727f, 0.616699f, - 0.636719f, 0.656250f, 0.676270f, 0.695801f, 0.713867f, 0.733398f, 0.750488f, 0.767090f, - 0.784180f, 0.801270f, 0.912598f, 0.916992f, 0.916504f, 0.914551f, 0.913086f, 0.911133f, - 0.001476f, 0.004410f, 0.007374f, 0.010620f, 0.013931f, 0.017258f, 0.021057f, 0.024979f, - 0.029144f, 0.033478f, 0.037872f, 0.042969f, 0.048737f, 0.053986f, 0.060150f, 0.066895f, - 0.074036f, 0.081665f, 0.089417f, 0.098083f, 0.107361f, 0.117371f, 0.127930f, 0.139648f, - 0.151489f, 0.164062f, 0.178589f, 0.192627f, 0.208130f, 0.223755f, 0.240601f, 0.258057f, - 0.275879f, 0.295654f, 0.314697f, 0.334961f, 0.354980f, 0.375977f, 0.396729f, 0.418945f, - 0.440430f, 0.462402f, 0.484619f, 0.506348f, 0.528809f, 0.550781f, 0.572266f, 0.593750f, - 0.615234f, 0.637207f, 0.656738f, 0.676758f, 0.696289f, 0.716309f, 0.734863f, 0.752930f, - 0.770508f, 0.788574f, 0.906738f, 0.911621f, 0.912109f, 0.910156f, 0.908691f, 0.907227f, - 0.001204f, 0.003998f, 0.006786f, 0.009850f, 0.012642f, 0.015762f, 0.019226f, 0.022751f, - 0.026749f, 0.030502f, 0.034698f, 0.038940f, 0.044006f, 0.048615f, 0.054352f, 0.060608f, - 0.066711f, 0.073059f, 0.080505f, 0.088318f, 0.097290f, 0.105835f, 0.115845f, 0.126343f, - 0.137085f, 0.148804f, 0.161377f, 0.175049f, 0.189331f, 0.204346f, 0.219604f, 0.236816f, - 0.253662f, 0.272217f, 0.291260f, 0.310547f, 0.330811f, 0.350830f, 0.372314f, 0.393799f, - 0.415771f, 0.437500f, 0.459717f, 0.481934f, 0.504883f, 0.527344f, 0.549316f, 0.571777f, - 0.593750f, 0.615723f, 0.636230f, 0.657715f, 0.678223f, 0.697754f, 0.718262f, 0.737793f, - 0.756348f, 0.774902f, 0.900879f, 0.907227f, 0.906738f, 0.905762f, 0.904297f, 0.902832f, - 0.001290f, 0.003807f, 0.006207f, 0.008652f, 0.011368f, 0.014618f, 0.017792f, 0.020813f, - 0.023849f, 0.027588f, 0.031036f, 0.035400f, 0.039917f, 0.044250f, 0.049408f, 0.054321f, - 0.059937f, 0.065918f, 0.072937f, 0.079773f, 0.087463f, 0.095703f, 0.104553f, 0.113892f, - 0.124146f, 0.134888f, 0.146606f, 0.159058f, 0.171753f, 0.185913f, 0.201416f, 0.216309f, - 0.232910f, 0.250000f, 0.268555f, 0.287354f, 0.306885f, 0.326904f, 0.347412f, 0.369141f, - 0.390381f, 0.412842f, 0.434570f, 0.457764f, 0.479736f, 0.502930f, 0.525879f, 0.547852f, - 0.570801f, 0.592773f, 0.615723f, 0.637207f, 0.659180f, 0.680176f, 0.700684f, 0.720703f, - 0.740234f, 0.759766f, 0.895996f, 0.901855f, 0.901855f, 0.900879f, 0.899414f, 0.897949f, - 0.001030f, 0.003561f, 0.005718f, 0.008301f, 0.010582f, 0.013283f, 0.015839f, 0.018753f, - 0.022156f, 0.025314f, 0.028427f, 0.032318f, 0.035889f, 0.040039f, 0.044434f, 0.048737f, - 0.054077f, 0.059723f, 0.065613f, 0.072083f, 0.079224f, 0.086426f, 0.094238f, 0.102966f, - 0.111938f, 0.122253f, 0.132568f, 0.143555f, 0.155884f, 0.168945f, 0.182861f, 0.197510f, - 0.213379f, 0.229492f, 0.246948f, 0.264648f, 0.283203f, 0.303467f, 0.322998f, 0.343994f, - 0.365479f, 0.387451f, 0.409912f, 0.432129f, 0.455078f, 0.478760f, 0.501465f, 0.523926f, - 0.547852f, 0.570801f, 0.593750f, 0.616211f, 0.639160f, 0.661133f, 0.682617f, 0.703613f, - 0.725098f, 0.745117f, 0.888672f, 0.896484f, 0.896973f, 0.895020f, 0.895508f, 0.893555f, - 0.001051f, 0.002956f, 0.005398f, 0.007523f, 0.009613f, 0.012024f, 0.014725f, 0.017059f, - 0.019714f, 0.022537f, 0.025681f, 0.029236f, 0.032715f, 0.036102f, 0.040100f, 0.043945f, - 0.048859f, 0.053772f, 0.058838f, 0.064880f, 0.070862f, 0.077576f, 0.084839f, 0.092712f, - 0.101013f, 0.110229f, 0.119446f, 0.130005f, 0.141113f, 0.153198f, 0.166016f, 0.179565f, - 0.193970f, 0.209351f, 0.225830f, 0.242920f, 0.261230f, 0.280273f, 0.299316f, 0.320068f, - 0.341309f, 0.363037f, 0.384521f, 0.407227f, 0.429443f, 0.453369f, 0.477051f, 0.500977f, - 0.524414f, 0.547852f, 0.571777f, 0.595215f, 0.619141f, 0.641602f, 0.664062f, 0.686035f, - 0.707520f, 0.729004f, 0.882812f, 0.891602f, 0.891113f, 0.890625f, 0.889160f, 0.888184f, - 0.000934f, 0.002998f, 0.004883f, 0.006859f, 0.009102f, 0.010925f, 0.012871f, 0.015656f, - 0.017853f, 0.020767f, 0.023422f, 0.026413f, 0.029251f, 0.032593f, 0.036011f, 0.039825f, - 0.044495f, 0.048645f, 0.053284f, 0.058258f, 0.063782f, 0.069885f, 0.076111f, 0.083313f, - 0.090881f, 0.099060f, 0.107788f, 0.117126f, 0.127075f, 0.138428f, 0.150391f, 0.162720f, - 0.176270f, 0.190796f, 0.206177f, 0.222290f, 0.239624f, 0.257568f, 0.276367f, 0.296387f, - 0.316895f, 0.338623f, 0.360352f, 0.382812f, 0.404785f, 0.428467f, 0.452148f, 0.476562f, - 0.500488f, 0.524902f, 0.548828f, 0.572754f, 0.597168f, 0.621094f, 0.644531f, 0.667480f, - 0.689941f, 0.712402f, 0.875977f, 0.883789f, 0.884766f, 0.884766f, 0.883301f, 0.883789f, - 0.001108f, 0.002474f, 0.004707f, 0.006248f, 0.007744f, 0.009888f, 0.011787f, 0.014244f, - 0.016205f, 0.018631f, 0.021286f, 0.023758f, 0.026535f, 0.029510f, 0.032654f, 0.035919f, - 0.039825f, 0.043762f, 0.047852f, 0.052368f, 0.057373f, 0.062561f, 0.068604f, 0.074707f, - 0.081360f, 0.088623f, 0.096802f, 0.105103f, 0.114624f, 0.124573f, 0.135498f, 0.147217f, - 0.159424f, 0.172729f, 0.187378f, 0.202881f, 0.219116f, 0.235962f, 0.254639f, 0.273438f, - 0.293945f, 0.314453f, 0.335449f, 0.358154f, 0.380371f, 0.403564f, 0.428223f, 0.452148f, - 0.476074f, 0.500977f, 0.525879f, 0.550293f, 0.575195f, 0.599609f, 0.625000f, 0.649414f, - 0.672852f, 0.695801f, 0.870117f, 0.879395f, 0.879883f, 0.879395f, 0.878906f, 0.877441f, - 0.000877f, 0.002495f, 0.003918f, 0.005669f, 0.007484f, 0.009148f, 0.010895f, 0.012634f, - 0.014717f, 0.017014f, 0.019302f, 0.021347f, 0.023849f, 0.026443f, 0.029388f, 0.032532f, - 0.035492f, 0.039185f, 0.042816f, 0.046906f, 0.051453f, 0.056122f, 0.061310f, 0.066895f, - 0.072937f, 0.079590f, 0.086548f, 0.094360f, 0.103027f, 0.111938f, 0.121643f, 0.132568f, - 0.144043f, 0.156006f, 0.169434f, 0.184204f, 0.199341f, 0.215698f, 0.233032f, 0.251221f, - 0.269531f, 0.290039f, 0.311768f, 0.333740f, 0.355957f, 0.379395f, 0.402344f, 0.426758f, - 0.451172f, 0.476562f, 0.501465f, 0.526855f, 0.552246f, 0.578613f, 0.603516f, 0.629395f, - 0.653809f, 0.679199f, 0.863281f, 0.872559f, 0.874023f, 0.873535f, 0.872559f, 0.871094f, - 0.000779f, 0.002241f, 0.003813f, 0.005371f, 0.006763f, 0.008186f, 0.009827f, 0.011574f, - 0.013260f, 0.015274f, 0.017303f, 0.019119f, 0.021362f, 0.023972f, 0.026505f, 0.029144f, - 0.031860f, 0.035126f, 0.038422f, 0.041809f, 0.045929f, 0.050323f, 0.054840f, 0.059631f, - 0.065002f, 0.070984f, 0.077759f, 0.084656f, 0.091736f, 0.100037f, 0.109436f, 0.118835f, - 0.129272f, 0.140625f, 0.152832f, 0.166138f, 0.180786f, 0.195679f, 0.211914f, 0.229736f, - 0.247803f, 0.267822f, 0.287598f, 0.309326f, 0.331055f, 0.354492f, 0.377686f, 0.401855f, - 0.426270f, 0.451660f, 0.477051f, 0.503418f, 0.529785f, 0.555664f, 0.583008f, 0.608887f, - 0.635254f, 0.661133f, 0.855957f, 0.865234f, 0.866699f, 0.867188f, 0.866211f, 0.865723f, - 0.000778f, 0.002155f, 0.003584f, 0.004871f, 0.006149f, 0.007519f, 0.008858f, 0.010498f, - 0.012100f, 0.013977f, 0.015511f, 0.017303f, 0.019363f, 0.021515f, 0.023880f, 0.026230f, - 0.028564f, 0.031555f, 0.034241f, 0.037476f, 0.041138f, 0.044983f, 0.048859f, 0.053436f, - 0.058014f, 0.063232f, 0.069214f, 0.075195f, 0.081848f, 0.089417f, 0.097168f, 0.106201f, - 0.115479f, 0.126343f, 0.137695f, 0.149658f, 0.162476f, 0.177002f, 0.192993f, 0.209473f, - 0.226440f, 0.245239f, 0.264404f, 0.285156f, 0.306885f, 0.330078f, 0.353271f, 0.376465f, - 0.402100f, 0.426758f, 0.453857f, 0.479492f, 0.505859f, 0.532715f, 0.560547f, 0.587402f, - 0.614258f, 0.640137f, 0.847168f, 0.858398f, 0.860352f, 0.859863f, 0.859863f, 0.858887f, - 0.000673f, 0.002026f, 0.003120f, 0.004242f, 0.005390f, 0.006874f, 0.008087f, 0.009346f, - 0.011192f, 0.012642f, 0.013855f, 0.015511f, 0.017502f, 0.019394f, 0.021301f, 0.023331f, - 0.025681f, 0.028137f, 0.030792f, 0.033295f, 0.036804f, 0.039917f, 0.043488f, 0.047363f, - 0.051880f, 0.056580f, 0.061646f, 0.066956f, 0.072998f, 0.079407f, 0.086609f, 0.094971f, - 0.103027f, 0.112793f, 0.122742f, 0.134399f, 0.146118f, 0.159058f, 0.173828f, 0.188599f, - 0.205444f, 0.223633f, 0.241943f, 0.262451f, 0.283203f, 0.304932f, 0.328369f, 0.352051f, - 0.376953f, 0.402100f, 0.428467f, 0.454834f, 0.481934f, 0.509766f, 0.537598f, 0.566406f, - 0.594238f, 0.622559f, 0.838867f, 0.852051f, 0.853516f, 0.853027f, 0.853027f, 0.852051f, - 0.000419f, 0.001721f, 0.003044f, 0.003881f, 0.005161f, 0.006329f, 0.007500f, 0.009117f, - 0.009941f, 0.011147f, 0.013023f, 0.014053f, 0.015869f, 0.017181f, 0.018906f, 0.020889f, - 0.023026f, 0.025085f, 0.027435f, 0.029724f, 0.032440f, 0.035492f, 0.038605f, 0.042175f, - 0.045898f, 0.049988f, 0.054504f, 0.059143f, 0.064697f, 0.070435f, 0.076721f, 0.083984f, - 0.091675f, 0.100037f, 0.109009f, 0.119629f, 0.130737f, 0.143066f, 0.156250f, 0.170654f, - 0.186157f, 0.202393f, 0.220825f, 0.239990f, 0.259521f, 0.281250f, 0.303467f, 0.327148f, - 0.351318f, 0.376953f, 0.402832f, 0.430664f, 0.458252f, 0.485596f, 0.514648f, 0.543457f, - 0.572754f, 0.602051f, 0.830566f, 0.844238f, 0.845703f, 0.845703f, 0.845703f, 0.845215f, - 0.000503f, 0.001644f, 0.002455f, 0.003765f, 0.004906f, 0.005901f, 0.006805f, 0.007744f, - 0.008789f, 0.009972f, 0.011314f, 0.012688f, 0.014160f, 0.015480f, 0.016953f, 0.018555f, - 0.020325f, 0.022232f, 0.024338f, 0.026535f, 0.028717f, 0.031403f, 0.034119f, 0.037384f, - 0.040680f, 0.044128f, 0.047943f, 0.052551f, 0.057098f, 0.062134f, 0.067871f, 0.074158f, - 0.081543f, 0.088684f, 0.097107f, 0.106262f, 0.116028f, 0.127563f, 0.139404f, 0.152344f, - 0.167358f, 0.182739f, 0.199951f, 0.217773f, 0.237427f, 0.257812f, 0.279541f, 0.303223f, - 0.327148f, 0.351807f, 0.377441f, 0.405518f, 0.433105f, 0.460449f, 0.491211f, 0.520020f, - 0.550293f, 0.581543f, 0.821777f, 0.835938f, 0.837891f, 0.838867f, 0.838867f, 0.837891f, - 0.000649f, 0.001432f, 0.002455f, 0.003469f, 0.004162f, 0.005192f, 0.006046f, 0.007053f, - 0.007919f, 0.009148f, 0.010185f, 0.011490f, 0.012558f, 0.013748f, 0.015083f, 0.016663f, - 0.018341f, 0.019897f, 0.021561f, 0.023376f, 0.025513f, 0.027725f, 0.030075f, 0.032745f, - 0.035583f, 0.038544f, 0.041901f, 0.045898f, 0.049896f, 0.054443f, 0.059784f, 0.065186f, - 0.071228f, 0.078247f, 0.085632f, 0.093872f, 0.103088f, 0.113098f, 0.123840f, 0.135986f, - 0.148682f, 0.163696f, 0.179321f, 0.196533f, 0.214722f, 0.234985f, 0.256104f, 0.278320f, - 0.302246f, 0.326660f, 0.352783f, 0.379395f, 0.406738f, 0.436279f, 0.465820f, 0.496338f, - 0.527344f, 0.559082f, 0.813477f, 0.827148f, 0.829590f, 0.830566f, 0.830566f, 0.829590f, - 0.000427f, 0.001431f, 0.002077f, 0.002947f, 0.004009f, 0.004860f, 0.005501f, 0.006416f, - 0.007008f, 0.008171f, 0.009155f, 0.010063f, 0.011154f, 0.012474f, 0.013336f, 0.014793f, - 0.016006f, 0.017471f, 0.019119f, 0.020630f, 0.022079f, 0.024078f, 0.026505f, 0.028687f, - 0.031128f, 0.033813f, 0.036804f, 0.040283f, 0.043732f, 0.047882f, 0.052094f, 0.057281f, - 0.062500f, 0.068726f, 0.075012f, 0.082581f, 0.090393f, 0.099487f, 0.109375f, 0.120728f, - 0.131958f, 0.145508f, 0.160278f, 0.176025f, 0.193848f, 0.212891f, 0.232788f, 0.253906f, - 0.277344f, 0.302002f, 0.327637f, 0.354248f, 0.382080f, 0.411621f, 0.441162f, 0.472656f, - 0.504395f, 0.536621f, 0.803223f, 0.818359f, 0.821777f, 0.821777f, 0.822266f, 0.821777f, - 0.000574f, 0.001416f, 0.001961f, 0.002621f, 0.003527f, 0.004250f, 0.004894f, 0.005653f, - 0.006340f, 0.007263f, 0.008255f, 0.008965f, 0.009819f, 0.010857f, 0.011864f, 0.012917f, - 0.014114f, 0.015358f, 0.016678f, 0.018005f, 0.019669f, 0.021347f, 0.023239f, 0.025070f, - 0.027267f, 0.029434f, 0.032318f, 0.035156f, 0.038269f, 0.041534f, 0.045624f, 0.049469f, - 0.054321f, 0.059479f, 0.065369f, 0.071655f, 0.078857f, 0.086853f, 0.095886f, 0.105652f, - 0.116943f, 0.128662f, 0.142090f, 0.156860f, 0.173096f, 0.190918f, 0.210327f, 0.231201f, - 0.253418f, 0.277100f, 0.302490f, 0.328369f, 0.356445f, 0.385254f, 0.415771f, 0.446533f, - 0.479736f, 0.513184f, 0.794434f, 0.810547f, 0.812500f, 0.813477f, 0.812988f, 0.813477f, - 0.000417f, 0.001152f, 0.002066f, 0.002480f, 0.003115f, 0.003778f, 0.004543f, 0.005001f, - 0.005936f, 0.006420f, 0.007130f, 0.007881f, 0.008789f, 0.009666f, 0.010605f, 0.011276f, - 0.012352f, 0.013367f, 0.014626f, 0.015732f, 0.017090f, 0.018509f, 0.020096f, 0.021759f, - 0.023895f, 0.025681f, 0.027740f, 0.030121f, 0.032776f, 0.036011f, 0.039276f, 0.042694f, - 0.046906f, 0.051575f, 0.056488f, 0.061951f, 0.068481f, 0.075684f, 0.083191f, 0.092102f, - 0.101990f, 0.112915f, 0.125122f, 0.138672f, 0.153564f, 0.170410f, 0.188477f, 0.208008f, - 0.229980f, 0.252441f, 0.276855f, 0.303711f, 0.331055f, 0.360596f, 0.391357f, 0.422607f, - 0.456299f, 0.490234f, 0.783203f, 0.799805f, 0.803223f, 0.804688f, 0.804199f, 0.805176f, - 0.000422f, 0.000885f, 0.001743f, 0.002075f, 0.002930f, 0.003460f, 0.004105f, 0.004696f, - 0.005257f, 0.005753f, 0.006550f, 0.006916f, 0.007805f, 0.008308f, 0.009109f, 0.010056f, - 0.010918f, 0.011627f, 0.012787f, 0.013725f, 0.014732f, 0.016113f, 0.017319f, 0.018906f, - 0.020264f, 0.022324f, 0.023911f, 0.026230f, 0.028183f, 0.030884f, 0.033661f, 0.036865f, - 0.040314f, 0.044189f, 0.048615f, 0.053284f, 0.058838f, 0.065491f, 0.072205f, 0.079651f, - 0.088379f, 0.098389f, 0.109314f, 0.121765f, 0.135010f, 0.150513f, 0.167358f, 0.186035f, - 0.206543f, 0.228516f, 0.252197f, 0.278320f, 0.305176f, 0.333496f, 0.364746f, 0.396973f, - 0.430176f, 0.465820f, 0.772949f, 0.790527f, 0.794434f, 0.794922f, 0.795410f, 0.794922f, - 0.000211f, 0.000970f, 0.001484f, 0.002035f, 0.002586f, 0.003040f, 0.003540f, 0.004086f, - 0.004696f, 0.005016f, 0.005508f, 0.006100f, 0.006763f, 0.007401f, 0.008011f, 0.008675f, - 0.009247f, 0.010071f, 0.011009f, 0.011940f, 0.012802f, 0.013870f, 0.014771f, 0.016281f, - 0.017487f, 0.018890f, 0.020584f, 0.022171f, 0.024200f, 0.026505f, 0.028870f, 0.031372f, - 0.034363f, 0.037659f, 0.041412f, 0.045685f, 0.050262f, 0.055664f, 0.061768f, 0.068359f, - 0.076172f, 0.084717f, 0.094666f, 0.105835f, 0.117798f, 0.131958f, 0.147095f, 0.164795f, - 0.184326f, 0.204956f, 0.228271f, 0.253174f, 0.279785f, 0.307861f, 0.338379f, 0.370361f, - 0.404785f, 0.440430f, 0.761230f, 0.780273f, 0.783691f, 0.785645f, 0.786133f, 0.785156f, - 0.000281f, 0.000954f, 0.001275f, 0.001745f, 0.002159f, 0.002810f, 0.003002f, 0.003622f, - 0.003918f, 0.004471f, 0.004776f, 0.005352f, 0.005852f, 0.006298f, 0.006989f, 0.007339f, - 0.008087f, 0.008698f, 0.009499f, 0.010208f, 0.010986f, 0.011871f, 0.012802f, 0.013809f, - 0.014923f, 0.016129f, 0.017624f, 0.018753f, 0.020645f, 0.022156f, 0.024399f, 0.026382f, - 0.029037f, 0.031769f, 0.034851f, 0.038513f, 0.042542f, 0.047180f, 0.052063f, 0.058136f, - 0.064819f, 0.072205f, 0.080933f, 0.090698f, 0.101685f, 0.114441f, 0.128784f, 0.144287f, - 0.162476f, 0.182617f, 0.203979f, 0.228149f, 0.253906f, 0.282227f, 0.312744f, 0.344482f, - 0.378418f, 0.415039f, 0.749023f, 0.770020f, 0.773438f, 0.774902f, 0.775391f, 0.776367f, - 0.000200f, 0.000790f, 0.001209f, 0.001475f, 0.002022f, 0.002375f, 0.002754f, 0.003136f, - 0.003532f, 0.003851f, 0.004253f, 0.004719f, 0.004864f, 0.005455f, 0.005749f, 0.006435f, - 0.007053f, 0.007557f, 0.007988f, 0.008614f, 0.009216f, 0.010101f, 0.010712f, 0.011604f, - 0.012596f, 0.013588f, 0.014877f, 0.016052f, 0.017334f, 0.018753f, 0.020401f, 0.022415f, - 0.024338f, 0.026642f, 0.029282f, 0.032196f, 0.035461f, 0.039215f, 0.043854f, 0.048706f, - 0.054413f, 0.060913f, 0.068237f, 0.076965f, 0.086792f, 0.097961f, 0.110657f, 0.125488f, - 0.141846f, 0.160278f, 0.180542f, 0.203857f, 0.229004f, 0.256348f, 0.286133f, 0.317627f, - 0.351807f, 0.388184f, 0.737305f, 0.757812f, 0.762695f, 0.763672f, 0.764160f, 0.764648f, - 0.000214f, 0.000700f, 0.001134f, 0.001480f, 0.001724f, 0.002056f, 0.002468f, 0.002672f, - 0.003069f, 0.003412f, 0.003618f, 0.003883f, 0.004265f, 0.004627f, 0.004971f, 0.005508f, - 0.005817f, 0.006397f, 0.006866f, 0.007244f, 0.007812f, 0.008446f, 0.009003f, 0.009872f, - 0.010544f, 0.011345f, 0.012375f, 0.013321f, 0.014275f, 0.015587f, 0.017075f, 0.018372f, - 0.020050f, 0.022186f, 0.024246f, 0.026596f, 0.029388f, 0.032562f, 0.036285f, 0.040344f, - 0.045197f, 0.050568f, 0.056946f, 0.064514f, 0.072876f, 0.082886f, 0.093933f, 0.107056f, - 0.122070f, 0.139404f, 0.158325f, 0.180176f, 0.204590f, 0.231201f, 0.260010f, 0.290771f, - 0.325195f, 0.361816f, 0.726074f, 0.747070f, 0.751465f, 0.753418f, 0.753906f, 0.754395f, - 0.000187f, 0.000637f, 0.001095f, 0.001133f, 0.001488f, 0.001872f, 0.002007f, 0.002253f, - 0.002590f, 0.002880f, 0.003010f, 0.003420f, 0.003593f, 0.003914f, 0.004322f, 0.004650f, - 0.005051f, 0.005424f, 0.005733f, 0.006134f, 0.006683f, 0.007183f, 0.007671f, 0.008072f, - 0.008720f, 0.009483f, 0.010201f, 0.011070f, 0.011871f, 0.012863f, 0.013924f, 0.015167f, - 0.016434f, 0.018143f, 0.019669f, 0.021851f, 0.024109f, 0.026749f, 0.029587f, 0.033020f, - 0.037109f, 0.041718f, 0.047119f, 0.053192f, 0.060516f, 0.068848f, 0.078857f, 0.090149f, - 0.104004f, 0.119202f, 0.136841f, 0.157471f, 0.180420f, 0.205322f, 0.234009f, 0.264648f, - 0.297852f, 0.335449f, 0.711914f, 0.735352f, 0.740234f, 0.741211f, 0.742676f, 0.742676f, - 0.000201f, 0.000676f, 0.000884f, 0.001044f, 0.001369f, 0.001633f, 0.001786f, 0.002001f, - 0.002237f, 0.002460f, 0.002680f, 0.002777f, 0.003117f, 0.003408f, 0.003632f, 0.003910f, - 0.004211f, 0.004375f, 0.004772f, 0.005226f, 0.005520f, 0.005909f, 0.006302f, 0.006882f, - 0.007385f, 0.007858f, 0.008553f, 0.008919f, 0.009827f, 0.010582f, 0.011398f, 0.012520f, - 0.013611f, 0.014725f, 0.016190f, 0.017593f, 0.019424f, 0.021622f, 0.023941f, 0.026703f, - 0.029938f, 0.033539f, 0.038055f, 0.043243f, 0.049408f, 0.056519f, 0.065002f, 0.074951f, - 0.086548f, 0.100403f, 0.116394f, 0.135132f, 0.156860f, 0.181030f, 0.208252f, 0.238281f, - 0.271240f, 0.307861f, 0.698730f, 0.722656f, 0.727539f, 0.729980f, 0.730957f, 0.730469f, - 0.000185f, 0.000371f, 0.000784f, 0.001028f, 0.001153f, 0.001304f, 0.001567f, 0.001792f, - 0.001790f, 0.002028f, 0.002283f, 0.002424f, 0.002640f, 0.002764f, 0.003044f, 0.003313f, - 0.003445f, 0.003748f, 0.004044f, 0.004337f, 0.004677f, 0.004879f, 0.005207f, 0.005661f, - 0.006027f, 0.006481f, 0.006870f, 0.007454f, 0.007874f, 0.008583f, 0.009239f, 0.009880f, - 0.010849f, 0.011871f, 0.012833f, 0.014153f, 0.015656f, 0.017151f, 0.018967f, 0.021118f, - 0.023621f, 0.026703f, 0.030197f, 0.034576f, 0.039368f, 0.045441f, 0.052460f, 0.061157f, - 0.070862f, 0.083069f, 0.097290f, 0.114441f, 0.134155f, 0.157104f, 0.182983f, 0.212158f, - 0.244507f, 0.281250f, 0.684570f, 0.710449f, 0.715332f, 0.717285f, 0.717773f, 0.718750f, - 0.000109f, 0.000455f, 0.000558f, 0.000757f, 0.000986f, 0.001166f, 0.001298f, 0.001310f, - 0.001566f, 0.001614f, 0.001852f, 0.001933f, 0.002062f, 0.002327f, 0.002571f, 0.002699f, - 0.002909f, 0.003057f, 0.003254f, 0.003496f, 0.003643f, 0.004066f, 0.004295f, 0.004665f, - 0.004822f, 0.005161f, 0.005722f, 0.006008f, 0.006424f, 0.006897f, 0.007435f, 0.008049f, - 0.008789f, 0.009529f, 0.010284f, 0.011177f, 0.012321f, 0.013466f, 0.014885f, 0.016586f, - 0.018417f, 0.020844f, 0.023575f, 0.026810f, 0.030655f, 0.035400f, 0.041412f, 0.048462f, - 0.056976f, 0.067322f, 0.079712f, 0.094543f, 0.112610f, 0.133789f, 0.158691f, 0.186279f, - 0.217896f, 0.253418f, 0.670898f, 0.696777f, 0.702148f, 0.704590f, 0.705078f, 0.705566f, - 0.000000f, 0.000317f, 0.000556f, 0.000619f, 0.000759f, 0.000889f, 0.001012f, 0.001163f, - 0.001282f, 0.001353f, 0.001531f, 0.001621f, 0.001681f, 0.001862f, 0.001976f, 0.002140f, - 0.002392f, 0.002502f, 0.002745f, 0.002838f, 0.003019f, 0.003311f, 0.003477f, 0.003639f, - 0.003889f, 0.004166f, 0.004429f, 0.004784f, 0.005119f, 0.005547f, 0.006042f, 0.006317f, - 0.006901f, 0.007442f, 0.008110f, 0.008751f, 0.009583f, 0.010590f, 0.011566f, 0.012894f, - 0.014404f, 0.015930f, 0.018158f, 0.020569f, 0.023697f, 0.027374f, 0.031830f, 0.037567f, - 0.044434f, 0.053009f, 0.063599f, 0.076538f, 0.092346f, 0.111511f, 0.134521f, 0.161133f, - 0.191772f, 0.227173f, 0.654297f, 0.684082f, 0.687988f, 0.690918f, 0.691895f, 0.691895f, - 0.000000f, 0.000275f, 0.000368f, 0.000572f, 0.000683f, 0.000731f, 0.000877f, 0.000979f, - 0.001039f, 0.001091f, 0.001234f, 0.001332f, 0.001447f, 0.001547f, 0.001601f, 0.001760f, - 0.001790f, 0.002007f, 0.002119f, 0.002245f, 0.002493f, 0.002565f, 0.002747f, 0.002920f, - 0.003168f, 0.003235f, 0.003551f, 0.003830f, 0.004040f, 0.004368f, 0.004658f, 0.005001f, - 0.005337f, 0.005798f, 0.006287f, 0.006794f, 0.007488f, 0.008087f, 0.008865f, 0.009773f, - 0.010963f, 0.012199f, 0.013649f, 0.015610f, 0.017822f, 0.020493f, 0.023849f, 0.028320f, - 0.033752f, 0.040466f, 0.049377f, 0.060028f, 0.073853f, 0.090698f, 0.111572f, 0.136841f, - 0.166016f, 0.199341f, 0.640137f, 0.667969f, 0.675781f, 0.676758f, 0.678223f, 0.678223f, - 0.000017f, 0.000193f, 0.000383f, 0.000487f, 0.000586f, 0.000597f, 0.000618f, 0.000733f, - 0.000826f, 0.000863f, 0.000902f, 0.001037f, 0.001121f, 0.001244f, 0.001342f, 0.001329f, - 0.001514f, 0.001506f, 0.001719f, 0.001793f, 0.001851f, 0.002016f, 0.002182f, 0.002281f, - 0.002432f, 0.002554f, 0.002708f, 0.002859f, 0.003168f, 0.003344f, 0.003563f, 0.003845f, - 0.004158f, 0.004478f, 0.004852f, 0.005154f, 0.005714f, 0.006207f, 0.006752f, 0.007370f, - 0.008186f, 0.009155f, 0.010193f, 0.011490f, 0.013016f, 0.015144f, 0.017517f, 0.020752f, - 0.024811f, 0.029922f, 0.036835f, 0.045593f, 0.056946f, 0.071533f, 0.090576f, 0.113159f, - 0.140991f, 0.173340f, 0.624023f, 0.653809f, 0.660156f, 0.663574f, 0.664551f, 0.664062f, - 0.000194f, 0.000227f, 0.000316f, 0.000451f, 0.000449f, 0.000482f, 0.000610f, 0.000511f, - 0.000654f, 0.000673f, 0.000804f, 0.000844f, 0.000880f, 0.000955f, 0.000961f, 0.001127f, - 0.001169f, 0.001210f, 0.001318f, 0.001330f, 0.001507f, 0.001592f, 0.001657f, 0.001771f, - 0.001839f, 0.001953f, 0.002083f, 0.002214f, 0.002399f, 0.002518f, 0.002815f, 0.002882f, - 0.003132f, 0.003361f, 0.003605f, 0.003925f, 0.004177f, 0.004528f, 0.004963f, 0.005527f, - 0.006027f, 0.006783f, 0.007381f, 0.008469f, 0.009644f, 0.010849f, 0.012772f, 0.014748f, - 0.017578f, 0.021332f, 0.026367f, 0.033142f, 0.042389f, 0.054413f, 0.070129f, 0.091064f, - 0.116943f, 0.147339f, 0.608887f, 0.640137f, 0.645996f, 0.647461f, 0.650391f, 0.651367f, - 0.000166f, 0.000146f, 0.000248f, 0.000320f, 0.000288f, 0.000446f, 0.000375f, 0.000407f, - 0.000468f, 0.000514f, 0.000629f, 0.000638f, 0.000681f, 0.000773f, 0.000806f, 0.000766f, - 0.000883f, 0.000927f, 0.000959f, 0.001036f, 0.001097f, 0.001172f, 0.001224f, 0.001297f, - 0.001392f, 0.001425f, 0.001592f, 0.001631f, 0.001793f, 0.001965f, 0.002089f, 0.002157f, - 0.002321f, 0.002495f, 0.002680f, 0.002874f, 0.003054f, 0.003305f, 0.003632f, 0.003902f, - 0.004314f, 0.004753f, 0.005306f, 0.005901f, 0.006828f, 0.007645f, 0.008896f, 0.010323f, - 0.012283f, 0.014816f, 0.018234f, 0.023010f, 0.029678f, 0.039276f, 0.052307f, 0.070190f, - 0.093811f, 0.123474f, 0.591797f, 0.623535f, 0.631348f, 0.633301f, 0.634766f, 0.635254f, - 0.000000f, 0.000154f, 0.000184f, 0.000257f, 0.000265f, 0.000266f, 0.000323f, 0.000291f, - 0.000369f, 0.000384f, 0.000450f, 0.000472f, 0.000505f, 0.000572f, 0.000577f, 0.000604f, - 0.000636f, 0.000675f, 0.000699f, 0.000736f, 0.000787f, 0.000840f, 0.000890f, 0.000945f, - 0.000988f, 0.001039f, 0.001165f, 0.001165f, 0.001266f, 0.001318f, 0.001410f, 0.001550f, - 0.001618f, 0.001743f, 0.001866f, 0.001997f, 0.002151f, 0.002319f, 0.002562f, 0.002779f, - 0.002975f, 0.003298f, 0.003674f, 0.004131f, 0.004604f, 0.005268f, 0.006065f, 0.007027f, - 0.008316f, 0.009949f, 0.012390f, 0.015526f, 0.019852f, 0.026733f, 0.036682f, 0.051666f, - 0.072449f, 0.099792f, 0.574707f, 0.608398f, 0.614746f, 0.618164f, 0.619629f, 0.621094f, - 0.000000f, 0.000008f, 0.000146f, 0.000181f, 0.000203f, 0.000243f, 0.000206f, 0.000250f, - 0.000257f, 0.000283f, 0.000335f, 0.000293f, 0.000304f, 0.000368f, 0.000373f, 0.000435f, - 0.000418f, 0.000468f, 0.000539f, 0.000540f, 0.000564f, 0.000598f, 0.000628f, 0.000657f, - 0.000716f, 0.000724f, 0.000797f, 0.000807f, 0.000883f, 0.001002f, 0.000974f, 0.001037f, - 0.001104f, 0.001196f, 0.001316f, 0.001394f, 0.001445f, 0.001574f, 0.001746f, 0.001829f, - 0.002005f, 0.002222f, 0.002401f, 0.002699f, 0.003057f, 0.003372f, 0.003874f, 0.004505f, - 0.005360f, 0.006500f, 0.007927f, 0.009972f, 0.012878f, 0.017258f, 0.024155f, 0.035339f, - 0.052795f, 0.077637f, 0.558105f, 0.592285f, 0.600586f, 0.602539f, 0.604004f, 0.605469f, - 0.000000f, 0.000107f, 0.000122f, 0.000093f, 0.000133f, 0.000142f, 0.000149f, 0.000174f, - 0.000174f, 0.000184f, 0.000190f, 0.000234f, 0.000214f, 0.000250f, 0.000273f, 0.000286f, - 0.000292f, 0.000302f, 0.000329f, 0.000336f, 0.000366f, 0.000391f, 0.000408f, 0.000444f, - 0.000452f, 0.000495f, 0.000531f, 0.000559f, 0.000578f, 0.000611f, 0.000659f, 0.000675f, - 0.000757f, 0.000771f, 0.000854f, 0.000906f, 0.000957f, 0.001004f, 0.001102f, 0.001187f, - 0.001267f, 0.001394f, 0.001546f, 0.001683f, 0.001922f, 0.002094f, 0.002420f, 0.002754f, - 0.003254f, 0.003878f, 0.004757f, 0.005997f, 0.007812f, 0.010544f, 0.014786f, 0.022324f, - 0.035522f, 0.057465f, 0.541504f, 0.576172f, 0.583984f, 0.585938f, 0.588379f, 0.590332f, - 0.000000f, 0.000099f, 0.000091f, 0.000084f, 0.000084f, 0.000086f, 0.000089f, 0.000101f, - 0.000105f, 0.000109f, 0.000122f, 0.000124f, 0.000132f, 0.000146f, 0.000171f, 0.000172f, - 0.000176f, 0.000198f, 0.000197f, 0.000239f, 0.000218f, 0.000235f, 0.000240f, 0.000281f, - 0.000309f, 0.000301f, 0.000312f, 0.000321f, 0.000347f, 0.000370f, 0.000387f, 0.000419f, - 0.000444f, 0.000458f, 0.000513f, 0.000536f, 0.000570f, 0.000607f, 0.000688f, 0.000703f, - 0.000754f, 0.000834f, 0.000890f, 0.000997f, 0.001100f, 0.001238f, 0.001410f, 0.001584f, - 0.001859f, 0.002207f, 0.002665f, 0.003323f, 0.004353f, 0.005947f, 0.008492f, 0.012909f, - 0.021606f, 0.039368f, 0.522461f, 0.559082f, 0.566406f, 0.569824f, 0.572266f, 0.572754f, - 0.000108f, 0.000089f, 0.000079f, 0.000072f, 0.000068f, 0.000065f, 0.000061f, 0.000057f, - 0.000061f, 0.000062f, 0.000063f, 0.000086f, 0.000070f, 0.000071f, 0.000095f, 0.000080f, - 0.000107f, 0.000113f, 0.000115f, 0.000124f, 0.000121f, 0.000130f, 0.000151f, 0.000154f, - 0.000164f, 0.000170f, 0.000176f, 0.000189f, 0.000193f, 0.000215f, 0.000211f, 0.000242f, - 0.000252f, 0.000260f, 0.000280f, 0.000293f, 0.000312f, 0.000350f, 0.000359f, 0.000389f, - 0.000410f, 0.000452f, 0.000481f, 0.000535f, 0.000578f, 0.000643f, 0.000718f, 0.000812f, - 0.000939f, 0.001107f, 0.001329f, 0.001644f, 0.002155f, 0.002930f, 0.004284f, 0.006706f, - 0.011452f, 0.023895f, 0.504395f, 0.542480f, 0.550293f, 0.553711f, 0.555664f, 0.557129f, - 0.000093f, 0.000072f, 0.000063f, 0.000058f, 0.000053f, 0.000050f, 0.000047f, 0.000046f, - 0.000044f, 0.000042f, 0.000039f, 0.000037f, 0.000042f, 0.000035f, 0.000036f, 0.000037f, - 0.000051f, 0.000046f, 0.000057f, 0.000058f, 0.000061f, 0.000062f, 0.000066f, 0.000069f, - 0.000072f, 0.000087f, 0.000077f, 0.000088f, 0.000093f, 0.000099f, 0.000103f, 0.000109f, - 0.000115f, 0.000122f, 0.000139f, 0.000134f, 0.000142f, 0.000170f, 0.000175f, 0.000179f, - 0.000192f, 0.000203f, 0.000228f, 0.000245f, 0.000265f, 0.000291f, 0.000326f, 0.000360f, - 0.000420f, 0.000481f, 0.000574f, 0.000686f, 0.000887f, 0.001203f, 0.001759f, 0.002892f, - 0.005318f, 0.011955f, 0.487305f, 0.524902f, 0.534180f, 0.538086f, 0.539551f, 0.540527f, - 0.000066f, 0.000049f, 0.000041f, 0.000037f, 0.000034f, 0.000033f, 0.000032f, 0.000030f, - 0.000029f, 0.000028f, 0.000028f, 0.000027f, 0.000026f, 0.000025f, 0.000024f, 0.000023f, - 0.000022f, 0.000021f, 0.000022f, 0.000023f, 0.000019f, 0.000018f, 0.000019f, 0.000024f, - 0.000026f, 0.000029f, 0.000032f, 0.000032f, 0.000036f, 0.000034f, 0.000040f, 0.000041f, - 0.000043f, 0.000049f, 0.000049f, 0.000050f, 0.000056f, 0.000059f, 0.000067f, 0.000067f, - 0.000074f, 0.000078f, 0.000082f, 0.000092f, 0.000094f, 0.000103f, 0.000120f, 0.000130f, - 0.000141f, 0.000163f, 0.000191f, 0.000230f, 0.000286f, 0.000374f, 0.000543f, 0.000890f, - 0.001802f, 0.004650f, 0.468994f, 0.507812f, 0.516602f, 0.520508f, 0.522461f, 0.523926f, - 0.000007f, 0.000008f, 0.000008f, 0.000008f, 0.000011f, 0.000010f, 0.000010f, 0.000011f, - 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000012f, - 0.000012f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000010f, - 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000008f, 0.000008f, 0.000009f, 0.000009f, - 0.000009f, 0.000009f, 0.000010f, 0.000011f, 0.000012f, 0.000014f, 0.000013f, 0.000016f, - 0.000015f, 0.000018f, 0.000020f, 0.000021f, 0.000022f, 0.000025f, 0.000024f, 0.000025f, - 0.000030f, 0.000031f, 0.000040f, 0.000046f, 0.000052f, 0.000071f, 0.000099f, 0.000147f, - 0.000306f, 0.001072f, 0.450439f, 0.491211f, 0.499756f, 0.503418f, 0.505859f, 0.507324f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000004f, - 0.000007f, 0.000024f, 0.432129f, 0.474121f, 0.482666f, 0.486572f, 0.489014f, 0.490234f, - }, - { - 0.027573f, 0.080750f, 0.130981f, 0.177734f, 0.222290f, 0.263672f, 0.302002f, 0.338623f, - 0.373291f, 0.405029f, 0.435791f, 0.464111f, 0.490967f, 0.516602f, 0.540039f, 0.563477f, - 0.584961f, 0.605469f, 0.625000f, 0.644043f, 0.660645f, 0.677246f, 0.693848f, 0.708496f, - 0.724121f, 0.738281f, 0.751465f, 0.764648f, 0.776855f, 0.789062f, 0.799805f, 0.810547f, - 0.821289f, 0.831055f, 0.840820f, 0.850098f, 0.859863f, 0.867676f, 0.876953f, 0.884277f, - 0.892578f, 0.900391f, 0.907227f, 0.914551f, 0.921875f, 0.928223f, 0.934082f, 0.940430f, - 0.946777f, 0.952637f, 0.957520f, 0.964355f, 0.968262f, 0.974121f, 0.979004f, 0.983887f, - 0.989258f, 0.994141f, 0.993164f, 0.983398f, 0.976074f, 0.969238f, 0.962891f, 0.957031f, - 0.022873f, 0.067871f, 0.111511f, 0.153809f, 0.193359f, 0.232788f, 0.268799f, 0.303223f, - 0.337402f, 0.368652f, 0.399414f, 0.427734f, 0.455078f, 0.481201f, 0.506348f, 0.529785f, - 0.552246f, 0.573242f, 0.593750f, 0.613281f, 0.632324f, 0.650391f, 0.667480f, 0.683105f, - 0.698730f, 0.713867f, 0.728516f, 0.741211f, 0.755371f, 0.767578f, 0.779785f, 0.791504f, - 0.803223f, 0.813477f, 0.823242f, 0.834473f, 0.843750f, 0.853027f, 0.861816f, 0.870605f, - 0.878906f, 0.887695f, 0.895996f, 0.901855f, 0.910645f, 0.917480f, 0.923828f, 0.930176f, - 0.937012f, 0.943359f, 0.949707f, 0.955078f, 0.960938f, 0.966797f, 0.972656f, 0.977051f, - 0.982422f, 0.987305f, 0.989746f, 0.981445f, 0.973633f, 0.967773f, 0.961426f, 0.956055f, - 0.019089f, 0.057007f, 0.095215f, 0.132202f, 0.168823f, 0.204712f, 0.238281f, 0.272217f, - 0.304688f, 0.334717f, 0.364502f, 0.392822f, 0.420898f, 0.446533f, 0.471924f, 0.495850f, - 0.518555f, 0.541992f, 0.562988f, 0.582520f, 0.602539f, 0.621094f, 0.639160f, 0.655762f, - 0.672852f, 0.687988f, 0.703613f, 0.718262f, 0.732422f, 0.746094f, 0.758789f, 0.771484f, - 0.783203f, 0.795898f, 0.807129f, 0.817383f, 0.827637f, 0.837402f, 0.846680f, 0.856445f, - 0.865234f, 0.874023f, 0.882324f, 0.890137f, 0.898438f, 0.905273f, 0.913574f, 0.920410f, - 0.927246f, 0.934082f, 0.940918f, 0.946777f, 0.953125f, 0.958496f, 0.964844f, 0.969727f, - 0.975586f, 0.980957f, 0.986816f, 0.979004f, 0.971680f, 0.965332f, 0.959961f, 0.954590f, - 0.016327f, 0.048676f, 0.081787f, 0.114807f, 0.147705f, 0.180176f, 0.211426f, 0.243652f, - 0.273438f, 0.303223f, 0.332031f, 0.360107f, 0.386963f, 0.412598f, 0.438477f, 0.462891f, - 0.487305f, 0.510254f, 0.530762f, 0.552246f, 0.572754f, 0.590820f, 0.610352f, 0.629883f, - 0.647461f, 0.662598f, 0.679688f, 0.693848f, 0.709961f, 0.723633f, 0.737305f, 0.750977f, - 0.763672f, 0.776367f, 0.788086f, 0.799316f, 0.810059f, 0.820801f, 0.832031f, 0.841309f, - 0.851074f, 0.860352f, 0.868652f, 0.877930f, 0.886230f, 0.894531f, 0.902832f, 0.910156f, - 0.916504f, 0.924316f, 0.930664f, 0.937500f, 0.943848f, 0.950684f, 0.957031f, 0.962891f, - 0.968262f, 0.974121f, 0.983887f, 0.976074f, 0.969727f, 0.963867f, 0.958496f, 0.953125f, - 0.013573f, 0.041901f, 0.070801f, 0.100098f, 0.129517f, 0.159058f, 0.187866f, 0.217041f, - 0.246216f, 0.274414f, 0.302002f, 0.328857f, 0.354980f, 0.381592f, 0.406738f, 0.431641f, - 0.455322f, 0.478271f, 0.500000f, 0.521484f, 0.541992f, 0.563477f, 0.583008f, 0.600098f, - 0.619141f, 0.636719f, 0.653320f, 0.671387f, 0.684570f, 0.699707f, 0.715332f, 0.729492f, - 0.743164f, 0.755371f, 0.768555f, 0.780762f, 0.792480f, 0.804199f, 0.814453f, 0.824707f, - 0.835449f, 0.845215f, 0.854980f, 0.864746f, 0.874023f, 0.882812f, 0.890137f, 0.898438f, - 0.905762f, 0.914062f, 0.921387f, 0.928223f, 0.935059f, 0.941406f, 0.948242f, 0.955078f, - 0.961426f, 0.966797f, 0.980957f, 0.973633f, 0.967773f, 0.961914f, 0.956543f, 0.951660f, - 0.011681f, 0.036316f, 0.061584f, 0.087524f, 0.113342f, 0.140259f, 0.167358f, 0.194214f, - 0.220947f, 0.247437f, 0.273926f, 0.300537f, 0.325684f, 0.351074f, 0.375732f, 0.400146f, - 0.423828f, 0.446533f, 0.469482f, 0.491943f, 0.512695f, 0.532715f, 0.553223f, 0.573242f, - 0.592285f, 0.609863f, 0.627930f, 0.644531f, 0.660156f, 0.676758f, 0.691406f, 0.706055f, - 0.720215f, 0.734863f, 0.749023f, 0.762207f, 0.774414f, 0.786133f, 0.797852f, 0.809082f, - 0.820801f, 0.831055f, 0.840332f, 0.850098f, 0.859863f, 0.869629f, 0.878418f, 0.886719f, - 0.895508f, 0.903809f, 0.910645f, 0.918945f, 0.925781f, 0.932617f, 0.939453f, 0.947754f, - 0.953613f, 0.958984f, 0.977539f, 0.970703f, 0.964844f, 0.959473f, 0.954102f, 0.949707f, - 0.010330f, 0.031525f, 0.053406f, 0.076538f, 0.100159f, 0.124084f, 0.148193f, 0.173096f, - 0.197998f, 0.223267f, 0.247681f, 0.273193f, 0.297607f, 0.322021f, 0.346924f, 0.370117f, - 0.394043f, 0.417236f, 0.439697f, 0.462158f, 0.483887f, 0.504883f, 0.524902f, 0.545410f, - 0.563477f, 0.583008f, 0.602539f, 0.618652f, 0.636230f, 0.652344f, 0.669922f, 0.685059f, - 0.699219f, 0.714355f, 0.729004f, 0.741211f, 0.755371f, 0.767578f, 0.780762f, 0.792480f, - 0.803711f, 0.815918f, 0.825195f, 0.836914f, 0.846191f, 0.855957f, 0.864746f, 0.874512f, - 0.883301f, 0.891602f, 0.900391f, 0.908203f, 0.916016f, 0.923828f, 0.931152f, 0.937988f, - 0.945801f, 0.952148f, 0.974121f, 0.967773f, 0.962891f, 0.957520f, 0.952637f, 0.947754f, - 0.009186f, 0.027359f, 0.047302f, 0.067505f, 0.088806f, 0.109924f, 0.132202f, 0.154907f, - 0.177246f, 0.201050f, 0.224121f, 0.247925f, 0.271240f, 0.295410f, 0.318359f, 0.341797f, - 0.365234f, 0.387939f, 0.410156f, 0.432861f, 0.454590f, 0.475586f, 0.495850f, 0.517090f, - 0.536621f, 0.556152f, 0.575195f, 0.592773f, 0.609863f, 0.628418f, 0.645020f, 0.661133f, - 0.677246f, 0.692383f, 0.707520f, 0.721191f, 0.735352f, 0.748047f, 0.762207f, 0.774414f, - 0.786621f, 0.798828f, 0.810547f, 0.820801f, 0.831543f, 0.842285f, 0.852539f, 0.862305f, - 0.871094f, 0.880859f, 0.889648f, 0.898438f, 0.906738f, 0.914551f, 0.921875f, 0.929199f, - 0.936035f, 0.944824f, 0.971191f, 0.965332f, 0.959473f, 0.955078f, 0.950195f, 0.945801f, - 0.008041f, 0.024384f, 0.041321f, 0.059631f, 0.078003f, 0.097656f, 0.117554f, 0.138428f, - 0.159912f, 0.181152f, 0.203003f, 0.224976f, 0.247070f, 0.269531f, 0.292480f, 0.314697f, - 0.337891f, 0.360352f, 0.382324f, 0.403809f, 0.426025f, 0.447998f, 0.468018f, 0.488770f, - 0.508301f, 0.528320f, 0.547852f, 0.567383f, 0.585449f, 0.603516f, 0.620605f, 0.637695f, - 0.654297f, 0.670410f, 0.686523f, 0.700195f, 0.715820f, 0.729980f, 0.743164f, 0.756836f, - 0.769531f, 0.782715f, 0.794434f, 0.805664f, 0.816895f, 0.827637f, 0.838379f, 0.848633f, - 0.859375f, 0.868164f, 0.877930f, 0.887695f, 0.895996f, 0.905273f, 0.912598f, 0.920898f, - 0.928711f, 0.936035f, 0.966797f, 0.962402f, 0.957031f, 0.952637f, 0.947754f, 0.943848f, - 0.007095f, 0.021515f, 0.036926f, 0.052704f, 0.069641f, 0.087463f, 0.105347f, 0.123413f, - 0.143188f, 0.163452f, 0.183105f, 0.204102f, 0.225220f, 0.246704f, 0.268066f, 0.290283f, - 0.311768f, 0.333740f, 0.355225f, 0.376465f, 0.397949f, 0.419434f, 0.440430f, 0.461670f, - 0.481445f, 0.500977f, 0.520020f, 0.540527f, 0.559570f, 0.578125f, 0.595703f, 0.613770f, - 0.630371f, 0.646973f, 0.663086f, 0.678223f, 0.694336f, 0.709473f, 0.723145f, 0.736328f, - 0.750000f, 0.764648f, 0.777344f, 0.790039f, 0.801270f, 0.812988f, 0.824707f, 0.834961f, - 0.846191f, 0.856934f, 0.865723f, 0.875977f, 0.884766f, 0.894531f, 0.903320f, 0.911621f, - 0.919922f, 0.927734f, 0.962891f, 0.959473f, 0.954102f, 0.949219f, 0.945312f, 0.941406f, - 0.006138f, 0.019150f, 0.033051f, 0.047089f, 0.061829f, 0.077515f, 0.094299f, 0.111084f, - 0.128174f, 0.146729f, 0.165771f, 0.185059f, 0.205200f, 0.224731f, 0.245361f, 0.265625f, - 0.286865f, 0.307861f, 0.328857f, 0.350098f, 0.370605f, 0.392090f, 0.413086f, 0.433594f, - 0.454346f, 0.474609f, 0.493896f, 0.513672f, 0.532227f, 0.552734f, 0.569824f, 0.588867f, - 0.605957f, 0.623047f, 0.640625f, 0.656738f, 0.672852f, 0.688477f, 0.703613f, 0.717773f, - 0.732910f, 0.746582f, 0.759766f, 0.772461f, 0.786621f, 0.798340f, 0.810059f, 0.820312f, - 0.832520f, 0.842773f, 0.853516f, 0.863770f, 0.873535f, 0.883789f, 0.892578f, 0.901367f, - 0.910645f, 0.919434f, 0.958984f, 0.955566f, 0.951172f, 0.946777f, 0.942871f, 0.938965f, - 0.005424f, 0.017059f, 0.029541f, 0.042023f, 0.055389f, 0.069397f, 0.083984f, 0.099670f, - 0.115601f, 0.132324f, 0.149292f, 0.167114f, 0.185547f, 0.204468f, 0.224121f, 0.243896f, - 0.262939f, 0.283691f, 0.304443f, 0.323486f, 0.345459f, 0.365479f, 0.386230f, 0.407471f, - 0.426758f, 0.448486f, 0.467529f, 0.487061f, 0.506348f, 0.526367f, 0.545410f, 0.563965f, - 0.581543f, 0.600098f, 0.617676f, 0.634277f, 0.650391f, 0.666016f, 0.682617f, 0.697754f, - 0.712891f, 0.727539f, 0.741211f, 0.755859f, 0.769043f, 0.782227f, 0.793945f, 0.806152f, - 0.818848f, 0.830566f, 0.840332f, 0.851074f, 0.861328f, 0.872070f, 0.881836f, 0.892090f, - 0.900879f, 0.910645f, 0.955566f, 0.952637f, 0.948730f, 0.943359f, 0.939941f, 0.935547f, - 0.004833f, 0.015442f, 0.026169f, 0.037689f, 0.049683f, 0.062164f, 0.075806f, 0.089539f, - 0.103760f, 0.119263f, 0.134888f, 0.151978f, 0.168335f, 0.186646f, 0.204102f, 0.223022f, - 0.242065f, 0.260986f, 0.280518f, 0.300537f, 0.320801f, 0.340820f, 0.360107f, 0.381104f, - 0.401367f, 0.421387f, 0.441650f, 0.460449f, 0.480957f, 0.500000f, 0.519531f, 0.538574f, - 0.557129f, 0.575684f, 0.593262f, 0.610840f, 0.628906f, 0.645508f, 0.662109f, 0.677246f, - 0.692871f, 0.708008f, 0.723145f, 0.738281f, 0.751465f, 0.766113f, 0.778320f, 0.791504f, - 0.802246f, 0.816406f, 0.827637f, 0.838867f, 0.850098f, 0.860352f, 0.871582f, 0.881348f, - 0.890137f, 0.899902f, 0.951660f, 0.948730f, 0.944824f, 0.940918f, 0.937012f, 0.933594f, - 0.004269f, 0.013809f, 0.023911f, 0.033569f, 0.044342f, 0.056213f, 0.068054f, 0.080811f, - 0.093933f, 0.107910f, 0.122131f, 0.137451f, 0.152710f, 0.169434f, 0.185791f, 0.203979f, - 0.221436f, 0.239990f, 0.257812f, 0.277344f, 0.296631f, 0.316162f, 0.335693f, 0.355713f, - 0.375244f, 0.395996f, 0.416016f, 0.436035f, 0.455078f, 0.474365f, 0.494629f, 0.513184f, - 0.532715f, 0.550781f, 0.569336f, 0.586914f, 0.604980f, 0.622559f, 0.639648f, 0.655762f, - 0.672363f, 0.688477f, 0.704102f, 0.718750f, 0.733887f, 0.747559f, 0.761230f, 0.775391f, - 0.788574f, 0.800781f, 0.814453f, 0.825684f, 0.837402f, 0.848633f, 0.859375f, 0.870605f, - 0.880371f, 0.891113f, 0.947754f, 0.945312f, 0.941895f, 0.937988f, 0.934082f, 0.931152f, - 0.004028f, 0.012581f, 0.021133f, 0.030396f, 0.039948f, 0.050323f, 0.061523f, 0.072815f, - 0.084961f, 0.096985f, 0.110535f, 0.124756f, 0.138916f, 0.153687f, 0.169800f, 0.185669f, - 0.202881f, 0.219116f, 0.237305f, 0.255615f, 0.273926f, 0.293213f, 0.311768f, 0.331055f, - 0.351074f, 0.370605f, 0.390381f, 0.409668f, 0.429688f, 0.449707f, 0.468994f, 0.487549f, - 0.506836f, 0.526367f, 0.545898f, 0.562988f, 0.581543f, 0.599121f, 0.616699f, 0.634766f, - 0.651367f, 0.667480f, 0.683594f, 0.699707f, 0.714844f, 0.730957f, 0.744141f, 0.758789f, - 0.772949f, 0.785645f, 0.799316f, 0.812500f, 0.823730f, 0.836914f, 0.847168f, 0.859375f, - 0.869629f, 0.880371f, 0.942383f, 0.941406f, 0.937500f, 0.934570f, 0.931152f, 0.927734f, - 0.003613f, 0.011391f, 0.018875f, 0.027679f, 0.036133f, 0.045624f, 0.055420f, 0.065491f, - 0.076416f, 0.088135f, 0.099487f, 0.112427f, 0.126099f, 0.139771f, 0.154419f, 0.169556f, - 0.184814f, 0.201050f, 0.218262f, 0.234985f, 0.252441f, 0.271484f, 0.289062f, 0.308594f, - 0.326660f, 0.346924f, 0.365234f, 0.384521f, 0.404541f, 0.424072f, 0.443359f, 0.463135f, - 0.482422f, 0.501953f, 0.521484f, 0.539551f, 0.558594f, 0.576660f, 0.595215f, 0.612793f, - 0.629883f, 0.647949f, 0.663574f, 0.679688f, 0.695801f, 0.711426f, 0.727539f, 0.741699f, - 0.757324f, 0.770996f, 0.785156f, 0.798828f, 0.811035f, 0.823730f, 0.835449f, 0.848145f, - 0.858887f, 0.870605f, 0.937988f, 0.937988f, 0.934570f, 0.931152f, 0.927734f, 0.924805f, - 0.003248f, 0.010185f, 0.017395f, 0.025055f, 0.032928f, 0.041321f, 0.049957f, 0.059265f, - 0.069092f, 0.079407f, 0.090820f, 0.101746f, 0.113770f, 0.126953f, 0.140381f, 0.154053f, - 0.168701f, 0.184082f, 0.199951f, 0.216431f, 0.232788f, 0.250000f, 0.267578f, 0.285645f, - 0.303955f, 0.322998f, 0.341553f, 0.361084f, 0.379150f, 0.399414f, 0.418701f, 0.437988f, - 0.457275f, 0.477051f, 0.496094f, 0.515137f, 0.534180f, 0.553223f, 0.571289f, 0.589844f, - 0.606934f, 0.625488f, 0.643066f, 0.659668f, 0.676758f, 0.692871f, 0.708984f, 0.725098f, - 0.740234f, 0.753906f, 0.769043f, 0.782227f, 0.796387f, 0.810059f, 0.822266f, 0.834961f, - 0.847168f, 0.859375f, 0.933594f, 0.933594f, 0.931152f, 0.927246f, 0.923828f, 0.921387f, - 0.002914f, 0.009361f, 0.015793f, 0.022659f, 0.029938f, 0.037354f, 0.045593f, 0.053406f, - 0.062988f, 0.072083f, 0.081665f, 0.092712f, 0.103943f, 0.114990f, 0.128174f, 0.140503f, - 0.153809f, 0.167725f, 0.182251f, 0.198242f, 0.213623f, 0.230225f, 0.246826f, 0.263672f, - 0.281494f, 0.300049f, 0.318604f, 0.337158f, 0.356201f, 0.374756f, 0.394531f, 0.413574f, - 0.433105f, 0.451904f, 0.471680f, 0.491211f, 0.509766f, 0.529297f, 0.547852f, 0.566895f, - 0.584961f, 0.603516f, 0.621094f, 0.638672f, 0.656738f, 0.673340f, 0.689453f, 0.706543f, - 0.722656f, 0.737793f, 0.752930f, 0.767578f, 0.781250f, 0.796875f, 0.809082f, 0.823242f, - 0.835449f, 0.847656f, 0.929199f, 0.929199f, 0.927246f, 0.923828f, 0.920898f, 0.917969f, - 0.002766f, 0.008736f, 0.014442f, 0.020691f, 0.027054f, 0.033905f, 0.040924f, 0.048645f, - 0.056976f, 0.065674f, 0.074951f, 0.084229f, 0.094116f, 0.105225f, 0.116333f, 0.127563f, - 0.139771f, 0.153564f, 0.166626f, 0.181030f, 0.196411f, 0.211182f, 0.227417f, 0.243896f, - 0.260742f, 0.277588f, 0.295898f, 0.314209f, 0.332031f, 0.351562f, 0.370117f, 0.389404f, - 0.408203f, 0.428223f, 0.447266f, 0.467041f, 0.486084f, 0.505859f, 0.524414f, 0.543945f, - 0.562012f, 0.581543f, 0.600098f, 0.617676f, 0.636230f, 0.654297f, 0.670898f, 0.687500f, - 0.704102f, 0.720703f, 0.736816f, 0.751465f, 0.766113f, 0.781738f, 0.796387f, 0.809082f, - 0.823242f, 0.835938f, 0.923828f, 0.925781f, 0.922852f, 0.920410f, 0.916992f, 0.914551f, - 0.002483f, 0.007599f, 0.013161f, 0.018555f, 0.024551f, 0.030670f, 0.037476f, 0.044464f, - 0.051636f, 0.059174f, 0.067688f, 0.075928f, 0.085693f, 0.095093f, 0.105591f, 0.116394f, - 0.127441f, 0.139648f, 0.152344f, 0.165527f, 0.179565f, 0.193970f, 0.208862f, 0.224487f, - 0.240356f, 0.256836f, 0.274658f, 0.291748f, 0.310059f, 0.328369f, 0.346680f, 0.365234f, - 0.384521f, 0.404297f, 0.423340f, 0.442139f, 0.462646f, 0.481445f, 0.500977f, 0.520020f, - 0.540039f, 0.559082f, 0.577148f, 0.596191f, 0.614746f, 0.632812f, 0.651367f, 0.669434f, - 0.685059f, 0.702637f, 0.718750f, 0.734375f, 0.750488f, 0.766113f, 0.780762f, 0.795410f, - 0.811035f, 0.823730f, 0.919434f, 0.920898f, 0.918457f, 0.916016f, 0.913086f, 0.910645f, - 0.002457f, 0.007114f, 0.011757f, 0.016708f, 0.022125f, 0.027786f, 0.033752f, 0.040375f, - 0.046661f, 0.053864f, 0.061584f, 0.069336f, 0.077515f, 0.086365f, 0.095947f, 0.105896f, - 0.116638f, 0.127075f, 0.138916f, 0.151245f, 0.164062f, 0.177490f, 0.191528f, 0.206177f, - 0.221802f, 0.237427f, 0.253906f, 0.270508f, 0.287842f, 0.305664f, 0.323730f, 0.342285f, - 0.361572f, 0.379639f, 0.399170f, 0.418457f, 0.438965f, 0.458252f, 0.477295f, 0.497559f, - 0.516113f, 0.536133f, 0.554688f, 0.574707f, 0.593750f, 0.612305f, 0.630859f, 0.648926f, - 0.666504f, 0.684082f, 0.701660f, 0.717773f, 0.734863f, 0.751465f, 0.766602f, 0.781738f, - 0.797852f, 0.812012f, 0.913086f, 0.916016f, 0.913574f, 0.911621f, 0.909180f, 0.906250f, - 0.002132f, 0.006493f, 0.010750f, 0.015717f, 0.020569f, 0.025604f, 0.030823f, 0.036682f, - 0.043060f, 0.049286f, 0.055786f, 0.062988f, 0.070557f, 0.078918f, 0.086914f, 0.096191f, - 0.105530f, 0.116028f, 0.126953f, 0.138306f, 0.149902f, 0.162231f, 0.175537f, 0.189453f, - 0.203491f, 0.218628f, 0.234131f, 0.250000f, 0.266602f, 0.284180f, 0.301514f, 0.319580f, - 0.338135f, 0.356689f, 0.375977f, 0.395020f, 0.413818f, 0.434082f, 0.452881f, 0.473145f, - 0.492920f, 0.512207f, 0.532227f, 0.552246f, 0.570801f, 0.591309f, 0.609375f, 0.629395f, - 0.646973f, 0.665527f, 0.683105f, 0.700684f, 0.717773f, 0.734863f, 0.751465f, 0.767578f, - 0.782715f, 0.799316f, 0.908203f, 0.911133f, 0.909180f, 0.907227f, 0.904785f, 0.902832f, - 0.001891f, 0.006008f, 0.010025f, 0.014122f, 0.018616f, 0.023239f, 0.028442f, 0.033691f, - 0.038757f, 0.044556f, 0.050964f, 0.057465f, 0.064087f, 0.071167f, 0.079224f, 0.087463f, - 0.096008f, 0.105591f, 0.115356f, 0.125488f, 0.136597f, 0.148193f, 0.160278f, 0.173218f, - 0.186768f, 0.200684f, 0.215332f, 0.231323f, 0.246338f, 0.262939f, 0.279785f, 0.297607f, - 0.314941f, 0.333984f, 0.353271f, 0.371094f, 0.391357f, 0.409668f, 0.430420f, 0.448975f, - 0.469482f, 0.489746f, 0.509277f, 0.528809f, 0.549316f, 0.568848f, 0.588379f, 0.607910f, - 0.626953f, 0.645996f, 0.664062f, 0.683105f, 0.700684f, 0.718262f, 0.735840f, 0.751953f, - 0.768555f, 0.785645f, 0.902344f, 0.906250f, 0.904785f, 0.902832f, 0.900391f, 0.898438f, - 0.001732f, 0.005573f, 0.009193f, 0.012932f, 0.017075f, 0.021286f, 0.025406f, 0.030289f, - 0.035675f, 0.040344f, 0.046326f, 0.052032f, 0.058411f, 0.064575f, 0.072205f, 0.079834f, - 0.087708f, 0.095947f, 0.104797f, 0.114380f, 0.124451f, 0.134888f, 0.146606f, 0.158691f, - 0.170776f, 0.184082f, 0.197510f, 0.212524f, 0.227417f, 0.243164f, 0.259521f, 0.276367f, - 0.293457f, 0.311768f, 0.329590f, 0.348633f, 0.367188f, 0.386230f, 0.406006f, 0.425781f, - 0.446533f, 0.465332f, 0.486084f, 0.505859f, 0.526367f, 0.545898f, 0.567383f, 0.585938f, - 0.605957f, 0.625977f, 0.645508f, 0.664551f, 0.683105f, 0.701172f, 0.718750f, 0.736816f, - 0.754395f, 0.770508f, 0.896484f, 0.900879f, 0.900391f, 0.897949f, 0.895996f, 0.894043f, - 0.001713f, 0.004684f, 0.008339f, 0.011818f, 0.015450f, 0.019409f, 0.023605f, 0.027832f, - 0.032349f, 0.036865f, 0.041809f, 0.047302f, 0.052673f, 0.058838f, 0.065613f, 0.072083f, - 0.079407f, 0.087280f, 0.095337f, 0.104126f, 0.113037f, 0.122986f, 0.133667f, 0.144897f, - 0.156250f, 0.168579f, 0.181396f, 0.195068f, 0.208984f, 0.224243f, 0.239624f, 0.255859f, - 0.272461f, 0.289551f, 0.307617f, 0.326172f, 0.344482f, 0.363770f, 0.383301f, 0.402588f, - 0.422607f, 0.443115f, 0.463135f, 0.483154f, 0.503418f, 0.523926f, 0.544434f, 0.564941f, - 0.584473f, 0.604980f, 0.624512f, 0.645508f, 0.664551f, 0.683594f, 0.701660f, 0.721191f, - 0.738281f, 0.755859f, 0.889648f, 0.895996f, 0.895020f, 0.893066f, 0.891602f, 0.889160f, - 0.001545f, 0.004745f, 0.007710f, 0.010979f, 0.014450f, 0.017807f, 0.021469f, 0.025238f, - 0.029282f, 0.033661f, 0.038177f, 0.043182f, 0.048157f, 0.053436f, 0.059326f, 0.065674f, - 0.072205f, 0.078857f, 0.086548f, 0.094604f, 0.102905f, 0.111816f, 0.121521f, 0.131592f, - 0.142334f, 0.153442f, 0.165894f, 0.178345f, 0.192139f, 0.205933f, 0.220703f, 0.236084f, - 0.251709f, 0.268555f, 0.285645f, 0.303467f, 0.321777f, 0.340332f, 0.359619f, 0.379150f, - 0.398682f, 0.419189f, 0.440430f, 0.460449f, 0.480957f, 0.501465f, 0.521973f, 0.543457f, - 0.563477f, 0.584961f, 0.604492f, 0.625488f, 0.645508f, 0.665039f, 0.684082f, 0.704102f, - 0.723145f, 0.741211f, 0.885254f, 0.890137f, 0.889160f, 0.887695f, 0.886719f, 0.884277f, - 0.001487f, 0.004356f, 0.006828f, 0.010162f, 0.012993f, 0.016022f, 0.019333f, 0.023087f, - 0.026886f, 0.030518f, 0.034668f, 0.039062f, 0.043671f, 0.048370f, 0.053741f, 0.059326f, - 0.065308f, 0.071655f, 0.078125f, 0.085693f, 0.093323f, 0.101807f, 0.110657f, 0.119507f, - 0.129517f, 0.140137f, 0.151367f, 0.163330f, 0.175781f, 0.188843f, 0.202759f, 0.217163f, - 0.232666f, 0.248413f, 0.264893f, 0.282227f, 0.299805f, 0.318115f, 0.336914f, 0.356445f, - 0.375488f, 0.395996f, 0.416504f, 0.436279f, 0.457520f, 0.479004f, 0.499023f, 0.520508f, - 0.541504f, 0.562988f, 0.583984f, 0.604492f, 0.625488f, 0.646973f, 0.666504f, 0.687012f, - 0.706055f, 0.725098f, 0.877441f, 0.885254f, 0.884766f, 0.882324f, 0.881836f, 0.880371f, - 0.001443f, 0.003807f, 0.006336f, 0.009171f, 0.011909f, 0.015007f, 0.018097f, 0.020905f, - 0.024384f, 0.027893f, 0.031555f, 0.035370f, 0.039581f, 0.044128f, 0.048889f, 0.053894f, - 0.059174f, 0.065125f, 0.070984f, 0.077698f, 0.084656f, 0.091919f, 0.100037f, 0.108093f, - 0.117493f, 0.127563f, 0.137817f, 0.148438f, 0.159912f, 0.172485f, 0.185547f, 0.199585f, - 0.213867f, 0.229248f, 0.244995f, 0.261230f, 0.278564f, 0.296387f, 0.314697f, 0.333252f, - 0.353271f, 0.372314f, 0.393311f, 0.413330f, 0.433594f, 0.455078f, 0.476318f, 0.497314f, - 0.519531f, 0.540527f, 0.562500f, 0.583496f, 0.605469f, 0.626953f, 0.648438f, 0.669434f, - 0.689941f, 0.709961f, 0.870605f, 0.878906f, 0.878418f, 0.877441f, 0.875488f, 0.873535f, - 0.001302f, 0.003712f, 0.005859f, 0.008286f, 0.010910f, 0.013779f, 0.016235f, 0.019135f, - 0.021912f, 0.025345f, 0.029022f, 0.032166f, 0.036011f, 0.040131f, 0.044128f, 0.048492f, - 0.053528f, 0.058533f, 0.064209f, 0.070129f, 0.076355f, 0.083191f, 0.090149f, 0.098328f, - 0.106628f, 0.115662f, 0.124817f, 0.134766f, 0.145630f, 0.157104f, 0.169678f, 0.182495f, - 0.195801f, 0.210205f, 0.225342f, 0.241455f, 0.257812f, 0.274902f, 0.292725f, 0.311035f, - 0.330322f, 0.349365f, 0.369873f, 0.390137f, 0.411133f, 0.432373f, 0.453369f, 0.474609f, - 0.496826f, 0.519043f, 0.541504f, 0.563477f, 0.585449f, 0.606445f, 0.629395f, 0.650391f, - 0.672363f, 0.693848f, 0.863281f, 0.872070f, 0.872070f, 0.871582f, 0.869629f, 0.868164f, - 0.001170f, 0.003151f, 0.005295f, 0.007812f, 0.010132f, 0.012466f, 0.015076f, 0.017517f, - 0.019943f, 0.023178f, 0.026443f, 0.029312f, 0.032471f, 0.036041f, 0.039978f, 0.044037f, - 0.048828f, 0.053070f, 0.057983f, 0.063232f, 0.068909f, 0.075378f, 0.081909f, 0.088745f, - 0.096375f, 0.104309f, 0.113281f, 0.122437f, 0.132202f, 0.142944f, 0.154419f, 0.166138f, - 0.178955f, 0.192505f, 0.206421f, 0.221558f, 0.237183f, 0.253906f, 0.270996f, 0.289062f, - 0.308105f, 0.326904f, 0.346924f, 0.366455f, 0.387695f, 0.408936f, 0.430176f, 0.451416f, - 0.474365f, 0.496582f, 0.518066f, 0.541016f, 0.563965f, 0.585938f, 0.608887f, 0.630859f, - 0.654297f, 0.675781f, 0.856934f, 0.865234f, 0.866211f, 0.864746f, 0.863281f, 0.862793f, - 0.001049f, 0.003254f, 0.005234f, 0.007263f, 0.009270f, 0.011307f, 0.013596f, 0.015869f, - 0.018555f, 0.020844f, 0.023972f, 0.026566f, 0.029739f, 0.033020f, 0.036316f, 0.039856f, - 0.044159f, 0.048096f, 0.052277f, 0.057281f, 0.062439f, 0.067871f, 0.073792f, 0.079956f, - 0.087158f, 0.094055f, 0.102234f, 0.110535f, 0.119934f, 0.129517f, 0.140259f, 0.151245f, - 0.162842f, 0.175537f, 0.189209f, 0.203369f, 0.218262f, 0.233643f, 0.250488f, 0.268066f, - 0.285645f, 0.304443f, 0.324219f, 0.343750f, 0.364014f, 0.385254f, 0.406494f, 0.428223f, - 0.450928f, 0.472656f, 0.495605f, 0.519043f, 0.541504f, 0.565918f, 0.588379f, 0.612305f, - 0.635742f, 0.659180f, 0.850098f, 0.859863f, 0.859863f, 0.858398f, 0.857910f, 0.856934f, - 0.000914f, 0.002861f, 0.004742f, 0.006569f, 0.008415f, 0.010521f, 0.012596f, 0.014648f, - 0.016708f, 0.019089f, 0.021515f, 0.023865f, 0.026688f, 0.029572f, 0.032928f, 0.036377f, - 0.039337f, 0.043365f, 0.047333f, 0.051544f, 0.056305f, 0.061066f, 0.066406f, 0.071960f, - 0.078247f, 0.084961f, 0.092163f, 0.099426f, 0.108215f, 0.116943f, 0.126831f, 0.136719f, - 0.148193f, 0.159302f, 0.171875f, 0.185669f, 0.199585f, 0.214478f, 0.230469f, 0.247070f, - 0.264160f, 0.282471f, 0.301270f, 0.321045f, 0.341553f, 0.362061f, 0.383545f, 0.404785f, - 0.427734f, 0.449951f, 0.473389f, 0.496582f, 0.520020f, 0.543457f, 0.568359f, 0.592285f, - 0.615723f, 0.639648f, 0.840820f, 0.851074f, 0.853027f, 0.853027f, 0.852051f, 0.850586f, - 0.000679f, 0.002518f, 0.004173f, 0.006149f, 0.008064f, 0.009369f, 0.011551f, 0.013222f, - 0.015175f, 0.017212f, 0.019592f, 0.021835f, 0.024048f, 0.026932f, 0.029846f, 0.032623f, - 0.035675f, 0.038940f, 0.042542f, 0.046295f, 0.050354f, 0.055054f, 0.059601f, 0.064880f, - 0.070190f, 0.076233f, 0.082703f, 0.089661f, 0.097229f, 0.105103f, 0.113831f, 0.123474f, - 0.133423f, 0.144409f, 0.156006f, 0.168335f, 0.182495f, 0.196411f, 0.211304f, 0.227295f, - 0.243530f, 0.260986f, 0.279053f, 0.298828f, 0.318359f, 0.339111f, 0.360107f, 0.381348f, - 0.403809f, 0.427490f, 0.449463f, 0.473633f, 0.497803f, 0.521484f, 0.546875f, 0.570801f, - 0.595703f, 0.620605f, 0.833008f, 0.845215f, 0.845703f, 0.845703f, 0.845215f, 0.843750f, - 0.000719f, 0.002470f, 0.003975f, 0.005337f, 0.007275f, 0.008713f, 0.010376f, 0.012032f, - 0.013580f, 0.015793f, 0.017609f, 0.019501f, 0.021530f, 0.024277f, 0.026657f, 0.029312f, - 0.031982f, 0.035187f, 0.038086f, 0.041565f, 0.045288f, 0.049103f, 0.053436f, 0.058136f, - 0.062927f, 0.068054f, 0.073853f, 0.080383f, 0.087341f, 0.094666f, 0.102173f, 0.111084f, - 0.120300f, 0.130859f, 0.141235f, 0.152954f, 0.164429f, 0.178223f, 0.192749f, 0.207642f, - 0.223145f, 0.239868f, 0.258301f, 0.276611f, 0.295654f, 0.316162f, 0.337402f, 0.358643f, - 0.380859f, 0.403320f, 0.427002f, 0.450684f, 0.474609f, 0.499756f, 0.523926f, 0.550781f, - 0.575195f, 0.600586f, 0.824707f, 0.836914f, 0.838379f, 0.838867f, 0.837402f, 0.837402f, - 0.000683f, 0.002361f, 0.003649f, 0.005116f, 0.006416f, 0.008202f, 0.009460f, 0.010941f, - 0.012817f, 0.014099f, 0.015839f, 0.017593f, 0.019867f, 0.021988f, 0.023926f, 0.026276f, - 0.028824f, 0.031311f, 0.034363f, 0.036957f, 0.040375f, 0.043823f, 0.047546f, 0.051758f, - 0.056183f, 0.061249f, 0.066162f, 0.071777f, 0.077942f, 0.084534f, 0.091553f, 0.099487f, - 0.107910f, 0.116882f, 0.127075f, 0.137451f, 0.148804f, 0.161499f, 0.174805f, 0.188721f, - 0.203735f, 0.220093f, 0.237427f, 0.254639f, 0.273926f, 0.293457f, 0.313965f, 0.334961f, - 0.357666f, 0.379883f, 0.403076f, 0.427002f, 0.451660f, 0.476807f, 0.501953f, 0.527344f, - 0.553711f, 0.581055f, 0.815918f, 0.829102f, 0.831055f, 0.831055f, 0.831055f, 0.830566f, - 0.000607f, 0.001863f, 0.003416f, 0.004528f, 0.005943f, 0.007191f, 0.008781f, 0.009964f, - 0.011337f, 0.012939f, 0.014458f, 0.015808f, 0.018051f, 0.019394f, 0.021332f, 0.023529f, - 0.025803f, 0.028168f, 0.030502f, 0.033020f, 0.036072f, 0.039032f, 0.042419f, 0.046082f, - 0.049927f, 0.054321f, 0.058411f, 0.063538f, 0.069336f, 0.075684f, 0.081787f, 0.088562f, - 0.096436f, 0.104553f, 0.113281f, 0.123596f, 0.133667f, 0.145386f, 0.157471f, 0.171021f, - 0.185547f, 0.200562f, 0.216553f, 0.234619f, 0.251709f, 0.271240f, 0.291504f, 0.312012f, - 0.333496f, 0.355957f, 0.379395f, 0.403076f, 0.428223f, 0.453857f, 0.479492f, 0.506348f, - 0.532715f, 0.560059f, 0.805664f, 0.820801f, 0.823730f, 0.822754f, 0.822754f, 0.822266f, - 0.000593f, 0.001862f, 0.002966f, 0.004341f, 0.005600f, 0.006516f, 0.007626f, 0.008995f, - 0.010223f, 0.011292f, 0.012848f, 0.014427f, 0.016098f, 0.017532f, 0.019165f, 0.021027f, - 0.022842f, 0.024918f, 0.027115f, 0.029739f, 0.032013f, 0.034637f, 0.037506f, 0.040955f, - 0.044220f, 0.048065f, 0.051941f, 0.056305f, 0.061768f, 0.066528f, 0.072327f, 0.078979f, - 0.085571f, 0.092834f, 0.101135f, 0.110229f, 0.119690f, 0.130127f, 0.141602f, 0.153564f, - 0.167114f, 0.181763f, 0.196899f, 0.213623f, 0.230957f, 0.249268f, 0.268555f, 0.289062f, - 0.310059f, 0.333252f, 0.355957f, 0.379883f, 0.404541f, 0.430176f, 0.456055f, 0.483887f, - 0.510254f, 0.539062f, 0.797852f, 0.812988f, 0.814941f, 0.815430f, 0.815918f, 0.814453f, - 0.000556f, 0.001811f, 0.002998f, 0.003815f, 0.004658f, 0.005905f, 0.007099f, 0.008232f, - 0.009239f, 0.010483f, 0.011559f, 0.013016f, 0.014305f, 0.015671f, 0.017090f, 0.018646f, - 0.020370f, 0.022369f, 0.024124f, 0.026062f, 0.028458f, 0.030624f, 0.033264f, 0.036041f, - 0.039307f, 0.042053f, 0.045807f, 0.049530f, 0.054016f, 0.058441f, 0.063904f, 0.069641f, - 0.075745f, 0.082520f, 0.089539f, 0.097717f, 0.106750f, 0.116150f, 0.126587f, 0.137817f, - 0.150024f, 0.163452f, 0.177490f, 0.193359f, 0.209717f, 0.227539f, 0.246704f, 0.266602f, - 0.287598f, 0.309326f, 0.332520f, 0.355713f, 0.380371f, 0.406494f, 0.432861f, 0.459961f, - 0.488525f, 0.517090f, 0.787598f, 0.804199f, 0.806641f, 0.807617f, 0.807617f, 0.807129f, - 0.000507f, 0.001697f, 0.002468f, 0.003351f, 0.004425f, 0.005486f, 0.006325f, 0.007412f, - 0.008156f, 0.009270f, 0.010239f, 0.011497f, 0.012520f, 0.013954f, 0.015182f, 0.016617f, - 0.018036f, 0.019714f, 0.021362f, 0.022934f, 0.024704f, 0.026886f, 0.029419f, 0.031525f, - 0.034302f, 0.037292f, 0.040558f, 0.043701f, 0.047577f, 0.051849f, 0.056183f, 0.061249f, - 0.066467f, 0.072876f, 0.078918f, 0.086548f, 0.094116f, 0.102844f, 0.112427f, 0.122620f, - 0.133667f, 0.146362f, 0.159668f, 0.174438f, 0.190063f, 0.207153f, 0.225098f, 0.244263f, - 0.264648f, 0.286377f, 0.308350f, 0.332275f, 0.357178f, 0.382080f, 0.408936f, 0.436035f, - 0.465820f, 0.495361f, 0.776855f, 0.794922f, 0.797852f, 0.799316f, 0.798828f, 0.798340f, - 0.000366f, 0.001644f, 0.002289f, 0.003046f, 0.004082f, 0.005032f, 0.005550f, 0.006599f, - 0.007389f, 0.008369f, 0.009201f, 0.010315f, 0.011276f, 0.012405f, 0.013466f, 0.014587f, - 0.015991f, 0.017303f, 0.018692f, 0.020081f, 0.021851f, 0.023865f, 0.025726f, 0.027771f, - 0.030136f, 0.032532f, 0.035309f, 0.038422f, 0.041626f, 0.045044f, 0.048767f, 0.053375f, - 0.057861f, 0.063477f, 0.069031f, 0.075684f, 0.082336f, 0.090515f, 0.099182f, 0.107849f, - 0.118958f, 0.130005f, 0.142212f, 0.156128f, 0.170898f, 0.186890f, 0.203857f, 0.222534f, - 0.241821f, 0.263428f, 0.285156f, 0.308105f, 0.332275f, 0.359131f, 0.385010f, 0.413086f, - 0.441895f, 0.472168f, 0.767090f, 0.785645f, 0.789062f, 0.789551f, 0.790527f, 0.789551f, - 0.000340f, 0.001434f, 0.002129f, 0.002827f, 0.003696f, 0.004463f, 0.005112f, 0.005730f, - 0.006836f, 0.007465f, 0.008217f, 0.008972f, 0.009972f, 0.010887f, 0.011948f, 0.012794f, - 0.013947f, 0.015030f, 0.016266f, 0.017670f, 0.019165f, 0.020813f, 0.022415f, 0.024216f, - 0.026047f, 0.028336f, 0.030594f, 0.033142f, 0.035858f, 0.039154f, 0.042328f, 0.046265f, - 0.050537f, 0.055237f, 0.059998f, 0.065918f, 0.072083f, 0.078918f, 0.086243f, 0.094788f, - 0.104309f, 0.114807f, 0.125854f, 0.138672f, 0.152222f, 0.166992f, 0.183716f, 0.200928f, - 0.220459f, 0.240112f, 0.261719f, 0.284668f, 0.308838f, 0.333740f, 0.360840f, 0.388672f, - 0.418213f, 0.448730f, 0.756348f, 0.775391f, 0.779297f, 0.780273f, 0.781250f, 0.780273f, - 0.000511f, 0.001174f, 0.002163f, 0.002554f, 0.003391f, 0.003990f, 0.004547f, 0.005211f, - 0.005993f, 0.006653f, 0.007462f, 0.007942f, 0.008781f, 0.009476f, 0.010323f, 0.011444f, - 0.012207f, 0.013062f, 0.014336f, 0.015427f, 0.016464f, 0.017929f, 0.019287f, 0.021164f, - 0.022461f, 0.024567f, 0.026474f, 0.028885f, 0.031067f, 0.033630f, 0.036835f, 0.040070f, - 0.043488f, 0.047394f, 0.051910f, 0.056732f, 0.062378f, 0.068481f, 0.075073f, 0.082764f, - 0.090881f, 0.100403f, 0.110779f, 0.122009f, 0.134399f, 0.148560f, 0.163940f, 0.180298f, - 0.198120f, 0.218140f, 0.239014f, 0.260986f, 0.285645f, 0.310059f, 0.336182f, 0.364502f, - 0.393311f, 0.424316f, 0.744629f, 0.765137f, 0.769531f, 0.770508f, 0.771484f, 0.771484f, - 0.000374f, 0.000983f, 0.001696f, 0.002279f, 0.002924f, 0.003571f, 0.004139f, 0.004742f, - 0.005390f, 0.005817f, 0.006371f, 0.006981f, 0.007648f, 0.008354f, 0.009041f, 0.009727f, - 0.010536f, 0.011375f, 0.012398f, 0.013535f, 0.014389f, 0.015541f, 0.016602f, 0.018112f, - 0.019516f, 0.020996f, 0.022644f, 0.024582f, 0.026627f, 0.028748f, 0.031586f, 0.034210f, - 0.037415f, 0.040588f, 0.044464f, 0.048676f, 0.053192f, 0.058472f, 0.064880f, 0.070984f, - 0.078674f, 0.086914f, 0.096191f, 0.106445f, 0.117859f, 0.130859f, 0.144775f, 0.160522f, - 0.177490f, 0.196411f, 0.215942f, 0.237793f, 0.261475f, 0.285645f, 0.312012f, 0.339111f, - 0.368652f, 0.400391f, 0.733887f, 0.755371f, 0.759766f, 0.760742f, 0.761719f, 0.761719f, - 0.000298f, 0.000924f, 0.001542f, 0.002125f, 0.002439f, 0.003153f, 0.003502f, 0.004196f, - 0.004585f, 0.005039f, 0.005531f, 0.006054f, 0.006531f, 0.007217f, 0.007935f, 0.008362f, - 0.009171f, 0.009773f, 0.010704f, 0.011505f, 0.012207f, 0.013321f, 0.014381f, 0.015556f, - 0.016586f, 0.017792f, 0.019608f, 0.020844f, 0.022583f, 0.024536f, 0.026566f, 0.028885f, - 0.031494f, 0.034332f, 0.037689f, 0.041260f, 0.045258f, 0.049927f, 0.054901f, 0.060699f, - 0.067322f, 0.074768f, 0.082764f, 0.091675f, 0.102173f, 0.113831f, 0.126831f, 0.141113f, - 0.157104f, 0.175049f, 0.194580f, 0.215210f, 0.237305f, 0.261475f, 0.287598f, 0.314697f, - 0.344482f, 0.375977f, 0.721680f, 0.744629f, 0.749512f, 0.751465f, 0.751465f, 0.751465f, - 0.000275f, 0.001002f, 0.001335f, 0.001704f, 0.002264f, 0.002790f, 0.003202f, 0.003555f, - 0.004017f, 0.004368f, 0.004894f, 0.005318f, 0.005592f, 0.006241f, 0.006611f, 0.007317f, - 0.007851f, 0.008560f, 0.009071f, 0.009758f, 0.010429f, 0.011375f, 0.011986f, 0.013130f, - 0.013916f, 0.015205f, 0.016403f, 0.017624f, 0.019119f, 0.020660f, 0.022278f, 0.024582f, - 0.026474f, 0.029007f, 0.031738f, 0.034668f, 0.038025f, 0.041962f, 0.046417f, 0.051270f, - 0.056915f, 0.063110f, 0.070312f, 0.078369f, 0.087769f, 0.098145f, 0.109863f, 0.123352f, - 0.137451f, 0.154785f, 0.172363f, 0.192261f, 0.214233f, 0.237793f, 0.262939f, 0.289795f, - 0.319336f, 0.351074f, 0.708984f, 0.733398f, 0.738281f, 0.740234f, 0.741211f, 0.740723f, - 0.000334f, 0.000805f, 0.001231f, 0.001640f, 0.002033f, 0.002277f, 0.002871f, 0.003115f, - 0.003481f, 0.003895f, 0.004147f, 0.004379f, 0.004841f, 0.005306f, 0.005653f, 0.006241f, - 0.006630f, 0.007217f, 0.007721f, 0.008133f, 0.008842f, 0.009529f, 0.010010f, 0.011017f, - 0.011780f, 0.012733f, 0.013626f, 0.014824f, 0.015656f, 0.017212f, 0.018829f, 0.020248f, - 0.021973f, 0.023926f, 0.026306f, 0.028900f, 0.031616f, 0.034973f, 0.038605f, 0.042816f, - 0.047424f, 0.052765f, 0.059021f, 0.066162f, 0.074219f, 0.083435f, 0.093994f, 0.105835f, - 0.119385f, 0.134277f, 0.151611f, 0.170532f, 0.191284f, 0.214233f, 0.239014f, 0.265381f, - 0.293701f, 0.325684f, 0.696289f, 0.722168f, 0.727051f, 0.729004f, 0.729980f, 0.729980f, - 0.000215f, 0.000635f, 0.001184f, 0.001348f, 0.001758f, 0.002171f, 0.002249f, 0.002596f, - 0.003004f, 0.003325f, 0.003487f, 0.003906f, 0.004108f, 0.004494f, 0.004955f, 0.005241f, - 0.005726f, 0.006134f, 0.006485f, 0.006916f, 0.007496f, 0.008072f, 0.008629f, 0.009071f, - 0.009857f, 0.010651f, 0.011375f, 0.012283f, 0.013283f, 0.014320f, 0.015350f, 0.016739f, - 0.017975f, 0.019852f, 0.021454f, 0.023712f, 0.025925f, 0.028717f, 0.031769f, 0.035217f, - 0.038910f, 0.043396f, 0.048767f, 0.054901f, 0.061707f, 0.069824f, 0.078613f, 0.089783f, - 0.101685f, 0.115479f, 0.131104f, 0.149292f, 0.168823f, 0.190674f, 0.214844f, 0.241211f, - 0.269775f, 0.299561f, 0.683594f, 0.709961f, 0.715332f, 0.717773f, 0.718262f, 0.718750f, - 0.000199f, 0.000826f, 0.001047f, 0.001288f, 0.001600f, 0.001857f, 0.002014f, 0.002329f, - 0.002535f, 0.002785f, 0.003027f, 0.003210f, 0.003580f, 0.003788f, 0.004025f, 0.004444f, - 0.004791f, 0.004974f, 0.005417f, 0.005909f, 0.006248f, 0.006672f, 0.007118f, 0.007664f, - 0.008232f, 0.008759f, 0.009598f, 0.009964f, 0.010956f, 0.011650f, 0.012665f, 0.013702f, - 0.014832f, 0.016144f, 0.017654f, 0.019211f, 0.021118f, 0.023102f, 0.025681f, 0.028320f, - 0.031708f, 0.035370f, 0.039673f, 0.044739f, 0.050812f, 0.057800f, 0.065796f, 0.074768f, - 0.085510f, 0.097961f, 0.112000f, 0.128662f, 0.147217f, 0.168213f, 0.190796f, 0.216309f, - 0.244751f, 0.274902f, 0.669922f, 0.698730f, 0.703613f, 0.705566f, 0.707031f, 0.707031f, - 0.000212f, 0.000458f, 0.000959f, 0.001192f, 0.001321f, 0.001500f, 0.001823f, 0.002064f, - 0.002073f, 0.002293f, 0.002512f, 0.002768f, 0.002981f, 0.003138f, 0.003431f, 0.003765f, - 0.003918f, 0.004238f, 0.004482f, 0.004814f, 0.005245f, 0.005531f, 0.005871f, 0.006214f, - 0.006660f, 0.007236f, 0.007664f, 0.008331f, 0.008812f, 0.009628f, 0.010277f, 0.010979f, - 0.012016f, 0.012978f, 0.014084f, 0.015495f, 0.016937f, 0.018494f, 0.020386f, 0.022659f, - 0.025208f, 0.028183f, 0.031860f, 0.036072f, 0.040894f, 0.046326f, 0.053009f, 0.061127f, - 0.070374f, 0.081238f, 0.094238f, 0.109314f, 0.126343f, 0.145874f, 0.167847f, 0.192505f, - 0.219604f, 0.249634f, 0.656738f, 0.686035f, 0.690430f, 0.694336f, 0.694336f, 0.696777f, - 0.000151f, 0.000529f, 0.000692f, 0.000883f, 0.001153f, 0.001337f, 0.001380f, 0.001520f, - 0.001753f, 0.001886f, 0.002077f, 0.002243f, 0.002386f, 0.002556f, 0.002832f, 0.003029f, - 0.003277f, 0.003447f, 0.003683f, 0.003952f, 0.004135f, 0.004578f, 0.004833f, 0.005222f, - 0.005417f, 0.005810f, 0.006355f, 0.006718f, 0.007076f, 0.007652f, 0.008293f, 0.008980f, - 0.009674f, 0.010422f, 0.011276f, 0.012283f, 0.013443f, 0.014664f, 0.016113f, 0.017853f, - 0.019897f, 0.022156f, 0.024826f, 0.028275f, 0.032135f, 0.036865f, 0.042389f, 0.049011f, - 0.056732f, 0.066223f, 0.077576f, 0.090820f, 0.106384f, 0.124512f, 0.145264f, 0.169067f, - 0.195190f, 0.224976f, 0.642578f, 0.671387f, 0.679688f, 0.682617f, 0.682617f, 0.683594f, - 0.000127f, 0.000376f, 0.000600f, 0.000721f, 0.000901f, 0.001066f, 0.001180f, 0.001332f, - 0.001455f, 0.001549f, 0.001709f, 0.001831f, 0.001947f, 0.002150f, 0.002245f, 0.002443f, - 0.002682f, 0.002844f, 0.002989f, 0.003201f, 0.003403f, 0.003683f, 0.003883f, 0.004097f, - 0.004372f, 0.004665f, 0.004963f, 0.005348f, 0.005711f, 0.006165f, 0.006672f, 0.007004f, - 0.007610f, 0.008278f, 0.008873f, 0.009636f, 0.010475f, 0.011475f, 0.012634f, 0.014053f, - 0.015404f, 0.017242f, 0.019104f, 0.021774f, 0.024750f, 0.028458f, 0.032745f, 0.038391f, - 0.044861f, 0.052795f, 0.062103f, 0.073914f, 0.087830f, 0.104553f, 0.123718f, 0.145996f, - 0.171509f, 0.200439f, 0.627930f, 0.658691f, 0.666504f, 0.668945f, 0.671387f, 0.671387f, - 0.000013f, 0.000374f, 0.000443f, 0.000688f, 0.000819f, 0.000844f, 0.001004f, 0.001132f, - 0.001216f, 0.001259f, 0.001405f, 0.001523f, 0.001566f, 0.001753f, 0.001842f, 0.001997f, - 0.002022f, 0.002287f, 0.002377f, 0.002541f, 0.002787f, 0.002878f, 0.003096f, 0.003283f, - 0.003551f, 0.003651f, 0.003971f, 0.004272f, 0.004524f, 0.004887f, 0.005196f, 0.005527f, - 0.005939f, 0.006386f, 0.006977f, 0.007526f, 0.008148f, 0.008835f, 0.009689f, 0.010689f, - 0.011810f, 0.013000f, 0.014641f, 0.016388f, 0.018799f, 0.021469f, 0.024734f, 0.029022f, - 0.034210f, 0.040588f, 0.048401f, 0.058319f, 0.070435f, 0.085205f, 0.102905f, 0.123901f, - 0.147827f, 0.175903f, 0.612793f, 0.645508f, 0.653320f, 0.656250f, 0.657227f, 0.657227f, - 0.000113f, 0.000234f, 0.000465f, 0.000547f, 0.000646f, 0.000684f, 0.000711f, 0.000832f, - 0.000963f, 0.000999f, 0.001042f, 0.001183f, 0.001279f, 0.001402f, 0.001494f, 0.001513f, - 0.001688f, 0.001716f, 0.001919f, 0.001993f, 0.002081f, 0.002253f, 0.002441f, 0.002575f, - 0.002714f, 0.002876f, 0.003050f, 0.003214f, 0.003531f, 0.003714f, 0.003956f, 0.004276f, - 0.004604f, 0.004967f, 0.005386f, 0.005718f, 0.006283f, 0.006790f, 0.007290f, 0.008133f, - 0.008957f, 0.009987f, 0.010956f, 0.012375f, 0.013916f, 0.015991f, 0.018311f, 0.021347f, - 0.025253f, 0.030289f, 0.036560f, 0.044586f, 0.054779f, 0.067749f, 0.083252f, 0.102722f, - 0.125732f, 0.152100f, 0.597168f, 0.631836f, 0.639160f, 0.643555f, 0.643066f, 0.645508f, - 0.000207f, 0.000175f, 0.000364f, 0.000507f, 0.000496f, 0.000569f, 0.000683f, 0.000584f, - 0.000737f, 0.000764f, 0.000885f, 0.000964f, 0.000999f, 0.001076f, 0.001085f, 0.001272f, - 0.001327f, 0.001354f, 0.001491f, 0.001494f, 0.001677f, 0.001781f, 0.001862f, 0.001976f, - 0.002079f, 0.002190f, 0.002338f, 0.002481f, 0.002691f, 0.002811f, 0.003117f, 0.003214f, - 0.003422f, 0.003706f, 0.003990f, 0.004314f, 0.004608f, 0.004982f, 0.005379f, 0.006027f, - 0.006580f, 0.007351f, 0.008049f, 0.009041f, 0.010323f, 0.011551f, 0.013428f, 0.015419f, - 0.018219f, 0.021713f, 0.026550f, 0.032715f, 0.040833f, 0.051605f, 0.065552f, 0.082458f, - 0.104004f, 0.129395f, 0.582031f, 0.618652f, 0.625488f, 0.627930f, 0.630859f, 0.631348f, - 0.000189f, 0.000160f, 0.000272f, 0.000387f, 0.000335f, 0.000486f, 0.000424f, 0.000469f, - 0.000551f, 0.000589f, 0.000700f, 0.000727f, 0.000772f, 0.000859f, 0.000891f, 0.000872f, - 0.001000f, 0.001048f, 0.001076f, 0.001172f, 0.001224f, 0.001311f, 0.001376f, 0.001450f, - 0.001554f, 0.001591f, 0.001760f, 0.001838f, 0.001999f, 0.002180f, 0.002333f, 0.002388f, - 0.002584f, 0.002777f, 0.002907f, 0.003162f, 0.003368f, 0.003677f, 0.003979f, 0.004303f, - 0.004715f, 0.005188f, 0.005787f, 0.006378f, 0.007313f, 0.008194f, 0.009407f, 0.010887f, - 0.012779f, 0.015198f, 0.018494f, 0.022888f, 0.029037f, 0.037659f, 0.048920f, 0.064270f, - 0.083740f, 0.107300f, 0.565918f, 0.603516f, 0.611328f, 0.614746f, 0.617188f, 0.618164f, - 0.000000f, 0.000170f, 0.000207f, 0.000274f, 0.000292f, 0.000309f, 0.000381f, 0.000326f, - 0.000418f, 0.000439f, 0.000519f, 0.000519f, 0.000560f, 0.000574f, 0.000652f, 0.000678f, - 0.000717f, 0.000756f, 0.000782f, 0.000820f, 0.000893f, 0.000937f, 0.000991f, 0.001063f, - 0.001112f, 0.001174f, 0.001284f, 0.001302f, 0.001408f, 0.001460f, 0.001586f, 0.001711f, - 0.001826f, 0.001959f, 0.002058f, 0.002207f, 0.002388f, 0.002565f, 0.002836f, 0.003046f, - 0.003284f, 0.003567f, 0.004009f, 0.004463f, 0.005001f, 0.005661f, 0.006451f, 0.007473f, - 0.008751f, 0.010368f, 0.012611f, 0.015587f, 0.019730f, 0.025787f, 0.034729f, 0.047272f, - 0.064392f, 0.087097f, 0.550293f, 0.587891f, 0.596680f, 0.600586f, 0.602539f, 0.603516f, - 0.000000f, 0.000057f, 0.000175f, 0.000210f, 0.000221f, 0.000261f, 0.000224f, 0.000285f, - 0.000296f, 0.000329f, 0.000374f, 0.000329f, 0.000344f, 0.000416f, 0.000421f, 0.000479f, - 0.000455f, 0.000530f, 0.000552f, 0.000598f, 0.000640f, 0.000670f, 0.000695f, 0.000740f, - 0.000798f, 0.000806f, 0.000883f, 0.000908f, 0.000983f, 0.001094f, 0.001083f, 0.001169f, - 0.001242f, 0.001340f, 0.001440f, 0.001536f, 0.001601f, 0.001752f, 0.001893f, 0.002029f, - 0.002218f, 0.002424f, 0.002651f, 0.002934f, 0.003294f, 0.003681f, 0.004200f, 0.004833f, - 0.005688f, 0.006863f, 0.008202f, 0.010178f, 0.012955f, 0.016846f, 0.023163f, 0.032745f, - 0.047150f, 0.067383f, 0.534180f, 0.574219f, 0.582031f, 0.584961f, 0.586914f, 0.589844f, - 0.000000f, 0.000105f, 0.000145f, 0.000101f, 0.000161f, 0.000163f, 0.000165f, 0.000193f, - 0.000190f, 0.000202f, 0.000205f, 0.000260f, 0.000251f, 0.000281f, 0.000305f, 0.000316f, - 0.000323f, 0.000346f, 0.000364f, 0.000383f, 0.000413f, 0.000436f, 0.000461f, 0.000486f, - 0.000515f, 0.000564f, 0.000594f, 0.000616f, 0.000639f, 0.000677f, 0.000729f, 0.000748f, - 0.000842f, 0.000861f, 0.000943f, 0.000970f, 0.001054f, 0.001120f, 0.001219f, 0.001310f, - 0.001398f, 0.001534f, 0.001709f, 0.001852f, 0.002096f, 0.002291f, 0.002594f, 0.002987f, - 0.003481f, 0.004128f, 0.004997f, 0.006218f, 0.007950f, 0.010445f, 0.014313f, 0.020874f, - 0.032166f, 0.049866f, 0.517578f, 0.558105f, 0.567383f, 0.570801f, 0.573730f, 0.574707f, - 0.000000f, 0.000097f, 0.000089f, 0.000082f, 0.000092f, 0.000096f, 0.000092f, 0.000118f, - 0.000126f, 0.000130f, 0.000138f, 0.000138f, 0.000143f, 0.000163f, 0.000181f, 0.000187f, - 0.000195f, 0.000228f, 0.000221f, 0.000261f, 0.000243f, 0.000254f, 0.000274f, 0.000299f, - 0.000334f, 0.000332f, 0.000345f, 0.000362f, 0.000394f, 0.000410f, 0.000433f, 0.000463f, - 0.000497f, 0.000510f, 0.000562f, 0.000594f, 0.000636f, 0.000670f, 0.000731f, 0.000777f, - 0.000832f, 0.000927f, 0.000991f, 0.001101f, 0.001210f, 0.001350f, 0.001513f, 0.001720f, - 0.001999f, 0.002373f, 0.002815f, 0.003498f, 0.004478f, 0.006001f, 0.008347f, 0.012299f, - 0.019669f, 0.034210f, 0.501465f, 0.542969f, 0.552246f, 0.556641f, 0.559082f, 0.559570f, - 0.000107f, 0.000087f, 0.000077f, 0.000070f, 0.000065f, 0.000066f, 0.000059f, 0.000064f, - 0.000065f, 0.000071f, 0.000070f, 0.000095f, 0.000081f, 0.000085f, 0.000110f, 0.000097f, - 0.000117f, 0.000126f, 0.000127f, 0.000133f, 0.000132f, 0.000141f, 0.000169f, 0.000173f, - 0.000185f, 0.000183f, 0.000192f, 0.000215f, 0.000216f, 0.000235f, 0.000236f, 0.000265f, - 0.000278f, 0.000290f, 0.000313f, 0.000317f, 0.000347f, 0.000365f, 0.000400f, 0.000422f, - 0.000457f, 0.000494f, 0.000535f, 0.000586f, 0.000639f, 0.000700f, 0.000786f, 0.000888f, - 0.001019f, 0.001207f, 0.001435f, 0.001746f, 0.002258f, 0.003019f, 0.004299f, 0.006523f, - 0.010612f, 0.020859f, 0.484619f, 0.527344f, 0.536621f, 0.541504f, 0.542969f, 0.544922f, - 0.000092f, 0.000070f, 0.000062f, 0.000056f, 0.000051f, 0.000048f, 0.000045f, 0.000044f, - 0.000041f, 0.000039f, 0.000038f, 0.000037f, 0.000047f, 0.000039f, 0.000041f, 0.000041f, - 0.000058f, 0.000053f, 0.000062f, 0.000064f, 0.000068f, 0.000072f, 0.000076f, 0.000076f, - 0.000078f, 0.000092f, 0.000085f, 0.000101f, 0.000104f, 0.000110f, 0.000115f, 0.000118f, - 0.000127f, 0.000133f, 0.000152f, 0.000150f, 0.000163f, 0.000190f, 0.000190f, 0.000202f, - 0.000213f, 0.000225f, 0.000249f, 0.000268f, 0.000296f, 0.000321f, 0.000354f, 0.000402f, - 0.000458f, 0.000520f, 0.000618f, 0.000744f, 0.000950f, 0.001263f, 0.001822f, 0.002865f, - 0.005028f, 0.010544f, 0.468018f, 0.511230f, 0.521484f, 0.524902f, 0.529297f, 0.529785f, - 0.000067f, 0.000049f, 0.000041f, 0.000037f, 0.000034f, 0.000032f, 0.000031f, 0.000029f, - 0.000028f, 0.000027f, 0.000027f, 0.000026f, 0.000025f, 0.000023f, 0.000022f, 0.000021f, - 0.000020f, 0.000020f, 0.000023f, 0.000024f, 0.000021f, 0.000022f, 0.000025f, 0.000029f, - 0.000030f, 0.000034f, 0.000036f, 0.000034f, 0.000039f, 0.000038f, 0.000045f, 0.000045f, - 0.000048f, 0.000051f, 0.000053f, 0.000055f, 0.000063f, 0.000070f, 0.000073f, 0.000073f, - 0.000080f, 0.000084f, 0.000089f, 0.000102f, 0.000107f, 0.000115f, 0.000128f, 0.000145f, - 0.000156f, 0.000178f, 0.000213f, 0.000253f, 0.000311f, 0.000400f, 0.000572f, 0.000916f, - 0.001751f, 0.004158f, 0.450439f, 0.496338f, 0.505859f, 0.510742f, 0.513184f, 0.514648f, - 0.000016f, 0.000013f, 0.000011f, 0.000010f, 0.000012f, 0.000012f, 0.000011f, 0.000012f, - 0.000011f, 0.000012f, 0.000011f, 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000011f, - 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000010f, 0.000010f, 0.000010f, 0.000009f, - 0.000009f, 0.000009f, 0.000008f, 0.000008f, 0.000008f, 0.000009f, 0.000009f, 0.000009f, - 0.000009f, 0.000011f, 0.000012f, 0.000012f, 0.000015f, 0.000014f, 0.000014f, 0.000017f, - 0.000018f, 0.000020f, 0.000020f, 0.000022f, 0.000026f, 0.000027f, 0.000028f, 0.000027f, - 0.000033f, 0.000036f, 0.000044f, 0.000051f, 0.000057f, 0.000078f, 0.000103f, 0.000159f, - 0.000315f, 0.000997f, 0.433350f, 0.479980f, 0.490234f, 0.495605f, 0.498291f, 0.499512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000004f, 0.000004f, - 0.000007f, 0.000025f, 0.416016f, 0.464111f, 0.474854f, 0.479248f, 0.481934f, 0.484375f, - }, - { - 0.023209f, 0.069336f, 0.113037f, 0.154663f, 0.193726f, 0.231812f, 0.267578f, 0.301758f, - 0.333740f, 0.364258f, 0.393555f, 0.421631f, 0.447510f, 0.473145f, 0.497070f, 0.520020f, - 0.541992f, 0.562988f, 0.583008f, 0.602539f, 0.620605f, 0.638184f, 0.655762f, 0.671387f, - 0.687500f, 0.702637f, 0.716309f, 0.729980f, 0.744141f, 0.757812f, 0.769531f, 0.782227f, - 0.793945f, 0.804688f, 0.815918f, 0.826172f, 0.836426f, 0.846191f, 0.855957f, 0.865234f, - 0.874023f, 0.882812f, 0.891113f, 0.898926f, 0.907227f, 0.915039f, 0.922852f, 0.929688f, - 0.937012f, 0.943848f, 0.950684f, 0.956543f, 0.963379f, 0.969238f, 0.976074f, 0.981445f, - 0.986816f, 0.992676f, 0.991211f, 0.978516f, 0.968750f, 0.960449f, 0.952637f, 0.945312f, - 0.019730f, 0.059631f, 0.098206f, 0.135864f, 0.172119f, 0.206421f, 0.239624f, 0.272461f, - 0.304932f, 0.333984f, 0.362549f, 0.389648f, 0.416016f, 0.441406f, 0.466309f, 0.489502f, - 0.511230f, 0.533203f, 0.554199f, 0.573242f, 0.593262f, 0.611816f, 0.629395f, 0.645508f, - 0.662598f, 0.678711f, 0.693359f, 0.708496f, 0.722168f, 0.735840f, 0.750000f, 0.762207f, - 0.773926f, 0.786133f, 0.796875f, 0.808594f, 0.818848f, 0.829590f, 0.839355f, 0.850098f, - 0.859863f, 0.868652f, 0.877441f, 0.886230f, 0.895020f, 0.903809f, 0.911133f, 0.918457f, - 0.925781f, 0.933105f, 0.940430f, 0.946777f, 0.954590f, 0.960938f, 0.966797f, 0.973145f, - 0.979004f, 0.984863f, 0.987793f, 0.976074f, 0.966797f, 0.958496f, 0.951172f, 0.943848f, - 0.017151f, 0.051636f, 0.085510f, 0.119202f, 0.152466f, 0.184814f, 0.216187f, 0.246582f, - 0.276855f, 0.305664f, 0.332764f, 0.360107f, 0.385986f, 0.411621f, 0.435791f, 0.459473f, - 0.481445f, 0.502441f, 0.524414f, 0.546387f, 0.565430f, 0.583496f, 0.602051f, 0.619629f, - 0.636719f, 0.653320f, 0.669434f, 0.684082f, 0.699707f, 0.713867f, 0.728027f, 0.741211f, - 0.754883f, 0.767090f, 0.779297f, 0.791016f, 0.802734f, 0.813965f, 0.824219f, 0.833984f, - 0.843750f, 0.854492f, 0.863281f, 0.873535f, 0.882324f, 0.890137f, 0.898926f, 0.906738f, - 0.915039f, 0.922852f, 0.930176f, 0.937012f, 0.944336f, 0.951172f, 0.958008f, 0.964844f, - 0.970703f, 0.977051f, 0.983887f, 0.972656f, 0.964355f, 0.956543f, 0.949219f, 0.942383f, - 0.014885f, 0.044678f, 0.075195f, 0.104919f, 0.135254f, 0.165649f, 0.194702f, 0.223633f, - 0.251221f, 0.279053f, 0.305420f, 0.331543f, 0.357422f, 0.382568f, 0.406982f, 0.430420f, - 0.453369f, 0.475586f, 0.496582f, 0.517090f, 0.536133f, 0.556641f, 0.575684f, 0.592773f, - 0.611328f, 0.628418f, 0.643555f, 0.661621f, 0.676270f, 0.691406f, 0.705566f, 0.720215f, - 0.733887f, 0.746582f, 0.759766f, 0.772949f, 0.784668f, 0.795898f, 0.807129f, 0.818359f, - 0.828125f, 0.838867f, 0.848633f, 0.858887f, 0.867676f, 0.877441f, 0.886230f, 0.894531f, - 0.903320f, 0.911621f, 0.919434f, 0.927734f, 0.934570f, 0.940918f, 0.948730f, 0.956543f, - 0.962402f, 0.969238f, 0.979980f, 0.970215f, 0.961914f, 0.954102f, 0.947266f, 0.940918f, - 0.013046f, 0.038940f, 0.066162f, 0.093323f, 0.120544f, 0.147583f, 0.174683f, 0.201538f, - 0.228516f, 0.254639f, 0.280518f, 0.304932f, 0.330566f, 0.354492f, 0.379395f, 0.402100f, - 0.424561f, 0.446533f, 0.467529f, 0.488525f, 0.509277f, 0.529297f, 0.547852f, 0.566895f, - 0.585449f, 0.602539f, 0.620605f, 0.636230f, 0.653809f, 0.667480f, 0.684570f, 0.698242f, - 0.712891f, 0.726562f, 0.739746f, 0.753418f, 0.765625f, 0.777344f, 0.789551f, 0.801270f, - 0.812500f, 0.823730f, 0.833984f, 0.844238f, 0.854004f, 0.863770f, 0.874023f, 0.882324f, - 0.891113f, 0.899902f, 0.908203f, 0.916504f, 0.924805f, 0.932129f, 0.939453f, 0.947266f, - 0.954102f, 0.960938f, 0.976562f, 0.967285f, 0.958984f, 0.951660f, 0.944824f, 0.938965f, - 0.011696f, 0.034698f, 0.058807f, 0.083130f, 0.107727f, 0.132324f, 0.156982f, 0.182251f, - 0.207153f, 0.232178f, 0.256836f, 0.280762f, 0.304688f, 0.328369f, 0.352295f, 0.375244f, - 0.397461f, 0.419434f, 0.440430f, 0.461914f, 0.482178f, 0.501953f, 0.522461f, 0.540527f, - 0.559570f, 0.577148f, 0.595703f, 0.613281f, 0.628418f, 0.644531f, 0.661621f, 0.676270f, - 0.691406f, 0.705078f, 0.719727f, 0.733887f, 0.746094f, 0.759766f, 0.771973f, 0.784180f, - 0.795898f, 0.807617f, 0.818359f, 0.829102f, 0.839844f, 0.850098f, 0.859375f, 0.869629f, - 0.878906f, 0.887695f, 0.896484f, 0.905273f, 0.914062f, 0.921875f, 0.929688f, 0.937988f, - 0.944824f, 0.952637f, 0.973145f, 0.963379f, 0.956055f, 0.949219f, 0.942871f, 0.937012f, - 0.010094f, 0.030975f, 0.052063f, 0.073975f, 0.096069f, 0.118713f, 0.141479f, 0.164551f, - 0.187866f, 0.211182f, 0.234985f, 0.258057f, 0.280518f, 0.303467f, 0.326172f, 0.348145f, - 0.370117f, 0.392822f, 0.413574f, 0.434814f, 0.455322f, 0.476074f, 0.495361f, 0.515137f, - 0.533203f, 0.551758f, 0.569824f, 0.586426f, 0.604492f, 0.621582f, 0.637695f, 0.654297f, - 0.668945f, 0.683594f, 0.699219f, 0.712402f, 0.728516f, 0.741699f, 0.753906f, 0.767090f, - 0.778320f, 0.790527f, 0.802246f, 0.813965f, 0.824219f, 0.835449f, 0.846680f, 0.855957f, - 0.865723f, 0.875488f, 0.884766f, 0.894043f, 0.902832f, 0.911133f, 0.919434f, 0.927734f, - 0.935547f, 0.943359f, 0.968750f, 0.960449f, 0.953125f, 0.946289f, 0.940430f, 0.934570f, - 0.008797f, 0.027466f, 0.045959f, 0.066223f, 0.086304f, 0.106506f, 0.127441f, 0.149170f, - 0.170532f, 0.192261f, 0.213867f, 0.236206f, 0.258057f, 0.280273f, 0.301758f, 0.323486f, - 0.344727f, 0.367188f, 0.388184f, 0.408447f, 0.429443f, 0.450439f, 0.469727f, 0.489014f, - 0.508301f, 0.526855f, 0.545410f, 0.562500f, 0.581055f, 0.597656f, 0.613770f, 0.630859f, - 0.647461f, 0.663574f, 0.677734f, 0.693359f, 0.707031f, 0.720703f, 0.735352f, 0.748047f, - 0.760254f, 0.772461f, 0.785156f, 0.797363f, 0.810059f, 0.819824f, 0.831543f, 0.842285f, - 0.852051f, 0.862793f, 0.873047f, 0.882324f, 0.891113f, 0.899902f, 0.909180f, 0.917969f, - 0.925781f, 0.934082f, 0.964355f, 0.957031f, 0.949707f, 0.943359f, 0.937988f, 0.932129f, - 0.007927f, 0.024414f, 0.041077f, 0.059204f, 0.077148f, 0.095581f, 0.115479f, 0.134644f, - 0.154785f, 0.175293f, 0.196045f, 0.216553f, 0.236694f, 0.258057f, 0.278809f, 0.300049f, - 0.321289f, 0.342529f, 0.363281f, 0.383545f, 0.403564f, 0.424072f, 0.444092f, 0.463135f, - 0.483154f, 0.501953f, 0.519531f, 0.539062f, 0.555664f, 0.574707f, 0.591309f, 0.608398f, - 0.624512f, 0.640137f, 0.655762f, 0.671875f, 0.686523f, 0.701172f, 0.715820f, 0.729004f, - 0.742676f, 0.755859f, 0.769043f, 0.781738f, 0.792969f, 0.805176f, 0.816895f, 0.827637f, - 0.838867f, 0.849121f, 0.859375f, 0.870117f, 0.879395f, 0.889160f, 0.898926f, 0.906738f, - 0.916504f, 0.924805f, 0.960938f, 0.953125f, 0.947266f, 0.940430f, 0.935547f, 0.929688f, - 0.007080f, 0.022247f, 0.037445f, 0.053070f, 0.069336f, 0.086975f, 0.103577f, 0.121948f, - 0.140503f, 0.158936f, 0.178833f, 0.198242f, 0.217651f, 0.237793f, 0.257812f, 0.278076f, - 0.297607f, 0.318604f, 0.338623f, 0.358643f, 0.378662f, 0.399170f, 0.418213f, 0.438721f, - 0.457520f, 0.477051f, 0.495361f, 0.513672f, 0.531250f, 0.549316f, 0.567383f, 0.583984f, - 0.601562f, 0.617676f, 0.634277f, 0.650391f, 0.666016f, 0.680176f, 0.695801f, 0.710449f, - 0.723633f, 0.737305f, 0.750977f, 0.764648f, 0.776367f, 0.789551f, 0.802246f, 0.813477f, - 0.824219f, 0.835938f, 0.846680f, 0.857422f, 0.867188f, 0.876953f, 0.887207f, 0.895996f, - 0.905762f, 0.915527f, 0.955566f, 0.949707f, 0.943359f, 0.937988f, 0.932129f, 0.927246f, - 0.006363f, 0.019516f, 0.033691f, 0.047577f, 0.062469f, 0.078186f, 0.093933f, 0.110657f, - 0.127563f, 0.144653f, 0.162598f, 0.181152f, 0.199707f, 0.218384f, 0.237427f, 0.257324f, - 0.276367f, 0.295166f, 0.315674f, 0.335205f, 0.355225f, 0.374756f, 0.393799f, 0.413574f, - 0.432617f, 0.451904f, 0.470459f, 0.489258f, 0.508301f, 0.525879f, 0.543945f, 0.560059f, - 0.578613f, 0.595703f, 0.612793f, 0.628418f, 0.644531f, 0.659668f, 0.675293f, 0.689941f, - 0.704590f, 0.719238f, 0.732910f, 0.747070f, 0.759766f, 0.773438f, 0.785156f, 0.797852f, - 0.809570f, 0.821289f, 0.833008f, 0.843750f, 0.854980f, 0.865723f, 0.875977f, 0.886230f, - 0.895508f, 0.904785f, 0.951660f, 0.945801f, 0.939941f, 0.934570f, 0.929199f, 0.924805f, - 0.005985f, 0.017776f, 0.030212f, 0.043030f, 0.056488f, 0.070190f, 0.085205f, 0.100342f, - 0.115723f, 0.132446f, 0.148438f, 0.165771f, 0.183228f, 0.200684f, 0.218994f, 0.237183f, - 0.255859f, 0.274170f, 0.292725f, 0.313477f, 0.331299f, 0.351318f, 0.369873f, 0.389160f, - 0.408936f, 0.426758f, 0.446533f, 0.464844f, 0.483154f, 0.501465f, 0.519531f, 0.537598f, - 0.555664f, 0.572754f, 0.589844f, 0.605957f, 0.622070f, 0.639648f, 0.654297f, 0.670898f, - 0.685059f, 0.700195f, 0.714844f, 0.728516f, 0.742188f, 0.754883f, 0.769043f, 0.781738f, - 0.795410f, 0.808105f, 0.818359f, 0.830566f, 0.841797f, 0.853027f, 0.863770f, 0.874023f, - 0.884766f, 0.893555f, 0.947266f, 0.942383f, 0.936523f, 0.930664f, 0.926270f, 0.921387f, - 0.005173f, 0.016083f, 0.027359f, 0.038849f, 0.051056f, 0.063843f, 0.077026f, 0.091064f, - 0.105591f, 0.120422f, 0.135498f, 0.150879f, 0.167480f, 0.184326f, 0.201172f, 0.218384f, - 0.236084f, 0.254395f, 0.272949f, 0.291260f, 0.309570f, 0.328125f, 0.346680f, 0.365967f, - 0.384766f, 0.403320f, 0.422119f, 0.440918f, 0.458984f, 0.477783f, 0.496094f, 0.513672f, - 0.531738f, 0.548828f, 0.566406f, 0.583984f, 0.600098f, 0.617188f, 0.632812f, 0.649902f, - 0.665527f, 0.681152f, 0.694824f, 0.709473f, 0.724121f, 0.738770f, 0.752441f, 0.765137f, - 0.778809f, 0.791992f, 0.803711f, 0.815918f, 0.828125f, 0.839844f, 0.851562f, 0.862793f, - 0.873535f, 0.883789f, 0.941895f, 0.938477f, 0.933105f, 0.927246f, 0.922363f, 0.918457f, - 0.004791f, 0.014610f, 0.024475f, 0.035126f, 0.046478f, 0.057922f, 0.069885f, 0.083008f, - 0.096069f, 0.109253f, 0.123840f, 0.137939f, 0.153076f, 0.168701f, 0.185059f, 0.200928f, - 0.218262f, 0.234985f, 0.252686f, 0.270264f, 0.288086f, 0.306396f, 0.324951f, 0.343018f, - 0.362305f, 0.379883f, 0.398926f, 0.417236f, 0.435547f, 0.454346f, 0.472656f, 0.491211f, - 0.508301f, 0.526855f, 0.543457f, 0.561523f, 0.578125f, 0.595215f, 0.612305f, 0.628418f, - 0.644043f, 0.660645f, 0.675781f, 0.691406f, 0.706055f, 0.720215f, 0.735840f, 0.749023f, - 0.762695f, 0.776855f, 0.789551f, 0.800781f, 0.814941f, 0.826172f, 0.838867f, 0.851074f, - 0.862305f, 0.872070f, 0.937500f, 0.933594f, 0.929199f, 0.923828f, 0.919434f, 0.915527f, - 0.004387f, 0.013268f, 0.022385f, 0.031860f, 0.041962f, 0.052612f, 0.063171f, 0.075073f, - 0.086792f, 0.099854f, 0.113037f, 0.125977f, 0.140381f, 0.154663f, 0.169678f, 0.184814f, - 0.200562f, 0.217773f, 0.234131f, 0.250732f, 0.268066f, 0.284912f, 0.303223f, 0.321289f, - 0.339355f, 0.357666f, 0.375488f, 0.394043f, 0.411865f, 0.430664f, 0.448730f, 0.467041f, - 0.485352f, 0.503418f, 0.520508f, 0.539062f, 0.556152f, 0.573242f, 0.590820f, 0.606934f, - 0.624512f, 0.640625f, 0.655762f, 0.672363f, 0.687500f, 0.702148f, 0.718750f, 0.731934f, - 0.746582f, 0.759766f, 0.772949f, 0.787109f, 0.800781f, 0.813477f, 0.825195f, 0.838379f, - 0.850098f, 0.861816f, 0.932617f, 0.929688f, 0.925293f, 0.919922f, 0.915527f, 0.912109f, - 0.003941f, 0.011986f, 0.020630f, 0.029144f, 0.038544f, 0.048035f, 0.058075f, 0.068542f, - 0.079590f, 0.090942f, 0.102661f, 0.115295f, 0.128296f, 0.141602f, 0.155518f, 0.170654f, - 0.185425f, 0.200684f, 0.216309f, 0.231812f, 0.249146f, 0.265137f, 0.282471f, 0.299072f, - 0.317139f, 0.334717f, 0.352783f, 0.371338f, 0.388916f, 0.406982f, 0.425537f, 0.443848f, - 0.461914f, 0.479980f, 0.498291f, 0.515625f, 0.533203f, 0.550293f, 0.568359f, 0.585449f, - 0.603027f, 0.618652f, 0.635742f, 0.652344f, 0.668457f, 0.684082f, 0.699219f, 0.713867f, - 0.729004f, 0.743652f, 0.757812f, 0.771484f, 0.785645f, 0.798828f, 0.812012f, 0.824219f, - 0.836914f, 0.850098f, 0.927246f, 0.925293f, 0.920410f, 0.916504f, 0.912598f, 0.908203f, - 0.003790f, 0.011009f, 0.018829f, 0.026779f, 0.035339f, 0.043762f, 0.053223f, 0.062408f, - 0.072693f, 0.082947f, 0.093689f, 0.105469f, 0.117554f, 0.130005f, 0.142822f, 0.156494f, - 0.170166f, 0.184448f, 0.198975f, 0.213745f, 0.230469f, 0.246460f, 0.262939f, 0.279541f, - 0.296143f, 0.313721f, 0.331299f, 0.348633f, 0.367188f, 0.384521f, 0.402344f, 0.420410f, - 0.438965f, 0.457275f, 0.475830f, 0.493164f, 0.510742f, 0.528809f, 0.546387f, 0.564453f, - 0.581055f, 0.598145f, 0.615234f, 0.631836f, 0.647461f, 0.665527f, 0.680664f, 0.696289f, - 0.711914f, 0.728027f, 0.741211f, 0.756836f, 0.770508f, 0.783691f, 0.798340f, 0.811523f, - 0.824219f, 0.837402f, 0.921387f, 0.920410f, 0.916504f, 0.913086f, 0.908691f, 0.904785f, - 0.003479f, 0.009949f, 0.016937f, 0.024445f, 0.031708f, 0.039948f, 0.048218f, 0.056793f, - 0.066223f, 0.075928f, 0.085632f, 0.096313f, 0.107178f, 0.118958f, 0.130493f, 0.143311f, - 0.156494f, 0.170044f, 0.183960f, 0.197876f, 0.213501f, 0.228027f, 0.244019f, 0.260010f, - 0.276611f, 0.293213f, 0.309814f, 0.327393f, 0.344482f, 0.363037f, 0.379883f, 0.398438f, - 0.416504f, 0.434082f, 0.451904f, 0.470215f, 0.488525f, 0.505859f, 0.523926f, 0.541504f, - 0.559570f, 0.577637f, 0.594238f, 0.611328f, 0.628418f, 0.645020f, 0.661133f, 0.677246f, - 0.693848f, 0.709961f, 0.725586f, 0.739746f, 0.755371f, 0.769531f, 0.783203f, 0.797852f, - 0.810547f, 0.824707f, 0.916016f, 0.915527f, 0.912109f, 0.908691f, 0.904785f, 0.900879f, - 0.003014f, 0.008842f, 0.015640f, 0.022018f, 0.028885f, 0.036163f, 0.044250f, 0.051819f, - 0.059967f, 0.069031f, 0.078247f, 0.088135f, 0.098267f, 0.108337f, 0.119751f, 0.131470f, - 0.143433f, 0.156006f, 0.169189f, 0.183105f, 0.196655f, 0.211304f, 0.226196f, 0.241211f, - 0.257080f, 0.273438f, 0.289307f, 0.306396f, 0.323975f, 0.340576f, 0.358398f, 0.375732f, - 0.393799f, 0.411133f, 0.429688f, 0.447998f, 0.466064f, 0.483887f, 0.501465f, 0.519531f, - 0.537598f, 0.555664f, 0.573242f, 0.590820f, 0.607910f, 0.625000f, 0.642578f, 0.658203f, - 0.675293f, 0.691406f, 0.707520f, 0.724121f, 0.738770f, 0.753418f, 0.769531f, 0.783203f, - 0.797363f, 0.811523f, 0.910156f, 0.910645f, 0.907715f, 0.904785f, 0.900879f, 0.896973f, - 0.002861f, 0.008591f, 0.014000f, 0.020203f, 0.026962f, 0.033203f, 0.040161f, 0.047485f, - 0.055237f, 0.062988f, 0.071594f, 0.080750f, 0.089905f, 0.099854f, 0.109741f, 0.120056f, - 0.131592f, 0.143311f, 0.155640f, 0.167969f, 0.181763f, 0.195190f, 0.209229f, 0.223877f, - 0.238647f, 0.254150f, 0.269531f, 0.285889f, 0.302979f, 0.319824f, 0.336426f, 0.354004f, - 0.372070f, 0.389893f, 0.406982f, 0.424805f, 0.443359f, 0.461182f, 0.479492f, 0.498047f, - 0.515625f, 0.533691f, 0.551270f, 0.569336f, 0.587402f, 0.604492f, 0.622070f, 0.639160f, - 0.656738f, 0.673828f, 0.689941f, 0.705566f, 0.722168f, 0.737793f, 0.753418f, 0.768066f, - 0.783203f, 0.798340f, 0.904297f, 0.905762f, 0.902832f, 0.899414f, 0.895996f, 0.893066f, - 0.002535f, 0.007812f, 0.013252f, 0.018738f, 0.024384f, 0.030548f, 0.036774f, 0.043427f, - 0.050476f, 0.057556f, 0.065491f, 0.073425f, 0.082458f, 0.091370f, 0.100525f, 0.110413f, - 0.120605f, 0.131592f, 0.142822f, 0.154663f, 0.166870f, 0.180176f, 0.193237f, 0.207031f, - 0.221191f, 0.236084f, 0.250732f, 0.266602f, 0.282959f, 0.299072f, 0.315430f, 0.332520f, - 0.350342f, 0.367676f, 0.385010f, 0.403076f, 0.421631f, 0.439209f, 0.457520f, 0.475342f, - 0.494141f, 0.512695f, 0.530273f, 0.547852f, 0.565918f, 0.584473f, 0.602051f, 0.619629f, - 0.637207f, 0.655273f, 0.671387f, 0.688965f, 0.706055f, 0.721191f, 0.737305f, 0.752930f, - 0.769531f, 0.784668f, 0.898438f, 0.900879f, 0.897949f, 0.894531f, 0.891602f, 0.888672f, - 0.002411f, 0.007103f, 0.012161f, 0.017105f, 0.022385f, 0.027985f, 0.033203f, 0.039581f, - 0.045532f, 0.052521f, 0.059814f, 0.067261f, 0.074768f, 0.083313f, 0.092041f, 0.101013f, - 0.110291f, 0.120361f, 0.130615f, 0.141724f, 0.153076f, 0.165283f, 0.177612f, 0.190918f, - 0.204346f, 0.218506f, 0.233154f, 0.247559f, 0.263428f, 0.279053f, 0.295166f, 0.312256f, - 0.328857f, 0.345947f, 0.363281f, 0.381348f, 0.398926f, 0.417236f, 0.435547f, 0.453369f, - 0.471191f, 0.489502f, 0.508301f, 0.525879f, 0.545410f, 0.563477f, 0.581055f, 0.600098f, - 0.617676f, 0.635254f, 0.653809f, 0.670410f, 0.687500f, 0.705078f, 0.720703f, 0.736816f, - 0.753418f, 0.769531f, 0.892090f, 0.895020f, 0.892578f, 0.889648f, 0.887207f, 0.884277f, - 0.002344f, 0.006565f, 0.011322f, 0.015686f, 0.020630f, 0.025574f, 0.030807f, 0.035980f, - 0.042084f, 0.048279f, 0.054352f, 0.061432f, 0.068848f, 0.076172f, 0.083618f, 0.092590f, - 0.101135f, 0.109619f, 0.120178f, 0.130249f, 0.140991f, 0.151978f, 0.163696f, 0.175781f, - 0.188721f, 0.202026f, 0.215820f, 0.230103f, 0.244873f, 0.259766f, 0.275635f, 0.291504f, - 0.307617f, 0.324219f, 0.342041f, 0.358887f, 0.376709f, 0.394775f, 0.412354f, 0.431152f, - 0.448975f, 0.468018f, 0.486328f, 0.504883f, 0.523438f, 0.541992f, 0.560547f, 0.579102f, - 0.597656f, 0.615234f, 0.633789f, 0.651855f, 0.669434f, 0.687500f, 0.704590f, 0.721680f, - 0.738770f, 0.755859f, 0.886719f, 0.889648f, 0.887695f, 0.884766f, 0.882812f, 0.879883f, - 0.002003f, 0.006268f, 0.009987f, 0.014198f, 0.018875f, 0.023605f, 0.028259f, 0.033203f, - 0.038513f, 0.044495f, 0.049866f, 0.056152f, 0.062500f, 0.069458f, 0.076660f, 0.084473f, - 0.092163f, 0.100586f, 0.109741f, 0.119324f, 0.128662f, 0.139526f, 0.150146f, 0.161499f, - 0.173706f, 0.185791f, 0.199341f, 0.212891f, 0.227051f, 0.241455f, 0.256592f, 0.271729f, - 0.288330f, 0.304199f, 0.321045f, 0.337891f, 0.355469f, 0.373291f, 0.391113f, 0.408936f, - 0.426758f, 0.446289f, 0.464600f, 0.483643f, 0.500977f, 0.520996f, 0.539551f, 0.558594f, - 0.577148f, 0.595703f, 0.614746f, 0.632324f, 0.650879f, 0.669434f, 0.687012f, 0.704590f, - 0.722656f, 0.740234f, 0.880371f, 0.883301f, 0.881836f, 0.879883f, 0.877441f, 0.875000f, - 0.001739f, 0.005779f, 0.009598f, 0.013245f, 0.017334f, 0.021637f, 0.025955f, 0.030121f, - 0.035217f, 0.040131f, 0.045990f, 0.051453f, 0.056915f, 0.063354f, 0.070007f, 0.076965f, - 0.084351f, 0.091980f, 0.100281f, 0.108826f, 0.117981f, 0.127441f, 0.137939f, 0.148315f, - 0.160034f, 0.171753f, 0.183594f, 0.196167f, 0.209961f, 0.223511f, 0.238037f, 0.252930f, - 0.268066f, 0.284180f, 0.300537f, 0.317139f, 0.333740f, 0.351074f, 0.368896f, 0.386719f, - 0.405273f, 0.423584f, 0.442871f, 0.460938f, 0.479736f, 0.499512f, 0.517578f, 0.537109f, - 0.555664f, 0.575195f, 0.594238f, 0.613770f, 0.632324f, 0.650879f, 0.669922f, 0.687988f, - 0.706055f, 0.724121f, 0.873047f, 0.876953f, 0.875488f, 0.874023f, 0.872559f, 0.869141f, - 0.001648f, 0.005039f, 0.008675f, 0.012161f, 0.015823f, 0.019760f, 0.023865f, 0.028015f, - 0.032318f, 0.036865f, 0.041504f, 0.046906f, 0.051758f, 0.057922f, 0.064087f, 0.070435f, - 0.077209f, 0.084290f, 0.091736f, 0.099243f, 0.108215f, 0.117004f, 0.126343f, 0.135620f, - 0.146484f, 0.157349f, 0.168823f, 0.180908f, 0.193848f, 0.206909f, 0.220459f, 0.234619f, - 0.249634f, 0.264404f, 0.280273f, 0.296631f, 0.313232f, 0.329834f, 0.347412f, 0.365479f, - 0.383545f, 0.401855f, 0.420166f, 0.438721f, 0.458252f, 0.477783f, 0.496826f, 0.516602f, - 0.535156f, 0.554199f, 0.574219f, 0.593750f, 0.612305f, 0.631836f, 0.651367f, 0.670410f, - 0.689453f, 0.708984f, 0.865234f, 0.872070f, 0.870605f, 0.868652f, 0.866699f, 0.863770f, - 0.001492f, 0.004704f, 0.007973f, 0.011124f, 0.014603f, 0.017792f, 0.021652f, 0.025314f, - 0.029526f, 0.033722f, 0.038147f, 0.042694f, 0.047668f, 0.052673f, 0.057983f, 0.064209f, - 0.070068f, 0.076233f, 0.083313f, 0.090942f, 0.098572f, 0.106750f, 0.115295f, 0.124512f, - 0.134277f, 0.144287f, 0.154663f, 0.166504f, 0.178345f, 0.190063f, 0.203247f, 0.217041f, - 0.231079f, 0.245850f, 0.260986f, 0.276611f, 0.293213f, 0.309570f, 0.326172f, 0.343994f, - 0.361816f, 0.379395f, 0.397949f, 0.417480f, 0.436523f, 0.455322f, 0.474854f, 0.493896f, - 0.514160f, 0.533691f, 0.553711f, 0.573730f, 0.593262f, 0.612793f, 0.632812f, 0.651855f, - 0.672363f, 0.690918f, 0.857910f, 0.865723f, 0.864746f, 0.863281f, 0.860352f, 0.858887f, - 0.001657f, 0.004684f, 0.007290f, 0.010201f, 0.013657f, 0.016541f, 0.019989f, 0.023636f, - 0.026932f, 0.030548f, 0.034576f, 0.039154f, 0.043793f, 0.048126f, 0.053162f, 0.058319f, - 0.063721f, 0.069885f, 0.076355f, 0.082947f, 0.089844f, 0.097046f, 0.105286f, 0.113281f, - 0.122559f, 0.131348f, 0.141357f, 0.152100f, 0.163330f, 0.175415f, 0.187256f, 0.199951f, - 0.213501f, 0.227051f, 0.241943f, 0.257324f, 0.273193f, 0.288818f, 0.305420f, 0.322754f, - 0.340576f, 0.358643f, 0.375732f, 0.394775f, 0.414307f, 0.433105f, 0.453613f, 0.472168f, - 0.492188f, 0.512695f, 0.532715f, 0.552246f, 0.573242f, 0.593262f, 0.613770f, 0.632812f, - 0.654785f, 0.673828f, 0.851074f, 0.859375f, 0.858398f, 0.856934f, 0.855469f, 0.853027f, - 0.001457f, 0.003944f, 0.006870f, 0.009392f, 0.012543f, 0.015190f, 0.018417f, 0.021576f, - 0.024811f, 0.028122f, 0.031708f, 0.035278f, 0.039398f, 0.043793f, 0.048218f, 0.052887f, - 0.058044f, 0.063477f, 0.069397f, 0.075256f, 0.081360f, 0.088318f, 0.095398f, 0.103210f, - 0.111084f, 0.120361f, 0.129150f, 0.139038f, 0.149292f, 0.160645f, 0.172241f, 0.183716f, - 0.196533f, 0.209595f, 0.224121f, 0.238647f, 0.253174f, 0.268799f, 0.286133f, 0.302490f, - 0.319092f, 0.337158f, 0.355225f, 0.373535f, 0.392090f, 0.411133f, 0.430908f, 0.450928f, - 0.470947f, 0.490967f, 0.511719f, 0.531250f, 0.551758f, 0.573730f, 0.594238f, 0.614746f, - 0.636230f, 0.656738f, 0.842773f, 0.852051f, 0.851562f, 0.851074f, 0.848633f, 0.846680f, - 0.001404f, 0.003891f, 0.006233f, 0.008751f, 0.011353f, 0.014175f, 0.017075f, 0.019592f, - 0.022842f, 0.025772f, 0.028839f, 0.032410f, 0.036011f, 0.039764f, 0.043671f, 0.048126f, - 0.052704f, 0.057373f, 0.062561f, 0.067688f, 0.074158f, 0.080200f, 0.086853f, 0.093445f, - 0.101379f, 0.109192f, 0.117432f, 0.126709f, 0.136353f, 0.146484f, 0.157227f, 0.168823f, - 0.180542f, 0.193115f, 0.206299f, 0.219727f, 0.234375f, 0.249756f, 0.265869f, 0.281738f, - 0.298096f, 0.315674f, 0.333252f, 0.352051f, 0.370850f, 0.389160f, 0.409180f, 0.428955f, - 0.448730f, 0.469971f, 0.489502f, 0.510742f, 0.531738f, 0.552246f, 0.574707f, 0.595215f, - 0.617676f, 0.639160f, 0.835449f, 0.845215f, 0.845215f, 0.844238f, 0.843262f, 0.840332f, - 0.001275f, 0.003536f, 0.005600f, 0.007881f, 0.010628f, 0.012878f, 0.015610f, 0.018097f, - 0.020996f, 0.023376f, 0.026443f, 0.029556f, 0.032867f, 0.036163f, 0.039581f, 0.043915f, - 0.047943f, 0.052216f, 0.056763f, 0.061981f, 0.067322f, 0.072449f, 0.078796f, 0.084717f, - 0.091919f, 0.098999f, 0.106995f, 0.115417f, 0.124084f, 0.133667f, 0.143433f, 0.154297f, - 0.165161f, 0.177124f, 0.189697f, 0.202759f, 0.216309f, 0.230713f, 0.245728f, 0.261719f, - 0.278320f, 0.295410f, 0.312256f, 0.330566f, 0.349365f, 0.367676f, 0.386719f, 0.406494f, - 0.427246f, 0.447266f, 0.468506f, 0.489746f, 0.510742f, 0.532227f, 0.553711f, 0.575684f, - 0.597656f, 0.619141f, 0.826172f, 0.837402f, 0.837891f, 0.837402f, 0.835449f, 0.833984f, - 0.001134f, 0.003105f, 0.005337f, 0.007462f, 0.009628f, 0.011833f, 0.014137f, 0.016113f, - 0.018875f, 0.021484f, 0.024063f, 0.026581f, 0.029709f, 0.032623f, 0.036194f, 0.039703f, - 0.043335f, 0.047058f, 0.051422f, 0.055908f, 0.060608f, 0.065491f, 0.071167f, 0.076843f, - 0.083313f, 0.089661f, 0.097168f, 0.104492f, 0.112122f, 0.121155f, 0.130615f, 0.140137f, - 0.150757f, 0.161499f, 0.173462f, 0.185547f, 0.199341f, 0.212524f, 0.227051f, 0.242310f, - 0.258057f, 0.274414f, 0.291016f, 0.309082f, 0.327148f, 0.345459f, 0.364990f, 0.384521f, - 0.404297f, 0.425781f, 0.445801f, 0.467285f, 0.489258f, 0.510254f, 0.533203f, 0.555664f, - 0.578125f, 0.601074f, 0.817871f, 0.830078f, 0.831055f, 0.830078f, 0.829102f, 0.828125f, - 0.001101f, 0.003019f, 0.004818f, 0.006725f, 0.008781f, 0.010864f, 0.013069f, 0.014801f, - 0.017151f, 0.019531f, 0.021973f, 0.024429f, 0.026917f, 0.030121f, 0.033112f, 0.036041f, - 0.039337f, 0.042542f, 0.046509f, 0.050537f, 0.054596f, 0.058990f, 0.064209f, 0.069519f, - 0.075134f, 0.080994f, 0.087158f, 0.094177f, 0.102051f, 0.109741f, 0.117981f, 0.127319f, - 0.136963f, 0.147095f, 0.158081f, 0.169434f, 0.182251f, 0.195557f, 0.208984f, 0.223267f, - 0.238281f, 0.254639f, 0.270996f, 0.288330f, 0.305908f, 0.324219f, 0.343018f, 0.362549f, - 0.382324f, 0.402832f, 0.424805f, 0.445312f, 0.467529f, 0.489258f, 0.511230f, 0.535645f, - 0.558594f, 0.582031f, 0.809082f, 0.822266f, 0.824219f, 0.823242f, 0.821777f, 0.820801f, - 0.000987f, 0.002644f, 0.004562f, 0.006344f, 0.008133f, 0.009918f, 0.011696f, 0.013527f, - 0.015572f, 0.017746f, 0.019714f, 0.021942f, 0.024155f, 0.027069f, 0.029678f, 0.032288f, - 0.035156f, 0.038574f, 0.041779f, 0.045319f, 0.049225f, 0.053284f, 0.057678f, 0.062225f, - 0.067505f, 0.072571f, 0.078613f, 0.084961f, 0.092041f, 0.098938f, 0.106506f, 0.115112f, - 0.123779f, 0.133667f, 0.143311f, 0.154541f, 0.165894f, 0.178345f, 0.191406f, 0.205200f, - 0.219238f, 0.234985f, 0.250977f, 0.267578f, 0.284912f, 0.302734f, 0.321289f, 0.340332f, - 0.360352f, 0.380615f, 0.401611f, 0.423340f, 0.445312f, 0.467529f, 0.490967f, 0.514160f, - 0.537598f, 0.561035f, 0.800293f, 0.814453f, 0.815918f, 0.815918f, 0.814941f, 0.813965f, - 0.000932f, 0.002567f, 0.004009f, 0.005722f, 0.007538f, 0.008812f, 0.010864f, 0.012413f, - 0.014290f, 0.015991f, 0.018051f, 0.019836f, 0.022247f, 0.024506f, 0.026520f, 0.029175f, - 0.031769f, 0.034332f, 0.037689f, 0.040466f, 0.043945f, 0.047607f, 0.051605f, 0.055817f, - 0.060486f, 0.065125f, 0.070557f, 0.076111f, 0.081909f, 0.088806f, 0.095886f, 0.103210f, - 0.111755f, 0.120422f, 0.130249f, 0.140137f, 0.150513f, 0.162109f, 0.174561f, 0.187256f, - 0.200928f, 0.215698f, 0.231323f, 0.246582f, 0.264160f, 0.281982f, 0.299561f, 0.319092f, - 0.338623f, 0.358643f, 0.379883f, 0.400879f, 0.423096f, 0.445557f, 0.468750f, 0.492188f, - 0.516113f, 0.541504f, 0.791016f, 0.805664f, 0.808105f, 0.808594f, 0.807129f, 0.806641f, - 0.000871f, 0.002337f, 0.003727f, 0.005474f, 0.006641f, 0.008377f, 0.009567f, 0.011154f, - 0.012848f, 0.014610f, 0.016235f, 0.017960f, 0.019958f, 0.021729f, 0.023926f, 0.026154f, - 0.028351f, 0.030975f, 0.033722f, 0.036407f, 0.039459f, 0.042694f, 0.046082f, 0.049896f, - 0.053833f, 0.058167f, 0.062744f, 0.067932f, 0.073608f, 0.079468f, 0.085632f, 0.092651f, - 0.100098f, 0.108521f, 0.116699f, 0.126099f, 0.136108f, 0.146606f, 0.157959f, 0.170410f, - 0.183594f, 0.197510f, 0.212280f, 0.227295f, 0.243652f, 0.260986f, 0.278564f, 0.297607f, - 0.316406f, 0.336426f, 0.357178f, 0.378662f, 0.400146f, 0.422852f, 0.446045f, 0.470215f, - 0.494873f, 0.520020f, 0.781250f, 0.796875f, 0.800293f, 0.800781f, 0.799805f, 0.799316f, - 0.000782f, 0.002131f, 0.003649f, 0.004715f, 0.006054f, 0.007458f, 0.008759f, 0.010269f, - 0.011711f, 0.012970f, 0.014664f, 0.016327f, 0.017914f, 0.019699f, 0.021423f, 0.023499f, - 0.025391f, 0.027374f, 0.029999f, 0.032501f, 0.035156f, 0.037872f, 0.040710f, 0.044403f, - 0.047791f, 0.051880f, 0.055969f, 0.060364f, 0.065247f, 0.070496f, 0.076172f, 0.082825f, - 0.089294f, 0.096497f, 0.104431f, 0.112854f, 0.122375f, 0.132202f, 0.142700f, 0.153931f, - 0.166260f, 0.179565f, 0.193481f, 0.208008f, 0.223877f, 0.240479f, 0.257568f, 0.275879f, - 0.294922f, 0.314453f, 0.334961f, 0.355957f, 0.377686f, 0.400391f, 0.423828f, 0.448730f, - 0.472900f, 0.498535f, 0.771484f, 0.789062f, 0.791504f, 0.792480f, 0.791016f, 0.791016f, - 0.000742f, 0.001822f, 0.003183f, 0.004444f, 0.005600f, 0.006550f, 0.008087f, 0.009247f, - 0.010559f, 0.011650f, 0.013184f, 0.014565f, 0.016083f, 0.017548f, 0.019119f, 0.020737f, - 0.022644f, 0.024597f, 0.026627f, 0.028809f, 0.031281f, 0.033539f, 0.036469f, 0.039429f, - 0.042480f, 0.045654f, 0.049561f, 0.053406f, 0.057739f, 0.062469f, 0.067749f, 0.073364f, - 0.079773f, 0.086121f, 0.093262f, 0.100647f, 0.109253f, 0.118042f, 0.128174f, 0.138550f, - 0.150024f, 0.162231f, 0.175171f, 0.189087f, 0.204468f, 0.220215f, 0.236938f, 0.254639f, - 0.273438f, 0.292236f, 0.312012f, 0.333252f, 0.355957f, 0.377686f, 0.401367f, 0.425781f, - 0.451416f, 0.476318f, 0.761230f, 0.779785f, 0.782227f, 0.782715f, 0.782715f, 0.782715f, - 0.000632f, 0.001970f, 0.003042f, 0.004025f, 0.005173f, 0.006435f, 0.007343f, 0.008522f, - 0.009369f, 0.010475f, 0.011726f, 0.012962f, 0.014145f, 0.015411f, 0.016922f, 0.018478f, - 0.020111f, 0.021835f, 0.023682f, 0.025253f, 0.027466f, 0.029678f, 0.032196f, 0.034607f, - 0.037415f, 0.040497f, 0.043610f, 0.047089f, 0.051178f, 0.055573f, 0.059845f, 0.064758f, - 0.070068f, 0.076111f, 0.082275f, 0.089417f, 0.096863f, 0.105286f, 0.114441f, 0.123535f, - 0.134399f, 0.145508f, 0.157959f, 0.171387f, 0.185425f, 0.200806f, 0.216919f, 0.233521f, - 0.251953f, 0.270508f, 0.290527f, 0.310791f, 0.332275f, 0.355469f, 0.378418f, 0.403564f, - 0.428223f, 0.455322f, 0.750977f, 0.770996f, 0.774414f, 0.774414f, 0.774902f, 0.773926f, - 0.000517f, 0.001554f, 0.002741f, 0.003695f, 0.004669f, 0.005417f, 0.006466f, 0.007545f, - 0.008453f, 0.009499f, 0.010468f, 0.011490f, 0.012718f, 0.013985f, 0.014977f, 0.016235f, - 0.017868f, 0.019211f, 0.020630f, 0.022263f, 0.024078f, 0.026291f, 0.028275f, 0.030380f, - 0.032928f, 0.035675f, 0.038513f, 0.041656f, 0.044769f, 0.048523f, 0.052216f, 0.057007f, - 0.061493f, 0.066711f, 0.072510f, 0.078735f, 0.085327f, 0.093201f, 0.101135f, 0.109619f, - 0.119690f, 0.130371f, 0.141602f, 0.154053f, 0.167480f, 0.181396f, 0.197021f, 0.213623f, - 0.230835f, 0.248901f, 0.268066f, 0.289062f, 0.310303f, 0.332520f, 0.355225f, 0.379639f, - 0.405273f, 0.432373f, 0.740234f, 0.760742f, 0.763672f, 0.765625f, 0.765625f, 0.765625f, - 0.000588f, 0.001405f, 0.002306f, 0.003370f, 0.004375f, 0.005116f, 0.005817f, 0.006630f, - 0.007797f, 0.008507f, 0.009216f, 0.010254f, 0.011246f, 0.012154f, 0.013191f, 0.014366f, - 0.015503f, 0.016785f, 0.018127f, 0.019562f, 0.021072f, 0.022919f, 0.024643f, 0.026749f, - 0.028564f, 0.031006f, 0.033203f, 0.036072f, 0.039032f, 0.042114f, 0.045654f, 0.049561f, - 0.053650f, 0.058380f, 0.063049f, 0.068848f, 0.075256f, 0.081543f, 0.088562f, 0.096924f, - 0.105652f, 0.115173f, 0.125977f, 0.137207f, 0.149902f, 0.163208f, 0.177979f, 0.193726f, - 0.210205f, 0.228027f, 0.247070f, 0.266602f, 0.287842f, 0.309326f, 0.333008f, 0.356934f, - 0.382568f, 0.408691f, 0.729004f, 0.751953f, 0.755371f, 0.756348f, 0.757324f, 0.756348f, - 0.000431f, 0.001562f, 0.002253f, 0.003088f, 0.003944f, 0.004536f, 0.005066f, 0.006020f, - 0.006840f, 0.007542f, 0.008347f, 0.008949f, 0.009827f, 0.010719f, 0.011696f, 0.012756f, - 0.013649f, 0.014679f, 0.015808f, 0.017288f, 0.018356f, 0.019913f, 0.021332f, 0.023148f, - 0.024719f, 0.026840f, 0.029007f, 0.031250f, 0.033661f, 0.036469f, 0.039490f, 0.042969f, - 0.046326f, 0.050293f, 0.054901f, 0.059845f, 0.064941f, 0.071289f, 0.077454f, 0.084656f, - 0.092529f, 0.101562f, 0.111145f, 0.121460f, 0.132935f, 0.145386f, 0.159302f, 0.174438f, - 0.190186f, 0.206909f, 0.225098f, 0.244751f, 0.265381f, 0.287109f, 0.310059f, 0.333984f, - 0.359131f, 0.386230f, 0.716797f, 0.740723f, 0.744629f, 0.746582f, 0.747070f, 0.747070f, - 0.000576f, 0.001266f, 0.002028f, 0.002766f, 0.003317f, 0.004051f, 0.004742f, 0.005459f, - 0.006054f, 0.006641f, 0.007240f, 0.007919f, 0.008644f, 0.009300f, 0.010170f, 0.010925f, - 0.011795f, 0.012733f, 0.013855f, 0.014885f, 0.015900f, 0.017212f, 0.018326f, 0.019684f, - 0.021469f, 0.023178f, 0.024734f, 0.026794f, 0.028946f, 0.031204f, 0.033844f, 0.036682f, - 0.039948f, 0.043335f, 0.047150f, 0.051422f, 0.055969f, 0.061066f, 0.067139f, 0.073242f, - 0.080444f, 0.088440f, 0.096985f, 0.106445f, 0.116943f, 0.128906f, 0.141479f, 0.154907f, - 0.170410f, 0.186523f, 0.204102f, 0.222900f, 0.243774f, 0.264160f, 0.286865f, 0.310791f, - 0.336182f, 0.362793f, 0.705078f, 0.730469f, 0.735352f, 0.736816f, 0.737793f, 0.736816f, - 0.000307f, 0.001126f, 0.001758f, 0.002436f, 0.002911f, 0.003540f, 0.004047f, 0.004711f, - 0.005245f, 0.005749f, 0.006302f, 0.006844f, 0.007355f, 0.008095f, 0.008835f, 0.009438f, - 0.010139f, 0.010941f, 0.011963f, 0.012878f, 0.013519f, 0.014847f, 0.015945f, 0.017029f, - 0.018250f, 0.019669f, 0.021362f, 0.022675f, 0.024750f, 0.026657f, 0.028854f, 0.031219f, - 0.033844f, 0.036804f, 0.040222f, 0.043793f, 0.047791f, 0.052185f, 0.057251f, 0.062866f, - 0.069275f, 0.075867f, 0.083923f, 0.092407f, 0.102295f, 0.112366f, 0.124207f, 0.137085f, - 0.151489f, 0.167114f, 0.183838f, 0.202148f, 0.221558f, 0.242065f, 0.263916f, 0.287842f, - 0.312256f, 0.339111f, 0.693848f, 0.719727f, 0.724609f, 0.726074f, 0.727539f, 0.727051f, - 0.000428f, 0.000939f, 0.001581f, 0.002033f, 0.002665f, 0.003222f, 0.003660f, 0.004059f, - 0.004475f, 0.004997f, 0.005554f, 0.006031f, 0.006371f, 0.007080f, 0.007511f, 0.008263f, - 0.008820f, 0.009552f, 0.010124f, 0.010948f, 0.011665f, 0.012550f, 0.013397f, 0.014526f, - 0.015388f, 0.016754f, 0.017960f, 0.019257f, 0.020844f, 0.022583f, 0.024246f, 0.026642f, - 0.028656f, 0.031128f, 0.033783f, 0.036865f, 0.040253f, 0.044312f, 0.048523f, 0.053314f, - 0.058655f, 0.064880f, 0.071594f, 0.079102f, 0.087891f, 0.097107f, 0.108276f, 0.119751f, - 0.133179f, 0.148071f, 0.163818f, 0.180908f, 0.199951f, 0.219849f, 0.241699f, 0.264160f, - 0.288818f, 0.315918f, 0.680176f, 0.708496f, 0.713867f, 0.716309f, 0.716797f, 0.717285f, - 0.000467f, 0.001054f, 0.001476f, 0.001825f, 0.002386f, 0.002644f, 0.003218f, 0.003553f, - 0.003866f, 0.004433f, 0.004700f, 0.004948f, 0.005505f, 0.006023f, 0.006405f, 0.006920f, - 0.007484f, 0.008057f, 0.008598f, 0.009178f, 0.009857f, 0.010551f, 0.011169f, 0.012199f, - 0.013092f, 0.014084f, 0.015091f, 0.016205f, 0.017303f, 0.018845f, 0.020538f, 0.021957f, - 0.023773f, 0.025833f, 0.028152f, 0.030716f, 0.033661f, 0.036896f, 0.040405f, 0.044708f, - 0.049286f, 0.054321f, 0.060333f, 0.067322f, 0.074890f, 0.083435f, 0.092651f, 0.103516f, - 0.115784f, 0.129028f, 0.144287f, 0.160278f, 0.178345f, 0.197632f, 0.218994f, 0.241089f, - 0.265869f, 0.292725f, 0.667969f, 0.697266f, 0.702637f, 0.704590f, 0.706055f, 0.707031f, - 0.000348f, 0.000841f, 0.001292f, 0.001580f, 0.001961f, 0.002508f, 0.002630f, 0.002993f, - 0.003458f, 0.003738f, 0.003952f, 0.004425f, 0.004639f, 0.005070f, 0.005547f, 0.005840f, - 0.006462f, 0.006844f, 0.007214f, 0.007698f, 0.008339f, 0.008980f, 0.009560f, 0.010094f, - 0.010941f, 0.011711f, 0.012550f, 0.013565f, 0.014404f, 0.015579f, 0.016754f, 0.018082f, - 0.019592f, 0.021439f, 0.023209f, 0.025375f, 0.027863f, 0.030411f, 0.033478f, 0.037018f, - 0.040680f, 0.045105f, 0.050476f, 0.056183f, 0.062805f, 0.070251f, 0.078613f, 0.088196f, - 0.099060f, 0.111450f, 0.125122f, 0.140869f, 0.158203f, 0.176880f, 0.197266f, 0.218506f, - 0.242798f, 0.268555f, 0.655273f, 0.686035f, 0.691406f, 0.694336f, 0.695312f, 0.695801f, - 0.000170f, 0.000976f, 0.001161f, 0.001441f, 0.001846f, 0.002144f, 0.002367f, 0.002632f, - 0.002892f, 0.003178f, 0.003435f, 0.003618f, 0.004021f, 0.004292f, 0.004562f, 0.005028f, - 0.005405f, 0.005623f, 0.006069f, 0.006577f, 0.006973f, 0.007431f, 0.007904f, 0.008484f, - 0.009018f, 0.009659f, 0.010559f, 0.010994f, 0.012009f, 0.012840f, 0.013901f, 0.014915f, - 0.016129f, 0.017502f, 0.019089f, 0.020676f, 0.022568f, 0.024673f, 0.027252f, 0.029984f, - 0.033234f, 0.037079f, 0.041016f, 0.045868f, 0.051758f, 0.058014f, 0.065613f, 0.073853f, - 0.083801f, 0.094727f, 0.107483f, 0.121826f, 0.137573f, 0.156006f, 0.175049f, 0.196167f, - 0.219482f, 0.245850f, 0.641113f, 0.673340f, 0.679688f, 0.681641f, 0.683594f, 0.684082f, - 0.000293f, 0.000601f, 0.001049f, 0.001358f, 0.001532f, 0.001719f, 0.001882f, 0.002298f, - 0.002317f, 0.002628f, 0.002750f, 0.003143f, 0.003363f, 0.003559f, 0.003866f, 0.004204f, - 0.004383f, 0.004753f, 0.005028f, 0.005348f, 0.005863f, 0.006176f, 0.006569f, 0.006954f, - 0.007401f, 0.008057f, 0.008537f, 0.009178f, 0.009735f, 0.010521f, 0.011208f, 0.011978f, - 0.013130f, 0.014099f, 0.015289f, 0.016739f, 0.018219f, 0.019821f, 0.021713f, 0.024200f, - 0.026749f, 0.029785f, 0.033386f, 0.036987f, 0.041840f, 0.047089f, 0.053253f, 0.060760f, - 0.069214f, 0.079224f, 0.090515f, 0.103638f, 0.118652f, 0.135376f, 0.154175f, 0.174561f, - 0.196777f, 0.222534f, 0.628906f, 0.660645f, 0.668457f, 0.670410f, 0.672852f, 0.673340f, - 0.000258f, 0.000656f, 0.000811f, 0.001049f, 0.001288f, 0.001462f, 0.001599f, 0.001740f, - 0.002012f, 0.002171f, 0.002367f, 0.002535f, 0.002705f, 0.002880f, 0.003115f, 0.003429f, - 0.003666f, 0.003897f, 0.004116f, 0.004398f, 0.004635f, 0.005066f, 0.005341f, 0.005779f, - 0.006042f, 0.006454f, 0.006954f, 0.007450f, 0.007835f, 0.008400f, 0.009132f, 0.009819f, - 0.010536f, 0.011307f, 0.012245f, 0.013229f, 0.014580f, 0.015900f, 0.017303f, 0.019119f, - 0.021103f, 0.023468f, 0.026123f, 0.029495f, 0.033112f, 0.037628f, 0.042938f, 0.048859f, - 0.056152f, 0.064941f, 0.074829f, 0.086548f, 0.100281f, 0.115967f, 0.133545f, 0.153198f, - 0.175171f, 0.199341f, 0.613770f, 0.648926f, 0.655273f, 0.658691f, 0.660645f, 0.662598f, - 0.000176f, 0.000474f, 0.000602f, 0.000854f, 0.001030f, 0.001240f, 0.001349f, 0.001505f, - 0.001580f, 0.001738f, 0.001957f, 0.002068f, 0.002230f, 0.002420f, 0.002556f, 0.002705f, - 0.002998f, 0.003178f, 0.003345f, 0.003567f, 0.003811f, 0.004105f, 0.004284f, 0.004593f, - 0.004848f, 0.005173f, 0.005527f, 0.005939f, 0.006306f, 0.006817f, 0.007366f, 0.007729f, - 0.008339f, 0.008995f, 0.009644f, 0.010551f, 0.011360f, 0.012344f, 0.013710f, 0.015030f, - 0.016510f, 0.018143f, 0.020279f, 0.022751f, 0.025650f, 0.029144f, 0.033508f, 0.038452f, - 0.044556f, 0.052032f, 0.060364f, 0.070923f, 0.082642f, 0.097290f, 0.113525f, 0.132446f, - 0.153442f, 0.176880f, 0.600586f, 0.636719f, 0.644531f, 0.647461f, 0.648926f, 0.649414f, - 0.000121f, 0.000426f, 0.000509f, 0.000778f, 0.000931f, 0.000992f, 0.001135f, 0.001303f, - 0.001359f, 0.001410f, 0.001519f, 0.001722f, 0.001751f, 0.001951f, 0.002060f, 0.002218f, - 0.002287f, 0.002487f, 0.002670f, 0.002848f, 0.003061f, 0.003233f, 0.003452f, 0.003664f, - 0.003883f, 0.004078f, 0.004379f, 0.004692f, 0.004982f, 0.005329f, 0.005756f, 0.006081f, - 0.006504f, 0.007019f, 0.007599f, 0.008217f, 0.008850f, 0.009628f, 0.010437f, 0.011597f, - 0.012650f, 0.013931f, 0.015480f, 0.017380f, 0.019577f, 0.022247f, 0.025513f, 0.029617f, - 0.034363f, 0.040314f, 0.047241f, 0.056274f, 0.066711f, 0.079773f, 0.094482f, 0.112488f, - 0.132446f, 0.154907f, 0.585449f, 0.624023f, 0.630371f, 0.634277f, 0.636230f, 0.637207f, - 0.000161f, 0.000263f, 0.000526f, 0.000627f, 0.000723f, 0.000775f, 0.000856f, 0.000960f, - 0.001079f, 0.001158f, 0.001208f, 0.001272f, 0.001441f, 0.001557f, 0.001657f, 0.001702f, - 0.001897f, 0.001918f, 0.002151f, 0.002232f, 0.002337f, 0.002522f, 0.002720f, 0.002865f, - 0.003029f, 0.003193f, 0.003387f, 0.003601f, 0.003887f, 0.004124f, 0.004356f, 0.004639f, - 0.005070f, 0.005466f, 0.005863f, 0.006298f, 0.006874f, 0.007290f, 0.007965f, 0.008774f, - 0.009560f, 0.010666f, 0.011719f, 0.013077f, 0.014679f, 0.016693f, 0.019058f, 0.021881f, - 0.025528f, 0.030121f, 0.036011f, 0.043396f, 0.052460f, 0.063477f, 0.076721f, 0.093079f, - 0.112305f, 0.133667f, 0.572266f, 0.609375f, 0.618164f, 0.622070f, 0.623535f, 0.625488f, - 0.000109f, 0.000212f, 0.000404f, 0.000578f, 0.000567f, 0.000655f, 0.000763f, 0.000676f, - 0.000824f, 0.000869f, 0.000971f, 0.001064f, 0.001132f, 0.001210f, 0.001212f, 0.001398f, - 0.001486f, 0.001525f, 0.001653f, 0.001676f, 0.001867f, 0.001953f, 0.002062f, 0.002199f, - 0.002295f, 0.002443f, 0.002586f, 0.002766f, 0.002979f, 0.003128f, 0.003429f, 0.003551f, - 0.003763f, 0.004074f, 0.004349f, 0.004688f, 0.005032f, 0.005470f, 0.005894f, 0.006519f, - 0.007092f, 0.007896f, 0.008629f, 0.009659f, 0.010910f, 0.012215f, 0.013962f, 0.015991f, - 0.018646f, 0.021881f, 0.026428f, 0.032074f, 0.039276f, 0.048645f, 0.060455f, 0.075256f, - 0.092773f, 0.113220f, 0.554688f, 0.596191f, 0.605957f, 0.608887f, 0.610352f, 0.612305f, - 0.000202f, 0.000186f, 0.000312f, 0.000433f, 0.000382f, 0.000543f, 0.000482f, 0.000546f, - 0.000621f, 0.000666f, 0.000789f, 0.000802f, 0.000859f, 0.000950f, 0.000970f, 0.000975f, - 0.001113f, 0.001162f, 0.001207f, 0.001312f, 0.001362f, 0.001433f, 0.001541f, 0.001618f, - 0.001720f, 0.001791f, 0.001966f, 0.002035f, 0.002199f, 0.002413f, 0.002546f, 0.002626f, - 0.002855f, 0.003063f, 0.003204f, 0.003448f, 0.003693f, 0.003986f, 0.004364f, 0.004684f, - 0.005127f, 0.005619f, 0.006271f, 0.006870f, 0.007748f, 0.008713f, 0.009911f, 0.011368f, - 0.013191f, 0.015518f, 0.018646f, 0.022644f, 0.028107f, 0.035645f, 0.045471f, 0.058502f, - 0.074646f, 0.093994f, 0.541016f, 0.583008f, 0.591797f, 0.596191f, 0.599121f, 0.600098f, - 0.000000f, 0.000179f, 0.000242f, 0.000318f, 0.000341f, 0.000345f, 0.000432f, 0.000364f, - 0.000475f, 0.000483f, 0.000572f, 0.000576f, 0.000619f, 0.000640f, 0.000716f, 0.000737f, - 0.000791f, 0.000845f, 0.000871f, 0.000907f, 0.000998f, 0.001025f, 0.001107f, 0.001181f, - 0.001244f, 0.001303f, 0.001391f, 0.001462f, 0.001549f, 0.001631f, 0.001756f, 0.001906f, - 0.001984f, 0.002161f, 0.002264f, 0.002419f, 0.002613f, 0.002825f, 0.003103f, 0.003321f, - 0.003584f, 0.003893f, 0.004349f, 0.004799f, 0.005383f, 0.006020f, 0.006836f, 0.007858f, - 0.009117f, 0.010674f, 0.012825f, 0.015533f, 0.019363f, 0.024780f, 0.032593f, 0.043274f, - 0.057770f, 0.076111f, 0.525879f, 0.569336f, 0.578613f, 0.583008f, 0.585449f, 0.586426f, - 0.000000f, 0.000088f, 0.000192f, 0.000227f, 0.000230f, 0.000286f, 0.000255f, 0.000317f, - 0.000321f, 0.000371f, 0.000401f, 0.000373f, 0.000391f, 0.000457f, 0.000474f, 0.000530f, - 0.000509f, 0.000585f, 0.000625f, 0.000664f, 0.000707f, 0.000746f, 0.000772f, 0.000817f, - 0.000877f, 0.000887f, 0.000978f, 0.001007f, 0.001069f, 0.001202f, 0.001192f, 0.001290f, - 0.001356f, 0.001464f, 0.001583f, 0.001678f, 0.001771f, 0.001929f, 0.002050f, 0.002230f, - 0.002424f, 0.002651f, 0.002888f, 0.003176f, 0.003534f, 0.003967f, 0.004475f, 0.005154f, - 0.005993f, 0.007118f, 0.008469f, 0.010338f, 0.012794f, 0.016403f, 0.021957f, 0.030090f, - 0.042419f, 0.059052f, 0.510254f, 0.554199f, 0.564453f, 0.570312f, 0.572754f, 0.573242f, - 0.000000f, 0.000126f, 0.000180f, 0.000121f, 0.000178f, 0.000176f, 0.000177f, 0.000212f, - 0.000210f, 0.000228f, 0.000238f, 0.000291f, 0.000280f, 0.000298f, 0.000336f, 0.000350f, - 0.000369f, 0.000387f, 0.000395f, 0.000427f, 0.000460f, 0.000476f, 0.000515f, 0.000536f, - 0.000573f, 0.000619f, 0.000650f, 0.000670f, 0.000703f, 0.000746f, 0.000798f, 0.000836f, - 0.000902f, 0.000949f, 0.001031f, 0.001062f, 0.001162f, 0.001227f, 0.001349f, 0.001442f, - 0.001533f, 0.001690f, 0.001865f, 0.001995f, 0.002228f, 0.002495f, 0.002800f, 0.003191f, - 0.003653f, 0.004349f, 0.005203f, 0.006393f, 0.008026f, 0.010307f, 0.013710f, 0.019379f, - 0.028854f, 0.043457f, 0.494873f, 0.541016f, 0.550781f, 0.555664f, 0.558105f, 0.559570f, - 0.000000f, 0.000095f, 0.000086f, 0.000079f, 0.000105f, 0.000124f, 0.000111f, 0.000137f, - 0.000141f, 0.000142f, 0.000147f, 0.000151f, 0.000160f, 0.000181f, 0.000202f, 0.000207f, - 0.000214f, 0.000248f, 0.000244f, 0.000282f, 0.000273f, 0.000283f, 0.000306f, 0.000334f, - 0.000367f, 0.000378f, 0.000376f, 0.000399f, 0.000437f, 0.000459f, 0.000474f, 0.000516f, - 0.000552f, 0.000567f, 0.000616f, 0.000649f, 0.000693f, 0.000743f, 0.000805f, 0.000851f, - 0.000918f, 0.000999f, 0.001085f, 0.001195f, 0.001309f, 0.001466f, 0.001644f, 0.001850f, - 0.002151f, 0.002487f, 0.002974f, 0.003654f, 0.004574f, 0.006001f, 0.008156f, 0.011452f, - 0.017853f, 0.029739f, 0.478271f, 0.526367f, 0.537109f, 0.541504f, 0.544434f, 0.545898f, - 0.000106f, 0.000085f, 0.000074f, 0.000067f, 0.000066f, 0.000070f, 0.000069f, 0.000073f, - 0.000073f, 0.000080f, 0.000084f, 0.000109f, 0.000093f, 0.000098f, 0.000119f, 0.000108f, - 0.000128f, 0.000135f, 0.000137f, 0.000149f, 0.000150f, 0.000157f, 0.000182f, 0.000185f, - 0.000207f, 0.000206f, 0.000214f, 0.000234f, 0.000237f, 0.000253f, 0.000267f, 0.000289f, - 0.000306f, 0.000313f, 0.000344f, 0.000352f, 0.000384f, 0.000406f, 0.000445f, 0.000467f, - 0.000503f, 0.000543f, 0.000593f, 0.000634f, 0.000697f, 0.000764f, 0.000850f, 0.000963f, - 0.001105f, 0.001298f, 0.001536f, 0.001856f, 0.002333f, 0.003069f, 0.004299f, 0.006271f, - 0.009789f, 0.018234f, 0.462402f, 0.511719f, 0.522949f, 0.527344f, 0.530762f, 0.532715f, - 0.000091f, 0.000069f, 0.000060f, 0.000054f, 0.000049f, 0.000046f, 0.000043f, 0.000041f, - 0.000040f, 0.000044f, 0.000040f, 0.000040f, 0.000054f, 0.000044f, 0.000045f, 0.000044f, - 0.000062f, 0.000062f, 0.000069f, 0.000071f, 0.000074f, 0.000079f, 0.000081f, 0.000081f, - 0.000085f, 0.000099f, 0.000098f, 0.000115f, 0.000115f, 0.000119f, 0.000125f, 0.000130f, - 0.000140f, 0.000144f, 0.000165f, 0.000172f, 0.000178f, 0.000191f, 0.000205f, 0.000222f, - 0.000234f, 0.000251f, 0.000276f, 0.000293f, 0.000327f, 0.000354f, 0.000392f, 0.000437f, - 0.000494f, 0.000562f, 0.000662f, 0.000800f, 0.001005f, 0.001315f, 0.001852f, 0.002825f, - 0.004723f, 0.009285f, 0.446533f, 0.497803f, 0.508301f, 0.514160f, 0.516602f, 0.519043f, - 0.000067f, 0.000048f, 0.000040f, 0.000036f, 0.000033f, 0.000031f, 0.000030f, 0.000028f, - 0.000027f, 0.000026f, 0.000025f, 0.000024f, 0.000023f, 0.000022f, 0.000021f, 0.000020f, - 0.000019f, 0.000020f, 0.000024f, 0.000026f, 0.000025f, 0.000027f, 0.000031f, 0.000032f, - 0.000032f, 0.000037f, 0.000041f, 0.000038f, 0.000045f, 0.000042f, 0.000048f, 0.000049f, - 0.000053f, 0.000055f, 0.000059f, 0.000062f, 0.000071f, 0.000074f, 0.000077f, 0.000081f, - 0.000086f, 0.000091f, 0.000098f, 0.000109f, 0.000116f, 0.000125f, 0.000137f, 0.000158f, - 0.000173f, 0.000193f, 0.000230f, 0.000273f, 0.000335f, 0.000425f, 0.000603f, 0.000935f, - 0.001694f, 0.003727f, 0.431396f, 0.481934f, 0.493652f, 0.499512f, 0.502930f, 0.504883f, - 0.000021f, 0.000016f, 0.000013f, 0.000012f, 0.000013f, 0.000012f, 0.000012f, 0.000012f, - 0.000012f, 0.000012f, 0.000011f, 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000011f, - 0.000011f, 0.000011f, 0.000011f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000009f, - 0.000008f, 0.000008f, 0.000008f, 0.000007f, 0.000008f, 0.000009f, 0.000009f, 0.000010f, - 0.000010f, 0.000013f, 0.000014f, 0.000013f, 0.000015f, 0.000016f, 0.000017f, 0.000019f, - 0.000019f, 0.000020f, 0.000023f, 0.000026f, 0.000027f, 0.000027f, 0.000032f, 0.000030f, - 0.000036f, 0.000039f, 0.000050f, 0.000056f, 0.000063f, 0.000082f, 0.000109f, 0.000168f, - 0.000317f, 0.000922f, 0.415283f, 0.467773f, 0.479980f, 0.486328f, 0.489014f, 0.490723f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000004f, 0.000005f, - 0.000008f, 0.000026f, 0.398926f, 0.452881f, 0.465576f, 0.471436f, 0.474854f, 0.477051f, - }, - { - 0.019653f, 0.058990f, 0.097473f, 0.134277f, 0.169189f, 0.203491f, 0.236450f, 0.267578f, - 0.297852f, 0.326416f, 0.354004f, 0.380859f, 0.406250f, 0.431641f, 0.455078f, 0.477539f, - 0.500000f, 0.520996f, 0.541504f, 0.560547f, 0.580566f, 0.598633f, 0.615723f, 0.633301f, - 0.649902f, 0.666016f, 0.681641f, 0.695801f, 0.709961f, 0.724609f, 0.738770f, 0.751953f, - 0.765137f, 0.775879f, 0.788574f, 0.799805f, 0.812012f, 0.822754f, 0.833496f, 0.844238f, - 0.854004f, 0.864258f, 0.874023f, 0.883301f, 0.891602f, 0.900391f, 0.909668f, 0.917969f, - 0.925781f, 0.934570f, 0.941895f, 0.949707f, 0.956543f, 0.963379f, 0.970703f, 0.977539f, - 0.984863f, 0.991211f, 0.988770f, 0.972656f, 0.960449f, 0.949707f, 0.940430f, 0.931641f, - 0.017303f, 0.052399f, 0.086548f, 0.119446f, 0.153076f, 0.183594f, 0.214722f, 0.245117f, - 0.273193f, 0.301270f, 0.328613f, 0.354492f, 0.379883f, 0.404541f, 0.427979f, 0.450195f, - 0.472656f, 0.494629f, 0.515137f, 0.534668f, 0.554199f, 0.573242f, 0.591309f, 0.608887f, - 0.625977f, 0.642578f, 0.658203f, 0.672852f, 0.688477f, 0.704102f, 0.717285f, 0.731445f, - 0.744629f, 0.756836f, 0.769531f, 0.782715f, 0.793945f, 0.805664f, 0.816406f, 0.828125f, - 0.838379f, 0.849121f, 0.858887f, 0.868652f, 0.877930f, 0.888184f, 0.896973f, 0.905762f, - 0.915039f, 0.921875f, 0.930176f, 0.937988f, 0.946777f, 0.954102f, 0.960938f, 0.968750f, - 0.975586f, 0.982422f, 0.984375f, 0.969238f, 0.957520f, 0.947754f, 0.938477f, 0.930176f, - 0.015221f, 0.045837f, 0.076843f, 0.107666f, 0.136719f, 0.166504f, 0.196045f, 0.223999f, - 0.250244f, 0.278320f, 0.303711f, 0.329346f, 0.353271f, 0.378906f, 0.401367f, 0.424316f, - 0.447266f, 0.468018f, 0.487793f, 0.508301f, 0.529297f, 0.547363f, 0.566406f, 0.583984f, - 0.601562f, 0.618652f, 0.634766f, 0.650879f, 0.666016f, 0.681641f, 0.695801f, 0.710449f, - 0.724121f, 0.737305f, 0.750488f, 0.762695f, 0.775391f, 0.788086f, 0.799316f, 0.811035f, - 0.821777f, 0.833008f, 0.844238f, 0.854004f, 0.864258f, 0.874023f, 0.882812f, 0.892578f, - 0.901367f, 0.910156f, 0.918457f, 0.926758f, 0.936035f, 0.942871f, 0.950684f, 0.958496f, - 0.965820f, 0.973145f, 0.980469f, 0.965820f, 0.955078f, 0.945312f, 0.936523f, 0.928223f, - 0.013420f, 0.041138f, 0.068359f, 0.096436f, 0.124023f, 0.150879f, 0.177246f, 0.204224f, - 0.230103f, 0.255859f, 0.281494f, 0.305420f, 0.329834f, 0.352783f, 0.376709f, 0.398682f, - 0.420654f, 0.442627f, 0.462646f, 0.483887f, 0.502441f, 0.521484f, 0.540527f, 0.559082f, - 0.576172f, 0.595703f, 0.611328f, 0.627930f, 0.644043f, 0.659668f, 0.674316f, 0.688965f, - 0.703613f, 0.717285f, 0.730957f, 0.744629f, 0.756836f, 0.770020f, 0.781738f, 0.793945f, - 0.805176f, 0.816895f, 0.828125f, 0.838379f, 0.849121f, 0.859375f, 0.869141f, 0.878418f, - 0.888184f, 0.897461f, 0.906738f, 0.915039f, 0.923828f, 0.932129f, 0.940430f, 0.947754f, - 0.956543f, 0.963867f, 0.976074f, 0.962402f, 0.951660f, 0.942383f, 0.934082f, 0.926758f, - 0.012001f, 0.036591f, 0.061737f, 0.086670f, 0.112000f, 0.136719f, 0.161743f, 0.186768f, - 0.211792f, 0.235840f, 0.259521f, 0.283203f, 0.307129f, 0.329590f, 0.352295f, 0.374268f, - 0.395996f, 0.416992f, 0.437744f, 0.457520f, 0.477295f, 0.497314f, 0.515625f, 0.534180f, - 0.553223f, 0.570312f, 0.588379f, 0.604492f, 0.621582f, 0.636719f, 0.653320f, 0.666992f, - 0.683105f, 0.697266f, 0.710449f, 0.724609f, 0.737793f, 0.750977f, 0.764160f, 0.775879f, - 0.788086f, 0.799805f, 0.812012f, 0.823242f, 0.833496f, 0.844238f, 0.854492f, 0.864746f, - 0.875000f, 0.884277f, 0.894043f, 0.902832f, 0.911621f, 0.920898f, 0.929688f, 0.937500f, - 0.945801f, 0.953613f, 0.971191f, 0.958984f, 0.949219f, 0.939941f, 0.932129f, 0.924316f, - 0.010612f, 0.032684f, 0.054810f, 0.077759f, 0.100952f, 0.124023f, 0.146851f, 0.171021f, - 0.193604f, 0.217163f, 0.239380f, 0.261963f, 0.284424f, 0.307129f, 0.328613f, 0.351318f, - 0.371826f, 0.392334f, 0.413574f, 0.432617f, 0.453613f, 0.472656f, 0.491943f, 0.510254f, - 0.528320f, 0.546387f, 0.563965f, 0.580078f, 0.598633f, 0.613770f, 0.629883f, 0.645996f, - 0.661621f, 0.675293f, 0.688965f, 0.705078f, 0.718262f, 0.731934f, 0.745605f, 0.757812f, - 0.770996f, 0.782715f, 0.795410f, 0.807129f, 0.818359f, 0.829102f, 0.839844f, 0.851074f, - 0.860840f, 0.871094f, 0.880859f, 0.891113f, 0.900391f, 0.909668f, 0.917969f, 0.927246f, - 0.935547f, 0.943848f, 0.966797f, 0.955566f, 0.945801f, 0.937012f, 0.929199f, 0.921875f, - 0.009483f, 0.029556f, 0.050140f, 0.070129f, 0.091797f, 0.112549f, 0.134155f, 0.156372f, - 0.177368f, 0.198975f, 0.220825f, 0.243286f, 0.263916f, 0.285645f, 0.306885f, 0.327393f, - 0.348145f, 0.368896f, 0.389404f, 0.409424f, 0.429199f, 0.448730f, 0.467529f, 0.486572f, - 0.505371f, 0.522461f, 0.540039f, 0.558105f, 0.574219f, 0.591309f, 0.607422f, 0.623535f, - 0.639648f, 0.654785f, 0.669922f, 0.685547f, 0.698730f, 0.712891f, 0.726074f, 0.740234f, - 0.752441f, 0.765625f, 0.778320f, 0.789551f, 0.802246f, 0.813477f, 0.825195f, 0.836426f, - 0.847168f, 0.856934f, 0.868164f, 0.877930f, 0.888184f, 0.897461f, 0.906738f, 0.915527f, - 0.925293f, 0.935059f, 0.962402f, 0.951660f, 0.942383f, 0.933594f, 0.926270f, 0.919434f, - 0.008934f, 0.026581f, 0.044708f, 0.063354f, 0.082825f, 0.102844f, 0.122437f, 0.141968f, - 0.162720f, 0.183105f, 0.202515f, 0.224609f, 0.244995f, 0.265381f, 0.285645f, 0.306152f, - 0.326416f, 0.346680f, 0.365967f, 0.385498f, 0.406006f, 0.425293f, 0.444092f, 0.461914f, - 0.480225f, 0.499268f, 0.517090f, 0.535156f, 0.552246f, 0.568359f, 0.585449f, 0.601562f, - 0.616699f, 0.633789f, 0.649414f, 0.663574f, 0.678711f, 0.693848f, 0.706543f, 0.721680f, - 0.734375f, 0.746582f, 0.760742f, 0.773438f, 0.786133f, 0.797852f, 0.809082f, 0.821777f, - 0.832031f, 0.843262f, 0.854492f, 0.864746f, 0.875000f, 0.884766f, 0.895020f, 0.904785f, - 0.914062f, 0.922852f, 0.957520f, 0.947266f, 0.938965f, 0.930664f, 0.923340f, 0.916992f, - 0.007668f, 0.024017f, 0.040405f, 0.057831f, 0.075195f, 0.093079f, 0.111694f, 0.130127f, - 0.148926f, 0.168213f, 0.187500f, 0.206543f, 0.226440f, 0.246460f, 0.265869f, 0.285400f, - 0.305176f, 0.324707f, 0.344238f, 0.363281f, 0.383057f, 0.401123f, 0.420166f, 0.439941f, - 0.457764f, 0.475586f, 0.493164f, 0.511719f, 0.528809f, 0.545898f, 0.562988f, 0.579590f, - 0.596191f, 0.612305f, 0.627441f, 0.643555f, 0.658203f, 0.672363f, 0.687988f, 0.702637f, - 0.715332f, 0.728516f, 0.742676f, 0.756348f, 0.768555f, 0.781250f, 0.794434f, 0.806152f, - 0.818359f, 0.828613f, 0.840332f, 0.851074f, 0.861816f, 0.872559f, 0.882812f, 0.892578f, - 0.903320f, 0.912598f, 0.952637f, 0.943848f, 0.935059f, 0.927246f, 0.920410f, 0.914062f, - 0.007263f, 0.021530f, 0.037048f, 0.052429f, 0.068909f, 0.084961f, 0.102112f, 0.119568f, - 0.136475f, 0.154541f, 0.172852f, 0.191528f, 0.209717f, 0.228638f, 0.246948f, 0.265869f, - 0.284912f, 0.304199f, 0.322510f, 0.341309f, 0.360596f, 0.379639f, 0.397461f, 0.416504f, - 0.434570f, 0.452881f, 0.470947f, 0.489014f, 0.505859f, 0.523438f, 0.541016f, 0.557129f, - 0.574219f, 0.590332f, 0.606445f, 0.622070f, 0.637695f, 0.653809f, 0.667969f, 0.682129f, - 0.697754f, 0.711426f, 0.724609f, 0.737793f, 0.750977f, 0.765625f, 0.777832f, 0.790039f, - 0.801270f, 0.813477f, 0.825684f, 0.837402f, 0.848145f, 0.859375f, 0.870117f, 0.880859f, - 0.891602f, 0.900391f, 0.947754f, 0.938965f, 0.931152f, 0.923828f, 0.917480f, 0.911133f, - 0.006401f, 0.019730f, 0.033813f, 0.047729f, 0.062561f, 0.077515f, 0.093140f, 0.108948f, - 0.125366f, 0.141968f, 0.159058f, 0.175781f, 0.193726f, 0.212036f, 0.229980f, 0.247681f, - 0.265869f, 0.284424f, 0.302734f, 0.320557f, 0.339111f, 0.357910f, 0.376221f, 0.394287f, - 0.412109f, 0.429688f, 0.448486f, 0.466064f, 0.483398f, 0.500977f, 0.517090f, 0.535156f, - 0.552246f, 0.568359f, 0.583984f, 0.600586f, 0.616699f, 0.632324f, 0.647949f, 0.662598f, - 0.677246f, 0.692383f, 0.706543f, 0.719727f, 0.734375f, 0.747070f, 0.761230f, 0.773926f, - 0.786621f, 0.797852f, 0.811523f, 0.823242f, 0.834961f, 0.846680f, 0.857422f, 0.868652f, - 0.879395f, 0.890137f, 0.942383f, 0.934082f, 0.927246f, 0.919922f, 0.913574f, 0.908203f, - 0.005836f, 0.018158f, 0.030746f, 0.043335f, 0.057007f, 0.070801f, 0.085754f, 0.099548f, - 0.115112f, 0.130127f, 0.146362f, 0.162354f, 0.178711f, 0.195801f, 0.212769f, 0.230103f, - 0.247925f, 0.264893f, 0.283203f, 0.300293f, 0.318604f, 0.336426f, 0.354492f, 0.372314f, - 0.390137f, 0.408203f, 0.425537f, 0.443848f, 0.461182f, 0.478271f, 0.496094f, 0.513184f, - 0.529297f, 0.546387f, 0.563477f, 0.580566f, 0.595703f, 0.611816f, 0.626465f, 0.642090f, - 0.658691f, 0.671875f, 0.686523f, 0.702148f, 0.716797f, 0.729980f, 0.744629f, 0.757324f, - 0.770020f, 0.783203f, 0.796875f, 0.808105f, 0.820312f, 0.832520f, 0.844727f, 0.855957f, - 0.867188f, 0.877930f, 0.937012f, 0.930176f, 0.922852f, 0.916504f, 0.910645f, 0.904785f, - 0.005486f, 0.016525f, 0.028030f, 0.039612f, 0.052185f, 0.064636f, 0.077576f, 0.091553f, - 0.105347f, 0.119568f, 0.134521f, 0.149536f, 0.164917f, 0.180664f, 0.197388f, 0.213623f, - 0.230347f, 0.246826f, 0.264160f, 0.280518f, 0.298584f, 0.315674f, 0.334229f, 0.350830f, - 0.369141f, 0.386963f, 0.404053f, 0.422119f, 0.438477f, 0.456299f, 0.474121f, 0.491211f, - 0.507812f, 0.524902f, 0.541504f, 0.557617f, 0.574707f, 0.590820f, 0.606934f, 0.622559f, - 0.637207f, 0.652832f, 0.668945f, 0.683105f, 0.698730f, 0.711914f, 0.726074f, 0.740723f, - 0.753906f, 0.766602f, 0.780273f, 0.792969f, 0.805664f, 0.818848f, 0.830566f, 0.842285f, - 0.854492f, 0.866211f, 0.931641f, 0.925781f, 0.918945f, 0.913086f, 0.907227f, 0.900879f, - 0.004810f, 0.014847f, 0.025604f, 0.036621f, 0.047577f, 0.059174f, 0.071472f, 0.084106f, - 0.096985f, 0.109863f, 0.124146f, 0.137939f, 0.152954f, 0.167358f, 0.182495f, 0.197754f, - 0.213745f, 0.230103f, 0.246216f, 0.262939f, 0.279297f, 0.296387f, 0.313477f, 0.329834f, - 0.348145f, 0.365479f, 0.382080f, 0.399658f, 0.417480f, 0.434082f, 0.452148f, 0.469238f, - 0.486084f, 0.502441f, 0.520020f, 0.536621f, 0.552734f, 0.569336f, 0.585938f, 0.601562f, - 0.617676f, 0.632812f, 0.648438f, 0.664062f, 0.679688f, 0.693848f, 0.708008f, 0.722656f, - 0.735840f, 0.750488f, 0.765137f, 0.777832f, 0.791016f, 0.803711f, 0.816895f, 0.829102f, - 0.841309f, 0.853027f, 0.925781f, 0.921387f, 0.914551f, 0.908203f, 0.903320f, 0.897461f, - 0.004494f, 0.013809f, 0.023331f, 0.033264f, 0.043549f, 0.053833f, 0.065369f, 0.076660f, - 0.088684f, 0.100708f, 0.113464f, 0.127075f, 0.140381f, 0.154419f, 0.169067f, 0.183472f, - 0.198975f, 0.213623f, 0.229370f, 0.245117f, 0.261475f, 0.277832f, 0.294678f, 0.311523f, - 0.327148f, 0.344727f, 0.362061f, 0.378418f, 0.395996f, 0.413086f, 0.430176f, 0.447021f, - 0.464111f, 0.481689f, 0.498047f, 0.514648f, 0.531738f, 0.547363f, 0.565430f, 0.582031f, - 0.597656f, 0.612793f, 0.628418f, 0.644043f, 0.660645f, 0.674805f, 0.689941f, 0.705078f, - 0.718750f, 0.734375f, 0.747559f, 0.761719f, 0.775391f, 0.788086f, 0.803223f, 0.814453f, - 0.828125f, 0.840332f, 0.919434f, 0.916504f, 0.909668f, 0.904785f, 0.898926f, 0.894043f, - 0.004120f, 0.012512f, 0.021423f, 0.030655f, 0.039673f, 0.049500f, 0.059845f, 0.070374f, - 0.081543f, 0.093323f, 0.104614f, 0.116577f, 0.129395f, 0.142456f, 0.156250f, 0.169434f, - 0.183594f, 0.198364f, 0.213257f, 0.228638f, 0.244141f, 0.259766f, 0.275635f, 0.291748f, - 0.308105f, 0.324707f, 0.341309f, 0.359131f, 0.375244f, 0.391846f, 0.408447f, 0.426025f, - 0.442871f, 0.459473f, 0.477051f, 0.494141f, 0.510254f, 0.527344f, 0.543457f, 0.560059f, - 0.577148f, 0.592773f, 0.608887f, 0.625977f, 0.640625f, 0.656738f, 0.671875f, 0.686523f, - 0.702637f, 0.716797f, 0.731445f, 0.746582f, 0.759277f, 0.773926f, 0.787598f, 0.800293f, - 0.814453f, 0.827148f, 0.914062f, 0.911133f, 0.905273f, 0.899902f, 0.895508f, 0.890625f, - 0.004120f, 0.011566f, 0.019180f, 0.027969f, 0.036255f, 0.045746f, 0.054901f, 0.064941f, - 0.074707f, 0.085327f, 0.096436f, 0.107239f, 0.119324f, 0.131470f, 0.144165f, 0.157104f, - 0.169922f, 0.183594f, 0.198242f, 0.212769f, 0.227295f, 0.242188f, 0.257568f, 0.273193f, - 0.289307f, 0.305420f, 0.321289f, 0.337891f, 0.354492f, 0.371094f, 0.387451f, 0.405029f, - 0.421143f, 0.438477f, 0.455322f, 0.472656f, 0.488525f, 0.505859f, 0.521973f, 0.539551f, - 0.555664f, 0.572754f, 0.588867f, 0.605469f, 0.621582f, 0.637207f, 0.653320f, 0.668945f, - 0.684570f, 0.698242f, 0.714844f, 0.729492f, 0.745117f, 0.758301f, 0.771973f, 0.787109f, - 0.800781f, 0.813477f, 0.907715f, 0.905762f, 0.900879f, 0.895508f, 0.890625f, 0.886719f, - 0.003464f, 0.010536f, 0.018143f, 0.025604f, 0.033600f, 0.041992f, 0.050659f, 0.059631f, - 0.068481f, 0.078552f, 0.088196f, 0.099060f, 0.110107f, 0.121033f, 0.133057f, 0.145020f, - 0.157349f, 0.170166f, 0.183838f, 0.197632f, 0.210938f, 0.225464f, 0.241089f, 0.255371f, - 0.270508f, 0.286377f, 0.302246f, 0.317871f, 0.334229f, 0.349854f, 0.367188f, 0.383789f, - 0.399414f, 0.417236f, 0.433838f, 0.450928f, 0.468018f, 0.484131f, 0.501465f, 0.519043f, - 0.535156f, 0.551758f, 0.568359f, 0.585449f, 0.601074f, 0.617676f, 0.634277f, 0.649902f, - 0.666016f, 0.681152f, 0.695801f, 0.711914f, 0.727539f, 0.741699f, 0.756836f, 0.770508f, - 0.785645f, 0.800293f, 0.901855f, 0.900391f, 0.895996f, 0.891113f, 0.886230f, 0.881836f, - 0.003197f, 0.009903f, 0.016525f, 0.023849f, 0.030853f, 0.038605f, 0.046265f, 0.054657f, - 0.063232f, 0.072266f, 0.081543f, 0.090881f, 0.100769f, 0.112061f, 0.123047f, 0.134155f, - 0.145752f, 0.157471f, 0.170166f, 0.182861f, 0.196289f, 0.210327f, 0.223755f, 0.238525f, - 0.253418f, 0.268066f, 0.283203f, 0.299316f, 0.314697f, 0.330811f, 0.346680f, 0.363281f, - 0.379639f, 0.396484f, 0.412842f, 0.429443f, 0.446289f, 0.462891f, 0.480225f, 0.497559f, - 0.514648f, 0.531250f, 0.547852f, 0.564453f, 0.581055f, 0.598145f, 0.615234f, 0.631836f, - 0.646484f, 0.663086f, 0.679199f, 0.694824f, 0.710449f, 0.726074f, 0.740234f, 0.755859f, - 0.770508f, 0.784668f, 0.895020f, 0.894531f, 0.890625f, 0.886719f, 0.881836f, 0.877441f, - 0.003071f, 0.009163f, 0.015602f, 0.021729f, 0.028412f, 0.035522f, 0.042755f, 0.050598f, - 0.057983f, 0.066284f, 0.075317f, 0.083862f, 0.092773f, 0.102905f, 0.113342f, 0.123840f, - 0.134399f, 0.145752f, 0.157593f, 0.169556f, 0.182129f, 0.194702f, 0.207886f, 0.222046f, - 0.235840f, 0.250977f, 0.265137f, 0.280273f, 0.295898f, 0.311279f, 0.326660f, 0.342773f, - 0.359375f, 0.375732f, 0.392090f, 0.409180f, 0.425049f, 0.441895f, 0.459473f, 0.476318f, - 0.493652f, 0.510742f, 0.527344f, 0.544434f, 0.561035f, 0.578125f, 0.595215f, 0.611328f, - 0.628418f, 0.645020f, 0.661133f, 0.677246f, 0.693359f, 0.708496f, 0.724609f, 0.740723f, - 0.755859f, 0.771484f, 0.889160f, 0.889160f, 0.885254f, 0.881348f, 0.876953f, 0.873047f, - 0.002748f, 0.008171f, 0.014084f, 0.019638f, 0.026108f, 0.032318f, 0.039154f, 0.045990f, - 0.053619f, 0.061066f, 0.068665f, 0.076477f, 0.085632f, 0.094727f, 0.104187f, 0.113831f, - 0.123535f, 0.134888f, 0.145508f, 0.157104f, 0.168701f, 0.181030f, 0.193481f, 0.206665f, - 0.220093f, 0.233398f, 0.248169f, 0.262695f, 0.277344f, 0.292236f, 0.307617f, 0.322998f, - 0.339355f, 0.355469f, 0.371582f, 0.388184f, 0.404541f, 0.420410f, 0.438477f, 0.455322f, - 0.472656f, 0.489014f, 0.506348f, 0.523926f, 0.541016f, 0.557617f, 0.575195f, 0.591309f, - 0.608887f, 0.625977f, 0.643555f, 0.659180f, 0.674805f, 0.691406f, 0.707520f, 0.724121f, - 0.739746f, 0.755371f, 0.882812f, 0.883789f, 0.879883f, 0.875977f, 0.872559f, 0.868652f, - 0.002491f, 0.007809f, 0.012764f, 0.018448f, 0.024094f, 0.029861f, 0.036102f, 0.042572f, - 0.049500f, 0.056091f, 0.063293f, 0.070984f, 0.079285f, 0.087036f, 0.095825f, 0.104858f, - 0.114441f, 0.124084f, 0.133789f, 0.144653f, 0.156250f, 0.167480f, 0.179199f, 0.191650f, - 0.204102f, 0.217896f, 0.231445f, 0.245239f, 0.259521f, 0.274170f, 0.289307f, 0.304199f, - 0.319580f, 0.334961f, 0.351074f, 0.367676f, 0.384277f, 0.400635f, 0.417480f, 0.434570f, - 0.451660f, 0.468994f, 0.485352f, 0.502441f, 0.520508f, 0.537109f, 0.554688f, 0.571777f, - 0.588867f, 0.605957f, 0.623047f, 0.639648f, 0.656738f, 0.673828f, 0.690430f, 0.708008f, - 0.723633f, 0.739746f, 0.874023f, 0.876953f, 0.874023f, 0.871582f, 0.867188f, 0.862793f, - 0.002279f, 0.007130f, 0.012291f, 0.016922f, 0.022171f, 0.027847f, 0.033325f, 0.039185f, - 0.045349f, 0.051849f, 0.058411f, 0.064880f, 0.072144f, 0.080017f, 0.087891f, 0.096313f, - 0.105103f, 0.114197f, 0.123779f, 0.134155f, 0.144043f, 0.155151f, 0.166016f, 0.177246f, - 0.189697f, 0.202271f, 0.214722f, 0.228271f, 0.242310f, 0.256592f, 0.270752f, 0.285400f, - 0.300537f, 0.315674f, 0.331543f, 0.347656f, 0.363525f, 0.379639f, 0.396729f, 0.414307f, - 0.430908f, 0.447754f, 0.465088f, 0.482178f, 0.499512f, 0.517090f, 0.533203f, 0.552246f, - 0.568848f, 0.586426f, 0.603516f, 0.621582f, 0.639648f, 0.656250f, 0.673828f, 0.690918f, - 0.707520f, 0.724121f, 0.867676f, 0.870605f, 0.868164f, 0.865723f, 0.861328f, 0.857910f, - 0.002220f, 0.006565f, 0.011238f, 0.015961f, 0.020401f, 0.025558f, 0.030853f, 0.036133f, - 0.041199f, 0.047180f, 0.053436f, 0.059723f, 0.066162f, 0.073853f, 0.080688f, 0.088440f, - 0.096436f, 0.105042f, 0.114319f, 0.123047f, 0.132446f, 0.142822f, 0.153198f, 0.164062f, - 0.175659f, 0.187378f, 0.199463f, 0.212402f, 0.225464f, 0.239014f, 0.252686f, 0.266846f, - 0.281494f, 0.296631f, 0.312500f, 0.328369f, 0.343750f, 0.359863f, 0.376221f, 0.393066f, - 0.409668f, 0.426514f, 0.444336f, 0.461670f, 0.478760f, 0.496826f, 0.513672f, 0.532227f, - 0.549316f, 0.567383f, 0.584961f, 0.602051f, 0.620605f, 0.637207f, 0.655273f, 0.672363f, - 0.689941f, 0.708008f, 0.860840f, 0.864746f, 0.862793f, 0.859375f, 0.855957f, 0.853027f, - 0.002190f, 0.005993f, 0.010117f, 0.014420f, 0.018738f, 0.023361f, 0.028015f, 0.033142f, - 0.037781f, 0.043732f, 0.048920f, 0.054840f, 0.061218f, 0.067810f, 0.074219f, 0.081299f, - 0.088562f, 0.096130f, 0.104614f, 0.113098f, 0.122253f, 0.131714f, 0.141113f, 0.151245f, - 0.162109f, 0.173462f, 0.184692f, 0.196899f, 0.209473f, 0.222534f, 0.236206f, 0.249634f, - 0.263672f, 0.277588f, 0.293213f, 0.308350f, 0.323975f, 0.339844f, 0.355957f, 0.372070f, - 0.389404f, 0.405762f, 0.422852f, 0.439941f, 0.458008f, 0.475098f, 0.492920f, 0.510742f, - 0.528320f, 0.546875f, 0.564453f, 0.583496f, 0.601074f, 0.619141f, 0.636719f, 0.654785f, - 0.672852f, 0.691406f, 0.852539f, 0.858398f, 0.856445f, 0.853516f, 0.850586f, 0.847656f, - 0.001787f, 0.005753f, 0.009300f, 0.013611f, 0.017410f, 0.021576f, 0.025665f, 0.030533f, - 0.035126f, 0.040039f, 0.044952f, 0.050446f, 0.055817f, 0.061890f, 0.068054f, 0.074707f, - 0.081482f, 0.088501f, 0.095764f, 0.103943f, 0.112183f, 0.120850f, 0.130249f, 0.139526f, - 0.149658f, 0.160400f, 0.171021f, 0.182007f, 0.194336f, 0.206421f, 0.219360f, 0.232666f, - 0.245850f, 0.260010f, 0.274170f, 0.289307f, 0.304443f, 0.319580f, 0.335693f, 0.352295f, - 0.369141f, 0.385498f, 0.402344f, 0.419189f, 0.437012f, 0.454346f, 0.472412f, 0.490234f, - 0.507812f, 0.525879f, 0.545410f, 0.562500f, 0.581055f, 0.600098f, 0.618164f, 0.636719f, - 0.655273f, 0.674316f, 0.845703f, 0.852051f, 0.849609f, 0.847168f, 0.845215f, 0.841309f, - 0.001766f, 0.005241f, 0.008881f, 0.012024f, 0.016129f, 0.020233f, 0.024124f, 0.027664f, - 0.032135f, 0.036835f, 0.041321f, 0.046173f, 0.051392f, 0.056946f, 0.062225f, 0.068604f, - 0.074524f, 0.080933f, 0.088135f, 0.095398f, 0.103210f, 0.110779f, 0.119263f, 0.128296f, - 0.137695f, 0.147217f, 0.157349f, 0.168091f, 0.179688f, 0.191284f, 0.203613f, 0.215942f, - 0.228882f, 0.242554f, 0.255859f, 0.270508f, 0.285400f, 0.300537f, 0.316406f, 0.331787f, - 0.348877f, 0.364746f, 0.382080f, 0.398682f, 0.415771f, 0.434082f, 0.451416f, 0.469482f, - 0.487793f, 0.505859f, 0.524414f, 0.542969f, 0.562012f, 0.580566f, 0.598145f, 0.618652f, - 0.637695f, 0.657227f, 0.837891f, 0.844727f, 0.843750f, 0.841309f, 0.838379f, 0.836426f, - 0.001598f, 0.004887f, 0.008217f, 0.011497f, 0.014786f, 0.018326f, 0.021652f, 0.025513f, - 0.029541f, 0.033813f, 0.038086f, 0.042236f, 0.046844f, 0.052032f, 0.057251f, 0.062622f, - 0.068237f, 0.074280f, 0.080505f, 0.086975f, 0.094116f, 0.101074f, 0.109314f, 0.117554f, - 0.126587f, 0.135254f, 0.144775f, 0.155029f, 0.165405f, 0.176392f, 0.187744f, 0.199829f, - 0.212646f, 0.224976f, 0.238647f, 0.252441f, 0.267090f, 0.281738f, 0.296631f, 0.312256f, - 0.328369f, 0.344971f, 0.361328f, 0.377686f, 0.395264f, 0.412842f, 0.430908f, 0.448730f, - 0.467041f, 0.485596f, 0.503906f, 0.522461f, 0.541504f, 0.561523f, 0.580078f, 0.599121f, - 0.618164f, 0.639648f, 0.828613f, 0.837891f, 0.836914f, 0.834473f, 0.833008f, 0.830566f, - 0.001709f, 0.004494f, 0.007416f, 0.010628f, 0.013680f, 0.016785f, 0.020203f, 0.023712f, - 0.027435f, 0.031006f, 0.034424f, 0.038635f, 0.043182f, 0.047668f, 0.052307f, 0.057159f, - 0.062042f, 0.067749f, 0.073730f, 0.079956f, 0.086182f, 0.092773f, 0.100159f, 0.107727f, - 0.115479f, 0.123962f, 0.132935f, 0.142578f, 0.151978f, 0.162476f, 0.173340f, 0.184570f, - 0.196411f, 0.208740f, 0.221436f, 0.235229f, 0.248779f, 0.262939f, 0.277832f, 0.293213f, - 0.308105f, 0.324219f, 0.341309f, 0.357178f, 0.374756f, 0.391846f, 0.409424f, 0.427490f, - 0.446533f, 0.464844f, 0.483643f, 0.501953f, 0.521484f, 0.541504f, 0.561035f, 0.579590f, - 0.599609f, 0.620605f, 0.821289f, 0.830566f, 0.830078f, 0.828125f, 0.825684f, 0.823242f, - 0.001367f, 0.004105f, 0.007023f, 0.009552f, 0.012611f, 0.015289f, 0.018341f, 0.021652f, - 0.024857f, 0.027878f, 0.031769f, 0.035614f, 0.039276f, 0.043610f, 0.047333f, 0.052155f, - 0.056549f, 0.061401f, 0.066895f, 0.072449f, 0.078613f, 0.084778f, 0.091309f, 0.098083f, - 0.105774f, 0.113281f, 0.121399f, 0.130371f, 0.139648f, 0.148926f, 0.159546f, 0.169922f, - 0.180908f, 0.192749f, 0.204834f, 0.217651f, 0.231567f, 0.244385f, 0.259277f, 0.273926f, - 0.289307f, 0.304688f, 0.320557f, 0.336914f, 0.354248f, 0.371338f, 0.388184f, 0.406982f, - 0.424316f, 0.443115f, 0.462646f, 0.481445f, 0.501465f, 0.520508f, 0.541016f, 0.559570f, - 0.580078f, 0.601074f, 0.812988f, 0.823242f, 0.823242f, 0.821289f, 0.819824f, 0.817383f, - 0.001398f, 0.003883f, 0.006351f, 0.008911f, 0.011559f, 0.014343f, 0.017212f, 0.020035f, - 0.022797f, 0.026062f, 0.028793f, 0.031891f, 0.035858f, 0.039368f, 0.043213f, 0.047607f, - 0.051483f, 0.056030f, 0.060883f, 0.065979f, 0.071350f, 0.076843f, 0.083130f, 0.089172f, - 0.096069f, 0.103333f, 0.111023f, 0.119019f, 0.127319f, 0.136719f, 0.145996f, 0.156128f, - 0.166138f, 0.177368f, 0.189453f, 0.201416f, 0.213745f, 0.227295f, 0.240601f, 0.255371f, - 0.269287f, 0.285400f, 0.301270f, 0.317139f, 0.333740f, 0.350586f, 0.367920f, 0.385986f, - 0.404297f, 0.422852f, 0.442383f, 0.460938f, 0.479980f, 0.500488f, 0.520508f, 0.541016f, - 0.560547f, 0.582520f, 0.803711f, 0.814941f, 0.815430f, 0.814453f, 0.812500f, 0.810547f, - 0.001259f, 0.003464f, 0.006332f, 0.008286f, 0.010384f, 0.013000f, 0.015587f, 0.018234f, - 0.021027f, 0.023422f, 0.026566f, 0.029480f, 0.032379f, 0.035919f, 0.039215f, 0.043060f, - 0.046997f, 0.050995f, 0.055267f, 0.059998f, 0.065002f, 0.069946f, 0.075317f, 0.081299f, - 0.087280f, 0.094116f, 0.101135f, 0.108276f, 0.116150f, 0.124695f, 0.133545f, 0.142700f, - 0.152222f, 0.162720f, 0.173950f, 0.185303f, 0.197754f, 0.210205f, 0.223022f, 0.237061f, - 0.250732f, 0.265869f, 0.281250f, 0.297119f, 0.313477f, 0.330322f, 0.347656f, 0.364746f, - 0.383301f, 0.401367f, 0.420898f, 0.440186f, 0.459229f, 0.479736f, 0.499512f, 0.520996f, - 0.541016f, 0.562988f, 0.794434f, 0.807129f, 0.807617f, 0.807129f, 0.805176f, 0.803711f, - 0.001070f, 0.003237f, 0.005432f, 0.007359f, 0.009857f, 0.012337f, 0.014191f, 0.016586f, - 0.019257f, 0.021561f, 0.024094f, 0.026901f, 0.029724f, 0.032745f, 0.035675f, 0.039368f, - 0.042572f, 0.045990f, 0.050354f, 0.054535f, 0.058746f, 0.063232f, 0.068420f, 0.073608f, - 0.079529f, 0.085266f, 0.091370f, 0.098083f, 0.105835f, 0.113159f, 0.121094f, 0.129639f, - 0.139038f, 0.148926f, 0.159058f, 0.169678f, 0.181274f, 0.193481f, 0.205811f, 0.219482f, - 0.233032f, 0.247192f, 0.262207f, 0.277100f, 0.293213f, 0.309814f, 0.326660f, 0.344238f, - 0.361816f, 0.380615f, 0.398926f, 0.418945f, 0.438477f, 0.458008f, 0.479004f, 0.499512f, - 0.520996f, 0.543945f, 0.784668f, 0.798828f, 0.800293f, 0.799805f, 0.797852f, 0.796875f, - 0.001074f, 0.002916f, 0.004955f, 0.007149f, 0.009033f, 0.011055f, 0.013268f, 0.015495f, - 0.017365f, 0.019485f, 0.022095f, 0.024002f, 0.026688f, 0.029633f, 0.032593f, 0.035370f, - 0.038361f, 0.041870f, 0.045319f, 0.049225f, 0.052948f, 0.057068f, 0.061676f, 0.066345f, - 0.071167f, 0.076782f, 0.082581f, 0.088867f, 0.095886f, 0.102539f, 0.109802f, 0.118042f, - 0.126709f, 0.135132f, 0.144897f, 0.155151f, 0.165771f, 0.177368f, 0.189209f, 0.201904f, - 0.215210f, 0.229370f, 0.242798f, 0.258057f, 0.274170f, 0.290039f, 0.306885f, 0.323242f, - 0.341309f, 0.359375f, 0.378418f, 0.397461f, 0.416260f, 0.437500f, 0.457031f, 0.479004f, - 0.501465f, 0.522461f, 0.775391f, 0.790527f, 0.791992f, 0.791504f, 0.791016f, 0.789551f, - 0.000837f, 0.002916f, 0.004738f, 0.006477f, 0.008575f, 0.010170f, 0.012161f, 0.014023f, - 0.015808f, 0.017792f, 0.020111f, 0.022064f, 0.024414f, 0.026794f, 0.029251f, 0.032074f, - 0.034698f, 0.037598f, 0.040741f, 0.043915f, 0.047577f, 0.051361f, 0.055389f, 0.059692f, - 0.064209f, 0.068787f, 0.074585f, 0.079712f, 0.085632f, 0.092346f, 0.099487f, 0.106323f, - 0.114929f, 0.122925f, 0.131958f, 0.141235f, 0.151123f, 0.161865f, 0.172974f, 0.184937f, - 0.197632f, 0.210693f, 0.224854f, 0.239136f, 0.254395f, 0.269531f, 0.285889f, 0.302979f, - 0.320557f, 0.338623f, 0.356689f, 0.375977f, 0.395752f, 0.415527f, 0.436523f, 0.458252f, - 0.479248f, 0.501465f, 0.765137f, 0.781738f, 0.783691f, 0.784180f, 0.783203f, 0.781250f, - 0.000854f, 0.002817f, 0.004089f, 0.005684f, 0.007675f, 0.009277f, 0.010864f, 0.012413f, - 0.014427f, 0.016235f, 0.017838f, 0.019913f, 0.021805f, 0.023987f, 0.026276f, 0.028915f, - 0.030960f, 0.033875f, 0.036652f, 0.039551f, 0.042816f, 0.045837f, 0.049591f, 0.053589f, - 0.057526f, 0.061829f, 0.066650f, 0.071655f, 0.077393f, 0.083008f, 0.088989f, 0.096008f, - 0.103210f, 0.110657f, 0.119141f, 0.127930f, 0.137085f, 0.146973f, 0.157593f, 0.169312f, - 0.181274f, 0.193481f, 0.207031f, 0.220581f, 0.235229f, 0.250732f, 0.266357f, 0.282227f, - 0.299805f, 0.317627f, 0.335449f, 0.354736f, 0.374268f, 0.394531f, 0.415527f, 0.436279f, - 0.458252f, 0.481689f, 0.754883f, 0.773438f, 0.775391f, 0.775879f, 0.774902f, 0.773926f, - 0.000852f, 0.002520f, 0.003937f, 0.005527f, 0.006836f, 0.008408f, 0.009773f, 0.011620f, - 0.013039f, 0.014687f, 0.016327f, 0.017944f, 0.019760f, 0.021774f, 0.023697f, 0.025894f, - 0.027969f, 0.030121f, 0.032501f, 0.035370f, 0.038208f, 0.041046f, 0.044098f, 0.047791f, - 0.051453f, 0.055176f, 0.059570f, 0.064026f, 0.068787f, 0.074158f, 0.079834f, 0.085938f, - 0.092590f, 0.099304f, 0.106873f, 0.114990f, 0.124023f, 0.133301f, 0.143066f, 0.153687f, - 0.164551f, 0.176392f, 0.189209f, 0.202637f, 0.216553f, 0.231323f, 0.246704f, 0.262451f, - 0.279297f, 0.296387f, 0.314697f, 0.333496f, 0.353516f, 0.373047f, 0.394775f, 0.415039f, - 0.437500f, 0.460449f, 0.745117f, 0.763672f, 0.766602f, 0.767090f, 0.767090f, 0.765625f, - 0.000762f, 0.002342f, 0.003563f, 0.004787f, 0.006447f, 0.007648f, 0.009193f, 0.010353f, - 0.012016f, 0.013138f, 0.014557f, 0.016312f, 0.017929f, 0.019470f, 0.021103f, 0.023056f, - 0.024918f, 0.026886f, 0.029099f, 0.031586f, 0.034058f, 0.036499f, 0.039307f, 0.042450f, - 0.045685f, 0.049072f, 0.052826f, 0.056915f, 0.061096f, 0.065918f, 0.070984f, 0.076538f, - 0.082520f, 0.088928f, 0.095520f, 0.102905f, 0.111206f, 0.119629f, 0.128662f, 0.138184f, - 0.148682f, 0.160156f, 0.171997f, 0.184937f, 0.198364f, 0.212524f, 0.227173f, 0.243042f, - 0.259277f, 0.276611f, 0.294189f, 0.312500f, 0.331055f, 0.350830f, 0.372070f, 0.392334f, - 0.415771f, 0.438232f, 0.734375f, 0.754395f, 0.758789f, 0.758789f, 0.758789f, 0.757812f, - 0.000848f, 0.002024f, 0.003553f, 0.004646f, 0.005726f, 0.007050f, 0.008362f, 0.009438f, - 0.010536f, 0.011810f, 0.013123f, 0.014481f, 0.015778f, 0.017242f, 0.018753f, 0.020447f, - 0.022278f, 0.023819f, 0.025940f, 0.027771f, 0.029999f, 0.032410f, 0.034851f, 0.037354f, - 0.040375f, 0.043610f, 0.046631f, 0.050354f, 0.054108f, 0.058563f, 0.062805f, 0.067871f, - 0.073242f, 0.078796f, 0.085083f, 0.091797f, 0.098816f, 0.106689f, 0.115540f, 0.124207f, - 0.134155f, 0.144409f, 0.155762f, 0.167725f, 0.180664f, 0.193848f, 0.208618f, 0.223389f, - 0.239746f, 0.256104f, 0.273438f, 0.291260f, 0.310059f, 0.330078f, 0.349854f, 0.370850f, - 0.393555f, 0.416992f, 0.724121f, 0.744629f, 0.748535f, 0.750000f, 0.749512f, 0.749512f, - 0.000736f, 0.001780f, 0.002937f, 0.004314f, 0.005211f, 0.006214f, 0.007423f, 0.008537f, - 0.009392f, 0.010773f, 0.011726f, 0.012970f, 0.014183f, 0.015373f, 0.016724f, 0.017990f, - 0.019730f, 0.021194f, 0.022644f, 0.024368f, 0.026443f, 0.028610f, 0.030685f, 0.032898f, - 0.035583f, 0.038300f, 0.041351f, 0.044556f, 0.047638f, 0.051422f, 0.055359f, 0.059875f, - 0.064392f, 0.069580f, 0.075195f, 0.080872f, 0.087646f, 0.094849f, 0.102173f, 0.110596f, - 0.119690f, 0.129761f, 0.139893f, 0.151367f, 0.163452f, 0.176147f, 0.190063f, 0.204590f, - 0.219238f, 0.235718f, 0.252441f, 0.270264f, 0.289062f, 0.307861f, 0.328613f, 0.350098f, - 0.372314f, 0.395020f, 0.712402f, 0.734863f, 0.739746f, 0.740723f, 0.740723f, 0.740234f, - 0.000589f, 0.001616f, 0.002674f, 0.003841f, 0.004940f, 0.005676f, 0.006554f, 0.007442f, - 0.008812f, 0.009537f, 0.010277f, 0.011528f, 0.012634f, 0.013527f, 0.014671f, 0.016037f, - 0.017136f, 0.018631f, 0.019943f, 0.021530f, 0.023071f, 0.025146f, 0.026825f, 0.029037f, - 0.030853f, 0.033447f, 0.035736f, 0.038849f, 0.041656f, 0.044922f, 0.048462f, 0.052277f, - 0.056519f, 0.061127f, 0.065796f, 0.071411f, 0.077148f, 0.083435f, 0.090393f, 0.097900f, - 0.106079f, 0.115356f, 0.125122f, 0.135132f, 0.146729f, 0.158936f, 0.171509f, 0.185059f, - 0.200439f, 0.215576f, 0.232056f, 0.249756f, 0.267822f, 0.286621f, 0.306885f, 0.328125f, - 0.349854f, 0.373291f, 0.701172f, 0.725586f, 0.729980f, 0.730957f, 0.731934f, 0.730957f, - 0.000547f, 0.001666f, 0.002367f, 0.003559f, 0.004238f, 0.005028f, 0.005852f, 0.006859f, - 0.007755f, 0.008530f, 0.009163f, 0.010056f, 0.010956f, 0.011978f, 0.013062f, 0.014076f, - 0.015053f, 0.016251f, 0.017471f, 0.018921f, 0.020233f, 0.021774f, 0.023315f, 0.025162f, - 0.026871f, 0.029007f, 0.031204f, 0.033661f, 0.036102f, 0.039062f, 0.042053f, 0.045380f, - 0.048859f, 0.053040f, 0.057343f, 0.062225f, 0.067261f, 0.073120f, 0.079407f, 0.086243f, - 0.093567f, 0.101868f, 0.110596f, 0.120239f, 0.130859f, 0.141968f, 0.154053f, 0.167358f, - 0.181274f, 0.196045f, 0.212158f, 0.229248f, 0.247192f, 0.265381f, 0.285400f, 0.305664f, - 0.327637f, 0.350586f, 0.689453f, 0.715820f, 0.720215f, 0.722168f, 0.722168f, 0.722168f, - 0.000492f, 0.001634f, 0.002342f, 0.003111f, 0.003866f, 0.004574f, 0.005417f, 0.005928f, - 0.006588f, 0.007393f, 0.008041f, 0.008873f, 0.009689f, 0.010391f, 0.011375f, 0.012146f, - 0.013100f, 0.014183f, 0.015274f, 0.016479f, 0.017456f, 0.018768f, 0.020157f, 0.021606f, - 0.023300f, 0.024933f, 0.026855f, 0.028885f, 0.031143f, 0.033417f, 0.036133f, 0.039032f, - 0.042236f, 0.045776f, 0.049713f, 0.053680f, 0.058228f, 0.063232f, 0.069092f, 0.074829f, - 0.081482f, 0.089050f, 0.096924f, 0.105591f, 0.115417f, 0.126221f, 0.137329f, 0.149658f, - 0.162964f, 0.176880f, 0.192505f, 0.208740f, 0.226318f, 0.244873f, 0.263428f, 0.283936f, - 0.306396f, 0.329346f, 0.676270f, 0.705078f, 0.709961f, 0.711914f, 0.712891f, 0.711914f, - 0.000506f, 0.001342f, 0.002157f, 0.002813f, 0.003353f, 0.004105f, 0.004658f, 0.005344f, - 0.005871f, 0.006538f, 0.007050f, 0.007751f, 0.008247f, 0.009109f, 0.009865f, 0.010559f, - 0.011269f, 0.012169f, 0.013290f, 0.014191f, 0.015015f, 0.016312f, 0.017395f, 0.018570f, - 0.019989f, 0.021439f, 0.023102f, 0.024536f, 0.026535f, 0.028702f, 0.030899f, 0.033356f, - 0.035980f, 0.039093f, 0.042328f, 0.046051f, 0.049927f, 0.054199f, 0.059052f, 0.064575f, - 0.070496f, 0.076782f, 0.084412f, 0.092285f, 0.100708f, 0.110779f, 0.121399f, 0.132690f, - 0.145508f, 0.158813f, 0.173584f, 0.189453f, 0.205688f, 0.223755f, 0.242554f, 0.263184f, - 0.284180f, 0.306641f, 0.664551f, 0.693848f, 0.699707f, 0.702148f, 0.702637f, 0.703125f, - 0.000500f, 0.001122f, 0.001810f, 0.002363f, 0.002987f, 0.003576f, 0.004158f, 0.004620f, - 0.005032f, 0.005627f, 0.006161f, 0.006721f, 0.007179f, 0.007790f, 0.008385f, 0.009163f, - 0.009758f, 0.010536f, 0.011284f, 0.011986f, 0.012878f, 0.013710f, 0.014725f, 0.015823f, - 0.016937f, 0.018326f, 0.019547f, 0.020874f, 0.022522f, 0.024399f, 0.026077f, 0.028427f, - 0.030609f, 0.032990f, 0.035736f, 0.038788f, 0.042236f, 0.045990f, 0.050354f, 0.054901f, - 0.059967f, 0.065918f, 0.072205f, 0.079468f, 0.087219f, 0.096252f, 0.105713f, 0.116272f, - 0.128174f, 0.140747f, 0.154419f, 0.169556f, 0.186279f, 0.203125f, 0.221313f, 0.240601f, - 0.261719f, 0.284424f, 0.652344f, 0.683105f, 0.688965f, 0.691406f, 0.692383f, 0.693359f, - 0.000482f, 0.001184f, 0.001604f, 0.002171f, 0.002562f, 0.003029f, 0.003656f, 0.003941f, - 0.004410f, 0.004948f, 0.005325f, 0.005577f, 0.006157f, 0.006702f, 0.007172f, 0.007751f, - 0.008331f, 0.008904f, 0.009514f, 0.010063f, 0.010925f, 0.011719f, 0.012306f, 0.013321f, - 0.014275f, 0.015465f, 0.016510f, 0.017593f, 0.018845f, 0.020401f, 0.022095f, 0.023682f, - 0.025513f, 0.027679f, 0.029968f, 0.032593f, 0.035461f, 0.038757f, 0.042175f, 0.046326f, - 0.050873f, 0.055939f, 0.061462f, 0.067444f, 0.074402f, 0.082520f, 0.091125f, 0.100830f, - 0.111572f, 0.123413f, 0.136719f, 0.150513f, 0.165894f, 0.182251f, 0.200684f, 0.219727f, - 0.240234f, 0.261963f, 0.640137f, 0.671387f, 0.679199f, 0.680664f, 0.682617f, 0.683105f, - 0.000501f, 0.000919f, 0.001424f, 0.001853f, 0.002266f, 0.002789f, 0.002998f, 0.003397f, - 0.003902f, 0.004192f, 0.004417f, 0.004974f, 0.005207f, 0.005676f, 0.006134f, 0.006527f, - 0.007179f, 0.007465f, 0.008018f, 0.008537f, 0.009178f, 0.009888f, 0.010544f, 0.011093f, - 0.011986f, 0.012794f, 0.013664f, 0.014717f, 0.015747f, 0.016983f, 0.018127f, 0.019470f, - 0.021103f, 0.022919f, 0.024826f, 0.026962f, 0.029358f, 0.031769f, 0.035065f, 0.038239f, - 0.042297f, 0.046570f, 0.051422f, 0.056671f, 0.062805f, 0.069763f, 0.077698f, 0.086182f, - 0.095825f, 0.106812f, 0.119080f, 0.132568f, 0.147217f, 0.162598f, 0.180176f, 0.198730f, - 0.218628f, 0.241211f, 0.627441f, 0.660156f, 0.668457f, 0.669922f, 0.672363f, 0.671875f, - 0.000235f, 0.001120f, 0.001356f, 0.001651f, 0.002117f, 0.002441f, 0.002678f, 0.002993f, - 0.003244f, 0.003519f, 0.003876f, 0.004086f, 0.004505f, 0.004787f, 0.005085f, 0.005604f, - 0.005985f, 0.006271f, 0.006783f, 0.007145f, 0.007679f, 0.008217f, 0.008728f, 0.009277f, - 0.009956f, 0.010605f, 0.011490f, 0.012062f, 0.013084f, 0.013962f, 0.014984f, 0.016113f, - 0.017395f, 0.018829f, 0.020416f, 0.022125f, 0.023972f, 0.025955f, 0.028625f, 0.031616f, - 0.034515f, 0.038147f, 0.042114f, 0.046783f, 0.052094f, 0.058075f, 0.065002f, 0.072510f, - 0.081604f, 0.091125f, 0.102539f, 0.114807f, 0.128662f, 0.143921f, 0.160034f, 0.178467f, - 0.198364f, 0.218750f, 0.613281f, 0.648926f, 0.657227f, 0.659668f, 0.661621f, 0.661621f, - 0.000382f, 0.000704f, 0.001099f, 0.001557f, 0.001774f, 0.001976f, 0.002132f, 0.002575f, - 0.002634f, 0.002916f, 0.003103f, 0.003494f, 0.003754f, 0.003956f, 0.004269f, 0.004684f, - 0.004902f, 0.005234f, 0.005569f, 0.005890f, 0.006416f, 0.006786f, 0.007160f, 0.007645f, - 0.008118f, 0.008781f, 0.009346f, 0.010025f, 0.010658f, 0.011475f, 0.012230f, 0.013016f, - 0.014122f, 0.015251f, 0.016342f, 0.017807f, 0.019424f, 0.021103f, 0.023026f, 0.025436f, - 0.027817f, 0.030914f, 0.034210f, 0.037750f, 0.042450f, 0.047455f, 0.053101f, 0.059998f, - 0.067688f, 0.076660f, 0.086670f, 0.097961f, 0.110779f, 0.125366f, 0.140747f, 0.158081f, - 0.176880f, 0.197632f, 0.600098f, 0.637207f, 0.644531f, 0.647949f, 0.649414f, 0.651855f, - 0.000182f, 0.000738f, 0.000942f, 0.001220f, 0.001469f, 0.001634f, 0.001820f, 0.002005f, - 0.002291f, 0.002441f, 0.002636f, 0.002832f, 0.003019f, 0.003242f, 0.003502f, 0.003824f, - 0.004017f, 0.004333f, 0.004570f, 0.004883f, 0.005173f, 0.005615f, 0.005909f, 0.006317f, - 0.006649f, 0.007160f, 0.007656f, 0.008156f, 0.008583f, 0.009209f, 0.009857f, 0.010696f, - 0.011322f, 0.012367f, 0.013229f, 0.014259f, 0.015686f, 0.016815f, 0.018402f, 0.020126f, - 0.022095f, 0.024414f, 0.027176f, 0.030273f, 0.033722f, 0.038086f, 0.042969f, 0.048645f, - 0.055237f, 0.063171f, 0.071960f, 0.082031f, 0.093994f, 0.107300f, 0.122131f, 0.138550f, - 0.156494f, 0.177002f, 0.586426f, 0.625488f, 0.633789f, 0.637207f, 0.638672f, 0.639648f, - 0.000199f, 0.000534f, 0.000745f, 0.000995f, 0.001190f, 0.001387f, 0.001516f, 0.001691f, - 0.001790f, 0.001941f, 0.002214f, 0.002346f, 0.002449f, 0.002686f, 0.002832f, 0.003042f, - 0.003304f, 0.003531f, 0.003662f, 0.003952f, 0.004181f, 0.004517f, 0.004704f, 0.005074f, - 0.005352f, 0.005718f, 0.006096f, 0.006481f, 0.006947f, 0.007454f, 0.007988f, 0.008484f, - 0.009140f, 0.009804f, 0.010475f, 0.011307f, 0.012299f, 0.013268f, 0.014511f, 0.015823f, - 0.017410f, 0.018936f, 0.021225f, 0.023621f, 0.026367f, 0.029770f, 0.033661f, 0.038452f, - 0.044067f, 0.050812f, 0.058411f, 0.067444f, 0.077942f, 0.090149f, 0.104187f, 0.119812f, - 0.137085f, 0.156372f, 0.572754f, 0.613770f, 0.621582f, 0.625977f, 0.627441f, 0.628906f, - 0.000165f, 0.000486f, 0.000618f, 0.000880f, 0.001063f, 0.001140f, 0.001258f, 0.001464f, - 0.001498f, 0.001561f, 0.001707f, 0.001899f, 0.001976f, 0.002171f, 0.002285f, 0.002474f, - 0.002571f, 0.002764f, 0.002968f, 0.003170f, 0.003389f, 0.003580f, 0.003822f, 0.004036f, - 0.004269f, 0.004505f, 0.004738f, 0.005157f, 0.005474f, 0.005821f, 0.006279f, 0.006649f, - 0.007107f, 0.007610f, 0.008240f, 0.008835f, 0.009598f, 0.010361f, 0.011276f, 0.012299f, - 0.013466f, 0.014740f, 0.016251f, 0.018021f, 0.020294f, 0.022797f, 0.025833f, 0.029739f, - 0.034058f, 0.039612f, 0.046021f, 0.053833f, 0.063110f, 0.074158f, 0.086914f, 0.101562f, - 0.118164f, 0.136841f, 0.558594f, 0.601074f, 0.608887f, 0.613281f, 0.615234f, 0.617188f, - 0.000096f, 0.000348f, 0.000585f, 0.000707f, 0.000837f, 0.000866f, 0.000972f, 0.001095f, - 0.001198f, 0.001309f, 0.001355f, 0.001417f, 0.001615f, 0.001740f, 0.001863f, 0.001880f, - 0.002048f, 0.002159f, 0.002380f, 0.002487f, 0.002613f, 0.002777f, 0.003000f, 0.003143f, - 0.003353f, 0.003521f, 0.003748f, 0.003963f, 0.004265f, 0.004490f, 0.004776f, 0.005093f, - 0.005577f, 0.005966f, 0.006321f, 0.006828f, 0.007320f, 0.007904f, 0.008575f, 0.009392f, - 0.010231f, 0.011276f, 0.012321f, 0.013832f, 0.015343f, 0.017242f, 0.019501f, 0.022247f, - 0.025696f, 0.029922f, 0.035187f, 0.041779f, 0.049683f, 0.059387f, 0.070801f, 0.084106f, - 0.100037f, 0.117798f, 0.544434f, 0.588867f, 0.597656f, 0.602539f, 0.604492f, 0.605469f, - 0.000123f, 0.000248f, 0.000443f, 0.000625f, 0.000663f, 0.000733f, 0.000843f, 0.000780f, - 0.000921f, 0.000986f, 0.001081f, 0.001178f, 0.001254f, 0.001348f, 0.001364f, 0.001515f, - 0.001565f, 0.001705f, 0.001824f, 0.001870f, 0.002066f, 0.002155f, 0.002274f, 0.002422f, - 0.002525f, 0.002695f, 0.002863f, 0.003038f, 0.003271f, 0.003441f, 0.003736f, 0.003901f, - 0.004112f, 0.004478f, 0.004719f, 0.005093f, 0.005482f, 0.005913f, 0.006413f, 0.007019f, - 0.007626f, 0.008408f, 0.009201f, 0.010201f, 0.011436f, 0.012749f, 0.014389f, 0.016373f, - 0.018906f, 0.022034f, 0.025909f, 0.031082f, 0.037628f, 0.045715f, 0.055939f, 0.068176f, - 0.082764f, 0.099365f, 0.529785f, 0.574707f, 0.584961f, 0.589844f, 0.591797f, 0.593750f, - 0.000210f, 0.000212f, 0.000365f, 0.000494f, 0.000438f, 0.000597f, 0.000538f, 0.000623f, - 0.000638f, 0.000736f, 0.000866f, 0.000882f, 0.000954f, 0.001040f, 0.001070f, 0.001086f, - 0.001220f, 0.001274f, 0.001341f, 0.001457f, 0.001513f, 0.001598f, 0.001697f, 0.001781f, - 0.001898f, 0.001970f, 0.002131f, 0.002241f, 0.002401f, 0.002645f, 0.002783f, 0.002892f, - 0.003120f, 0.003347f, 0.003508f, 0.003757f, 0.004032f, 0.004314f, 0.004688f, 0.005066f, - 0.005520f, 0.006012f, 0.006702f, 0.007332f, 0.008171f, 0.009140f, 0.010399f, 0.011787f, - 0.013496f, 0.015732f, 0.018509f, 0.022278f, 0.027267f, 0.033813f, 0.042328f, 0.053070f, - 0.066406f, 0.082825f, 0.516602f, 0.562500f, 0.573242f, 0.577637f, 0.580078f, 0.581543f, - 0.000000f, 0.000216f, 0.000281f, 0.000346f, 0.000374f, 0.000388f, 0.000491f, 0.000416f, - 0.000516f, 0.000535f, 0.000635f, 0.000625f, 0.000681f, 0.000719f, 0.000790f, 0.000813f, - 0.000879f, 0.000926f, 0.000968f, 0.001004f, 0.001097f, 0.001135f, 0.001229f, 0.001300f, - 0.001361f, 0.001431f, 0.001541f, 0.001610f, 0.001711f, 0.001802f, 0.001922f, 0.002094f, - 0.002169f, 0.002346f, 0.002468f, 0.002644f, 0.002844f, 0.003094f, 0.003368f, 0.003586f, - 0.003883f, 0.004223f, 0.004662f, 0.005093f, 0.005680f, 0.006348f, 0.007206f, 0.008202f, - 0.009392f, 0.010895f, 0.012939f, 0.015465f, 0.018906f, 0.023682f, 0.030502f, 0.039825f, - 0.051331f, 0.066528f, 0.500977f, 0.548828f, 0.560059f, 0.564453f, 0.567871f, 0.569336f, - 0.000000f, 0.000106f, 0.000201f, 0.000252f, 0.000251f, 0.000322f, 0.000281f, 0.000340f, - 0.000359f, 0.000428f, 0.000443f, 0.000419f, 0.000444f, 0.000500f, 0.000524f, 0.000590f, - 0.000574f, 0.000650f, 0.000693f, 0.000732f, 0.000778f, 0.000821f, 0.000848f, 0.000900f, - 0.000965f, 0.000982f, 0.001072f, 0.001109f, 0.001169f, 0.001307f, 0.001301f, 0.001409f, - 0.001483f, 0.001610f, 0.001734f, 0.001835f, 0.001940f, 0.002098f, 0.002241f, 0.002426f, - 0.002634f, 0.002865f, 0.003136f, 0.003431f, 0.003763f, 0.004211f, 0.004742f, 0.005417f, - 0.006229f, 0.007298f, 0.008621f, 0.010330f, 0.012650f, 0.015808f, 0.020569f, 0.027908f, - 0.037994f, 0.051514f, 0.485840f, 0.536133f, 0.547363f, 0.551758f, 0.554688f, 0.557617f, - 0.000026f, 0.000156f, 0.000201f, 0.000136f, 0.000188f, 0.000187f, 0.000192f, 0.000240f, - 0.000245f, 0.000254f, 0.000262f, 0.000311f, 0.000309f, 0.000331f, 0.000374f, 0.000385f, - 0.000411f, 0.000431f, 0.000443f, 0.000461f, 0.000507f, 0.000522f, 0.000562f, 0.000596f, - 0.000634f, 0.000684f, 0.000718f, 0.000735f, 0.000776f, 0.000815f, 0.000875f, 0.000927f, - 0.000982f, 0.001053f, 0.001123f, 0.001162f, 0.001271f, 0.001346f, 0.001473f, 0.001577f, - 0.001670f, 0.001838f, 0.002005f, 0.002161f, 0.002405f, 0.002670f, 0.002993f, 0.003399f, - 0.003860f, 0.004528f, 0.005386f, 0.006523f, 0.008003f, 0.010063f, 0.013206f, 0.017990f, - 0.026031f, 0.038086f, 0.471191f, 0.522949f, 0.534668f, 0.540039f, 0.543457f, 0.544922f, - 0.000000f, 0.000093f, 0.000084f, 0.000085f, 0.000124f, 0.000145f, 0.000122f, 0.000149f, - 0.000152f, 0.000152f, 0.000158f, 0.000167f, 0.000186f, 0.000209f, 0.000217f, 0.000225f, - 0.000231f, 0.000272f, 0.000273f, 0.000301f, 0.000303f, 0.000310f, 0.000338f, 0.000361f, - 0.000387f, 0.000423f, 0.000413f, 0.000436f, 0.000478f, 0.000503f, 0.000525f, 0.000570f, - 0.000608f, 0.000626f, 0.000677f, 0.000706f, 0.000753f, 0.000813f, 0.000884f, 0.000929f, - 0.001000f, 0.001094f, 0.001183f, 0.001302f, 0.001412f, 0.001563f, 0.001769f, 0.001974f, - 0.002277f, 0.002626f, 0.003124f, 0.003761f, 0.004665f, 0.005993f, 0.007935f, 0.010818f, - 0.016205f, 0.026138f, 0.456299f, 0.509277f, 0.520996f, 0.527344f, 0.530762f, 0.532715f, - 0.000105f, 0.000083f, 0.000072f, 0.000065f, 0.000071f, 0.000072f, 0.000077f, 0.000084f, - 0.000088f, 0.000093f, 0.000095f, 0.000120f, 0.000100f, 0.000108f, 0.000126f, 0.000118f, - 0.000139f, 0.000149f, 0.000153f, 0.000165f, 0.000169f, 0.000172f, 0.000194f, 0.000203f, - 0.000233f, 0.000225f, 0.000233f, 0.000253f, 0.000266f, 0.000275f, 0.000299f, 0.000319f, - 0.000338f, 0.000345f, 0.000374f, 0.000384f, 0.000415f, 0.000448f, 0.000483f, 0.000511f, - 0.000543f, 0.000585f, 0.000647f, 0.000692f, 0.000755f, 0.000827f, 0.000924f, 0.001041f, - 0.001186f, 0.001372f, 0.001608f, 0.001953f, 0.002411f, 0.003098f, 0.004238f, 0.005989f, - 0.009003f, 0.016006f, 0.441406f, 0.495361f, 0.508301f, 0.514160f, 0.518066f, 0.520508f, - 0.000090f, 0.000067f, 0.000058f, 0.000052f, 0.000047f, 0.000044f, 0.000044f, 0.000040f, - 0.000042f, 0.000049f, 0.000042f, 0.000045f, 0.000059f, 0.000047f, 0.000050f, 0.000054f, - 0.000071f, 0.000073f, 0.000075f, 0.000078f, 0.000079f, 0.000084f, 0.000087f, 0.000090f, - 0.000097f, 0.000109f, 0.000108f, 0.000124f, 0.000124f, 0.000131f, 0.000138f, 0.000143f, - 0.000155f, 0.000164f, 0.000178f, 0.000182f, 0.000192f, 0.000209f, 0.000225f, 0.000244f, - 0.000259f, 0.000274f, 0.000303f, 0.000321f, 0.000357f, 0.000385f, 0.000429f, 0.000470f, - 0.000537f, 0.000608f, 0.000710f, 0.000852f, 0.001052f, 0.001371f, 0.001877f, 0.002762f, - 0.004406f, 0.008202f, 0.426270f, 0.483154f, 0.495605f, 0.500977f, 0.505371f, 0.507324f, - 0.000067f, 0.000047f, 0.000039f, 0.000035f, 0.000032f, 0.000030f, 0.000029f, 0.000027f, - 0.000026f, 0.000025f, 0.000024f, 0.000023f, 0.000021f, 0.000020f, 0.000019f, 0.000021f, - 0.000020f, 0.000024f, 0.000028f, 0.000030f, 0.000029f, 0.000032f, 0.000035f, 0.000034f, - 0.000036f, 0.000044f, 0.000046f, 0.000040f, 0.000048f, 0.000047f, 0.000051f, 0.000053f, - 0.000059f, 0.000059f, 0.000064f, 0.000066f, 0.000077f, 0.000079f, 0.000081f, 0.000091f, - 0.000094f, 0.000100f, 0.000108f, 0.000119f, 0.000129f, 0.000137f, 0.000148f, 0.000173f, - 0.000191f, 0.000210f, 0.000249f, 0.000292f, 0.000357f, 0.000448f, 0.000629f, 0.000943f, - 0.001630f, 0.003332f, 0.411377f, 0.468506f, 0.482910f, 0.488770f, 0.492188f, 0.495117f, - 0.000025f, 0.000018f, 0.000015f, 0.000013f, 0.000014f, 0.000013f, 0.000012f, 0.000012f, - 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, - 0.000011f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000009f, 0.000008f, 0.000008f, - 0.000008f, 0.000008f, 0.000008f, 0.000007f, 0.000008f, 0.000010f, 0.000010f, 0.000010f, - 0.000012f, 0.000014f, 0.000014f, 0.000014f, 0.000016f, 0.000018f, 0.000019f, 0.000021f, - 0.000020f, 0.000023f, 0.000025f, 0.000027f, 0.000027f, 0.000029f, 0.000035f, 0.000033f, - 0.000040f, 0.000044f, 0.000052f, 0.000061f, 0.000069f, 0.000087f, 0.000117f, 0.000174f, - 0.000319f, 0.000847f, 0.395996f, 0.454834f, 0.468750f, 0.475586f, 0.479004f, 0.481689f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, - 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, - 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000004f, 0.000004f, 0.000005f, - 0.000009f, 0.000027f, 0.381348f, 0.441406f, 0.455566f, 0.462891f, 0.466309f, 0.468994f, - }, - { - 0.016769f, 0.050629f, 0.083740f, 0.116638f, 0.148071f, 0.178955f, 0.208374f, 0.236938f, - 0.265137f, 0.291992f, 0.317871f, 0.343994f, 0.368164f, 0.391846f, 0.415527f, 0.437988f, - 0.459717f, 0.480469f, 0.501465f, 0.520996f, 0.540527f, 0.559082f, 0.577637f, 0.594727f, - 0.612305f, 0.628418f, 0.644531f, 0.661133f, 0.676270f, 0.691406f, 0.705566f, 0.719727f, - 0.734375f, 0.747070f, 0.760254f, 0.773438f, 0.786133f, 0.798828f, 0.810059f, 0.821777f, - 0.833008f, 0.843262f, 0.854492f, 0.865234f, 0.875488f, 0.885254f, 0.895508f, 0.904297f, - 0.913574f, 0.923340f, 0.932617f, 0.940918f, 0.949707f, 0.958008f, 0.966309f, 0.974609f, - 0.981934f, 0.990234f, 0.985352f, 0.965332f, 0.950195f, 0.937500f, 0.926270f, 0.915527f, - 0.015083f, 0.045929f, 0.075806f, 0.105408f, 0.135254f, 0.163208f, 0.191772f, 0.219238f, - 0.245239f, 0.271973f, 0.297363f, 0.321045f, 0.345947f, 0.369141f, 0.391846f, 0.414062f, - 0.435791f, 0.456787f, 0.477295f, 0.497314f, 0.516113f, 0.535645f, 0.554199f, 0.571777f, - 0.588867f, 0.606445f, 0.623047f, 0.639160f, 0.654785f, 0.669434f, 0.685059f, 0.699219f, - 0.713379f, 0.728027f, 0.741211f, 0.754883f, 0.767578f, 0.780273f, 0.792480f, 0.804688f, - 0.815918f, 0.826660f, 0.838867f, 0.850098f, 0.859863f, 0.871094f, 0.880859f, 0.891113f, - 0.900879f, 0.909180f, 0.919434f, 0.929688f, 0.937500f, 0.946289f, 0.954590f, 0.963379f, - 0.971191f, 0.979004f, 0.980469f, 0.961426f, 0.947266f, 0.935059f, 0.924316f, 0.914062f, - 0.013573f, 0.040955f, 0.068848f, 0.096313f, 0.123169f, 0.150635f, 0.175537f, 0.202026f, - 0.228271f, 0.251709f, 0.276367f, 0.300781f, 0.323730f, 0.347168f, 0.369385f, 0.390625f, - 0.412354f, 0.433594f, 0.454346f, 0.473145f, 0.491943f, 0.512207f, 0.529785f, 0.549316f, - 0.566406f, 0.583008f, 0.600586f, 0.616211f, 0.633301f, 0.648438f, 0.663574f, 0.679199f, - 0.693359f, 0.708008f, 0.721680f, 0.735840f, 0.748535f, 0.762207f, 0.773926f, 0.786621f, - 0.798340f, 0.811035f, 0.822754f, 0.833984f, 0.845215f, 0.855957f, 0.865723f, 0.876465f, - 0.886719f, 0.895508f, 0.906738f, 0.916016f, 0.925293f, 0.934570f, 0.943848f, 0.952148f, - 0.960449f, 0.969238f, 0.976074f, 0.958008f, 0.944336f, 0.932617f, 0.921875f, 0.912109f, - 0.012329f, 0.037201f, 0.062164f, 0.087646f, 0.112488f, 0.137451f, 0.161865f, 0.187134f, - 0.210938f, 0.234253f, 0.258301f, 0.281006f, 0.303467f, 0.325195f, 0.347656f, 0.368652f, - 0.389648f, 0.410400f, 0.430664f, 0.450928f, 0.470215f, 0.488770f, 0.507812f, 0.525391f, - 0.543457f, 0.560059f, 0.579102f, 0.593750f, 0.611816f, 0.627441f, 0.643066f, 0.658203f, - 0.672363f, 0.687500f, 0.702148f, 0.715820f, 0.729004f, 0.742676f, 0.755371f, 0.768066f, - 0.781738f, 0.792969f, 0.805176f, 0.816895f, 0.829102f, 0.839844f, 0.850586f, 0.861816f, - 0.872559f, 0.882812f, 0.893066f, 0.902832f, 0.912109f, 0.921875f, 0.930664f, 0.940430f, - 0.948242f, 0.958008f, 0.970703f, 0.953613f, 0.940430f, 0.929199f, 0.919434f, 0.910156f, - 0.010979f, 0.033752f, 0.056763f, 0.080139f, 0.103516f, 0.126221f, 0.149414f, 0.172485f, - 0.195435f, 0.218262f, 0.240356f, 0.261719f, 0.284180f, 0.306396f, 0.326416f, 0.347900f, - 0.368408f, 0.389160f, 0.408691f, 0.427979f, 0.447754f, 0.467041f, 0.484863f, 0.502441f, - 0.520996f, 0.538086f, 0.555664f, 0.573242f, 0.589355f, 0.604980f, 0.622559f, 0.637207f, - 0.652832f, 0.666992f, 0.680664f, 0.695801f, 0.710938f, 0.724121f, 0.737305f, 0.750977f, - 0.763672f, 0.776855f, 0.789062f, 0.799805f, 0.812012f, 0.824219f, 0.835449f, 0.846680f, - 0.857910f, 0.868164f, 0.878418f, 0.889160f, 0.898926f, 0.909180f, 0.917969f, 0.928223f, - 0.937012f, 0.946777f, 0.965820f, 0.949707f, 0.937012f, 0.926270f, 0.916504f, 0.907715f, - 0.009941f, 0.030746f, 0.051514f, 0.073181f, 0.094116f, 0.116028f, 0.137817f, 0.158691f, - 0.180664f, 0.202637f, 0.223511f, 0.244873f, 0.265869f, 0.285889f, 0.307129f, 0.327881f, - 0.347412f, 0.367188f, 0.387207f, 0.405762f, 0.425537f, 0.444092f, 0.462646f, 0.481201f, - 0.499756f, 0.516602f, 0.533691f, 0.550781f, 0.567383f, 0.583984f, 0.599609f, 0.616211f, - 0.630859f, 0.647461f, 0.661621f, 0.676758f, 0.689453f, 0.704590f, 0.718750f, 0.731934f, - 0.745117f, 0.757812f, 0.770996f, 0.783691f, 0.796387f, 0.807617f, 0.819824f, 0.831543f, - 0.842773f, 0.854004f, 0.864258f, 0.875488f, 0.885742f, 0.895508f, 0.905762f, 0.915527f, - 0.925781f, 0.934570f, 0.960449f, 0.945312f, 0.933594f, 0.922852f, 0.913574f, 0.905273f, - 0.009003f, 0.027756f, 0.046997f, 0.066711f, 0.085999f, 0.106506f, 0.127075f, 0.146973f, - 0.166992f, 0.187500f, 0.207886f, 0.228149f, 0.248169f, 0.268311f, 0.287842f, 0.307861f, - 0.327393f, 0.347656f, 0.365967f, 0.385010f, 0.404541f, 0.422363f, 0.441162f, 0.458740f, - 0.477783f, 0.495117f, 0.512207f, 0.529297f, 0.546387f, 0.562012f, 0.578613f, 0.595215f, - 0.610840f, 0.625977f, 0.641113f, 0.656738f, 0.670410f, 0.685059f, 0.699707f, 0.714355f, - 0.727051f, 0.741699f, 0.752441f, 0.767090f, 0.778809f, 0.791504f, 0.803711f, 0.815430f, - 0.827148f, 0.838867f, 0.850098f, 0.860840f, 0.872070f, 0.881836f, 0.893066f, 0.903809f, - 0.913574f, 0.923828f, 0.955078f, 0.940918f, 0.929199f, 0.919922f, 0.911133f, 0.902344f, - 0.008469f, 0.025375f, 0.043121f, 0.060944f, 0.079468f, 0.097961f, 0.116394f, 0.135620f, - 0.154541f, 0.174072f, 0.193115f, 0.212280f, 0.231689f, 0.250732f, 0.270264f, 0.289307f, - 0.307861f, 0.327148f, 0.345215f, 0.364990f, 0.382812f, 0.401123f, 0.418945f, 0.437012f, - 0.455811f, 0.472900f, 0.490234f, 0.507812f, 0.524414f, 0.541016f, 0.558105f, 0.573242f, - 0.590332f, 0.605469f, 0.620117f, 0.636230f, 0.651367f, 0.665039f, 0.679688f, 0.694336f, - 0.708496f, 0.722168f, 0.735840f, 0.750000f, 0.762695f, 0.774902f, 0.787598f, 0.798828f, - 0.811523f, 0.823730f, 0.834473f, 0.846191f, 0.857910f, 0.868652f, 0.879883f, 0.891113f, - 0.900391f, 0.911133f, 0.949219f, 0.937012f, 0.925293f, 0.916016f, 0.907227f, 0.899414f, - 0.007618f, 0.023178f, 0.039490f, 0.055542f, 0.072937f, 0.090271f, 0.107605f, 0.125122f, - 0.142944f, 0.160889f, 0.178955f, 0.197510f, 0.216553f, 0.234497f, 0.252686f, 0.271240f, - 0.289795f, 0.307861f, 0.326172f, 0.344238f, 0.362549f, 0.380859f, 0.398438f, 0.416504f, - 0.433838f, 0.452393f, 0.468994f, 0.485840f, 0.502930f, 0.519531f, 0.536133f, 0.553223f, - 0.569336f, 0.584473f, 0.599609f, 0.615234f, 0.631348f, 0.646484f, 0.659668f, 0.675293f, - 0.689941f, 0.703125f, 0.716797f, 0.730957f, 0.744141f, 0.756836f, 0.771484f, 0.782227f, - 0.795898f, 0.807617f, 0.819824f, 0.831543f, 0.843750f, 0.854980f, 0.866211f, 0.877441f, - 0.888672f, 0.898438f, 0.943359f, 0.931641f, 0.921387f, 0.912109f, 0.903809f, 0.896484f, - 0.007118f, 0.021255f, 0.035889f, 0.051514f, 0.066895f, 0.083191f, 0.098999f, 0.115540f, - 0.132324f, 0.149292f, 0.166260f, 0.183716f, 0.200928f, 0.218628f, 0.236084f, 0.253906f, - 0.272217f, 0.289795f, 0.307617f, 0.325439f, 0.342529f, 0.360596f, 0.378906f, 0.395996f, - 0.413330f, 0.430908f, 0.447510f, 0.465332f, 0.481934f, 0.497803f, 0.514648f, 0.531738f, - 0.547852f, 0.562988f, 0.579102f, 0.595215f, 0.610840f, 0.625977f, 0.641113f, 0.655273f, - 0.670410f, 0.685059f, 0.698730f, 0.712891f, 0.726074f, 0.739258f, 0.753418f, 0.766113f, - 0.779785f, 0.791992f, 0.803711f, 0.816406f, 0.829102f, 0.839844f, 0.852539f, 0.863770f, - 0.874512f, 0.886719f, 0.937988f, 0.926758f, 0.917480f, 0.908203f, 0.900391f, 0.893066f, - 0.006481f, 0.019775f, 0.032928f, 0.047272f, 0.061371f, 0.076233f, 0.091064f, 0.107117f, - 0.122559f, 0.138062f, 0.154663f, 0.170532f, 0.187256f, 0.204346f, 0.220947f, 0.237915f, - 0.254883f, 0.272217f, 0.289062f, 0.306641f, 0.323730f, 0.341064f, 0.358643f, 0.375732f, - 0.393555f, 0.410645f, 0.426758f, 0.444580f, 0.461182f, 0.477783f, 0.494141f, 0.510254f, - 0.526855f, 0.543457f, 0.559082f, 0.574219f, 0.590332f, 0.605957f, 0.621094f, 0.634766f, - 0.650879f, 0.665039f, 0.679688f, 0.694824f, 0.708008f, 0.722656f, 0.736816f, 0.749023f, - 0.762695f, 0.775391f, 0.788086f, 0.801270f, 0.813965f, 0.826172f, 0.838379f, 0.849121f, - 0.861328f, 0.873535f, 0.932129f, 0.921875f, 0.912598f, 0.904297f, 0.896484f, 0.889160f, - 0.005924f, 0.017899f, 0.030426f, 0.043427f, 0.056824f, 0.070435f, 0.084106f, 0.098755f, - 0.112976f, 0.128052f, 0.143311f, 0.158936f, 0.174072f, 0.189575f, 0.206421f, 0.222534f, - 0.238403f, 0.255615f, 0.271729f, 0.288818f, 0.305908f, 0.322021f, 0.339355f, 0.356445f, - 0.373291f, 0.390137f, 0.407227f, 0.423584f, 0.440430f, 0.457031f, 0.472900f, 0.489502f, - 0.506836f, 0.521973f, 0.538574f, 0.554688f, 0.570312f, 0.585449f, 0.601074f, 0.616211f, - 0.631348f, 0.646484f, 0.661621f, 0.675781f, 0.690430f, 0.704590f, 0.717285f, 0.731934f, - 0.746094f, 0.759277f, 0.771973f, 0.785156f, 0.798340f, 0.810547f, 0.823242f, 0.835938f, - 0.848145f, 0.860352f, 0.925781f, 0.916504f, 0.908203f, 0.900391f, 0.893066f, 0.886719f, - 0.005573f, 0.016693f, 0.028366f, 0.040192f, 0.052277f, 0.064880f, 0.078064f, 0.090698f, - 0.105042f, 0.118591f, 0.133057f, 0.147461f, 0.162231f, 0.177612f, 0.192383f, 0.207886f, - 0.223633f, 0.239502f, 0.255615f, 0.272217f, 0.288330f, 0.304932f, 0.320312f, 0.337646f, - 0.354004f, 0.369873f, 0.386719f, 0.403320f, 0.419922f, 0.437012f, 0.453369f, 0.469482f, - 0.485596f, 0.501465f, 0.517578f, 0.534180f, 0.549316f, 0.565918f, 0.581055f, 0.595703f, - 0.611328f, 0.626953f, 0.641602f, 0.657227f, 0.671387f, 0.686523f, 0.699707f, 0.714355f, - 0.729004f, 0.742676f, 0.756348f, 0.769043f, 0.782715f, 0.795410f, 0.809082f, 0.821289f, - 0.833984f, 0.846680f, 0.919434f, 0.911133f, 0.903320f, 0.895508f, 0.888672f, 0.882324f, - 0.005016f, 0.015396f, 0.026169f, 0.037231f, 0.048126f, 0.059937f, 0.071716f, 0.084167f, - 0.096680f, 0.109558f, 0.123169f, 0.136719f, 0.150269f, 0.164917f, 0.179077f, 0.194580f, - 0.208984f, 0.223877f, 0.239746f, 0.255127f, 0.270996f, 0.286377f, 0.302490f, 0.319336f, - 0.335205f, 0.351318f, 0.367432f, 0.383545f, 0.399902f, 0.415771f, 0.432373f, 0.448975f, - 0.465088f, 0.481934f, 0.497314f, 0.513672f, 0.529785f, 0.544434f, 0.561035f, 0.576660f, - 0.592285f, 0.607422f, 0.622559f, 0.638184f, 0.652344f, 0.667480f, 0.681641f, 0.696777f, - 0.711426f, 0.725586f, 0.738770f, 0.753418f, 0.766602f, 0.779297f, 0.793945f, 0.807129f, - 0.819824f, 0.833008f, 0.913086f, 0.906738f, 0.898438f, 0.890625f, 0.884277f, 0.878418f, - 0.004738f, 0.014053f, 0.024017f, 0.033752f, 0.044495f, 0.055328f, 0.066467f, 0.078064f, - 0.089661f, 0.102051f, 0.114258f, 0.126831f, 0.139771f, 0.153564f, 0.167114f, 0.181030f, - 0.195190f, 0.209839f, 0.224731f, 0.239136f, 0.253906f, 0.269531f, 0.285156f, 0.300293f, - 0.317139f, 0.332520f, 0.348145f, 0.364990f, 0.380859f, 0.396240f, 0.412109f, 0.428711f, - 0.444336f, 0.460938f, 0.477295f, 0.492676f, 0.509277f, 0.524902f, 0.540527f, 0.556641f, - 0.572266f, 0.587402f, 0.604004f, 0.618164f, 0.633301f, 0.648438f, 0.664062f, 0.678223f, - 0.693359f, 0.708008f, 0.722656f, 0.736328f, 0.750000f, 0.764160f, 0.777832f, 0.791016f, - 0.805176f, 0.817871f, 0.907227f, 0.900879f, 0.894043f, 0.886719f, 0.880371f, 0.874512f, - 0.004105f, 0.012741f, 0.022491f, 0.031769f, 0.041107f, 0.051208f, 0.061249f, 0.071777f, - 0.083069f, 0.093811f, 0.105896f, 0.117554f, 0.129761f, 0.142212f, 0.155273f, 0.168579f, - 0.182251f, 0.196167f, 0.210449f, 0.223755f, 0.238525f, 0.253662f, 0.268799f, 0.283447f, - 0.298828f, 0.313965f, 0.329834f, 0.344971f, 0.361328f, 0.376953f, 0.393066f, 0.408691f, - 0.424561f, 0.441406f, 0.457031f, 0.472656f, 0.488770f, 0.504883f, 0.520996f, 0.536133f, - 0.551758f, 0.567871f, 0.583496f, 0.599121f, 0.614258f, 0.629395f, 0.645996f, 0.660156f, - 0.675781f, 0.689453f, 0.704102f, 0.719727f, 0.733398f, 0.747559f, 0.761719f, 0.776367f, - 0.789062f, 0.803223f, 0.899902f, 0.895020f, 0.888184f, 0.881836f, 0.875488f, 0.870117f, - 0.003925f, 0.011978f, 0.020538f, 0.028763f, 0.038269f, 0.047028f, 0.056732f, 0.066223f, - 0.076904f, 0.086731f, 0.097900f, 0.109314f, 0.120483f, 0.132324f, 0.144653f, 0.156982f, - 0.169678f, 0.183228f, 0.196289f, 0.209961f, 0.223633f, 0.237427f, 0.251953f, 0.266602f, - 0.281982f, 0.296875f, 0.312012f, 0.326660f, 0.342041f, 0.357910f, 0.373779f, 0.389404f, - 0.404785f, 0.420166f, 0.436768f, 0.452637f, 0.468506f, 0.484863f, 0.500977f, 0.516602f, - 0.531738f, 0.546875f, 0.563965f, 0.579102f, 0.595215f, 0.610840f, 0.625977f, 0.641602f, - 0.657227f, 0.671387f, 0.687500f, 0.702148f, 0.716309f, 0.731445f, 0.746094f, 0.760742f, - 0.774414f, 0.788086f, 0.893066f, 0.889648f, 0.882812f, 0.876953f, 0.870605f, 0.865723f, - 0.003704f, 0.011169f, 0.019165f, 0.026550f, 0.035339f, 0.043488f, 0.052277f, 0.061066f, - 0.071045f, 0.080933f, 0.090576f, 0.101074f, 0.111877f, 0.122925f, 0.134277f, 0.146118f, - 0.157837f, 0.170288f, 0.183105f, 0.195557f, 0.209351f, 0.222900f, 0.236328f, 0.250732f, - 0.264893f, 0.279297f, 0.294189f, 0.308838f, 0.323975f, 0.339844f, 0.354736f, 0.370117f, - 0.385986f, 0.401367f, 0.416504f, 0.432861f, 0.448486f, 0.463867f, 0.480469f, 0.497070f, - 0.511719f, 0.527832f, 0.544434f, 0.559570f, 0.575684f, 0.591797f, 0.606934f, 0.623047f, - 0.638184f, 0.654297f, 0.668945f, 0.684570f, 0.699219f, 0.714355f, 0.729492f, 0.744629f, - 0.758789f, 0.773926f, 0.886230f, 0.883301f, 0.877441f, 0.871582f, 0.866211f, 0.860840f, - 0.003500f, 0.010292f, 0.017395f, 0.024963f, 0.032440f, 0.040344f, 0.048462f, 0.057098f, - 0.065063f, 0.074646f, 0.083679f, 0.093445f, 0.103882f, 0.114136f, 0.124451f, 0.135498f, - 0.146606f, 0.158447f, 0.170410f, 0.182739f, 0.195435f, 0.208008f, 0.221558f, 0.234863f, - 0.248657f, 0.262695f, 0.276855f, 0.291748f, 0.306152f, 0.320801f, 0.335693f, 0.350830f, - 0.365967f, 0.382080f, 0.396973f, 0.413330f, 0.429199f, 0.444336f, 0.459473f, 0.476074f, - 0.492188f, 0.507812f, 0.524414f, 0.540039f, 0.555664f, 0.571777f, 0.586914f, 0.604004f, - 0.619629f, 0.635742f, 0.650391f, 0.666504f, 0.682129f, 0.697754f, 0.712891f, 0.728027f, - 0.743164f, 0.758301f, 0.878906f, 0.877441f, 0.871582f, 0.866699f, 0.860840f, 0.856445f, - 0.003084f, 0.009697f, 0.016403f, 0.022659f, 0.029892f, 0.037354f, 0.044281f, 0.052338f, - 0.060516f, 0.068970f, 0.077515f, 0.086243f, 0.096069f, 0.105713f, 0.115356f, 0.125610f, - 0.136353f, 0.147339f, 0.158081f, 0.170410f, 0.181396f, 0.194458f, 0.207275f, 0.219482f, - 0.232910f, 0.246704f, 0.260010f, 0.274170f, 0.288330f, 0.302979f, 0.317383f, 0.332764f, - 0.347656f, 0.363037f, 0.378174f, 0.392578f, 0.408936f, 0.424316f, 0.440430f, 0.456299f, - 0.472656f, 0.488525f, 0.503906f, 0.519531f, 0.535645f, 0.552734f, 0.568359f, 0.584961f, - 0.600586f, 0.616699f, 0.633301f, 0.648438f, 0.663574f, 0.679199f, 0.694824f, 0.710938f, - 0.726074f, 0.742188f, 0.872559f, 0.870605f, 0.865723f, 0.860840f, 0.855957f, 0.851074f, - 0.002913f, 0.008781f, 0.014938f, 0.021759f, 0.027878f, 0.034393f, 0.041412f, 0.048737f, - 0.055969f, 0.063599f, 0.072021f, 0.080200f, 0.088928f, 0.097839f, 0.106934f, 0.116150f, - 0.126587f, 0.136353f, 0.147095f, 0.157715f, 0.169189f, 0.181519f, 0.193481f, 0.205933f, - 0.217773f, 0.231323f, 0.244629f, 0.257812f, 0.271240f, 0.285400f, 0.299561f, 0.314453f, - 0.329590f, 0.343506f, 0.358887f, 0.373779f, 0.389648f, 0.405029f, 0.420410f, 0.437012f, - 0.452393f, 0.468262f, 0.484375f, 0.500000f, 0.516113f, 0.532227f, 0.548828f, 0.564941f, - 0.581055f, 0.597168f, 0.612793f, 0.629883f, 0.645508f, 0.662109f, 0.678223f, 0.694336f, - 0.709473f, 0.726074f, 0.863770f, 0.864258f, 0.859863f, 0.854980f, 0.850586f, 0.846191f, - 0.002815f, 0.008194f, 0.013954f, 0.019653f, 0.025696f, 0.031982f, 0.038177f, 0.044830f, - 0.051819f, 0.058502f, 0.066162f, 0.073792f, 0.082031f, 0.090393f, 0.098999f, 0.107605f, - 0.117493f, 0.126709f, 0.137207f, 0.146729f, 0.157593f, 0.168579f, 0.179810f, 0.191772f, - 0.203369f, 0.215820f, 0.228882f, 0.241455f, 0.254395f, 0.268311f, 0.282227f, 0.296631f, - 0.310303f, 0.325439f, 0.339844f, 0.354736f, 0.370361f, 0.385742f, 0.400879f, 0.416504f, - 0.432617f, 0.448486f, 0.464355f, 0.479980f, 0.496094f, 0.513184f, 0.528809f, 0.545410f, - 0.561035f, 0.578613f, 0.594727f, 0.611328f, 0.626953f, 0.643555f, 0.660156f, 0.676270f, - 0.693359f, 0.709473f, 0.856445f, 0.858398f, 0.854492f, 0.849121f, 0.845215f, 0.841309f, - 0.002583f, 0.007492f, 0.012878f, 0.018417f, 0.023941f, 0.029495f, 0.035339f, 0.041779f, - 0.047577f, 0.054047f, 0.061523f, 0.068787f, 0.075562f, 0.083313f, 0.091858f, 0.099792f, - 0.108521f, 0.117615f, 0.126709f, 0.136108f, 0.146851f, 0.156860f, 0.166992f, 0.178345f, - 0.189819f, 0.202148f, 0.213623f, 0.225830f, 0.238892f, 0.252197f, 0.265137f, 0.278809f, - 0.292480f, 0.306885f, 0.321045f, 0.336914f, 0.350830f, 0.366943f, 0.381348f, 0.396240f, - 0.412354f, 0.428223f, 0.444336f, 0.460449f, 0.476318f, 0.493408f, 0.509277f, 0.525879f, - 0.542480f, 0.559082f, 0.574707f, 0.591797f, 0.608398f, 0.625488f, 0.642090f, 0.659180f, - 0.675781f, 0.691406f, 0.848145f, 0.851562f, 0.848145f, 0.843750f, 0.838867f, 0.835449f, - 0.002512f, 0.007374f, 0.012115f, 0.016983f, 0.022064f, 0.027359f, 0.032715f, 0.038147f, - 0.044373f, 0.050354f, 0.056641f, 0.063293f, 0.070190f, 0.077026f, 0.084717f, 0.092041f, - 0.100342f, 0.108398f, 0.117554f, 0.126221f, 0.135742f, 0.145142f, 0.155151f, 0.165771f, - 0.176758f, 0.187988f, 0.199341f, 0.210815f, 0.223389f, 0.236206f, 0.249023f, 0.261719f, - 0.275879f, 0.289062f, 0.303467f, 0.317627f, 0.332520f, 0.347412f, 0.361816f, 0.377197f, - 0.393066f, 0.407959f, 0.424072f, 0.440186f, 0.457031f, 0.473145f, 0.489502f, 0.505859f, - 0.522461f, 0.540039f, 0.555664f, 0.572754f, 0.589844f, 0.606445f, 0.623535f, 0.640625f, - 0.658203f, 0.675781f, 0.840820f, 0.843750f, 0.841309f, 0.836914f, 0.833984f, 0.830566f, - 0.002369f, 0.006668f, 0.011093f, 0.015778f, 0.020523f, 0.025223f, 0.030701f, 0.035339f, - 0.040710f, 0.046600f, 0.051971f, 0.058075f, 0.064819f, 0.071228f, 0.077942f, 0.085205f, - 0.092224f, 0.100464f, 0.108398f, 0.116882f, 0.125610f, 0.134155f, 0.143555f, 0.153564f, - 0.164062f, 0.174316f, 0.185303f, 0.196899f, 0.208496f, 0.220093f, 0.232666f, 0.245239f, - 0.258057f, 0.271729f, 0.285645f, 0.299561f, 0.313721f, 0.328613f, 0.342773f, 0.358154f, - 0.373535f, 0.388916f, 0.405518f, 0.419922f, 0.437012f, 0.453125f, 0.469238f, 0.486328f, - 0.502930f, 0.519531f, 0.536133f, 0.553223f, 0.571289f, 0.588379f, 0.605469f, 0.623047f, - 0.640137f, 0.656250f, 0.833008f, 0.837402f, 0.834473f, 0.831055f, 0.827637f, 0.824219f, - 0.002188f, 0.006027f, 0.010582f, 0.014297f, 0.018921f, 0.023270f, 0.028183f, 0.032593f, - 0.037781f, 0.042999f, 0.048584f, 0.053650f, 0.059601f, 0.065369f, 0.071899f, 0.078369f, - 0.085449f, 0.092407f, 0.099609f, 0.107788f, 0.115601f, 0.124451f, 0.133301f, 0.142212f, - 0.151978f, 0.161865f, 0.172363f, 0.182617f, 0.193970f, 0.205566f, 0.217407f, 0.229858f, - 0.241943f, 0.254639f, 0.268311f, 0.281494f, 0.295654f, 0.310059f, 0.324219f, 0.339600f, - 0.353760f, 0.369629f, 0.385010f, 0.400879f, 0.417725f, 0.433594f, 0.449219f, 0.465820f, - 0.482910f, 0.499512f, 0.517090f, 0.534180f, 0.551270f, 0.568848f, 0.586426f, 0.604004f, - 0.622559f, 0.639160f, 0.824219f, 0.830078f, 0.827637f, 0.824707f, 0.821777f, 0.818359f, - 0.002098f, 0.005634f, 0.009354f, 0.013557f, 0.017685f, 0.021576f, 0.025604f, 0.030380f, - 0.034943f, 0.039429f, 0.044281f, 0.049255f, 0.055023f, 0.060577f, 0.066101f, 0.072144f, - 0.078491f, 0.085083f, 0.091858f, 0.098999f, 0.106873f, 0.114502f, 0.122498f, 0.131592f, - 0.140137f, 0.149536f, 0.159424f, 0.169556f, 0.180054f, 0.191162f, 0.202026f, 0.213989f, - 0.226318f, 0.239136f, 0.250977f, 0.264648f, 0.278320f, 0.291748f, 0.305908f, 0.320557f, - 0.334961f, 0.350342f, 0.365479f, 0.381592f, 0.397461f, 0.413818f, 0.429199f, 0.446289f, - 0.462891f, 0.479736f, 0.496338f, 0.514160f, 0.530762f, 0.548828f, 0.566406f, 0.584473f, - 0.602539f, 0.621582f, 0.815918f, 0.823730f, 0.821289f, 0.817871f, 0.815430f, 0.812500f, - 0.001772f, 0.005249f, 0.008995f, 0.012260f, 0.016251f, 0.020020f, 0.024216f, 0.027603f, - 0.032196f, 0.036377f, 0.041199f, 0.045410f, 0.050110f, 0.055603f, 0.061005f, 0.066406f, - 0.072327f, 0.077820f, 0.084290f, 0.090942f, 0.098083f, 0.105164f, 0.113037f, 0.120789f, - 0.129272f, 0.138062f, 0.147339f, 0.156982f, 0.166626f, 0.176758f, 0.187866f, 0.199097f, - 0.210449f, 0.222412f, 0.234985f, 0.247559f, 0.260742f, 0.273682f, 0.287598f, 0.302002f, - 0.316650f, 0.331299f, 0.346191f, 0.362061f, 0.377686f, 0.393066f, 0.409668f, 0.426514f, - 0.443115f, 0.459717f, 0.476807f, 0.494629f, 0.511230f, 0.529785f, 0.547852f, 0.565430f, - 0.583984f, 0.602539f, 0.806152f, 0.814453f, 0.813965f, 0.811035f, 0.809082f, 0.806641f, - 0.001631f, 0.005131f, 0.008186f, 0.011673f, 0.014938f, 0.018463f, 0.021957f, 0.025635f, - 0.029083f, 0.033325f, 0.037445f, 0.041840f, 0.046478f, 0.050751f, 0.055634f, 0.060760f, - 0.065979f, 0.071472f, 0.077515f, 0.083801f, 0.090027f, 0.096802f, 0.104065f, 0.110840f, - 0.119080f, 0.127197f, 0.135498f, 0.144775f, 0.153931f, 0.163574f, 0.173462f, 0.184570f, - 0.195312f, 0.207153f, 0.218506f, 0.230591f, 0.243652f, 0.256348f, 0.270020f, 0.283691f, - 0.297852f, 0.312744f, 0.326904f, 0.342529f, 0.357910f, 0.373535f, 0.389404f, 0.406494f, - 0.421875f, 0.439941f, 0.457275f, 0.474365f, 0.492432f, 0.509766f, 0.527832f, 0.546875f, - 0.564941f, 0.584473f, 0.797852f, 0.807129f, 0.807129f, 0.804199f, 0.801758f, 0.799316f, - 0.001632f, 0.004704f, 0.007912f, 0.010788f, 0.013870f, 0.017105f, 0.020187f, 0.023483f, - 0.026932f, 0.030563f, 0.034332f, 0.038086f, 0.042694f, 0.046631f, 0.050995f, 0.055725f, - 0.060486f, 0.065674f, 0.070862f, 0.076721f, 0.082825f, 0.088623f, 0.094910f, 0.102112f, - 0.109070f, 0.116516f, 0.124695f, 0.133057f, 0.141968f, 0.151001f, 0.160522f, 0.170776f, - 0.181030f, 0.191650f, 0.202881f, 0.214722f, 0.227417f, 0.239624f, 0.252686f, 0.265625f, - 0.279785f, 0.293213f, 0.308350f, 0.323242f, 0.338867f, 0.354248f, 0.370117f, 0.386475f, - 0.403076f, 0.420410f, 0.437012f, 0.454102f, 0.471924f, 0.490234f, 0.508789f, 0.526855f, - 0.545410f, 0.564453f, 0.788086f, 0.799316f, 0.798828f, 0.797852f, 0.794434f, 0.791992f, - 0.001594f, 0.004177f, 0.007122f, 0.010201f, 0.012344f, 0.015839f, 0.018372f, 0.021683f, - 0.024857f, 0.028534f, 0.031464f, 0.035034f, 0.038879f, 0.042572f, 0.046295f, 0.051056f, - 0.055389f, 0.059723f, 0.064697f, 0.069763f, 0.075073f, 0.080750f, 0.087219f, 0.093445f, - 0.099548f, 0.107056f, 0.114136f, 0.121887f, 0.130249f, 0.138794f, 0.147217f, 0.157104f, - 0.166748f, 0.177124f, 0.187988f, 0.199097f, 0.210693f, 0.222778f, 0.235352f, 0.248169f, - 0.261719f, 0.275635f, 0.289062f, 0.303955f, 0.319336f, 0.334717f, 0.350098f, 0.365479f, - 0.382324f, 0.398926f, 0.416016f, 0.433594f, 0.451904f, 0.469238f, 0.487549f, 0.506348f, - 0.525391f, 0.544922f, 0.779297f, 0.791504f, 0.791504f, 0.789551f, 0.788086f, 0.786133f, - 0.001365f, 0.004173f, 0.006222f, 0.008842f, 0.011703f, 0.014366f, 0.017242f, 0.020218f, - 0.022903f, 0.025787f, 0.028824f, 0.032227f, 0.035522f, 0.038818f, 0.042511f, 0.046326f, - 0.050507f, 0.054657f, 0.058594f, 0.063660f, 0.068359f, 0.073914f, 0.078918f, 0.085083f, - 0.091125f, 0.097534f, 0.104126f, 0.111511f, 0.118896f, 0.126831f, 0.135742f, 0.144043f, - 0.153564f, 0.163330f, 0.173462f, 0.184082f, 0.195068f, 0.206787f, 0.218628f, 0.231079f, - 0.243896f, 0.257080f, 0.270996f, 0.285645f, 0.300049f, 0.314941f, 0.330322f, 0.346191f, - 0.362305f, 0.379395f, 0.395508f, 0.412842f, 0.431641f, 0.448975f, 0.468262f, 0.487549f, - 0.505371f, 0.525391f, 0.769531f, 0.783691f, 0.783691f, 0.782715f, 0.781250f, 0.778809f, - 0.001230f, 0.003925f, 0.006268f, 0.008659f, 0.010796f, 0.013145f, 0.015617f, 0.018234f, - 0.021133f, 0.023682f, 0.026215f, 0.029251f, 0.032349f, 0.035400f, 0.038696f, 0.042206f, - 0.045807f, 0.049377f, 0.053925f, 0.057953f, 0.062500f, 0.067078f, 0.071777f, 0.077271f, - 0.082703f, 0.088806f, 0.094910f, 0.101379f, 0.109192f, 0.115967f, 0.123779f, 0.131470f, - 0.140259f, 0.149536f, 0.159302f, 0.169312f, 0.180054f, 0.190674f, 0.202515f, 0.214722f, - 0.226562f, 0.239624f, 0.253174f, 0.266602f, 0.281738f, 0.295898f, 0.311035f, 0.326904f, - 0.342529f, 0.359131f, 0.375732f, 0.393066f, 0.410400f, 0.428467f, 0.447510f, 0.466064f, - 0.485596f, 0.504883f, 0.759277f, 0.774902f, 0.775879f, 0.774902f, 0.773438f, 0.771973f, - 0.001031f, 0.003601f, 0.005604f, 0.007858f, 0.009880f, 0.012146f, 0.014549f, 0.016998f, - 0.019043f, 0.021362f, 0.024475f, 0.026566f, 0.029358f, 0.032196f, 0.035248f, 0.038391f, - 0.041656f, 0.045044f, 0.048553f, 0.052582f, 0.056213f, 0.060669f, 0.065186f, 0.070068f, - 0.074768f, 0.080322f, 0.086060f, 0.092102f, 0.098877f, 0.105408f, 0.112366f, 0.120239f, - 0.128540f, 0.136597f, 0.145874f, 0.155396f, 0.165283f, 0.175537f, 0.186401f, 0.198120f, - 0.210083f, 0.222534f, 0.235229f, 0.248657f, 0.262451f, 0.277344f, 0.291504f, 0.307617f, - 0.322998f, 0.339111f, 0.354980f, 0.372559f, 0.390625f, 0.408936f, 0.426758f, 0.445312f, - 0.466064f, 0.485840f, 0.749512f, 0.765137f, 0.767578f, 0.767090f, 0.765137f, 0.764648f, - 0.001161f, 0.003078f, 0.005310f, 0.007282f, 0.009201f, 0.011330f, 0.013214f, 0.015404f, - 0.017273f, 0.019409f, 0.021988f, 0.024078f, 0.026550f, 0.029358f, 0.032043f, 0.034454f, - 0.037415f, 0.040710f, 0.043854f, 0.047272f, 0.050659f, 0.054840f, 0.058777f, 0.063293f, - 0.067566f, 0.072449f, 0.077759f, 0.083069f, 0.088928f, 0.095886f, 0.102478f, 0.109070f, - 0.116760f, 0.124390f, 0.132935f, 0.141479f, 0.151123f, 0.161011f, 0.171143f, 0.182007f, - 0.193726f, 0.205688f, 0.218018f, 0.230835f, 0.244507f, 0.258789f, 0.272949f, 0.287109f, - 0.303467f, 0.319336f, 0.335449f, 0.352539f, 0.369873f, 0.387939f, 0.406250f, 0.425049f, - 0.444824f, 0.464844f, 0.739258f, 0.756348f, 0.758789f, 0.758789f, 0.757324f, 0.756836f, - 0.001004f, 0.002939f, 0.005005f, 0.006779f, 0.008453f, 0.010323f, 0.012177f, 0.013870f, - 0.016052f, 0.018051f, 0.019638f, 0.022141f, 0.023956f, 0.026413f, 0.028870f, 0.031281f, - 0.033661f, 0.036591f, 0.039429f, 0.042542f, 0.045776f, 0.049011f, 0.053009f, 0.056885f, - 0.061035f, 0.065186f, 0.069885f, 0.075134f, 0.080505f, 0.085999f, 0.091858f, 0.098633f, - 0.105591f, 0.112732f, 0.120667f, 0.128662f, 0.137573f, 0.146729f, 0.156372f, 0.166748f, - 0.177490f, 0.189331f, 0.201294f, 0.213501f, 0.226807f, 0.239746f, 0.254150f, 0.268555f, - 0.283936f, 0.298828f, 0.316162f, 0.332275f, 0.349609f, 0.367432f, 0.385498f, 0.404053f, - 0.423828f, 0.443848f, 0.728516f, 0.747559f, 0.750488f, 0.750488f, 0.749512f, 0.748047f, - 0.000970f, 0.002523f, 0.004665f, 0.006203f, 0.007759f, 0.009491f, 0.011070f, 0.012802f, - 0.014336f, 0.016266f, 0.017944f, 0.019852f, 0.021805f, 0.023911f, 0.025818f, 0.028137f, - 0.030579f, 0.032837f, 0.035248f, 0.038055f, 0.041046f, 0.044189f, 0.047333f, 0.050842f, - 0.054504f, 0.058502f, 0.062866f, 0.067383f, 0.071960f, 0.077393f, 0.082642f, 0.088928f, - 0.095093f, 0.101685f, 0.108765f, 0.116272f, 0.124451f, 0.133423f, 0.142212f, 0.152100f, - 0.162354f, 0.172729f, 0.184692f, 0.196411f, 0.209106f, 0.221802f, 0.235718f, 0.250000f, - 0.265137f, 0.280029f, 0.296143f, 0.312012f, 0.329346f, 0.346924f, 0.364990f, 0.384277f, - 0.403564f, 0.423340f, 0.718262f, 0.738770f, 0.741211f, 0.742188f, 0.741211f, 0.740234f, - 0.000785f, 0.002600f, 0.004028f, 0.005390f, 0.007275f, 0.008774f, 0.010124f, 0.011620f, - 0.013306f, 0.014427f, 0.015991f, 0.017838f, 0.019577f, 0.021469f, 0.023254f, 0.024902f, - 0.027115f, 0.029190f, 0.031677f, 0.034088f, 0.036682f, 0.039307f, 0.042175f, 0.045410f, - 0.048553f, 0.052002f, 0.055908f, 0.060028f, 0.064270f, 0.068909f, 0.074097f, 0.079163f, - 0.085022f, 0.091309f, 0.097473f, 0.104797f, 0.112183f, 0.120239f, 0.128662f, 0.137451f, - 0.146973f, 0.157471f, 0.168213f, 0.179810f, 0.191650f, 0.204468f, 0.217529f, 0.231201f, - 0.245605f, 0.260254f, 0.275879f, 0.292236f, 0.308838f, 0.326416f, 0.344238f, 0.363037f, - 0.382080f, 0.403076f, 0.707031f, 0.729980f, 0.732422f, 0.733398f, 0.733398f, 0.732910f, - 0.000775f, 0.002190f, 0.003696f, 0.005081f, 0.006397f, 0.007858f, 0.009239f, 0.010323f, - 0.011803f, 0.012978f, 0.014328f, 0.015915f, 0.017349f, 0.019058f, 0.020630f, 0.022339f, - 0.024445f, 0.025909f, 0.028275f, 0.030151f, 0.032532f, 0.035065f, 0.037476f, 0.040283f, - 0.042969f, 0.046448f, 0.049469f, 0.053314f, 0.056976f, 0.061371f, 0.065613f, 0.070435f, - 0.075623f, 0.081360f, 0.087341f, 0.093628f, 0.100220f, 0.107788f, 0.115845f, 0.123901f, - 0.133057f, 0.142456f, 0.152832f, 0.163574f, 0.174561f, 0.187012f, 0.199463f, 0.212646f, - 0.226562f, 0.241455f, 0.256836f, 0.272705f, 0.288818f, 0.305664f, 0.323486f, 0.341797f, - 0.362305f, 0.382080f, 0.695312f, 0.719238f, 0.722656f, 0.724121f, 0.724121f, 0.723633f, - 0.000906f, 0.002022f, 0.003521f, 0.004963f, 0.005756f, 0.006847f, 0.008446f, 0.009392f, - 0.010437f, 0.012039f, 0.012863f, 0.014343f, 0.015457f, 0.016876f, 0.018295f, 0.019730f, - 0.021484f, 0.023102f, 0.024689f, 0.026581f, 0.028717f, 0.030945f, 0.032928f, 0.035370f, - 0.037872f, 0.040894f, 0.043915f, 0.047028f, 0.050415f, 0.054169f, 0.058167f, 0.062286f, - 0.067078f, 0.071960f, 0.077209f, 0.082947f, 0.089417f, 0.096008f, 0.103271f, 0.110718f, - 0.119324f, 0.128052f, 0.137817f, 0.147705f, 0.158691f, 0.169922f, 0.181519f, 0.195435f, - 0.208496f, 0.222534f, 0.237305f, 0.252441f, 0.268799f, 0.285645f, 0.302979f, 0.322266f, - 0.340332f, 0.360840f, 0.683594f, 0.708984f, 0.714355f, 0.715332f, 0.715820f, 0.715332f, - 0.000700f, 0.002043f, 0.003139f, 0.004219f, 0.005417f, 0.006477f, 0.007442f, 0.008415f, - 0.009499f, 0.010475f, 0.011497f, 0.012619f, 0.013824f, 0.014969f, 0.016190f, 0.017639f, - 0.018799f, 0.020386f, 0.021896f, 0.023560f, 0.025131f, 0.027176f, 0.028900f, 0.031067f, - 0.033295f, 0.035919f, 0.038239f, 0.041229f, 0.044373f, 0.047394f, 0.050934f, 0.054871f, - 0.058838f, 0.063293f, 0.068115f, 0.073303f, 0.078857f, 0.084839f, 0.091309f, 0.098328f, - 0.106079f, 0.114136f, 0.123230f, 0.132690f, 0.143066f, 0.153442f, 0.165161f, 0.177368f, - 0.190186f, 0.203979f, 0.218262f, 0.232910f, 0.248901f, 0.265381f, 0.282227f, 0.301025f, - 0.319580f, 0.339355f, 0.672852f, 0.699707f, 0.704590f, 0.706055f, 0.706543f, 0.706055f, - 0.000762f, 0.001804f, 0.002762f, 0.003914f, 0.004791f, 0.005764f, 0.006542f, 0.007622f, - 0.008606f, 0.009232f, 0.010178f, 0.011093f, 0.012108f, 0.013191f, 0.014412f, 0.015289f, - 0.016510f, 0.017731f, 0.019119f, 0.020615f, 0.022049f, 0.023483f, 0.025345f, 0.027100f, - 0.028885f, 0.031067f, 0.033417f, 0.035797f, 0.038422f, 0.041382f, 0.044495f, 0.047638f, - 0.051178f, 0.055267f, 0.059387f, 0.064026f, 0.069092f, 0.074585f, 0.080566f, 0.087097f, - 0.093811f, 0.101624f, 0.109619f, 0.117798f, 0.127319f, 0.137817f, 0.148682f, 0.160278f, - 0.172607f, 0.185669f, 0.199097f, 0.214233f, 0.229492f, 0.245850f, 0.261963f, 0.280273f, - 0.299316f, 0.319580f, 0.660645f, 0.689453f, 0.694824f, 0.696777f, 0.697266f, 0.697266f, - 0.000499f, 0.001527f, 0.002565f, 0.003622f, 0.004429f, 0.005138f, 0.005955f, 0.006691f, - 0.007317f, 0.008156f, 0.008949f, 0.009903f, 0.010635f, 0.011452f, 0.012512f, 0.013451f, - 0.014503f, 0.015610f, 0.016632f, 0.017746f, 0.019073f, 0.020355f, 0.021957f, 0.023453f, - 0.025208f, 0.026932f, 0.028732f, 0.030945f, 0.033142f, 0.035614f, 0.038300f, 0.041199f, - 0.044464f, 0.047760f, 0.051514f, 0.055573f, 0.059998f, 0.064819f, 0.070312f, 0.075867f, - 0.082275f, 0.088806f, 0.096436f, 0.104797f, 0.113342f, 0.122559f, 0.132568f, 0.143799f, - 0.155396f, 0.167725f, 0.181274f, 0.195068f, 0.209961f, 0.225708f, 0.242310f, 0.259766f, - 0.277832f, 0.297363f, 0.648926f, 0.678711f, 0.685059f, 0.687500f, 0.687500f, 0.687988f, - 0.000653f, 0.001627f, 0.002562f, 0.003166f, 0.003872f, 0.004562f, 0.005287f, 0.005905f, - 0.006557f, 0.007309f, 0.007835f, 0.008621f, 0.009140f, 0.010109f, 0.010773f, 0.011627f, - 0.012428f, 0.013351f, 0.014488f, 0.015472f, 0.016479f, 0.017578f, 0.018845f, 0.020157f, - 0.021591f, 0.023132f, 0.024765f, 0.026337f, 0.028473f, 0.030594f, 0.032867f, 0.035309f, - 0.037933f, 0.041107f, 0.044403f, 0.047852f, 0.051666f, 0.055756f, 0.060455f, 0.065552f, - 0.070740f, 0.077454f, 0.083862f, 0.091125f, 0.099304f, 0.107971f, 0.117859f, 0.127808f, - 0.139038f, 0.150757f, 0.163574f, 0.176880f, 0.191162f, 0.206665f, 0.222656f, 0.239258f, - 0.257568f, 0.277100f, 0.636230f, 0.667969f, 0.675293f, 0.677734f, 0.678223f, 0.678711f, - 0.000393f, 0.001375f, 0.002174f, 0.002773f, 0.003334f, 0.004070f, 0.004692f, 0.005047f, - 0.005672f, 0.006298f, 0.006893f, 0.007454f, 0.007957f, 0.008636f, 0.009171f, 0.010002f, - 0.010674f, 0.011574f, 0.012451f, 0.013145f, 0.014091f, 0.014893f, 0.016083f, 0.017151f, - 0.018402f, 0.019714f, 0.021042f, 0.022415f, 0.024155f, 0.026108f, 0.027786f, 0.030212f, - 0.032379f, 0.034698f, 0.037415f, 0.040436f, 0.043793f, 0.047455f, 0.051727f, 0.056030f, - 0.061218f, 0.066284f, 0.072571f, 0.079041f, 0.086121f, 0.094299f, 0.102844f, 0.112305f, - 0.122925f, 0.134033f, 0.145752f, 0.158569f, 0.172729f, 0.187378f, 0.203003f, 0.219238f, - 0.237671f, 0.255859f, 0.624023f, 0.657227f, 0.664062f, 0.666992f, 0.668457f, 0.668457f, - 0.000379f, 0.001404f, 0.001893f, 0.002403f, 0.002840f, 0.003458f, 0.004021f, 0.004459f, - 0.004894f, 0.005527f, 0.005844f, 0.006256f, 0.006866f, 0.007423f, 0.007957f, 0.008476f, - 0.009155f, 0.009735f, 0.010422f, 0.011078f, 0.011925f, 0.012787f, 0.013458f, 0.014526f, - 0.015541f, 0.016632f, 0.017838f, 0.019028f, 0.020248f, 0.021851f, 0.023514f, 0.024979f, - 0.027054f, 0.029236f, 0.031555f, 0.034180f, 0.036713f, 0.040375f, 0.043854f, 0.047607f, - 0.051727f, 0.056549f, 0.061768f, 0.067627f, 0.073792f, 0.081116f, 0.089111f, 0.097595f, - 0.107056f, 0.117371f, 0.128906f, 0.141113f, 0.154053f, 0.168579f, 0.183960f, 0.199585f, - 0.216309f, 0.235352f, 0.612793f, 0.647949f, 0.652832f, 0.656250f, 0.658691f, 0.658203f, - 0.000506f, 0.001164f, 0.001575f, 0.002136f, 0.002600f, 0.003054f, 0.003405f, 0.003735f, - 0.004364f, 0.004681f, 0.004944f, 0.005569f, 0.005810f, 0.006187f, 0.006813f, 0.007233f, - 0.007881f, 0.008217f, 0.008850f, 0.009293f, 0.010109f, 0.010788f, 0.011543f, 0.012161f, - 0.012993f, 0.013931f, 0.014809f, 0.015945f, 0.016983f, 0.018234f, 0.019440f, 0.020813f, - 0.022491f, 0.024261f, 0.026169f, 0.028458f, 0.030701f, 0.033295f, 0.036560f, 0.039520f, - 0.043121f, 0.047333f, 0.052032f, 0.056885f, 0.062561f, 0.068909f, 0.076111f, 0.083496f, - 0.092407f, 0.101929f, 0.112671f, 0.124451f, 0.136719f, 0.150146f, 0.165039f, 0.180786f, - 0.197510f, 0.215210f, 0.597656f, 0.636230f, 0.642578f, 0.647461f, 0.647949f, 0.649902f, - 0.000344f, 0.001057f, 0.001456f, 0.001907f, 0.002377f, 0.002735f, 0.002983f, 0.003359f, - 0.003651f, 0.003960f, 0.004311f, 0.004471f, 0.005009f, 0.005283f, 0.005653f, 0.006145f, - 0.006592f, 0.006889f, 0.007469f, 0.007889f, 0.008423f, 0.008911f, 0.009567f, 0.010124f, - 0.010788f, 0.011574f, 0.012466f, 0.013123f, 0.014053f, 0.015091f, 0.016159f, 0.017288f, - 0.018539f, 0.020111f, 0.021698f, 0.023285f, 0.025024f, 0.027405f, 0.029800f, 0.032501f, - 0.035583f, 0.039001f, 0.042908f, 0.047302f, 0.052185f, 0.057465f, 0.063843f, 0.070984f, - 0.078857f, 0.087463f, 0.097168f, 0.108215f, 0.120117f, 0.132812f, 0.146851f, 0.161865f, - 0.177856f, 0.195557f, 0.585449f, 0.624023f, 0.633301f, 0.636230f, 0.637695f, 0.638672f, - 0.000516f, 0.000847f, 0.001210f, 0.001663f, 0.002012f, 0.002218f, 0.002424f, 0.002861f, - 0.002947f, 0.003275f, 0.003469f, 0.003819f, 0.004169f, 0.004337f, 0.004658f, 0.005169f, - 0.005424f, 0.005795f, 0.006138f, 0.006500f, 0.007057f, 0.007458f, 0.007874f, 0.008369f, - 0.008888f, 0.009583f, 0.010147f, 0.010864f, 0.011589f, 0.012428f, 0.013161f, 0.013931f, - 0.015076f, 0.016266f, 0.017456f, 0.018845f, 0.020432f, 0.022232f, 0.024094f, 0.026459f, - 0.028809f, 0.031586f, 0.034973f, 0.038513f, 0.042755f, 0.047485f, 0.052643f, 0.058929f, - 0.065796f, 0.073792f, 0.082581f, 0.092407f, 0.103516f, 0.115723f, 0.128906f, 0.142944f, - 0.158813f, 0.175781f, 0.572266f, 0.613770f, 0.621094f, 0.625977f, 0.626953f, 0.628418f, - 0.000262f, 0.000864f, 0.001096f, 0.001409f, 0.001576f, 0.001852f, 0.002047f, 0.002247f, - 0.002518f, 0.002741f, 0.002956f, 0.003157f, 0.003359f, 0.003597f, 0.003872f, 0.004230f, - 0.004406f, 0.004772f, 0.005035f, 0.005379f, 0.005695f, 0.006153f, 0.006485f, 0.006935f, - 0.007275f, 0.007801f, 0.008301f, 0.008789f, 0.009300f, 0.009949f, 0.010727f, 0.011482f, - 0.012245f, 0.013145f, 0.014236f, 0.015236f, 0.016525f, 0.017838f, 0.019348f, 0.021088f, - 0.023010f, 0.025253f, 0.027878f, 0.031128f, 0.034149f, 0.038269f, 0.042694f, 0.047852f, - 0.053833f, 0.060852f, 0.068665f, 0.077698f, 0.087891f, 0.099182f, 0.111633f, 0.125732f, - 0.140381f, 0.157227f, 0.558105f, 0.601562f, 0.610840f, 0.614746f, 0.617188f, 0.619141f, - 0.000270f, 0.000683f, 0.000851f, 0.001138f, 0.001346f, 0.001561f, 0.001701f, 0.001884f, - 0.001984f, 0.002193f, 0.002455f, 0.002609f, 0.002743f, 0.002993f, 0.003159f, 0.003361f, - 0.003593f, 0.003883f, 0.004044f, 0.004360f, 0.004532f, 0.004971f, 0.005169f, 0.005573f, - 0.005863f, 0.006252f, 0.006653f, 0.007095f, 0.007572f, 0.008110f, 0.008713f, 0.009056f, - 0.009827f, 0.010574f, 0.011307f, 0.012070f, 0.013069f, 0.014122f, 0.015297f, 0.016678f, - 0.018234f, 0.019775f, 0.021835f, 0.024216f, 0.026917f, 0.030151f, 0.033875f, 0.038147f, - 0.043121f, 0.049408f, 0.056091f, 0.064026f, 0.073059f, 0.083801f, 0.095276f, 0.108459f, - 0.122803f, 0.138794f, 0.545410f, 0.590332f, 0.599609f, 0.603516f, 0.606445f, 0.607422f, - 0.000190f, 0.000607f, 0.000724f, 0.000989f, 0.001171f, 0.001265f, 0.001416f, 0.001602f, - 0.001666f, 0.001761f, 0.001893f, 0.002102f, 0.002199f, 0.002413f, 0.002537f, 0.002743f, - 0.002850f, 0.003027f, 0.003258f, 0.003494f, 0.003729f, 0.003937f, 0.004204f, 0.004410f, - 0.004616f, 0.004921f, 0.005192f, 0.005604f, 0.005936f, 0.006298f, 0.006836f, 0.007233f, - 0.007694f, 0.008224f, 0.008827f, 0.009506f, 0.010262f, 0.011055f, 0.011978f, 0.012955f, - 0.014099f, 0.015434f, 0.017029f, 0.018677f, 0.020813f, 0.023193f, 0.026169f, 0.029541f, - 0.033783f, 0.038513f, 0.044403f, 0.051208f, 0.059387f, 0.068665f, 0.079468f, 0.091858f, - 0.105774f, 0.120728f, 0.530762f, 0.578125f, 0.588379f, 0.592773f, 0.595215f, 0.597168f, - 0.000151f, 0.000443f, 0.000673f, 0.000793f, 0.000937f, 0.000987f, 0.001092f, 0.001192f, - 0.001324f, 0.001460f, 0.001495f, 0.001565f, 0.001778f, 0.001944f, 0.002054f, 0.002096f, - 0.002254f, 0.002338f, 0.002594f, 0.002737f, 0.002886f, 0.003048f, 0.003294f, 0.003460f, - 0.003679f, 0.003868f, 0.004086f, 0.004322f, 0.004642f, 0.004894f, 0.005199f, 0.005554f, - 0.006035f, 0.006451f, 0.006836f, 0.007359f, 0.007820f, 0.008461f, 0.009163f, 0.009956f, - 0.010803f, 0.011871f, 0.012917f, 0.014343f, 0.015900f, 0.017670f, 0.019791f, 0.022400f, - 0.025589f, 0.029404f, 0.034210f, 0.039948f, 0.046936f, 0.055298f, 0.064941f, 0.076172f, - 0.089172f, 0.103821f, 0.517090f, 0.565918f, 0.576172f, 0.582031f, 0.584961f, 0.586426f, - 0.000203f, 0.000287f, 0.000531f, 0.000688f, 0.000738f, 0.000820f, 0.000915f, 0.000875f, - 0.001036f, 0.001117f, 0.001215f, 0.001317f, 0.001374f, 0.001476f, 0.001524f, 0.001682f, - 0.001726f, 0.001867f, 0.002014f, 0.002056f, 0.002209f, 0.002365f, 0.002495f, 0.002663f, - 0.002775f, 0.002953f, 0.003134f, 0.003325f, 0.003567f, 0.003736f, 0.004070f, 0.004261f, - 0.004494f, 0.004845f, 0.005116f, 0.005459f, 0.005928f, 0.006329f, 0.006863f, 0.007458f, - 0.008087f, 0.008873f, 0.009689f, 0.010651f, 0.011826f, 0.013130f, 0.014732f, 0.016617f, - 0.018890f, 0.021912f, 0.025482f, 0.029938f, 0.035736f, 0.042847f, 0.051453f, 0.061615f, - 0.074158f, 0.087952f, 0.504395f, 0.554199f, 0.565918f, 0.569336f, 0.573242f, 0.574219f, - 0.000215f, 0.000259f, 0.000423f, 0.000534f, 0.000499f, 0.000649f, 0.000622f, 0.000690f, - 0.000717f, 0.000817f, 0.000937f, 0.000984f, 0.001045f, 0.001148f, 0.001182f, 0.001211f, - 0.001339f, 0.001406f, 0.001463f, 0.001590f, 0.001666f, 0.001759f, 0.001867f, 0.001949f, - 0.002064f, 0.002176f, 0.002342f, 0.002453f, 0.002619f, 0.002871f, 0.003033f, 0.003101f, - 0.003389f, 0.003620f, 0.003794f, 0.004059f, 0.004368f, 0.004681f, 0.005035f, 0.005466f, - 0.005917f, 0.006405f, 0.007092f, 0.007744f, 0.008591f, 0.009506f, 0.010567f, 0.011993f, - 0.013710f, 0.015762f, 0.018326f, 0.021759f, 0.026077f, 0.031891f, 0.039124f, 0.048462f, - 0.059570f, 0.072571f, 0.489258f, 0.542480f, 0.553223f, 0.558594f, 0.562012f, 0.563965f, - 0.000067f, 0.000253f, 0.000305f, 0.000367f, 0.000422f, 0.000431f, 0.000530f, 0.000466f, - 0.000565f, 0.000590f, 0.000702f, 0.000690f, 0.000746f, 0.000795f, 0.000859f, 0.000897f, - 0.000962f, 0.001021f, 0.001069f, 0.001105f, 0.001207f, 0.001257f, 0.001354f, 0.001424f, - 0.001483f, 0.001570f, 0.001687f, 0.001750f, 0.001857f, 0.001982f, 0.002071f, 0.002281f, - 0.002361f, 0.002527f, 0.002684f, 0.002846f, 0.003092f, 0.003342f, 0.003622f, 0.003866f, - 0.004173f, 0.004520f, 0.004955f, 0.005428f, 0.006023f, 0.006687f, 0.007481f, 0.008446f, - 0.009628f, 0.011047f, 0.012840f, 0.015205f, 0.018326f, 0.022629f, 0.028442f, 0.036102f, - 0.046051f, 0.058197f, 0.476318f, 0.529785f, 0.541992f, 0.547852f, 0.550293f, 0.553223f, - 0.000000f, 0.000118f, 0.000216f, 0.000288f, 0.000272f, 0.000350f, 0.000312f, 0.000374f, - 0.000395f, 0.000470f, 0.000488f, 0.000477f, 0.000495f, 0.000548f, 0.000573f, 0.000646f, - 0.000636f, 0.000714f, 0.000763f, 0.000803f, 0.000852f, 0.000897f, 0.000930f, 0.000985f, - 0.001056f, 0.001089f, 0.001163f, 0.001210f, 0.001281f, 0.001432f, 0.001431f, 0.001548f, - 0.001622f, 0.001743f, 0.001869f, 0.001991f, 0.002104f, 0.002262f, 0.002428f, 0.002632f, - 0.002815f, 0.003077f, 0.003344f, 0.003656f, 0.004002f, 0.004478f, 0.004974f, 0.005627f, - 0.006435f, 0.007481f, 0.008713f, 0.010307f, 0.012291f, 0.015289f, 0.019409f, 0.025497f, - 0.033966f, 0.045013f, 0.461914f, 0.517090f, 0.529297f, 0.536133f, 0.539551f, 0.541504f, - 0.000073f, 0.000175f, 0.000165f, 0.000149f, 0.000200f, 0.000208f, 0.000215f, 0.000260f, - 0.000268f, 0.000277f, 0.000292f, 0.000341f, 0.000334f, 0.000370f, 0.000413f, 0.000424f, - 0.000449f, 0.000474f, 0.000488f, 0.000507f, 0.000555f, 0.000574f, 0.000616f, 0.000652f, - 0.000696f, 0.000746f, 0.000780f, 0.000804f, 0.000849f, 0.000888f, 0.000949f, 0.001011f, - 0.001075f, 0.001151f, 0.001225f, 0.001266f, 0.001385f, 0.001466f, 0.001596f, 0.001699f, - 0.001808f, 0.001980f, 0.002157f, 0.002329f, 0.002544f, 0.002850f, 0.003178f, 0.003593f, - 0.004047f, 0.004658f, 0.005508f, 0.006565f, 0.007935f, 0.009819f, 0.012527f, 0.016647f, - 0.023514f, 0.033173f, 0.447510f, 0.503906f, 0.517578f, 0.523926f, 0.527344f, 0.529297f, - 0.000000f, 0.000106f, 0.000097f, 0.000099f, 0.000136f, 0.000157f, 0.000129f, 0.000162f, - 0.000167f, 0.000172f, 0.000180f, 0.000186f, 0.000209f, 0.000227f, 0.000232f, 0.000248f, - 0.000260f, 0.000291f, 0.000300f, 0.000327f, 0.000335f, 0.000343f, 0.000363f, 0.000395f, - 0.000428f, 0.000459f, 0.000458f, 0.000477f, 0.000515f, 0.000549f, 0.000578f, 0.000621f, - 0.000659f, 0.000683f, 0.000741f, 0.000767f, 0.000818f, 0.000877f, 0.000952f, 0.001010f, - 0.001085f, 0.001177f, 0.001275f, 0.001406f, 0.001516f, 0.001664f, 0.001884f, 0.002096f, - 0.002415f, 0.002745f, 0.003231f, 0.003843f, 0.004715f, 0.005936f, 0.007629f, 0.010139f, - 0.014763f, 0.022812f, 0.433350f, 0.491455f, 0.506348f, 0.511719f, 0.515625f, 0.518066f, - 0.000104f, 0.000080f, 0.000069f, 0.000062f, 0.000074f, 0.000074f, 0.000089f, 0.000097f, - 0.000099f, 0.000102f, 0.000105f, 0.000126f, 0.000106f, 0.000119f, 0.000139f, 0.000135f, - 0.000154f, 0.000164f, 0.000166f, 0.000175f, 0.000188f, 0.000194f, 0.000211f, 0.000220f, - 0.000252f, 0.000248f, 0.000260f, 0.000272f, 0.000293f, 0.000301f, 0.000328f, 0.000347f, - 0.000365f, 0.000371f, 0.000401f, 0.000422f, 0.000447f, 0.000489f, 0.000524f, 0.000553f, - 0.000588f, 0.000635f, 0.000701f, 0.000751f, 0.000816f, 0.000897f, 0.000997f, 0.001109f, - 0.001265f, 0.001460f, 0.001686f, 0.002035f, 0.002457f, 0.003130f, 0.004124f, 0.005676f, - 0.008263f, 0.014114f, 0.418945f, 0.479492f, 0.493652f, 0.500000f, 0.503418f, 0.506836f, - 0.000089f, 0.000065f, 0.000056f, 0.000050f, 0.000045f, 0.000042f, 0.000046f, 0.000042f, - 0.000043f, 0.000055f, 0.000046f, 0.000049f, 0.000065f, 0.000055f, 0.000057f, 0.000063f, - 0.000075f, 0.000080f, 0.000078f, 0.000084f, 0.000085f, 0.000092f, 0.000097f, 0.000102f, - 0.000108f, 0.000117f, 0.000118f, 0.000138f, 0.000135f, 0.000142f, 0.000151f, 0.000160f, - 0.000172f, 0.000180f, 0.000195f, 0.000197f, 0.000210f, 0.000230f, 0.000244f, 0.000266f, - 0.000279f, 0.000299f, 0.000324f, 0.000352f, 0.000383f, 0.000414f, 0.000457f, 0.000509f, - 0.000575f, 0.000650f, 0.000756f, 0.000904f, 0.001103f, 0.001410f, 0.001880f, 0.002668f, - 0.004112f, 0.007290f, 0.404541f, 0.466309f, 0.481201f, 0.488037f, 0.492432f, 0.495361f, - 0.000066f, 0.000046f, 0.000038f, 0.000034f, 0.000031f, 0.000029f, 0.000027f, 0.000026f, - 0.000025f, 0.000023f, 0.000022f, 0.000024f, 0.000020f, 0.000021f, 0.000021f, 0.000026f, - 0.000024f, 0.000028f, 0.000031f, 0.000032f, 0.000032f, 0.000035f, 0.000040f, 0.000038f, - 0.000041f, 0.000047f, 0.000049f, 0.000043f, 0.000050f, 0.000052f, 0.000056f, 0.000059f, - 0.000066f, 0.000062f, 0.000067f, 0.000071f, 0.000082f, 0.000083f, 0.000089f, 0.000098f, - 0.000104f, 0.000107f, 0.000116f, 0.000125f, 0.000141f, 0.000149f, 0.000160f, 0.000183f, - 0.000207f, 0.000228f, 0.000264f, 0.000311f, 0.000376f, 0.000469f, 0.000646f, 0.000937f, - 0.001554f, 0.002983f, 0.390381f, 0.454346f, 0.469727f, 0.476318f, 0.480713f, 0.484131f, - 0.000028f, 0.000019f, 0.000015f, 0.000014f, 0.000014f, 0.000013f, 0.000012f, 0.000012f, - 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000010f, - 0.000010f, 0.000009f, 0.000009f, 0.000009f, 0.000008f, 0.000008f, 0.000008f, 0.000007f, - 0.000008f, 0.000009f, 0.000009f, 0.000010f, 0.000010f, 0.000011f, 0.000012f, 0.000011f, - 0.000014f, 0.000015f, 0.000016f, 0.000016f, 0.000018f, 0.000019f, 0.000019f, 0.000022f, - 0.000023f, 0.000024f, 0.000026f, 0.000028f, 0.000029f, 0.000032f, 0.000037f, 0.000037f, - 0.000042f, 0.000048f, 0.000056f, 0.000066f, 0.000077f, 0.000091f, 0.000124f, 0.000183f, - 0.000318f, 0.000779f, 0.376465f, 0.441406f, 0.457275f, 0.464600f, 0.468994f, 0.471924f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, - 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000003f, 0.000004f, 0.000004f, 0.000005f, - 0.000010f, 0.000027f, 0.363037f, 0.428223f, 0.444580f, 0.452881f, 0.457031f, 0.459961f, - }, - { - 0.014420f, 0.043488f, 0.072388f, 0.100830f, 0.129150f, 0.156494f, 0.183350f, 0.210327f, - 0.235352f, 0.260986f, 0.285645f, 0.309082f, 0.332764f, 0.355713f, 0.377441f, 0.399658f, - 0.420898f, 0.441650f, 0.461914f, 0.481445f, 0.500977f, 0.520508f, 0.538574f, 0.556641f, - 0.574707f, 0.591797f, 0.608398f, 0.624512f, 0.641602f, 0.657227f, 0.672363f, 0.687500f, - 0.702148f, 0.717285f, 0.730957f, 0.745117f, 0.758789f, 0.772461f, 0.783203f, 0.797363f, - 0.810547f, 0.822266f, 0.833984f, 0.845703f, 0.857422f, 0.868652f, 0.879395f, 0.890625f, - 0.901367f, 0.911621f, 0.921875f, 0.932129f, 0.941895f, 0.951660f, 0.960938f, 0.970215f, - 0.979492f, 0.987793f, 0.981934f, 0.957031f, 0.938965f, 0.923340f, 0.909668f, 0.897461f, - 0.013199f, 0.039978f, 0.066284f, 0.093445f, 0.119324f, 0.145386f, 0.170410f, 0.195801f, - 0.220581f, 0.244019f, 0.268066f, 0.291260f, 0.314453f, 0.335938f, 0.358154f, 0.379639f, - 0.399902f, 0.420898f, 0.441406f, 0.460938f, 0.480225f, 0.498291f, 0.516602f, 0.535156f, - 0.553223f, 0.570312f, 0.587891f, 0.603516f, 0.620117f, 0.636719f, 0.652832f, 0.667480f, - 0.682617f, 0.696777f, 0.711914f, 0.726074f, 0.739746f, 0.753418f, 0.766602f, 0.779785f, - 0.791992f, 0.804688f, 0.817871f, 0.829102f, 0.841309f, 0.852539f, 0.864258f, 0.875488f, - 0.886230f, 0.896973f, 0.907227f, 0.917969f, 0.928223f, 0.937500f, 0.947266f, 0.957520f, - 0.966797f, 0.975586f, 0.976562f, 0.952637f, 0.935547f, 0.920898f, 0.907715f, 0.895996f, - 0.011932f, 0.036499f, 0.061554f, 0.085999f, 0.110962f, 0.135010f, 0.158813f, 0.182373f, - 0.206421f, 0.229004f, 0.251221f, 0.274170f, 0.295654f, 0.317871f, 0.339111f, 0.360107f, - 0.379395f, 0.399414f, 0.420654f, 0.440430f, 0.458252f, 0.477295f, 0.496094f, 0.513672f, - 0.531738f, 0.549805f, 0.566406f, 0.583984f, 0.599121f, 0.616211f, 0.631348f, 0.647461f, - 0.662598f, 0.677734f, 0.692383f, 0.705566f, 0.720703f, 0.734863f, 0.748047f, 0.761230f, - 0.774414f, 0.787598f, 0.799805f, 0.812500f, 0.824707f, 0.837402f, 0.848633f, 0.859375f, - 0.871094f, 0.882324f, 0.892578f, 0.904297f, 0.913574f, 0.924316f, 0.934570f, 0.943848f, - 0.954102f, 0.963867f, 0.970703f, 0.948242f, 0.931641f, 0.917480f, 0.905273f, 0.894043f, - 0.011070f, 0.033478f, 0.056396f, 0.079529f, 0.101990f, 0.125244f, 0.147705f, 0.170410f, - 0.192139f, 0.214111f, 0.235596f, 0.257812f, 0.279053f, 0.300293f, 0.320557f, 0.340576f, - 0.360596f, 0.381104f, 0.400635f, 0.420166f, 0.438965f, 0.458008f, 0.476562f, 0.493652f, - 0.511230f, 0.527832f, 0.545898f, 0.562012f, 0.579102f, 0.595703f, 0.610840f, 0.627930f, - 0.642578f, 0.657227f, 0.672363f, 0.686523f, 0.701660f, 0.715332f, 0.729492f, 0.742676f, - 0.756348f, 0.769531f, 0.782227f, 0.795898f, 0.807617f, 0.820312f, 0.832031f, 0.843262f, - 0.855469f, 0.866699f, 0.877441f, 0.889648f, 0.899414f, 0.910156f, 0.920410f, 0.930664f, - 0.940430f, 0.950684f, 0.964844f, 0.943848f, 0.927734f, 0.914551f, 0.902344f, 0.891602f, - 0.010010f, 0.031067f, 0.051880f, 0.073303f, 0.094421f, 0.116577f, 0.136963f, 0.157959f, - 0.180542f, 0.200684f, 0.221436f, 0.242676f, 0.262939f, 0.283447f, 0.303467f, 0.323242f, - 0.342529f, 0.362305f, 0.381348f, 0.399414f, 0.418701f, 0.437256f, 0.455322f, 0.472412f, - 0.490479f, 0.507812f, 0.524902f, 0.541992f, 0.558105f, 0.574219f, 0.591309f, 0.606445f, - 0.622070f, 0.637695f, 0.652344f, 0.666504f, 0.683594f, 0.695801f, 0.710449f, 0.724121f, - 0.737305f, 0.751465f, 0.765137f, 0.777344f, 0.790039f, 0.802734f, 0.814941f, 0.827637f, - 0.839355f, 0.851074f, 0.862305f, 0.874512f, 0.885254f, 0.895996f, 0.906738f, 0.917480f, - 0.927246f, 0.937988f, 0.958984f, 0.939453f, 0.923828f, 0.911133f, 0.899414f, 0.889160f, - 0.009491f, 0.028305f, 0.047699f, 0.067810f, 0.087341f, 0.107849f, 0.127686f, 0.147827f, - 0.167725f, 0.187744f, 0.207886f, 0.227051f, 0.247314f, 0.266846f, 0.286377f, 0.305908f, - 0.324463f, 0.343262f, 0.361572f, 0.380371f, 0.399658f, 0.416748f, 0.435547f, 0.452881f, - 0.470703f, 0.488281f, 0.503906f, 0.522461f, 0.538086f, 0.554199f, 0.571289f, 0.586914f, - 0.602051f, 0.617676f, 0.633789f, 0.647949f, 0.663086f, 0.677246f, 0.692871f, 0.705078f, - 0.718750f, 0.732910f, 0.746582f, 0.759766f, 0.773438f, 0.785645f, 0.798340f, 0.811035f, - 0.823242f, 0.834961f, 0.847168f, 0.859863f, 0.870117f, 0.881348f, 0.893066f, 0.903320f, - 0.914551f, 0.924316f, 0.953125f, 0.934082f, 0.919434f, 0.906738f, 0.896484f, 0.885742f, - 0.008598f, 0.026245f, 0.044495f, 0.062622f, 0.081177f, 0.100098f, 0.119019f, 0.137817f, - 0.156616f, 0.175903f, 0.194946f, 0.213745f, 0.232788f, 0.251221f, 0.269775f, 0.288330f, - 0.307129f, 0.325928f, 0.344238f, 0.362305f, 0.380371f, 0.397705f, 0.415771f, 0.433105f, - 0.450928f, 0.468262f, 0.484863f, 0.501953f, 0.518555f, 0.534668f, 0.550293f, 0.566406f, - 0.582520f, 0.598145f, 0.612305f, 0.627930f, 0.643555f, 0.657715f, 0.672852f, 0.687500f, - 0.700684f, 0.715332f, 0.728516f, 0.742188f, 0.755371f, 0.769531f, 0.781738f, 0.794434f, - 0.807129f, 0.818359f, 0.831543f, 0.843262f, 0.855469f, 0.865723f, 0.877930f, 0.889160f, - 0.900391f, 0.911621f, 0.946777f, 0.929199f, 0.915039f, 0.903320f, 0.892578f, 0.883301f, - 0.007896f, 0.024490f, 0.041138f, 0.057892f, 0.075439f, 0.092712f, 0.110229f, 0.128296f, - 0.146118f, 0.164429f, 0.181885f, 0.200562f, 0.218628f, 0.236572f, 0.255127f, 0.272949f, - 0.291016f, 0.308594f, 0.326172f, 0.343994f, 0.361816f, 0.380127f, 0.396973f, 0.414551f, - 0.430908f, 0.447998f, 0.465576f, 0.481445f, 0.497559f, 0.514160f, 0.529785f, 0.546387f, - 0.562988f, 0.578613f, 0.593262f, 0.609375f, 0.623047f, 0.638672f, 0.653809f, 0.667480f, - 0.681641f, 0.697266f, 0.710938f, 0.724121f, 0.737305f, 0.752441f, 0.765625f, 0.776367f, - 0.790527f, 0.803223f, 0.815918f, 0.827637f, 0.839844f, 0.851562f, 0.863281f, 0.875000f, - 0.886719f, 0.898926f, 0.940430f, 0.923828f, 0.910645f, 0.899414f, 0.889160f, 0.879883f, - 0.007320f, 0.022369f, 0.038055f, 0.053925f, 0.070190f, 0.086609f, 0.103027f, 0.119568f, - 0.136475f, 0.153320f, 0.170532f, 0.187988f, 0.204834f, 0.223022f, 0.240112f, 0.257324f, - 0.275391f, 0.291504f, 0.308838f, 0.326904f, 0.344727f, 0.361572f, 0.378662f, 0.395020f, - 0.411865f, 0.428711f, 0.445068f, 0.462646f, 0.478271f, 0.494141f, 0.510254f, 0.525879f, - 0.542480f, 0.557129f, 0.573242f, 0.588867f, 0.603516f, 0.618164f, 0.633789f, 0.648438f, - 0.663086f, 0.678223f, 0.691895f, 0.706543f, 0.720215f, 0.733398f, 0.746582f, 0.759766f, - 0.774414f, 0.786621f, 0.799805f, 0.811523f, 0.823730f, 0.836914f, 0.848145f, 0.860840f, - 0.872070f, 0.884277f, 0.933594f, 0.918945f, 0.906250f, 0.895020f, 0.885254f, 0.876953f, - 0.006760f, 0.021011f, 0.034973f, 0.050049f, 0.065369f, 0.080261f, 0.095337f, 0.111633f, - 0.127319f, 0.142822f, 0.159668f, 0.176514f, 0.192383f, 0.209106f, 0.225586f, 0.242554f, - 0.259277f, 0.275635f, 0.292480f, 0.309326f, 0.326904f, 0.343750f, 0.359619f, 0.376465f, - 0.393066f, 0.409424f, 0.426514f, 0.442871f, 0.458252f, 0.475586f, 0.490967f, 0.505859f, - 0.522461f, 0.539062f, 0.554199f, 0.569336f, 0.583984f, 0.600586f, 0.614258f, 0.630371f, - 0.643555f, 0.658691f, 0.673340f, 0.687500f, 0.702148f, 0.715332f, 0.729980f, 0.743652f, - 0.756348f, 0.770020f, 0.782715f, 0.796387f, 0.808105f, 0.820801f, 0.833008f, 0.846680f, - 0.857910f, 0.870117f, 0.927246f, 0.913574f, 0.901367f, 0.891113f, 0.881348f, 0.873047f, - 0.006367f, 0.019165f, 0.032379f, 0.046295f, 0.060089f, 0.074463f, 0.088867f, 0.103821f, - 0.118835f, 0.133911f, 0.149048f, 0.164673f, 0.180298f, 0.196289f, 0.212524f, 0.228516f, - 0.244385f, 0.260742f, 0.277344f, 0.293213f, 0.309570f, 0.326416f, 0.342773f, 0.358887f, - 0.374512f, 0.391113f, 0.406982f, 0.423340f, 0.439453f, 0.455078f, 0.470947f, 0.487793f, - 0.502441f, 0.519043f, 0.533691f, 0.550293f, 0.564941f, 0.580078f, 0.595703f, 0.610840f, - 0.625488f, 0.640137f, 0.654785f, 0.669434f, 0.683594f, 0.696777f, 0.710938f, 0.725586f, - 0.738770f, 0.752441f, 0.766113f, 0.778320f, 0.791016f, 0.805176f, 0.818359f, 0.830566f, - 0.842773f, 0.854980f, 0.920410f, 0.908203f, 0.896484f, 0.886230f, 0.877441f, 0.868652f, - 0.005981f, 0.017914f, 0.030350f, 0.042908f, 0.056213f, 0.069092f, 0.083008f, 0.096619f, - 0.111084f, 0.124634f, 0.139526f, 0.154297f, 0.169312f, 0.184570f, 0.199951f, 0.215454f, - 0.230713f, 0.245728f, 0.261963f, 0.277588f, 0.293213f, 0.309326f, 0.325195f, 0.340820f, - 0.356934f, 0.373047f, 0.388916f, 0.404785f, 0.420410f, 0.436279f, 0.452148f, 0.468506f, - 0.483154f, 0.499756f, 0.515137f, 0.530762f, 0.545898f, 0.560059f, 0.576172f, 0.590820f, - 0.606445f, 0.621094f, 0.635254f, 0.649902f, 0.663574f, 0.678223f, 0.692383f, 0.706543f, - 0.720703f, 0.733887f, 0.748535f, 0.762695f, 0.775391f, 0.789551f, 0.801758f, 0.814941f, - 0.828125f, 0.840332f, 0.913574f, 0.902344f, 0.890625f, 0.881836f, 0.872559f, 0.865234f, - 0.005402f, 0.016617f, 0.028061f, 0.039948f, 0.051758f, 0.064270f, 0.076782f, 0.089600f, - 0.102600f, 0.116455f, 0.130371f, 0.144165f, 0.158936f, 0.172607f, 0.187744f, 0.201904f, - 0.216431f, 0.232422f, 0.247192f, 0.261719f, 0.277100f, 0.292480f, 0.308838f, 0.323975f, - 0.339355f, 0.355469f, 0.371338f, 0.386230f, 0.402344f, 0.417725f, 0.433350f, 0.448486f, - 0.464600f, 0.480225f, 0.495361f, 0.510742f, 0.525879f, 0.541992f, 0.557129f, 0.571777f, - 0.586914f, 0.601562f, 0.616211f, 0.631836f, 0.645508f, 0.661621f, 0.674805f, 0.688965f, - 0.703125f, 0.717773f, 0.731934f, 0.745605f, 0.757812f, 0.772949f, 0.785156f, 0.799316f, - 0.812012f, 0.826172f, 0.906738f, 0.896484f, 0.886230f, 0.876465f, 0.868164f, 0.860840f, - 0.005264f, 0.015457f, 0.026474f, 0.037170f, 0.048157f, 0.059845f, 0.071594f, 0.083984f, - 0.096191f, 0.109070f, 0.121887f, 0.134766f, 0.148193f, 0.161255f, 0.175781f, 0.189209f, - 0.203369f, 0.218384f, 0.233032f, 0.247681f, 0.261963f, 0.277100f, 0.292480f, 0.307129f, - 0.322998f, 0.337891f, 0.352539f, 0.368652f, 0.384033f, 0.399170f, 0.414307f, 0.430420f, - 0.445801f, 0.460693f, 0.475342f, 0.491211f, 0.506836f, 0.521973f, 0.537598f, 0.551758f, - 0.567383f, 0.582520f, 0.598145f, 0.612305f, 0.627441f, 0.642090f, 0.656738f, 0.670898f, - 0.685059f, 0.698730f, 0.713867f, 0.728516f, 0.742188f, 0.755371f, 0.770020f, 0.782715f, - 0.796387f, 0.810547f, 0.899414f, 0.889648f, 0.879883f, 0.872070f, 0.863770f, 0.856445f, - 0.004719f, 0.014229f, 0.024384f, 0.034607f, 0.044708f, 0.055756f, 0.066895f, 0.077942f, - 0.089600f, 0.101624f, 0.113525f, 0.125854f, 0.138428f, 0.151245f, 0.164673f, 0.177734f, - 0.191650f, 0.205078f, 0.219360f, 0.233154f, 0.247925f, 0.261475f, 0.276367f, 0.291504f, - 0.305908f, 0.320312f, 0.335449f, 0.350098f, 0.365723f, 0.380615f, 0.395996f, 0.411133f, - 0.427002f, 0.441895f, 0.456543f, 0.472656f, 0.487793f, 0.502441f, 0.518555f, 0.533203f, - 0.547852f, 0.562988f, 0.577637f, 0.593262f, 0.607910f, 0.623535f, 0.638184f, 0.652344f, - 0.666992f, 0.681641f, 0.696777f, 0.711426f, 0.725098f, 0.738281f, 0.753418f, 0.766113f, - 0.782227f, 0.794922f, 0.892090f, 0.884277f, 0.875000f, 0.866699f, 0.858887f, 0.852539f, - 0.004280f, 0.013329f, 0.022476f, 0.031982f, 0.042114f, 0.051849f, 0.062225f, 0.072449f, - 0.083679f, 0.095032f, 0.105530f, 0.117676f, 0.129517f, 0.141357f, 0.154297f, 0.166748f, - 0.178711f, 0.192505f, 0.205933f, 0.219727f, 0.233521f, 0.247070f, 0.260986f, 0.275391f, - 0.290039f, 0.303955f, 0.319580f, 0.333740f, 0.347412f, 0.363037f, 0.377686f, 0.392822f, - 0.408203f, 0.422852f, 0.437988f, 0.453125f, 0.468506f, 0.483398f, 0.498779f, 0.514160f, - 0.527832f, 0.543945f, 0.559570f, 0.574707f, 0.588867f, 0.604492f, 0.619141f, 0.634277f, - 0.648438f, 0.663086f, 0.678223f, 0.692383f, 0.707520f, 0.721680f, 0.735352f, 0.749512f, - 0.764648f, 0.778320f, 0.884277f, 0.877441f, 0.868652f, 0.861328f, 0.854492f, 0.847656f, - 0.004280f, 0.012138f, 0.021103f, 0.029999f, 0.038940f, 0.048279f, 0.057831f, 0.067566f, - 0.077454f, 0.087524f, 0.098816f, 0.109558f, 0.120728f, 0.131958f, 0.143799f, 0.155762f, - 0.168091f, 0.180176f, 0.193359f, 0.206177f, 0.219360f, 0.232910f, 0.246338f, 0.260254f, - 0.273682f, 0.287598f, 0.302246f, 0.316650f, 0.331299f, 0.344971f, 0.359863f, 0.374268f, - 0.389648f, 0.404297f, 0.419434f, 0.434326f, 0.449463f, 0.464844f, 0.479492f, 0.494141f, - 0.509766f, 0.524414f, 0.540039f, 0.555176f, 0.569824f, 0.584961f, 0.600098f, 0.615723f, - 0.629883f, 0.645508f, 0.659668f, 0.675293f, 0.689453f, 0.704590f, 0.719238f, 0.732422f, - 0.748535f, 0.762207f, 0.876953f, 0.871582f, 0.863281f, 0.855957f, 0.849609f, 0.842773f, - 0.003744f, 0.011436f, 0.019348f, 0.027893f, 0.036102f, 0.044739f, 0.053711f, 0.063110f, - 0.072205f, 0.081970f, 0.091919f, 0.101746f, 0.112732f, 0.122864f, 0.134521f, 0.145996f, - 0.157715f, 0.169434f, 0.181519f, 0.193848f, 0.206665f, 0.219360f, 0.231445f, 0.245361f, - 0.259033f, 0.272217f, 0.286621f, 0.299805f, 0.314209f, 0.328125f, 0.342285f, 0.357178f, - 0.371826f, 0.386475f, 0.400635f, 0.415527f, 0.430420f, 0.445068f, 0.459717f, 0.476074f, - 0.490234f, 0.505371f, 0.521484f, 0.536133f, 0.551758f, 0.565430f, 0.581543f, 0.595703f, - 0.611816f, 0.626465f, 0.641602f, 0.656738f, 0.671875f, 0.686523f, 0.701172f, 0.715820f, - 0.731445f, 0.746582f, 0.868652f, 0.864746f, 0.856934f, 0.851074f, 0.844727f, 0.837891f, - 0.003595f, 0.011093f, 0.018265f, 0.025711f, 0.033600f, 0.041656f, 0.050140f, 0.058350f, - 0.067505f, 0.076416f, 0.085632f, 0.095093f, 0.104919f, 0.115295f, 0.125610f, 0.136108f, - 0.147583f, 0.157959f, 0.169800f, 0.181519f, 0.193359f, 0.205933f, 0.218140f, 0.231323f, - 0.243652f, 0.257324f, 0.270508f, 0.283447f, 0.297363f, 0.311523f, 0.325928f, 0.339111f, - 0.353516f, 0.367432f, 0.382812f, 0.396973f, 0.412109f, 0.426758f, 0.441406f, 0.456055f, - 0.471436f, 0.486328f, 0.501953f, 0.516113f, 0.531738f, 0.546875f, 0.562500f, 0.577637f, - 0.592773f, 0.607910f, 0.622559f, 0.638184f, 0.653809f, 0.669434f, 0.684082f, 0.699219f, - 0.714355f, 0.729492f, 0.860840f, 0.857422f, 0.852051f, 0.844727f, 0.839355f, 0.832520f, - 0.003349f, 0.009933f, 0.016754f, 0.024063f, 0.031204f, 0.038849f, 0.046356f, 0.054413f, - 0.062744f, 0.070984f, 0.080017f, 0.088989f, 0.097778f, 0.107361f, 0.117004f, 0.127197f, - 0.137451f, 0.148071f, 0.159180f, 0.169922f, 0.181519f, 0.192993f, 0.204956f, 0.217407f, - 0.229980f, 0.242188f, 0.254883f, 0.267578f, 0.281494f, 0.294434f, 0.307861f, 0.321533f, - 0.335693f, 0.350098f, 0.364258f, 0.379150f, 0.393066f, 0.407715f, 0.422607f, 0.437500f, - 0.452148f, 0.467041f, 0.482422f, 0.497314f, 0.512695f, 0.527832f, 0.542969f, 0.558594f, - 0.573730f, 0.589844f, 0.604004f, 0.619629f, 0.635254f, 0.651367f, 0.665527f, 0.681152f, - 0.696289f, 0.711914f, 0.852539f, 0.851562f, 0.846191f, 0.838867f, 0.832520f, 0.827637f, - 0.003290f, 0.009415f, 0.015976f, 0.022095f, 0.028946f, 0.036255f, 0.043396f, 0.050598f, - 0.058502f, 0.066284f, 0.074036f, 0.082275f, 0.091187f, 0.099731f, 0.108826f, 0.118652f, - 0.128296f, 0.137939f, 0.148193f, 0.159302f, 0.170166f, 0.180786f, 0.191895f, 0.203491f, - 0.215210f, 0.227661f, 0.240112f, 0.252686f, 0.265625f, 0.278564f, 0.291748f, 0.305176f, - 0.318604f, 0.332764f, 0.346924f, 0.360352f, 0.375000f, 0.389160f, 0.404297f, 0.418213f, - 0.433105f, 0.448486f, 0.463135f, 0.477783f, 0.493408f, 0.508301f, 0.523438f, 0.540039f, - 0.554199f, 0.570312f, 0.585938f, 0.601074f, 0.617188f, 0.633301f, 0.648926f, 0.664062f, - 0.679688f, 0.695312f, 0.844727f, 0.844238f, 0.838867f, 0.833008f, 0.827148f, 0.822266f, - 0.002913f, 0.008621f, 0.014595f, 0.020950f, 0.027496f, 0.033600f, 0.040558f, 0.047119f, - 0.054260f, 0.061615f, 0.068970f, 0.076782f, 0.084717f, 0.093140f, 0.101562f, 0.109985f, - 0.118591f, 0.129150f, 0.138306f, 0.148682f, 0.158447f, 0.169189f, 0.180054f, 0.191162f, - 0.202148f, 0.213379f, 0.225586f, 0.237305f, 0.250488f, 0.262939f, 0.275391f, 0.288086f, - 0.302490f, 0.315186f, 0.329346f, 0.342529f, 0.356934f, 0.370117f, 0.385742f, 0.400146f, - 0.414795f, 0.429199f, 0.444336f, 0.459473f, 0.473389f, 0.489258f, 0.503906f, 0.519531f, - 0.535645f, 0.551270f, 0.566895f, 0.582520f, 0.598145f, 0.614258f, 0.629395f, 0.645996f, - 0.661621f, 0.677734f, 0.837402f, 0.836914f, 0.832520f, 0.826660f, 0.821777f, 0.816406f, - 0.002748f, 0.008018f, 0.014168f, 0.019196f, 0.025040f, 0.031250f, 0.037506f, 0.043732f, - 0.050415f, 0.057098f, 0.063721f, 0.071167f, 0.078979f, 0.086609f, 0.094299f, 0.102783f, - 0.111145f, 0.119812f, 0.128296f, 0.138306f, 0.147583f, 0.157593f, 0.168213f, 0.178711f, - 0.188843f, 0.200317f, 0.211792f, 0.223511f, 0.235352f, 0.247192f, 0.259521f, 0.272461f, - 0.285156f, 0.298584f, 0.312012f, 0.324707f, 0.339111f, 0.352783f, 0.366943f, 0.381348f, - 0.395996f, 0.410889f, 0.425537f, 0.439941f, 0.454834f, 0.470459f, 0.485352f, 0.501953f, - 0.516113f, 0.531738f, 0.547363f, 0.563477f, 0.579102f, 0.595703f, 0.611328f, 0.626953f, - 0.642578f, 0.659668f, 0.828125f, 0.830566f, 0.825684f, 0.820801f, 0.815430f, 0.811035f, - 0.002630f, 0.007412f, 0.012978f, 0.018356f, 0.023758f, 0.028931f, 0.034729f, 0.040894f, - 0.046631f, 0.053101f, 0.059143f, 0.065979f, 0.073669f, 0.080200f, 0.087585f, 0.095276f, - 0.102844f, 0.111633f, 0.119812f, 0.128296f, 0.137573f, 0.146729f, 0.156128f, 0.166382f, - 0.176880f, 0.187256f, 0.197998f, 0.209351f, 0.220581f, 0.232422f, 0.244385f, 0.256592f, - 0.268799f, 0.281982f, 0.294922f, 0.308105f, 0.321045f, 0.334717f, 0.348633f, 0.363525f, - 0.378174f, 0.391846f, 0.406006f, 0.420898f, 0.436279f, 0.451660f, 0.466064f, 0.481934f, - 0.496826f, 0.513184f, 0.528320f, 0.543945f, 0.560059f, 0.576660f, 0.592285f, 0.608887f, - 0.625000f, 0.640625f, 0.819336f, 0.822266f, 0.818848f, 0.813965f, 0.810059f, 0.805664f, - 0.002201f, 0.007240f, 0.011803f, 0.016617f, 0.021622f, 0.027344f, 0.032288f, 0.037598f, - 0.043427f, 0.049194f, 0.055267f, 0.061462f, 0.067566f, 0.073853f, 0.080872f, 0.088013f, - 0.095703f, 0.103821f, 0.111145f, 0.119446f, 0.127563f, 0.136597f, 0.145752f, 0.155273f, - 0.165039f, 0.174683f, 0.185181f, 0.195801f, 0.206543f, 0.218140f, 0.229370f, 0.241455f, - 0.253174f, 0.265381f, 0.278564f, 0.291504f, 0.304199f, 0.317383f, 0.331299f, 0.344971f, - 0.358643f, 0.373291f, 0.386963f, 0.402100f, 0.416016f, 0.431641f, 0.447266f, 0.462646f, - 0.477295f, 0.493652f, 0.509277f, 0.524902f, 0.541504f, 0.557617f, 0.574219f, 0.589844f, - 0.605957f, 0.623047f, 0.810059f, 0.814453f, 0.811035f, 0.807129f, 0.803223f, 0.798828f, - 0.002293f, 0.006927f, 0.010994f, 0.015617f, 0.020584f, 0.025131f, 0.029663f, 0.034760f, - 0.040192f, 0.045532f, 0.050964f, 0.056793f, 0.062805f, 0.068726f, 0.074890f, 0.081482f, - 0.088806f, 0.096069f, 0.103333f, 0.110535f, 0.118896f, 0.126709f, 0.135254f, 0.144165f, - 0.153442f, 0.162720f, 0.172119f, 0.182495f, 0.192749f, 0.203735f, 0.214600f, 0.225952f, - 0.237793f, 0.250000f, 0.261719f, 0.274170f, 0.287354f, 0.300293f, 0.313477f, 0.326904f, - 0.340820f, 0.354980f, 0.369385f, 0.383545f, 0.396973f, 0.411865f, 0.427734f, 0.442871f, - 0.458740f, 0.473633f, 0.489502f, 0.505859f, 0.522461f, 0.537598f, 0.553711f, 0.572754f, - 0.588379f, 0.604492f, 0.802246f, 0.807617f, 0.804199f, 0.800781f, 0.797363f, 0.792969f, - 0.002081f, 0.006172f, 0.010460f, 0.014503f, 0.019104f, 0.023163f, 0.027832f, 0.032410f, - 0.037354f, 0.041992f, 0.047211f, 0.052490f, 0.057831f, 0.063232f, 0.069458f, 0.075317f, - 0.082153f, 0.088257f, 0.094910f, 0.102295f, 0.110107f, 0.117554f, 0.125122f, 0.133667f, - 0.142456f, 0.151001f, 0.160767f, 0.169922f, 0.179443f, 0.190430f, 0.200562f, 0.211914f, - 0.222412f, 0.234009f, 0.245850f, 0.258545f, 0.270752f, 0.283203f, 0.296387f, 0.309082f, - 0.322998f, 0.336670f, 0.350098f, 0.364990f, 0.378906f, 0.393311f, 0.408936f, 0.423096f, - 0.438965f, 0.454834f, 0.470703f, 0.486572f, 0.502441f, 0.518555f, 0.534668f, 0.551270f, - 0.569336f, 0.585938f, 0.792480f, 0.799316f, 0.797363f, 0.793457f, 0.790039f, 0.786621f, - 0.002028f, 0.005669f, 0.009705f, 0.013565f, 0.017532f, 0.021286f, 0.025574f, 0.030197f, - 0.034180f, 0.038757f, 0.043488f, 0.048737f, 0.053497f, 0.058594f, 0.064026f, 0.070007f, - 0.075623f, 0.081360f, 0.088135f, 0.094238f, 0.101379f, 0.108643f, 0.116028f, 0.123718f, - 0.131592f, 0.140137f, 0.149048f, 0.157715f, 0.167114f, 0.176636f, 0.187012f, 0.197388f, - 0.208130f, 0.219238f, 0.230347f, 0.241943f, 0.254150f, 0.266113f, 0.279053f, 0.291504f, - 0.304932f, 0.318848f, 0.332031f, 0.345947f, 0.360107f, 0.375000f, 0.389404f, 0.404541f, - 0.419922f, 0.434814f, 0.450684f, 0.466553f, 0.482910f, 0.499023f, 0.516113f, 0.533203f, - 0.550293f, 0.567383f, 0.783203f, 0.790527f, 0.789551f, 0.786621f, 0.783691f, 0.780762f, - 0.001852f, 0.005554f, 0.008957f, 0.012642f, 0.016296f, 0.020172f, 0.024033f, 0.027878f, - 0.031677f, 0.035919f, 0.040253f, 0.044952f, 0.049255f, 0.053955f, 0.058960f, 0.063965f, - 0.069336f, 0.074951f, 0.080933f, 0.087219f, 0.093201f, 0.100159f, 0.106689f, 0.114197f, - 0.121521f, 0.129517f, 0.137817f, 0.146118f, 0.155151f, 0.164307f, 0.173462f, 0.183472f, - 0.193970f, 0.204224f, 0.215210f, 0.226562f, 0.238037f, 0.250244f, 0.262451f, 0.274902f, - 0.287598f, 0.301025f, 0.314209f, 0.327393f, 0.342041f, 0.356445f, 0.370850f, 0.385254f, - 0.400879f, 0.415771f, 0.431396f, 0.446777f, 0.463379f, 0.480469f, 0.497314f, 0.514160f, - 0.530273f, 0.547363f, 0.774414f, 0.783203f, 0.782715f, 0.779297f, 0.776367f, 0.773438f, - 0.001690f, 0.005207f, 0.008278f, 0.011696f, 0.015068f, 0.018784f, 0.022186f, 0.025909f, - 0.029221f, 0.033508f, 0.037109f, 0.041321f, 0.045471f, 0.049774f, 0.054108f, 0.058838f, - 0.063843f, 0.069214f, 0.074280f, 0.080078f, 0.086243f, 0.091980f, 0.098083f, 0.105164f, - 0.111877f, 0.119446f, 0.126953f, 0.134888f, 0.143555f, 0.151978f, 0.161133f, 0.170532f, - 0.180176f, 0.189697f, 0.200684f, 0.211182f, 0.222412f, 0.234009f, 0.245972f, 0.257568f, - 0.270508f, 0.282959f, 0.295898f, 0.309570f, 0.323486f, 0.337158f, 0.351562f, 0.366211f, - 0.381104f, 0.396729f, 0.411865f, 0.427490f, 0.443604f, 0.459961f, 0.477051f, 0.494385f, - 0.510742f, 0.529297f, 0.763184f, 0.774902f, 0.773438f, 0.771973f, 0.769043f, 0.767578f, - 0.001528f, 0.004692f, 0.007587f, 0.010956f, 0.014221f, 0.016907f, 0.020218f, 0.023407f, - 0.027283f, 0.030273f, 0.033997f, 0.038055f, 0.041809f, 0.045959f, 0.049683f, 0.053955f, - 0.058838f, 0.063171f, 0.068176f, 0.073120f, 0.078491f, 0.084473f, 0.090332f, 0.096619f, - 0.102905f, 0.109619f, 0.116699f, 0.124207f, 0.131958f, 0.140503f, 0.148438f, 0.157349f, - 0.166626f, 0.176392f, 0.186157f, 0.196045f, 0.207031f, 0.218018f, 0.229736f, 0.241699f, - 0.253174f, 0.265381f, 0.278320f, 0.291748f, 0.305176f, 0.318848f, 0.333496f, 0.347412f, - 0.362305f, 0.376709f, 0.392822f, 0.407715f, 0.424072f, 0.440430f, 0.457031f, 0.473633f, - 0.491211f, 0.508789f, 0.753906f, 0.766602f, 0.767090f, 0.764160f, 0.761719f, 0.759766f, - 0.001261f, 0.004250f, 0.007389f, 0.010185f, 0.013023f, 0.015976f, 0.018692f, 0.021713f, - 0.024734f, 0.028183f, 0.031464f, 0.034943f, 0.038452f, 0.041870f, 0.045410f, 0.049561f, - 0.054047f, 0.058044f, 0.062164f, 0.067017f, 0.071838f, 0.077332f, 0.082581f, 0.088318f, - 0.094360f, 0.100525f, 0.107117f, 0.114258f, 0.121643f, 0.128540f, 0.136841f, 0.144897f, - 0.153931f, 0.162476f, 0.171875f, 0.182007f, 0.192139f, 0.202637f, 0.213623f, 0.224854f, - 0.237183f, 0.248657f, 0.260986f, 0.274170f, 0.287354f, 0.300781f, 0.314453f, 0.328613f, - 0.343018f, 0.358643f, 0.373291f, 0.388916f, 0.404785f, 0.420654f, 0.437744f, 0.454590f, - 0.471924f, 0.489990f, 0.744629f, 0.757812f, 0.757812f, 0.756836f, 0.754395f, 0.752441f, - 0.001527f, 0.004047f, 0.006680f, 0.009369f, 0.012024f, 0.014618f, 0.017288f, 0.020248f, - 0.022705f, 0.025803f, 0.028778f, 0.031769f, 0.034912f, 0.038330f, 0.041595f, 0.045166f, - 0.048737f, 0.052673f, 0.056885f, 0.061218f, 0.065552f, 0.070251f, 0.075012f, 0.080505f, - 0.086060f, 0.091614f, 0.097656f, 0.104065f, 0.110901f, 0.118225f, 0.125366f, 0.133179f, - 0.141357f, 0.149902f, 0.158569f, 0.168213f, 0.177734f, 0.187866f, 0.198364f, 0.208984f, - 0.220581f, 0.232422f, 0.244019f, 0.256836f, 0.269287f, 0.282471f, 0.296143f, 0.309326f, - 0.324463f, 0.338379f, 0.353760f, 0.368652f, 0.385498f, 0.400635f, 0.417725f, 0.434570f, - 0.451660f, 0.469482f, 0.733887f, 0.749023f, 0.750977f, 0.749023f, 0.747070f, 0.744629f, - 0.001313f, 0.003803f, 0.006126f, 0.008507f, 0.011185f, 0.013550f, 0.015839f, 0.018219f, - 0.021027f, 0.023438f, 0.026520f, 0.029129f, 0.031738f, 0.034821f, 0.037964f, 0.041138f, - 0.044434f, 0.048035f, 0.051636f, 0.055420f, 0.059540f, 0.063782f, 0.068176f, 0.073181f, - 0.077881f, 0.083496f, 0.088989f, 0.094849f, 0.101440f, 0.107849f, 0.114441f, 0.121887f, - 0.129395f, 0.137207f, 0.145874f, 0.154419f, 0.163574f, 0.173462f, 0.183228f, 0.193726f, - 0.204712f, 0.216064f, 0.227661f, 0.239624f, 0.251709f, 0.264648f, 0.277832f, 0.291504f, - 0.305664f, 0.320312f, 0.334473f, 0.349854f, 0.365479f, 0.380615f, 0.397217f, 0.414551f, - 0.432129f, 0.449951f, 0.722656f, 0.740234f, 0.741699f, 0.741211f, 0.739746f, 0.737793f, - 0.001137f, 0.003654f, 0.005871f, 0.007881f, 0.010262f, 0.012268f, 0.014496f, 0.017059f, - 0.018890f, 0.021317f, 0.023605f, 0.026291f, 0.029007f, 0.031494f, 0.034515f, 0.036987f, - 0.040375f, 0.043457f, 0.046936f, 0.050385f, 0.053925f, 0.058044f, 0.061981f, 0.066650f, - 0.070679f, 0.075562f, 0.080994f, 0.085938f, 0.091919f, 0.098450f, 0.104370f, 0.110840f, - 0.118164f, 0.125366f, 0.133301f, 0.141357f, 0.150024f, 0.159546f, 0.168457f, 0.178711f, - 0.189453f, 0.199707f, 0.211060f, 0.222656f, 0.234741f, 0.247314f, 0.260010f, 0.272705f, - 0.287354f, 0.300781f, 0.315674f, 0.330322f, 0.345947f, 0.362061f, 0.377441f, 0.394775f, - 0.412109f, 0.429199f, 0.712891f, 0.730957f, 0.733398f, 0.733398f, 0.731445f, 0.729492f, - 0.001163f, 0.003218f, 0.005329f, 0.007542f, 0.009331f, 0.011330f, 0.013367f, 0.015434f, - 0.017685f, 0.019714f, 0.021515f, 0.024139f, 0.026062f, 0.028763f, 0.031204f, 0.033722f, - 0.036163f, 0.039398f, 0.041992f, 0.045624f, 0.048553f, 0.051971f, 0.056000f, 0.059937f, - 0.063904f, 0.068054f, 0.072876f, 0.077820f, 0.083374f, 0.088623f, 0.094116f, 0.100830f, - 0.107117f, 0.114197f, 0.121399f, 0.129272f, 0.136963f, 0.145630f, 0.154785f, 0.163696f, - 0.173828f, 0.184204f, 0.194946f, 0.205933f, 0.217529f, 0.229614f, 0.242676f, 0.255859f, - 0.269043f, 0.282471f, 0.296387f, 0.311523f, 0.326172f, 0.341553f, 0.357910f, 0.374756f, - 0.391846f, 0.409180f, 0.701660f, 0.721680f, 0.723633f, 0.724609f, 0.723145f, 0.722656f, - 0.001008f, 0.003147f, 0.004818f, 0.006882f, 0.008530f, 0.010468f, 0.012390f, 0.013832f, - 0.016006f, 0.017899f, 0.019608f, 0.021866f, 0.023849f, 0.025940f, 0.027847f, 0.030350f, - 0.032806f, 0.035187f, 0.037994f, 0.040619f, 0.043732f, 0.046875f, 0.050110f, 0.053833f, - 0.057617f, 0.061371f, 0.065613f, 0.070068f, 0.074768f, 0.079895f, 0.085144f, 0.090637f, - 0.096863f, 0.103149f, 0.110107f, 0.116943f, 0.124634f, 0.132568f, 0.140991f, 0.149536f, - 0.159302f, 0.169189f, 0.179443f, 0.189575f, 0.201538f, 0.213013f, 0.225342f, 0.236938f, - 0.250244f, 0.264160f, 0.278320f, 0.292236f, 0.307617f, 0.322021f, 0.337891f, 0.354248f, - 0.371582f, 0.389160f, 0.689941f, 0.712891f, 0.715820f, 0.715820f, 0.715820f, 0.714355f, - 0.001126f, 0.002708f, 0.004486f, 0.006313f, 0.007927f, 0.009659f, 0.011238f, 0.012833f, - 0.014435f, 0.015823f, 0.017670f, 0.019485f, 0.021347f, 0.023453f, 0.025101f, 0.027161f, - 0.029160f, 0.031525f, 0.033752f, 0.036560f, 0.039154f, 0.041687f, 0.044891f, 0.047943f, - 0.051453f, 0.054871f, 0.058655f, 0.062622f, 0.067078f, 0.071411f, 0.076355f, 0.081665f, - 0.086792f, 0.092957f, 0.098877f, 0.105713f, 0.112549f, 0.119995f, 0.127563f, 0.135864f, - 0.144897f, 0.154297f, 0.164185f, 0.173828f, 0.185059f, 0.196045f, 0.208008f, 0.219849f, - 0.232666f, 0.245483f, 0.259033f, 0.273438f, 0.287842f, 0.302734f, 0.318604f, 0.334473f, - 0.351318f, 0.369385f, 0.679688f, 0.702637f, 0.707031f, 0.707031f, 0.707031f, 0.705566f, - 0.000980f, 0.002733f, 0.004021f, 0.005688f, 0.007084f, 0.008553f, 0.010345f, 0.011513f, - 0.012962f, 0.014297f, 0.015823f, 0.017609f, 0.019119f, 0.020721f, 0.022568f, 0.024200f, - 0.026291f, 0.028000f, 0.030457f, 0.032410f, 0.034912f, 0.037476f, 0.039734f, 0.042786f, - 0.045563f, 0.048920f, 0.052185f, 0.055817f, 0.059662f, 0.063660f, 0.067993f, 0.072632f, - 0.077759f, 0.083191f, 0.088623f, 0.094971f, 0.101135f, 0.107849f, 0.115479f, 0.122864f, - 0.131592f, 0.139893f, 0.149414f, 0.158447f, 0.169067f, 0.179443f, 0.191040f, 0.202393f, - 0.214478f, 0.227539f, 0.240723f, 0.255127f, 0.268555f, 0.283447f, 0.298828f, 0.315186f, - 0.331787f, 0.348389f, 0.667480f, 0.693359f, 0.697754f, 0.698730f, 0.698242f, 0.697754f, - 0.000870f, 0.002420f, 0.003994f, 0.005165f, 0.006584f, 0.007763f, 0.009209f, 0.010468f, - 0.011604f, 0.013336f, 0.013977f, 0.015442f, 0.016830f, 0.018509f, 0.020065f, 0.021606f, - 0.023224f, 0.024933f, 0.026672f, 0.028656f, 0.030914f, 0.033112f, 0.035187f, 0.037689f, - 0.040344f, 0.043335f, 0.046234f, 0.049438f, 0.052948f, 0.056427f, 0.060394f, 0.064331f, - 0.069031f, 0.073853f, 0.078735f, 0.084412f, 0.090271f, 0.096436f, 0.103455f, 0.110229f, - 0.118042f, 0.126099f, 0.134766f, 0.143921f, 0.153198f, 0.163696f, 0.174438f, 0.185913f, - 0.197754f, 0.210083f, 0.222778f, 0.235962f, 0.250000f, 0.264648f, 0.279053f, 0.294922f, - 0.311279f, 0.328613f, 0.655273f, 0.684082f, 0.688477f, 0.689941f, 0.689941f, 0.689941f, - 0.000790f, 0.002153f, 0.003576f, 0.004726f, 0.005966f, 0.007172f, 0.008186f, 0.009453f, - 0.010521f, 0.011482f, 0.012772f, 0.013771f, 0.015144f, 0.016434f, 0.017792f, 0.019226f, - 0.020355f, 0.022049f, 0.023666f, 0.025375f, 0.027145f, 0.029297f, 0.030975f, 0.033142f, - 0.035339f, 0.037964f, 0.040405f, 0.043365f, 0.046478f, 0.049744f, 0.053101f, 0.057068f, - 0.060944f, 0.065063f, 0.069763f, 0.074646f, 0.079956f, 0.085938f, 0.091675f, 0.098083f, - 0.105164f, 0.112732f, 0.121033f, 0.129395f, 0.138428f, 0.148560f, 0.158325f, 0.169067f, - 0.180664f, 0.192139f, 0.205078f, 0.217529f, 0.231934f, 0.246094f, 0.260010f, 0.275391f, - 0.292236f, 0.309570f, 0.644043f, 0.673340f, 0.678711f, 0.680664f, 0.680664f, 0.680176f, - 0.000538f, 0.002022f, 0.003185f, 0.004456f, 0.005360f, 0.006321f, 0.007286f, 0.008484f, - 0.009422f, 0.010185f, 0.011177f, 0.012283f, 0.013191f, 0.014435f, 0.015587f, 0.016769f, - 0.017914f, 0.019302f, 0.020584f, 0.022171f, 0.023819f, 0.025391f, 0.027222f, 0.028992f, - 0.030914f, 0.033234f, 0.035461f, 0.037903f, 0.040649f, 0.043396f, 0.046326f, 0.049561f, - 0.053131f, 0.056946f, 0.061279f, 0.065613f, 0.070374f, 0.075439f, 0.080811f, 0.086731f, - 0.093140f, 0.100037f, 0.107544f, 0.115662f, 0.124023f, 0.132935f, 0.143066f, 0.153320f, - 0.163696f, 0.175415f, 0.187012f, 0.200195f, 0.213013f, 0.227173f, 0.241455f, 0.256592f, - 0.272461f, 0.288330f, 0.632812f, 0.663574f, 0.669434f, 0.670898f, 0.671387f, 0.671875f, - 0.000686f, 0.001864f, 0.002884f, 0.003883f, 0.004829f, 0.005592f, 0.006504f, 0.007454f, - 0.008064f, 0.008995f, 0.009850f, 0.010948f, 0.011711f, 0.012581f, 0.013763f, 0.014618f, - 0.015701f, 0.016953f, 0.018112f, 0.019180f, 0.020691f, 0.021973f, 0.023560f, 0.025192f, - 0.026962f, 0.028717f, 0.030624f, 0.032959f, 0.035004f, 0.037567f, 0.040314f, 0.043121f, - 0.046204f, 0.049713f, 0.053284f, 0.057129f, 0.061157f, 0.065796f, 0.071167f, 0.076477f, - 0.082214f, 0.088379f, 0.095276f, 0.102600f, 0.110596f, 0.118652f, 0.127808f, 0.137817f, - 0.147705f, 0.158569f, 0.170166f, 0.182251f, 0.195068f, 0.208008f, 0.222656f, 0.237671f, - 0.252686f, 0.269287f, 0.620605f, 0.653320f, 0.659180f, 0.661621f, 0.663086f, 0.663574f, - 0.000782f, 0.001828f, 0.002949f, 0.003487f, 0.004421f, 0.005032f, 0.005878f, 0.006557f, - 0.007332f, 0.008110f, 0.008591f, 0.009537f, 0.010094f, 0.011147f, 0.011864f, 0.012779f, - 0.013573f, 0.014549f, 0.015625f, 0.016846f, 0.017822f, 0.018936f, 0.020279f, 0.021729f, - 0.023117f, 0.024704f, 0.026505f, 0.028183f, 0.030289f, 0.032349f, 0.034546f, 0.037109f, - 0.039703f, 0.042786f, 0.045837f, 0.049133f, 0.053009f, 0.056763f, 0.061584f, 0.066284f, - 0.071411f, 0.076843f, 0.083191f, 0.089722f, 0.097290f, 0.104919f, 0.113647f, 0.122498f, - 0.132324f, 0.142578f, 0.153809f, 0.164917f, 0.177612f, 0.190430f, 0.203857f, 0.218506f, - 0.233887f, 0.249390f, 0.606934f, 0.642578f, 0.649414f, 0.653320f, 0.652832f, 0.654785f, - 0.000604f, 0.001636f, 0.002550f, 0.003180f, 0.003799f, 0.004498f, 0.005051f, 0.005573f, - 0.006325f, 0.006836f, 0.007607f, 0.008087f, 0.008820f, 0.009483f, 0.010132f, 0.010918f, - 0.011665f, 0.012527f, 0.013535f, 0.014297f, 0.015251f, 0.016190f, 0.017288f, 0.018433f, - 0.019791f, 0.021133f, 0.022400f, 0.023865f, 0.025742f, 0.027664f, 0.029373f, 0.031677f, - 0.034027f, 0.036255f, 0.039032f, 0.042023f, 0.045197f, 0.048798f, 0.052643f, 0.056824f, - 0.061493f, 0.066467f, 0.072327f, 0.078308f, 0.084473f, 0.091858f, 0.099609f, 0.108032f, - 0.117249f, 0.126831f, 0.137451f, 0.148193f, 0.160034f, 0.172729f, 0.186035f, 0.199829f, - 0.214722f, 0.229980f, 0.596680f, 0.632812f, 0.638672f, 0.642578f, 0.644531f, 0.645020f, - 0.000447f, 0.001384f, 0.001986f, 0.002697f, 0.003225f, 0.003828f, 0.004501f, 0.005009f, - 0.005459f, 0.006027f, 0.006474f, 0.006935f, 0.007591f, 0.008217f, 0.008644f, 0.009308f, - 0.010025f, 0.010498f, 0.011330f, 0.012100f, 0.012909f, 0.013924f, 0.014618f, 0.015610f, - 0.016739f, 0.017807f, 0.019043f, 0.020340f, 0.021622f, 0.023178f, 0.024979f, 0.026520f, - 0.028366f, 0.030640f, 0.032959f, 0.035492f, 0.038239f, 0.041260f, 0.044495f, 0.048340f, - 0.052399f, 0.056732f, 0.061768f, 0.067017f, 0.072754f, 0.079224f, 0.086304f, 0.093994f, - 0.102478f, 0.111511f, 0.121521f, 0.132080f, 0.143311f, 0.155518f, 0.168213f, 0.181763f, - 0.196411f, 0.211548f, 0.583008f, 0.621094f, 0.629395f, 0.632324f, 0.634766f, 0.635742f, - 0.000375f, 0.001324f, 0.001728f, 0.002466f, 0.002872f, 0.003384f, 0.003685f, 0.004185f, - 0.004845f, 0.005184f, 0.005444f, 0.006130f, 0.006401f, 0.006844f, 0.007446f, 0.007957f, - 0.008636f, 0.008965f, 0.009659f, 0.010139f, 0.010971f, 0.011742f, 0.012497f, 0.013138f, - 0.014099f, 0.014992f, 0.015900f, 0.017166f, 0.018143f, 0.019485f, 0.020676f, 0.022156f, - 0.023697f, 0.025528f, 0.027374f, 0.029556f, 0.031921f, 0.034424f, 0.037445f, 0.040375f, - 0.044067f, 0.047577f, 0.052155f, 0.056824f, 0.062042f, 0.067688f, 0.074158f, 0.081055f, - 0.088745f, 0.097351f, 0.106323f, 0.116455f, 0.127075f, 0.138672f, 0.151123f, 0.164062f, - 0.177856f, 0.192871f, 0.570801f, 0.610840f, 0.619629f, 0.623047f, 0.625488f, 0.625977f, - 0.000432f, 0.000921f, 0.001664f, 0.002056f, 0.002697f, 0.003061f, 0.003326f, 0.003757f, - 0.004044f, 0.004379f, 0.004761f, 0.004948f, 0.005463f, 0.005791f, 0.006199f, 0.006752f, - 0.007229f, 0.007526f, 0.008156f, 0.008621f, 0.009193f, 0.009712f, 0.010330f, 0.010994f, - 0.011688f, 0.012466f, 0.013374f, 0.014153f, 0.015099f, 0.016083f, 0.017212f, 0.018250f, - 0.019623f, 0.021210f, 0.022614f, 0.024445f, 0.026321f, 0.028351f, 0.030762f, 0.033325f, - 0.036377f, 0.039642f, 0.043304f, 0.047485f, 0.051880f, 0.056885f, 0.062469f, 0.068542f, - 0.075623f, 0.083374f, 0.091919f, 0.101135f, 0.111389f, 0.122559f, 0.134277f, 0.146606f, - 0.160278f, 0.174683f, 0.557617f, 0.600098f, 0.609375f, 0.612793f, 0.615723f, 0.616699f, - 0.000255f, 0.000997f, 0.001393f, 0.001908f, 0.002239f, 0.002512f, 0.002720f, 0.003166f, - 0.003283f, 0.003616f, 0.003866f, 0.004223f, 0.004597f, 0.004795f, 0.005127f, 0.005573f, - 0.005939f, 0.006359f, 0.006657f, 0.007133f, 0.007687f, 0.008041f, 0.008545f, 0.009087f, - 0.009636f, 0.010300f, 0.010910f, 0.011757f, 0.012489f, 0.013313f, 0.014153f, 0.014954f, - 0.016037f, 0.017258f, 0.018555f, 0.019867f, 0.021530f, 0.023239f, 0.025055f, 0.027252f, - 0.029663f, 0.032379f, 0.035339f, 0.038666f, 0.042664f, 0.047058f, 0.051849f, 0.057465f, - 0.063416f, 0.070557f, 0.078369f, 0.086731f, 0.096313f, 0.106384f, 0.117798f, 0.129761f, - 0.143311f, 0.156982f, 0.544922f, 0.588867f, 0.599121f, 0.602539f, 0.605469f, 0.606445f, - 0.000353f, 0.000879f, 0.001276f, 0.001613f, 0.001785f, 0.002075f, 0.002300f, 0.002501f, - 0.002808f, 0.003010f, 0.003283f, 0.003487f, 0.003714f, 0.003967f, 0.004269f, 0.004597f, - 0.004837f, 0.005230f, 0.005512f, 0.005878f, 0.006203f, 0.006626f, 0.007030f, 0.007519f, - 0.007866f, 0.008354f, 0.009010f, 0.009468f, 0.010017f, 0.010765f, 0.011444f, 0.012291f, - 0.013100f, 0.014030f, 0.015030f, 0.016098f, 0.017441f, 0.018646f, 0.020157f, 0.021912f, - 0.023804f, 0.026047f, 0.028488f, 0.031342f, 0.034424f, 0.037994f, 0.042206f, 0.046997f, - 0.052338f, 0.058533f, 0.065369f, 0.073364f, 0.081787f, 0.091492f, 0.102356f, 0.113647f, - 0.126343f, 0.139526f, 0.531250f, 0.579102f, 0.587891f, 0.592773f, 0.595703f, 0.596680f, - 0.000295f, 0.000784f, 0.000912f, 0.001261f, 0.001517f, 0.001761f, 0.001893f, 0.002113f, - 0.002211f, 0.002432f, 0.002676f, 0.002861f, 0.002993f, 0.003294f, 0.003479f, 0.003700f, - 0.003933f, 0.004242f, 0.004452f, 0.004745f, 0.004974f, 0.005428f, 0.005642f, 0.006081f, - 0.006401f, 0.006817f, 0.007240f, 0.007641f, 0.008209f, 0.008667f, 0.009361f, 0.009720f, - 0.010506f, 0.011261f, 0.012024f, 0.012794f, 0.013840f, 0.014893f, 0.016113f, 0.017395f, - 0.018860f, 0.020493f, 0.022446f, 0.024658f, 0.027283f, 0.030228f, 0.033691f, 0.037659f, - 0.042145f, 0.047546f, 0.053467f, 0.060547f, 0.068359f, 0.077332f, 0.087158f, 0.098145f, - 0.109741f, 0.123230f, 0.517090f, 0.566895f, 0.576660f, 0.581543f, 0.584961f, 0.587402f, - 0.000247f, 0.000702f, 0.000849f, 0.001033f, 0.001304f, 0.001416f, 0.001576f, 0.001754f, - 0.001860f, 0.001953f, 0.002104f, 0.002327f, 0.002419f, 0.002651f, 0.002785f, 0.003014f, - 0.003134f, 0.003315f, 0.003584f, 0.003813f, 0.004078f, 0.004295f, 0.004555f, 0.004784f, - 0.005013f, 0.005329f, 0.005669f, 0.006069f, 0.006439f, 0.006821f, 0.007381f, 0.007797f, - 0.008301f, 0.008812f, 0.009430f, 0.010139f, 0.010948f, 0.011642f, 0.012573f, 0.013664f, - 0.014671f, 0.016052f, 0.017502f, 0.019135f, 0.021255f, 0.023438f, 0.026199f, 0.029312f, - 0.033203f, 0.037476f, 0.042725f, 0.048828f, 0.055695f, 0.063721f, 0.072937f, 0.082947f, - 0.094666f, 0.107117f, 0.504883f, 0.555664f, 0.566406f, 0.572754f, 0.574707f, 0.577148f, - 0.000217f, 0.000516f, 0.000750f, 0.000898f, 0.001011f, 0.001117f, 0.001203f, 0.001307f, - 0.001470f, 0.001604f, 0.001659f, 0.001750f, 0.001945f, 0.002121f, 0.002249f, 0.002316f, - 0.002478f, 0.002581f, 0.002832f, 0.003000f, 0.003164f, 0.003334f, 0.003593f, 0.003784f, - 0.003990f, 0.004196f, 0.004440f, 0.004673f, 0.005035f, 0.005329f, 0.005642f, 0.005981f, - 0.006462f, 0.006916f, 0.007313f, 0.007805f, 0.008377f, 0.008987f, 0.009727f, 0.010521f, - 0.011314f, 0.012421f, 0.013466f, 0.014755f, 0.016235f, 0.017914f, 0.019913f, 0.022461f, - 0.025330f, 0.028778f, 0.033081f, 0.038239f, 0.044189f, 0.051422f, 0.059662f, 0.069336f, - 0.080200f, 0.091980f, 0.492676f, 0.543945f, 0.555664f, 0.561035f, 0.564453f, 0.566406f, - 0.000131f, 0.000355f, 0.000605f, 0.000759f, 0.000832f, 0.000904f, 0.001018f, 0.000975f, - 0.001144f, 0.001235f, 0.001336f, 0.001447f, 0.001518f, 0.001620f, 0.001668f, 0.001835f, - 0.001901f, 0.002045f, 0.002188f, 0.002270f, 0.002424f, 0.002577f, 0.002707f, 0.002893f, - 0.003002f, 0.003223f, 0.003407f, 0.003572f, 0.003851f, 0.004017f, 0.004391f, 0.004608f, - 0.004833f, 0.005203f, 0.005497f, 0.005886f, 0.006351f, 0.006771f, 0.007278f, 0.007858f, - 0.008560f, 0.009315f, 0.010086f, 0.011078f, 0.012222f, 0.013443f, 0.015022f, 0.016769f, - 0.018967f, 0.021591f, 0.024780f, 0.028931f, 0.033875f, 0.039734f, 0.047241f, 0.056122f, - 0.066101f, 0.077637f, 0.477783f, 0.532715f, 0.544922f, 0.551270f, 0.553711f, 0.555664f, - 0.000245f, 0.000303f, 0.000473f, 0.000498f, 0.000544f, 0.000707f, 0.000700f, 0.000767f, - 0.000802f, 0.000892f, 0.001021f, 0.001086f, 0.001140f, 0.001260f, 0.001303f, 0.001325f, - 0.001462f, 0.001553f, 0.001603f, 0.001746f, 0.001816f, 0.001904f, 0.002043f, 0.002127f, - 0.002254f, 0.002356f, 0.002548f, 0.002672f, 0.002851f, 0.003092f, 0.003265f, 0.003374f, - 0.003647f, 0.003891f, 0.004097f, 0.004360f, 0.004669f, 0.004997f, 0.005390f, 0.005810f, - 0.006226f, 0.006756f, 0.007450f, 0.008095f, 0.008934f, 0.009827f, 0.010902f, 0.012268f, - 0.013840f, 0.015701f, 0.018036f, 0.021072f, 0.024948f, 0.029800f, 0.035980f, 0.043945f, - 0.053345f, 0.063843f, 0.465576f, 0.520996f, 0.535645f, 0.540039f, 0.543457f, 0.545898f, - 0.000108f, 0.000275f, 0.000332f, 0.000402f, 0.000462f, 0.000468f, 0.000580f, 0.000522f, - 0.000616f, 0.000657f, 0.000758f, 0.000762f, 0.000812f, 0.000870f, 0.000945f, 0.000978f, - 0.001054f, 0.001109f, 0.001179f, 0.001213f, 0.001311f, 0.001371f, 0.001473f, 0.001558f, - 0.001629f, 0.001718f, 0.001837f, 0.001903f, 0.002016f, 0.002159f, 0.002258f, 0.002478f, - 0.002548f, 0.002731f, 0.002909f, 0.003086f, 0.003317f, 0.003580f, 0.003885f, 0.004116f, - 0.004421f, 0.004818f, 0.005264f, 0.005745f, 0.006294f, 0.006966f, 0.007748f, 0.008667f, - 0.009766f, 0.011086f, 0.012787f, 0.014908f, 0.017746f, 0.021271f, 0.026382f, 0.032990f, - 0.041199f, 0.051239f, 0.452393f, 0.509277f, 0.522461f, 0.529297f, 0.533203f, 0.535156f, - 0.000016f, 0.000143f, 0.000244f, 0.000315f, 0.000309f, 0.000391f, 0.000344f, 0.000402f, - 0.000429f, 0.000517f, 0.000522f, 0.000526f, 0.000546f, 0.000606f, 0.000628f, 0.000705f, - 0.000692f, 0.000781f, 0.000837f, 0.000868f, 0.000923f, 0.000969f, 0.001013f, 0.001070f, - 0.001142f, 0.001186f, 0.001273f, 0.001326f, 0.001397f, 0.001534f, 0.001561f, 0.001685f, - 0.001775f, 0.001873f, 0.002024f, 0.002153f, 0.002272f, 0.002443f, 0.002611f, 0.002800f, - 0.003014f, 0.003250f, 0.003529f, 0.003868f, 0.004227f, 0.004692f, 0.005192f, 0.005836f, - 0.006603f, 0.007587f, 0.008751f, 0.010193f, 0.012001f, 0.014610f, 0.018219f, 0.023392f, - 0.030594f, 0.039795f, 0.437744f, 0.498291f, 0.512207f, 0.517578f, 0.521484f, 0.525391f, - 0.000102f, 0.000186f, 0.000171f, 0.000181f, 0.000227f, 0.000229f, 0.000231f, 0.000278f, - 0.000293f, 0.000304f, 0.000314f, 0.000375f, 0.000365f, 0.000411f, 0.000446f, 0.000457f, - 0.000496f, 0.000513f, 0.000533f, 0.000554f, 0.000603f, 0.000622f, 0.000669f, 0.000708f, - 0.000757f, 0.000789f, 0.000843f, 0.000875f, 0.000925f, 0.000964f, 0.001037f, 0.001094f, - 0.001172f, 0.001243f, 0.001324f, 0.001373f, 0.001497f, 0.001570f, 0.001712f, 0.001829f, - 0.001947f, 0.002123f, 0.002291f, 0.002472f, 0.002703f, 0.003008f, 0.003342f, 0.003757f, - 0.004204f, 0.004810f, 0.005539f, 0.006554f, 0.007828f, 0.009537f, 0.011894f, 0.015442f, - 0.021072f, 0.029282f, 0.424561f, 0.486084f, 0.500488f, 0.506836f, 0.512207f, 0.514648f, - 0.000014f, 0.000127f, 0.000112f, 0.000109f, 0.000143f, 0.000165f, 0.000141f, 0.000180f, - 0.000185f, 0.000191f, 0.000196f, 0.000203f, 0.000233f, 0.000252f, 0.000260f, 0.000274f, - 0.000288f, 0.000314f, 0.000328f, 0.000363f, 0.000362f, 0.000374f, 0.000400f, 0.000436f, - 0.000464f, 0.000501f, 0.000504f, 0.000521f, 0.000563f, 0.000593f, 0.000635f, 0.000671f, - 0.000712f, 0.000740f, 0.000800f, 0.000837f, 0.000892f, 0.000955f, 0.001030f, 0.001092f, - 0.001167f, 0.001270f, 0.001369f, 0.001491f, 0.001626f, 0.001769f, 0.001993f, 0.002209f, - 0.002523f, 0.002863f, 0.003325f, 0.003880f, 0.004715f, 0.005764f, 0.007320f, 0.009468f, - 0.013344f, 0.020187f, 0.410645f, 0.473877f, 0.489258f, 0.496826f, 0.500488f, 0.503906f, - 0.000103f, 0.000078f, 0.000067f, 0.000065f, 0.000086f, 0.000085f, 0.000101f, 0.000106f, - 0.000106f, 0.000107f, 0.000115f, 0.000133f, 0.000118f, 0.000133f, 0.000154f, 0.000150f, - 0.000167f, 0.000177f, 0.000180f, 0.000190f, 0.000207f, 0.000213f, 0.000228f, 0.000238f, - 0.000267f, 0.000277f, 0.000287f, 0.000298f, 0.000313f, 0.000325f, 0.000347f, 0.000375f, - 0.000393f, 0.000405f, 0.000440f, 0.000463f, 0.000486f, 0.000527f, 0.000562f, 0.000599f, - 0.000639f, 0.000688f, 0.000757f, 0.000807f, 0.000879f, 0.000961f, 0.001059f, 0.001180f, - 0.001342f, 0.001533f, 0.001762f, 0.002102f, 0.002502f, 0.003128f, 0.004028f, 0.005379f, - 0.007591f, 0.012505f, 0.397217f, 0.462891f, 0.478760f, 0.485840f, 0.490479f, 0.492676f, - 0.000087f, 0.000063f, 0.000054f, 0.000048f, 0.000047f, 0.000044f, 0.000046f, 0.000047f, - 0.000047f, 0.000060f, 0.000053f, 0.000056f, 0.000072f, 0.000060f, 0.000064f, 0.000069f, - 0.000078f, 0.000085f, 0.000084f, 0.000090f, 0.000094f, 0.000102f, 0.000105f, 0.000111f, - 0.000116f, 0.000126f, 0.000132f, 0.000150f, 0.000147f, 0.000158f, 0.000167f, 0.000178f, - 0.000185f, 0.000192f, 0.000211f, 0.000216f, 0.000226f, 0.000246f, 0.000265f, 0.000284f, - 0.000299f, 0.000325f, 0.000349f, 0.000381f, 0.000415f, 0.000448f, 0.000490f, 0.000544f, - 0.000612f, 0.000694f, 0.000798f, 0.000943f, 0.001139f, 0.001436f, 0.001870f, 0.002586f, - 0.003817f, 0.006474f, 0.383545f, 0.450195f, 0.467041f, 0.474365f, 0.478760f, 0.482422f, - 0.000065f, 0.000045f, 0.000037f, 0.000033f, 0.000030f, 0.000028f, 0.000026f, 0.000025f, - 0.000024f, 0.000022f, 0.000021f, 0.000025f, 0.000020f, 0.000021f, 0.000025f, 0.000029f, - 0.000028f, 0.000031f, 0.000033f, 0.000034f, 0.000036f, 0.000041f, 0.000045f, 0.000040f, - 0.000045f, 0.000049f, 0.000051f, 0.000048f, 0.000055f, 0.000057f, 0.000061f, 0.000066f, - 0.000072f, 0.000068f, 0.000073f, 0.000078f, 0.000087f, 0.000089f, 0.000097f, 0.000104f, - 0.000113f, 0.000115f, 0.000128f, 0.000137f, 0.000148f, 0.000160f, 0.000174f, 0.000194f, - 0.000221f, 0.000248f, 0.000283f, 0.000324f, 0.000396f, 0.000496f, 0.000657f, 0.000928f, - 0.001479f, 0.002684f, 0.371094f, 0.438477f, 0.455078f, 0.463867f, 0.468750f, 0.471191f, - 0.000029f, 0.000019f, 0.000016f, 0.000014f, 0.000014f, 0.000013f, 0.000012f, 0.000012f, - 0.000012f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000010f, 0.000010f, 0.000010f, - 0.000009f, 0.000009f, 0.000009f, 0.000008f, 0.000008f, 0.000007f, 0.000008f, 0.000007f, - 0.000008f, 0.000009f, 0.000010f, 0.000011f, 0.000012f, 0.000011f, 0.000012f, 0.000013f, - 0.000015f, 0.000017f, 0.000018f, 0.000018f, 0.000020f, 0.000019f, 0.000021f, 0.000024f, - 0.000024f, 0.000026f, 0.000028f, 0.000031f, 0.000031f, 0.000035f, 0.000040f, 0.000041f, - 0.000045f, 0.000052f, 0.000059f, 0.000071f, 0.000083f, 0.000099f, 0.000132f, 0.000188f, - 0.000315f, 0.000712f, 0.356934f, 0.426514f, 0.444824f, 0.452637f, 0.457520f, 0.460938f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000002f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000001f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000003f, 0.000004f, 0.000004f, 0.000006f, - 0.000010f, 0.000027f, 0.343750f, 0.414795f, 0.433105f, 0.441895f, 0.446289f, 0.449951f, - }, - { - 0.012436f, 0.037598f, 0.062805f, 0.087891f, 0.113037f, 0.137329f, 0.161621f, 0.185425f, - 0.209717f, 0.232544f, 0.255371f, 0.278076f, 0.300049f, 0.321289f, 0.343506f, 0.364014f, - 0.385010f, 0.404785f, 0.424561f, 0.444824f, 0.463623f, 0.482422f, 0.501465f, 0.520020f, - 0.537598f, 0.554688f, 0.572266f, 0.589355f, 0.605957f, 0.622070f, 0.639648f, 0.655273f, - 0.670410f, 0.685547f, 0.700684f, 0.715332f, 0.730469f, 0.744629f, 0.758301f, 0.771973f, - 0.785156f, 0.799316f, 0.812012f, 0.825684f, 0.837891f, 0.850586f, 0.863281f, 0.875000f, - 0.887207f, 0.898926f, 0.910156f, 0.921387f, 0.933105f, 0.944336f, 0.954102f, 0.964844f, - 0.976074f, 0.985840f, 0.978027f, 0.947266f, 0.925781f, 0.907715f, 0.892090f, 0.877930f, - 0.011276f, 0.034546f, 0.058289f, 0.082031f, 0.105469f, 0.128662f, 0.152344f, 0.174805f, - 0.197876f, 0.219604f, 0.241455f, 0.263672f, 0.284912f, 0.306152f, 0.326416f, 0.347168f, - 0.366699f, 0.387695f, 0.406494f, 0.426025f, 0.444824f, 0.463379f, 0.481934f, 0.500000f, - 0.518066f, 0.535645f, 0.552246f, 0.569824f, 0.586426f, 0.603027f, 0.619141f, 0.634766f, - 0.650391f, 0.666016f, 0.681152f, 0.695801f, 0.710938f, 0.725586f, 0.739258f, 0.753906f, - 0.768066f, 0.781250f, 0.794922f, 0.807617f, 0.821289f, 0.833496f, 0.846191f, 0.858398f, - 0.870605f, 0.882812f, 0.894531f, 0.906250f, 0.917480f, 0.929199f, 0.939453f, 0.951660f, - 0.961426f, 0.972656f, 0.971680f, 0.942871f, 0.921875f, 0.904785f, 0.889160f, 0.875977f, - 0.010628f, 0.032288f, 0.054932f, 0.076172f, 0.099060f, 0.121216f, 0.142700f, 0.164795f, - 0.186279f, 0.207642f, 0.229248f, 0.249756f, 0.269531f, 0.291016f, 0.310791f, 0.331543f, - 0.349609f, 0.369385f, 0.388916f, 0.409180f, 0.427246f, 0.444824f, 0.463135f, 0.480713f, - 0.499512f, 0.516602f, 0.533203f, 0.550293f, 0.567383f, 0.583496f, 0.599609f, 0.615723f, - 0.630859f, 0.646973f, 0.661621f, 0.677246f, 0.691895f, 0.705566f, 0.720703f, 0.735352f, - 0.749512f, 0.763184f, 0.776367f, 0.790039f, 0.803223f, 0.816406f, 0.828613f, 0.842285f, - 0.854492f, 0.867676f, 0.878418f, 0.890137f, 0.902832f, 0.913086f, 0.925293f, 0.936035f, - 0.947754f, 0.958008f, 0.964844f, 0.937500f, 0.917480f, 0.901367f, 0.886719f, 0.873535f, - 0.009926f, 0.030167f, 0.050995f, 0.071594f, 0.092346f, 0.113892f, 0.134399f, 0.154663f, - 0.175537f, 0.195679f, 0.216309f, 0.235840f, 0.256104f, 0.276611f, 0.295654f, 0.314453f, - 0.333496f, 0.353027f, 0.370850f, 0.389404f, 0.408936f, 0.427490f, 0.445312f, 0.462891f, - 0.480225f, 0.497803f, 0.513672f, 0.531250f, 0.547363f, 0.563965f, 0.580078f, 0.597168f, - 0.612305f, 0.627930f, 0.642578f, 0.658691f, 0.673340f, 0.687500f, 0.702637f, 0.717285f, - 0.731445f, 0.744629f, 0.758301f, 0.772461f, 0.786133f, 0.799316f, 0.811523f, 0.824707f, - 0.837891f, 0.849121f, 0.861816f, 0.874023f, 0.887207f, 0.898438f, 0.910156f, 0.920898f, - 0.932617f, 0.943848f, 0.958008f, 0.932129f, 0.913086f, 0.897461f, 0.883301f, 0.871094f, - 0.009178f, 0.028107f, 0.047729f, 0.066895f, 0.086182f, 0.106384f, 0.125977f, 0.145386f, - 0.165527f, 0.184937f, 0.203857f, 0.224121f, 0.242676f, 0.261475f, 0.281006f, 0.300049f, - 0.318604f, 0.336426f, 0.355469f, 0.372314f, 0.391113f, 0.409424f, 0.426514f, 0.444092f, - 0.461426f, 0.477783f, 0.495850f, 0.512207f, 0.528809f, 0.544434f, 0.561035f, 0.576660f, - 0.593262f, 0.608398f, 0.623047f, 0.638184f, 0.655273f, 0.668945f, 0.682617f, 0.697754f, - 0.712402f, 0.726562f, 0.740234f, 0.753906f, 0.768066f, 0.781250f, 0.794434f, 0.807617f, - 0.820312f, 0.833496f, 0.845215f, 0.858398f, 0.870605f, 0.881836f, 0.894043f, 0.906738f, - 0.917480f, 0.928711f, 0.951172f, 0.926758f, 0.909180f, 0.893555f, 0.880859f, 0.868164f, - 0.008667f, 0.025986f, 0.044922f, 0.062805f, 0.081421f, 0.099854f, 0.118347f, 0.137085f, - 0.155518f, 0.173828f, 0.193115f, 0.211304f, 0.229858f, 0.248413f, 0.266602f, 0.285400f, - 0.303223f, 0.321045f, 0.339111f, 0.357178f, 0.373779f, 0.391357f, 0.409424f, 0.426270f, - 0.443115f, 0.460449f, 0.476807f, 0.494141f, 0.510254f, 0.526855f, 0.541992f, 0.559082f, - 0.574219f, 0.589355f, 0.605469f, 0.620117f, 0.636230f, 0.649902f, 0.664551f, 0.678711f, - 0.693848f, 0.707031f, 0.723145f, 0.736328f, 0.750977f, 0.762695f, 0.776855f, 0.790039f, - 0.803223f, 0.816406f, 0.828613f, 0.842285f, 0.853516f, 0.866211f, 0.878906f, 0.890625f, - 0.902832f, 0.913574f, 0.944336f, 0.921875f, 0.903809f, 0.889160f, 0.876953f, 0.865234f, - 0.008057f, 0.024658f, 0.041321f, 0.058411f, 0.075989f, 0.093811f, 0.110535f, 0.128784f, - 0.146729f, 0.164307f, 0.182007f, 0.200073f, 0.217773f, 0.234619f, 0.252930f, 0.271240f, - 0.288086f, 0.306152f, 0.322998f, 0.341064f, 0.357910f, 0.374756f, 0.391357f, 0.409180f, - 0.425293f, 0.442383f, 0.458496f, 0.475342f, 0.491455f, 0.507324f, 0.523438f, 0.539551f, - 0.555176f, 0.570312f, 0.585938f, 0.601074f, 0.616699f, 0.631836f, 0.646484f, 0.660645f, - 0.676270f, 0.688477f, 0.704102f, 0.718262f, 0.731445f, 0.745117f, 0.760254f, 0.771484f, - 0.785156f, 0.799316f, 0.812500f, 0.824707f, 0.836914f, 0.850098f, 0.862793f, 0.874512f, - 0.886719f, 0.898438f, 0.937500f, 0.915527f, 0.899414f, 0.885254f, 0.872559f, 0.861816f, - 0.007477f, 0.022919f, 0.038971f, 0.054901f, 0.070801f, 0.087646f, 0.104065f, 0.121155f, - 0.137573f, 0.155029f, 0.171875f, 0.188721f, 0.206177f, 0.222778f, 0.240112f, 0.257080f, - 0.274170f, 0.290283f, 0.308350f, 0.324463f, 0.342041f, 0.358154f, 0.375488f, 0.391113f, - 0.407471f, 0.424561f, 0.440430f, 0.456787f, 0.474121f, 0.489746f, 0.505371f, 0.521484f, - 0.536133f, 0.552246f, 0.565918f, 0.582031f, 0.597168f, 0.613281f, 0.626953f, 0.642578f, - 0.656738f, 0.670898f, 0.684570f, 0.699219f, 0.712891f, 0.727539f, 0.741211f, 0.754395f, - 0.768066f, 0.781738f, 0.794434f, 0.808105f, 0.820312f, 0.833984f, 0.846680f, 0.858887f, - 0.871582f, 0.883301f, 0.930176f, 0.910156f, 0.894043f, 0.880371f, 0.868652f, 0.858398f, - 0.007023f, 0.021240f, 0.036224f, 0.051300f, 0.066467f, 0.082092f, 0.097900f, 0.113892f, - 0.129517f, 0.145752f, 0.161743f, 0.178223f, 0.194702f, 0.210327f, 0.227661f, 0.243408f, - 0.260986f, 0.276855f, 0.292725f, 0.309814f, 0.326172f, 0.342041f, 0.358398f, 0.375732f, - 0.391113f, 0.406982f, 0.422852f, 0.438965f, 0.454590f, 0.471191f, 0.486816f, 0.502441f, - 0.517578f, 0.533203f, 0.548340f, 0.562988f, 0.578613f, 0.593750f, 0.609375f, 0.623535f, - 0.638184f, 0.652832f, 0.666992f, 0.680664f, 0.695312f, 0.708984f, 0.722656f, 0.736816f, - 0.750000f, 0.764160f, 0.777344f, 0.789551f, 0.803223f, 0.816895f, 0.830078f, 0.842773f, - 0.854980f, 0.868652f, 0.922852f, 0.904297f, 0.889160f, 0.875977f, 0.864746f, 0.854492f, - 0.006458f, 0.019913f, 0.033691f, 0.048126f, 0.062744f, 0.077026f, 0.092224f, 0.106567f, - 0.122192f, 0.137207f, 0.152222f, 0.167725f, 0.183838f, 0.199951f, 0.215088f, 0.231323f, - 0.246826f, 0.262695f, 0.279053f, 0.294678f, 0.310547f, 0.326172f, 0.342041f, 0.358887f, - 0.374268f, 0.389893f, 0.405518f, 0.421143f, 0.437012f, 0.452637f, 0.467773f, 0.483643f, - 0.499512f, 0.513672f, 0.529785f, 0.545410f, 0.560059f, 0.575195f, 0.590332f, 0.604980f, - 0.618652f, 0.634277f, 0.648438f, 0.662598f, 0.676270f, 0.690918f, 0.704102f, 0.718750f, - 0.732422f, 0.745605f, 0.760254f, 0.773438f, 0.786621f, 0.801270f, 0.812988f, 0.826172f, - 0.839844f, 0.851562f, 0.915527f, 0.897949f, 0.883789f, 0.871094f, 0.860352f, 0.850586f, - 0.006077f, 0.018921f, 0.031464f, 0.045258f, 0.058411f, 0.072144f, 0.085999f, 0.100220f, - 0.114258f, 0.129028f, 0.143677f, 0.158691f, 0.173584f, 0.188477f, 0.203247f, 0.219238f, - 0.234497f, 0.249634f, 0.264893f, 0.280273f, 0.295410f, 0.310791f, 0.326904f, 0.342285f, - 0.357910f, 0.373535f, 0.388428f, 0.404053f, 0.420166f, 0.435303f, 0.450195f, 0.465332f, - 0.481201f, 0.496338f, 0.511230f, 0.525879f, 0.540527f, 0.556641f, 0.570312f, 0.585938f, - 0.600098f, 0.614746f, 0.629883f, 0.644531f, 0.657715f, 0.672363f, 0.687012f, 0.700684f, - 0.714355f, 0.729004f, 0.742188f, 0.755371f, 0.769531f, 0.782227f, 0.796875f, 0.810059f, - 0.823242f, 0.836426f, 0.907715f, 0.891602f, 0.877930f, 0.866211f, 0.855957f, 0.846680f, - 0.005596f, 0.017654f, 0.029587f, 0.041840f, 0.055115f, 0.067871f, 0.080566f, 0.093994f, - 0.107361f, 0.120911f, 0.134766f, 0.149414f, 0.163452f, 0.177979f, 0.192261f, 0.206787f, - 0.221191f, 0.236816f, 0.250732f, 0.266113f, 0.281250f, 0.295898f, 0.311279f, 0.326904f, - 0.342041f, 0.356201f, 0.371826f, 0.387451f, 0.402344f, 0.417236f, 0.432373f, 0.447266f, - 0.462891f, 0.477539f, 0.492432f, 0.506836f, 0.522949f, 0.536621f, 0.551758f, 0.566895f, - 0.582031f, 0.596191f, 0.610352f, 0.625488f, 0.640625f, 0.653320f, 0.668457f, 0.682617f, - 0.696777f, 0.710449f, 0.724609f, 0.739258f, 0.751465f, 0.765625f, 0.780273f, 0.792480f, - 0.806152f, 0.820801f, 0.899902f, 0.885742f, 0.872070f, 0.861328f, 0.851562f, 0.842285f, - 0.005451f, 0.016479f, 0.028259f, 0.039856f, 0.051331f, 0.063416f, 0.075867f, 0.088196f, - 0.100952f, 0.113770f, 0.126953f, 0.140747f, 0.153564f, 0.167847f, 0.181519f, 0.195679f, - 0.210083f, 0.223633f, 0.237427f, 0.252197f, 0.267334f, 0.281738f, 0.296143f, 0.311035f, - 0.325928f, 0.340332f, 0.355469f, 0.370361f, 0.385010f, 0.400635f, 0.415039f, 0.429688f, - 0.444092f, 0.459717f, 0.474121f, 0.489258f, 0.503906f, 0.519043f, 0.533203f, 0.548828f, - 0.562012f, 0.577637f, 0.591797f, 0.606445f, 0.621582f, 0.635742f, 0.650391f, 0.664551f, - 0.678223f, 0.692871f, 0.706055f, 0.721191f, 0.733887f, 0.747559f, 0.762207f, 0.775879f, - 0.791016f, 0.804199f, 0.892090f, 0.878906f, 0.866699f, 0.855957f, 0.846191f, 0.837891f, - 0.004963f, 0.015343f, 0.026169f, 0.037079f, 0.047943f, 0.059570f, 0.070801f, 0.083008f, - 0.095093f, 0.106750f, 0.119507f, 0.132080f, 0.145142f, 0.158569f, 0.171143f, 0.184692f, - 0.198730f, 0.211792f, 0.225830f, 0.239380f, 0.253662f, 0.267578f, 0.281738f, 0.295898f, - 0.309814f, 0.324219f, 0.340088f, 0.353760f, 0.368164f, 0.383057f, 0.397705f, 0.412842f, - 0.426758f, 0.441406f, 0.456787f, 0.470947f, 0.485352f, 0.500000f, 0.515137f, 0.529785f, - 0.543945f, 0.559082f, 0.572754f, 0.588379f, 0.602539f, 0.616699f, 0.631348f, 0.645996f, - 0.659180f, 0.674805f, 0.689453f, 0.703125f, 0.716797f, 0.729980f, 0.744629f, 0.758789f, - 0.772461f, 0.786621f, 0.883789f, 0.872070f, 0.860840f, 0.850586f, 0.841309f, 0.833008f, - 0.004726f, 0.014549f, 0.024109f, 0.034668f, 0.044708f, 0.055573f, 0.066467f, 0.077820f, - 0.088928f, 0.100342f, 0.112000f, 0.124390f, 0.136230f, 0.148804f, 0.161621f, 0.173950f, - 0.186768f, 0.200439f, 0.213623f, 0.226074f, 0.239868f, 0.253418f, 0.267090f, 0.281250f, - 0.295410f, 0.309570f, 0.323486f, 0.337891f, 0.352295f, 0.365967f, 0.381104f, 0.394775f, - 0.409180f, 0.423828f, 0.438477f, 0.452881f, 0.467773f, 0.481689f, 0.496582f, 0.511230f, - 0.525391f, 0.539551f, 0.554199f, 0.568848f, 0.583984f, 0.599121f, 0.612305f, 0.627441f, - 0.641113f, 0.656250f, 0.669922f, 0.684570f, 0.699219f, 0.713379f, 0.727539f, 0.741699f, - 0.755859f, 0.771484f, 0.875488f, 0.865723f, 0.854492f, 0.845215f, 0.836426f, 0.828613f, - 0.004452f, 0.013359f, 0.022690f, 0.032745f, 0.042297f, 0.051910f, 0.061920f, 0.072693f, - 0.083496f, 0.094177f, 0.105408f, 0.116760f, 0.128174f, 0.140137f, 0.151855f, 0.164185f, - 0.176758f, 0.189087f, 0.201660f, 0.214478f, 0.227173f, 0.240356f, 0.253906f, 0.267578f, - 0.280273f, 0.294922f, 0.307373f, 0.321045f, 0.336670f, 0.350098f, 0.363770f, 0.378174f, - 0.392334f, 0.406006f, 0.420410f, 0.434082f, 0.448975f, 0.463623f, 0.478271f, 0.492676f, - 0.506836f, 0.520996f, 0.536133f, 0.550781f, 0.565430f, 0.580078f, 0.593750f, 0.608887f, - 0.623047f, 0.638184f, 0.651367f, 0.666016f, 0.681152f, 0.695312f, 0.709473f, 0.723145f, - 0.738281f, 0.752930f, 0.867676f, 0.858398f, 0.848633f, 0.839355f, 0.831055f, 0.823730f, - 0.004143f, 0.012794f, 0.021713f, 0.030396f, 0.039551f, 0.048645f, 0.058563f, 0.068176f, - 0.078308f, 0.088928f, 0.098328f, 0.109924f, 0.120728f, 0.131592f, 0.142944f, 0.154175f, - 0.165771f, 0.178223f, 0.190186f, 0.202881f, 0.214844f, 0.227417f, 0.240845f, 0.253906f, - 0.265869f, 0.279541f, 0.293213f, 0.305908f, 0.320068f, 0.333496f, 0.347168f, 0.361816f, - 0.375000f, 0.389160f, 0.403320f, 0.417236f, 0.431396f, 0.444824f, 0.459473f, 0.473633f, - 0.488525f, 0.503418f, 0.517578f, 0.532227f, 0.545410f, 0.560547f, 0.575684f, 0.590332f, - 0.604004f, 0.618652f, 0.632812f, 0.647949f, 0.663086f, 0.676758f, 0.691895f, 0.706543f, - 0.721191f, 0.735840f, 0.859375f, 0.852539f, 0.842773f, 0.833496f, 0.824707f, 0.818848f, - 0.003839f, 0.012062f, 0.020126f, 0.028366f, 0.036774f, 0.045593f, 0.054718f, 0.063416f, - 0.073120f, 0.082825f, 0.092957f, 0.102966f, 0.113464f, 0.123535f, 0.134277f, 0.145020f, - 0.155762f, 0.167847f, 0.179199f, 0.190796f, 0.202393f, 0.214844f, 0.227417f, 0.239868f, - 0.252197f, 0.264648f, 0.277588f, 0.291016f, 0.304199f, 0.317383f, 0.330811f, 0.343750f, - 0.357422f, 0.371826f, 0.385254f, 0.399902f, 0.413574f, 0.427246f, 0.441162f, 0.455566f, - 0.469971f, 0.484375f, 0.498535f, 0.514160f, 0.527344f, 0.541992f, 0.556152f, 0.570312f, - 0.585449f, 0.600098f, 0.614746f, 0.629883f, 0.645508f, 0.658203f, 0.673340f, 0.688477f, - 0.703125f, 0.718262f, 0.851074f, 0.844727f, 0.835938f, 0.827637f, 0.820312f, 0.812988f, - 0.003786f, 0.011147f, 0.018921f, 0.026550f, 0.034729f, 0.042664f, 0.051117f, 0.060028f, - 0.068298f, 0.077454f, 0.086914f, 0.096130f, 0.105835f, 0.115662f, 0.126343f, 0.136475f, - 0.146606f, 0.157715f, 0.168457f, 0.180176f, 0.191528f, 0.202759f, 0.215088f, 0.226929f, - 0.239014f, 0.251221f, 0.263428f, 0.275391f, 0.289062f, 0.301514f, 0.314941f, 0.328369f, - 0.341797f, 0.354736f, 0.367676f, 0.382324f, 0.395264f, 0.409912f, 0.423340f, 0.437012f, - 0.451660f, 0.465576f, 0.480469f, 0.494629f, 0.508301f, 0.522949f, 0.538086f, 0.551758f, - 0.567383f, 0.582031f, 0.596191f, 0.610840f, 0.625977f, 0.639648f, 0.655273f, 0.670410f, - 0.685547f, 0.700684f, 0.842285f, 0.837402f, 0.829590f, 0.821289f, 0.813965f, 0.808105f, - 0.003504f, 0.010445f, 0.017609f, 0.025131f, 0.032349f, 0.040314f, 0.047485f, 0.055756f, - 0.064026f, 0.072571f, 0.080872f, 0.089661f, 0.099426f, 0.108459f, 0.118286f, 0.127930f, - 0.137817f, 0.147583f, 0.158203f, 0.169189f, 0.180908f, 0.191040f, 0.203003f, 0.214111f, - 0.225708f, 0.237549f, 0.249023f, 0.261475f, 0.273926f, 0.286865f, 0.299316f, 0.311768f, - 0.325684f, 0.338623f, 0.351562f, 0.364746f, 0.378418f, 0.392578f, 0.405518f, 0.419678f, - 0.433105f, 0.447998f, 0.461670f, 0.475830f, 0.490479f, 0.503906f, 0.519531f, 0.533203f, - 0.547852f, 0.562988f, 0.576660f, 0.591797f, 0.606445f, 0.622070f, 0.636719f, 0.652344f, - 0.666504f, 0.682617f, 0.833496f, 0.830078f, 0.822754f, 0.815918f, 0.808594f, 0.802734f, - 0.003447f, 0.009941f, 0.016373f, 0.023300f, 0.030228f, 0.037689f, 0.044128f, 0.052551f, - 0.059845f, 0.068115f, 0.076538f, 0.083862f, 0.092896f, 0.101440f, 0.110596f, 0.119995f, - 0.129028f, 0.138916f, 0.148926f, 0.158936f, 0.169189f, 0.180176f, 0.190308f, 0.201416f, - 0.212769f, 0.224365f, 0.235962f, 0.247192f, 0.259033f, 0.271973f, 0.283936f, 0.296631f, - 0.309570f, 0.321777f, 0.334961f, 0.348389f, 0.361572f, 0.374756f, 0.388184f, 0.401611f, - 0.415771f, 0.429443f, 0.443359f, 0.457520f, 0.471436f, 0.486084f, 0.500977f, 0.514648f, - 0.528809f, 0.543457f, 0.558594f, 0.573242f, 0.588867f, 0.603516f, 0.617676f, 0.633301f, - 0.648926f, 0.664551f, 0.824219f, 0.823242f, 0.815918f, 0.809082f, 0.802246f, 0.796387f, - 0.003141f, 0.009407f, 0.015251f, 0.021851f, 0.028107f, 0.034882f, 0.041779f, 0.048340f, - 0.056244f, 0.062988f, 0.071106f, 0.078796f, 0.087036f, 0.094910f, 0.103149f, 0.112305f, - 0.121460f, 0.130371f, 0.139404f, 0.149048f, 0.159180f, 0.169189f, 0.179565f, 0.189087f, - 0.200317f, 0.211548f, 0.222412f, 0.233765f, 0.245117f, 0.257324f, 0.269043f, 0.281006f, - 0.293213f, 0.305664f, 0.318848f, 0.331055f, 0.343750f, 0.358398f, 0.369873f, 0.384033f, - 0.397217f, 0.411865f, 0.424805f, 0.438965f, 0.453125f, 0.467529f, 0.481689f, 0.495850f, - 0.510254f, 0.524414f, 0.539551f, 0.554688f, 0.569824f, 0.584961f, 0.599121f, 0.614258f, - 0.629883f, 0.645020f, 0.815430f, 0.814453f, 0.809570f, 0.802734f, 0.796875f, 0.791504f, - 0.002838f, 0.008461f, 0.014236f, 0.020676f, 0.026749f, 0.032593f, 0.039032f, 0.045715f, - 0.052216f, 0.059479f, 0.066467f, 0.073608f, 0.080933f, 0.088623f, 0.096619f, 0.104919f, - 0.113098f, 0.121521f, 0.130493f, 0.139526f, 0.148560f, 0.158203f, 0.167969f, 0.177979f, - 0.187988f, 0.198730f, 0.208862f, 0.220093f, 0.231323f, 0.242798f, 0.253906f, 0.265869f, - 0.278320f, 0.289551f, 0.302246f, 0.314941f, 0.327393f, 0.340088f, 0.353516f, 0.365967f, - 0.379883f, 0.392822f, 0.406738f, 0.420898f, 0.434814f, 0.447998f, 0.462891f, 0.477539f, - 0.491455f, 0.506836f, 0.520996f, 0.536133f, 0.550781f, 0.565918f, 0.581055f, 0.596680f, - 0.611816f, 0.627441f, 0.806152f, 0.807617f, 0.801270f, 0.796387f, 0.790039f, 0.784668f, - 0.002689f, 0.008102f, 0.013618f, 0.019058f, 0.024719f, 0.030548f, 0.036560f, 0.042725f, - 0.048615f, 0.054779f, 0.061615f, 0.068604f, 0.075012f, 0.082703f, 0.090271f, 0.097900f, - 0.105530f, 0.113586f, 0.121826f, 0.130371f, 0.139282f, 0.147705f, 0.157349f, 0.166504f, - 0.176147f, 0.186401f, 0.196289f, 0.207520f, 0.217651f, 0.228394f, 0.239868f, 0.251465f, - 0.262451f, 0.274414f, 0.286377f, 0.298828f, 0.311035f, 0.323730f, 0.336670f, 0.349121f, - 0.362549f, 0.375244f, 0.389160f, 0.402344f, 0.417236f, 0.429932f, 0.443848f, 0.458984f, - 0.472168f, 0.487793f, 0.501953f, 0.517578f, 0.531738f, 0.546875f, 0.561523f, 0.576660f, - 0.593262f, 0.608398f, 0.797852f, 0.798828f, 0.794922f, 0.789551f, 0.784668f, 0.779297f, - 0.002666f, 0.007462f, 0.012596f, 0.018066f, 0.023026f, 0.028412f, 0.033813f, 0.039398f, - 0.045166f, 0.051239f, 0.057587f, 0.063721f, 0.070312f, 0.077148f, 0.084167f, 0.090820f, - 0.098267f, 0.105591f, 0.113159f, 0.121460f, 0.129761f, 0.138428f, 0.147217f, 0.156128f, - 0.165283f, 0.174438f, 0.183960f, 0.194092f, 0.204834f, 0.214844f, 0.225830f, 0.236816f, - 0.247925f, 0.259033f, 0.270752f, 0.282227f, 0.294678f, 0.306641f, 0.319336f, 0.332031f, - 0.344482f, 0.357910f, 0.371094f, 0.384033f, 0.398682f, 0.412109f, 0.425781f, 0.440186f, - 0.454102f, 0.468018f, 0.482910f, 0.497314f, 0.512207f, 0.528320f, 0.542969f, 0.558594f, - 0.573242f, 0.589355f, 0.787598f, 0.791016f, 0.787109f, 0.781738f, 0.777344f, 0.772461f, - 0.002569f, 0.007069f, 0.012199f, 0.016739f, 0.021393f, 0.026672f, 0.031189f, 0.037109f, - 0.042480f, 0.047729f, 0.053345f, 0.059387f, 0.065430f, 0.071838f, 0.078186f, 0.084167f, - 0.091492f, 0.098816f, 0.105774f, 0.112976f, 0.121155f, 0.129028f, 0.136963f, 0.145508f, - 0.153687f, 0.163086f, 0.172363f, 0.181885f, 0.191406f, 0.201782f, 0.211670f, 0.222412f, - 0.233032f, 0.244263f, 0.255371f, 0.266846f, 0.278809f, 0.290527f, 0.302734f, 0.314697f, - 0.327393f, 0.340820f, 0.353027f, 0.366455f, 0.380127f, 0.393799f, 0.406006f, 0.421143f, - 0.435059f, 0.449707f, 0.463623f, 0.479248f, 0.494141f, 0.509277f, 0.523438f, 0.539551f, - 0.555176f, 0.570801f, 0.778320f, 0.783203f, 0.779785f, 0.775879f, 0.770996f, 0.767090f, - 0.002398f, 0.006733f, 0.010918f, 0.015495f, 0.020203f, 0.024963f, 0.029663f, 0.034485f, - 0.039246f, 0.044678f, 0.049896f, 0.055267f, 0.060486f, 0.066345f, 0.072693f, 0.078857f, - 0.085083f, 0.091370f, 0.097961f, 0.105530f, 0.112244f, 0.119629f, 0.127563f, 0.135376f, - 0.143799f, 0.152100f, 0.160889f, 0.169922f, 0.178833f, 0.188843f, 0.198608f, 0.208496f, - 0.218628f, 0.229492f, 0.240479f, 0.251953f, 0.262695f, 0.274902f, 0.286377f, 0.298340f, - 0.310547f, 0.323242f, 0.335693f, 0.349365f, 0.362061f, 0.375000f, 0.388916f, 0.402832f, - 0.416748f, 0.430420f, 0.445068f, 0.459473f, 0.474854f, 0.489258f, 0.504883f, 0.519531f, - 0.535645f, 0.551758f, 0.769043f, 0.774902f, 0.771973f, 0.768555f, 0.764160f, 0.759766f, - 0.002062f, 0.006191f, 0.010384f, 0.014786f, 0.018402f, 0.023270f, 0.027435f, 0.031891f, - 0.036163f, 0.041199f, 0.045685f, 0.051208f, 0.056244f, 0.061371f, 0.066772f, 0.072510f, - 0.078369f, 0.084656f, 0.091125f, 0.097290f, 0.104309f, 0.111145f, 0.118164f, 0.126221f, - 0.133301f, 0.141724f, 0.149658f, 0.157837f, 0.167236f, 0.176025f, 0.185547f, 0.195190f, - 0.205444f, 0.215332f, 0.225830f, 0.236084f, 0.247314f, 0.259033f, 0.270020f, 0.281982f, - 0.293701f, 0.305908f, 0.318848f, 0.331787f, 0.344482f, 0.357178f, 0.370361f, 0.384521f, - 0.397461f, 0.411621f, 0.426025f, 0.440674f, 0.455322f, 0.470703f, 0.485596f, 0.500977f, - 0.517578f, 0.532227f, 0.759277f, 0.766602f, 0.764160f, 0.761230f, 0.757324f, 0.753418f, - 0.002064f, 0.005859f, 0.009613f, 0.013626f, 0.017456f, 0.021606f, 0.025574f, 0.029526f, - 0.034302f, 0.038422f, 0.042938f, 0.047485f, 0.052155f, 0.056763f, 0.061951f, 0.067139f, - 0.072754f, 0.078308f, 0.084167f, 0.090149f, 0.096191f, 0.102722f, 0.109558f, 0.116699f, - 0.123901f, 0.131104f, 0.139160f, 0.146729f, 0.155273f, 0.163940f, 0.173096f, 0.182129f, - 0.192017f, 0.201172f, 0.211060f, 0.221558f, 0.232544f, 0.243530f, 0.254150f, 0.266113f, - 0.277588f, 0.289307f, 0.301758f, 0.313965f, 0.326904f, 0.338867f, 0.352051f, 0.366211f, - 0.379150f, 0.393066f, 0.407471f, 0.421875f, 0.436768f, 0.450439f, 0.466553f, 0.481201f, - 0.497314f, 0.513184f, 0.749512f, 0.758301f, 0.756348f, 0.753906f, 0.750000f, 0.746582f, - 0.001851f, 0.005405f, 0.009109f, 0.012589f, 0.016129f, 0.020020f, 0.023926f, 0.027481f, - 0.031738f, 0.035492f, 0.039734f, 0.044128f, 0.048065f, 0.052765f, 0.057373f, 0.061859f, - 0.066711f, 0.072388f, 0.077393f, 0.083130f, 0.088745f, 0.094727f, 0.101135f, 0.107666f, - 0.114380f, 0.121704f, 0.128540f, 0.136108f, 0.144043f, 0.151733f, 0.160522f, 0.169678f, - 0.178589f, 0.187622f, 0.197998f, 0.207397f, 0.217285f, 0.227905f, 0.238892f, 0.250000f, - 0.261230f, 0.272461f, 0.284180f, 0.296387f, 0.308838f, 0.321533f, 0.334473f, 0.347656f, - 0.361328f, 0.375000f, 0.388672f, 0.402588f, 0.417969f, 0.432617f, 0.447021f, 0.461914f, - 0.478516f, 0.493652f, 0.739258f, 0.749512f, 0.749023f, 0.745605f, 0.742188f, 0.739746f, - 0.001666f, 0.005405f, 0.008575f, 0.011696f, 0.015327f, 0.018646f, 0.022293f, 0.025650f, - 0.029327f, 0.032776f, 0.036530f, 0.040619f, 0.044128f, 0.048828f, 0.052887f, 0.057098f, - 0.061829f, 0.066467f, 0.071350f, 0.076355f, 0.081909f, 0.087341f, 0.092896f, 0.099304f, - 0.105469f, 0.112000f, 0.118835f, 0.125977f, 0.133545f, 0.140991f, 0.148438f, 0.156982f, - 0.165771f, 0.174805f, 0.183960f, 0.193115f, 0.203369f, 0.212891f, 0.223389f, 0.234497f, - 0.244751f, 0.256348f, 0.268066f, 0.279541f, 0.291260f, 0.303955f, 0.316406f, 0.329590f, - 0.342529f, 0.355957f, 0.369385f, 0.384766f, 0.398926f, 0.413330f, 0.428467f, 0.442383f, - 0.458740f, 0.474609f, 0.728516f, 0.740723f, 0.740234f, 0.738281f, 0.735352f, 0.732910f, - 0.001534f, 0.004936f, 0.007980f, 0.011223f, 0.013893f, 0.017212f, 0.020294f, 0.023361f, - 0.026688f, 0.030182f, 0.033600f, 0.037537f, 0.040924f, 0.044495f, 0.048340f, 0.052155f, - 0.056732f, 0.061035f, 0.065430f, 0.069824f, 0.075073f, 0.080078f, 0.085571f, 0.091003f, - 0.096863f, 0.103271f, 0.109009f, 0.115723f, 0.123230f, 0.129639f, 0.137207f, 0.145264f, - 0.153320f, 0.161499f, 0.170410f, 0.179688f, 0.189087f, 0.198364f, 0.208740f, 0.218750f, - 0.229126f, 0.240356f, 0.251465f, 0.263184f, 0.274902f, 0.286621f, 0.299072f, 0.311768f, - 0.324463f, 0.337402f, 0.351074f, 0.364746f, 0.378662f, 0.394287f, 0.408936f, 0.423096f, - 0.439453f, 0.455322f, 0.716797f, 0.731934f, 0.732422f, 0.729980f, 0.728027f, 0.725586f, - 0.001639f, 0.004337f, 0.007439f, 0.009888f, 0.013092f, 0.015717f, 0.018921f, 0.021805f, - 0.024612f, 0.027542f, 0.030762f, 0.034088f, 0.037598f, 0.041107f, 0.044189f, 0.047699f, - 0.051666f, 0.055664f, 0.059723f, 0.064148f, 0.068542f, 0.073425f, 0.078003f, 0.083435f, - 0.088806f, 0.094360f, 0.100159f, 0.106079f, 0.112915f, 0.119690f, 0.125977f, 0.133667f, - 0.141357f, 0.149414f, 0.157349f, 0.166260f, 0.175049f, 0.184326f, 0.193970f, 0.203735f, - 0.214355f, 0.224609f, 0.235352f, 0.246460f, 0.257568f, 0.269287f, 0.281738f, 0.294189f, - 0.305908f, 0.319824f, 0.332520f, 0.346680f, 0.360596f, 0.375244f, 0.389648f, 0.404297f, - 0.419189f, 0.435791f, 0.707520f, 0.723145f, 0.723633f, 0.722656f, 0.720703f, 0.717773f, - 0.001469f, 0.004345f, 0.006844f, 0.009483f, 0.012428f, 0.014679f, 0.017166f, 0.019989f, - 0.022949f, 0.025574f, 0.028320f, 0.031525f, 0.034088f, 0.037323f, 0.040710f, 0.043762f, - 0.047119f, 0.050873f, 0.054352f, 0.058441f, 0.062561f, 0.066711f, 0.071167f, 0.075989f, - 0.080627f, 0.086426f, 0.091553f, 0.097473f, 0.103210f, 0.109680f, 0.115723f, 0.122986f, - 0.129761f, 0.137451f, 0.145142f, 0.153198f, 0.161621f, 0.170654f, 0.179688f, 0.189087f, - 0.198730f, 0.209229f, 0.219604f, 0.230225f, 0.241211f, 0.252197f, 0.264404f, 0.276367f, - 0.288574f, 0.301270f, 0.314453f, 0.328125f, 0.341309f, 0.354980f, 0.370117f, 0.385498f, - 0.399902f, 0.415771f, 0.696289f, 0.714355f, 0.715820f, 0.714355f, 0.712891f, 0.710449f, - 0.001227f, 0.003862f, 0.006245f, 0.008644f, 0.010796f, 0.013344f, 0.015823f, 0.018448f, - 0.020645f, 0.023331f, 0.025681f, 0.028305f, 0.030975f, 0.033722f, 0.036987f, 0.039673f, - 0.043121f, 0.046112f, 0.049774f, 0.053406f, 0.056854f, 0.060760f, 0.064697f, 0.069397f, - 0.073364f, 0.078369f, 0.083313f, 0.088257f, 0.094116f, 0.100098f, 0.105957f, 0.112122f, - 0.118774f, 0.125854f, 0.133057f, 0.140869f, 0.148682f, 0.157227f, 0.165405f, 0.174927f, - 0.184082f, 0.193726f, 0.204102f, 0.214111f, 0.225098f, 0.236328f, 0.247314f, 0.259277f, - 0.270752f, 0.282959f, 0.296143f, 0.309082f, 0.322510f, 0.336426f, 0.350830f, 0.365479f, - 0.380371f, 0.396240f, 0.684570f, 0.705078f, 0.706543f, 0.706543f, 0.705078f, 0.703125f, - 0.001069f, 0.003525f, 0.006062f, 0.008286f, 0.010178f, 0.012589f, 0.014542f, 0.017075f, - 0.019241f, 0.021179f, 0.023499f, 0.026047f, 0.028137f, 0.030762f, 0.033417f, 0.035889f, - 0.038757f, 0.041779f, 0.044586f, 0.048309f, 0.051056f, 0.054810f, 0.058777f, 0.062347f, - 0.066528f, 0.070740f, 0.075256f, 0.080261f, 0.085205f, 0.090393f, 0.095886f, 0.102478f, - 0.108154f, 0.114441f, 0.121399f, 0.128784f, 0.135742f, 0.144165f, 0.151978f, 0.160767f, - 0.169434f, 0.178833f, 0.188721f, 0.198608f, 0.208984f, 0.220215f, 0.230957f, 0.241943f, - 0.253906f, 0.265869f, 0.278564f, 0.291260f, 0.304443f, 0.318359f, 0.332031f, 0.346680f, - 0.361572f, 0.377197f, 0.673828f, 0.695801f, 0.698242f, 0.697754f, 0.697266f, 0.695312f, - 0.001211f, 0.003250f, 0.005112f, 0.007195f, 0.009651f, 0.011414f, 0.013641f, 0.015205f, - 0.017334f, 0.019608f, 0.021164f, 0.023712f, 0.025726f, 0.027863f, 0.029984f, 0.032410f, - 0.035034f, 0.037689f, 0.040466f, 0.042938f, 0.046478f, 0.049591f, 0.052856f, 0.056274f, - 0.060089f, 0.063721f, 0.068115f, 0.072266f, 0.076904f, 0.081970f, 0.087036f, 0.092285f, - 0.097961f, 0.104309f, 0.110535f, 0.117126f, 0.124084f, 0.131226f, 0.139038f, 0.147095f, - 0.155884f, 0.164429f, 0.174194f, 0.183228f, 0.192749f, 0.203491f, 0.214233f, 0.224976f, - 0.236206f, 0.247925f, 0.260498f, 0.272705f, 0.285889f, 0.299805f, 0.312988f, 0.327637f, - 0.342529f, 0.356934f, 0.662598f, 0.686523f, 0.689453f, 0.689453f, 0.688965f, 0.687500f, - 0.001138f, 0.003206f, 0.005180f, 0.007309f, 0.008377f, 0.010635f, 0.012352f, 0.014153f, - 0.015640f, 0.017487f, 0.019272f, 0.021164f, 0.023026f, 0.025314f, 0.027222f, 0.029282f, - 0.031433f, 0.033600f, 0.036041f, 0.038788f, 0.041626f, 0.044281f, 0.047455f, 0.050507f, - 0.054047f, 0.057556f, 0.061188f, 0.065063f, 0.069214f, 0.073486f, 0.078369f, 0.083191f, - 0.088196f, 0.093811f, 0.099609f, 0.106018f, 0.112305f, 0.119385f, 0.126343f, 0.134033f, - 0.142090f, 0.150635f, 0.159546f, 0.168579f, 0.177734f, 0.187500f, 0.198242f, 0.208618f, - 0.219604f, 0.231812f, 0.242188f, 0.254883f, 0.267578f, 0.281494f, 0.294434f, 0.308350f, - 0.322998f, 0.338379f, 0.651367f, 0.676758f, 0.681152f, 0.680664f, 0.680664f, 0.679688f, - 0.000977f, 0.002806f, 0.004559f, 0.006176f, 0.008034f, 0.009476f, 0.011131f, 0.012741f, - 0.014275f, 0.015732f, 0.017334f, 0.019104f, 0.020767f, 0.022293f, 0.024323f, 0.026016f, - 0.028198f, 0.030197f, 0.032257f, 0.034515f, 0.036957f, 0.039856f, 0.042084f, 0.044891f, - 0.047791f, 0.051147f, 0.054535f, 0.058197f, 0.061768f, 0.065674f, 0.069946f, 0.074585f, - 0.079102f, 0.084412f, 0.089600f, 0.095398f, 0.101196f, 0.107544f, 0.114258f, 0.121094f, - 0.128662f, 0.137085f, 0.145020f, 0.153687f, 0.162720f, 0.172607f, 0.182129f, 0.192749f, - 0.203125f, 0.214111f, 0.226074f, 0.237671f, 0.249878f, 0.262207f, 0.275635f, 0.289551f, - 0.304199f, 0.318848f, 0.639160f, 0.666992f, 0.671387f, 0.671875f, 0.671875f, 0.671387f, - 0.000968f, 0.002722f, 0.004318f, 0.005634f, 0.007393f, 0.008667f, 0.010139f, 0.011383f, - 0.012856f, 0.014389f, 0.015427f, 0.016907f, 0.018387f, 0.020081f, 0.021683f, 0.023315f, - 0.025085f, 0.026840f, 0.028641f, 0.030624f, 0.032837f, 0.035065f, 0.037445f, 0.039948f, - 0.042542f, 0.045410f, 0.048340f, 0.051514f, 0.054840f, 0.058502f, 0.062408f, 0.066223f, - 0.070679f, 0.075134f, 0.080078f, 0.085388f, 0.090515f, 0.096436f, 0.102722f, 0.109314f, - 0.116333f, 0.123352f, 0.131592f, 0.139526f, 0.147949f, 0.156860f, 0.166748f, 0.176758f, - 0.187134f, 0.197632f, 0.209106f, 0.220337f, 0.232666f, 0.244751f, 0.257568f, 0.270996f, - 0.284912f, 0.300537f, 0.627441f, 0.657227f, 0.662598f, 0.663574f, 0.663574f, 0.663086f, - 0.001081f, 0.002466f, 0.003862f, 0.005348f, 0.006447f, 0.007927f, 0.009018f, 0.010490f, - 0.011436f, 0.012627f, 0.013916f, 0.015015f, 0.016449f, 0.017563f, 0.019165f, 0.020706f, - 0.021973f, 0.023834f, 0.025467f, 0.027130f, 0.029175f, 0.030991f, 0.033081f, 0.035156f, - 0.037384f, 0.040039f, 0.042603f, 0.045502f, 0.048492f, 0.051636f, 0.054962f, 0.058716f, - 0.062439f, 0.066467f, 0.071045f, 0.075378f, 0.080811f, 0.085815f, 0.091492f, 0.098022f, - 0.103943f, 0.111023f, 0.118164f, 0.125732f, 0.133911f, 0.142456f, 0.151367f, 0.161011f, - 0.170898f, 0.181396f, 0.192139f, 0.203247f, 0.214844f, 0.227173f, 0.239380f, 0.252441f, - 0.266602f, 0.281006f, 0.616699f, 0.647949f, 0.653320f, 0.655273f, 0.654785f, 0.655273f, - 0.000735f, 0.002331f, 0.003601f, 0.005005f, 0.005825f, 0.007061f, 0.008049f, 0.009148f, - 0.010315f, 0.011131f, 0.012230f, 0.013367f, 0.014328f, 0.015541f, 0.016968f, 0.018234f, - 0.019257f, 0.020798f, 0.022202f, 0.023666f, 0.025452f, 0.027115f, 0.028885f, 0.030792f, - 0.032715f, 0.035034f, 0.037323f, 0.039825f, 0.042419f, 0.045258f, 0.048157f, 0.051422f, - 0.054810f, 0.058411f, 0.062378f, 0.066528f, 0.071106f, 0.076233f, 0.081116f, 0.086853f, - 0.092407f, 0.098938f, 0.105469f, 0.112854f, 0.120361f, 0.128418f, 0.136841f, 0.145752f, - 0.155273f, 0.165283f, 0.175537f, 0.186646f, 0.197510f, 0.209473f, 0.221558f, 0.234619f, - 0.248047f, 0.261719f, 0.603516f, 0.636719f, 0.644531f, 0.645020f, 0.645508f, 0.646484f, - 0.000837f, 0.002073f, 0.003357f, 0.004292f, 0.005409f, 0.006271f, 0.007271f, 0.007973f, - 0.008873f, 0.009956f, 0.010811f, 0.012032f, 0.012848f, 0.013664f, 0.014870f, 0.015839f, - 0.017090f, 0.018280f, 0.019333f, 0.020691f, 0.022186f, 0.023453f, 0.025223f, 0.026779f, - 0.028595f, 0.030441f, 0.032410f, 0.034729f, 0.036743f, 0.039307f, 0.042023f, 0.044434f, - 0.047791f, 0.050781f, 0.054413f, 0.058075f, 0.061951f, 0.066711f, 0.071106f, 0.076355f, - 0.081848f, 0.087341f, 0.093872f, 0.099854f, 0.107483f, 0.114441f, 0.122925f, 0.131104f, - 0.140381f, 0.149414f, 0.159180f, 0.170166f, 0.181152f, 0.192139f, 0.204468f, 0.216553f, - 0.230103f, 0.244507f, 0.592773f, 0.626953f, 0.635254f, 0.637207f, 0.636719f, 0.637695f, - 0.000524f, 0.001863f, 0.003014f, 0.003777f, 0.004852f, 0.005516f, 0.006428f, 0.007111f, - 0.008095f, 0.008888f, 0.009476f, 0.010345f, 0.011063f, 0.012016f, 0.012810f, 0.013786f, - 0.014648f, 0.015717f, 0.016891f, 0.017929f, 0.019150f, 0.020401f, 0.021606f, 0.023193f, - 0.024597f, 0.026276f, 0.027939f, 0.029770f, 0.031738f, 0.033936f, 0.036194f, 0.038574f, - 0.041107f, 0.043945f, 0.047180f, 0.050385f, 0.054291f, 0.057770f, 0.061981f, 0.066345f, - 0.071167f, 0.076355f, 0.082153f, 0.088074f, 0.094666f, 0.101685f, 0.109131f, 0.117249f, - 0.125610f, 0.134399f, 0.143921f, 0.154175f, 0.164795f, 0.175659f, 0.187256f, 0.199341f, - 0.211670f, 0.225464f, 0.580078f, 0.617676f, 0.625000f, 0.627930f, 0.628906f, 0.628906f, - 0.000657f, 0.001829f, 0.002909f, 0.003525f, 0.004295f, 0.005051f, 0.005592f, 0.006123f, - 0.006920f, 0.007553f, 0.008339f, 0.008888f, 0.009689f, 0.010262f, 0.011017f, 0.011848f, - 0.012634f, 0.013489f, 0.014572f, 0.015427f, 0.016449f, 0.017426f, 0.018539f, 0.019852f, - 0.021133f, 0.022507f, 0.023834f, 0.025375f, 0.027084f, 0.028976f, 0.030792f, 0.032959f, - 0.035400f, 0.037720f, 0.040405f, 0.043243f, 0.046356f, 0.049530f, 0.053314f, 0.057190f, - 0.061554f, 0.066223f, 0.071472f, 0.076782f, 0.082825f, 0.089417f, 0.096191f, 0.103210f, - 0.111633f, 0.119934f, 0.128662f, 0.138550f, 0.148315f, 0.158813f, 0.170288f, 0.182373f, - 0.194458f, 0.207642f, 0.567383f, 0.606445f, 0.615234f, 0.619141f, 0.620117f, 0.620117f, - 0.000584f, 0.001548f, 0.002333f, 0.003086f, 0.003660f, 0.004303f, 0.005020f, 0.005543f, - 0.006042f, 0.006538f, 0.007118f, 0.007641f, 0.008301f, 0.008919f, 0.009499f, 0.010147f, - 0.010918f, 0.011414f, 0.012222f, 0.013084f, 0.013901f, 0.014954f, 0.015671f, 0.016724f, - 0.017914f, 0.019012f, 0.020325f, 0.021698f, 0.022949f, 0.024445f, 0.026215f, 0.027954f, - 0.029755f, 0.032043f, 0.034210f, 0.036591f, 0.039215f, 0.042297f, 0.045441f, 0.048676f, - 0.052612f, 0.056580f, 0.061432f, 0.066040f, 0.071350f, 0.077332f, 0.083496f, 0.090393f, - 0.097717f, 0.105835f, 0.114380f, 0.123413f, 0.133301f, 0.143066f, 0.153931f, 0.165039f, - 0.177124f, 0.190308f, 0.555176f, 0.597656f, 0.604980f, 0.609375f, 0.609863f, 0.611328f, - 0.000438f, 0.001456f, 0.001925f, 0.002811f, 0.003246f, 0.003731f, 0.004108f, 0.004669f, - 0.005344f, 0.005535f, 0.005913f, 0.006641f, 0.007038f, 0.007473f, 0.008049f, 0.008675f, - 0.009361f, 0.009689f, 0.010513f, 0.011032f, 0.011894f, 0.012695f, 0.013390f, 0.014183f, - 0.015114f, 0.016037f, 0.016998f, 0.018280f, 0.019272f, 0.020645f, 0.022003f, 0.023361f, - 0.024796f, 0.026779f, 0.028656f, 0.030685f, 0.032928f, 0.035370f, 0.038147f, 0.040955f, - 0.044403f, 0.047821f, 0.052032f, 0.056183f, 0.060974f, 0.066162f, 0.071777f, 0.078125f, - 0.084656f, 0.092102f, 0.100159f, 0.109009f, 0.117981f, 0.127563f, 0.138306f, 0.148804f, - 0.160645f, 0.173218f, 0.542969f, 0.586914f, 0.594727f, 0.599609f, 0.601074f, 0.601074f, - 0.000520f, 0.001104f, 0.001921f, 0.002256f, 0.002886f, 0.003389f, 0.003689f, 0.004063f, - 0.004440f, 0.004829f, 0.005230f, 0.005466f, 0.005966f, 0.006332f, 0.006786f, 0.007347f, - 0.007835f, 0.008232f, 0.008812f, 0.009216f, 0.009865f, 0.010490f, 0.011124f, 0.011803f, - 0.012573f, 0.013390f, 0.014275f, 0.015121f, 0.016144f, 0.016953f, 0.018234f, 0.019257f, - 0.020782f, 0.022064f, 0.023743f, 0.025360f, 0.027176f, 0.029327f, 0.031616f, 0.034058f, - 0.036957f, 0.039917f, 0.043182f, 0.047272f, 0.051025f, 0.055695f, 0.060913f, 0.066345f, - 0.072693f, 0.079285f, 0.086548f, 0.094543f, 0.103271f, 0.112793f, 0.122864f, 0.132812f, - 0.144531f, 0.156616f, 0.530273f, 0.576660f, 0.585449f, 0.590332f, 0.592285f, 0.593262f, - 0.000366f, 0.001040f, 0.001583f, 0.002129f, 0.002522f, 0.002792f, 0.003012f, 0.003420f, - 0.003630f, 0.003967f, 0.004246f, 0.004623f, 0.005039f, 0.005253f, 0.005627f, 0.006096f, - 0.006447f, 0.006939f, 0.007179f, 0.007710f, 0.008324f, 0.008698f, 0.009247f, 0.009796f, - 0.010414f, 0.011063f, 0.011627f, 0.012543f, 0.013191f, 0.014099f, 0.014938f, 0.015930f, - 0.016983f, 0.018219f, 0.019440f, 0.020813f, 0.022324f, 0.024002f, 0.025818f, 0.027969f, - 0.030289f, 0.032898f, 0.035583f, 0.038727f, 0.042450f, 0.046234f, 0.050781f, 0.055695f, - 0.061157f, 0.067383f, 0.074158f, 0.081360f, 0.089478f, 0.098267f, 0.107788f, 0.117737f, - 0.129028f, 0.140503f, 0.517578f, 0.566406f, 0.575195f, 0.581055f, 0.582520f, 0.584473f, - 0.000482f, 0.001008f, 0.001481f, 0.001818f, 0.002001f, 0.002296f, 0.002569f, 0.002781f, - 0.002998f, 0.003319f, 0.003620f, 0.003828f, 0.004082f, 0.004364f, 0.004658f, 0.004978f, - 0.005257f, 0.005665f, 0.005993f, 0.006340f, 0.006725f, 0.007160f, 0.007576f, 0.008095f, - 0.008522f, 0.008980f, 0.009621f, 0.010170f, 0.010765f, 0.011543f, 0.012161f, 0.013023f, - 0.013840f, 0.014801f, 0.015869f, 0.016861f, 0.018127f, 0.019379f, 0.020859f, 0.022583f, - 0.024261f, 0.026596f, 0.028839f, 0.031555f, 0.034271f, 0.037628f, 0.041504f, 0.045837f, - 0.050598f, 0.056000f, 0.062134f, 0.068726f, 0.076172f, 0.084656f, 0.093567f, 0.103088f, - 0.113586f, 0.125000f, 0.504883f, 0.554688f, 0.565918f, 0.570801f, 0.573242f, 0.574219f, - 0.000400f, 0.000803f, 0.001046f, 0.001427f, 0.001657f, 0.001952f, 0.002033f, 0.002337f, - 0.002453f, 0.002678f, 0.002871f, 0.003120f, 0.003286f, 0.003605f, 0.003817f, 0.004036f, - 0.004299f, 0.004604f, 0.004848f, 0.005142f, 0.005428f, 0.005871f, 0.006107f, 0.006584f, - 0.006908f, 0.007332f, 0.007736f, 0.008186f, 0.008820f, 0.009308f, 0.009964f, 0.010422f, - 0.011200f, 0.011993f, 0.012726f, 0.013512f, 0.014511f, 0.015610f, 0.016724f, 0.017914f, - 0.019440f, 0.021057f, 0.022827f, 0.024933f, 0.027466f, 0.030197f, 0.033295f, 0.036896f, - 0.041077f, 0.045776f, 0.050995f, 0.056976f, 0.063721f, 0.071167f, 0.079773f, 0.089172f, - 0.098633f, 0.109314f, 0.491699f, 0.543457f, 0.555176f, 0.561035f, 0.563477f, 0.565430f, - 0.000279f, 0.000821f, 0.000974f, 0.001161f, 0.001382f, 0.001583f, 0.001670f, 0.001934f, - 0.002064f, 0.002153f, 0.002306f, 0.002544f, 0.002670f, 0.002909f, 0.003052f, 0.003288f, - 0.003429f, 0.003624f, 0.003893f, 0.004082f, 0.004406f, 0.004635f, 0.004925f, 0.005196f, - 0.005444f, 0.005764f, 0.006134f, 0.006546f, 0.006947f, 0.007343f, 0.007858f, 0.008270f, - 0.008858f, 0.009346f, 0.010010f, 0.010757f, 0.011475f, 0.012260f, 0.013206f, 0.014214f, - 0.015236f, 0.016479f, 0.017975f, 0.019623f, 0.021515f, 0.023590f, 0.026062f, 0.028976f, - 0.032471f, 0.036224f, 0.040833f, 0.046082f, 0.052094f, 0.059052f, 0.066650f, 0.075684f, - 0.084778f, 0.094971f, 0.479492f, 0.532715f, 0.545898f, 0.551270f, 0.553711f, 0.555664f, - 0.000253f, 0.000612f, 0.000835f, 0.000998f, 0.001111f, 0.001228f, 0.001334f, 0.001452f, - 0.001619f, 0.001757f, 0.001837f, 0.001920f, 0.002140f, 0.002321f, 0.002453f, 0.002544f, - 0.002670f, 0.002790f, 0.003086f, 0.003260f, 0.003422f, 0.003620f, 0.003893f, 0.004101f, - 0.004326f, 0.004528f, 0.004761f, 0.005051f, 0.005444f, 0.005756f, 0.006065f, 0.006435f, - 0.006882f, 0.007378f, 0.007763f, 0.008286f, 0.008865f, 0.009506f, 0.010162f, 0.011024f, - 0.011826f, 0.012917f, 0.013916f, 0.015175f, 0.016602f, 0.018204f, 0.020035f, 0.022293f, - 0.024948f, 0.028076f, 0.031921f, 0.036377f, 0.041565f, 0.047577f, 0.054535f, 0.062622f, - 0.071777f, 0.081787f, 0.465576f, 0.522461f, 0.535645f, 0.541992f, 0.544922f, 0.546875f, - 0.000155f, 0.000398f, 0.000680f, 0.000828f, 0.000907f, 0.000989f, 0.001113f, 0.001081f, - 0.001253f, 0.001350f, 0.001453f, 0.001573f, 0.001661f, 0.001777f, 0.001829f, 0.001978f, - 0.002062f, 0.002216f, 0.002346f, 0.002470f, 0.002644f, 0.002804f, 0.002930f, 0.003134f, - 0.003265f, 0.003485f, 0.003674f, 0.003866f, 0.004154f, 0.004333f, 0.004707f, 0.004910f, - 0.005180f, 0.005581f, 0.005875f, 0.006283f, 0.006729f, 0.007164f, 0.007713f, 0.008270f, - 0.008934f, 0.009727f, 0.010513f, 0.011482f, 0.012520f, 0.013710f, 0.015152f, 0.016815f, - 0.018799f, 0.021118f, 0.024048f, 0.027756f, 0.032104f, 0.037201f, 0.043518f, 0.050903f, - 0.059418f, 0.068420f, 0.453125f, 0.511719f, 0.525391f, 0.530762f, 0.535156f, 0.536621f, - 0.000303f, 0.000337f, 0.000498f, 0.000560f, 0.000603f, 0.000721f, 0.000782f, 0.000845f, - 0.000880f, 0.000988f, 0.001119f, 0.001184f, 0.001258f, 0.001377f, 0.001420f, 0.001446f, - 0.001590f, 0.001666f, 0.001754f, 0.001889f, 0.001980f, 0.002073f, 0.002216f, 0.002308f, - 0.002447f, 0.002562f, 0.002758f, 0.002899f, 0.003084f, 0.003328f, 0.003506f, 0.003641f, - 0.003922f, 0.004147f, 0.004391f, 0.004665f, 0.004959f, 0.005322f, 0.005695f, 0.006119f, - 0.006588f, 0.007072f, 0.007790f, 0.008392f, 0.009178f, 0.010056f, 0.011124f, 0.012383f, - 0.013832f, 0.015587f, 0.017685f, 0.020309f, 0.023926f, 0.028076f, 0.033447f, 0.039978f, - 0.047638f, 0.056335f, 0.440186f, 0.500000f, 0.514160f, 0.520996f, 0.524414f, 0.526855f, - 0.000132f, 0.000296f, 0.000368f, 0.000444f, 0.000501f, 0.000519f, 0.000631f, 0.000580f, - 0.000675f, 0.000735f, 0.000820f, 0.000840f, 0.000882f, 0.000946f, 0.001029f, 0.001070f, - 0.001164f, 0.001221f, 0.001286f, 0.001317f, 0.001416f, 0.001494f, 0.001607f, 0.001681f, - 0.001763f, 0.001863f, 0.001978f, 0.002069f, 0.002169f, 0.002348f, 0.002451f, 0.002661f, - 0.002754f, 0.002943f, 0.003130f, 0.003323f, 0.003553f, 0.003813f, 0.004124f, 0.004364f, - 0.004669f, 0.005062f, 0.005493f, 0.005985f, 0.006546f, 0.007172f, 0.007950f, 0.008850f, - 0.009857f, 0.011116f, 0.012695f, 0.014603f, 0.016983f, 0.020157f, 0.024490f, 0.029968f, - 0.036957f, 0.045166f, 0.426025f, 0.488770f, 0.503906f, 0.511719f, 0.515137f, 0.517578f, - 0.000063f, 0.000160f, 0.000267f, 0.000282f, 0.000339f, 0.000417f, 0.000377f, 0.000433f, - 0.000472f, 0.000570f, 0.000563f, 0.000578f, 0.000599f, 0.000663f, 0.000681f, 0.000759f, - 0.000760f, 0.000845f, 0.000910f, 0.000941f, 0.000997f, 0.001057f, 0.001110f, 0.001169f, - 0.001238f, 0.001288f, 0.001381f, 0.001441f, 0.001514f, 0.001655f, 0.001693f, 0.001815f, - 0.001910f, 0.002028f, 0.002153f, 0.002308f, 0.002441f, 0.002607f, 0.002783f, 0.002962f, - 0.003214f, 0.003458f, 0.003744f, 0.004051f, 0.004444f, 0.004883f, 0.005402f, 0.006031f, - 0.006699f, 0.007610f, 0.008766f, 0.009933f, 0.011688f, 0.013931f, 0.017075f, 0.021454f, - 0.027313f, 0.035004f, 0.414307f, 0.478271f, 0.493652f, 0.501465f, 0.505859f, 0.508301f, - 0.000120f, 0.000194f, 0.000194f, 0.000205f, 0.000245f, 0.000246f, 0.000251f, 0.000301f, - 0.000322f, 0.000332f, 0.000343f, 0.000413f, 0.000397f, 0.000448f, 0.000481f, 0.000494f, - 0.000545f, 0.000556f, 0.000582f, 0.000601f, 0.000653f, 0.000676f, 0.000726f, 0.000767f, - 0.000821f, 0.000840f, 0.000919f, 0.000952f, 0.001011f, 0.001054f, 0.001116f, 0.001186f, - 0.001263f, 0.001337f, 0.001418f, 0.001482f, 0.001607f, 0.001685f, 0.001842f, 0.001965f, - 0.002090f, 0.002235f, 0.002420f, 0.002613f, 0.002851f, 0.003159f, 0.003492f, 0.003887f, - 0.004345f, 0.004906f, 0.005600f, 0.006474f, 0.007645f, 0.009186f, 0.011230f, 0.014305f, - 0.019135f, 0.025848f, 0.400635f, 0.466797f, 0.483398f, 0.490967f, 0.495117f, 0.498047f, - 0.000030f, 0.000140f, 0.000121f, 0.000114f, 0.000147f, 0.000178f, 0.000159f, 0.000195f, - 0.000199f, 0.000204f, 0.000216f, 0.000223f, 0.000255f, 0.000271f, 0.000288f, 0.000302f, - 0.000314f, 0.000346f, 0.000357f, 0.000395f, 0.000397f, 0.000408f, 0.000436f, 0.000470f, - 0.000501f, 0.000542f, 0.000547f, 0.000566f, 0.000612f, 0.000641f, 0.000692f, 0.000722f, - 0.000767f, 0.000798f, 0.000861f, 0.000898f, 0.000963f, 0.001030f, 0.001107f, 0.001164f, - 0.001255f, 0.001361f, 0.001464f, 0.001591f, 0.001719f, 0.001871f, 0.002111f, 0.002312f, - 0.002617f, 0.002964f, 0.003368f, 0.003902f, 0.004654f, 0.005653f, 0.006958f, 0.008888f, - 0.012161f, 0.017822f, 0.388672f, 0.456543f, 0.473389f, 0.481201f, 0.486328f, 0.489014f, - 0.000102f, 0.000076f, 0.000076f, 0.000075f, 0.000095f, 0.000092f, 0.000109f, 0.000111f, - 0.000112f, 0.000113f, 0.000126f, 0.000147f, 0.000135f, 0.000144f, 0.000165f, 0.000161f, - 0.000179f, 0.000192f, 0.000198f, 0.000202f, 0.000224f, 0.000232f, 0.000248f, 0.000259f, - 0.000278f, 0.000295f, 0.000308f, 0.000320f, 0.000340f, 0.000353f, 0.000379f, 0.000402f, - 0.000423f, 0.000440f, 0.000472f, 0.000503f, 0.000526f, 0.000564f, 0.000610f, 0.000644f, - 0.000690f, 0.000741f, 0.000810f, 0.000862f, 0.000946f, 0.001024f, 0.001121f, 0.001247f, - 0.001407f, 0.001603f, 0.001822f, 0.002144f, 0.002539f, 0.003098f, 0.003901f, 0.005096f, - 0.006931f, 0.011024f, 0.375244f, 0.444092f, 0.462158f, 0.470215f, 0.475586f, 0.478760f, - 0.000085f, 0.000061f, 0.000052f, 0.000047f, 0.000049f, 0.000046f, 0.000047f, 0.000050f, - 0.000055f, 0.000069f, 0.000060f, 0.000062f, 0.000077f, 0.000066f, 0.000069f, 0.000075f, - 0.000084f, 0.000093f, 0.000093f, 0.000098f, 0.000102f, 0.000108f, 0.000111f, 0.000121f, - 0.000129f, 0.000136f, 0.000142f, 0.000154f, 0.000162f, 0.000172f, 0.000182f, 0.000187f, - 0.000197f, 0.000209f, 0.000225f, 0.000231f, 0.000246f, 0.000262f, 0.000290f, 0.000306f, - 0.000321f, 0.000349f, 0.000380f, 0.000402f, 0.000437f, 0.000480f, 0.000525f, 0.000579f, - 0.000649f, 0.000735f, 0.000842f, 0.000984f, 0.001173f, 0.001451f, 0.001855f, 0.002485f, - 0.003542f, 0.005753f, 0.362305f, 0.434326f, 0.451904f, 0.460693f, 0.465576f, 0.468506f, - 0.000064f, 0.000044f, 0.000036f, 0.000032f, 0.000029f, 0.000027f, 0.000025f, 0.000024f, - 0.000022f, 0.000023f, 0.000021f, 0.000027f, 0.000023f, 0.000022f, 0.000028f, 0.000031f, - 0.000030f, 0.000034f, 0.000036f, 0.000038f, 0.000040f, 0.000045f, 0.000048f, 0.000042f, - 0.000047f, 0.000053f, 0.000055f, 0.000054f, 0.000060f, 0.000062f, 0.000065f, 0.000072f, - 0.000078f, 0.000075f, 0.000079f, 0.000087f, 0.000093f, 0.000098f, 0.000106f, 0.000113f, - 0.000121f, 0.000126f, 0.000136f, 0.000150f, 0.000159f, 0.000173f, 0.000190f, 0.000209f, - 0.000235f, 0.000265f, 0.000302f, 0.000343f, 0.000416f, 0.000515f, 0.000665f, 0.000917f, - 0.001396f, 0.002401f, 0.349854f, 0.421875f, 0.440918f, 0.449951f, 0.455811f, 0.458008f, - 0.000030f, 0.000020f, 0.000016f, 0.000014f, 0.000014f, 0.000013f, 0.000012f, 0.000012f, - 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, - 0.000009f, 0.000008f, 0.000008f, 0.000008f, 0.000007f, 0.000007f, 0.000008f, 0.000008f, - 0.000009f, 0.000011f, 0.000011f, 0.000013f, 0.000013f, 0.000012f, 0.000013f, 0.000014f, - 0.000016f, 0.000018f, 0.000018f, 0.000019f, 0.000021f, 0.000021f, 0.000023f, 0.000027f, - 0.000025f, 0.000028f, 0.000031f, 0.000032f, 0.000033f, 0.000038f, 0.000043f, 0.000046f, - 0.000050f, 0.000055f, 0.000062f, 0.000074f, 0.000088f, 0.000106f, 0.000138f, 0.000191f, - 0.000312f, 0.000653f, 0.337402f, 0.410645f, 0.431152f, 0.438965f, 0.445068f, 0.448975f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000004f, 0.000004f, 0.000004f, 0.000006f, - 0.000010f, 0.000026f, 0.324219f, 0.399902f, 0.419922f, 0.429688f, 0.435059f, 0.438965f, - }, - { - 0.010521f, 0.032043f, 0.054443f, 0.076843f, 0.098572f, 0.121216f, 0.142700f, 0.164062f, - 0.185913f, 0.207275f, 0.229004f, 0.249268f, 0.270508f, 0.290527f, 0.311035f, 0.331055f, - 0.350586f, 0.370361f, 0.389648f, 0.408936f, 0.428223f, 0.446533f, 0.465088f, 0.482666f, - 0.500977f, 0.519043f, 0.536133f, 0.553223f, 0.570801f, 0.587891f, 0.604980f, 0.621582f, - 0.637207f, 0.653320f, 0.668945f, 0.685547f, 0.700684f, 0.716309f, 0.730957f, 0.745605f, - 0.760254f, 0.774902f, 0.789551f, 0.803711f, 0.816895f, 0.831543f, 0.845703f, 0.858887f, - 0.871582f, 0.885254f, 0.897949f, 0.910645f, 0.923340f, 0.936035f, 0.948242f, 0.959961f, - 0.972168f, 0.984375f, 0.972656f, 0.936035f, 0.910645f, 0.890137f, 0.872070f, 0.855957f, - 0.010048f, 0.030350f, 0.051392f, 0.072266f, 0.093506f, 0.114319f, 0.135620f, 0.155273f, - 0.177124f, 0.197144f, 0.217773f, 0.237915f, 0.257568f, 0.277588f, 0.298096f, 0.316895f, - 0.336182f, 0.355225f, 0.374268f, 0.393311f, 0.411865f, 0.430176f, 0.448486f, 0.466309f, - 0.483398f, 0.501465f, 0.519043f, 0.535645f, 0.552734f, 0.570312f, 0.586426f, 0.602539f, - 0.618652f, 0.635254f, 0.650879f, 0.666016f, 0.682129f, 0.697266f, 0.712402f, 0.727539f, - 0.741699f, 0.756836f, 0.770996f, 0.785645f, 0.799805f, 0.812988f, 0.826660f, 0.840332f, - 0.854004f, 0.867676f, 0.881348f, 0.893066f, 0.907715f, 0.919434f, 0.932617f, 0.943848f, - 0.955566f, 0.968262f, 0.965332f, 0.930664f, 0.906738f, 0.886719f, 0.869629f, 0.854004f, - 0.009254f, 0.028961f, 0.048615f, 0.068054f, 0.088562f, 0.108093f, 0.128540f, 0.147705f, - 0.167236f, 0.188599f, 0.207886f, 0.227295f, 0.244873f, 0.265625f, 0.284668f, 0.303955f, - 0.322510f, 0.340820f, 0.358887f, 0.378662f, 0.396484f, 0.414307f, 0.431885f, 0.448975f, - 0.466797f, 0.484619f, 0.500977f, 0.519043f, 0.535645f, 0.551758f, 0.568359f, 0.584961f, - 0.600586f, 0.616699f, 0.632324f, 0.647949f, 0.663086f, 0.678223f, 0.693848f, 0.708984f, - 0.723633f, 0.738281f, 0.752930f, 0.767578f, 0.780762f, 0.794922f, 0.809082f, 0.822754f, - 0.835938f, 0.849609f, 0.863770f, 0.875488f, 0.888672f, 0.902344f, 0.915527f, 0.927246f, - 0.939453f, 0.952637f, 0.958008f, 0.925293f, 0.901855f, 0.882812f, 0.866211f, 0.851562f, - 0.008736f, 0.027039f, 0.045807f, 0.064514f, 0.083801f, 0.102844f, 0.121826f, 0.140869f, - 0.159302f, 0.179077f, 0.197388f, 0.216064f, 0.234741f, 0.253662f, 0.271729f, 0.290283f, - 0.308350f, 0.327148f, 0.344238f, 0.362061f, 0.381836f, 0.398926f, 0.416016f, 0.432373f, - 0.450195f, 0.466797f, 0.484375f, 0.500977f, 0.517090f, 0.533691f, 0.550781f, 0.567871f, - 0.582031f, 0.598145f, 0.613770f, 0.629395f, 0.645020f, 0.659668f, 0.675781f, 0.689941f, - 0.705566f, 0.719727f, 0.734375f, 0.749512f, 0.763184f, 0.776855f, 0.791016f, 0.804688f, - 0.818848f, 0.832031f, 0.845215f, 0.858398f, 0.872559f, 0.884766f, 0.897949f, 0.909668f, - 0.922852f, 0.936035f, 0.950684f, 0.919434f, 0.896973f, 0.878906f, 0.862793f, 0.848633f, - 0.008339f, 0.025543f, 0.043427f, 0.060974f, 0.078979f, 0.097168f, 0.115051f, 0.133179f, - 0.151367f, 0.169678f, 0.187988f, 0.206055f, 0.223999f, 0.241821f, 0.260742f, 0.277832f, - 0.295166f, 0.313232f, 0.331299f, 0.347412f, 0.365479f, 0.383057f, 0.399902f, 0.416992f, - 0.433350f, 0.450195f, 0.467773f, 0.484863f, 0.499756f, 0.515625f, 0.532715f, 0.548340f, - 0.564941f, 0.580566f, 0.596191f, 0.610840f, 0.626953f, 0.641602f, 0.656738f, 0.671875f, - 0.686035f, 0.701660f, 0.714844f, 0.730469f, 0.745117f, 0.759766f, 0.772461f, 0.786621f, - 0.801270f, 0.814453f, 0.827637f, 0.841309f, 0.854004f, 0.867676f, 0.880859f, 0.893555f, - 0.907227f, 0.919434f, 0.943359f, 0.913086f, 0.891602f, 0.874512f, 0.858887f, 0.845703f, - 0.008102f, 0.024002f, 0.040802f, 0.057098f, 0.074768f, 0.091553f, 0.108826f, 0.126343f, - 0.143921f, 0.161377f, 0.179077f, 0.195923f, 0.213745f, 0.230835f, 0.248047f, 0.265869f, - 0.282227f, 0.299561f, 0.316895f, 0.334473f, 0.350586f, 0.367920f, 0.384277f, 0.400391f, - 0.417725f, 0.434326f, 0.450195f, 0.467285f, 0.482910f, 0.498291f, 0.514648f, 0.530762f, - 0.546387f, 0.561523f, 0.577637f, 0.593262f, 0.608398f, 0.623535f, 0.637695f, 0.654297f, - 0.668457f, 0.682617f, 0.698242f, 0.711914f, 0.727051f, 0.741211f, 0.754395f, 0.768066f, - 0.782715f, 0.796387f, 0.810547f, 0.823730f, 0.836426f, 0.849609f, 0.863770f, 0.876465f, - 0.889648f, 0.902344f, 0.934570f, 0.907715f, 0.887207f, 0.870117f, 0.854980f, 0.842285f, - 0.007504f, 0.022812f, 0.038727f, 0.054871f, 0.070312f, 0.087097f, 0.103088f, 0.119446f, - 0.136475f, 0.153442f, 0.169556f, 0.186523f, 0.203369f, 0.219971f, 0.236450f, 0.253418f, - 0.270264f, 0.287109f, 0.302979f, 0.319824f, 0.336182f, 0.353271f, 0.369141f, 0.386230f, - 0.402100f, 0.417725f, 0.433594f, 0.450684f, 0.466553f, 0.482178f, 0.498047f, 0.513184f, - 0.528809f, 0.543945f, 0.559082f, 0.575195f, 0.589844f, 0.605469f, 0.621094f, 0.634277f, - 0.649414f, 0.665039f, 0.679688f, 0.694824f, 0.708496f, 0.722168f, 0.736816f, 0.750000f, - 0.763184f, 0.778809f, 0.791504f, 0.805664f, 0.819336f, 0.832520f, 0.845703f, 0.858887f, - 0.872070f, 0.885742f, 0.927246f, 0.900879f, 0.881836f, 0.864746f, 0.851074f, 0.838867f, - 0.006836f, 0.021683f, 0.036224f, 0.051666f, 0.066772f, 0.081970f, 0.098022f, 0.113831f, - 0.129517f, 0.145264f, 0.161011f, 0.177856f, 0.193359f, 0.209106f, 0.226196f, 0.241821f, - 0.257812f, 0.274414f, 0.290283f, 0.306641f, 0.322754f, 0.338623f, 0.354492f, 0.370361f, - 0.386230f, 0.402100f, 0.417725f, 0.433838f, 0.449463f, 0.465088f, 0.480469f, 0.495605f, - 0.511719f, 0.527344f, 0.541016f, 0.556641f, 0.571777f, 0.587402f, 0.601562f, 0.617676f, - 0.631836f, 0.646484f, 0.660645f, 0.674805f, 0.689941f, 0.704102f, 0.718262f, 0.731934f, - 0.746582f, 0.760254f, 0.774414f, 0.786621f, 0.801758f, 0.815430f, 0.828125f, 0.842285f, - 0.854980f, 0.868652f, 0.918457f, 0.894531f, 0.875977f, 0.859863f, 0.846680f, 0.834961f, - 0.006672f, 0.020401f, 0.034088f, 0.048462f, 0.062927f, 0.077820f, 0.092529f, 0.107666f, - 0.122803f, 0.137695f, 0.152954f, 0.169067f, 0.183716f, 0.199829f, 0.214722f, 0.230347f, - 0.246704f, 0.262207f, 0.277832f, 0.292969f, 0.308105f, 0.324219f, 0.339600f, 0.354492f, - 0.371094f, 0.386963f, 0.401855f, 0.418457f, 0.432861f, 0.449219f, 0.463379f, 0.478271f, - 0.494385f, 0.508301f, 0.523438f, 0.539551f, 0.553711f, 0.568848f, 0.583984f, 0.598633f, - 0.612793f, 0.627441f, 0.642578f, 0.656250f, 0.670898f, 0.685547f, 0.698730f, 0.714355f, - 0.728027f, 0.742188f, 0.755859f, 0.769531f, 0.783691f, 0.795898f, 0.810059f, 0.824707f, - 0.838379f, 0.850586f, 0.910645f, 0.887695f, 0.870117f, 0.854980f, 0.842285f, 0.831055f, - 0.006207f, 0.019211f, 0.032623f, 0.046112f, 0.059662f, 0.073181f, 0.087585f, 0.102051f, - 0.116577f, 0.130249f, 0.145142f, 0.159790f, 0.175171f, 0.189575f, 0.205322f, 0.219238f, - 0.235474f, 0.249634f, 0.265137f, 0.280029f, 0.294678f, 0.310547f, 0.325928f, 0.340820f, - 0.356201f, 0.371094f, 0.386230f, 0.401367f, 0.416504f, 0.431885f, 0.446533f, 0.461670f, - 0.476074f, 0.492188f, 0.507324f, 0.520996f, 0.535645f, 0.550781f, 0.564941f, 0.580078f, - 0.594727f, 0.609863f, 0.623535f, 0.637695f, 0.652832f, 0.667480f, 0.681152f, 0.695312f, - 0.709473f, 0.723633f, 0.737793f, 0.751953f, 0.765137f, 0.779297f, 0.793945f, 0.807129f, - 0.819824f, 0.833496f, 0.901855f, 0.880859f, 0.864258f, 0.850098f, 0.837891f, 0.826660f, - 0.006020f, 0.018219f, 0.030579f, 0.043365f, 0.055908f, 0.069153f, 0.082336f, 0.096802f, - 0.109497f, 0.123535f, 0.137451f, 0.151855f, 0.165649f, 0.180054f, 0.194702f, 0.208252f, - 0.223999f, 0.238037f, 0.252930f, 0.267334f, 0.281982f, 0.296875f, 0.312012f, 0.326904f, - 0.340820f, 0.355957f, 0.370850f, 0.385986f, 0.400391f, 0.415039f, 0.430176f, 0.445801f, - 0.459229f, 0.474365f, 0.489014f, 0.502441f, 0.518066f, 0.533203f, 0.547363f, 0.562012f, - 0.576660f, 0.590820f, 0.605469f, 0.619629f, 0.633789f, 0.647949f, 0.663574f, 0.676758f, - 0.690918f, 0.705566f, 0.719238f, 0.733398f, 0.746582f, 0.760254f, 0.774414f, 0.788574f, - 0.802246f, 0.816406f, 0.894043f, 0.874023f, 0.858398f, 0.844238f, 0.832031f, 0.822266f, - 0.005520f, 0.017059f, 0.028625f, 0.040649f, 0.053131f, 0.065552f, 0.077698f, 0.091187f, - 0.104065f, 0.117371f, 0.130859f, 0.143677f, 0.157349f, 0.171021f, 0.184814f, 0.198730f, - 0.213135f, 0.226807f, 0.241211f, 0.255127f, 0.269775f, 0.283691f, 0.298096f, 0.312744f, - 0.326660f, 0.341553f, 0.355957f, 0.370117f, 0.384766f, 0.399170f, 0.414307f, 0.427979f, - 0.442627f, 0.457764f, 0.471924f, 0.486084f, 0.500488f, 0.515137f, 0.529785f, 0.543945f, - 0.558594f, 0.572754f, 0.587402f, 0.601074f, 0.615234f, 0.629395f, 0.644043f, 0.657715f, - 0.672852f, 0.685547f, 0.700684f, 0.714844f, 0.728027f, 0.743164f, 0.756348f, 0.770508f, - 0.785645f, 0.798340f, 0.885254f, 0.867676f, 0.852051f, 0.839355f, 0.828125f, 0.817871f, - 0.005241f, 0.015854f, 0.027481f, 0.038605f, 0.050171f, 0.061859f, 0.073853f, 0.085693f, - 0.098328f, 0.111206f, 0.123474f, 0.136475f, 0.149658f, 0.162598f, 0.175293f, 0.188477f, - 0.202148f, 0.216431f, 0.229858f, 0.242798f, 0.256104f, 0.270264f, 0.284668f, 0.298828f, - 0.312744f, 0.326904f, 0.341064f, 0.355469f, 0.369141f, 0.383057f, 0.396729f, 0.411621f, - 0.426025f, 0.439697f, 0.454590f, 0.468506f, 0.482666f, 0.497070f, 0.512207f, 0.525391f, - 0.540527f, 0.555176f, 0.567871f, 0.582031f, 0.596191f, 0.610840f, 0.625488f, 0.639648f, - 0.653809f, 0.668457f, 0.681641f, 0.695801f, 0.710449f, 0.724121f, 0.738770f, 0.751953f, - 0.766602f, 0.780273f, 0.876465f, 0.860352f, 0.845703f, 0.833984f, 0.822754f, 0.812988f, - 0.004982f, 0.015274f, 0.025681f, 0.036438f, 0.047119f, 0.058167f, 0.069397f, 0.081055f, - 0.092957f, 0.104492f, 0.116577f, 0.128418f, 0.141113f, 0.153442f, 0.166504f, 0.179321f, - 0.192261f, 0.205200f, 0.218506f, 0.231934f, 0.244629f, 0.258301f, 0.271729f, 0.284912f, - 0.299072f, 0.312988f, 0.325684f, 0.340088f, 0.353271f, 0.367676f, 0.381836f, 0.395508f, - 0.408936f, 0.423584f, 0.438232f, 0.451416f, 0.466309f, 0.479736f, 0.493896f, 0.507812f, - 0.521973f, 0.536133f, 0.550293f, 0.563965f, 0.578613f, 0.592773f, 0.606934f, 0.620605f, - 0.635254f, 0.649414f, 0.663086f, 0.677246f, 0.691406f, 0.706543f, 0.720703f, 0.734375f, - 0.748047f, 0.762695f, 0.868164f, 0.853027f, 0.839355f, 0.828125f, 0.817383f, 0.808105f, - 0.004745f, 0.014290f, 0.024506f, 0.034393f, 0.044617f, 0.054749f, 0.065308f, 0.076538f, - 0.087646f, 0.098938f, 0.110535f, 0.121582f, 0.134155f, 0.145264f, 0.157837f, 0.170166f, - 0.182373f, 0.194824f, 0.207153f, 0.220337f, 0.233276f, 0.245728f, 0.259277f, 0.271973f, - 0.285645f, 0.298584f, 0.311768f, 0.325684f, 0.338623f, 0.352539f, 0.365967f, 0.379395f, - 0.393066f, 0.406738f, 0.421143f, 0.434326f, 0.448730f, 0.462402f, 0.475586f, 0.490479f, - 0.503906f, 0.518066f, 0.532227f, 0.546387f, 0.560059f, 0.574219f, 0.588379f, 0.602539f, - 0.616211f, 0.630371f, 0.644531f, 0.658691f, 0.673340f, 0.686523f, 0.701660f, 0.715332f, - 0.730469f, 0.745117f, 0.858887f, 0.845215f, 0.833008f, 0.821777f, 0.812012f, 0.802734f, - 0.004494f, 0.013550f, 0.022675f, 0.032227f, 0.042145f, 0.052002f, 0.061554f, 0.072205f, - 0.082520f, 0.093323f, 0.104614f, 0.115112f, 0.126099f, 0.137817f, 0.149536f, 0.160767f, - 0.172607f, 0.184692f, 0.196167f, 0.208862f, 0.221924f, 0.233765f, 0.246216f, 0.258545f, - 0.272461f, 0.284424f, 0.297119f, 0.310547f, 0.323242f, 0.336914f, 0.350586f, 0.363281f, - 0.376953f, 0.390869f, 0.403564f, 0.416992f, 0.431152f, 0.444824f, 0.458496f, 0.472656f, - 0.486084f, 0.500000f, 0.513672f, 0.527832f, 0.541504f, 0.555664f, 0.569824f, 0.583496f, - 0.598145f, 0.611816f, 0.626465f, 0.639648f, 0.654297f, 0.668457f, 0.683594f, 0.697754f, - 0.711914f, 0.726562f, 0.849609f, 0.838867f, 0.826172f, 0.815918f, 0.806641f, 0.796875f, - 0.004288f, 0.012619f, 0.021713f, 0.030945f, 0.039368f, 0.048737f, 0.058533f, 0.067932f, - 0.077759f, 0.088013f, 0.098755f, 0.108398f, 0.119080f, 0.129639f, 0.141235f, 0.152466f, - 0.163940f, 0.174927f, 0.186768f, 0.198608f, 0.210205f, 0.222290f, 0.234131f, 0.246094f, - 0.258789f, 0.270508f, 0.283203f, 0.296631f, 0.309326f, 0.321777f, 0.335449f, 0.348145f, - 0.361084f, 0.374023f, 0.386963f, 0.400391f, 0.414062f, 0.427734f, 0.441162f, 0.455078f, - 0.467773f, 0.482422f, 0.495117f, 0.509277f, 0.523926f, 0.536621f, 0.550781f, 0.564941f, - 0.579102f, 0.593262f, 0.607422f, 0.621582f, 0.635742f, 0.649902f, 0.664551f, 0.678711f, - 0.693848f, 0.708008f, 0.840820f, 0.831055f, 0.819336f, 0.809570f, 0.801270f, 0.792969f, - 0.004013f, 0.012070f, 0.019989f, 0.029190f, 0.037415f, 0.045776f, 0.055023f, 0.064392f, - 0.073669f, 0.083374f, 0.092224f, 0.102295f, 0.112610f, 0.122742f, 0.133057f, 0.143799f, - 0.155273f, 0.165527f, 0.176880f, 0.188110f, 0.199463f, 0.210815f, 0.222534f, 0.234619f, - 0.245972f, 0.258301f, 0.270508f, 0.282715f, 0.294678f, 0.307129f, 0.320557f, 0.333008f, - 0.345947f, 0.358398f, 0.371826f, 0.384277f, 0.397461f, 0.410889f, 0.424561f, 0.437256f, - 0.451416f, 0.464600f, 0.477783f, 0.491455f, 0.504395f, 0.518555f, 0.532715f, 0.546875f, - 0.560547f, 0.574219f, 0.588379f, 0.604004f, 0.617188f, 0.631348f, 0.645020f, 0.660645f, - 0.674316f, 0.689941f, 0.832031f, 0.823242f, 0.813477f, 0.803711f, 0.794922f, 0.787109f, - 0.003790f, 0.011559f, 0.019119f, 0.027069f, 0.035034f, 0.043762f, 0.052032f, 0.060059f, - 0.069153f, 0.078369f, 0.087280f, 0.096741f, 0.105957f, 0.115967f, 0.125732f, 0.135620f, - 0.146118f, 0.156128f, 0.166992f, 0.177612f, 0.188965f, 0.199829f, 0.210815f, 0.222290f, - 0.233887f, 0.244873f, 0.257324f, 0.268799f, 0.281006f, 0.292969f, 0.305420f, 0.317627f, - 0.329834f, 0.341797f, 0.355469f, 0.368164f, 0.380859f, 0.393311f, 0.407227f, 0.419434f, - 0.433350f, 0.446533f, 0.459961f, 0.473633f, 0.486328f, 0.500488f, 0.515625f, 0.528320f, - 0.541504f, 0.556152f, 0.570312f, 0.584473f, 0.598633f, 0.612305f, 0.626465f, 0.640625f, - 0.655762f, 0.670410f, 0.822266f, 0.815918f, 0.805664f, 0.796387f, 0.788574f, 0.782227f, - 0.003599f, 0.010727f, 0.018219f, 0.025177f, 0.033203f, 0.041046f, 0.048981f, 0.057220f, - 0.065247f, 0.073792f, 0.082764f, 0.091064f, 0.100220f, 0.108826f, 0.118591f, 0.128052f, - 0.137573f, 0.147705f, 0.158081f, 0.167603f, 0.177979f, 0.188721f, 0.198975f, 0.210205f, - 0.221924f, 0.232544f, 0.243774f, 0.255615f, 0.267090f, 0.278564f, 0.290039f, 0.302490f, - 0.314941f, 0.327393f, 0.338623f, 0.352295f, 0.364014f, 0.377441f, 0.390381f, 0.403564f, - 0.415039f, 0.428955f, 0.441895f, 0.455078f, 0.468994f, 0.482666f, 0.496094f, 0.509277f, - 0.523926f, 0.537598f, 0.551270f, 0.565430f, 0.579590f, 0.594238f, 0.608887f, 0.622559f, - 0.637207f, 0.651855f, 0.813477f, 0.807617f, 0.798340f, 0.790527f, 0.782715f, 0.775391f, - 0.003355f, 0.009918f, 0.017105f, 0.023911f, 0.031281f, 0.038147f, 0.045990f, 0.053284f, - 0.061493f, 0.069214f, 0.077026f, 0.085571f, 0.093567f, 0.102600f, 0.111755f, 0.120728f, - 0.129761f, 0.138916f, 0.148804f, 0.158447f, 0.167725f, 0.177979f, 0.188965f, 0.198608f, - 0.209473f, 0.220215f, 0.231567f, 0.242554f, 0.253906f, 0.264160f, 0.276123f, 0.287109f, - 0.300049f, 0.312012f, 0.323975f, 0.336182f, 0.348145f, 0.360840f, 0.372803f, 0.385986f, - 0.398438f, 0.411621f, 0.424316f, 0.437256f, 0.450439f, 0.464844f, 0.478027f, 0.490723f, - 0.504395f, 0.518066f, 0.532715f, 0.546387f, 0.561523f, 0.575684f, 0.589355f, 0.604004f, - 0.618164f, 0.632324f, 0.802246f, 0.800293f, 0.792480f, 0.783691f, 0.776367f, 0.769531f, - 0.003265f, 0.009575f, 0.016144f, 0.022415f, 0.029510f, 0.036316f, 0.042755f, 0.050812f, - 0.057556f, 0.065002f, 0.072388f, 0.080200f, 0.087952f, 0.096680f, 0.104858f, 0.113281f, - 0.122070f, 0.130493f, 0.139771f, 0.148926f, 0.158447f, 0.168335f, 0.177612f, 0.187500f, - 0.198120f, 0.208130f, 0.218750f, 0.229492f, 0.240234f, 0.250732f, 0.262207f, 0.273682f, - 0.285156f, 0.296143f, 0.308594f, 0.320068f, 0.332520f, 0.344482f, 0.357178f, 0.368652f, - 0.381836f, 0.394043f, 0.406494f, 0.420410f, 0.433105f, 0.445801f, 0.459717f, 0.473633f, - 0.486816f, 0.500000f, 0.513672f, 0.527832f, 0.541992f, 0.556152f, 0.570312f, 0.585449f, - 0.598633f, 0.613770f, 0.794434f, 0.791504f, 0.784180f, 0.776855f, 0.770020f, 0.764160f, - 0.002954f, 0.008904f, 0.014961f, 0.021210f, 0.027420f, 0.033905f, 0.040619f, 0.047363f, - 0.053986f, 0.060883f, 0.068054f, 0.075378f, 0.082703f, 0.090515f, 0.098022f, 0.105896f, - 0.114319f, 0.122742f, 0.131592f, 0.139771f, 0.149170f, 0.157959f, 0.167480f, 0.177124f, - 0.186768f, 0.196411f, 0.206543f, 0.216919f, 0.227539f, 0.237671f, 0.248413f, 0.259277f, - 0.270264f, 0.281738f, 0.292725f, 0.304443f, 0.315918f, 0.327637f, 0.340576f, 0.352539f, - 0.364746f, 0.377930f, 0.390137f, 0.401855f, 0.415039f, 0.428223f, 0.441406f, 0.454834f, - 0.468506f, 0.481689f, 0.494873f, 0.509277f, 0.523438f, 0.537598f, 0.551758f, 0.565918f, - 0.580078f, 0.594727f, 0.783691f, 0.783203f, 0.776855f, 0.770508f, 0.763672f, 0.757324f, - 0.002836f, 0.008659f, 0.014351f, 0.019913f, 0.025772f, 0.032074f, 0.037933f, 0.044128f, - 0.050903f, 0.057159f, 0.064026f, 0.070496f, 0.077698f, 0.085022f, 0.091919f, 0.099426f, - 0.107727f, 0.114990f, 0.123169f, 0.131226f, 0.140015f, 0.148682f, 0.157349f, 0.166260f, - 0.175171f, 0.184692f, 0.194214f, 0.203979f, 0.214355f, 0.224487f, 0.234985f, 0.245728f, - 0.256104f, 0.267334f, 0.278320f, 0.288818f, 0.301025f, 0.312256f, 0.324219f, 0.335938f, - 0.347900f, 0.360596f, 0.372070f, 0.384521f, 0.397217f, 0.410400f, 0.423340f, 0.436279f, - 0.449463f, 0.463135f, 0.476807f, 0.490723f, 0.503906f, 0.517578f, 0.532227f, 0.546875f, - 0.561035f, 0.575684f, 0.773926f, 0.775391f, 0.769043f, 0.763672f, 0.757812f, 0.751953f, - 0.002506f, 0.008080f, 0.013100f, 0.018738f, 0.024384f, 0.029953f, 0.035797f, 0.041473f, - 0.047485f, 0.053558f, 0.059265f, 0.065918f, 0.072693f, 0.079468f, 0.086426f, 0.093384f, - 0.100708f, 0.108032f, 0.115417f, 0.122986f, 0.130615f, 0.139038f, 0.147827f, 0.156494f, - 0.165039f, 0.173828f, 0.182617f, 0.192139f, 0.201782f, 0.211426f, 0.221558f, 0.231323f, - 0.242188f, 0.252686f, 0.263672f, 0.274414f, 0.284912f, 0.296143f, 0.308105f, 0.319824f, - 0.331543f, 0.343750f, 0.355225f, 0.367432f, 0.379883f, 0.393066f, 0.405273f, 0.418457f, - 0.431641f, 0.444580f, 0.457764f, 0.471924f, 0.485840f, 0.499268f, 0.512695f, 0.527344f, - 0.542480f, 0.556641f, 0.764160f, 0.766602f, 0.761719f, 0.756348f, 0.750488f, 0.745605f, - 0.002640f, 0.007809f, 0.012497f, 0.017593f, 0.023102f, 0.028122f, 0.033569f, 0.038879f, - 0.044250f, 0.049988f, 0.055908f, 0.061615f, 0.067627f, 0.074036f, 0.080566f, 0.087524f, - 0.093262f, 0.100769f, 0.107910f, 0.114929f, 0.121948f, 0.130371f, 0.137939f, 0.146362f, - 0.154297f, 0.163208f, 0.171509f, 0.180664f, 0.189697f, 0.199341f, 0.208618f, 0.218506f, - 0.228394f, 0.238892f, 0.248779f, 0.259277f, 0.270752f, 0.281250f, 0.292236f, 0.303467f, - 0.315186f, 0.326660f, 0.338867f, 0.351074f, 0.362305f, 0.374756f, 0.387939f, 0.400146f, - 0.413330f, 0.426514f, 0.439209f, 0.452881f, 0.466553f, 0.480225f, 0.494141f, 0.508301f, - 0.522949f, 0.537109f, 0.753906f, 0.758301f, 0.754395f, 0.749023f, 0.743652f, 0.739258f, - 0.002441f, 0.007088f, 0.011993f, 0.016266f, 0.021255f, 0.026031f, 0.031189f, 0.036072f, - 0.041260f, 0.046753f, 0.052155f, 0.057587f, 0.063232f, 0.068787f, 0.075623f, 0.081055f, - 0.087341f, 0.094177f, 0.100647f, 0.106689f, 0.113892f, 0.121399f, 0.129028f, 0.136841f, - 0.144287f, 0.152222f, 0.160522f, 0.169312f, 0.178101f, 0.186523f, 0.196045f, 0.205200f, - 0.214966f, 0.224487f, 0.234863f, 0.244751f, 0.255371f, 0.265625f, 0.276367f, 0.287842f, - 0.298828f, 0.310303f, 0.321533f, 0.333984f, 0.345459f, 0.357666f, 0.370117f, 0.382568f, - 0.394287f, 0.407959f, 0.421875f, 0.433838f, 0.446777f, 0.461426f, 0.475098f, 0.488525f, - 0.504395f, 0.517578f, 0.744141f, 0.749512f, 0.746094f, 0.741699f, 0.736816f, 0.732422f, - 0.002172f, 0.006695f, 0.011093f, 0.015266f, 0.020081f, 0.024521f, 0.029388f, 0.033966f, - 0.038727f, 0.043427f, 0.048706f, 0.053772f, 0.059418f, 0.064270f, 0.069580f, 0.075500f, - 0.081421f, 0.087280f, 0.093262f, 0.099670f, 0.106567f, 0.113220f, 0.119995f, 0.127197f, - 0.134644f, 0.142212f, 0.150146f, 0.157959f, 0.166382f, 0.174927f, 0.184082f, 0.192505f, - 0.201904f, 0.211792f, 0.220825f, 0.230713f, 0.240601f, 0.251221f, 0.261719f, 0.272461f, - 0.282715f, 0.294434f, 0.305420f, 0.316650f, 0.328369f, 0.340088f, 0.352783f, 0.364746f, - 0.377197f, 0.389648f, 0.402832f, 0.416016f, 0.429443f, 0.442627f, 0.456055f, 0.469971f, - 0.484863f, 0.499268f, 0.733887f, 0.741211f, 0.737793f, 0.734375f, 0.729980f, 0.725586f, - 0.002045f, 0.006187f, 0.010406f, 0.014664f, 0.018570f, 0.022675f, 0.027176f, 0.031586f, - 0.035858f, 0.040253f, 0.045227f, 0.049774f, 0.054504f, 0.059692f, 0.065186f, 0.070374f, - 0.075500f, 0.080627f, 0.086792f, 0.092285f, 0.098999f, 0.104675f, 0.111816f, 0.118286f, - 0.125610f, 0.132324f, 0.139771f, 0.147339f, 0.155029f, 0.163696f, 0.171631f, 0.180420f, - 0.189087f, 0.197754f, 0.207275f, 0.216309f, 0.226440f, 0.236694f, 0.246338f, 0.256836f, - 0.267334f, 0.278320f, 0.289062f, 0.300537f, 0.312012f, 0.323975f, 0.335449f, 0.347168f, - 0.359375f, 0.372314f, 0.384521f, 0.396973f, 0.410400f, 0.423584f, 0.437500f, 0.450928f, - 0.465332f, 0.479736f, 0.723145f, 0.732422f, 0.729980f, 0.726562f, 0.722656f, 0.718750f, - 0.002148f, 0.005802f, 0.009811f, 0.013565f, 0.017578f, 0.021179f, 0.025040f, 0.029053f, - 0.033417f, 0.037445f, 0.042114f, 0.046112f, 0.050720f, 0.055511f, 0.060028f, 0.065002f, - 0.069458f, 0.075134f, 0.080078f, 0.085693f, 0.091492f, 0.097290f, 0.103394f, 0.109802f, - 0.116089f, 0.122925f, 0.129883f, 0.136963f, 0.144165f, 0.151733f, 0.160156f, 0.167847f, - 0.176392f, 0.184692f, 0.193848f, 0.203003f, 0.212402f, 0.221680f, 0.231689f, 0.242065f, - 0.251953f, 0.262207f, 0.273193f, 0.283936f, 0.295410f, 0.306152f, 0.318359f, 0.329590f, - 0.342285f, 0.354248f, 0.366455f, 0.379150f, 0.391846f, 0.405273f, 0.418701f, 0.432617f, - 0.446289f, 0.460205f, 0.712891f, 0.723633f, 0.722168f, 0.718750f, 0.715332f, 0.712402f, - 0.001963f, 0.005642f, 0.009071f, 0.012756f, 0.016006f, 0.020020f, 0.023422f, 0.027679f, - 0.030762f, 0.034943f, 0.038605f, 0.042969f, 0.047028f, 0.051178f, 0.055542f, 0.060120f, - 0.064575f, 0.069153f, 0.074280f, 0.079041f, 0.084595f, 0.089905f, 0.095276f, 0.101440f, - 0.107300f, 0.113586f, 0.119751f, 0.127075f, 0.134033f, 0.141357f, 0.148438f, 0.155884f, - 0.164062f, 0.172729f, 0.180542f, 0.190063f, 0.198364f, 0.207764f, 0.217163f, 0.226807f, - 0.236938f, 0.247070f, 0.257324f, 0.268066f, 0.278320f, 0.289795f, 0.301025f, 0.312744f, - 0.324707f, 0.336182f, 0.347900f, 0.360840f, 0.372803f, 0.386230f, 0.399902f, 0.413574f, - 0.427246f, 0.441162f, 0.702148f, 0.714355f, 0.713867f, 0.711426f, 0.707520f, 0.704590f, - 0.001995f, 0.005245f, 0.008553f, 0.011543f, 0.015015f, 0.018326f, 0.021881f, 0.025131f, - 0.028641f, 0.032349f, 0.035675f, 0.039520f, 0.043549f, 0.047089f, 0.051086f, 0.054962f, - 0.059265f, 0.063782f, 0.068054f, 0.072571f, 0.077759f, 0.082520f, 0.088013f, 0.093323f, - 0.098755f, 0.104858f, 0.111145f, 0.117371f, 0.123840f, 0.130615f, 0.137207f, 0.144897f, - 0.152344f, 0.160278f, 0.167969f, 0.176514f, 0.185425f, 0.193848f, 0.202881f, 0.212524f, - 0.221924f, 0.231323f, 0.241821f, 0.251953f, 0.262451f, 0.272949f, 0.284424f, 0.295166f, - 0.306396f, 0.319092f, 0.329590f, 0.343018f, 0.355225f, 0.368652f, 0.381348f, 0.393799f, - 0.408447f, 0.422852f, 0.691406f, 0.706055f, 0.706055f, 0.703125f, 0.700684f, 0.697754f, - 0.001692f, 0.004898f, 0.007828f, 0.011070f, 0.013992f, 0.017227f, 0.020187f, 0.023499f, - 0.026520f, 0.029526f, 0.033081f, 0.036377f, 0.039459f, 0.043396f, 0.047028f, 0.050323f, - 0.054199f, 0.058350f, 0.062317f, 0.066711f, 0.071106f, 0.075928f, 0.080750f, 0.085510f, - 0.090820f, 0.096497f, 0.102234f, 0.107727f, 0.114075f, 0.120300f, 0.126587f, 0.133789f, - 0.141113f, 0.148193f, 0.156006f, 0.163696f, 0.171753f, 0.180542f, 0.188965f, 0.198120f, - 0.207275f, 0.216797f, 0.226318f, 0.236206f, 0.246338f, 0.256836f, 0.267334f, 0.278809f, - 0.289795f, 0.300781f, 0.313232f, 0.324707f, 0.337402f, 0.349365f, 0.362305f, 0.376221f, - 0.389404f, 0.403809f, 0.680176f, 0.696289f, 0.697266f, 0.695312f, 0.692871f, 0.689941f, - 0.001606f, 0.004543f, 0.007450f, 0.010269f, 0.012962f, 0.015900f, 0.018677f, 0.021591f, - 0.024628f, 0.027618f, 0.030182f, 0.033783f, 0.036194f, 0.039734f, 0.042725f, 0.046478f, - 0.049652f, 0.053253f, 0.057251f, 0.060883f, 0.065186f, 0.069336f, 0.073730f, 0.078247f, - 0.083252f, 0.088501f, 0.093628f, 0.099182f, 0.104553f, 0.110718f, 0.116577f, 0.123108f, - 0.129883f, 0.136719f, 0.143921f, 0.151367f, 0.159302f, 0.167114f, 0.175415f, 0.183960f, - 0.192871f, 0.202148f, 0.210938f, 0.221436f, 0.230713f, 0.240723f, 0.250977f, 0.261963f, - 0.272461f, 0.283691f, 0.295166f, 0.306885f, 0.319092f, 0.331055f, 0.343750f, 0.356689f, - 0.370361f, 0.383545f, 0.669434f, 0.687500f, 0.688965f, 0.687500f, 0.685547f, 0.682617f, - 0.001701f, 0.004345f, 0.006802f, 0.009514f, 0.012283f, 0.014793f, 0.017288f, 0.019958f, - 0.022614f, 0.025177f, 0.027695f, 0.030487f, 0.033081f, 0.035858f, 0.039185f, 0.042236f, - 0.045319f, 0.048523f, 0.051941f, 0.055847f, 0.059326f, 0.063171f, 0.067139f, 0.071594f, - 0.075928f, 0.080566f, 0.085571f, 0.090454f, 0.095520f, 0.101196f, 0.106567f, 0.112427f, - 0.119019f, 0.125610f, 0.132324f, 0.139282f, 0.146973f, 0.154419f, 0.161987f, 0.170532f, - 0.178833f, 0.187134f, 0.196777f, 0.206177f, 0.214966f, 0.225220f, 0.235352f, 0.246094f, - 0.255615f, 0.266846f, 0.278320f, 0.290039f, 0.301270f, 0.313477f, 0.325195f, 0.338867f, - 0.352539f, 0.365234f, 0.657715f, 0.678711f, 0.679688f, 0.679199f, 0.677734f, 0.675293f, - 0.001310f, 0.003979f, 0.006393f, 0.008522f, 0.011223f, 0.013557f, 0.015976f, 0.018433f, - 0.020737f, 0.022842f, 0.025421f, 0.027649f, 0.030289f, 0.032806f, 0.035645f, 0.038025f, - 0.041199f, 0.044220f, 0.047058f, 0.050720f, 0.053589f, 0.057281f, 0.061157f, 0.064941f, - 0.068787f, 0.072998f, 0.077698f, 0.082153f, 0.086975f, 0.092102f, 0.097229f, 0.103027f, - 0.108826f, 0.114746f, 0.121094f, 0.127930f, 0.134521f, 0.141846f, 0.149292f, 0.157227f, - 0.164673f, 0.173218f, 0.182007f, 0.190552f, 0.199951f, 0.209717f, 0.219360f, 0.229004f, - 0.239502f, 0.250244f, 0.260986f, 0.272461f, 0.282959f, 0.295166f, 0.307373f, 0.320557f, - 0.333252f, 0.346436f, 0.646973f, 0.668945f, 0.670898f, 0.671387f, 0.669922f, 0.668457f, - 0.001348f, 0.003523f, 0.005863f, 0.008133f, 0.010338f, 0.012520f, 0.014511f, 0.016464f, - 0.018768f, 0.020920f, 0.022888f, 0.025665f, 0.027588f, 0.029861f, 0.032135f, 0.034485f, - 0.037140f, 0.040039f, 0.042725f, 0.045532f, 0.048859f, 0.051971f, 0.055237f, 0.058594f, - 0.062408f, 0.066101f, 0.070251f, 0.074280f, 0.078735f, 0.083435f, 0.088318f, 0.093567f, - 0.098633f, 0.104431f, 0.110291f, 0.116455f, 0.122986f, 0.129517f, 0.136963f, 0.143921f, - 0.152222f, 0.159546f, 0.167358f, 0.176514f, 0.185181f, 0.194214f, 0.203857f, 0.213623f, - 0.223389f, 0.233521f, 0.244385f, 0.255127f, 0.266602f, 0.277832f, 0.289307f, 0.301758f, - 0.314697f, 0.328613f, 0.635254f, 0.659668f, 0.663086f, 0.663086f, 0.662109f, 0.660156f, - 0.001084f, 0.003263f, 0.005554f, 0.007416f, 0.009445f, 0.011185f, 0.013161f, 0.015366f, - 0.017136f, 0.019058f, 0.020935f, 0.022781f, 0.024857f, 0.026886f, 0.029160f, 0.031097f, - 0.033569f, 0.035858f, 0.038361f, 0.040924f, 0.043427f, 0.046478f, 0.049500f, 0.052948f, - 0.056122f, 0.059418f, 0.063293f, 0.067139f, 0.070923f, 0.075073f, 0.079712f, 0.084229f, - 0.089233f, 0.094604f, 0.100037f, 0.105774f, 0.111694f, 0.117798f, 0.124634f, 0.131226f, - 0.139038f, 0.146484f, 0.154175f, 0.162231f, 0.170654f, 0.179199f, 0.188599f, 0.197754f, - 0.207153f, 0.217407f, 0.227295f, 0.238159f, 0.248657f, 0.260986f, 0.271973f, 0.284912f, - 0.296631f, 0.308838f, 0.623535f, 0.650391f, 0.653809f, 0.654297f, 0.653809f, 0.652832f, - 0.001070f, 0.003069f, 0.005108f, 0.006855f, 0.008522f, 0.010384f, 0.011993f, 0.013847f, - 0.015549f, 0.016968f, 0.018677f, 0.020660f, 0.022079f, 0.024048f, 0.026077f, 0.027954f, - 0.030014f, 0.032135f, 0.034210f, 0.036560f, 0.038971f, 0.041840f, 0.044434f, 0.047089f, - 0.049896f, 0.053284f, 0.056763f, 0.060120f, 0.063477f, 0.067505f, 0.071533f, 0.075928f, - 0.080261f, 0.085205f, 0.089905f, 0.095520f, 0.100830f, 0.106567f, 0.113159f, 0.119385f, - 0.126221f, 0.133301f, 0.140259f, 0.148560f, 0.156494f, 0.165039f, 0.173462f, 0.182861f, - 0.192017f, 0.201172f, 0.211548f, 0.221802f, 0.232666f, 0.243286f, 0.254639f, 0.265869f, - 0.278809f, 0.291260f, 0.611816f, 0.640625f, 0.645508f, 0.645996f, 0.645508f, 0.645020f, - 0.001057f, 0.002815f, 0.004646f, 0.006187f, 0.007935f, 0.009583f, 0.011139f, 0.012428f, - 0.013878f, 0.015404f, 0.016830f, 0.018433f, 0.019836f, 0.021637f, 0.023300f, 0.024857f, - 0.026855f, 0.028519f, 0.030533f, 0.032593f, 0.034790f, 0.037140f, 0.039520f, 0.041748f, - 0.044525f, 0.047302f, 0.050232f, 0.053497f, 0.056580f, 0.059998f, 0.063721f, 0.067627f, - 0.071777f, 0.076111f, 0.080627f, 0.085571f, 0.090698f, 0.096130f, 0.101624f, 0.107849f, - 0.114258f, 0.120544f, 0.127686f, 0.135132f, 0.142700f, 0.150269f, 0.158813f, 0.167725f, - 0.176392f, 0.185791f, 0.195312f, 0.205444f, 0.216064f, 0.226562f, 0.237793f, 0.248657f, - 0.260254f, 0.272949f, 0.600098f, 0.631348f, 0.636230f, 0.637207f, 0.637695f, 0.636719f, - 0.001022f, 0.002628f, 0.004486f, 0.005684f, 0.007179f, 0.008636f, 0.009911f, 0.011307f, - 0.012428f, 0.013771f, 0.015152f, 0.016342f, 0.017822f, 0.018997f, 0.020584f, 0.022263f, - 0.023651f, 0.025482f, 0.027191f, 0.028793f, 0.030960f, 0.032715f, 0.034912f, 0.036987f, - 0.039368f, 0.041840f, 0.044495f, 0.047180f, 0.050110f, 0.053314f, 0.056580f, 0.060059f, - 0.063660f, 0.067383f, 0.071777f, 0.075928f, 0.081055f, 0.085938f, 0.091187f, 0.096619f, - 0.102356f, 0.108826f, 0.115051f, 0.121948f, 0.129150f, 0.136475f, 0.144653f, 0.152832f, - 0.161621f, 0.170288f, 0.179932f, 0.189209f, 0.198730f, 0.209595f, 0.220459f, 0.231201f, - 0.242798f, 0.255615f, 0.588867f, 0.621094f, 0.626953f, 0.629883f, 0.629395f, 0.629883f, - 0.001016f, 0.002304f, 0.003975f, 0.005024f, 0.006584f, 0.007812f, 0.008926f, 0.009987f, - 0.011024f, 0.012199f, 0.013321f, 0.014595f, 0.015617f, 0.016830f, 0.018326f, 0.019577f, - 0.020798f, 0.022293f, 0.023758f, 0.025253f, 0.027145f, 0.028656f, 0.030640f, 0.032501f, - 0.034546f, 0.036682f, 0.039001f, 0.041412f, 0.044037f, 0.046875f, 0.049622f, 0.052917f, - 0.056030f, 0.059387f, 0.063354f, 0.067383f, 0.071655f, 0.075928f, 0.080750f, 0.085876f, - 0.091248f, 0.097168f, 0.102905f, 0.109497f, 0.116272f, 0.123413f, 0.130859f, 0.138550f, - 0.147217f, 0.155518f, 0.164551f, 0.173828f, 0.183350f, 0.193481f, 0.204102f, 0.214600f, - 0.225342f, 0.237915f, 0.575684f, 0.611816f, 0.617188f, 0.621094f, 0.621582f, 0.620605f, - 0.000768f, 0.002398f, 0.003801f, 0.004875f, 0.005848f, 0.006889f, 0.008072f, 0.008820f, - 0.009758f, 0.010910f, 0.011810f, 0.013023f, 0.013878f, 0.014786f, 0.016083f, 0.017166f, - 0.018402f, 0.019577f, 0.020691f, 0.022125f, 0.023743f, 0.025009f, 0.026779f, 0.028336f, - 0.030075f, 0.031921f, 0.033997f, 0.036255f, 0.038452f, 0.040833f, 0.043488f, 0.045959f, - 0.049011f, 0.052216f, 0.055634f, 0.059052f, 0.062744f, 0.066956f, 0.071289f, 0.075745f, - 0.080566f, 0.086060f, 0.091614f, 0.097351f, 0.103821f, 0.110291f, 0.117432f, 0.124939f, - 0.132568f, 0.140869f, 0.149414f, 0.158325f, 0.168213f, 0.177368f, 0.187744f, 0.197876f, - 0.208984f, 0.219849f, 0.563965f, 0.602051f, 0.608887f, 0.610840f, 0.613770f, 0.612305f, - 0.000764f, 0.002028f, 0.003302f, 0.004276f, 0.005325f, 0.006035f, 0.007034f, 0.007843f, - 0.008904f, 0.009628f, 0.010323f, 0.011192f, 0.012039f, 0.013092f, 0.013924f, 0.014854f, - 0.015793f, 0.016953f, 0.018036f, 0.019211f, 0.020355f, 0.021667f, 0.023010f, 0.024582f, - 0.026016f, 0.027771f, 0.029434f, 0.031235f, 0.033264f, 0.035217f, 0.037628f, 0.039886f, - 0.042084f, 0.044952f, 0.048126f, 0.051392f, 0.054779f, 0.058197f, 0.062164f, 0.066223f, - 0.070740f, 0.075439f, 0.080566f, 0.086182f, 0.091919f, 0.098145f, 0.104431f, 0.111633f, - 0.119080f, 0.126587f, 0.134888f, 0.143311f, 0.152710f, 0.162109f, 0.171631f, 0.182129f, - 0.192139f, 0.203491f, 0.552246f, 0.591309f, 0.599609f, 0.602539f, 0.604004f, 0.604980f, - 0.000782f, 0.001970f, 0.003082f, 0.003859f, 0.004635f, 0.005611f, 0.006123f, 0.006767f, - 0.007595f, 0.008270f, 0.009140f, 0.009674f, 0.010490f, 0.011040f, 0.011902f, 0.012749f, - 0.013573f, 0.014526f, 0.015656f, 0.016541f, 0.017548f, 0.018631f, 0.019730f, 0.021103f, - 0.022446f, 0.023758f, 0.025162f, 0.026611f, 0.028458f, 0.030441f, 0.032074f, 0.034302f, - 0.036316f, 0.038727f, 0.041138f, 0.044098f, 0.046997f, 0.050232f, 0.053711f, 0.057281f, - 0.061340f, 0.065491f, 0.070435f, 0.075256f, 0.080688f, 0.086426f, 0.092346f, 0.098694f, - 0.105896f, 0.113098f, 0.120911f, 0.129028f, 0.137695f, 0.146606f, 0.155884f, 0.165894f, - 0.175903f, 0.186768f, 0.540527f, 0.582520f, 0.590332f, 0.593750f, 0.594727f, 0.596191f, - 0.000711f, 0.001649f, 0.002529f, 0.003332f, 0.004036f, 0.004799f, 0.005444f, 0.006050f, - 0.006638f, 0.007160f, 0.007771f, 0.008331f, 0.008980f, 0.009644f, 0.010307f, 0.010887f, - 0.011787f, 0.012306f, 0.013176f, 0.014099f, 0.014915f, 0.015839f, 0.016708f, 0.017822f, - 0.019073f, 0.020233f, 0.021423f, 0.022690f, 0.024033f, 0.025589f, 0.027344f, 0.028976f, - 0.030930f, 0.032990f, 0.035156f, 0.037445f, 0.040131f, 0.042847f, 0.045776f, 0.049042f, - 0.052551f, 0.056519f, 0.060486f, 0.064941f, 0.069458f, 0.074951f, 0.080444f, 0.086487f, - 0.092957f, 0.099915f, 0.107361f, 0.114929f, 0.123535f, 0.131714f, 0.140747f, 0.150513f, - 0.160767f, 0.171265f, 0.527832f, 0.572754f, 0.581543f, 0.583496f, 0.586426f, 0.587402f, - 0.000504f, 0.001575f, 0.002235f, 0.003147f, 0.003641f, 0.004150f, 0.004570f, 0.005173f, - 0.005863f, 0.006016f, 0.006462f, 0.007111f, 0.007660f, 0.008156f, 0.008736f, 0.009354f, - 0.010094f, 0.010475f, 0.011253f, 0.011879f, 0.012657f, 0.013603f, 0.014267f, 0.015099f, - 0.016144f, 0.017014f, 0.017990f, 0.019104f, 0.020416f, 0.021652f, 0.022919f, 0.024353f, - 0.025986f, 0.027710f, 0.029602f, 0.031494f, 0.033722f, 0.036102f, 0.038635f, 0.041412f, - 0.044525f, 0.047729f, 0.051636f, 0.055511f, 0.059540f, 0.064331f, 0.069580f, 0.075073f, - 0.080750f, 0.087341f, 0.094116f, 0.101379f, 0.109558f, 0.117676f, 0.126221f, 0.135376f, - 0.145874f, 0.155518f, 0.516113f, 0.562012f, 0.571777f, 0.576172f, 0.578125f, 0.579102f, - 0.000445f, 0.001304f, 0.002201f, 0.002535f, 0.003126f, 0.003664f, 0.004047f, 0.004463f, - 0.004887f, 0.005234f, 0.005711f, 0.005997f, 0.006500f, 0.006901f, 0.007389f, 0.007904f, - 0.008293f, 0.008919f, 0.009499f, 0.009941f, 0.010635f, 0.011269f, 0.011948f, 0.012589f, - 0.013435f, 0.014252f, 0.015091f, 0.016052f, 0.017059f, 0.017960f, 0.019241f, 0.020264f, - 0.021667f, 0.022995f, 0.024628f, 0.026230f, 0.027985f, 0.029984f, 0.032288f, 0.034515f, - 0.037140f, 0.040009f, 0.043152f, 0.046722f, 0.050354f, 0.054504f, 0.059143f, 0.064026f, - 0.069458f, 0.075256f, 0.081726f, 0.088562f, 0.095825f, 0.103516f, 0.112000f, 0.120850f, - 0.130005f, 0.140381f, 0.502441f, 0.551758f, 0.562012f, 0.566406f, 0.568848f, 0.571289f, - 0.000396f, 0.001226f, 0.001812f, 0.002357f, 0.002796f, 0.003094f, 0.003328f, 0.003763f, - 0.003979f, 0.004364f, 0.004642f, 0.005051f, 0.005489f, 0.005745f, 0.006126f, 0.006611f, - 0.007004f, 0.007473f, 0.007771f, 0.008293f, 0.008919f, 0.009392f, 0.009941f, 0.010483f, - 0.011169f, 0.011765f, 0.012436f, 0.013344f, 0.014030f, 0.014908f, 0.015778f, 0.016769f, - 0.017838f, 0.018997f, 0.020279f, 0.021622f, 0.023056f, 0.024704f, 0.026474f, 0.028580f, - 0.030579f, 0.033051f, 0.035706f, 0.038605f, 0.041840f, 0.045380f, 0.049500f, 0.053986f, - 0.058685f, 0.063843f, 0.069885f, 0.076050f, 0.083191f, 0.090576f, 0.098511f, 0.107056f, - 0.115479f, 0.125122f, 0.491211f, 0.541504f, 0.552734f, 0.557617f, 0.560547f, 0.562012f, - 0.000559f, 0.001152f, 0.001668f, 0.001955f, 0.002234f, 0.002550f, 0.002821f, 0.003057f, - 0.003296f, 0.003635f, 0.003948f, 0.004189f, 0.004448f, 0.004761f, 0.005077f, 0.005417f, - 0.005699f, 0.006142f, 0.006458f, 0.006844f, 0.007271f, 0.007717f, 0.008156f, 0.008675f, - 0.009132f, 0.009590f, 0.010277f, 0.010864f, 0.011482f, 0.012131f, 0.012901f, 0.013741f, - 0.014595f, 0.015549f, 0.016525f, 0.017563f, 0.018799f, 0.020111f, 0.021484f, 0.023087f, - 0.024765f, 0.026840f, 0.028992f, 0.031403f, 0.034119f, 0.037323f, 0.040680f, 0.044464f, - 0.048584f, 0.053345f, 0.058838f, 0.064514f, 0.071045f, 0.078247f, 0.085571f, 0.093567f, - 0.101685f, 0.111023f, 0.477539f, 0.531738f, 0.542969f, 0.548340f, 0.552246f, 0.553711f, - 0.000459f, 0.000939f, 0.001184f, 0.001600f, 0.001761f, 0.002144f, 0.002258f, 0.002546f, - 0.002708f, 0.002922f, 0.003157f, 0.003414f, 0.003588f, 0.003918f, 0.004154f, 0.004387f, - 0.004662f, 0.004993f, 0.005249f, 0.005566f, 0.005867f, 0.006252f, 0.006573f, 0.007061f, - 0.007408f, 0.007858f, 0.008270f, 0.008713f, 0.009361f, 0.009911f, 0.010513f, 0.011047f, - 0.011841f, 0.012566f, 0.013252f, 0.014175f, 0.015182f, 0.016220f, 0.017258f, 0.018524f, - 0.019882f, 0.021454f, 0.023132f, 0.025146f, 0.027405f, 0.029877f, 0.032745f, 0.035919f, - 0.039642f, 0.043823f, 0.048492f, 0.053619f, 0.059235f, 0.065735f, 0.072693f, 0.080383f, - 0.088867f, 0.097412f, 0.466309f, 0.520508f, 0.533691f, 0.539062f, 0.542480f, 0.543945f, - 0.000369f, 0.000915f, 0.001124f, 0.001297f, 0.001534f, 0.001741f, 0.001833f, 0.002111f, - 0.002272f, 0.002369f, 0.002516f, 0.002766f, 0.002920f, 0.003162f, 0.003317f, 0.003551f, - 0.003723f, 0.003941f, 0.004211f, 0.004425f, 0.004757f, 0.004993f, 0.005306f, 0.005581f, - 0.005859f, 0.006203f, 0.006592f, 0.007015f, 0.007450f, 0.007828f, 0.008377f, 0.008797f, - 0.009361f, 0.009895f, 0.010582f, 0.011322f, 0.012016f, 0.012772f, 0.013687f, 0.014748f, - 0.015778f, 0.016907f, 0.018326f, 0.019821f, 0.021622f, 0.023483f, 0.025742f, 0.028473f, - 0.031525f, 0.034943f, 0.038910f, 0.043457f, 0.048645f, 0.054749f, 0.061279f, 0.068420f, - 0.076111f, 0.084778f, 0.453613f, 0.510742f, 0.523926f, 0.529785f, 0.533203f, 0.536133f, - 0.000186f, 0.000582f, 0.000925f, 0.001026f, 0.001228f, 0.001351f, 0.001470f, 0.001606f, - 0.001765f, 0.001908f, 0.001999f, 0.002104f, 0.002281f, 0.002476f, 0.002659f, 0.002766f, - 0.002911f, 0.003040f, 0.003344f, 0.003475f, 0.003683f, 0.003922f, 0.004185f, 0.004417f, - 0.004673f, 0.004890f, 0.005123f, 0.005440f, 0.005817f, 0.006126f, 0.006481f, 0.006859f, - 0.007275f, 0.007740f, 0.008202f, 0.008728f, 0.009315f, 0.009972f, 0.010597f, 0.011391f, - 0.012268f, 0.013252f, 0.014221f, 0.015388f, 0.016724f, 0.018265f, 0.020004f, 0.022049f, - 0.024445f, 0.027206f, 0.030762f, 0.034424f, 0.038971f, 0.044220f, 0.050262f, 0.056976f, - 0.064575f, 0.072083f, 0.441650f, 0.500488f, 0.514160f, 0.520020f, 0.524414f, 0.526855f, - 0.000194f, 0.000467f, 0.000775f, 0.000911f, 0.000994f, 0.001081f, 0.001221f, 0.001204f, - 0.001368f, 0.001479f, 0.001582f, 0.001707f, 0.001801f, 0.001921f, 0.001993f, 0.002146f, - 0.002245f, 0.002398f, 0.002531f, 0.002674f, 0.002871f, 0.003033f, 0.003172f, 0.003374f, - 0.003519f, 0.003742f, 0.003963f, 0.004158f, 0.004448f, 0.004650f, 0.005032f, 0.005230f, - 0.005550f, 0.005932f, 0.006241f, 0.006634f, 0.007088f, 0.007572f, 0.008110f, 0.008636f, - 0.009323f, 0.010071f, 0.010834f, 0.011757f, 0.012779f, 0.013863f, 0.015190f, 0.016769f, - 0.018555f, 0.020706f, 0.023331f, 0.026352f, 0.030182f, 0.034760f, 0.040039f, 0.046356f, - 0.053406f, 0.060638f, 0.427979f, 0.489502f, 0.504883f, 0.511719f, 0.515137f, 0.518066f, - 0.000339f, 0.000388f, 0.000559f, 0.000617f, 0.000667f, 0.000795f, 0.000853f, 0.000938f, - 0.000972f, 0.001079f, 0.001217f, 0.001274f, 0.001369f, 0.001480f, 0.001536f, 0.001581f, - 0.001711f, 0.001804f, 0.001900f, 0.002047f, 0.002129f, 0.002245f, 0.002394f, 0.002493f, - 0.002645f, 0.002773f, 0.002974f, 0.003124f, 0.003307f, 0.003559f, 0.003757f, 0.003893f, - 0.004169f, 0.004353f, 0.004684f, 0.004963f, 0.005272f, 0.005615f, 0.005981f, 0.006420f, - 0.006878f, 0.007378f, 0.008080f, 0.008682f, 0.009438f, 0.010239f, 0.011299f, 0.012459f, - 0.013809f, 0.015305f, 0.017212f, 0.019501f, 0.022583f, 0.026245f, 0.030838f, 0.036255f, - 0.042938f, 0.049988f, 0.416504f, 0.479492f, 0.495361f, 0.501465f, 0.505859f, 0.508789f, - 0.000148f, 0.000349f, 0.000414f, 0.000480f, 0.000554f, 0.000575f, 0.000675f, 0.000641f, - 0.000743f, 0.000809f, 0.000882f, 0.000919f, 0.000967f, 0.001019f, 0.001122f, 0.001156f, - 0.001264f, 0.001322f, 0.001392f, 0.001431f, 0.001529f, 0.001625f, 0.001735f, 0.001802f, - 0.001912f, 0.002007f, 0.002131f, 0.002237f, 0.002338f, 0.002525f, 0.002638f, 0.002850f, - 0.002962f, 0.003130f, 0.003347f, 0.003536f, 0.003784f, 0.004063f, 0.004364f, 0.004623f, - 0.004929f, 0.005314f, 0.005714f, 0.006191f, 0.006760f, 0.007385f, 0.008080f, 0.008919f, - 0.009933f, 0.011078f, 0.012390f, 0.014130f, 0.016251f, 0.019012f, 0.022720f, 0.027496f, - 0.033234f, 0.040192f, 0.403320f, 0.468994f, 0.485352f, 0.491943f, 0.497070f, 0.500000f, - 0.000093f, 0.000191f, 0.000299f, 0.000284f, 0.000367f, 0.000453f, 0.000420f, 0.000467f, - 0.000519f, 0.000611f, 0.000607f, 0.000626f, 0.000647f, 0.000722f, 0.000741f, 0.000815f, - 0.000829f, 0.000910f, 0.000967f, 0.001023f, 0.001076f, 0.001138f, 0.001197f, 0.001260f, - 0.001334f, 0.001393f, 0.001490f, 0.001562f, 0.001633f, 0.001772f, 0.001831f, 0.001949f, - 0.002056f, 0.002167f, 0.002312f, 0.002472f, 0.002607f, 0.002781f, 0.002972f, 0.003145f, - 0.003387f, 0.003647f, 0.003941f, 0.004253f, 0.004604f, 0.005051f, 0.005558f, 0.006165f, - 0.006836f, 0.007660f, 0.008652f, 0.009796f, 0.011284f, 0.013260f, 0.015945f, 0.019608f, - 0.024734f, 0.031082f, 0.390625f, 0.459229f, 0.475586f, 0.482910f, 0.488037f, 0.490723f, - 0.000132f, 0.000208f, 0.000217f, 0.000221f, 0.000267f, 0.000272f, 0.000277f, 0.000320f, - 0.000356f, 0.000372f, 0.000372f, 0.000446f, 0.000436f, 0.000487f, 0.000514f, 0.000531f, - 0.000587f, 0.000601f, 0.000629f, 0.000658f, 0.000707f, 0.000736f, 0.000784f, 0.000816f, - 0.000880f, 0.000909f, 0.000978f, 0.001035f, 0.001084f, 0.001135f, 0.001200f, 0.001278f, - 0.001357f, 0.001429f, 0.001516f, 0.001588f, 0.001724f, 0.001802f, 0.001949f, 0.002085f, - 0.002230f, 0.002373f, 0.002554f, 0.002743f, 0.003000f, 0.003300f, 0.003611f, 0.003963f, - 0.004425f, 0.004967f, 0.005630f, 0.006424f, 0.007462f, 0.008812f, 0.010551f, 0.013184f, - 0.017258f, 0.022980f, 0.377686f, 0.448242f, 0.465820f, 0.474121f, 0.478760f, 0.481934f, - 0.000041f, 0.000149f, 0.000126f, 0.000128f, 0.000158f, 0.000196f, 0.000174f, 0.000206f, - 0.000216f, 0.000223f, 0.000231f, 0.000244f, 0.000276f, 0.000291f, 0.000312f, 0.000326f, - 0.000338f, 0.000374f, 0.000387f, 0.000423f, 0.000430f, 0.000447f, 0.000471f, 0.000509f, - 0.000538f, 0.000583f, 0.000591f, 0.000613f, 0.000659f, 0.000688f, 0.000743f, 0.000779f, - 0.000833f, 0.000865f, 0.000924f, 0.000966f, 0.001033f, 0.001106f, 0.001186f, 0.001245f, - 0.001336f, 0.001453f, 0.001559f, 0.001685f, 0.001807f, 0.001980f, 0.002207f, 0.002417f, - 0.002689f, 0.003027f, 0.003418f, 0.003933f, 0.004604f, 0.005482f, 0.006641f, 0.008263f, - 0.011017f, 0.015778f, 0.364746f, 0.437256f, 0.456055f, 0.463623f, 0.469238f, 0.472656f, - 0.000100f, 0.000089f, 0.000085f, 0.000081f, 0.000101f, 0.000096f, 0.000116f, 0.000116f, - 0.000119f, 0.000126f, 0.000141f, 0.000157f, 0.000149f, 0.000158f, 0.000179f, 0.000176f, - 0.000195f, 0.000206f, 0.000216f, 0.000222f, 0.000240f, 0.000246f, 0.000269f, 0.000279f, - 0.000303f, 0.000320f, 0.000333f, 0.000345f, 0.000365f, 0.000379f, 0.000409f, 0.000434f, - 0.000453f, 0.000477f, 0.000511f, 0.000541f, 0.000569f, 0.000608f, 0.000656f, 0.000689f, - 0.000738f, 0.000795f, 0.000867f, 0.000918f, 0.001005f, 0.001087f, 0.001189f, 0.001312f, - 0.001465f, 0.001656f, 0.001873f, 0.002171f, 0.002546f, 0.003056f, 0.003767f, 0.004765f, - 0.006390f, 0.009811f, 0.353516f, 0.426758f, 0.446045f, 0.455078f, 0.459717f, 0.464111f, - 0.000084f, 0.000059f, 0.000050f, 0.000049f, 0.000049f, 0.000047f, 0.000052f, 0.000058f, - 0.000061f, 0.000075f, 0.000065f, 0.000066f, 0.000080f, 0.000071f, 0.000076f, 0.000082f, - 0.000092f, 0.000102f, 0.000100f, 0.000105f, 0.000110f, 0.000115f, 0.000121f, 0.000133f, - 0.000140f, 0.000146f, 0.000152f, 0.000164f, 0.000177f, 0.000185f, 0.000192f, 0.000202f, - 0.000213f, 0.000224f, 0.000241f, 0.000252f, 0.000268f, 0.000283f, 0.000310f, 0.000328f, - 0.000348f, 0.000374f, 0.000406f, 0.000431f, 0.000470f, 0.000515f, 0.000560f, 0.000614f, - 0.000688f, 0.000771f, 0.000884f, 0.001019f, 0.001202f, 0.001466f, 0.001827f, 0.002369f, - 0.003269f, 0.005184f, 0.341797f, 0.416016f, 0.435791f, 0.445557f, 0.450928f, 0.455078f, - 0.000062f, 0.000042f, 0.000035f, 0.000030f, 0.000028f, 0.000026f, 0.000024f, 0.000023f, - 0.000023f, 0.000023f, 0.000023f, 0.000030f, 0.000024f, 0.000024f, 0.000031f, 0.000034f, - 0.000035f, 0.000037f, 0.000039f, 0.000040f, 0.000043f, 0.000048f, 0.000050f, 0.000046f, - 0.000051f, 0.000057f, 0.000059f, 0.000058f, 0.000063f, 0.000068f, 0.000070f, 0.000077f, - 0.000082f, 0.000082f, 0.000086f, 0.000093f, 0.000100f, 0.000106f, 0.000114f, 0.000120f, - 0.000131f, 0.000136f, 0.000145f, 0.000161f, 0.000171f, 0.000186f, 0.000204f, 0.000222f, - 0.000251f, 0.000281f, 0.000318f, 0.000364f, 0.000430f, 0.000530f, 0.000672f, 0.000902f, - 0.001316f, 0.002153f, 0.329346f, 0.406006f, 0.426758f, 0.436035f, 0.441650f, 0.445801f, - 0.000031f, 0.000020f, 0.000016f, 0.000014f, 0.000014f, 0.000013f, 0.000012f, 0.000012f, - 0.000011f, 0.000011f, 0.000010f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000009f, - 0.000008f, 0.000008f, 0.000007f, 0.000007f, 0.000007f, 0.000008f, 0.000009f, 0.000010f, - 0.000011f, 0.000012f, 0.000012f, 0.000014f, 0.000014f, 0.000013f, 0.000015f, 0.000016f, - 0.000018f, 0.000019f, 0.000019f, 0.000020f, 0.000023f, 0.000023f, 0.000025f, 0.000027f, - 0.000028f, 0.000031f, 0.000034f, 0.000034f, 0.000037f, 0.000041f, 0.000045f, 0.000049f, - 0.000053f, 0.000059f, 0.000066f, 0.000079f, 0.000093f, 0.000112f, 0.000144f, 0.000196f, - 0.000307f, 0.000598f, 0.317383f, 0.394531f, 0.416504f, 0.425781f, 0.432129f, 0.436279f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000004f, 0.000004f, 0.000004f, 0.000007f, - 0.000010f, 0.000026f, 0.305420f, 0.384277f, 0.405762f, 0.416504f, 0.423340f, 0.427246f, - }, - { - 0.009338f, 0.028412f, 0.047394f, 0.066895f, 0.086548f, 0.105774f, 0.125854f, 0.145142f, - 0.165039f, 0.184570f, 0.204712f, 0.223389f, 0.243164f, 0.261719f, 0.280762f, 0.299805f, - 0.318848f, 0.338135f, 0.356445f, 0.374512f, 0.393066f, 0.412354f, 0.429932f, 0.447510f, - 0.465576f, 0.483887f, 0.501465f, 0.518555f, 0.536133f, 0.553711f, 0.570312f, 0.587402f, - 0.604492f, 0.621094f, 0.637695f, 0.653809f, 0.670898f, 0.687012f, 0.702637f, 0.719238f, - 0.734863f, 0.750488f, 0.765137f, 0.780762f, 0.795898f, 0.811523f, 0.825684f, 0.840820f, - 0.855469f, 0.870605f, 0.884277f, 0.899414f, 0.913086f, 0.926758f, 0.940918f, 0.955078f, - 0.967773f, 0.981934f, 0.966797f, 0.923828f, 0.894531f, 0.870605f, 0.850586f, 0.832520f, - 0.008652f, 0.026825f, 0.045380f, 0.063965f, 0.082703f, 0.101807f, 0.120544f, 0.139282f, - 0.158569f, 0.177246f, 0.196167f, 0.214722f, 0.233521f, 0.252197f, 0.270508f, 0.289062f, - 0.307861f, 0.325928f, 0.343994f, 0.361328f, 0.380615f, 0.397705f, 0.415771f, 0.433594f, - 0.450928f, 0.469238f, 0.485596f, 0.502930f, 0.520020f, 0.537598f, 0.553223f, 0.570801f, - 0.586914f, 0.603516f, 0.620117f, 0.636719f, 0.652832f, 0.668945f, 0.683594f, 0.700684f, - 0.716309f, 0.731934f, 0.746582f, 0.762695f, 0.777344f, 0.792480f, 0.807617f, 0.821777f, - 0.836914f, 0.850586f, 0.865723f, 0.880371f, 0.894043f, 0.908691f, 0.921875f, 0.937012f, - 0.950195f, 0.963867f, 0.958496f, 0.917969f, 0.889648f, 0.867188f, 0.847656f, 0.830566f, - 0.008293f, 0.025620f, 0.042999f, 0.061035f, 0.079163f, 0.097656f, 0.115112f, 0.132812f, - 0.151367f, 0.170532f, 0.188599f, 0.206787f, 0.223999f, 0.242920f, 0.259766f, 0.278809f, - 0.296143f, 0.313232f, 0.331055f, 0.349609f, 0.367432f, 0.385010f, 0.401611f, 0.418945f, - 0.435791f, 0.453369f, 0.469727f, 0.487061f, 0.503906f, 0.520508f, 0.537598f, 0.553223f, - 0.569824f, 0.586426f, 0.603027f, 0.619141f, 0.634277f, 0.650879f, 0.666504f, 0.682129f, - 0.697754f, 0.713379f, 0.729004f, 0.743164f, 0.758301f, 0.773926f, 0.789062f, 0.803711f, - 0.818359f, 0.833008f, 0.847168f, 0.862305f, 0.875488f, 0.890137f, 0.903809f, 0.917480f, - 0.931152f, 0.945801f, 0.950195f, 0.911133f, 0.884766f, 0.862793f, 0.844238f, 0.828125f, - 0.008148f, 0.024506f, 0.041016f, 0.058289f, 0.075256f, 0.092712f, 0.109802f, 0.127319f, - 0.145020f, 0.162964f, 0.180298f, 0.198120f, 0.215454f, 0.232300f, 0.250244f, 0.267822f, - 0.285400f, 0.302734f, 0.318848f, 0.335693f, 0.354004f, 0.371582f, 0.388672f, 0.405029f, - 0.421143f, 0.438965f, 0.455078f, 0.472168f, 0.487549f, 0.503906f, 0.521484f, 0.537598f, - 0.551758f, 0.568359f, 0.584961f, 0.601562f, 0.616211f, 0.633301f, 0.648926f, 0.664062f, - 0.679199f, 0.694824f, 0.709473f, 0.725098f, 0.740234f, 0.755371f, 0.770020f, 0.785156f, - 0.799805f, 0.813965f, 0.828125f, 0.842773f, 0.856934f, 0.871582f, 0.884766f, 0.898926f, - 0.912598f, 0.926270f, 0.941895f, 0.905273f, 0.879883f, 0.858887f, 0.840332f, 0.824707f, - 0.007523f, 0.023010f, 0.039246f, 0.055542f, 0.072021f, 0.088257f, 0.105347f, 0.122070f, - 0.138306f, 0.155273f, 0.172852f, 0.189575f, 0.206421f, 0.223145f, 0.240112f, 0.256592f, - 0.274170f, 0.291260f, 0.307617f, 0.323730f, 0.340576f, 0.358154f, 0.374023f, 0.390137f, - 0.406738f, 0.422852f, 0.440430f, 0.456543f, 0.472656f, 0.489014f, 0.504395f, 0.520996f, - 0.537109f, 0.552734f, 0.568848f, 0.584473f, 0.599121f, 0.615234f, 0.630859f, 0.645020f, - 0.660645f, 0.677246f, 0.690918f, 0.706055f, 0.721680f, 0.736328f, 0.750977f, 0.766113f, - 0.780273f, 0.794922f, 0.809570f, 0.823730f, 0.837891f, 0.852539f, 0.866211f, 0.880371f, - 0.894531f, 0.908691f, 0.933105f, 0.898438f, 0.874023f, 0.853516f, 0.836426f, 0.821289f, - 0.007339f, 0.021912f, 0.037170f, 0.052948f, 0.068665f, 0.084412f, 0.100281f, 0.116333f, - 0.133057f, 0.149048f, 0.164795f, 0.181274f, 0.198242f, 0.214233f, 0.230835f, 0.247314f, - 0.262939f, 0.279053f, 0.295898f, 0.312500f, 0.328613f, 0.344971f, 0.360107f, 0.376953f, - 0.392578f, 0.408691f, 0.425293f, 0.441406f, 0.456787f, 0.472656f, 0.488525f, 0.504883f, - 0.520020f, 0.535156f, 0.550781f, 0.567383f, 0.582520f, 0.597656f, 0.612793f, 0.628418f, - 0.642578f, 0.657715f, 0.673340f, 0.688477f, 0.702637f, 0.718750f, 0.731445f, 0.748047f, - 0.762207f, 0.775879f, 0.791016f, 0.804199f, 0.818848f, 0.833008f, 0.847656f, 0.861328f, - 0.875000f, 0.890625f, 0.924316f, 0.891602f, 0.868164f, 0.849121f, 0.832520f, 0.817871f, - 0.006817f, 0.021133f, 0.035675f, 0.050018f, 0.065186f, 0.080505f, 0.096069f, 0.111389f, - 0.126831f, 0.142456f, 0.158203f, 0.174194f, 0.189819f, 0.205444f, 0.220703f, 0.237183f, - 0.253174f, 0.268555f, 0.284668f, 0.300049f, 0.316406f, 0.332275f, 0.347656f, 0.363281f, - 0.379395f, 0.394775f, 0.409668f, 0.426270f, 0.442139f, 0.457275f, 0.472656f, 0.488037f, - 0.503906f, 0.518555f, 0.534668f, 0.548828f, 0.564941f, 0.579590f, 0.595215f, 0.610352f, - 0.625000f, 0.640137f, 0.654785f, 0.669434f, 0.685059f, 0.699707f, 0.713379f, 0.728027f, - 0.742676f, 0.758301f, 0.770996f, 0.786621f, 0.799316f, 0.813965f, 0.828613f, 0.842285f, - 0.856445f, 0.871094f, 0.915527f, 0.884766f, 0.862305f, 0.843750f, 0.827637f, 0.813965f, - 0.006611f, 0.020111f, 0.033752f, 0.047974f, 0.062378f, 0.076843f, 0.091431f, 0.106262f, - 0.120911f, 0.136230f, 0.151123f, 0.166382f, 0.181396f, 0.196899f, 0.211670f, 0.227295f, - 0.242554f, 0.257812f, 0.272705f, 0.288086f, 0.304199f, 0.318848f, 0.334473f, 0.349609f, - 0.365967f, 0.379883f, 0.395996f, 0.410889f, 0.426270f, 0.441895f, 0.457764f, 0.472412f, - 0.487061f, 0.502930f, 0.517090f, 0.532227f, 0.547363f, 0.563477f, 0.577637f, 0.592285f, - 0.606934f, 0.621582f, 0.636230f, 0.651367f, 0.665039f, 0.679688f, 0.694336f, 0.709473f, - 0.724121f, 0.738770f, 0.752930f, 0.767578f, 0.780762f, 0.795410f, 0.809082f, 0.823242f, - 0.837891f, 0.852539f, 0.906250f, 0.877441f, 0.855957f, 0.838379f, 0.823242f, 0.809570f, - 0.006153f, 0.019150f, 0.031952f, 0.045624f, 0.059326f, 0.073303f, 0.087158f, 0.101562f, - 0.115540f, 0.129395f, 0.144653f, 0.159180f, 0.173584f, 0.187866f, 0.203613f, 0.217651f, - 0.232300f, 0.247559f, 0.262207f, 0.277344f, 0.292969f, 0.307617f, 0.322021f, 0.336914f, - 0.352051f, 0.367188f, 0.381592f, 0.396729f, 0.411377f, 0.427002f, 0.440918f, 0.456787f, - 0.471436f, 0.486572f, 0.500977f, 0.514648f, 0.530273f, 0.545410f, 0.560059f, 0.574219f, - 0.589355f, 0.604004f, 0.618164f, 0.632324f, 0.647461f, 0.661133f, 0.676270f, 0.691406f, - 0.705078f, 0.719727f, 0.733887f, 0.748047f, 0.763184f, 0.777344f, 0.791016f, 0.805176f, - 0.819336f, 0.833496f, 0.896973f, 0.870117f, 0.849609f, 0.833008f, 0.818359f, 0.805176f, - 0.005947f, 0.018311f, 0.030731f, 0.043243f, 0.056732f, 0.069580f, 0.083435f, 0.096558f, - 0.110474f, 0.123962f, 0.137695f, 0.152100f, 0.166016f, 0.180054f, 0.194092f, 0.208862f, - 0.222656f, 0.236816f, 0.251465f, 0.266113f, 0.281250f, 0.294922f, 0.309814f, 0.324219f, - 0.338623f, 0.352783f, 0.368164f, 0.382568f, 0.397461f, 0.411377f, 0.426025f, 0.441162f, - 0.455078f, 0.469971f, 0.484131f, 0.499268f, 0.513672f, 0.528320f, 0.542969f, 0.557129f, - 0.571289f, 0.585449f, 0.599609f, 0.614258f, 0.628418f, 0.643066f, 0.657227f, 0.671875f, - 0.686523f, 0.700195f, 0.714355f, 0.729004f, 0.743164f, 0.756836f, 0.770996f, 0.785645f, - 0.800293f, 0.814453f, 0.888184f, 0.862305f, 0.843262f, 0.827148f, 0.813477f, 0.800781f, - 0.005646f, 0.017136f, 0.029388f, 0.041534f, 0.053802f, 0.066162f, 0.078979f, 0.092285f, - 0.104980f, 0.118408f, 0.130981f, 0.144897f, 0.158203f, 0.172363f, 0.185547f, 0.199951f, - 0.213501f, 0.226440f, 0.240356f, 0.254883f, 0.269287f, 0.283691f, 0.297607f, 0.311279f, - 0.325439f, 0.339600f, 0.353760f, 0.368408f, 0.382812f, 0.396973f, 0.410645f, 0.425049f, - 0.439697f, 0.454102f, 0.468262f, 0.482178f, 0.496094f, 0.510742f, 0.524902f, 0.539551f, - 0.554199f, 0.568359f, 0.582031f, 0.596191f, 0.610352f, 0.624023f, 0.639160f, 0.652832f, - 0.667969f, 0.681152f, 0.696289f, 0.709961f, 0.723633f, 0.738770f, 0.752441f, 0.765625f, - 0.780273f, 0.794922f, 0.878418f, 0.855469f, 0.836914f, 0.821289f, 0.808105f, 0.796387f, - 0.005478f, 0.016174f, 0.027740f, 0.038849f, 0.051270f, 0.063293f, 0.075317f, 0.087402f, - 0.099854f, 0.112793f, 0.125366f, 0.138184f, 0.151001f, 0.164307f, 0.177734f, 0.190918f, - 0.204102f, 0.217529f, 0.231079f, 0.244141f, 0.257324f, 0.271240f, 0.284668f, 0.299072f, - 0.312744f, 0.326660f, 0.339600f, 0.354004f, 0.368408f, 0.382324f, 0.395264f, 0.410156f, - 0.423096f, 0.437500f, 0.452148f, 0.465332f, 0.480469f, 0.493408f, 0.507812f, 0.521484f, - 0.535645f, 0.549316f, 0.563477f, 0.578125f, 0.592285f, 0.605957f, 0.620605f, 0.634766f, - 0.647949f, 0.662109f, 0.676758f, 0.691406f, 0.705078f, 0.718750f, 0.732910f, 0.747559f, - 0.762207f, 0.777344f, 0.869141f, 0.847656f, 0.830078f, 0.815430f, 0.802734f, 0.791504f, - 0.005005f, 0.015762f, 0.026657f, 0.037384f, 0.048218f, 0.059998f, 0.071594f, 0.083618f, - 0.095215f, 0.107666f, 0.119141f, 0.131958f, 0.144043f, 0.156128f, 0.169800f, 0.182129f, - 0.194824f, 0.207031f, 0.219849f, 0.233032f, 0.247559f, 0.260010f, 0.272949f, 0.286133f, - 0.300293f, 0.313477f, 0.326172f, 0.339844f, 0.353516f, 0.367188f, 0.381592f, 0.394531f, - 0.407959f, 0.422363f, 0.436279f, 0.449463f, 0.462891f, 0.477539f, 0.490723f, 0.504395f, - 0.518066f, 0.532227f, 0.545898f, 0.560059f, 0.574219f, 0.586914f, 0.602051f, 0.616211f, - 0.629395f, 0.644531f, 0.657227f, 0.671875f, 0.685547f, 0.699707f, 0.713867f, 0.728516f, - 0.742676f, 0.756836f, 0.859375f, 0.840332f, 0.823730f, 0.809082f, 0.797363f, 0.786621f, - 0.004894f, 0.014786f, 0.025269f, 0.035614f, 0.045990f, 0.057129f, 0.068420f, 0.079224f, - 0.090698f, 0.102112f, 0.113708f, 0.125610f, 0.137817f, 0.149536f, 0.161377f, 0.174316f, - 0.185791f, 0.198486f, 0.211670f, 0.223389f, 0.236816f, 0.249512f, 0.261230f, 0.274414f, - 0.287598f, 0.300537f, 0.313232f, 0.326904f, 0.340576f, 0.353027f, 0.366211f, 0.379883f, - 0.393066f, 0.406006f, 0.419678f, 0.433350f, 0.446289f, 0.460205f, 0.473633f, 0.487305f, - 0.500977f, 0.515137f, 0.528320f, 0.542480f, 0.554688f, 0.569824f, 0.583008f, 0.597656f, - 0.610840f, 0.625488f, 0.638672f, 0.652832f, 0.666504f, 0.681152f, 0.694824f, 0.708984f, - 0.723145f, 0.737793f, 0.850098f, 0.833008f, 0.817383f, 0.802734f, 0.791992f, 0.780762f, - 0.004536f, 0.014160f, 0.023972f, 0.033630f, 0.043823f, 0.053955f, 0.064697f, 0.075195f, - 0.086365f, 0.096802f, 0.108276f, 0.119751f, 0.130493f, 0.142212f, 0.153687f, 0.165405f, - 0.177246f, 0.189331f, 0.201538f, 0.213501f, 0.225464f, 0.237915f, 0.250244f, 0.262939f, - 0.274902f, 0.288086f, 0.300781f, 0.312988f, 0.326172f, 0.339600f, 0.352051f, 0.365479f, - 0.377930f, 0.390625f, 0.403564f, 0.417480f, 0.430420f, 0.444092f, 0.457520f, 0.470215f, - 0.483643f, 0.497559f, 0.510742f, 0.524414f, 0.537598f, 0.551270f, 0.564941f, 0.579102f, - 0.592285f, 0.605957f, 0.619629f, 0.633789f, 0.647949f, 0.661621f, 0.675293f, 0.689453f, - 0.704102f, 0.718262f, 0.840332f, 0.825195f, 0.809570f, 0.797363f, 0.786133f, 0.776367f, - 0.004433f, 0.013138f, 0.022720f, 0.032013f, 0.041199f, 0.051147f, 0.061462f, 0.071716f, - 0.082336f, 0.091919f, 0.102722f, 0.113586f, 0.124390f, 0.135010f, 0.145996f, 0.157837f, - 0.168823f, 0.180054f, 0.192383f, 0.203491f, 0.215332f, 0.227417f, 0.239502f, 0.251221f, - 0.263672f, 0.275635f, 0.287842f, 0.300537f, 0.312500f, 0.324707f, 0.338135f, 0.350342f, - 0.363037f, 0.375977f, 0.388672f, 0.401611f, 0.413818f, 0.427246f, 0.440186f, 0.453613f, - 0.466064f, 0.479736f, 0.492920f, 0.506836f, 0.519531f, 0.533203f, 0.546875f, 0.560059f, - 0.573242f, 0.587402f, 0.600098f, 0.614746f, 0.628418f, 0.642578f, 0.657227f, 0.670898f, - 0.685059f, 0.699707f, 0.830566f, 0.816406f, 0.802734f, 0.791016f, 0.780273f, 0.770996f, - 0.004372f, 0.012619f, 0.021393f, 0.030350f, 0.039276f, 0.048523f, 0.058289f, 0.067505f, - 0.077393f, 0.087585f, 0.097290f, 0.107727f, 0.118225f, 0.128296f, 0.138550f, 0.149414f, - 0.160278f, 0.171631f, 0.182739f, 0.193359f, 0.205200f, 0.216187f, 0.228027f, 0.240234f, - 0.251465f, 0.263428f, 0.275146f, 0.287598f, 0.298828f, 0.311523f, 0.323242f, 0.336182f, - 0.348633f, 0.360107f, 0.372803f, 0.385986f, 0.398682f, 0.411621f, 0.424072f, 0.436523f, - 0.449951f, 0.462891f, 0.475098f, 0.488525f, 0.501953f, 0.514648f, 0.527344f, 0.541992f, - 0.555176f, 0.569336f, 0.582031f, 0.596191f, 0.609863f, 0.623047f, 0.637695f, 0.651855f, - 0.665527f, 0.679688f, 0.821289f, 0.808105f, 0.795410f, 0.784180f, 0.774902f, 0.765137f, - 0.003937f, 0.012169f, 0.020477f, 0.028641f, 0.037781f, 0.046448f, 0.055481f, 0.064209f, - 0.073181f, 0.082458f, 0.092651f, 0.101990f, 0.111572f, 0.121948f, 0.132202f, 0.142212f, - 0.151978f, 0.162720f, 0.173340f, 0.184326f, 0.195312f, 0.206055f, 0.217163f, 0.228516f, - 0.239990f, 0.250977f, 0.262695f, 0.274658f, 0.285889f, 0.297363f, 0.308838f, 0.321045f, - 0.333496f, 0.345459f, 0.357422f, 0.370117f, 0.382324f, 0.395020f, 0.407227f, 0.419922f, - 0.432617f, 0.444336f, 0.458008f, 0.470703f, 0.483398f, 0.497559f, 0.510254f, 0.522949f, - 0.536133f, 0.550293f, 0.562988f, 0.577637f, 0.590820f, 0.603516f, 0.618164f, 0.632324f, - 0.645508f, 0.660645f, 0.811035f, 0.800293f, 0.788086f, 0.777832f, 0.768555f, 0.760254f, - 0.003868f, 0.011368f, 0.019257f, 0.027512f, 0.035431f, 0.043274f, 0.051880f, 0.060852f, - 0.069214f, 0.078003f, 0.087524f, 0.096924f, 0.105896f, 0.115112f, 0.124817f, 0.134766f, - 0.144409f, 0.154663f, 0.164673f, 0.175415f, 0.184814f, 0.196289f, 0.206299f, 0.216797f, - 0.228394f, 0.239380f, 0.250244f, 0.260986f, 0.273193f, 0.284424f, 0.295410f, 0.307373f, - 0.319092f, 0.331299f, 0.342285f, 0.354248f, 0.366455f, 0.378662f, 0.390869f, 0.403809f, - 0.415771f, 0.427734f, 0.440430f, 0.453369f, 0.466309f, 0.479736f, 0.492188f, 0.504883f, - 0.518066f, 0.531250f, 0.544922f, 0.558105f, 0.571777f, 0.584473f, 0.598633f, 0.612305f, - 0.626465f, 0.641602f, 0.801758f, 0.792480f, 0.781738f, 0.770508f, 0.761230f, 0.753906f, - 0.003616f, 0.010872f, 0.018387f, 0.026077f, 0.033875f, 0.041351f, 0.049591f, 0.057434f, - 0.065674f, 0.073669f, 0.082153f, 0.091064f, 0.100098f, 0.109009f, 0.117981f, 0.127563f, - 0.137207f, 0.146362f, 0.156494f, 0.165894f, 0.176025f, 0.186157f, 0.196655f, 0.206421f, - 0.216919f, 0.227539f, 0.237915f, 0.249268f, 0.260254f, 0.270752f, 0.282471f, 0.293945f, - 0.305176f, 0.316406f, 0.328125f, 0.338867f, 0.350342f, 0.361816f, 0.375244f, 0.387207f, - 0.398926f, 0.411133f, 0.423584f, 0.436523f, 0.448730f, 0.461182f, 0.474121f, 0.485840f, - 0.499756f, 0.513672f, 0.525391f, 0.539062f, 0.552734f, 0.565918f, 0.580566f, 0.593750f, - 0.608398f, 0.621094f, 0.790527f, 0.783691f, 0.773926f, 0.764160f, 0.755859f, 0.747559f, - 0.003450f, 0.010429f, 0.017487f, 0.024445f, 0.031860f, 0.039581f, 0.046631f, 0.054718f, - 0.061951f, 0.070251f, 0.078003f, 0.086121f, 0.094910f, 0.102905f, 0.111572f, 0.120300f, - 0.129761f, 0.138428f, 0.147217f, 0.156982f, 0.166992f, 0.176147f, 0.186157f, 0.196045f, - 0.206299f, 0.216187f, 0.226318f, 0.236938f, 0.247437f, 0.258301f, 0.268311f, 0.279785f, - 0.290527f, 0.301758f, 0.312744f, 0.324219f, 0.335449f, 0.346680f, 0.359131f, 0.370605f, - 0.382812f, 0.394531f, 0.406982f, 0.419189f, 0.430908f, 0.443604f, 0.456055f, 0.468506f, - 0.481445f, 0.494873f, 0.506836f, 0.520996f, 0.534180f, 0.547363f, 0.561035f, 0.573730f, - 0.588379f, 0.601074f, 0.780762f, 0.775879f, 0.766602f, 0.757324f, 0.748535f, 0.741699f, - 0.003281f, 0.009811f, 0.016174f, 0.023438f, 0.030060f, 0.037109f, 0.044464f, 0.051239f, - 0.058441f, 0.066345f, 0.073792f, 0.081238f, 0.089539f, 0.097229f, 0.105286f, 0.113647f, - 0.122498f, 0.130615f, 0.139526f, 0.148438f, 0.157837f, 0.166626f, 0.176636f, 0.185547f, - 0.195312f, 0.204956f, 0.215088f, 0.224976f, 0.234863f, 0.245239f, 0.255859f, 0.266113f, - 0.276367f, 0.287354f, 0.298096f, 0.309326f, 0.320801f, 0.331787f, 0.343018f, 0.355225f, - 0.366211f, 0.378418f, 0.389893f, 0.401611f, 0.413574f, 0.425781f, 0.438721f, 0.451416f, - 0.463135f, 0.476074f, 0.489014f, 0.501465f, 0.514648f, 0.528809f, 0.541992f, 0.554688f, - 0.568848f, 0.582520f, 0.770508f, 0.767090f, 0.758789f, 0.750488f, 0.743164f, 0.735352f, - 0.002901f, 0.009422f, 0.015488f, 0.021729f, 0.028290f, 0.035278f, 0.041321f, 0.048523f, - 0.055420f, 0.062195f, 0.069336f, 0.076477f, 0.084412f, 0.091858f, 0.099609f, 0.107361f, - 0.115112f, 0.123535f, 0.131592f, 0.140137f, 0.148438f, 0.157715f, 0.166382f, 0.174927f, - 0.184692f, 0.193970f, 0.203369f, 0.212646f, 0.222656f, 0.232910f, 0.242920f, 0.252197f, - 0.263184f, 0.273438f, 0.284180f, 0.294922f, 0.305664f, 0.316895f, 0.327881f, 0.338867f, - 0.349854f, 0.361328f, 0.373291f, 0.385254f, 0.397461f, 0.408691f, 0.420898f, 0.433350f, - 0.445801f, 0.458252f, 0.470703f, 0.483154f, 0.496826f, 0.510254f, 0.522461f, 0.535645f, - 0.549805f, 0.562988f, 0.760742f, 0.758789f, 0.750488f, 0.743652f, 0.736328f, 0.729492f, - 0.002861f, 0.008606f, 0.014488f, 0.021057f, 0.026810f, 0.032898f, 0.038879f, 0.045532f, - 0.051666f, 0.058319f, 0.065125f, 0.072449f, 0.079224f, 0.086426f, 0.093689f, 0.100830f, - 0.108276f, 0.116089f, 0.123962f, 0.131958f, 0.140625f, 0.148560f, 0.156494f, 0.164795f, - 0.174194f, 0.183228f, 0.192017f, 0.201294f, 0.210815f, 0.220093f, 0.229858f, 0.239746f, - 0.249390f, 0.260010f, 0.270508f, 0.280518f, 0.290771f, 0.301758f, 0.312744f, 0.323486f, - 0.334473f, 0.345215f, 0.356934f, 0.368408f, 0.379883f, 0.391846f, 0.403564f, 0.416016f, - 0.427490f, 0.439453f, 0.452881f, 0.465332f, 0.478271f, 0.490234f, 0.503906f, 0.517090f, - 0.529785f, 0.543945f, 0.750000f, 0.750000f, 0.743164f, 0.736328f, 0.729492f, 0.723145f, - 0.002977f, 0.008492f, 0.013931f, 0.019745f, 0.024948f, 0.030991f, 0.036804f, 0.042755f, - 0.048889f, 0.055267f, 0.061737f, 0.067932f, 0.074829f, 0.081116f, 0.087646f, 0.095215f, - 0.102356f, 0.109436f, 0.116760f, 0.124023f, 0.131714f, 0.139648f, 0.147461f, 0.155762f, - 0.164185f, 0.172485f, 0.181152f, 0.189697f, 0.198730f, 0.208130f, 0.217285f, 0.226685f, - 0.236572f, 0.245850f, 0.255859f, 0.265869f, 0.276367f, 0.286377f, 0.297607f, 0.307861f, - 0.318359f, 0.329102f, 0.340576f, 0.351807f, 0.363281f, 0.374023f, 0.386230f, 0.397949f, - 0.409668f, 0.422119f, 0.434082f, 0.446777f, 0.459229f, 0.471924f, 0.484863f, 0.497803f, - 0.511230f, 0.525391f, 0.739746f, 0.741211f, 0.735352f, 0.729004f, 0.722656f, 0.717285f, - 0.002441f, 0.007896f, 0.013443f, 0.018402f, 0.023911f, 0.029343f, 0.034454f, 0.040375f, - 0.045868f, 0.051453f, 0.057800f, 0.063721f, 0.070068f, 0.075928f, 0.082520f, 0.089233f, - 0.095703f, 0.102478f, 0.109314f, 0.116638f, 0.123596f, 0.131348f, 0.138550f, 0.145996f, - 0.153809f, 0.162109f, 0.170044f, 0.179199f, 0.187866f, 0.196045f, 0.205078f, 0.213745f, - 0.223389f, 0.233032f, 0.242554f, 0.252197f, 0.261963f, 0.271973f, 0.281982f, 0.292236f, - 0.303223f, 0.312988f, 0.324463f, 0.335693f, 0.346191f, 0.357910f, 0.368652f, 0.380371f, - 0.391846f, 0.404541f, 0.415527f, 0.428467f, 0.440674f, 0.453369f, 0.466553f, 0.479248f, - 0.491455f, 0.505371f, 0.729492f, 0.732422f, 0.727539f, 0.721191f, 0.716309f, 0.709961f, - 0.002457f, 0.007553f, 0.012489f, 0.017548f, 0.022217f, 0.027405f, 0.032471f, 0.037689f, - 0.043060f, 0.048553f, 0.054230f, 0.059631f, 0.065369f, 0.071533f, 0.077393f, 0.083069f, - 0.089417f, 0.096069f, 0.102356f, 0.108398f, 0.115417f, 0.122925f, 0.130127f, 0.137451f, - 0.144531f, 0.152100f, 0.160156f, 0.168091f, 0.176514f, 0.184570f, 0.192871f, 0.201660f, - 0.210571f, 0.219238f, 0.229126f, 0.238281f, 0.248413f, 0.257812f, 0.267578f, 0.277588f, - 0.287354f, 0.298096f, 0.308594f, 0.319336f, 0.329590f, 0.340820f, 0.351318f, 0.363770f, - 0.375732f, 0.386963f, 0.397949f, 0.409912f, 0.422363f, 0.434326f, 0.446533f, 0.459473f, - 0.473145f, 0.486084f, 0.718750f, 0.723633f, 0.719727f, 0.713867f, 0.708984f, 0.703613f, - 0.002436f, 0.006939f, 0.011612f, 0.016113f, 0.021072f, 0.025497f, 0.030640f, 0.035339f, - 0.040222f, 0.045441f, 0.050690f, 0.055725f, 0.060669f, 0.066589f, 0.072144f, 0.077881f, - 0.083740f, 0.089294f, 0.095215f, 0.101501f, 0.108032f, 0.114868f, 0.121643f, 0.128052f, - 0.135010f, 0.142334f, 0.150024f, 0.157349f, 0.164917f, 0.173340f, 0.181274f, 0.189697f, - 0.198120f, 0.206909f, 0.215698f, 0.224365f, 0.234497f, 0.243652f, 0.252930f, 0.262695f, - 0.272461f, 0.282471f, 0.292480f, 0.302979f, 0.313721f, 0.324463f, 0.335205f, 0.346436f, - 0.357666f, 0.369141f, 0.380859f, 0.391602f, 0.404541f, 0.416016f, 0.428467f, 0.440918f, - 0.454102f, 0.466553f, 0.708496f, 0.715820f, 0.711426f, 0.706055f, 0.701660f, 0.696777f, - 0.002188f, 0.006599f, 0.011032f, 0.015068f, 0.019897f, 0.024048f, 0.028656f, 0.033264f, - 0.037720f, 0.042236f, 0.047028f, 0.051941f, 0.056824f, 0.062012f, 0.067444f, 0.072449f, - 0.077942f, 0.083374f, 0.088867f, 0.094727f, 0.100769f, 0.106750f, 0.112732f, 0.119263f, - 0.126099f, 0.133179f, 0.139648f, 0.146729f, 0.154175f, 0.161987f, 0.170044f, 0.177612f, - 0.185791f, 0.194214f, 0.203125f, 0.211670f, 0.220581f, 0.229370f, 0.238770f, 0.248047f, - 0.257812f, 0.267822f, 0.277344f, 0.287109f, 0.297363f, 0.307861f, 0.318848f, 0.329590f, - 0.341064f, 0.351562f, 0.363037f, 0.374512f, 0.385498f, 0.397461f, 0.409668f, 0.422363f, - 0.434326f, 0.447021f, 0.697266f, 0.706543f, 0.703125f, 0.698730f, 0.694336f, 0.689941f, - 0.002024f, 0.006165f, 0.010399f, 0.014481f, 0.018555f, 0.022797f, 0.026627f, 0.030869f, - 0.035187f, 0.039459f, 0.043732f, 0.047943f, 0.052917f, 0.057434f, 0.062622f, 0.067261f, - 0.071838f, 0.077454f, 0.082581f, 0.087891f, 0.093628f, 0.099182f, 0.105469f, 0.111206f, - 0.117126f, 0.123779f, 0.130371f, 0.137085f, 0.143921f, 0.151001f, 0.158691f, 0.166016f, - 0.173950f, 0.181641f, 0.190063f, 0.198120f, 0.206909f, 0.215698f, 0.224976f, 0.233398f, - 0.242798f, 0.252197f, 0.262207f, 0.271973f, 0.281738f, 0.291992f, 0.302734f, 0.313477f, - 0.323242f, 0.334229f, 0.345459f, 0.355957f, 0.368652f, 0.380615f, 0.391602f, 0.403809f, - 0.415771f, 0.428467f, 0.686523f, 0.696777f, 0.695312f, 0.691895f, 0.687500f, 0.683105f, - 0.001931f, 0.005970f, 0.009651f, 0.013557f, 0.017136f, 0.021088f, 0.024902f, 0.028748f, - 0.032623f, 0.036743f, 0.040833f, 0.044983f, 0.049591f, 0.053467f, 0.057800f, 0.062500f, - 0.066833f, 0.071533f, 0.076538f, 0.081238f, 0.086670f, 0.092224f, 0.097290f, 0.103088f, - 0.108887f, 0.114990f, 0.120972f, 0.127197f, 0.134277f, 0.140503f, 0.147705f, 0.154663f, - 0.162231f, 0.169922f, 0.177612f, 0.185303f, 0.193604f, 0.201904f, 0.210815f, 0.219238f, - 0.228516f, 0.237427f, 0.247070f, 0.256592f, 0.265869f, 0.275879f, 0.285645f, 0.295898f, - 0.306396f, 0.317139f, 0.328369f, 0.338623f, 0.350342f, 0.362305f, 0.374023f, 0.385010f, - 0.397461f, 0.410156f, 0.675781f, 0.687988f, 0.687012f, 0.683594f, 0.680664f, 0.676270f, - 0.001725f, 0.005436f, 0.009171f, 0.012589f, 0.016190f, 0.019485f, 0.023132f, 0.026978f, - 0.030899f, 0.034180f, 0.037659f, 0.041565f, 0.045074f, 0.049438f, 0.053345f, 0.057739f, - 0.061768f, 0.065918f, 0.070679f, 0.075073f, 0.080078f, 0.084656f, 0.089966f, 0.095215f, - 0.100464f, 0.106445f, 0.112000f, 0.117615f, 0.124207f, 0.130737f, 0.136719f, 0.144043f, - 0.151123f, 0.158081f, 0.165405f, 0.173096f, 0.181152f, 0.189087f, 0.197510f, 0.205688f, - 0.214600f, 0.223145f, 0.232178f, 0.241699f, 0.250732f, 0.260254f, 0.270264f, 0.279785f, - 0.289795f, 0.300293f, 0.310791f, 0.322510f, 0.333496f, 0.344238f, 0.355713f, 0.367188f, - 0.379395f, 0.392090f, 0.664551f, 0.678711f, 0.678223f, 0.675781f, 0.672852f, 0.669922f, - 0.001741f, 0.005077f, 0.008522f, 0.011810f, 0.014946f, 0.018524f, 0.021332f, 0.024872f, - 0.028519f, 0.031799f, 0.034973f, 0.038727f, 0.041992f, 0.045654f, 0.049072f, 0.052856f, - 0.056671f, 0.060638f, 0.064819f, 0.069092f, 0.073425f, 0.078125f, 0.082886f, 0.087280f, - 0.092651f, 0.098206f, 0.103638f, 0.109192f, 0.114563f, 0.120667f, 0.126709f, 0.133057f, - 0.139771f, 0.146851f, 0.153931f, 0.160767f, 0.168457f, 0.175903f, 0.183838f, 0.192505f, - 0.200195f, 0.208618f, 0.217407f, 0.226562f, 0.236084f, 0.245239f, 0.254639f, 0.263672f, - 0.273926f, 0.283447f, 0.294189f, 0.304932f, 0.315674f, 0.326172f, 0.337402f, 0.348877f, - 0.360107f, 0.373291f, 0.653809f, 0.670410f, 0.669922f, 0.667480f, 0.665527f, 0.662109f, - 0.001639f, 0.004951f, 0.007996f, 0.010857f, 0.013779f, 0.016968f, 0.019974f, 0.023392f, - 0.026001f, 0.029373f, 0.032013f, 0.035370f, 0.038513f, 0.041992f, 0.044586f, 0.048706f, - 0.052124f, 0.055634f, 0.059723f, 0.063354f, 0.067444f, 0.071289f, 0.075745f, 0.080444f, - 0.085022f, 0.089722f, 0.095032f, 0.100220f, 0.105347f, 0.111206f, 0.117126f, 0.123108f, - 0.129395f, 0.135620f, 0.142090f, 0.148682f, 0.156372f, 0.163574f, 0.170898f, 0.178711f, - 0.186890f, 0.194580f, 0.203613f, 0.211426f, 0.220459f, 0.229492f, 0.238281f, 0.248169f, - 0.257324f, 0.267578f, 0.277832f, 0.287354f, 0.298340f, 0.308350f, 0.319824f, 0.331543f, - 0.342041f, 0.354248f, 0.641602f, 0.660645f, 0.662109f, 0.660645f, 0.658203f, 0.654785f, - 0.001569f, 0.004539f, 0.007538f, 0.010368f, 0.013359f, 0.016006f, 0.018539f, 0.021210f, - 0.024384f, 0.026855f, 0.029892f, 0.032471f, 0.035034f, 0.038177f, 0.041199f, 0.044434f, - 0.047485f, 0.050781f, 0.054321f, 0.057953f, 0.061523f, 0.065430f, 0.069275f, 0.073547f, - 0.077820f, 0.082092f, 0.086731f, 0.091736f, 0.096985f, 0.101990f, 0.107361f, 0.112549f, - 0.118774f, 0.124878f, 0.131104f, 0.137573f, 0.144409f, 0.150635f, 0.157837f, 0.165283f, - 0.173340f, 0.181274f, 0.188599f, 0.197510f, 0.205933f, 0.214600f, 0.223633f, 0.232056f, - 0.241577f, 0.251709f, 0.261230f, 0.270996f, 0.281250f, 0.291260f, 0.302246f, 0.313477f, - 0.323730f, 0.336182f, 0.630859f, 0.651855f, 0.652832f, 0.652344f, 0.650391f, 0.647461f, - 0.001558f, 0.004139f, 0.007103f, 0.009560f, 0.012077f, 0.014313f, 0.016983f, 0.019653f, - 0.021988f, 0.024490f, 0.027023f, 0.029526f, 0.031891f, 0.034821f, 0.037903f, 0.040192f, - 0.043457f, 0.046417f, 0.049316f, 0.052795f, 0.055725f, 0.059357f, 0.063354f, 0.066895f, - 0.070740f, 0.074890f, 0.078979f, 0.083801f, 0.088440f, 0.093018f, 0.097961f, 0.103394f, - 0.108704f, 0.114563f, 0.120239f, 0.126343f, 0.132690f, 0.139038f, 0.145874f, 0.152710f, - 0.159912f, 0.168091f, 0.175537f, 0.183228f, 0.191650f, 0.199707f, 0.208130f, 0.216797f, - 0.226074f, 0.235352f, 0.244507f, 0.254395f, 0.264404f, 0.274414f, 0.285156f, 0.296631f, - 0.307373f, 0.318604f, 0.619141f, 0.643066f, 0.644531f, 0.644043f, 0.642578f, 0.639648f, - 0.001314f, 0.004002f, 0.006603f, 0.009056f, 0.011490f, 0.013184f, 0.015587f, 0.017883f, - 0.020157f, 0.022415f, 0.024582f, 0.027206f, 0.029160f, 0.031677f, 0.034088f, 0.036530f, - 0.039337f, 0.042206f, 0.044891f, 0.047729f, 0.050751f, 0.053955f, 0.057312f, 0.060486f, - 0.064148f, 0.068054f, 0.071960f, 0.075867f, 0.079895f, 0.084595f, 0.089172f, 0.094238f, - 0.098999f, 0.104492f, 0.109802f, 0.115173f, 0.121338f, 0.127686f, 0.134033f, 0.140991f, - 0.147095f, 0.154541f, 0.161865f, 0.169800f, 0.177368f, 0.185547f, 0.193848f, 0.201904f, - 0.211060f, 0.219116f, 0.229004f, 0.238525f, 0.248047f, 0.257812f, 0.267822f, 0.277832f, - 0.289062f, 0.300537f, 0.607910f, 0.633301f, 0.636230f, 0.635742f, 0.634766f, 0.633301f, - 0.001217f, 0.003571f, 0.005947f, 0.008011f, 0.010391f, 0.012207f, 0.014313f, 0.016617f, - 0.018280f, 0.020523f, 0.022537f, 0.024475f, 0.026443f, 0.028778f, 0.030884f, 0.032867f, - 0.035553f, 0.037872f, 0.040375f, 0.042938f, 0.045593f, 0.048431f, 0.051605f, 0.054688f, - 0.057953f, 0.061279f, 0.065002f, 0.068665f, 0.072266f, 0.076294f, 0.080872f, 0.085083f, - 0.089783f, 0.094482f, 0.099915f, 0.104736f, 0.110901f, 0.116272f, 0.122314f, 0.128784f, - 0.134888f, 0.142090f, 0.148560f, 0.155884f, 0.163574f, 0.171753f, 0.179077f, 0.187500f, - 0.195679f, 0.204346f, 0.213745f, 0.222656f, 0.231812f, 0.241455f, 0.250977f, 0.261230f, - 0.272461f, 0.282959f, 0.596680f, 0.623535f, 0.627441f, 0.627930f, 0.627441f, 0.625000f, - 0.001111f, 0.003542f, 0.005569f, 0.007504f, 0.009338f, 0.011452f, 0.012939f, 0.015030f, - 0.016678f, 0.018326f, 0.020203f, 0.022217f, 0.023788f, 0.025604f, 0.027771f, 0.029877f, - 0.031860f, 0.033813f, 0.036102f, 0.038605f, 0.040985f, 0.043579f, 0.046448f, 0.049042f, - 0.051849f, 0.055054f, 0.058319f, 0.061615f, 0.065125f, 0.068909f, 0.072815f, 0.076843f, - 0.080872f, 0.085571f, 0.089905f, 0.095398f, 0.100159f, 0.105713f, 0.111206f, 0.116882f, - 0.122925f, 0.129517f, 0.135742f, 0.142822f, 0.149902f, 0.157349f, 0.165161f, 0.172852f, - 0.181152f, 0.189331f, 0.198120f, 0.206909f, 0.215820f, 0.225342f, 0.235474f, 0.245239f, - 0.254883f, 0.266602f, 0.584473f, 0.614746f, 0.619141f, 0.619629f, 0.619141f, 0.618164f, - 0.001149f, 0.003147f, 0.004826f, 0.006886f, 0.008629f, 0.010452f, 0.012024f, 0.013359f, - 0.015175f, 0.016647f, 0.018143f, 0.019882f, 0.021332f, 0.023026f, 0.024902f, 0.026550f, - 0.028397f, 0.030045f, 0.032318f, 0.034393f, 0.036682f, 0.038910f, 0.041107f, 0.043671f, - 0.046295f, 0.048950f, 0.051819f, 0.054993f, 0.058258f, 0.061523f, 0.065063f, 0.068481f, - 0.072510f, 0.076965f, 0.081055f, 0.085510f, 0.090393f, 0.095093f, 0.100342f, 0.105774f, - 0.111694f, 0.117371f, 0.124084f, 0.130371f, 0.136963f, 0.143921f, 0.151245f, 0.159058f, - 0.166626f, 0.174927f, 0.182983f, 0.191650f, 0.200195f, 0.209473f, 0.218750f, 0.228149f, - 0.238037f, 0.249146f, 0.572266f, 0.604980f, 0.609863f, 0.611328f, 0.610352f, 0.611328f, - 0.001009f, 0.003059f, 0.004620f, 0.006283f, 0.007881f, 0.009415f, 0.010864f, 0.011940f, - 0.013443f, 0.014847f, 0.016403f, 0.017700f, 0.019012f, 0.020493f, 0.021927f, 0.023697f, - 0.025177f, 0.026947f, 0.028732f, 0.030472f, 0.032654f, 0.034302f, 0.036591f, 0.038757f, - 0.041046f, 0.043488f, 0.045837f, 0.048706f, 0.051544f, 0.054810f, 0.057770f, 0.061188f, - 0.064331f, 0.068237f, 0.072083f, 0.076416f, 0.080872f, 0.085388f, 0.090149f, 0.095276f, - 0.100403f, 0.105896f, 0.111877f, 0.117798f, 0.124329f, 0.130859f, 0.138062f, 0.145020f, - 0.152710f, 0.160034f, 0.168335f, 0.176514f, 0.185059f, 0.193481f, 0.203125f, 0.212158f, - 0.221924f, 0.232178f, 0.562500f, 0.594727f, 0.601074f, 0.602539f, 0.603516f, 0.602539f, - 0.000865f, 0.002674f, 0.004444f, 0.005615f, 0.007233f, 0.008430f, 0.009827f, 0.010880f, - 0.011917f, 0.013206f, 0.014412f, 0.015717f, 0.016876f, 0.018173f, 0.019501f, 0.020950f, - 0.022217f, 0.023773f, 0.025284f, 0.026749f, 0.028610f, 0.030151f, 0.032166f, 0.034149f, - 0.036041f, 0.038330f, 0.040558f, 0.042877f, 0.045532f, 0.048157f, 0.050934f, 0.053894f, - 0.056946f, 0.060303f, 0.063843f, 0.067566f, 0.071472f, 0.075806f, 0.080261f, 0.084778f, - 0.089600f, 0.094971f, 0.100220f, 0.105896f, 0.111877f, 0.118103f, 0.125000f, 0.131348f, - 0.138550f, 0.146362f, 0.153687f, 0.161987f, 0.169678f, 0.178223f, 0.187134f, 0.196045f, - 0.205811f, 0.215698f, 0.549805f, 0.584961f, 0.592773f, 0.594238f, 0.593750f, 0.595215f, - 0.000951f, 0.002476f, 0.003956f, 0.005062f, 0.006268f, 0.007637f, 0.008888f, 0.009666f, - 0.010628f, 0.011810f, 0.012856f, 0.013878f, 0.014946f, 0.015900f, 0.017227f, 0.018356f, - 0.019592f, 0.020889f, 0.022003f, 0.023438f, 0.025101f, 0.026489f, 0.028122f, 0.029739f, - 0.031555f, 0.033295f, 0.035431f, 0.037537f, 0.039795f, 0.041962f, 0.044647f, 0.047302f, - 0.049957f, 0.052979f, 0.056122f, 0.059387f, 0.062927f, 0.066956f, 0.070679f, 0.074951f, - 0.079468f, 0.084167f, 0.089294f, 0.094482f, 0.100098f, 0.106018f, 0.112061f, 0.118835f, - 0.125366f, 0.132446f, 0.139893f, 0.147827f, 0.155762f, 0.163574f, 0.172607f, 0.180786f, - 0.190063f, 0.199951f, 0.536621f, 0.576172f, 0.583496f, 0.586914f, 0.587402f, 0.586914f, - 0.000788f, 0.002115f, 0.003592f, 0.004780f, 0.005939f, 0.006615f, 0.007740f, 0.008598f, - 0.009514f, 0.010376f, 0.011200f, 0.012138f, 0.013016f, 0.014069f, 0.014977f, 0.015961f, - 0.016922f, 0.018036f, 0.019043f, 0.020447f, 0.021606f, 0.022995f, 0.024323f, 0.025864f, - 0.027344f, 0.028946f, 0.030731f, 0.032593f, 0.034515f, 0.036530f, 0.038910f, 0.041016f, - 0.043274f, 0.046021f, 0.048981f, 0.051819f, 0.055176f, 0.058472f, 0.062012f, 0.065857f, - 0.069946f, 0.074219f, 0.078796f, 0.083801f, 0.088806f, 0.094299f, 0.100281f, 0.106018f, - 0.112793f, 0.119446f, 0.126343f, 0.133545f, 0.141357f, 0.149292f, 0.157104f, 0.165894f, - 0.174683f, 0.184326f, 0.524902f, 0.566895f, 0.575195f, 0.576660f, 0.579102f, 0.579590f, - 0.000661f, 0.001961f, 0.003382f, 0.004311f, 0.005161f, 0.006062f, 0.006737f, 0.007427f, - 0.008286f, 0.008995f, 0.009857f, 0.010368f, 0.011230f, 0.011955f, 0.012833f, 0.013786f, - 0.014565f, 0.015480f, 0.016647f, 0.017578f, 0.018677f, 0.019806f, 0.020950f, 0.022263f, - 0.023651f, 0.024994f, 0.026306f, 0.027863f, 0.029724f, 0.031525f, 0.033325f, 0.035370f, - 0.037292f, 0.039673f, 0.042114f, 0.044769f, 0.047546f, 0.050537f, 0.053680f, 0.057098f, - 0.060852f, 0.064514f, 0.069031f, 0.073303f, 0.078064f, 0.083069f, 0.088379f, 0.094238f, - 0.100220f, 0.106689f, 0.113342f, 0.120300f, 0.127563f, 0.135132f, 0.142700f, 0.151245f, - 0.160034f, 0.168823f, 0.512695f, 0.557129f, 0.566406f, 0.569824f, 0.569824f, 0.571289f, - 0.000757f, 0.001709f, 0.002844f, 0.003582f, 0.004448f, 0.005192f, 0.005989f, 0.006519f, - 0.007038f, 0.007801f, 0.008453f, 0.009071f, 0.009727f, 0.010391f, 0.011009f, 0.011726f, - 0.012650f, 0.013184f, 0.014107f, 0.014977f, 0.015900f, 0.016800f, 0.017776f, 0.018936f, - 0.020172f, 0.021271f, 0.022446f, 0.023697f, 0.025055f, 0.026703f, 0.028397f, 0.030014f, - 0.031921f, 0.033905f, 0.035919f, 0.038177f, 0.040680f, 0.043243f, 0.045898f, 0.049072f, - 0.052216f, 0.055725f, 0.059784f, 0.063538f, 0.067688f, 0.072327f, 0.077271f, 0.082764f, - 0.088379f, 0.094299f, 0.100708f, 0.107239f, 0.114136f, 0.121582f, 0.128906f, 0.136963f, - 0.145630f, 0.153564f, 0.500977f, 0.547852f, 0.556641f, 0.561523f, 0.562500f, 0.563965f, - 0.000704f, 0.001769f, 0.002542f, 0.003523f, 0.004036f, 0.004562f, 0.005032f, 0.005661f, - 0.006176f, 0.006542f, 0.007072f, 0.007698f, 0.008339f, 0.008827f, 0.009323f, 0.010094f, - 0.010757f, 0.011276f, 0.012093f, 0.012733f, 0.013489f, 0.014488f, 0.015244f, 0.016006f, - 0.017151f, 0.017975f, 0.018967f, 0.020142f, 0.021255f, 0.022552f, 0.023880f, 0.025314f, - 0.026840f, 0.028503f, 0.030441f, 0.032166f, 0.034424f, 0.036438f, 0.039001f, 0.041656f, - 0.044464f, 0.047455f, 0.050842f, 0.054443f, 0.058167f, 0.062286f, 0.066956f, 0.071899f, - 0.076904f, 0.082458f, 0.088501f, 0.094482f, 0.101196f, 0.108337f, 0.115662f, 0.123352f, - 0.130981f, 0.139282f, 0.489746f, 0.538574f, 0.547852f, 0.551270f, 0.554688f, 0.555176f, - 0.000579f, 0.001450f, 0.002396f, 0.002857f, 0.003454f, 0.004032f, 0.004356f, 0.004791f, - 0.005333f, 0.005718f, 0.006130f, 0.006485f, 0.007042f, 0.007473f, 0.007988f, 0.008476f, - 0.008865f, 0.009613f, 0.010086f, 0.010651f, 0.011345f, 0.012047f, 0.012764f, 0.013435f, - 0.014282f, 0.015144f, 0.015884f, 0.016846f, 0.017868f, 0.018814f, 0.020050f, 0.021164f, - 0.022507f, 0.023773f, 0.025192f, 0.026978f, 0.028564f, 0.030640f, 0.032623f, 0.034882f, - 0.037231f, 0.039886f, 0.042786f, 0.046143f, 0.049286f, 0.052979f, 0.057098f, 0.061279f, - 0.066223f, 0.071167f, 0.076660f, 0.082581f, 0.088989f, 0.095581f, 0.102661f, 0.109863f, - 0.117737f, 0.125488f, 0.476807f, 0.528320f, 0.538574f, 0.543945f, 0.546875f, 0.546875f, - 0.000510f, 0.001428f, 0.002037f, 0.002613f, 0.003086f, 0.003290f, 0.003672f, 0.004108f, - 0.004345f, 0.004768f, 0.005035f, 0.005470f, 0.005959f, 0.006207f, 0.006599f, 0.007095f, - 0.007568f, 0.008003f, 0.008377f, 0.008904f, 0.009575f, 0.010010f, 0.010643f, 0.011131f, - 0.011871f, 0.012535f, 0.013199f, 0.014038f, 0.014839f, 0.015640f, 0.016586f, 0.017502f, - 0.018585f, 0.019745f, 0.021088f, 0.022354f, 0.023727f, 0.025253f, 0.026962f, 0.028870f, - 0.030762f, 0.033051f, 0.035492f, 0.038177f, 0.041229f, 0.044403f, 0.048004f, 0.051880f, - 0.056213f, 0.060516f, 0.065857f, 0.071045f, 0.077271f, 0.083374f, 0.090027f, 0.096863f, - 0.104492f, 0.112183f, 0.463623f, 0.518066f, 0.529785f, 0.535156f, 0.538086f, 0.540039f, - 0.000473f, 0.001222f, 0.001771f, 0.002117f, 0.002323f, 0.002796f, 0.003096f, 0.003355f, - 0.003601f, 0.003975f, 0.004295f, 0.004543f, 0.004833f, 0.005142f, 0.005455f, 0.005848f, - 0.006165f, 0.006535f, 0.006947f, 0.007370f, 0.007809f, 0.008240f, 0.008690f, 0.009216f, - 0.009758f, 0.010223f, 0.010925f, 0.011536f, 0.012146f, 0.012833f, 0.013573f, 0.014389f, - 0.015244f, 0.016220f, 0.017120f, 0.018219f, 0.019379f, 0.020599f, 0.021988f, 0.023514f, - 0.025131f, 0.027054f, 0.029037f, 0.031311f, 0.033752f, 0.036591f, 0.039520f, 0.042999f, - 0.046661f, 0.050873f, 0.055603f, 0.060333f, 0.066101f, 0.071960f, 0.078491f, 0.084961f, - 0.091797f, 0.099426f, 0.452148f, 0.508301f, 0.520508f, 0.526367f, 0.528809f, 0.530273f, - 0.000299f, 0.001057f, 0.001329f, 0.001771f, 0.001957f, 0.002350f, 0.002483f, 0.002697f, - 0.002964f, 0.003181f, 0.003441f, 0.003653f, 0.003904f, 0.004238f, 0.004501f, 0.004738f, - 0.005024f, 0.005390f, 0.005657f, 0.005985f, 0.006279f, 0.006714f, 0.007053f, 0.007507f, - 0.007881f, 0.008369f, 0.008774f, 0.009300f, 0.009888f, 0.010483f, 0.011093f, 0.011627f, - 0.012398f, 0.013130f, 0.013855f, 0.014717f, 0.015686f, 0.016739f, 0.017761f, 0.018890f, - 0.020248f, 0.021698f, 0.023376f, 0.025131f, 0.027237f, 0.029556f, 0.032166f, 0.035004f, - 0.038208f, 0.041962f, 0.045868f, 0.050507f, 0.055359f, 0.060852f, 0.066772f, 0.073242f, - 0.080017f, 0.087097f, 0.440674f, 0.498047f, 0.511719f, 0.517090f, 0.520508f, 0.522949f, - 0.000427f, 0.001020f, 0.001253f, 0.001431f, 0.001690f, 0.001900f, 0.002018f, 0.002304f, - 0.002481f, 0.002569f, 0.002731f, 0.002998f, 0.003157f, 0.003424f, 0.003592f, 0.003838f, - 0.004017f, 0.004253f, 0.004551f, 0.004776f, 0.005100f, 0.005379f, 0.005699f, 0.005932f, - 0.006290f, 0.006630f, 0.007038f, 0.007465f, 0.007927f, 0.008286f, 0.008858f, 0.009293f, - 0.009888f, 0.010429f, 0.011086f, 0.011765f, 0.012482f, 0.013298f, 0.014168f, 0.015068f, - 0.016129f, 0.017288f, 0.018585f, 0.019943f, 0.021622f, 0.023361f, 0.025436f, 0.027847f, - 0.030655f, 0.033447f, 0.037079f, 0.041229f, 0.045776f, 0.050568f, 0.056061f, 0.062317f, - 0.068726f, 0.075684f, 0.427734f, 0.488525f, 0.502441f, 0.508789f, 0.513184f, 0.513672f, - 0.000255f, 0.000597f, 0.001032f, 0.001150f, 0.001353f, 0.001493f, 0.001608f, 0.001750f, - 0.001933f, 0.002062f, 0.002178f, 0.002302f, 0.002474f, 0.002670f, 0.002872f, 0.002995f, - 0.003147f, 0.003298f, 0.003565f, 0.003729f, 0.003941f, 0.004219f, 0.004436f, 0.004719f, - 0.005005f, 0.005230f, 0.005489f, 0.005806f, 0.006191f, 0.006496f, 0.006897f, 0.007267f, - 0.007671f, 0.008179f, 0.008636f, 0.009163f, 0.009766f, 0.010368f, 0.011047f, 0.011810f, - 0.012611f, 0.013527f, 0.014519f, 0.015640f, 0.016800f, 0.018265f, 0.019897f, 0.021698f, - 0.023895f, 0.026260f, 0.029175f, 0.032715f, 0.036682f, 0.041168f, 0.045929f, 0.051758f, - 0.057922f, 0.064575f, 0.415771f, 0.478271f, 0.493652f, 0.500000f, 0.503906f, 0.505859f, - 0.000255f, 0.000544f, 0.000863f, 0.000994f, 0.001086f, 0.001183f, 0.001317f, 0.001328f, - 0.001491f, 0.001608f, 0.001716f, 0.001851f, 0.001943f, 0.002075f, 0.002161f, 0.002319f, - 0.002426f, 0.002596f, 0.002741f, 0.002884f, 0.003088f, 0.003265f, 0.003391f, 0.003620f, - 0.003777f, 0.004005f, 0.004215f, 0.004452f, 0.004734f, 0.004963f, 0.005341f, 0.005577f, - 0.005875f, 0.006271f, 0.006603f, 0.006996f, 0.007450f, 0.007919f, 0.008446f, 0.009003f, - 0.009674f, 0.010338f, 0.011101f, 0.011909f, 0.012917f, 0.013977f, 0.015190f, 0.016495f, - 0.018112f, 0.020325f, 0.022415f, 0.025146f, 0.028473f, 0.032349f, 0.036804f, 0.041992f, - 0.047913f, 0.054077f, 0.404541f, 0.468506f, 0.484131f, 0.490967f, 0.495361f, 0.498291f, - 0.000377f, 0.000440f, 0.000606f, 0.000685f, 0.000735f, 0.000876f, 0.000929f, 0.001035f, - 0.001068f, 0.001157f, 0.001307f, 0.001381f, 0.001473f, 0.001595f, 0.001664f, 0.001708f, - 0.001850f, 0.001957f, 0.002043f, 0.002195f, 0.002291f, 0.002422f, 0.002571f, 0.002687f, - 0.002842f, 0.002979f, 0.003183f, 0.003345f, 0.003532f, 0.003794f, 0.004002f, 0.004154f, - 0.004429f, 0.004635f, 0.004967f, 0.005253f, 0.005573f, 0.005909f, 0.006275f, 0.006695f, - 0.007183f, 0.007660f, 0.008316f, 0.008934f, 0.009644f, 0.010429f, 0.011360f, 0.012497f, - 0.013634f, 0.014977f, 0.016663f, 0.018875f, 0.021423f, 0.024643f, 0.028549f, 0.033020f, - 0.038483f, 0.044525f, 0.391602f, 0.458984f, 0.474854f, 0.482178f, 0.488037f, 0.489990f, - 0.000159f, 0.000401f, 0.000450f, 0.000522f, 0.000605f, 0.000634f, 0.000728f, 0.000702f, - 0.000808f, 0.000882f, 0.000959f, 0.000991f, 0.001043f, 0.001112f, 0.001205f, 0.001245f, - 0.001357f, 0.001419f, 0.001513f, 0.001546f, 0.001648f, 0.001752f, 0.001863f, 0.001942f, - 0.002056f, 0.002159f, 0.002289f, 0.002392f, 0.002506f, 0.002697f, 0.002827f, 0.003023f, - 0.003172f, 0.003330f, 0.003542f, 0.003750f, 0.004017f, 0.004292f, 0.004559f, 0.004871f, - 0.005161f, 0.005539f, 0.005932f, 0.006416f, 0.006973f, 0.007526f, 0.008232f, 0.008980f, - 0.009918f, 0.010895f, 0.012085f, 0.013680f, 0.015472f, 0.017975f, 0.021103f, 0.025146f, - 0.029938f, 0.035645f, 0.379395f, 0.448486f, 0.465820f, 0.473633f, 0.478760f, 0.481689f, - 0.000112f, 0.000220f, 0.000321f, 0.000322f, 0.000401f, 0.000489f, 0.000469f, 0.000510f, - 0.000568f, 0.000653f, 0.000659f, 0.000676f, 0.000703f, 0.000789f, 0.000811f, 0.000886f, - 0.000888f, 0.000994f, 0.001048f, 0.001096f, 0.001155f, 0.001220f, 0.001289f, 0.001357f, - 0.001431f, 0.001496f, 0.001599f, 0.001675f, 0.001759f, 0.001894f, 0.001965f, 0.002083f, - 0.002193f, 0.002310f, 0.002464f, 0.002634f, 0.002758f, 0.002949f, 0.003134f, 0.003319f, - 0.003551f, 0.003830f, 0.004120f, 0.004440f, 0.004784f, 0.005188f, 0.005680f, 0.006222f, - 0.006886f, 0.007614f, 0.008461f, 0.009529f, 0.010864f, 0.012596f, 0.014961f, 0.018097f, - 0.022263f, 0.027466f, 0.367920f, 0.438232f, 0.456543f, 0.465332f, 0.470215f, 0.472900f, - 0.000140f, 0.000219f, 0.000241f, 0.000245f, 0.000290f, 0.000291f, 0.000302f, 0.000342f, - 0.000380f, 0.000409f, 0.000408f, 0.000485f, 0.000473f, 0.000527f, 0.000556f, 0.000575f, - 0.000630f, 0.000642f, 0.000673f, 0.000711f, 0.000762f, 0.000800f, 0.000852f, 0.000886f, - 0.000952f, 0.000982f, 0.001049f, 0.001108f, 0.001159f, 0.001220f, 0.001281f, 0.001369f, - 0.001454f, 0.001522f, 0.001595f, 0.001695f, 0.001839f, 0.001928f, 0.002068f, 0.002209f, - 0.002337f, 0.002504f, 0.002686f, 0.002876f, 0.003139f, 0.003437f, 0.003723f, 0.004078f, - 0.004509f, 0.005009f, 0.005615f, 0.006332f, 0.007317f, 0.008461f, 0.009926f, 0.012154f, - 0.015640f, 0.020325f, 0.356445f, 0.429199f, 0.447266f, 0.456299f, 0.462158f, 0.464844f, - 0.000048f, 0.000154f, 0.000141f, 0.000147f, 0.000174f, 0.000207f, 0.000188f, 0.000221f, - 0.000233f, 0.000242f, 0.000248f, 0.000271f, 0.000299f, 0.000312f, 0.000337f, 0.000350f, - 0.000367f, 0.000403f, 0.000416f, 0.000458f, 0.000465f, 0.000483f, 0.000507f, 0.000546f, - 0.000576f, 0.000625f, 0.000637f, 0.000659f, 0.000705f, 0.000742f, 0.000797f, 0.000837f, - 0.000890f, 0.000925f, 0.000978f, 0.001036f, 0.001103f, 0.001181f, 0.001253f, 0.001329f, - 0.001421f, 0.001529f, 0.001647f, 0.001782f, 0.001906f, 0.002075f, 0.002291f, 0.002483f, - 0.002758f, 0.003059f, 0.003450f, 0.003906f, 0.004536f, 0.005306f, 0.006325f, 0.007713f, - 0.010101f, 0.014084f, 0.343262f, 0.418457f, 0.437744f, 0.447510f, 0.452881f, 0.456543f, - 0.000099f, 0.000100f, 0.000091f, 0.000085f, 0.000105f, 0.000099f, 0.000127f, 0.000127f, - 0.000130f, 0.000137f, 0.000152f, 0.000164f, 0.000164f, 0.000172f, 0.000195f, 0.000186f, - 0.000209f, 0.000222f, 0.000231f, 0.000241f, 0.000258f, 0.000266f, 0.000290f, 0.000301f, - 0.000324f, 0.000343f, 0.000357f, 0.000369f, 0.000392f, 0.000409f, 0.000440f, 0.000463f, - 0.000484f, 0.000513f, 0.000544f, 0.000578f, 0.000607f, 0.000650f, 0.000702f, 0.000737f, - 0.000787f, 0.000846f, 0.000918f, 0.000977f, 0.001062f, 0.001146f, 0.001259f, 0.001379f, - 0.001524f, 0.001701f, 0.001924f, 0.002207f, 0.002542f, 0.003006f, 0.003628f, 0.004494f, - 0.005821f, 0.008774f, 0.332031f, 0.409180f, 0.428467f, 0.438965f, 0.444336f, 0.447998f, - 0.000082f, 0.000057f, 0.000048f, 0.000051f, 0.000055f, 0.000054f, 0.000057f, 0.000064f, - 0.000066f, 0.000079f, 0.000070f, 0.000070f, 0.000084f, 0.000078f, 0.000084f, 0.000091f, - 0.000099f, 0.000108f, 0.000108f, 0.000114f, 0.000119f, 0.000124f, 0.000129f, 0.000144f, - 0.000151f, 0.000158f, 0.000163f, 0.000176f, 0.000188f, 0.000196f, 0.000208f, 0.000220f, - 0.000227f, 0.000239f, 0.000259f, 0.000273f, 0.000290f, 0.000303f, 0.000331f, 0.000351f, - 0.000376f, 0.000402f, 0.000432f, 0.000460f, 0.000500f, 0.000547f, 0.000593f, 0.000648f, - 0.000720f, 0.000805f, 0.000918f, 0.001045f, 0.001225f, 0.001462f, 0.001788f, 0.002264f, - 0.003029f, 0.004623f, 0.320801f, 0.398682f, 0.419922f, 0.430420f, 0.436279f, 0.440674f, - 0.000061f, 0.000041f, 0.000033f, 0.000029f, 0.000026f, 0.000025f, 0.000024f, 0.000024f, - 0.000023f, 0.000023f, 0.000025f, 0.000032f, 0.000026f, 0.000027f, 0.000035f, 0.000037f, - 0.000039f, 0.000041f, 0.000041f, 0.000041f, 0.000044f, 0.000050f, 0.000054f, 0.000051f, - 0.000055f, 0.000060f, 0.000061f, 0.000062f, 0.000069f, 0.000074f, 0.000075f, 0.000081f, - 0.000087f, 0.000090f, 0.000093f, 0.000098f, 0.000108f, 0.000114f, 0.000123f, 0.000130f, - 0.000142f, 0.000144f, 0.000156f, 0.000173f, 0.000179f, 0.000200f, 0.000218f, 0.000237f, - 0.000267f, 0.000299f, 0.000335f, 0.000382f, 0.000448f, 0.000544f, 0.000677f, 0.000883f, - 0.001233f, 0.001933f, 0.309570f, 0.388672f, 0.410889f, 0.421143f, 0.427246f, 0.431885f, - 0.000031f, 0.000020f, 0.000016f, 0.000014f, 0.000013f, 0.000012f, 0.000012f, 0.000011f, - 0.000011f, 0.000010f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000008f, 0.000009f, - 0.000009f, 0.000007f, 0.000007f, 0.000007f, 0.000008f, 0.000009f, 0.000011f, 0.000012f, - 0.000012f, 0.000012f, 0.000013f, 0.000015f, 0.000015f, 0.000014f, 0.000016f, 0.000017f, - 0.000019f, 0.000020f, 0.000020f, 0.000022f, 0.000025f, 0.000023f, 0.000026f, 0.000029f, - 0.000031f, 0.000034f, 0.000036f, 0.000037f, 0.000040f, 0.000044f, 0.000048f, 0.000052f, - 0.000056f, 0.000063f, 0.000068f, 0.000083f, 0.000098f, 0.000117f, 0.000149f, 0.000201f, - 0.000301f, 0.000544f, 0.297607f, 0.379150f, 0.400879f, 0.411865f, 0.419189f, 0.423340f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000003f, 0.000004f, 0.000004f, 0.000004f, 0.000005f, 0.000007f, - 0.000011f, 0.000026f, 0.286621f, 0.368896f, 0.391846f, 0.402588f, 0.409912f, 0.414551f, - }, - { - 0.007935f, 0.024429f, 0.041290f, 0.058838f, 0.076355f, 0.093933f, 0.111145f, 0.128174f, - 0.146606f, 0.164429f, 0.182617f, 0.200562f, 0.218750f, 0.236206f, 0.254150f, 0.271729f, - 0.289551f, 0.308105f, 0.325684f, 0.342773f, 0.360596f, 0.379150f, 0.396240f, 0.414795f, - 0.431641f, 0.450439f, 0.468018f, 0.484619f, 0.502441f, 0.520020f, 0.536621f, 0.554688f, - 0.571777f, 0.588379f, 0.605469f, 0.622559f, 0.640137f, 0.657227f, 0.672852f, 0.689941f, - 0.707031f, 0.723633f, 0.740234f, 0.756836f, 0.773926f, 0.789551f, 0.805664f, 0.821777f, - 0.838379f, 0.854980f, 0.870117f, 0.885742f, 0.901855f, 0.917480f, 0.932617f, 0.948730f, - 0.963379f, 0.979492f, 0.960449f, 0.909668f, 0.876465f, 0.850098f, 0.827637f, 0.807617f, - 0.007530f, 0.023422f, 0.039764f, 0.056610f, 0.073303f, 0.090149f, 0.107300f, 0.124084f, - 0.141968f, 0.158569f, 0.176392f, 0.193604f, 0.210815f, 0.228760f, 0.246094f, 0.262695f, - 0.280518f, 0.298340f, 0.315430f, 0.333252f, 0.350586f, 0.367432f, 0.384766f, 0.402344f, - 0.419678f, 0.436768f, 0.453613f, 0.471436f, 0.488037f, 0.504883f, 0.521973f, 0.538574f, - 0.556641f, 0.573242f, 0.589844f, 0.605957f, 0.623535f, 0.639160f, 0.656250f, 0.673340f, - 0.688477f, 0.706055f, 0.721680f, 0.738770f, 0.754883f, 0.770508f, 0.786133f, 0.803711f, - 0.817871f, 0.834473f, 0.850586f, 0.866211f, 0.881348f, 0.896973f, 0.913086f, 0.928223f, - 0.942871f, 0.958984f, 0.951172f, 0.903320f, 0.871094f, 0.845703f, 0.824219f, 0.805664f, - 0.007320f, 0.022552f, 0.038391f, 0.054260f, 0.070312f, 0.086792f, 0.103271f, 0.120178f, - 0.136841f, 0.153564f, 0.170410f, 0.187256f, 0.203735f, 0.220825f, 0.237793f, 0.255127f, - 0.271240f, 0.288086f, 0.305420f, 0.322021f, 0.339844f, 0.356689f, 0.373047f, 0.390137f, - 0.406738f, 0.423340f, 0.440186f, 0.456787f, 0.474121f, 0.490967f, 0.507324f, 0.523926f, - 0.540527f, 0.557129f, 0.573242f, 0.590332f, 0.606445f, 0.623047f, 0.638672f, 0.655273f, - 0.671875f, 0.687500f, 0.703613f, 0.720215f, 0.735840f, 0.751953f, 0.767578f, 0.783203f, - 0.799316f, 0.814941f, 0.830078f, 0.845703f, 0.861328f, 0.877441f, 0.892090f, 0.908203f, - 0.922852f, 0.938477f, 0.941895f, 0.895996f, 0.865723f, 0.841309f, 0.820801f, 0.802734f, - 0.007008f, 0.021667f, 0.036865f, 0.052216f, 0.067871f, 0.083862f, 0.099426f, 0.115479f, - 0.131470f, 0.148315f, 0.164551f, 0.180298f, 0.196899f, 0.213379f, 0.229370f, 0.246460f, - 0.262695f, 0.279541f, 0.295410f, 0.311523f, 0.329102f, 0.345215f, 0.360840f, 0.378174f, - 0.394043f, 0.410156f, 0.427246f, 0.443115f, 0.459717f, 0.476318f, 0.493652f, 0.508789f, - 0.524902f, 0.541016f, 0.557129f, 0.573242f, 0.589844f, 0.605469f, 0.621582f, 0.638672f, - 0.652832f, 0.669434f, 0.685547f, 0.701660f, 0.717285f, 0.731934f, 0.749023f, 0.764160f, - 0.779785f, 0.794922f, 0.810059f, 0.826172f, 0.841309f, 0.856445f, 0.872070f, 0.886719f, - 0.902344f, 0.917480f, 0.932129f, 0.889648f, 0.859863f, 0.835938f, 0.816895f, 0.799316f, - 0.006817f, 0.020645f, 0.035156f, 0.050110f, 0.065247f, 0.080383f, 0.096313f, 0.111450f, - 0.126587f, 0.142456f, 0.158447f, 0.174316f, 0.189819f, 0.205566f, 0.221802f, 0.237427f, - 0.253662f, 0.269775f, 0.285889f, 0.301514f, 0.317627f, 0.333740f, 0.349609f, 0.366211f, - 0.381348f, 0.397705f, 0.414307f, 0.429932f, 0.447266f, 0.462646f, 0.477539f, 0.494385f, - 0.509766f, 0.525879f, 0.541992f, 0.557617f, 0.571777f, 0.588379f, 0.605469f, 0.619629f, - 0.636230f, 0.651855f, 0.666992f, 0.681152f, 0.698242f, 0.714355f, 0.729980f, 0.745117f, - 0.759766f, 0.775391f, 0.790527f, 0.806152f, 0.821289f, 0.835938f, 0.850586f, 0.866211f, - 0.882324f, 0.896484f, 0.922363f, 0.882324f, 0.854004f, 0.831543f, 0.812500f, 0.795898f, - 0.006378f, 0.019989f, 0.034027f, 0.048004f, 0.062744f, 0.077148f, 0.091980f, 0.107178f, - 0.122192f, 0.137207f, 0.152466f, 0.167603f, 0.183960f, 0.199097f, 0.214111f, 0.229736f, - 0.244995f, 0.260254f, 0.276367f, 0.291504f, 0.306641f, 0.322998f, 0.338623f, 0.354248f, - 0.369629f, 0.385254f, 0.400879f, 0.416504f, 0.432617f, 0.447510f, 0.464111f, 0.479492f, - 0.494141f, 0.511230f, 0.525879f, 0.541016f, 0.556641f, 0.572754f, 0.586914f, 0.602051f, - 0.617676f, 0.633789f, 0.648926f, 0.665039f, 0.679688f, 0.695312f, 0.710449f, 0.726074f, - 0.739746f, 0.755859f, 0.771484f, 0.785645f, 0.800781f, 0.815918f, 0.831055f, 0.846680f, - 0.860840f, 0.875977f, 0.912598f, 0.874512f, 0.847656f, 0.826172f, 0.807617f, 0.791504f, - 0.006603f, 0.019287f, 0.032776f, 0.046356f, 0.060272f, 0.073914f, 0.088135f, 0.102905f, - 0.117554f, 0.132690f, 0.147095f, 0.161377f, 0.176636f, 0.191162f, 0.205444f, 0.221680f, - 0.236572f, 0.251465f, 0.267090f, 0.281250f, 0.296875f, 0.312256f, 0.327393f, 0.342285f, - 0.357666f, 0.373291f, 0.388184f, 0.403076f, 0.418457f, 0.433838f, 0.448975f, 0.465088f, - 0.479980f, 0.494385f, 0.509277f, 0.525879f, 0.540039f, 0.555176f, 0.570801f, 0.586426f, - 0.601074f, 0.616211f, 0.631348f, 0.646484f, 0.661133f, 0.676270f, 0.692383f, 0.705078f, - 0.720215f, 0.735352f, 0.751953f, 0.766602f, 0.781250f, 0.796387f, 0.810059f, 0.825684f, - 0.840820f, 0.855469f, 0.902344f, 0.866699f, 0.841797f, 0.820312f, 0.803223f, 0.787598f, - 0.006111f, 0.018433f, 0.031097f, 0.044739f, 0.057892f, 0.071472f, 0.085205f, 0.099304f, - 0.113037f, 0.127319f, 0.141357f, 0.156128f, 0.169678f, 0.183838f, 0.198608f, 0.213745f, - 0.227661f, 0.243652f, 0.257324f, 0.272705f, 0.286865f, 0.301025f, 0.316406f, 0.331543f, - 0.345703f, 0.360107f, 0.375000f, 0.390625f, 0.405762f, 0.420410f, 0.435303f, 0.449951f, - 0.465088f, 0.479492f, 0.494141f, 0.509277f, 0.523926f, 0.538574f, 0.553711f, 0.569336f, - 0.583496f, 0.598145f, 0.612793f, 0.628418f, 0.642578f, 0.657227f, 0.671387f, 0.687012f, - 0.702637f, 0.716797f, 0.731934f, 0.745605f, 0.761230f, 0.775391f, 0.790527f, 0.805176f, - 0.819824f, 0.834961f, 0.892578f, 0.858887f, 0.834473f, 0.814941f, 0.798340f, 0.783203f, - 0.005756f, 0.017761f, 0.029907f, 0.042572f, 0.055481f, 0.068420f, 0.081482f, 0.095276f, - 0.108826f, 0.122070f, 0.135620f, 0.149902f, 0.163330f, 0.177368f, 0.191284f, 0.206421f, - 0.219482f, 0.233521f, 0.247925f, 0.262451f, 0.277100f, 0.290771f, 0.304688f, 0.319580f, - 0.334229f, 0.348389f, 0.362549f, 0.377441f, 0.391602f, 0.406250f, 0.421143f, 0.435791f, - 0.450439f, 0.463867f, 0.478760f, 0.493164f, 0.507812f, 0.521973f, 0.537109f, 0.551270f, - 0.565430f, 0.580078f, 0.594727f, 0.609863f, 0.624023f, 0.638672f, 0.653320f, 0.668457f, - 0.682129f, 0.697266f, 0.711914f, 0.726562f, 0.740723f, 0.755859f, 0.770996f, 0.785156f, - 0.799805f, 0.814453f, 0.882812f, 0.851562f, 0.827148f, 0.808594f, 0.792969f, 0.778809f, - 0.005741f, 0.017166f, 0.029053f, 0.041138f, 0.053345f, 0.065796f, 0.078674f, 0.091248f, - 0.104614f, 0.117004f, 0.130737f, 0.143921f, 0.156860f, 0.170288f, 0.183960f, 0.197754f, - 0.211304f, 0.224976f, 0.238892f, 0.251953f, 0.266357f, 0.280273f, 0.294922f, 0.308594f, - 0.322021f, 0.336914f, 0.350098f, 0.364502f, 0.378174f, 0.393066f, 0.407471f, 0.420166f, - 0.435059f, 0.449219f, 0.463135f, 0.477295f, 0.491699f, 0.506348f, 0.520996f, 0.534668f, - 0.549316f, 0.563477f, 0.577148f, 0.591309f, 0.605469f, 0.620605f, 0.634766f, 0.648438f, - 0.663086f, 0.677734f, 0.691895f, 0.706543f, 0.720215f, 0.734863f, 0.750488f, 0.765137f, - 0.779297f, 0.793945f, 0.872559f, 0.843262f, 0.820801f, 0.803223f, 0.787598f, 0.773926f, - 0.005283f, 0.016052f, 0.028030f, 0.039246f, 0.050751f, 0.063232f, 0.074829f, 0.087341f, - 0.099976f, 0.112732f, 0.125122f, 0.138062f, 0.150757f, 0.163696f, 0.176758f, 0.189697f, - 0.203125f, 0.216553f, 0.229614f, 0.243286f, 0.256592f, 0.269775f, 0.283203f, 0.297119f, - 0.310547f, 0.324463f, 0.337891f, 0.351807f, 0.365234f, 0.378662f, 0.392822f, 0.406738f, - 0.419922f, 0.434814f, 0.448730f, 0.461182f, 0.476562f, 0.489746f, 0.502930f, 0.517578f, - 0.531738f, 0.545410f, 0.559082f, 0.573730f, 0.587402f, 0.602051f, 0.615723f, 0.629395f, - 0.644043f, 0.658203f, 0.672363f, 0.686523f, 0.701660f, 0.714844f, 0.729980f, 0.743652f, - 0.758301f, 0.774414f, 0.862305f, 0.835449f, 0.813965f, 0.796875f, 0.782227f, 0.769043f, - 0.005272f, 0.015427f, 0.026230f, 0.037506f, 0.049164f, 0.060516f, 0.072021f, 0.083740f, - 0.095825f, 0.108521f, 0.120361f, 0.132324f, 0.144897f, 0.156738f, 0.169922f, 0.182373f, - 0.195068f, 0.208008f, 0.220459f, 0.233887f, 0.246948f, 0.260254f, 0.272461f, 0.285889f, - 0.299561f, 0.312500f, 0.325684f, 0.338867f, 0.352783f, 0.365479f, 0.378906f, 0.392334f, - 0.406006f, 0.419189f, 0.432861f, 0.446777f, 0.460693f, 0.473877f, 0.486572f, 0.500977f, - 0.515137f, 0.528809f, 0.542480f, 0.555176f, 0.569824f, 0.583984f, 0.597656f, 0.611328f, - 0.625000f, 0.639648f, 0.653320f, 0.667480f, 0.681641f, 0.695801f, 0.709961f, 0.723633f, - 0.738281f, 0.752930f, 0.852539f, 0.827148f, 0.807129f, 0.790527f, 0.776367f, 0.764160f, - 0.004822f, 0.014885f, 0.025360f, 0.035767f, 0.046570f, 0.057587f, 0.068726f, 0.080139f, - 0.091736f, 0.103577f, 0.115479f, 0.126709f, 0.138672f, 0.150879f, 0.162231f, 0.174805f, - 0.187622f, 0.199951f, 0.212524f, 0.224854f, 0.236694f, 0.249878f, 0.262207f, 0.275391f, - 0.287842f, 0.300293f, 0.313477f, 0.326904f, 0.340088f, 0.353027f, 0.365479f, 0.378174f, - 0.391602f, 0.404541f, 0.417236f, 0.431641f, 0.444336f, 0.457764f, 0.470703f, 0.484375f, - 0.497803f, 0.510742f, 0.524902f, 0.537598f, 0.552246f, 0.564941f, 0.579590f, 0.592285f, - 0.606445f, 0.621094f, 0.634277f, 0.646973f, 0.662109f, 0.675781f, 0.689453f, 0.704102f, - 0.718262f, 0.733398f, 0.842285f, 0.818848f, 0.799805f, 0.784180f, 0.770996f, 0.758301f, - 0.004745f, 0.014427f, 0.024277f, 0.034546f, 0.044800f, 0.055176f, 0.066040f, 0.076477f, - 0.087341f, 0.099060f, 0.110474f, 0.121216f, 0.132690f, 0.144165f, 0.156006f, 0.167358f, - 0.179688f, 0.191284f, 0.203247f, 0.216187f, 0.227905f, 0.239868f, 0.252441f, 0.264648f, - 0.277100f, 0.289307f, 0.301270f, 0.314453f, 0.326660f, 0.338867f, 0.352539f, 0.364990f, - 0.377686f, 0.390137f, 0.403076f, 0.416016f, 0.428467f, 0.441406f, 0.453857f, 0.468262f, - 0.480957f, 0.494385f, 0.507324f, 0.520020f, 0.534180f, 0.547363f, 0.560059f, 0.573730f, - 0.586914f, 0.601074f, 0.615234f, 0.628418f, 0.641602f, 0.656250f, 0.669434f, 0.683594f, - 0.697754f, 0.712402f, 0.832520f, 0.809570f, 0.792480f, 0.778320f, 0.764160f, 0.753906f, - 0.004612f, 0.013840f, 0.023483f, 0.033081f, 0.042999f, 0.052490f, 0.063049f, 0.073303f, - 0.083801f, 0.094238f, 0.105042f, 0.115967f, 0.127319f, 0.138062f, 0.149048f, 0.160645f, - 0.171875f, 0.183228f, 0.194946f, 0.206665f, 0.218384f, 0.230347f, 0.241699f, 0.253906f, - 0.265869f, 0.277832f, 0.290039f, 0.301758f, 0.314209f, 0.326660f, 0.339111f, 0.351074f, - 0.363281f, 0.375977f, 0.388428f, 0.401123f, 0.413330f, 0.426270f, 0.439453f, 0.451904f, - 0.464111f, 0.478027f, 0.489746f, 0.503418f, 0.515625f, 0.529297f, 0.542480f, 0.556152f, - 0.569336f, 0.582031f, 0.595215f, 0.608887f, 0.622559f, 0.636230f, 0.649902f, 0.663574f, - 0.677246f, 0.691895f, 0.821289f, 0.802246f, 0.785645f, 0.771484f, 0.758789f, 0.748047f, - 0.004345f, 0.012985f, 0.022156f, 0.030884f, 0.040802f, 0.050568f, 0.060303f, 0.069946f, - 0.079956f, 0.090393f, 0.100403f, 0.111084f, 0.120667f, 0.131714f, 0.142700f, 0.153198f, - 0.164429f, 0.175659f, 0.186523f, 0.197876f, 0.208496f, 0.220337f, 0.231567f, 0.243286f, - 0.254639f, 0.266113f, 0.277832f, 0.289795f, 0.301758f, 0.313477f, 0.325439f, 0.337402f, - 0.349609f, 0.361328f, 0.373779f, 0.385986f, 0.398193f, 0.410889f, 0.423340f, 0.435059f, - 0.447998f, 0.460205f, 0.473389f, 0.486084f, 0.499023f, 0.511230f, 0.524414f, 0.537109f, - 0.549805f, 0.563477f, 0.576172f, 0.589355f, 0.603027f, 0.616699f, 0.629883f, 0.644531f, - 0.658691f, 0.670898f, 0.811035f, 0.792969f, 0.777832f, 0.764648f, 0.752441f, 0.742676f, - 0.004002f, 0.012718f, 0.021210f, 0.029877f, 0.039246f, 0.048431f, 0.057281f, 0.067078f, - 0.076538f, 0.086121f, 0.096008f, 0.105957f, 0.115540f, 0.125732f, 0.136475f, 0.146729f, - 0.157227f, 0.167236f, 0.177979f, 0.189819f, 0.200195f, 0.210693f, 0.221802f, 0.232788f, - 0.243896f, 0.255127f, 0.266602f, 0.278320f, 0.289062f, 0.300293f, 0.312012f, 0.323975f, - 0.335449f, 0.347168f, 0.359131f, 0.371094f, 0.382812f, 0.394775f, 0.406982f, 0.419434f, - 0.431152f, 0.443604f, 0.455566f, 0.468506f, 0.481445f, 0.493408f, 0.506348f, 0.519043f, - 0.531738f, 0.544922f, 0.558105f, 0.570801f, 0.583984f, 0.597168f, 0.610352f, 0.624512f, - 0.637695f, 0.651855f, 0.800293f, 0.785156f, 0.770508f, 0.757812f, 0.747070f, 0.737305f, - 0.003967f, 0.011940f, 0.020203f, 0.028931f, 0.037109f, 0.045898f, 0.054840f, 0.063477f, - 0.073059f, 0.082214f, 0.090942f, 0.100647f, 0.110535f, 0.120178f, 0.129639f, 0.139648f, - 0.149902f, 0.160156f, 0.170044f, 0.180786f, 0.190674f, 0.201416f, 0.211792f, 0.222412f, - 0.233521f, 0.244751f, 0.255615f, 0.266113f, 0.276855f, 0.288574f, 0.299561f, 0.311279f, - 0.322266f, 0.333984f, 0.344727f, 0.356934f, 0.368164f, 0.379395f, 0.390869f, 0.403076f, - 0.415283f, 0.427246f, 0.439453f, 0.451172f, 0.464111f, 0.476807f, 0.488281f, 0.500977f, - 0.513672f, 0.526367f, 0.538574f, 0.551758f, 0.564453f, 0.577637f, 0.590820f, 0.604492f, - 0.618164f, 0.631836f, 0.790039f, 0.775879f, 0.763184f, 0.750977f, 0.740723f, 0.731445f, - 0.003679f, 0.011749f, 0.019135f, 0.027237f, 0.035431f, 0.043884f, 0.052399f, 0.060577f, - 0.069153f, 0.077881f, 0.086731f, 0.095947f, 0.104797f, 0.114380f, 0.123535f, 0.133057f, - 0.142700f, 0.152588f, 0.162231f, 0.171753f, 0.182129f, 0.192261f, 0.202026f, 0.212524f, - 0.222900f, 0.233643f, 0.243896f, 0.254395f, 0.264893f, 0.276123f, 0.286621f, 0.297119f, - 0.308105f, 0.319336f, 0.331299f, 0.341553f, 0.353027f, 0.364258f, 0.375977f, 0.387451f, - 0.399414f, 0.410645f, 0.422607f, 0.434814f, 0.445801f, 0.458984f, 0.470703f, 0.482910f, - 0.495361f, 0.508301f, 0.520020f, 0.532227f, 0.545410f, 0.558594f, 0.570801f, 0.584961f, - 0.597656f, 0.611816f, 0.778809f, 0.768066f, 0.754883f, 0.743652f, 0.733887f, 0.725098f, - 0.003525f, 0.010956f, 0.018433f, 0.026260f, 0.033295f, 0.041870f, 0.049377f, 0.057709f, - 0.065735f, 0.074463f, 0.082764f, 0.091736f, 0.099976f, 0.108582f, 0.118103f, 0.126465f, - 0.135742f, 0.144775f, 0.154175f, 0.164307f, 0.173218f, 0.182983f, 0.192505f, 0.202759f, - 0.212646f, 0.221924f, 0.232910f, 0.242188f, 0.252930f, 0.262939f, 0.273926f, 0.284180f, - 0.294922f, 0.305420f, 0.316162f, 0.327637f, 0.338867f, 0.349609f, 0.361084f, 0.371826f, - 0.382812f, 0.395020f, 0.406494f, 0.417725f, 0.429688f, 0.441406f, 0.452637f, 0.465088f, - 0.477783f, 0.489258f, 0.501953f, 0.514160f, 0.527344f, 0.539062f, 0.551758f, 0.564941f, - 0.578125f, 0.591797f, 0.768555f, 0.759277f, 0.748047f, 0.736816f, 0.728027f, 0.718750f, - 0.003363f, 0.010353f, 0.017548f, 0.024765f, 0.032196f, 0.039673f, 0.046936f, 0.054565f, - 0.062561f, 0.070496f, 0.078308f, 0.086731f, 0.094910f, 0.103333f, 0.111633f, 0.120422f, - 0.129150f, 0.137695f, 0.146973f, 0.155762f, 0.164673f, 0.173950f, 0.183228f, 0.193359f, - 0.201782f, 0.212036f, 0.221436f, 0.231323f, 0.241699f, 0.251221f, 0.261719f, 0.271729f, - 0.281494f, 0.291992f, 0.302734f, 0.312988f, 0.323730f, 0.334961f, 0.345459f, 0.357666f, - 0.367432f, 0.378662f, 0.389893f, 0.401855f, 0.412842f, 0.424316f, 0.435791f, 0.447266f, - 0.459473f, 0.471436f, 0.482910f, 0.495605f, 0.507324f, 0.520508f, 0.533203f, 0.545898f, - 0.558594f, 0.570801f, 0.757812f, 0.750488f, 0.740234f, 0.729980f, 0.720703f, 0.712402f, - 0.003254f, 0.010048f, 0.016815f, 0.023453f, 0.030609f, 0.037537f, 0.044617f, 0.051971f, - 0.059265f, 0.066833f, 0.074280f, 0.082153f, 0.089905f, 0.097717f, 0.106018f, 0.113770f, - 0.122131f, 0.131104f, 0.139282f, 0.147705f, 0.155762f, 0.165161f, 0.173950f, 0.183228f, - 0.192139f, 0.200928f, 0.210693f, 0.220093f, 0.229736f, 0.239258f, 0.248657f, 0.259277f, - 0.268799f, 0.279053f, 0.288574f, 0.299561f, 0.309814f, 0.319580f, 0.330322f, 0.340820f, - 0.352783f, 0.362549f, 0.374023f, 0.385010f, 0.395752f, 0.407471f, 0.418701f, 0.429688f, - 0.441650f, 0.453125f, 0.465088f, 0.477539f, 0.489014f, 0.500977f, 0.513184f, 0.526855f, - 0.539062f, 0.552246f, 0.747559f, 0.741699f, 0.731934f, 0.722656f, 0.714355f, 0.707031f, - 0.003345f, 0.009262f, 0.015900f, 0.022614f, 0.029282f, 0.035522f, 0.042633f, 0.048981f, - 0.056000f, 0.063110f, 0.070801f, 0.077454f, 0.084839f, 0.092590f, 0.100281f, 0.107849f, - 0.116089f, 0.123169f, 0.131348f, 0.139648f, 0.148193f, 0.156616f, 0.164795f, 0.173584f, - 0.182617f, 0.191284f, 0.200073f, 0.208740f, 0.218140f, 0.227417f, 0.236694f, 0.246338f, - 0.255859f, 0.265381f, 0.275146f, 0.285889f, 0.294922f, 0.305420f, 0.315918f, 0.325928f, - 0.336670f, 0.347412f, 0.358154f, 0.368652f, 0.378662f, 0.390381f, 0.402100f, 0.412842f, - 0.424316f, 0.435059f, 0.447021f, 0.458984f, 0.470459f, 0.482422f, 0.494873f, 0.508301f, - 0.520020f, 0.532227f, 0.737305f, 0.732910f, 0.723633f, 0.715820f, 0.708008f, 0.700195f, - 0.003195f, 0.009010f, 0.015137f, 0.021225f, 0.027466f, 0.033844f, 0.040161f, 0.046417f, - 0.053497f, 0.059875f, 0.066711f, 0.073425f, 0.080505f, 0.087280f, 0.094788f, 0.102173f, - 0.109070f, 0.117004f, 0.124634f, 0.132446f, 0.139893f, 0.147705f, 0.155884f, 0.163940f, - 0.172729f, 0.180908f, 0.189697f, 0.198242f, 0.206665f, 0.215820f, 0.225220f, 0.233765f, - 0.243408f, 0.251953f, 0.262207f, 0.271484f, 0.281494f, 0.291260f, 0.300537f, 0.311035f, - 0.320801f, 0.332520f, 0.341797f, 0.352051f, 0.362305f, 0.373535f, 0.384521f, 0.395264f, - 0.406494f, 0.417480f, 0.429443f, 0.440430f, 0.451904f, 0.463867f, 0.476074f, 0.487793f, - 0.499268f, 0.513184f, 0.726562f, 0.723633f, 0.716309f, 0.708496f, 0.700684f, 0.694336f, - 0.002859f, 0.008507f, 0.014366f, 0.020203f, 0.026123f, 0.031891f, 0.038025f, 0.044281f, - 0.050354f, 0.056519f, 0.062683f, 0.069275f, 0.075195f, 0.082458f, 0.088806f, 0.095947f, - 0.102783f, 0.110046f, 0.117065f, 0.124878f, 0.132080f, 0.139282f, 0.146851f, 0.154907f, - 0.162598f, 0.171265f, 0.178833f, 0.187500f, 0.195435f, 0.204590f, 0.213013f, 0.221680f, - 0.231079f, 0.239502f, 0.248047f, 0.258301f, 0.267334f, 0.277100f, 0.286133f, 0.296387f, - 0.306641f, 0.316162f, 0.326416f, 0.336426f, 0.346924f, 0.357422f, 0.367188f, 0.378418f, - 0.389160f, 0.400391f, 0.411865f, 0.422852f, 0.433594f, 0.445557f, 0.457520f, 0.468994f, - 0.481445f, 0.493408f, 0.715332f, 0.715332f, 0.708984f, 0.700684f, 0.693848f, 0.687988f, - 0.002701f, 0.008080f, 0.013718f, 0.019058f, 0.024582f, 0.030197f, 0.035675f, 0.041748f, - 0.047302f, 0.053589f, 0.059082f, 0.065308f, 0.071777f, 0.077576f, 0.084106f, 0.090332f, - 0.097107f, 0.103577f, 0.110046f, 0.117493f, 0.124146f, 0.131470f, 0.138550f, 0.145508f, - 0.153564f, 0.161377f, 0.169067f, 0.176880f, 0.184814f, 0.192627f, 0.201294f, 0.209717f, - 0.218140f, 0.226929f, 0.235229f, 0.245117f, 0.253418f, 0.262939f, 0.272705f, 0.281738f, - 0.290771f, 0.300781f, 0.310791f, 0.321289f, 0.330566f, 0.341064f, 0.351562f, 0.361572f, - 0.372559f, 0.382568f, 0.393066f, 0.405273f, 0.415771f, 0.426758f, 0.438721f, 0.450439f, - 0.461670f, 0.474121f, 0.704102f, 0.706543f, 0.700195f, 0.693359f, 0.687012f, 0.681152f, - 0.002546f, 0.007771f, 0.012985f, 0.017975f, 0.023392f, 0.028976f, 0.034180f, 0.039368f, - 0.044556f, 0.050110f, 0.055847f, 0.061218f, 0.066895f, 0.072815f, 0.078674f, 0.085083f, - 0.091309f, 0.097168f, 0.103516f, 0.110107f, 0.116821f, 0.123413f, 0.130371f, 0.137329f, - 0.144165f, 0.151733f, 0.158813f, 0.166382f, 0.174438f, 0.182129f, 0.190063f, 0.197510f, - 0.206055f, 0.214355f, 0.222778f, 0.231812f, 0.240723f, 0.249023f, 0.258789f, 0.267578f, - 0.276855f, 0.285889f, 0.295654f, 0.305420f, 0.315430f, 0.324463f, 0.334961f, 0.345215f, - 0.354492f, 0.365234f, 0.376221f, 0.387451f, 0.398926f, 0.409424f, 0.419678f, 0.432129f, - 0.443848f, 0.455566f, 0.693848f, 0.697266f, 0.691895f, 0.686523f, 0.680176f, 0.674805f, - 0.002542f, 0.007271f, 0.012337f, 0.017181f, 0.021744f, 0.026840f, 0.031555f, 0.037231f, - 0.042236f, 0.046906f, 0.051941f, 0.057709f, 0.063049f, 0.068542f, 0.073853f, 0.079712f, - 0.085266f, 0.091064f, 0.096985f, 0.103027f, 0.109009f, 0.115417f, 0.122192f, 0.128540f, - 0.135132f, 0.141846f, 0.148926f, 0.156250f, 0.163696f, 0.171387f, 0.178223f, 0.186035f, - 0.194580f, 0.202271f, 0.210327f, 0.218994f, 0.227173f, 0.235596f, 0.244385f, 0.252930f, - 0.262451f, 0.271240f, 0.280762f, 0.290771f, 0.299805f, 0.309082f, 0.318359f, 0.329102f, - 0.338623f, 0.348633f, 0.358643f, 0.370117f, 0.379639f, 0.390869f, 0.401611f, 0.413330f, - 0.425293f, 0.436523f, 0.682129f, 0.688477f, 0.684082f, 0.678711f, 0.673340f, 0.667969f, - 0.002300f, 0.007076f, 0.011505f, 0.016251f, 0.020401f, 0.025665f, 0.029816f, 0.034790f, - 0.039368f, 0.044159f, 0.048798f, 0.053955f, 0.059174f, 0.064148f, 0.069153f, 0.074463f, - 0.079346f, 0.085266f, 0.090759f, 0.096191f, 0.102112f, 0.108032f, 0.114075f, 0.120117f, - 0.126587f, 0.133057f, 0.139648f, 0.146240f, 0.153442f, 0.160400f, 0.167725f, 0.174683f, - 0.182739f, 0.190308f, 0.198120f, 0.206177f, 0.214355f, 0.222656f, 0.230713f, 0.239258f, - 0.248413f, 0.257080f, 0.265869f, 0.274658f, 0.284424f, 0.292725f, 0.302490f, 0.313232f, - 0.321777f, 0.331787f, 0.341797f, 0.352295f, 0.363281f, 0.373535f, 0.383545f, 0.395264f, - 0.405762f, 0.416992f, 0.671387f, 0.679688f, 0.675293f, 0.670898f, 0.666016f, 0.661133f, - 0.002104f, 0.006474f, 0.010506f, 0.015099f, 0.018875f, 0.023911f, 0.028534f, 0.032715f, - 0.036652f, 0.041290f, 0.046021f, 0.050171f, 0.054535f, 0.059570f, 0.064575f, 0.069458f, - 0.074341f, 0.079346f, 0.084351f, 0.089844f, 0.095032f, 0.100830f, 0.106628f, 0.112122f, - 0.117859f, 0.124084f, 0.130249f, 0.136841f, 0.143188f, 0.149780f, 0.157349f, 0.163940f, - 0.171021f, 0.178345f, 0.186279f, 0.193848f, 0.201172f, 0.209717f, 0.217529f, 0.225464f, - 0.233765f, 0.242676f, 0.251221f, 0.260254f, 0.268311f, 0.278076f, 0.287109f, 0.296143f, - 0.305908f, 0.315674f, 0.325195f, 0.335449f, 0.344971f, 0.355469f, 0.365967f, 0.377441f, - 0.387939f, 0.398193f, 0.660645f, 0.670410f, 0.667969f, 0.663086f, 0.659180f, 0.654785f, - 0.002085f, 0.006306f, 0.010506f, 0.014107f, 0.018448f, 0.022293f, 0.026215f, 0.029953f, - 0.034515f, 0.038391f, 0.042786f, 0.046844f, 0.051361f, 0.055573f, 0.059784f, 0.064331f, - 0.068970f, 0.073425f, 0.078430f, 0.083313f, 0.088318f, 0.093567f, 0.098816f, 0.104126f, - 0.109924f, 0.115662f, 0.121521f, 0.127197f, 0.133545f, 0.139771f, 0.146729f, 0.153076f, - 0.160278f, 0.166992f, 0.174316f, 0.181274f, 0.188965f, 0.196045f, 0.204468f, 0.212036f, - 0.220459f, 0.228638f, 0.237183f, 0.245483f, 0.254150f, 0.262451f, 0.271484f, 0.281250f, - 0.290283f, 0.299561f, 0.308350f, 0.318115f, 0.328369f, 0.337158f, 0.349121f, 0.358887f, - 0.370117f, 0.380615f, 0.649414f, 0.661133f, 0.659668f, 0.655762f, 0.651855f, 0.647949f, - 0.001922f, 0.005867f, 0.009399f, 0.013565f, 0.017380f, 0.020859f, 0.024551f, 0.028442f, - 0.032318f, 0.035980f, 0.039551f, 0.043488f, 0.047333f, 0.051239f, 0.055573f, 0.059875f, - 0.063660f, 0.067810f, 0.072876f, 0.077087f, 0.081726f, 0.086304f, 0.091370f, 0.096863f, - 0.101746f, 0.107483f, 0.112732f, 0.117920f, 0.124329f, 0.130005f, 0.136108f, 0.142822f, - 0.149170f, 0.155396f, 0.162598f, 0.169434f, 0.176636f, 0.183838f, 0.191772f, 0.198975f, - 0.206665f, 0.214478f, 0.222290f, 0.230835f, 0.239258f, 0.247803f, 0.256836f, 0.264893f, - 0.274414f, 0.283203f, 0.292725f, 0.301758f, 0.311035f, 0.321289f, 0.332275f, 0.340820f, - 0.351562f, 0.363037f, 0.637695f, 0.652832f, 0.651367f, 0.647949f, 0.644531f, 0.641602f, - 0.002052f, 0.005253f, 0.009117f, 0.012482f, 0.016113f, 0.019302f, 0.022842f, 0.026230f, - 0.029831f, 0.033447f, 0.036682f, 0.040588f, 0.044189f, 0.047333f, 0.051178f, 0.055267f, - 0.058807f, 0.062683f, 0.067200f, 0.070984f, 0.075195f, 0.079895f, 0.084534f, 0.088806f, - 0.093933f, 0.098999f, 0.104309f, 0.109619f, 0.114807f, 0.120422f, 0.126587f, 0.132080f, - 0.138550f, 0.144775f, 0.151245f, 0.157837f, 0.164551f, 0.171387f, 0.178467f, 0.186157f, - 0.193359f, 0.201294f, 0.208740f, 0.216797f, 0.224854f, 0.233398f, 0.241211f, 0.250000f, - 0.258545f, 0.267822f, 0.276855f, 0.286133f, 0.295410f, 0.304932f, 0.314697f, 0.324463f, - 0.334229f, 0.344238f, 0.626953f, 0.642578f, 0.643066f, 0.641113f, 0.637695f, 0.634277f, - 0.001711f, 0.005424f, 0.008347f, 0.012024f, 0.014977f, 0.018066f, 0.021500f, 0.024399f, - 0.027756f, 0.030869f, 0.034058f, 0.037048f, 0.040558f, 0.044006f, 0.046906f, 0.050690f, - 0.054169f, 0.057983f, 0.061584f, 0.065247f, 0.069336f, 0.073425f, 0.077576f, 0.082092f, - 0.086670f, 0.091064f, 0.095886f, 0.101196f, 0.105957f, 0.111267f, 0.116943f, 0.122559f, - 0.128174f, 0.133789f, 0.140259f, 0.146118f, 0.153076f, 0.159424f, 0.166016f, 0.173462f, - 0.180542f, 0.187744f, 0.195435f, 0.203003f, 0.209961f, 0.218994f, 0.226562f, 0.234619f, - 0.243286f, 0.251709f, 0.260742f, 0.269531f, 0.277832f, 0.287354f, 0.297363f, 0.306885f, - 0.316406f, 0.326660f, 0.615234f, 0.633789f, 0.634277f, 0.632812f, 0.630371f, 0.626953f, - 0.001721f, 0.004829f, 0.008034f, 0.010857f, 0.013893f, 0.016953f, 0.019806f, 0.022705f, - 0.025589f, 0.028793f, 0.031616f, 0.034180f, 0.036926f, 0.039978f, 0.043213f, 0.046356f, - 0.049744f, 0.052887f, 0.056305f, 0.059906f, 0.063416f, 0.067322f, 0.070862f, 0.075134f, - 0.079285f, 0.083435f, 0.088074f, 0.092712f, 0.097534f, 0.102173f, 0.107544f, 0.112305f, - 0.118225f, 0.123657f, 0.129272f, 0.135376f, 0.141602f, 0.147705f, 0.153931f, 0.160889f, - 0.167847f, 0.174683f, 0.181885f, 0.189209f, 0.196533f, 0.204224f, 0.212524f, 0.219727f, - 0.228271f, 0.236572f, 0.245483f, 0.253418f, 0.261719f, 0.270996f, 0.280029f, 0.289307f, - 0.300537f, 0.309326f, 0.604004f, 0.625000f, 0.626953f, 0.625000f, 0.622559f, 0.620117f, - 0.001624f, 0.004730f, 0.007412f, 0.010300f, 0.013199f, 0.015717f, 0.018448f, 0.020935f, - 0.023163f, 0.026138f, 0.028687f, 0.031204f, 0.033875f, 0.036743f, 0.039825f, 0.042389f, - 0.045166f, 0.048523f, 0.051422f, 0.054535f, 0.057953f, 0.061249f, 0.064880f, 0.068542f, - 0.072388f, 0.076355f, 0.080505f, 0.084534f, 0.089294f, 0.093750f, 0.098389f, 0.103210f, - 0.108337f, 0.113647f, 0.118896f, 0.124817f, 0.130737f, 0.135986f, 0.142212f, 0.148560f, - 0.155151f, 0.162109f, 0.168579f, 0.175415f, 0.183105f, 0.190552f, 0.197998f, 0.205322f, - 0.213623f, 0.221436f, 0.229370f, 0.237915f, 0.246216f, 0.254883f, 0.264160f, 0.273438f, - 0.282471f, 0.292236f, 0.593262f, 0.615723f, 0.618164f, 0.617188f, 0.615234f, 0.612793f, - 0.001355f, 0.004463f, 0.007061f, 0.009506f, 0.011612f, 0.014381f, 0.016830f, 0.019394f, - 0.021576f, 0.023697f, 0.026428f, 0.028778f, 0.030975f, 0.033386f, 0.035950f, 0.038513f, - 0.041260f, 0.044067f, 0.046967f, 0.049622f, 0.052612f, 0.055847f, 0.059052f, 0.062164f, - 0.065918f, 0.069397f, 0.073242f, 0.077271f, 0.081055f, 0.085327f, 0.089661f, 0.094177f, - 0.098877f, 0.103455f, 0.108582f, 0.113647f, 0.119812f, 0.125000f, 0.130981f, 0.137085f, - 0.142944f, 0.149414f, 0.156006f, 0.162354f, 0.169434f, 0.176514f, 0.183716f, 0.191284f, - 0.198975f, 0.206421f, 0.214844f, 0.222412f, 0.231323f, 0.238647f, 0.247437f, 0.256592f, - 0.265625f, 0.276367f, 0.581055f, 0.606445f, 0.609863f, 0.608887f, 0.607910f, 0.606445f, - 0.001413f, 0.004128f, 0.006180f, 0.008781f, 0.010994f, 0.013496f, 0.015427f, 0.017654f, - 0.019684f, 0.021881f, 0.024139f, 0.025879f, 0.028137f, 0.030334f, 0.032471f, 0.034821f, - 0.037354f, 0.039642f, 0.042236f, 0.044708f, 0.047394f, 0.050079f, 0.053223f, 0.056244f, - 0.059479f, 0.062622f, 0.066223f, 0.069946f, 0.073608f, 0.077209f, 0.081604f, 0.085632f, - 0.089722f, 0.094360f, 0.098999f, 0.103943f, 0.108826f, 0.114319f, 0.119568f, 0.125122f, - 0.131104f, 0.137085f, 0.143433f, 0.150024f, 0.156494f, 0.163330f, 0.170044f, 0.177490f, - 0.184326f, 0.191895f, 0.199707f, 0.207764f, 0.215698f, 0.223755f, 0.231812f, 0.240845f, - 0.249756f, 0.258789f, 0.568848f, 0.598145f, 0.601562f, 0.600586f, 0.600586f, 0.599121f, - 0.001182f, 0.003773f, 0.005970f, 0.008293f, 0.010277f, 0.012512f, 0.014030f, 0.016129f, - 0.017929f, 0.019791f, 0.021683f, 0.023590f, 0.025452f, 0.027328f, 0.029404f, 0.031677f, - 0.033539f, 0.035583f, 0.037903f, 0.040314f, 0.042877f, 0.045319f, 0.048126f, 0.050690f, - 0.053436f, 0.056519f, 0.059723f, 0.062744f, 0.066284f, 0.069702f, 0.073608f, 0.077209f, - 0.081055f, 0.085754f, 0.089783f, 0.094421f, 0.099060f, 0.103821f, 0.109192f, 0.114563f, - 0.119934f, 0.125488f, 0.131104f, 0.137695f, 0.144043f, 0.149780f, 0.156738f, 0.163940f, - 0.170654f, 0.177856f, 0.185181f, 0.192871f, 0.200439f, 0.208740f, 0.216675f, 0.225342f, - 0.233521f, 0.242554f, 0.557617f, 0.587891f, 0.592285f, 0.592773f, 0.592285f, 0.592285f, - 0.001198f, 0.003677f, 0.005547f, 0.007561f, 0.009468f, 0.011253f, 0.012833f, 0.014465f, - 0.016205f, 0.017792f, 0.019394f, 0.021240f, 0.022751f, 0.024475f, 0.026260f, 0.028015f, - 0.030136f, 0.031708f, 0.034088f, 0.036102f, 0.038361f, 0.040497f, 0.042816f, 0.045288f, - 0.047882f, 0.050476f, 0.053284f, 0.056183f, 0.059174f, 0.062500f, 0.065796f, 0.069153f, - 0.072998f, 0.076904f, 0.080994f, 0.085083f, 0.089478f, 0.094116f, 0.098633f, 0.103394f, - 0.108704f, 0.113953f, 0.119934f, 0.125366f, 0.131348f, 0.137329f, 0.143555f, 0.150391f, - 0.157227f, 0.163818f, 0.170776f, 0.178467f, 0.185791f, 0.193359f, 0.201538f, 0.209717f, - 0.218018f, 0.226807f, 0.544922f, 0.578613f, 0.583984f, 0.584961f, 0.585449f, 0.584473f, - 0.001067f, 0.003101f, 0.004974f, 0.006855f, 0.008522f, 0.009949f, 0.011635f, 0.012985f, - 0.014595f, 0.016052f, 0.017685f, 0.019012f, 0.020264f, 0.021851f, 0.023346f, 0.025146f, - 0.026688f, 0.028336f, 0.030304f, 0.031860f, 0.034119f, 0.035889f, 0.038025f, 0.040283f, - 0.042450f, 0.044952f, 0.047302f, 0.050049f, 0.052765f, 0.055908f, 0.058594f, 0.061859f, - 0.064880f, 0.068481f, 0.072327f, 0.076172f, 0.080200f, 0.084290f, 0.088684f, 0.093262f, - 0.098145f, 0.102905f, 0.108337f, 0.113708f, 0.119080f, 0.125000f, 0.131348f, 0.137329f, - 0.143921f, 0.150391f, 0.157593f, 0.164551f, 0.171753f, 0.179077f, 0.186768f, 0.194702f, - 0.203003f, 0.210815f, 0.534180f, 0.569336f, 0.575684f, 0.577637f, 0.577637f, 0.577148f, - 0.001196f, 0.003178f, 0.004601f, 0.006241f, 0.007782f, 0.009262f, 0.010391f, 0.011795f, - 0.012955f, 0.014198f, 0.015518f, 0.016785f, 0.018097f, 0.019409f, 0.020782f, 0.022247f, - 0.023544f, 0.025269f, 0.026749f, 0.028152f, 0.030045f, 0.031555f, 0.033630f, 0.035645f, - 0.037567f, 0.039642f, 0.041992f, 0.044281f, 0.046692f, 0.049042f, 0.052094f, 0.054779f, - 0.057831f, 0.060760f, 0.064209f, 0.067627f, 0.071228f, 0.075256f, 0.079224f, 0.083557f, - 0.087891f, 0.092468f, 0.097168f, 0.102356f, 0.107605f, 0.113098f, 0.119019f, 0.124878f, - 0.130859f, 0.137451f, 0.144287f, 0.150635f, 0.157471f, 0.164917f, 0.171997f, 0.179932f, - 0.187378f, 0.196899f, 0.521973f, 0.560547f, 0.566895f, 0.569824f, 0.570312f, 0.568848f, - 0.001242f, 0.002674f, 0.004421f, 0.005573f, 0.006882f, 0.008354f, 0.009491f, 0.010559f, - 0.011406f, 0.012695f, 0.013893f, 0.014908f, 0.015854f, 0.017044f, 0.018234f, 0.019501f, - 0.020752f, 0.022003f, 0.023254f, 0.024689f, 0.026154f, 0.027802f, 0.029434f, 0.031113f, - 0.032898f, 0.034668f, 0.036774f, 0.038910f, 0.040802f, 0.043030f, 0.045593f, 0.048065f, - 0.050873f, 0.053680f, 0.056458f, 0.059692f, 0.062866f, 0.066467f, 0.069946f, 0.074036f, - 0.077942f, 0.082275f, 0.086731f, 0.091614f, 0.096313f, 0.101562f, 0.106934f, 0.112671f, - 0.118591f, 0.124634f, 0.130859f, 0.137207f, 0.144043f, 0.151123f, 0.157593f, 0.165283f, - 0.173218f, 0.180664f, 0.510254f, 0.550781f, 0.558105f, 0.561035f, 0.562012f, 0.562012f, - 0.000842f, 0.002552f, 0.003769f, 0.005333f, 0.006149f, 0.007298f, 0.008362f, 0.009224f, - 0.010254f, 0.011230f, 0.012108f, 0.013092f, 0.014000f, 0.014992f, 0.016006f, 0.016953f, - 0.017990f, 0.019196f, 0.020142f, 0.021622f, 0.022827f, 0.024216f, 0.025513f, 0.026993f, - 0.028564f, 0.030212f, 0.032013f, 0.033813f, 0.035706f, 0.037598f, 0.039703f, 0.041840f, - 0.044159f, 0.046539f, 0.049347f, 0.052155f, 0.055084f, 0.058228f, 0.061554f, 0.065002f, - 0.068909f, 0.072693f, 0.076599f, 0.081238f, 0.085388f, 0.090515f, 0.095764f, 0.100891f, - 0.106689f, 0.112366f, 0.118103f, 0.124634f, 0.130859f, 0.137573f, 0.144287f, 0.151855f, - 0.158447f, 0.166260f, 0.498535f, 0.541992f, 0.549805f, 0.553711f, 0.554199f, 0.554688f, - 0.000874f, 0.002186f, 0.003445f, 0.004807f, 0.005562f, 0.006607f, 0.007378f, 0.008102f, - 0.008919f, 0.009666f, 0.010513f, 0.011131f, 0.012039f, 0.012848f, 0.013779f, 0.014671f, - 0.015465f, 0.016464f, 0.017517f, 0.018585f, 0.019730f, 0.020798f, 0.022018f, 0.023300f, - 0.024612f, 0.026093f, 0.027374f, 0.029022f, 0.030624f, 0.032440f, 0.034180f, 0.036285f, - 0.038116f, 0.040344f, 0.042725f, 0.045349f, 0.047913f, 0.050476f, 0.053406f, 0.056488f, - 0.059998f, 0.063354f, 0.067383f, 0.071289f, 0.075562f, 0.079834f, 0.084656f, 0.089478f, - 0.094849f, 0.100342f, 0.106140f, 0.111877f, 0.118042f, 0.124573f, 0.130981f, 0.137451f, - 0.144653f, 0.152588f, 0.486816f, 0.531738f, 0.541016f, 0.545410f, 0.547363f, 0.546875f, - 0.000667f, 0.002001f, 0.003244f, 0.003895f, 0.004936f, 0.005608f, 0.006477f, 0.006901f, - 0.007648f, 0.008354f, 0.009132f, 0.009766f, 0.010490f, 0.011177f, 0.011780f, 0.012543f, - 0.013420f, 0.014084f, 0.015045f, 0.015961f, 0.016876f, 0.017822f, 0.018768f, 0.019958f, - 0.021255f, 0.022232f, 0.023560f, 0.024780f, 0.026108f, 0.027634f, 0.029221f, 0.030762f, - 0.032684f, 0.034576f, 0.036621f, 0.038605f, 0.040985f, 0.043488f, 0.046021f, 0.049042f, - 0.051727f, 0.054901f, 0.058441f, 0.061981f, 0.065552f, 0.069885f, 0.074097f, 0.078857f, - 0.083923f, 0.088623f, 0.094360f, 0.099854f, 0.105957f, 0.111694f, 0.118164f, 0.124817f, - 0.131836f, 0.138794f, 0.474365f, 0.522949f, 0.532227f, 0.536621f, 0.538574f, 0.539062f, - 0.000876f, 0.002020f, 0.002857f, 0.003855f, 0.004436f, 0.005009f, 0.005482f, 0.006130f, - 0.006588f, 0.007084f, 0.007656f, 0.008286f, 0.008949f, 0.009506f, 0.010025f, 0.010803f, - 0.011444f, 0.012047f, 0.012802f, 0.013512f, 0.014305f, 0.015282f, 0.016052f, 0.016846f, - 0.017914f, 0.018829f, 0.019882f, 0.021027f, 0.022232f, 0.023453f, 0.024689f, 0.026169f, - 0.027573f, 0.029327f, 0.031036f, 0.032806f, 0.034882f, 0.036743f, 0.039032f, 0.041626f, - 0.044312f, 0.046936f, 0.050018f, 0.053253f, 0.056610f, 0.060272f, 0.064392f, 0.068542f, - 0.072937f, 0.078003f, 0.082886f, 0.088318f, 0.093933f, 0.099670f, 0.106140f, 0.112000f, - 0.118713f, 0.125732f, 0.463135f, 0.513672f, 0.524414f, 0.528809f, 0.530762f, 0.532227f, - 0.000573f, 0.001698f, 0.002670f, 0.003082f, 0.003735f, 0.004318f, 0.004673f, 0.005161f, - 0.005779f, 0.006203f, 0.006565f, 0.007015f, 0.007591f, 0.007965f, 0.008583f, 0.009094f, - 0.009491f, 0.010239f, 0.010780f, 0.011353f, 0.012047f, 0.012787f, 0.013504f, 0.014206f, - 0.015060f, 0.015915f, 0.016708f, 0.017685f, 0.018677f, 0.019653f, 0.020828f, 0.021866f, - 0.023224f, 0.024445f, 0.025818f, 0.027557f, 0.029114f, 0.030991f, 0.032928f, 0.035034f, - 0.037201f, 0.039581f, 0.042328f, 0.045166f, 0.048157f, 0.051392f, 0.054962f, 0.058685f, - 0.062988f, 0.067444f, 0.072021f, 0.077148f, 0.082520f, 0.088196f, 0.093750f, 0.100403f, - 0.106201f, 0.112976f, 0.450928f, 0.503906f, 0.515137f, 0.520020f, 0.522949f, 0.524414f, - 0.000643f, 0.001637f, 0.002197f, 0.002800f, 0.003376f, 0.003613f, 0.003914f, 0.004391f, - 0.004742f, 0.005150f, 0.005466f, 0.005924f, 0.006344f, 0.006645f, 0.007046f, 0.007591f, - 0.008118f, 0.008560f, 0.008934f, 0.009529f, 0.010147f, 0.010651f, 0.011276f, 0.011787f, - 0.012543f, 0.013229f, 0.013916f, 0.014740f, 0.015564f, 0.016388f, 0.017258f, 0.018188f, - 0.019257f, 0.020355f, 0.021729f, 0.022766f, 0.024277f, 0.025696f, 0.027237f, 0.029022f, - 0.030945f, 0.033020f, 0.035248f, 0.037689f, 0.040405f, 0.043182f, 0.046295f, 0.049866f, - 0.053528f, 0.057526f, 0.061920f, 0.066284f, 0.071716f, 0.077209f, 0.082703f, 0.088196f, - 0.094177f, 0.101074f, 0.438965f, 0.494629f, 0.507324f, 0.512207f, 0.515137f, 0.516113f, - 0.000484f, 0.001272f, 0.001968f, 0.002327f, 0.002573f, 0.003054f, 0.003338f, 0.003660f, - 0.003906f, 0.004303f, 0.004658f, 0.004921f, 0.005222f, 0.005547f, 0.005878f, 0.006290f, - 0.006542f, 0.007015f, 0.007442f, 0.007851f, 0.008339f, 0.008713f, 0.009247f, 0.009811f, - 0.010345f, 0.010849f, 0.011490f, 0.012123f, 0.012733f, 0.013428f, 0.014183f, 0.014961f, - 0.015839f, 0.016815f, 0.017731f, 0.018768f, 0.019821f, 0.021072f, 0.022385f, 0.023727f, - 0.025345f, 0.027084f, 0.028946f, 0.030914f, 0.033295f, 0.035614f, 0.038513f, 0.041473f, - 0.044678f, 0.048462f, 0.052338f, 0.056671f, 0.061310f, 0.066101f, 0.071533f, 0.077148f, - 0.083069f, 0.089172f, 0.427246f, 0.485352f, 0.498535f, 0.503906f, 0.508301f, 0.509766f, - 0.000416f, 0.001121f, 0.001410f, 0.001959f, 0.002159f, 0.002558f, 0.002724f, 0.002939f, - 0.003220f, 0.003447f, 0.003733f, 0.003944f, 0.004219f, 0.004578f, 0.004810f, 0.005100f, - 0.005402f, 0.005783f, 0.006077f, 0.006382f, 0.006729f, 0.007141f, 0.007526f, 0.007965f, - 0.008354f, 0.008858f, 0.009300f, 0.009789f, 0.010452f, 0.010986f, 0.011658f, 0.012131f, - 0.012833f, 0.013702f, 0.014435f, 0.015266f, 0.016113f, 0.017136f, 0.018143f, 0.019241f, - 0.020493f, 0.021820f, 0.023346f, 0.025085f, 0.027023f, 0.028976f, 0.031174f, 0.033966f, - 0.036743f, 0.039856f, 0.043396f, 0.047180f, 0.051605f, 0.056152f, 0.061127f, 0.066284f, - 0.072021f, 0.078247f, 0.415283f, 0.475586f, 0.490234f, 0.496338f, 0.499756f, 0.501953f, - 0.000493f, 0.001126f, 0.001391f, 0.001574f, 0.001786f, 0.002073f, 0.002188f, 0.002417f, - 0.002657f, 0.002785f, 0.002964f, 0.003189f, 0.003384f, 0.003687f, 0.003859f, 0.004124f, - 0.004330f, 0.004555f, 0.004890f, 0.005119f, 0.005451f, 0.005749f, 0.006054f, 0.006348f, - 0.006683f, 0.007050f, 0.007458f, 0.007889f, 0.008339f, 0.008751f, 0.009323f, 0.009766f, - 0.010353f, 0.010887f, 0.011520f, 0.012192f, 0.012932f, 0.013748f, 0.014542f, 0.015434f, - 0.016434f, 0.017471f, 0.018723f, 0.019989f, 0.021500f, 0.023117f, 0.024948f, 0.027100f, - 0.029770f, 0.032166f, 0.035248f, 0.038696f, 0.042633f, 0.046875f, 0.051605f, 0.056427f, - 0.061859f, 0.067688f, 0.403320f, 0.467041f, 0.480957f, 0.487793f, 0.491699f, 0.494385f, - 0.000336f, 0.000673f, 0.001150f, 0.001274f, 0.001482f, 0.001630f, 0.001748f, 0.001904f, - 0.002087f, 0.002232f, 0.002306f, 0.002497f, 0.002672f, 0.002872f, 0.003092f, 0.003225f, - 0.003387f, 0.003553f, 0.003819f, 0.003979f, 0.004230f, 0.004517f, 0.004738f, 0.005016f, - 0.005322f, 0.005569f, 0.005848f, 0.006184f, 0.006573f, 0.006851f, 0.007271f, 0.007660f, - 0.008064f, 0.008568f, 0.009048f, 0.009567f, 0.010139f, 0.010788f, 0.011391f, 0.012161f, - 0.012939f, 0.013763f, 0.014694f, 0.015717f, 0.016815f, 0.018097f, 0.019714f, 0.021149f, - 0.023270f, 0.025421f, 0.028015f, 0.030991f, 0.034271f, 0.038116f, 0.042328f, 0.046997f, - 0.052094f, 0.057770f, 0.391113f, 0.457031f, 0.472412f, 0.479736f, 0.484375f, 0.486816f, - 0.000309f, 0.000612f, 0.000953f, 0.001086f, 0.001191f, 0.001281f, 0.001351f, 0.001442f, - 0.001610f, 0.001733f, 0.001783f, 0.001991f, 0.002087f, 0.002232f, 0.002337f, 0.002495f, - 0.002611f, 0.002775f, 0.002935f, 0.003101f, 0.003302f, 0.003496f, 0.003622f, 0.003839f, - 0.004047f, 0.004265f, 0.004494f, 0.004738f, 0.005039f, 0.005272f, 0.005650f, 0.005898f, - 0.006210f, 0.006588f, 0.006950f, 0.007332f, 0.007782f, 0.008240f, 0.008766f, 0.009331f, - 0.009964f, 0.010612f, 0.011314f, 0.012062f, 0.013023f, 0.014038f, 0.015007f, 0.016251f, - 0.017761f, 0.019501f, 0.021530f, 0.023926f, 0.026718f, 0.030106f, 0.033905f, 0.038361f, - 0.043060f, 0.048370f, 0.379395f, 0.446777f, 0.464111f, 0.471191f, 0.475586f, 0.479492f, - 0.000439f, 0.000476f, 0.000672f, 0.000752f, 0.000810f, 0.000949f, 0.001011f, 0.001121f, - 0.001160f, 0.001249f, 0.001408f, 0.001493f, 0.001591f, 0.001719f, 0.001788f, 0.001845f, - 0.001982f, 0.002106f, 0.002201f, 0.002357f, 0.002460f, 0.002598f, 0.002724f, 0.002869f, - 0.003036f, 0.003187f, 0.003397f, 0.003569f, 0.003763f, 0.004017f, 0.004211f, 0.004414f, - 0.004704f, 0.004890f, 0.005234f, 0.005524f, 0.005825f, 0.006187f, 0.006535f, 0.006977f, - 0.007423f, 0.007874f, 0.008553f, 0.009079f, 0.009857f, 0.010567f, 0.011360f, 0.012306f, - 0.013390f, 0.014702f, 0.016220f, 0.017960f, 0.020157f, 0.022995f, 0.026352f, 0.030212f, - 0.034790f, 0.039459f, 0.368408f, 0.437744f, 0.455322f, 0.463379f, 0.468018f, 0.471436f, - 0.000202f, 0.000437f, 0.000488f, 0.000579f, 0.000664f, 0.000692f, 0.000792f, 0.000762f, - 0.000875f, 0.000949f, 0.001038f, 0.001068f, 0.001116f, 0.001196f, 0.001300f, 0.001352f, - 0.001458f, 0.001529f, 0.001623f, 0.001667f, 0.001770f, 0.001884f, 0.001989f, 0.002071f, - 0.002203f, 0.002310f, 0.002445f, 0.002556f, 0.002680f, 0.002876f, 0.002991f, 0.003206f, - 0.003365f, 0.003531f, 0.003759f, 0.003956f, 0.004227f, 0.004513f, 0.004768f, 0.005074f, - 0.005402f, 0.005756f, 0.006142f, 0.006603f, 0.007160f, 0.007645f, 0.008339f, 0.008987f, - 0.009819f, 0.010780f, 0.011803f, 0.013153f, 0.014763f, 0.016876f, 0.019623f, 0.022995f, - 0.026978f, 0.031708f, 0.356445f, 0.428223f, 0.446533f, 0.455078f, 0.460449f, 0.463379f, - 0.000126f, 0.000241f, 0.000344f, 0.000353f, 0.000437f, 0.000522f, 0.000513f, 0.000552f, - 0.000613f, 0.000699f, 0.000717f, 0.000727f, 0.000763f, 0.000848f, 0.000877f, 0.000956f, - 0.000963f, 0.001068f, 0.001128f, 0.001170f, 0.001238f, 0.001311f, 0.001385f, 0.001454f, - 0.001534f, 0.001603f, 0.001714f, 0.001779f, 0.001885f, 0.002016f, 0.002092f, 0.002214f, - 0.002331f, 0.002460f, 0.002613f, 0.002777f, 0.002924f, 0.003120f, 0.003298f, 0.003496f, - 0.003708f, 0.004009f, 0.004292f, 0.004601f, 0.004951f, 0.005341f, 0.005772f, 0.006260f, - 0.006901f, 0.007572f, 0.008324f, 0.009300f, 0.010445f, 0.011848f, 0.013870f, 0.016678f, - 0.020218f, 0.024536f, 0.345703f, 0.419189f, 0.437500f, 0.447021f, 0.452393f, 0.455811f, - 0.000146f, 0.000240f, 0.000268f, 0.000268f, 0.000310f, 0.000311f, 0.000331f, 0.000366f, - 0.000410f, 0.000447f, 0.000446f, 0.000517f, 0.000511f, 0.000571f, 0.000596f, 0.000618f, - 0.000674f, 0.000691f, 0.000723f, 0.000762f, 0.000822f, 0.000856f, 0.000912f, 0.000950f, - 0.001014f, 0.001049f, 0.001128f, 0.001188f, 0.001237f, 0.001303f, 0.001371f, 0.001466f, - 0.001532f, 0.001623f, 0.001701f, 0.001805f, 0.001945f, 0.002035f, 0.002186f, 0.002329f, - 0.002460f, 0.002632f, 0.002819f, 0.003012f, 0.003271f, 0.003550f, 0.003819f, 0.004162f, - 0.004539f, 0.005024f, 0.005585f, 0.006233f, 0.007050f, 0.008072f, 0.009331f, 0.011269f, - 0.014160f, 0.018112f, 0.333740f, 0.408447f, 0.428711f, 0.438232f, 0.443359f, 0.447510f, - 0.000053f, 0.000163f, 0.000155f, 0.000160f, 0.000191f, 0.000228f, 0.000206f, 0.000233f, - 0.000248f, 0.000263f, 0.000267f, 0.000294f, 0.000324f, 0.000335f, 0.000364f, 0.000378f, - 0.000396f, 0.000435f, 0.000445f, 0.000490f, 0.000502f, 0.000522f, 0.000543f, 0.000582f, - 0.000619f, 0.000665f, 0.000679f, 0.000705f, 0.000755f, 0.000797f, 0.000856f, 0.000887f, - 0.000953f, 0.000988f, 0.001043f, 0.001103f, 0.001177f, 0.001256f, 0.001331f, 0.001410f, - 0.001508f, 0.001612f, 0.001734f, 0.001873f, 0.001999f, 0.002163f, 0.002378f, 0.002565f, - 0.002827f, 0.003119f, 0.003479f, 0.003899f, 0.004463f, 0.005116f, 0.005951f, 0.007153f, - 0.009163f, 0.012535f, 0.322510f, 0.400146f, 0.420654f, 0.430176f, 0.436523f, 0.440430f, - 0.000097f, 0.000107f, 0.000095f, 0.000087f, 0.000107f, 0.000110f, 0.000137f, 0.000139f, - 0.000140f, 0.000147f, 0.000168f, 0.000175f, 0.000177f, 0.000184f, 0.000210f, 0.000200f, - 0.000224f, 0.000239f, 0.000246f, 0.000258f, 0.000278f, 0.000288f, 0.000312f, 0.000324f, - 0.000347f, 0.000368f, 0.000382f, 0.000395f, 0.000418f, 0.000440f, 0.000471f, 0.000495f, - 0.000521f, 0.000547f, 0.000577f, 0.000620f, 0.000649f, 0.000695f, 0.000749f, 0.000785f, - 0.000838f, 0.000897f, 0.000972f, 0.001028f, 0.001118f, 0.001204f, 0.001316f, 0.001432f, - 0.001580f, 0.001748f, 0.001961f, 0.002207f, 0.002533f, 0.002941f, 0.003487f, 0.004223f, - 0.005371f, 0.007809f, 0.311523f, 0.390381f, 0.411377f, 0.421875f, 0.428467f, 0.432617f, - 0.000000f, 0.000055f, 0.000046f, 0.000054f, 0.000060f, 0.000058f, 0.000060f, 0.000068f, - 0.000068f, 0.000082f, 0.000076f, 0.000078f, 0.000092f, 0.000087f, 0.000091f, 0.000097f, - 0.000105f, 0.000115f, 0.000118f, 0.000124f, 0.000128f, 0.000133f, 0.000139f, 0.000154f, - 0.000160f, 0.000172f, 0.000175f, 0.000191f, 0.000201f, 0.000211f, 0.000221f, 0.000238f, - 0.000242f, 0.000257f, 0.000277f, 0.000295f, 0.000309f, 0.000326f, 0.000351f, 0.000375f, - 0.000400f, 0.000428f, 0.000459f, 0.000490f, 0.000535f, 0.000579f, 0.000626f, 0.000683f, - 0.000754f, 0.000836f, 0.000952f, 0.001064f, 0.001237f, 0.001460f, 0.001751f, 0.002157f, - 0.002800f, 0.004189f, 0.299561f, 0.380127f, 0.403076f, 0.413574f, 0.419922f, 0.424072f, - 0.000059f, 0.000039f, 0.000032f, 0.000028f, 0.000025f, 0.000025f, 0.000025f, 0.000024f, - 0.000023f, 0.000024f, 0.000026f, 0.000034f, 0.000029f, 0.000031f, 0.000038f, 0.000040f, - 0.000042f, 0.000043f, 0.000042f, 0.000043f, 0.000048f, 0.000054f, 0.000058f, 0.000056f, - 0.000060f, 0.000062f, 0.000066f, 0.000069f, 0.000072f, 0.000078f, 0.000082f, 0.000085f, - 0.000093f, 0.000096f, 0.000099f, 0.000106f, 0.000116f, 0.000123f, 0.000132f, 0.000140f, - 0.000150f, 0.000154f, 0.000167f, 0.000184f, 0.000192f, 0.000212f, 0.000231f, 0.000251f, - 0.000282f, 0.000314f, 0.000350f, 0.000401f, 0.000463f, 0.000554f, 0.000679f, 0.000861f, - 0.001157f, 0.001750f, 0.289307f, 0.371582f, 0.394043f, 0.406006f, 0.412109f, 0.417236f, - 0.000031f, 0.000020f, 0.000016f, 0.000014f, 0.000013f, 0.000012f, 0.000011f, 0.000011f, - 0.000010f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000008f, 0.000008f, 0.000009f, - 0.000009f, 0.000007f, 0.000008f, 0.000008f, 0.000010f, 0.000011f, 0.000012f, 0.000013f, - 0.000013f, 0.000013f, 0.000014f, 0.000017f, 0.000017f, 0.000016f, 0.000018f, 0.000019f, - 0.000021f, 0.000021f, 0.000022f, 0.000025f, 0.000027f, 0.000025f, 0.000028f, 0.000030f, - 0.000033f, 0.000036f, 0.000038f, 0.000040f, 0.000042f, 0.000047f, 0.000052f, 0.000057f, - 0.000060f, 0.000068f, 0.000073f, 0.000089f, 0.000104f, 0.000124f, 0.000153f, 0.000204f, - 0.000293f, 0.000497f, 0.278076f, 0.362793f, 0.385498f, 0.397705f, 0.405029f, 0.409912f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000003f, 0.000003f, 0.000004f, 0.000004f, 0.000005f, 0.000005f, 0.000008f, - 0.000012f, 0.000026f, 0.267822f, 0.353027f, 0.376953f, 0.388916f, 0.395996f, 0.401367f, - }, - { - 0.006824f, 0.021286f, 0.036285f, 0.051208f, 0.066467f, 0.082825f, 0.098694f, 0.114563f, - 0.130737f, 0.146973f, 0.162720f, 0.179932f, 0.196411f, 0.212646f, 0.229370f, 0.246338f, - 0.263184f, 0.279785f, 0.297363f, 0.314209f, 0.331055f, 0.348389f, 0.365479f, 0.383301f, - 0.400146f, 0.417725f, 0.435303f, 0.451904f, 0.469971f, 0.486816f, 0.503906f, 0.521484f, - 0.539551f, 0.556641f, 0.573730f, 0.592285f, 0.609375f, 0.627441f, 0.644531f, 0.662598f, - 0.679688f, 0.696777f, 0.714355f, 0.731934f, 0.749512f, 0.768066f, 0.784180f, 0.802246f, - 0.820312f, 0.837891f, 0.854980f, 0.871582f, 0.889648f, 0.906738f, 0.924805f, 0.941406f, - 0.959473f, 0.976074f, 0.953125f, 0.895020f, 0.857422f, 0.827637f, 0.803223f, 0.781738f, - 0.006741f, 0.020706f, 0.035187f, 0.049866f, 0.065125f, 0.079895f, 0.095581f, 0.111206f, - 0.126953f, 0.142822f, 0.158569f, 0.174561f, 0.190796f, 0.207031f, 0.223511f, 0.239380f, - 0.256104f, 0.272705f, 0.289307f, 0.305664f, 0.322754f, 0.338867f, 0.356201f, 0.372314f, - 0.389404f, 0.406494f, 0.423828f, 0.440430f, 0.457520f, 0.474854f, 0.491211f, 0.508789f, - 0.525391f, 0.541992f, 0.559082f, 0.576660f, 0.594238f, 0.610840f, 0.627930f, 0.645508f, - 0.662598f, 0.679199f, 0.696289f, 0.713379f, 0.731445f, 0.747559f, 0.765137f, 0.782715f, - 0.799805f, 0.816895f, 0.834473f, 0.851074f, 0.868164f, 0.884766f, 0.902344f, 0.919434f, - 0.936523f, 0.953613f, 0.942871f, 0.887695f, 0.851562f, 0.823730f, 0.799805f, 0.779297f, - 0.006504f, 0.020004f, 0.033875f, 0.048676f, 0.063110f, 0.077759f, 0.092712f, 0.108032f, - 0.123230f, 0.138672f, 0.153931f, 0.170044f, 0.185791f, 0.200806f, 0.217041f, 0.233276f, - 0.248901f, 0.265137f, 0.280762f, 0.297363f, 0.313721f, 0.329834f, 0.346680f, 0.363037f, - 0.378418f, 0.395752f, 0.411621f, 0.428467f, 0.445312f, 0.461670f, 0.479004f, 0.494873f, - 0.511230f, 0.527832f, 0.544434f, 0.561523f, 0.578613f, 0.594727f, 0.611328f, 0.628906f, - 0.645508f, 0.662109f, 0.679199f, 0.695312f, 0.712402f, 0.729004f, 0.746094f, 0.762695f, - 0.779297f, 0.796387f, 0.812500f, 0.829590f, 0.846191f, 0.863281f, 0.879395f, 0.896973f, - 0.914062f, 0.930176f, 0.932129f, 0.879395f, 0.845703f, 0.818848f, 0.795898f, 0.776367f, - 0.006226f, 0.019318f, 0.032959f, 0.046631f, 0.060699f, 0.075745f, 0.089966f, 0.104553f, - 0.119385f, 0.134277f, 0.149292f, 0.164917f, 0.179932f, 0.195190f, 0.210693f, 0.226562f, - 0.242188f, 0.257568f, 0.273438f, 0.289062f, 0.304932f, 0.320557f, 0.336426f, 0.352539f, - 0.368652f, 0.384766f, 0.400391f, 0.417236f, 0.433105f, 0.448730f, 0.465088f, 0.481689f, - 0.497559f, 0.513672f, 0.528809f, 0.546875f, 0.562500f, 0.578613f, 0.595215f, 0.612793f, - 0.627930f, 0.645508f, 0.661621f, 0.677246f, 0.693848f, 0.709961f, 0.726562f, 0.743164f, - 0.759766f, 0.774902f, 0.791992f, 0.808594f, 0.825195f, 0.841309f, 0.856934f, 0.874023f, - 0.890625f, 0.907715f, 0.921387f, 0.872070f, 0.839355f, 0.813477f, 0.791504f, 0.772461f, - 0.005928f, 0.018997f, 0.031830f, 0.045380f, 0.059235f, 0.072754f, 0.087463f, 0.101562f, - 0.115723f, 0.130371f, 0.145264f, 0.159668f, 0.175049f, 0.189453f, 0.204468f, 0.219482f, - 0.234497f, 0.250000f, 0.266113f, 0.280273f, 0.295410f, 0.311768f, 0.327393f, 0.343018f, - 0.357422f, 0.373779f, 0.389404f, 0.404785f, 0.421143f, 0.437012f, 0.452881f, 0.468262f, - 0.484375f, 0.499512f, 0.515137f, 0.531738f, 0.546875f, 0.562500f, 0.579102f, 0.595215f, - 0.610840f, 0.627441f, 0.643555f, 0.659180f, 0.674805f, 0.691406f, 0.708008f, 0.723145f, - 0.738770f, 0.755371f, 0.771484f, 0.787598f, 0.803711f, 0.819824f, 0.835449f, 0.851562f, - 0.867676f, 0.884277f, 0.910156f, 0.864258f, 0.832520f, 0.808105f, 0.787109f, 0.769043f, - 0.005939f, 0.018066f, 0.030991f, 0.043488f, 0.057312f, 0.070557f, 0.084473f, 0.098328f, - 0.112610f, 0.126587f, 0.140259f, 0.154907f, 0.169678f, 0.184326f, 0.198608f, 0.213379f, - 0.227783f, 0.242065f, 0.257568f, 0.272705f, 0.287109f, 0.302246f, 0.318115f, 0.333252f, - 0.347656f, 0.362549f, 0.378418f, 0.393555f, 0.408936f, 0.423828f, 0.439697f, 0.455078f, - 0.471191f, 0.484863f, 0.500488f, 0.517578f, 0.532227f, 0.547363f, 0.562500f, 0.579102f, - 0.594727f, 0.610352f, 0.625488f, 0.641602f, 0.657227f, 0.671875f, 0.687500f, 0.704102f, - 0.719238f, 0.733887f, 0.750488f, 0.767090f, 0.782715f, 0.798340f, 0.813965f, 0.830566f, - 0.845215f, 0.862305f, 0.899902f, 0.855469f, 0.825684f, 0.801758f, 0.782227f, 0.764648f, - 0.005684f, 0.017639f, 0.030334f, 0.042572f, 0.055298f, 0.068054f, 0.081787f, 0.095276f, - 0.108765f, 0.122192f, 0.136353f, 0.150513f, 0.164307f, 0.178467f, 0.192627f, 0.206665f, - 0.221436f, 0.234985f, 0.249634f, 0.264404f, 0.278564f, 0.293213f, 0.308350f, 0.321533f, - 0.337646f, 0.353027f, 0.367432f, 0.381592f, 0.395996f, 0.411865f, 0.426758f, 0.441895f, - 0.456543f, 0.471680f, 0.485840f, 0.501465f, 0.517090f, 0.531738f, 0.546387f, 0.562012f, - 0.576660f, 0.592773f, 0.608398f, 0.623047f, 0.638672f, 0.654297f, 0.668457f, 0.684082f, - 0.699707f, 0.714844f, 0.730469f, 0.745605f, 0.761230f, 0.777832f, 0.791504f, 0.807617f, - 0.823242f, 0.839355f, 0.889160f, 0.847656f, 0.818848f, 0.796387f, 0.776855f, 0.760254f, - 0.005417f, 0.017136f, 0.028778f, 0.041016f, 0.054047f, 0.066528f, 0.079590f, 0.092102f, - 0.105225f, 0.118652f, 0.131714f, 0.145630f, 0.158813f, 0.172607f, 0.186523f, 0.200317f, - 0.213745f, 0.227905f, 0.242188f, 0.256104f, 0.270020f, 0.283936f, 0.299072f, 0.312744f, - 0.327148f, 0.341797f, 0.355957f, 0.369629f, 0.384766f, 0.399414f, 0.413574f, 0.427490f, - 0.443115f, 0.457764f, 0.472656f, 0.487061f, 0.501465f, 0.516602f, 0.530762f, 0.545898f, - 0.560547f, 0.574707f, 0.589844f, 0.605469f, 0.619629f, 0.633301f, 0.648926f, 0.665527f, - 0.679688f, 0.694824f, 0.709961f, 0.725586f, 0.739746f, 0.755371f, 0.770020f, 0.786133f, - 0.802246f, 0.817383f, 0.877930f, 0.838867f, 0.812012f, 0.790039f, 0.771973f, 0.755371f, - 0.005520f, 0.016464f, 0.027695f, 0.039948f, 0.051575f, 0.063965f, 0.076660f, 0.089111f, - 0.101807f, 0.114319f, 0.126953f, 0.140381f, 0.153564f, 0.166992f, 0.180298f, 0.193970f, - 0.207153f, 0.220337f, 0.234131f, 0.248169f, 0.261475f, 0.275146f, 0.288818f, 0.302734f, - 0.316162f, 0.330566f, 0.345459f, 0.358887f, 0.372803f, 0.386719f, 0.401367f, 0.415527f, - 0.429199f, 0.443848f, 0.458008f, 0.472412f, 0.486572f, 0.500977f, 0.515137f, 0.529785f, - 0.544434f, 0.558105f, 0.572754f, 0.587891f, 0.601074f, 0.617188f, 0.631836f, 0.645020f, - 0.660645f, 0.674805f, 0.689453f, 0.704590f, 0.719727f, 0.734375f, 0.750000f, 0.764160f, - 0.780273f, 0.794922f, 0.866699f, 0.830566f, 0.804688f, 0.784180f, 0.766113f, 0.750977f, - 0.005222f, 0.016022f, 0.026962f, 0.038086f, 0.050049f, 0.061798f, 0.074158f, 0.085876f, - 0.098145f, 0.110718f, 0.122986f, 0.135864f, 0.148438f, 0.161133f, 0.173584f, 0.187378f, - 0.199707f, 0.213501f, 0.226440f, 0.240112f, 0.252441f, 0.266113f, 0.279785f, 0.292725f, - 0.306152f, 0.320068f, 0.333984f, 0.347900f, 0.361572f, 0.374512f, 0.387695f, 0.402344f, - 0.416504f, 0.429688f, 0.443604f, 0.458008f, 0.471680f, 0.485596f, 0.499023f, 0.513184f, - 0.527832f, 0.541016f, 0.555664f, 0.569336f, 0.583984f, 0.598633f, 0.612793f, 0.626465f, - 0.641602f, 0.656250f, 0.669922f, 0.684570f, 0.698730f, 0.713867f, 0.728516f, 0.742188f, - 0.757812f, 0.771484f, 0.855957f, 0.822266f, 0.797852f, 0.777832f, 0.760742f, 0.746094f, - 0.004944f, 0.015327f, 0.026230f, 0.037201f, 0.048187f, 0.059448f, 0.071167f, 0.082642f, - 0.094727f, 0.106506f, 0.119019f, 0.130371f, 0.143555f, 0.155640f, 0.167725f, 0.180908f, - 0.193604f, 0.206177f, 0.218506f, 0.231812f, 0.244873f, 0.257568f, 0.270996f, 0.283203f, - 0.296387f, 0.309814f, 0.322754f, 0.336670f, 0.348877f, 0.362061f, 0.376465f, 0.389893f, - 0.402588f, 0.415283f, 0.429443f, 0.443115f, 0.457031f, 0.470459f, 0.483887f, 0.497314f, - 0.511230f, 0.524414f, 0.538574f, 0.551758f, 0.565918f, 0.579590f, 0.593750f, 0.606934f, - 0.621094f, 0.635254f, 0.649902f, 0.664062f, 0.678223f, 0.692871f, 0.707031f, 0.721191f, - 0.735840f, 0.750488f, 0.846191f, 0.813477f, 0.790527f, 0.770996f, 0.754883f, 0.740723f, - 0.004951f, 0.014656f, 0.025253f, 0.035309f, 0.046417f, 0.057465f, 0.068665f, 0.079773f, - 0.091370f, 0.102844f, 0.114441f, 0.126099f, 0.138062f, 0.150391f, 0.161987f, 0.174561f, - 0.186523f, 0.198730f, 0.211060f, 0.223267f, 0.235352f, 0.248779f, 0.260986f, 0.274414f, - 0.286621f, 0.298584f, 0.312256f, 0.324463f, 0.337158f, 0.350342f, 0.363281f, 0.376953f, - 0.389404f, 0.402344f, 0.415283f, 0.428955f, 0.441162f, 0.455322f, 0.467285f, 0.481201f, - 0.493896f, 0.507324f, 0.520996f, 0.534668f, 0.547852f, 0.561035f, 0.575195f, 0.588867f, - 0.603027f, 0.616211f, 0.630371f, 0.643555f, 0.658203f, 0.671875f, 0.686035f, 0.699707f, - 0.714844f, 0.729492f, 0.833984f, 0.804688f, 0.782227f, 0.764160f, 0.749512f, 0.735352f, - 0.004700f, 0.014343f, 0.024200f, 0.034515f, 0.044586f, 0.055176f, 0.066162f, 0.077209f, - 0.087830f, 0.098816f, 0.110413f, 0.121826f, 0.132690f, 0.144897f, 0.156372f, 0.168213f, - 0.179443f, 0.191650f, 0.203369f, 0.215088f, 0.227661f, 0.239990f, 0.251709f, 0.263916f, - 0.276611f, 0.289551f, 0.301270f, 0.313965f, 0.325928f, 0.338135f, 0.350586f, 0.363037f, - 0.376465f, 0.388428f, 0.401123f, 0.414062f, 0.426514f, 0.439209f, 0.452393f, 0.465088f, - 0.478271f, 0.491455f, 0.503906f, 0.517090f, 0.530273f, 0.543457f, 0.556641f, 0.570312f, - 0.583008f, 0.597168f, 0.610352f, 0.624512f, 0.638184f, 0.651367f, 0.665527f, 0.679199f, - 0.692871f, 0.708496f, 0.823242f, 0.796387f, 0.774902f, 0.757812f, 0.742676f, 0.729980f, - 0.004395f, 0.013802f, 0.023499f, 0.033173f, 0.043121f, 0.053345f, 0.063538f, 0.073730f, - 0.085083f, 0.095581f, 0.106140f, 0.116760f, 0.127930f, 0.139160f, 0.150757f, 0.161621f, - 0.173096f, 0.184814f, 0.196289f, 0.207520f, 0.219971f, 0.231201f, 0.242920f, 0.254150f, - 0.266602f, 0.278320f, 0.290527f, 0.302490f, 0.314209f, 0.326904f, 0.338867f, 0.349854f, - 0.362305f, 0.375488f, 0.387451f, 0.400146f, 0.412354f, 0.424805f, 0.436768f, 0.449219f, - 0.461914f, 0.475098f, 0.487061f, 0.500000f, 0.512695f, 0.525391f, 0.538574f, 0.551758f, - 0.564453f, 0.577148f, 0.590820f, 0.604004f, 0.618164f, 0.631348f, 0.644531f, 0.658203f, - 0.672363f, 0.686523f, 0.812500f, 0.786621f, 0.767090f, 0.750977f, 0.736816f, 0.724609f, - 0.004425f, 0.013405f, 0.022385f, 0.032043f, 0.041565f, 0.051605f, 0.061340f, 0.071106f, - 0.081116f, 0.091125f, 0.101868f, 0.112671f, 0.123169f, 0.133667f, 0.144897f, 0.155029f, - 0.166748f, 0.177246f, 0.188599f, 0.199585f, 0.211182f, 0.222046f, 0.233643f, 0.245361f, - 0.255615f, 0.268066f, 0.279053f, 0.291260f, 0.303223f, 0.314209f, 0.325684f, 0.338379f, - 0.349854f, 0.361572f, 0.374023f, 0.385254f, 0.397949f, 0.409912f, 0.421143f, 0.434082f, - 0.445801f, 0.457764f, 0.470215f, 0.482910f, 0.495361f, 0.508301f, 0.520996f, 0.534180f, - 0.546387f, 0.560059f, 0.572266f, 0.584961f, 0.597168f, 0.610840f, 0.624023f, 0.638184f, - 0.650879f, 0.666016f, 0.801270f, 0.778320f, 0.760254f, 0.744141f, 0.730469f, 0.719238f, - 0.004261f, 0.012543f, 0.021591f, 0.031052f, 0.039734f, 0.049164f, 0.058838f, 0.068420f, - 0.077881f, 0.087402f, 0.098145f, 0.108276f, 0.118225f, 0.128784f, 0.138550f, 0.149292f, - 0.159790f, 0.170654f, 0.181519f, 0.191772f, 0.203003f, 0.213623f, 0.225098f, 0.235107f, - 0.247070f, 0.257324f, 0.269287f, 0.280273f, 0.291260f, 0.302246f, 0.313721f, 0.325439f, - 0.336670f, 0.348145f, 0.359619f, 0.371338f, 0.382812f, 0.395020f, 0.406738f, 0.418213f, - 0.429932f, 0.442139f, 0.454102f, 0.466309f, 0.479004f, 0.490723f, 0.502930f, 0.515625f, - 0.526855f, 0.540527f, 0.552246f, 0.565918f, 0.578613f, 0.591309f, 0.604492f, 0.617188f, - 0.630859f, 0.644043f, 0.790039f, 0.769531f, 0.751953f, 0.737305f, 0.724121f, 0.713379f, - 0.003983f, 0.012329f, 0.020538f, 0.029312f, 0.038452f, 0.047241f, 0.056244f, 0.065552f, - 0.075195f, 0.084290f, 0.094238f, 0.103638f, 0.113403f, 0.123413f, 0.133057f, 0.143066f, - 0.153076f, 0.163696f, 0.173584f, 0.184204f, 0.194580f, 0.204834f, 0.215332f, 0.225952f, - 0.237305f, 0.247803f, 0.258545f, 0.269531f, 0.280518f, 0.291260f, 0.301758f, 0.312988f, - 0.324219f, 0.335205f, 0.346191f, 0.357178f, 0.368896f, 0.380127f, 0.391113f, 0.403076f, - 0.414551f, 0.426270f, 0.437500f, 0.449951f, 0.460938f, 0.473389f, 0.485596f, 0.497314f, - 0.509277f, 0.522461f, 0.533691f, 0.546875f, 0.558594f, 0.571289f, 0.583496f, 0.596680f, - 0.608887f, 0.623047f, 0.778809f, 0.761230f, 0.744141f, 0.730957f, 0.718262f, 0.707031f, - 0.003717f, 0.012016f, 0.020142f, 0.028137f, 0.036682f, 0.045441f, 0.053711f, 0.062927f, - 0.071777f, 0.080627f, 0.090210f, 0.099060f, 0.108643f, 0.118164f, 0.127808f, 0.137329f, - 0.147095f, 0.156128f, 0.166748f, 0.175903f, 0.186157f, 0.196655f, 0.206909f, 0.216797f, - 0.227417f, 0.236816f, 0.247559f, 0.258301f, 0.268799f, 0.278809f, 0.289795f, 0.299805f, - 0.310547f, 0.321777f, 0.333008f, 0.343262f, 0.354492f, 0.365234f, 0.376953f, 0.387939f, - 0.398438f, 0.410400f, 0.421387f, 0.433105f, 0.444824f, 0.455811f, 0.467529f, 0.479736f, - 0.491943f, 0.502930f, 0.515625f, 0.527344f, 0.540039f, 0.551758f, 0.563965f, 0.576660f, - 0.589844f, 0.602539f, 0.767578f, 0.751465f, 0.736328f, 0.723633f, 0.711914f, 0.701660f, - 0.003813f, 0.011337f, 0.019028f, 0.027252f, 0.035583f, 0.043396f, 0.051849f, 0.060028f, - 0.068481f, 0.077026f, 0.086121f, 0.095093f, 0.103821f, 0.112610f, 0.121765f, 0.131470f, - 0.140503f, 0.149780f, 0.159058f, 0.168701f, 0.178711f, 0.187744f, 0.197998f, 0.207397f, - 0.217651f, 0.227661f, 0.236694f, 0.246704f, 0.257080f, 0.267334f, 0.277832f, 0.288330f, - 0.298584f, 0.308838f, 0.319336f, 0.329590f, 0.340332f, 0.351318f, 0.361816f, 0.372559f, - 0.383301f, 0.395020f, 0.405273f, 0.416260f, 0.427734f, 0.439209f, 0.450195f, 0.462158f, - 0.473389f, 0.485107f, 0.497314f, 0.508301f, 0.520996f, 0.533203f, 0.544922f, 0.557617f, - 0.568848f, 0.582031f, 0.757324f, 0.742676f, 0.729004f, 0.716309f, 0.705566f, 0.695801f, - 0.003633f, 0.011040f, 0.018280f, 0.026062f, 0.033569f, 0.041229f, 0.049591f, 0.057373f, - 0.065308f, 0.073975f, 0.082214f, 0.090393f, 0.099243f, 0.107544f, 0.116028f, 0.125854f, - 0.134155f, 0.143311f, 0.151978f, 0.160767f, 0.170410f, 0.179321f, 0.188477f, 0.198242f, - 0.207764f, 0.217896f, 0.227051f, 0.236328f, 0.246338f, 0.256104f, 0.265869f, 0.276123f, - 0.285645f, 0.295898f, 0.306152f, 0.316162f, 0.326172f, 0.336914f, 0.347412f, 0.358154f, - 0.368164f, 0.378906f, 0.389648f, 0.400146f, 0.410889f, 0.421631f, 0.432861f, 0.444824f, - 0.456055f, 0.466797f, 0.479004f, 0.490234f, 0.501465f, 0.514160f, 0.525879f, 0.537598f, - 0.549316f, 0.561523f, 0.745605f, 0.733887f, 0.721191f, 0.708496f, 0.699219f, 0.689453f, - 0.003469f, 0.010429f, 0.017609f, 0.024612f, 0.032135f, 0.039520f, 0.047516f, 0.055206f, - 0.062347f, 0.070618f, 0.078308f, 0.085938f, 0.094727f, 0.102417f, 0.111511f, 0.119446f, - 0.127441f, 0.136475f, 0.144897f, 0.154175f, 0.162476f, 0.171509f, 0.180054f, 0.189697f, - 0.198486f, 0.207886f, 0.216553f, 0.225830f, 0.235229f, 0.244873f, 0.254395f, 0.263428f, - 0.273193f, 0.283203f, 0.292969f, 0.302734f, 0.312744f, 0.322510f, 0.333008f, 0.342773f, - 0.353027f, 0.363037f, 0.374023f, 0.384521f, 0.395264f, 0.405762f, 0.416260f, 0.427002f, - 0.438232f, 0.449219f, 0.460449f, 0.471924f, 0.482910f, 0.494629f, 0.506348f, 0.517578f, - 0.529785f, 0.541504f, 0.734375f, 0.725098f, 0.712891f, 0.701660f, 0.692383f, 0.683594f, - 0.003328f, 0.009804f, 0.016373f, 0.023727f, 0.030746f, 0.037994f, 0.044952f, 0.052032f, - 0.059998f, 0.067383f, 0.074707f, 0.082214f, 0.089783f, 0.097961f, 0.105774f, 0.114197f, - 0.122131f, 0.129517f, 0.137695f, 0.146118f, 0.154419f, 0.163330f, 0.171997f, 0.180664f, - 0.188477f, 0.197388f, 0.206055f, 0.215332f, 0.224365f, 0.233765f, 0.242798f, 0.251709f, - 0.260986f, 0.270020f, 0.279785f, 0.289062f, 0.299561f, 0.308594f, 0.318115f, 0.328613f, - 0.338135f, 0.348877f, 0.358154f, 0.368408f, 0.378174f, 0.388916f, 0.399658f, 0.410156f, - 0.420898f, 0.431885f, 0.442871f, 0.453369f, 0.463867f, 0.475342f, 0.486572f, 0.498535f, - 0.510742f, 0.521973f, 0.723633f, 0.715820f, 0.705078f, 0.694336f, 0.686035f, 0.677246f, - 0.003090f, 0.009628f, 0.016129f, 0.022644f, 0.029068f, 0.036407f, 0.042633f, 0.049866f, - 0.056946f, 0.063904f, 0.071167f, 0.078186f, 0.085327f, 0.092896f, 0.100098f, 0.107788f, - 0.115662f, 0.123230f, 0.131104f, 0.139160f, 0.146973f, 0.154907f, 0.162964f, 0.171265f, - 0.179565f, 0.188110f, 0.196777f, 0.204834f, 0.213745f, 0.222168f, 0.231079f, 0.239868f, - 0.248779f, 0.258057f, 0.267090f, 0.276611f, 0.285645f, 0.294434f, 0.304688f, 0.314209f, - 0.323242f, 0.332520f, 0.342773f, 0.353027f, 0.362549f, 0.373047f, 0.383057f, 0.393311f, - 0.404053f, 0.414307f, 0.424561f, 0.435059f, 0.445801f, 0.456787f, 0.467773f, 0.479004f, - 0.490479f, 0.501953f, 0.712891f, 0.707031f, 0.696777f, 0.687500f, 0.679199f, 0.671387f, - 0.003096f, 0.009026f, 0.015450f, 0.021606f, 0.027695f, 0.034302f, 0.040833f, 0.047455f, - 0.054077f, 0.060669f, 0.067444f, 0.074097f, 0.081604f, 0.088501f, 0.095337f, 0.102295f, - 0.109375f, 0.116821f, 0.124146f, 0.131592f, 0.139404f, 0.147217f, 0.155029f, 0.162231f, - 0.170288f, 0.177979f, 0.186646f, 0.194092f, 0.203247f, 0.211670f, 0.219604f, 0.228149f, - 0.236816f, 0.245605f, 0.254639f, 0.263184f, 0.272217f, 0.281250f, 0.290527f, 0.299805f, - 0.308838f, 0.318604f, 0.327637f, 0.337646f, 0.347900f, 0.356934f, 0.367432f, 0.376953f, - 0.387451f, 0.397217f, 0.407227f, 0.417480f, 0.427979f, 0.439209f, 0.449463f, 0.459717f, - 0.470947f, 0.482666f, 0.701172f, 0.698242f, 0.688477f, 0.680176f, 0.671875f, 0.665039f, - 0.002831f, 0.008789f, 0.014702f, 0.020523f, 0.026642f, 0.032684f, 0.038757f, 0.044708f, - 0.051666f, 0.057312f, 0.063660f, 0.070190f, 0.076904f, 0.083435f, 0.090454f, 0.097046f, - 0.103821f, 0.110535f, 0.117981f, 0.124817f, 0.131714f, 0.138916f, 0.146606f, 0.153687f, - 0.161011f, 0.168823f, 0.176270f, 0.184570f, 0.192139f, 0.200317f, 0.208008f, 0.216309f, - 0.224609f, 0.233032f, 0.241821f, 0.250244f, 0.258789f, 0.268066f, 0.276611f, 0.285400f, - 0.294678f, 0.303223f, 0.312500f, 0.322021f, 0.331787f, 0.340088f, 0.350830f, 0.360596f, - 0.369385f, 0.380371f, 0.389893f, 0.399658f, 0.410645f, 0.420654f, 0.430908f, 0.442383f, - 0.452148f, 0.464111f, 0.690430f, 0.688965f, 0.681152f, 0.672852f, 0.665039f, 0.658691f, - 0.002712f, 0.008553f, 0.013878f, 0.019638f, 0.025360f, 0.030716f, 0.037231f, 0.042633f, - 0.048615f, 0.054810f, 0.060638f, 0.066650f, 0.072205f, 0.078796f, 0.085083f, 0.091492f, - 0.097961f, 0.104065f, 0.110718f, 0.117859f, 0.124207f, 0.130981f, 0.138550f, 0.145142f, - 0.152588f, 0.160156f, 0.166992f, 0.174561f, 0.181885f, 0.189453f, 0.197754f, 0.205444f, - 0.213013f, 0.220825f, 0.229004f, 0.237061f, 0.246094f, 0.254639f, 0.262939f, 0.271484f, - 0.280273f, 0.288818f, 0.298584f, 0.307129f, 0.316162f, 0.325195f, 0.334229f, 0.344482f, - 0.353516f, 0.363525f, 0.372803f, 0.382812f, 0.392822f, 0.402344f, 0.412842f, 0.423096f, - 0.433350f, 0.444092f, 0.679199f, 0.679688f, 0.672852f, 0.665039f, 0.658203f, 0.651855f, - 0.002674f, 0.007828f, 0.013290f, 0.018723f, 0.023743f, 0.029160f, 0.034790f, 0.040100f, - 0.045929f, 0.051544f, 0.057068f, 0.063110f, 0.068359f, 0.074280f, 0.080078f, 0.086243f, - 0.092346f, 0.098206f, 0.104919f, 0.110779f, 0.117493f, 0.123291f, 0.130005f, 0.136963f, - 0.143677f, 0.150635f, 0.157471f, 0.164307f, 0.171631f, 0.179199f, 0.186279f, 0.193604f, - 0.201904f, 0.209229f, 0.217163f, 0.224976f, 0.233154f, 0.240967f, 0.249634f, 0.258301f, - 0.266113f, 0.274414f, 0.283691f, 0.291748f, 0.301025f, 0.310059f, 0.319336f, 0.327148f, - 0.337402f, 0.347168f, 0.355957f, 0.364746f, 0.375488f, 0.385498f, 0.394043f, 0.405273f, - 0.415283f, 0.426025f, 0.667969f, 0.670410f, 0.664551f, 0.657227f, 0.651367f, 0.645508f, - 0.002731f, 0.007622f, 0.012627f, 0.017868f, 0.022781f, 0.028107f, 0.032959f, 0.037811f, - 0.043121f, 0.048615f, 0.053925f, 0.059235f, 0.064514f, 0.070007f, 0.075562f, 0.080688f, - 0.086914f, 0.092102f, 0.098083f, 0.104309f, 0.110107f, 0.115906f, 0.122314f, 0.128540f, - 0.135010f, 0.141479f, 0.147949f, 0.154663f, 0.161865f, 0.168579f, 0.175415f, 0.182739f, - 0.191040f, 0.197510f, 0.205200f, 0.212891f, 0.219971f, 0.228638f, 0.236328f, 0.244263f, - 0.252686f, 0.260498f, 0.268799f, 0.278076f, 0.286133f, 0.294434f, 0.303223f, 0.312500f, - 0.320801f, 0.329834f, 0.339844f, 0.347656f, 0.357910f, 0.367676f, 0.376709f, 0.386963f, - 0.396729f, 0.406982f, 0.656738f, 0.662598f, 0.656738f, 0.649902f, 0.644531f, 0.638672f, - 0.002411f, 0.007168f, 0.012238f, 0.016739f, 0.021957f, 0.026184f, 0.031311f, 0.035583f, - 0.041016f, 0.045685f, 0.050568f, 0.055573f, 0.060791f, 0.065735f, 0.070557f, 0.076111f, - 0.081238f, 0.086792f, 0.092163f, 0.097534f, 0.103271f, 0.108887f, 0.114563f, 0.120605f, - 0.126587f, 0.132446f, 0.139038f, 0.145508f, 0.152100f, 0.158447f, 0.165527f, 0.171997f, - 0.178833f, 0.186035f, 0.193481f, 0.200928f, 0.207886f, 0.215820f, 0.222900f, 0.230713f, - 0.238770f, 0.246948f, 0.255127f, 0.262695f, 0.271484f, 0.280029f, 0.287842f, 0.296631f, - 0.305420f, 0.313965f, 0.322754f, 0.331787f, 0.340576f, 0.350342f, 0.359375f, 0.369385f, - 0.379150f, 0.388184f, 0.645508f, 0.652832f, 0.648438f, 0.643066f, 0.637695f, 0.632324f, - 0.002480f, 0.006691f, 0.011452f, 0.015900f, 0.020828f, 0.024734f, 0.029327f, 0.033752f, - 0.038513f, 0.042999f, 0.047638f, 0.052429f, 0.056671f, 0.061859f, 0.066040f, 0.071289f, - 0.075684f, 0.080688f, 0.086243f, 0.091248f, 0.096436f, 0.101562f, 0.107300f, 0.112366f, - 0.118347f, 0.124146f, 0.130249f, 0.135864f, 0.141968f, 0.148438f, 0.155029f, 0.161377f, - 0.167969f, 0.174683f, 0.181641f, 0.188599f, 0.195679f, 0.203247f, 0.210449f, 0.217529f, - 0.225342f, 0.233398f, 0.241577f, 0.249023f, 0.256592f, 0.264893f, 0.273193f, 0.281494f, - 0.289795f, 0.297607f, 0.306885f, 0.315430f, 0.323730f, 0.333496f, 0.342529f, 0.351318f, - 0.360840f, 0.370605f, 0.634766f, 0.643555f, 0.640625f, 0.635742f, 0.630859f, 0.625488f, - 0.002230f, 0.006477f, 0.010582f, 0.014870f, 0.019073f, 0.023270f, 0.027893f, 0.031860f, - 0.036072f, 0.040253f, 0.044373f, 0.048706f, 0.052856f, 0.057312f, 0.061859f, 0.066406f, - 0.070984f, 0.075317f, 0.080139f, 0.084839f, 0.089661f, 0.094910f, 0.099792f, 0.104858f, - 0.110718f, 0.115356f, 0.121399f, 0.126831f, 0.132690f, 0.138672f, 0.145142f, 0.151001f, - 0.157471f, 0.164185f, 0.170532f, 0.177002f, 0.184082f, 0.191040f, 0.197876f, 0.205200f, - 0.212402f, 0.219604f, 0.227295f, 0.234985f, 0.242188f, 0.250244f, 0.257812f, 0.266113f, - 0.274170f, 0.282471f, 0.290771f, 0.299072f, 0.307373f, 0.316162f, 0.326416f, 0.333984f, - 0.343750f, 0.353271f, 0.622070f, 0.634277f, 0.631836f, 0.627930f, 0.623535f, 0.619141f, - 0.002220f, 0.006039f, 0.010353f, 0.014328f, 0.017838f, 0.022141f, 0.025742f, 0.029510f, - 0.033600f, 0.037781f, 0.041443f, 0.045502f, 0.049469f, 0.053436f, 0.057190f, 0.061462f, - 0.065735f, 0.069946f, 0.074524f, 0.078674f, 0.083069f, 0.087830f, 0.092468f, 0.097412f, - 0.102783f, 0.107910f, 0.112793f, 0.118164f, 0.123901f, 0.129395f, 0.135132f, 0.140991f, - 0.147339f, 0.152954f, 0.159302f, 0.165527f, 0.172363f, 0.178589f, 0.185425f, 0.191895f, - 0.199219f, 0.206665f, 0.213989f, 0.221069f, 0.228516f, 0.236206f, 0.243042f, 0.251709f, - 0.258789f, 0.266846f, 0.275146f, 0.283203f, 0.291260f, 0.300537f, 0.308350f, 0.317627f, - 0.326904f, 0.335938f, 0.611816f, 0.625000f, 0.624023f, 0.620117f, 0.616211f, 0.612793f, - 0.001965f, 0.005882f, 0.009613f, 0.013184f, 0.016785f, 0.020370f, 0.024384f, 0.027664f, - 0.031311f, 0.035126f, 0.038727f, 0.042572f, 0.046112f, 0.049347f, 0.053253f, 0.056915f, - 0.060883f, 0.064697f, 0.068909f, 0.072693f, 0.076843f, 0.081055f, 0.085754f, 0.090088f, - 0.094849f, 0.099609f, 0.104614f, 0.109741f, 0.114746f, 0.119995f, 0.125488f, 0.130981f, - 0.136719f, 0.142700f, 0.148315f, 0.154541f, 0.160522f, 0.166870f, 0.173828f, 0.179932f, - 0.186768f, 0.193604f, 0.200439f, 0.207764f, 0.214844f, 0.221802f, 0.228882f, 0.236328f, - 0.244385f, 0.252197f, 0.259277f, 0.268066f, 0.275635f, 0.283447f, 0.292236f, 0.301270f, - 0.309570f, 0.318848f, 0.600098f, 0.616211f, 0.615234f, 0.612793f, 0.609375f, 0.605469f, - 0.001966f, 0.005653f, 0.009109f, 0.012428f, 0.015945f, 0.018967f, 0.022537f, 0.025894f, - 0.029175f, 0.032440f, 0.035797f, 0.038818f, 0.042389f, 0.046051f, 0.049072f, 0.052521f, - 0.056335f, 0.059906f, 0.063293f, 0.067017f, 0.070923f, 0.075134f, 0.078979f, 0.083496f, - 0.087646f, 0.091980f, 0.096619f, 0.101196f, 0.105957f, 0.111145f, 0.116028f, 0.121277f, - 0.126831f, 0.132080f, 0.137817f, 0.143311f, 0.149780f, 0.155029f, 0.161621f, 0.167847f, - 0.173950f, 0.180786f, 0.187622f, 0.194214f, 0.201050f, 0.207764f, 0.215210f, 0.222046f, - 0.229370f, 0.236816f, 0.244751f, 0.251953f, 0.260010f, 0.268311f, 0.276123f, 0.284180f, - 0.293213f, 0.301514f, 0.588379f, 0.606934f, 0.607422f, 0.604980f, 0.602051f, 0.599609f, - 0.001963f, 0.005333f, 0.008377f, 0.011589f, 0.014450f, 0.017593f, 0.021133f, 0.023972f, - 0.027145f, 0.030075f, 0.033295f, 0.035858f, 0.038818f, 0.041992f, 0.045288f, 0.048279f, - 0.051849f, 0.054840f, 0.058289f, 0.061737f, 0.065186f, 0.068848f, 0.072632f, 0.076721f, - 0.080505f, 0.084717f, 0.088806f, 0.093079f, 0.097717f, 0.102356f, 0.106934f, 0.111755f, - 0.116882f, 0.121887f, 0.127319f, 0.132935f, 0.138306f, 0.144287f, 0.149902f, 0.156250f, - 0.162109f, 0.168579f, 0.174316f, 0.180908f, 0.187500f, 0.194458f, 0.201538f, 0.208252f, - 0.215210f, 0.222656f, 0.229980f, 0.237061f, 0.244629f, 0.252441f, 0.260254f, 0.267334f, - 0.276123f, 0.284180f, 0.576660f, 0.597656f, 0.599609f, 0.598145f, 0.595215f, 0.591797f, - 0.001631f, 0.004906f, 0.007805f, 0.010826f, 0.013802f, 0.016983f, 0.019485f, 0.022079f, - 0.024750f, 0.027939f, 0.030136f, 0.033112f, 0.035797f, 0.038727f, 0.041443f, 0.044281f, - 0.047058f, 0.050018f, 0.053253f, 0.056396f, 0.059662f, 0.063049f, 0.066406f, 0.069946f, - 0.073730f, 0.077454f, 0.081360f, 0.085388f, 0.089417f, 0.093750f, 0.098267f, 0.102844f, - 0.107727f, 0.112244f, 0.117615f, 0.122253f, 0.127441f, 0.133057f, 0.138550f, 0.144287f, - 0.150024f, 0.156250f, 0.161987f, 0.167969f, 0.174805f, 0.181274f, 0.187744f, 0.194580f, - 0.201294f, 0.208374f, 0.215210f, 0.222412f, 0.229736f, 0.237183f, 0.244629f, 0.252197f, - 0.260010f, 0.269287f, 0.566406f, 0.588867f, 0.590820f, 0.590332f, 0.587891f, 0.585938f, - 0.001858f, 0.004318f, 0.007465f, 0.010246f, 0.012550f, 0.015793f, 0.018143f, 0.020782f, - 0.022980f, 0.025116f, 0.027924f, 0.030106f, 0.032623f, 0.035126f, 0.037720f, 0.040283f, - 0.042847f, 0.045380f, 0.048492f, 0.051300f, 0.054321f, 0.057373f, 0.060516f, 0.063599f, - 0.067139f, 0.070496f, 0.074219f, 0.078003f, 0.081848f, 0.085754f, 0.089783f, 0.093994f, - 0.098267f, 0.102783f, 0.107239f, 0.112366f, 0.117371f, 0.122498f, 0.127686f, 0.132935f, - 0.138428f, 0.144043f, 0.150024f, 0.155884f, 0.161865f, 0.168091f, 0.174316f, 0.180664f, - 0.187622f, 0.194214f, 0.200928f, 0.207520f, 0.214966f, 0.221680f, 0.229370f, 0.236816f, - 0.244751f, 0.252441f, 0.553223f, 0.579102f, 0.583496f, 0.582031f, 0.581055f, 0.579590f, - 0.001425f, 0.004284f, 0.007019f, 0.009521f, 0.011894f, 0.014191f, 0.016632f, 0.018723f, - 0.021210f, 0.023209f, 0.025482f, 0.027344f, 0.029617f, 0.032043f, 0.034210f, 0.036407f, - 0.039001f, 0.041077f, 0.043976f, 0.046448f, 0.049133f, 0.051819f, 0.054932f, 0.057770f, - 0.060730f, 0.063965f, 0.067322f, 0.070862f, 0.074280f, 0.077698f, 0.082031f, 0.085571f, - 0.089844f, 0.093994f, 0.098022f, 0.102722f, 0.107178f, 0.111877f, 0.116821f, 0.121887f, - 0.127075f, 0.132446f, 0.138062f, 0.143799f, 0.149414f, 0.155518f, 0.161377f, 0.167480f, - 0.173950f, 0.180176f, 0.186890f, 0.193481f, 0.200562f, 0.207397f, 0.214355f, 0.221313f, - 0.229492f, 0.237427f, 0.541504f, 0.570801f, 0.575195f, 0.575195f, 0.573730f, 0.572266f, - 0.001613f, 0.004181f, 0.006252f, 0.008774f, 0.011108f, 0.013054f, 0.015152f, 0.016937f, - 0.019150f, 0.021011f, 0.023163f, 0.024826f, 0.026993f, 0.028793f, 0.030823f, 0.033081f, - 0.035156f, 0.037201f, 0.039612f, 0.041748f, 0.044464f, 0.046814f, 0.049438f, 0.052155f, - 0.054840f, 0.057831f, 0.060699f, 0.063599f, 0.067078f, 0.070374f, 0.073853f, 0.077087f, - 0.081177f, 0.085083f, 0.089111f, 0.093262f, 0.097473f, 0.101929f, 0.106689f, 0.111023f, - 0.116455f, 0.121277f, 0.126343f, 0.132080f, 0.137573f, 0.142700f, 0.148682f, 0.154907f, - 0.161133f, 0.167236f, 0.173340f, 0.179688f, 0.186768f, 0.193115f, 0.200684f, 0.207275f, - 0.214233f, 0.221924f, 0.530273f, 0.561523f, 0.565430f, 0.567383f, 0.564941f, 0.564941f, - 0.001237f, 0.003775f, 0.006348f, 0.008141f, 0.010117f, 0.012184f, 0.013763f, 0.015656f, - 0.017319f, 0.018967f, 0.020645f, 0.022507f, 0.023926f, 0.025757f, 0.027573f, 0.029449f, - 0.031677f, 0.033325f, 0.035645f, 0.037659f, 0.039734f, 0.041809f, 0.044189f, 0.046692f, - 0.049133f, 0.051697f, 0.054504f, 0.057251f, 0.060059f, 0.063110f, 0.066467f, 0.069763f, - 0.072937f, 0.076477f, 0.080505f, 0.084290f, 0.088013f, 0.092407f, 0.096436f, 0.101013f, - 0.105713f, 0.110352f, 0.115356f, 0.120605f, 0.125488f, 0.130981f, 0.136353f, 0.142090f, - 0.148438f, 0.153931f, 0.159912f, 0.166260f, 0.172485f, 0.179321f, 0.185791f, 0.193115f, - 0.199463f, 0.206665f, 0.520020f, 0.552246f, 0.558105f, 0.559570f, 0.559082f, 0.557617f, - 0.001151f, 0.003399f, 0.005611f, 0.007439f, 0.009354f, 0.010925f, 0.012489f, 0.014061f, - 0.015610f, 0.017258f, 0.018845f, 0.020248f, 0.021484f, 0.023193f, 0.024796f, 0.026459f, - 0.028183f, 0.029785f, 0.031738f, 0.033386f, 0.035309f, 0.037384f, 0.039368f, 0.041626f, - 0.043701f, 0.046204f, 0.048553f, 0.051178f, 0.053955f, 0.056488f, 0.059418f, 0.062256f, - 0.065308f, 0.068542f, 0.071899f, 0.075623f, 0.079224f, 0.082947f, 0.087097f, 0.091064f, - 0.095520f, 0.099854f, 0.104736f, 0.109314f, 0.114136f, 0.119324f, 0.124756f, 0.130127f, - 0.135498f, 0.141113f, 0.146973f, 0.153198f, 0.159180f, 0.165527f, 0.172241f, 0.178711f, - 0.185425f, 0.192749f, 0.507324f, 0.543945f, 0.549316f, 0.552246f, 0.551270f, 0.551270f, - 0.001070f, 0.002996f, 0.004986f, 0.006851f, 0.008514f, 0.009850f, 0.011330f, 0.012596f, - 0.014015f, 0.015259f, 0.016586f, 0.017731f, 0.019287f, 0.020676f, 0.022079f, 0.023468f, - 0.024765f, 0.026489f, 0.028030f, 0.029465f, 0.031311f, 0.032898f, 0.034851f, 0.036743f, - 0.038940f, 0.040833f, 0.043091f, 0.045074f, 0.047729f, 0.050079f, 0.052673f, 0.055389f, - 0.058136f, 0.061188f, 0.064087f, 0.067261f, 0.070618f, 0.074158f, 0.077942f, 0.081726f, - 0.085815f, 0.089783f, 0.094055f, 0.098572f, 0.103088f, 0.107971f, 0.113037f, 0.118164f, - 0.123413f, 0.128784f, 0.134521f, 0.140137f, 0.146118f, 0.152100f, 0.158325f, 0.164307f, - 0.171387f, 0.177368f, 0.496094f, 0.534668f, 0.541992f, 0.543945f, 0.544434f, 0.544434f, - 0.001086f, 0.003069f, 0.004463f, 0.006256f, 0.007393f, 0.009026f, 0.010178f, 0.011276f, - 0.012260f, 0.013542f, 0.014648f, 0.015808f, 0.016861f, 0.017899f, 0.019333f, 0.020599f, - 0.021942f, 0.023117f, 0.024384f, 0.025833f, 0.027344f, 0.028992f, 0.030579f, 0.032318f, - 0.034149f, 0.035828f, 0.037842f, 0.039764f, 0.041901f, 0.044037f, 0.046539f, 0.048645f, - 0.051147f, 0.053894f, 0.056641f, 0.059631f, 0.062500f, 0.065735f, 0.069031f, 0.072754f, - 0.076294f, 0.080139f, 0.083984f, 0.088379f, 0.092712f, 0.097229f, 0.101929f, 0.106873f, - 0.111694f, 0.117004f, 0.122314f, 0.127930f, 0.133789f, 0.139282f, 0.145142f, 0.151367f, - 0.157349f, 0.163818f, 0.484619f, 0.525391f, 0.534180f, 0.536621f, 0.536133f, 0.536621f, - 0.001125f, 0.002892f, 0.003883f, 0.005867f, 0.006603f, 0.007935f, 0.009026f, 0.009911f, - 0.010956f, 0.012077f, 0.012909f, 0.013901f, 0.014977f, 0.015671f, 0.016983f, 0.018021f, - 0.019058f, 0.020279f, 0.021225f, 0.022598f, 0.023941f, 0.025299f, 0.026535f, 0.028107f, - 0.029755f, 0.031113f, 0.033020f, 0.034668f, 0.036682f, 0.038483f, 0.040527f, 0.042511f, - 0.044708f, 0.046936f, 0.049744f, 0.052216f, 0.054840f, 0.057800f, 0.060791f, 0.064087f, - 0.067505f, 0.071045f, 0.074463f, 0.078491f, 0.082397f, 0.086609f, 0.091248f, 0.095581f, - 0.100342f, 0.105530f, 0.110474f, 0.116272f, 0.120972f, 0.126953f, 0.132812f, 0.138672f, - 0.144287f, 0.150513f, 0.472412f, 0.516113f, 0.524902f, 0.528809f, 0.529785f, 0.529785f, - 0.000859f, 0.002470f, 0.003815f, 0.005226f, 0.005913f, 0.007206f, 0.007942f, 0.008652f, - 0.009583f, 0.010406f, 0.011223f, 0.011971f, 0.012856f, 0.013664f, 0.014664f, 0.015549f, - 0.016464f, 0.017487f, 0.018478f, 0.019592f, 0.020767f, 0.021774f, 0.023117f, 0.024338f, - 0.025604f, 0.027008f, 0.028519f, 0.029953f, 0.031525f, 0.033173f, 0.034943f, 0.036865f, - 0.038696f, 0.040863f, 0.042969f, 0.045471f, 0.048004f, 0.050293f, 0.052979f, 0.055847f, - 0.058960f, 0.062042f, 0.065491f, 0.069153f, 0.072937f, 0.076660f, 0.080750f, 0.085144f, - 0.089539f, 0.094177f, 0.099304f, 0.104187f, 0.109741f, 0.114807f, 0.120483f, 0.125977f, - 0.131836f, 0.138306f, 0.460449f, 0.507812f, 0.516602f, 0.520020f, 0.522461f, 0.522949f, - 0.000906f, 0.002359f, 0.003643f, 0.004356f, 0.005310f, 0.005989f, 0.007030f, 0.007507f, - 0.008255f, 0.009010f, 0.009834f, 0.010483f, 0.011230f, 0.011887f, 0.012573f, 0.013367f, - 0.014252f, 0.014954f, 0.015900f, 0.016785f, 0.017776f, 0.018631f, 0.019775f, 0.020874f, - 0.022110f, 0.023117f, 0.024368f, 0.025589f, 0.026932f, 0.028549f, 0.029938f, 0.031525f, - 0.033325f, 0.035187f, 0.037109f, 0.038971f, 0.041138f, 0.043396f, 0.045715f, 0.048370f, - 0.051025f, 0.053772f, 0.057129f, 0.060089f, 0.063416f, 0.067261f, 0.070679f, 0.075012f, - 0.079285f, 0.083618f, 0.088379f, 0.093018f, 0.098083f, 0.102478f, 0.108093f, 0.114380f, - 0.119507f, 0.125488f, 0.448975f, 0.498291f, 0.508789f, 0.513672f, 0.514648f, 0.516113f, - 0.000728f, 0.001932f, 0.003067f, 0.003990f, 0.004784f, 0.005295f, 0.005974f, 0.006584f, - 0.007099f, 0.007652f, 0.008255f, 0.008904f, 0.009491f, 0.010109f, 0.010658f, 0.011497f, - 0.012131f, 0.012718f, 0.013535f, 0.014336f, 0.015083f, 0.016083f, 0.016785f, 0.017761f, - 0.018738f, 0.019669f, 0.020691f, 0.021805f, 0.023010f, 0.024170f, 0.025467f, 0.026794f, - 0.028336f, 0.029922f, 0.031555f, 0.033203f, 0.035034f, 0.036987f, 0.039062f, 0.041290f, - 0.043671f, 0.046143f, 0.048920f, 0.051880f, 0.054901f, 0.058228f, 0.061615f, 0.065369f, - 0.069214f, 0.073425f, 0.077637f, 0.082214f, 0.087097f, 0.091797f, 0.096497f, 0.102356f, - 0.107483f, 0.113464f, 0.437256f, 0.489746f, 0.500977f, 0.504883f, 0.507812f, 0.509277f, - 0.000724f, 0.001842f, 0.002728f, 0.003332f, 0.004101f, 0.004707f, 0.005020f, 0.005497f, - 0.006245f, 0.006603f, 0.007027f, 0.007515f, 0.008156f, 0.008537f, 0.009125f, 0.009659f, - 0.010101f, 0.010864f, 0.011482f, 0.012070f, 0.012756f, 0.013496f, 0.014236f, 0.014931f, - 0.015808f, 0.016632f, 0.017487f, 0.018433f, 0.019379f, 0.020416f, 0.021530f, 0.022583f, - 0.023804f, 0.024979f, 0.026443f, 0.027939f, 0.029526f, 0.031235f, 0.033020f, 0.035004f, - 0.037018f, 0.039185f, 0.041595f, 0.044159f, 0.046783f, 0.049866f, 0.052856f, 0.056274f, - 0.059906f, 0.063721f, 0.067749f, 0.072327f, 0.076172f, 0.081299f, 0.085938f, 0.091309f, - 0.096558f, 0.101807f, 0.426270f, 0.480469f, 0.492676f, 0.498047f, 0.500488f, 0.501953f, - 0.000673f, 0.001715f, 0.002426f, 0.002953f, 0.003588f, 0.003944f, 0.004200f, 0.004776f, - 0.005131f, 0.005527f, 0.005886f, 0.006371f, 0.006790f, 0.007076f, 0.007538f, 0.008133f, - 0.008644f, 0.009140f, 0.009483f, 0.010071f, 0.010689f, 0.011230f, 0.011879f, 0.012474f, - 0.013222f, 0.013916f, 0.014587f, 0.015411f, 0.016190f, 0.016983f, 0.017883f, 0.018845f, - 0.019867f, 0.020935f, 0.022141f, 0.023270f, 0.024567f, 0.026001f, 0.027481f, 0.029114f, - 0.030777f, 0.032684f, 0.034698f, 0.036865f, 0.039337f, 0.041748f, 0.044647f, 0.047882f, - 0.050964f, 0.054260f, 0.058258f, 0.062195f, 0.066528f, 0.070679f, 0.075623f, 0.080505f, - 0.085510f, 0.090515f, 0.414307f, 0.472168f, 0.484131f, 0.490234f, 0.492920f, 0.495850f, - 0.000484f, 0.001445f, 0.002169f, 0.002569f, 0.002836f, 0.003317f, 0.003569f, 0.003952f, - 0.004215f, 0.004623f, 0.004959f, 0.005306f, 0.005592f, 0.005951f, 0.006306f, 0.006737f, - 0.007004f, 0.007492f, 0.007942f, 0.008331f, 0.008865f, 0.009270f, 0.009781f, 0.010338f, - 0.010887f, 0.011429f, 0.012047f, 0.012726f, 0.013336f, 0.014030f, 0.014771f, 0.015572f, - 0.016418f, 0.017258f, 0.018234f, 0.019196f, 0.020279f, 0.021423f, 0.022675f, 0.023987f, - 0.025375f, 0.027039f, 0.028702f, 0.030563f, 0.032623f, 0.034698f, 0.037262f, 0.040039f, - 0.042664f, 0.046051f, 0.049194f, 0.052948f, 0.057129f, 0.061371f, 0.065613f, 0.070007f, - 0.075317f, 0.080200f, 0.402588f, 0.462402f, 0.476807f, 0.482666f, 0.485107f, 0.487061f, - 0.000459f, 0.001265f, 0.001572f, 0.002138f, 0.002365f, 0.002775f, 0.002920f, 0.003189f, - 0.003454f, 0.003723f, 0.003986f, 0.004250f, 0.004536f, 0.004906f, 0.005150f, 0.005463f, - 0.005787f, 0.006172f, 0.006481f, 0.006794f, 0.007156f, 0.007542f, 0.007980f, 0.008430f, - 0.008827f, 0.009361f, 0.009796f, 0.010300f, 0.010910f, 0.011497f, 0.012161f, 0.012672f, - 0.013336f, 0.014183f, 0.014893f, 0.015640f, 0.016541f, 0.017517f, 0.018448f, 0.019485f, - 0.020676f, 0.021912f, 0.023392f, 0.024979f, 0.026627f, 0.028351f, 0.030457f, 0.032806f, - 0.035034f, 0.037933f, 0.041229f, 0.044373f, 0.047821f, 0.052002f, 0.056244f, 0.060547f, - 0.065247f, 0.069885f, 0.390869f, 0.453857f, 0.468018f, 0.475098f, 0.478027f, 0.480469f, - 0.000332f, 0.001075f, 0.001464f, 0.001721f, 0.001911f, 0.002235f, 0.002375f, 0.002558f, - 0.002834f, 0.002998f, 0.003185f, 0.003441f, 0.003647f, 0.003952f, 0.004139f, 0.004421f, - 0.004631f, 0.004879f, 0.005180f, 0.005447f, 0.005795f, 0.006115f, 0.006416f, 0.006718f, - 0.007099f, 0.007462f, 0.007881f, 0.008331f, 0.008797f, 0.009140f, 0.009735f, 0.010223f, - 0.010803f, 0.011337f, 0.011986f, 0.012611f, 0.013283f, 0.014076f, 0.014847f, 0.015732f, - 0.016693f, 0.017700f, 0.018784f, 0.019897f, 0.021317f, 0.022873f, 0.024429f, 0.026306f, - 0.028473f, 0.030960f, 0.033600f, 0.036407f, 0.039856f, 0.043549f, 0.047119f, 0.051392f, - 0.055969f, 0.060394f, 0.379639f, 0.444580f, 0.458984f, 0.467529f, 0.470947f, 0.472900f, - 0.000408f, 0.000770f, 0.001271f, 0.001390f, 0.001601f, 0.001762f, 0.001848f, 0.002052f, - 0.002247f, 0.002401f, 0.002491f, 0.002684f, 0.002878f, 0.003086f, 0.003304f, 0.003452f, - 0.003626f, 0.003805f, 0.004074f, 0.004257f, 0.004513f, 0.004807f, 0.005039f, 0.005299f, - 0.005638f, 0.005905f, 0.006191f, 0.006516f, 0.006927f, 0.007206f, 0.007645f, 0.008034f, - 0.008415f, 0.008911f, 0.009384f, 0.009941f, 0.010483f, 0.011116f, 0.011711f, 0.012428f, - 0.013191f, 0.013969f, 0.014862f, 0.015854f, 0.016785f, 0.017975f, 0.019348f, 0.020721f, - 0.022461f, 0.024445f, 0.026733f, 0.029175f, 0.032227f, 0.035248f, 0.038788f, 0.042755f, - 0.046967f, 0.051636f, 0.367920f, 0.435059f, 0.452148f, 0.459229f, 0.463623f, 0.466797f, - 0.000382f, 0.000669f, 0.001037f, 0.001185f, 0.001293f, 0.001379f, 0.001470f, 0.001565f, - 0.001729f, 0.001864f, 0.001928f, 0.002138f, 0.002237f, 0.002398f, 0.002510f, 0.002672f, - 0.002802f, 0.002966f, 0.003134f, 0.003319f, 0.003517f, 0.003723f, 0.003870f, 0.004089f, - 0.004311f, 0.004532f, 0.004772f, 0.005013f, 0.005314f, 0.005573f, 0.005924f, 0.006203f, - 0.006523f, 0.006897f, 0.007240f, 0.007660f, 0.008041f, 0.008530f, 0.009048f, 0.009621f, - 0.010201f, 0.010841f, 0.011467f, 0.012192f, 0.013138f, 0.013969f, 0.014931f, 0.016113f, - 0.017380f, 0.018936f, 0.020630f, 0.022751f, 0.025208f, 0.027924f, 0.031311f, 0.034851f, - 0.038879f, 0.043274f, 0.356689f, 0.426270f, 0.443848f, 0.451660f, 0.456055f, 0.459473f, - 0.000482f, 0.000542f, 0.000723f, 0.000822f, 0.000881f, 0.001025f, 0.001100f, 0.001209f, - 0.001249f, 0.001355f, 0.001522f, 0.001599f, 0.001708f, 0.001836f, 0.001918f, 0.001970f, - 0.002129f, 0.002251f, 0.002357f, 0.002522f, 0.002636f, 0.002768f, 0.002911f, 0.003056f, - 0.003237f, 0.003393f, 0.003605f, 0.003771f, 0.003994f, 0.004234f, 0.004444f, 0.004635f, - 0.004932f, 0.005150f, 0.005486f, 0.005779f, 0.006081f, 0.006458f, 0.006775f, 0.007179f, - 0.007668f, 0.008110f, 0.008690f, 0.009209f, 0.009926f, 0.010551f, 0.011330f, 0.012184f, - 0.013184f, 0.014297f, 0.015610f, 0.017181f, 0.019165f, 0.021500f, 0.024384f, 0.027618f, - 0.031372f, 0.035614f, 0.345459f, 0.417236f, 0.435303f, 0.443604f, 0.448730f, 0.451904f, - 0.000240f, 0.000479f, 0.000533f, 0.000625f, 0.000716f, 0.000746f, 0.000857f, 0.000835f, - 0.000941f, 0.001024f, 0.001104f, 0.001155f, 0.001204f, 0.001282f, 0.001396f, 0.001453f, - 0.001554f, 0.001627f, 0.001737f, 0.001787f, 0.001894f, 0.002012f, 0.002119f, 0.002218f, - 0.002335f, 0.002453f, 0.002611f, 0.002714f, 0.002848f, 0.003050f, 0.003168f, 0.003395f, - 0.003529f, 0.003740f, 0.003963f, 0.004158f, 0.004429f, 0.004688f, 0.004982f, 0.005280f, - 0.005600f, 0.005959f, 0.006340f, 0.006775f, 0.007252f, 0.007748f, 0.008369f, 0.008980f, - 0.009705f, 0.010513f, 0.011513f, 0.012665f, 0.014069f, 0.015869f, 0.018158f, 0.020950f, - 0.024338f, 0.028366f, 0.335205f, 0.408203f, 0.427002f, 0.435547f, 0.441162f, 0.445312f, - 0.000138f, 0.000265f, 0.000381f, 0.000386f, 0.000465f, 0.000556f, 0.000558f, 0.000597f, - 0.000659f, 0.000748f, 0.000770f, 0.000786f, 0.000829f, 0.000904f, 0.000940f, 0.001021f, - 0.001043f, 0.001139f, 0.001201f, 0.001253f, 0.001327f, 0.001396f, 0.001481f, 0.001555f, - 0.001637f, 0.001712f, 0.001813f, 0.001899f, 0.002005f, 0.002140f, 0.002220f, 0.002348f, - 0.002462f, 0.002600f, 0.002733f, 0.002932f, 0.003075f, 0.003279f, 0.003452f, 0.003630f, - 0.003872f, 0.004166f, 0.004436f, 0.004742f, 0.005077f, 0.005459f, 0.005848f, 0.006310f, - 0.006874f, 0.007492f, 0.008171f, 0.009026f, 0.009995f, 0.011307f, 0.013008f, 0.015343f, - 0.018265f, 0.021881f, 0.323486f, 0.399170f, 0.418945f, 0.428467f, 0.434326f, 0.437988f, - 0.000165f, 0.000260f, 0.000287f, 0.000296f, 0.000331f, 0.000339f, 0.000360f, 0.000395f, - 0.000442f, 0.000482f, 0.000487f, 0.000551f, 0.000546f, 0.000611f, 0.000640f, 0.000667f, - 0.000711f, 0.000742f, 0.000775f, 0.000816f, 0.000876f, 0.000916f, 0.000974f, 0.001015f, - 0.001081f, 0.001123f, 0.001195f, 0.001267f, 0.001317f, 0.001388f, 0.001459f, 0.001558f, - 0.001630f, 0.001718f, 0.001804f, 0.001916f, 0.002033f, 0.002148f, 0.002295f, 0.002455f, - 0.002583f, 0.002754f, 0.002941f, 0.003134f, 0.003386f, 0.003639f, 0.003910f, 0.004215f, - 0.004597f, 0.005013f, 0.005520f, 0.006130f, 0.006821f, 0.007690f, 0.008789f, 0.010452f, - 0.012909f, 0.016174f, 0.312012f, 0.390381f, 0.410645f, 0.420654f, 0.426270f, 0.430664f, - 0.000057f, 0.000171f, 0.000164f, 0.000170f, 0.000211f, 0.000213f, 0.000229f, 0.000247f, - 0.000267f, 0.000279f, 0.000289f, 0.000317f, 0.000349f, 0.000364f, 0.000390f, 0.000407f, - 0.000427f, 0.000467f, 0.000476f, 0.000521f, 0.000537f, 0.000561f, 0.000578f, 0.000626f, - 0.000667f, 0.000714f, 0.000729f, 0.000753f, 0.000806f, 0.000855f, 0.000911f, 0.000945f, - 0.001004f, 0.001054f, 0.001112f, 0.001172f, 0.001251f, 0.001333f, 0.001406f, 0.001489f, - 0.001595f, 0.001694f, 0.001811f, 0.001952f, 0.002090f, 0.002243f, 0.002453f, 0.002638f, - 0.002888f, 0.003143f, 0.003489f, 0.003870f, 0.004353f, 0.004921f, 0.005672f, 0.006664f, - 0.008423f, 0.011230f, 0.301758f, 0.381104f, 0.402832f, 0.413330f, 0.418457f, 0.423828f, - 0.000096f, 0.000112f, 0.000097f, 0.000090f, 0.000113f, 0.000119f, 0.000144f, 0.000149f, - 0.000151f, 0.000158f, 0.000181f, 0.000184f, 0.000179f, 0.000201f, 0.000224f, 0.000216f, - 0.000237f, 0.000255f, 0.000263f, 0.000276f, 0.000297f, 0.000308f, 0.000332f, 0.000347f, - 0.000369f, 0.000395f, 0.000408f, 0.000422f, 0.000447f, 0.000471f, 0.000500f, 0.000531f, - 0.000554f, 0.000583f, 0.000617f, 0.000660f, 0.000690f, 0.000739f, 0.000795f, 0.000833f, - 0.000885f, 0.000948f, 0.001022f, 0.001085f, 0.001175f, 0.001262f, 0.001371f, 0.001487f, - 0.001633f, 0.001778f, 0.001986f, 0.002218f, 0.002502f, 0.002865f, 0.003330f, 0.003979f, - 0.004932f, 0.007000f, 0.291260f, 0.372070f, 0.394043f, 0.404541f, 0.412109f, 0.416260f, - 0.000000f, 0.000056f, 0.000049f, 0.000061f, 0.000064f, 0.000061f, 0.000062f, 0.000071f, - 0.000072f, 0.000088f, 0.000083f, 0.000086f, 0.000097f, 0.000094f, 0.000098f, 0.000105f, - 0.000116f, 0.000122f, 0.000126f, 0.000134f, 0.000137f, 0.000143f, 0.000150f, 0.000164f, - 0.000171f, 0.000183f, 0.000188f, 0.000204f, 0.000214f, 0.000224f, 0.000236f, 0.000255f, - 0.000258f, 0.000277f, 0.000293f, 0.000315f, 0.000328f, 0.000349f, 0.000376f, 0.000396f, - 0.000426f, 0.000454f, 0.000486f, 0.000521f, 0.000563f, 0.000605f, 0.000657f, 0.000714f, - 0.000791f, 0.000866f, 0.000977f, 0.001085f, 0.001243f, 0.001441f, 0.001703f, 0.002058f, - 0.002573f, 0.003740f, 0.280029f, 0.362793f, 0.385742f, 0.397217f, 0.404297f, 0.408936f, - 0.000058f, 0.000038f, 0.000031f, 0.000027f, 0.000025f, 0.000026f, 0.000025f, 0.000024f, - 0.000024f, 0.000027f, 0.000030f, 0.000038f, 0.000032f, 0.000035f, 0.000040f, 0.000041f, - 0.000044f, 0.000045f, 0.000045f, 0.000047f, 0.000052f, 0.000058f, 0.000061f, 0.000059f, - 0.000065f, 0.000067f, 0.000069f, 0.000073f, 0.000078f, 0.000083f, 0.000089f, 0.000091f, - 0.000099f, 0.000103f, 0.000106f, 0.000114f, 0.000124f, 0.000132f, 0.000141f, 0.000150f, - 0.000158f, 0.000164f, 0.000180f, 0.000193f, 0.000205f, 0.000225f, 0.000245f, 0.000267f, - 0.000297f, 0.000329f, 0.000365f, 0.000416f, 0.000479f, 0.000563f, 0.000676f, 0.000839f, - 0.001088f, 0.001589f, 0.270264f, 0.353760f, 0.377197f, 0.390137f, 0.396973f, 0.402100f, - 0.000030f, 0.000019f, 0.000016f, 0.000014f, 0.000013f, 0.000012f, 0.000011f, 0.000011f, - 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000009f, 0.000008f, 0.000007f, 0.000009f, - 0.000009f, 0.000008f, 0.000009f, 0.000010f, 0.000011f, 0.000012f, 0.000012f, 0.000014f, - 0.000014f, 0.000014f, 0.000015f, 0.000018f, 0.000017f, 0.000017f, 0.000019f, 0.000020f, - 0.000022f, 0.000022f, 0.000023f, 0.000026f, 0.000028f, 0.000027f, 0.000030f, 0.000032f, - 0.000035f, 0.000038f, 0.000040f, 0.000042f, 0.000045f, 0.000049f, 0.000055f, 0.000060f, - 0.000065f, 0.000074f, 0.000078f, 0.000095f, 0.000109f, 0.000129f, 0.000160f, 0.000205f, - 0.000284f, 0.000452f, 0.259766f, 0.345703f, 0.369629f, 0.382812f, 0.390625f, 0.395264f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000003f, 0.000003f, 0.000004f, 0.000004f, 0.000005f, 0.000006f, 0.000009f, - 0.000012f, 0.000026f, 0.249878f, 0.336182f, 0.362061f, 0.374512f, 0.382080f, 0.387695f, - }}; - /* 4 different blue noise, one per channel */ const float blue_noise[64 * 64][4] = { {0.367188f, 0.855469f, 0.523438f, 0.375000f}, {0.242188f, 0.699219f, 0.164062f, 0.292969f}, @@ -23031,3 +5554,17449 @@ const float blue_noise[64 * 64][4] = { {0.621094f, 0.089844f, 0.500000f, 0.394531f}, {0.523438f, 0.644531f, 0.906250f, 0.773438f}, {0.796875f, 0.507812f, 0.203125f, 0.480469f}, {0.582031f, 0.042969f, 0.367188f, 0.710938f}, }; + +const float bsdf_split_sum_ggx[64 * 64 * 2] = { + 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, + 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, + 0.999512f, 0.000000f, 0.999512f, 0.000001f, 0.999512f, 0.000003f, 0.999512f, 0.000006f, + 0.999512f, 0.000011f, 0.999512f, 0.000020f, 0.999512f, 0.000034f, 0.999512f, 0.000057f, + 0.999512f, 0.000089f, 0.999023f, 0.000133f, 0.996582f, 0.000174f, 0.983887f, 0.000068f, + 0.983398f, 0.000099f, 0.982910f, 0.000140f, 0.982422f, 0.000192f, 0.980469f, 0.000251f, + 0.975098f, 0.000288f, 0.964844f, 0.000255f, 0.962402f, 0.000324f, 0.957520f, 0.000386f, + 0.947754f, 0.000402f, 0.939941f, 0.000443f, 0.931641f, 0.000499f, 0.919434f, 0.000515f, + 0.909668f, 0.000575f, 0.896484f, 0.000598f, 0.883789f, 0.000648f, 0.868652f, 0.000673f, + 0.854004f, 0.000715f, 0.837402f, 0.000743f, 0.819824f, 0.000767f, 0.801758f, 0.000795f, + 0.782715f, 0.000817f, 0.762695f, 0.000833f, 0.741699f, 0.000846f, 0.720703f, 0.000857f, + 0.698730f, 0.000864f, 0.676758f, 0.000868f, 0.654297f, 0.000868f, 0.631348f, 0.000865f, + 0.608887f, 0.000858f, 0.585938f, 0.000849f, 0.562988f, 0.000837f, 0.540527f, 0.000823f, + 0.518066f, 0.000807f, 0.496582f, 0.000789f, 0.474854f, 0.000769f, 0.453857f, 0.000748f, + 0.433350f, 0.000726f, 0.413086f, 0.000703f, 0.393799f, 0.000680f, 0.375000f, 0.000656f, + 0.356689f, 0.000632f, 0.339111f, 0.000607f, 0.322266f, 0.000584f, 0.306152f, 0.000559f, + 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, + 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, + 0.999512f, 0.000000f, 0.999512f, 0.000001f, 0.999512f, 0.000003f, 0.999512f, 0.000006f, + 0.999512f, 0.000011f, 0.999512f, 0.000020f, 0.999512f, 0.000035f, 0.999512f, 0.000057f, + 0.999512f, 0.000090f, 0.999023f, 0.000134f, 0.996582f, 0.000174f, 0.983887f, 0.000069f, + 0.983398f, 0.000100f, 0.982910f, 0.000141f, 0.982422f, 0.000193f, 0.980469f, 0.000252f, + 0.975098f, 0.000288f, 0.964844f, 0.000259f, 0.962402f, 0.000326f, 0.957520f, 0.000387f, + 0.947754f, 0.000401f, 0.939941f, 0.000445f, 0.931641f, 0.000500f, 0.919922f, 0.000520f, + 0.909668f, 0.000576f, 0.896484f, 0.000603f, 0.883789f, 0.000650f, 0.869141f, 0.000678f, + 0.854004f, 0.000716f, 0.837402f, 0.000744f, 0.819824f, 0.000771f, 0.801758f, 0.000796f, + 0.782715f, 0.000818f, 0.762695f, 0.000835f, 0.741699f, 0.000849f, 0.720703f, 0.000860f, + 0.698730f, 0.000866f, 0.676758f, 0.000869f, 0.654297f, 0.000869f, 0.631348f, 0.000866f, + 0.608887f, 0.000859f, 0.585938f, 0.000850f, 0.562988f, 0.000838f, 0.540527f, 0.000824f, + 0.518555f, 0.000808f, 0.496582f, 0.000790f, 0.474854f, 0.000771f, 0.453857f, 0.000750f, + 0.433350f, 0.000728f, 0.413330f, 0.000704f, 0.393799f, 0.000681f, 0.375000f, 0.000657f, + 0.356689f, 0.000632f, 0.339111f, 0.000608f, 0.322266f, 0.000584f, 0.306152f, 0.000560f, + 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, + 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 1.000000f, 0.000000f, + 0.999512f, 0.000001f, 0.999512f, 0.000002f, 0.999512f, 0.000003f, 0.999512f, 0.000006f, + 0.999512f, 0.000012f, 0.999512f, 0.000021f, 0.999512f, 0.000036f, 0.999512f, 0.000059f, + 0.999512f, 0.000093f, 0.999023f, 0.000138f, 0.996094f, 0.000172f, 0.984863f, 0.000086f, + 0.983398f, 0.000104f, 0.982910f, 0.000146f, 0.982422f, 0.000199f, 0.979980f, 0.000257f, + 0.974609f, 0.000288f, 0.965820f, 0.000278f, 0.962402f, 0.000334f, 0.957031f, 0.000392f, + 0.947754f, 0.000413f, 0.939453f, 0.000453f, 0.931152f, 0.000504f, 0.920410f, 0.000537f, + 0.909180f, 0.000582f, 0.896973f, 0.000619f, 0.883301f, 0.000656f, 0.869141f, 0.000693f, + 0.853516f, 0.000724f, 0.837402f, 0.000755f, 0.819824f, 0.000784f, 0.801270f, 0.000807f, + 0.782227f, 0.000827f, 0.762207f, 0.000845f, 0.741699f, 0.000860f, 0.720703f, 0.000870f, + 0.698730f, 0.000875f, 0.676758f, 0.000879f, 0.654297f, 0.000878f, 0.631348f, 0.000875f, + 0.608887f, 0.000868f, 0.585938f, 0.000858f, 0.562988f, 0.000846f, 0.540527f, 0.000831f, + 0.518555f, 0.000814f, 0.496582f, 0.000796f, 0.474854f, 0.000776f, 0.453857f, 0.000755f, + 0.433350f, 0.000732f, 0.413330f, 0.000709f, 0.393799f, 0.000685f, 0.375000f, 0.000661f, + 0.356934f, 0.000637f, 0.339355f, 0.000612f, 0.322510f, 0.000587f, 0.306396f, 0.000564f, + 0.999512f, 0.000001f, 0.999512f, 0.000001f, 0.999512f, 0.000001f, 0.999512f, 0.000001f, + 0.999512f, 0.000001f, 0.999512f, 0.000001f, 0.999512f, 0.000001f, 0.999512f, 0.000001f, + 0.999512f, 0.000001f, 0.999512f, 0.000002f, 0.999512f, 0.000004f, 0.999512f, 0.000008f, + 0.999512f, 0.000014f, 0.999512f, 0.000024f, 0.999512f, 0.000040f, 0.999512f, 0.000064f, + 0.999512f, 0.000098f, 0.999023f, 0.000143f, 0.995605f, 0.000165f, 0.986328f, 0.000105f, + 0.983398f, 0.000112f, 0.982910f, 0.000155f, 0.981934f, 0.000209f, 0.979980f, 0.000267f, + 0.974121f, 0.000285f, 0.966797f, 0.000300f, 0.961914f, 0.000347f, 0.956543f, 0.000401f, + 0.948242f, 0.000431f, 0.939453f, 0.000471f, 0.930664f, 0.000513f, 0.920410f, 0.000558f, + 0.908691f, 0.000592f, 0.896973f, 0.000638f, 0.883301f, 0.000670f, 0.869141f, 0.000711f, + 0.853516f, 0.000741f, 0.836914f, 0.000773f, 0.819824f, 0.000801f, 0.801270f, 0.000825f, + 0.782227f, 0.000846f, 0.762207f, 0.000863f, 0.741699f, 0.000875f, 0.720215f, 0.000885f, + 0.698730f, 0.000892f, 0.676758f, 0.000894f, 0.654297f, 0.000893f, 0.631348f, 0.000889f, + 0.608398f, 0.000881f, 0.585938f, 0.000871f, 0.562988f, 0.000858f, 0.540527f, 0.000843f, + 0.518555f, 0.000825f, 0.496582f, 0.000806f, 0.475098f, 0.000786f, 0.454102f, 0.000764f, + 0.433350f, 0.000741f, 0.413330f, 0.000717f, 0.394043f, 0.000693f, 0.375244f, 0.000669f, + 0.356934f, 0.000644f, 0.339600f, 0.000618f, 0.322754f, 0.000594f, 0.306641f, 0.000569f, + 0.999512f, 0.000002f, 0.999512f, 0.000002f, 0.999512f, 0.000002f, 0.999512f, 0.000002f, + 0.999512f, 0.000002f, 0.999512f, 0.000002f, 0.999512f, 0.000002f, 0.999512f, 0.000002f, + 0.999512f, 0.000003f, 0.999512f, 0.000004f, 0.999512f, 0.000006f, 0.999512f, 0.000010f, + 0.999512f, 0.000017f, 0.999512f, 0.000028f, 0.999512f, 0.000045f, 0.999512f, 0.000070f, + 0.999512f, 0.000106f, 0.999023f, 0.000152f, 0.994141f, 0.000151f, 0.987305f, 0.000122f, + 0.983398f, 0.000123f, 0.982910f, 0.000169f, 0.981934f, 0.000224f, 0.979492f, 0.000279f, + 0.973633f, 0.000294f, 0.967773f, 0.000324f, 0.961426f, 0.000365f, 0.955566f, 0.000411f, + 0.948242f, 0.000454f, 0.939941f, 0.000496f, 0.930176f, 0.000534f, 0.920410f, 0.000583f, + 0.908691f, 0.000617f, 0.896973f, 0.000663f, 0.883301f, 0.000698f, 0.868652f, 0.000734f, + 0.853516f, 0.000769f, 0.836914f, 0.000800f, 0.819336f, 0.000825f, 0.801270f, 0.000850f, + 0.782227f, 0.000871f, 0.762207f, 0.000887f, 0.741699f, 0.000900f, 0.720215f, 0.000909f, + 0.698730f, 0.000915f, 0.676270f, 0.000916f, 0.653809f, 0.000914f, 0.631348f, 0.000909f, + 0.608398f, 0.000900f, 0.585938f, 0.000889f, 0.562988f, 0.000875f, 0.540527f, 0.000859f, + 0.518555f, 0.000841f, 0.496826f, 0.000821f, 0.475342f, 0.000800f, 0.454102f, 0.000777f, + 0.433594f, 0.000753f, 0.413574f, 0.000729f, 0.394287f, 0.000704f, 0.375488f, 0.000678f, + 0.357178f, 0.000653f, 0.339844f, 0.000627f, 0.322998f, 0.000602f, 0.306885f, 0.000576f, + 0.999512f, 0.000004f, 0.999512f, 0.000004f, 0.999512f, 0.000004f, 0.999512f, 0.000004f, + 0.999512f, 0.000004f, 0.999512f, 0.000004f, 0.999512f, 0.000004f, 0.999512f, 0.000005f, + 0.999512f, 0.000006f, 0.999512f, 0.000007f, 0.999512f, 0.000010f, 0.999512f, 0.000015f, + 0.999512f, 0.000022f, 0.999512f, 0.000034f, 0.999512f, 0.000052f, 0.999512f, 0.000079f, + 0.999512f, 0.000117f, 0.998535f, 0.000163f, 0.993652f, 0.000150f, 0.988281f, 0.000138f, + 0.983398f, 0.000139f, 0.982910f, 0.000187f, 0.981934f, 0.000244f, 0.979004f, 0.000294f, + 0.973633f, 0.000312f, 0.968262f, 0.000352f, 0.961426f, 0.000392f, 0.955078f, 0.000430f, + 0.948242f, 0.000483f, 0.939453f, 0.000525f, 0.929688f, 0.000563f, 0.920410f, 0.000612f, + 0.908691f, 0.000652f, 0.896484f, 0.000691f, 0.883301f, 0.000733f, 0.868652f, 0.000767f, + 0.853027f, 0.000801f, 0.836426f, 0.000832f, 0.819336f, 0.000860f, 0.800781f, 0.000884f, + 0.781738f, 0.000903f, 0.761719f, 0.000919f, 0.741211f, 0.000931f, 0.720215f, 0.000938f, + 0.698242f, 0.000943f, 0.676270f, 0.000944f, 0.653809f, 0.000941f, 0.631348f, 0.000935f, + 0.608398f, 0.000925f, 0.585938f, 0.000913f, 0.562988f, 0.000898f, 0.541016f, 0.000881f, + 0.518555f, 0.000861f, 0.496826f, 0.000840f, 0.475342f, 0.000818f, 0.454346f, 0.000794f, + 0.433838f, 0.000769f, 0.413818f, 0.000743f, 0.394531f, 0.000718f, 0.375732f, 0.000691f, + 0.357666f, 0.000665f, 0.340088f, 0.000638f, 0.323242f, 0.000612f, 0.307129f, 0.000587f, + 0.999512f, 0.000008f, 0.999512f, 0.000008f, 0.999512f, 0.000008f, 0.999512f, 0.000008f, + 0.999512f, 0.000008f, 0.999512f, 0.000008f, 0.999512f, 0.000008f, 0.999512f, 0.000009f, + 0.999512f, 0.000010f, 0.999512f, 0.000012f, 0.999512f, 0.000015f, 0.999512f, 0.000021f, + 0.999512f, 0.000030f, 0.999512f, 0.000043f, 0.999512f, 0.000063f, 0.999512f, 0.000091f, + 0.999512f, 0.000131f, 0.998535f, 0.000177f, 0.993164f, 0.000157f, 0.988770f, 0.000157f, + 0.983398f, 0.000160f, 0.982910f, 0.000210f, 0.981445f, 0.000268f, 0.978516f, 0.000311f, + 0.973633f, 0.000338f, 0.968262f, 0.000386f, 0.961426f, 0.000426f, 0.954590f, 0.000461f, + 0.948242f, 0.000518f, 0.939453f, 0.000557f, 0.929688f, 0.000602f, 0.919922f, 0.000647f, + 0.908691f, 0.000694f, 0.895996f, 0.000731f, 0.882812f, 0.000773f, 0.868164f, 0.000809f, + 0.853027f, 0.000844f, 0.836426f, 0.000873f, 0.818848f, 0.000901f, 0.800781f, 0.000924f, + 0.781738f, 0.000944f, 0.761719f, 0.000959f, 0.741211f, 0.000969f, 0.719727f, 0.000977f, + 0.698242f, 0.000979f, 0.676270f, 0.000978f, 0.653809f, 0.000975f, 0.631348f, 0.000967f, + 0.608398f, 0.000956f, 0.585938f, 0.000942f, 0.563477f, 0.000926f, 0.541016f, 0.000907f, + 0.518555f, 0.000886f, 0.497070f, 0.000864f, 0.475586f, 0.000840f, 0.454590f, 0.000814f, + 0.434082f, 0.000789f, 0.414307f, 0.000762f, 0.394775f, 0.000735f, 0.376221f, 0.000708f, + 0.357910f, 0.000680f, 0.340576f, 0.000653f, 0.323730f, 0.000626f, 0.307617f, 0.000599f, + 0.999512f, 0.000015f, 0.999512f, 0.000015f, 0.999512f, 0.000015f, 0.999512f, 0.000015f, + 0.999512f, 0.000015f, 0.999512f, 0.000015f, 0.999512f, 0.000015f, 0.999512f, 0.000016f, + 0.999512f, 0.000017f, 0.999512f, 0.000020f, 0.999512f, 0.000024f, 0.999512f, 0.000030f, + 0.999512f, 0.000040f, 0.999512f, 0.000055f, 0.999512f, 0.000077f, 0.999512f, 0.000108f, + 0.999023f, 0.000150f, 0.998047f, 0.000193f, 0.993164f, 0.000170f, 0.989258f, 0.000180f, + 0.984375f, 0.000193f, 0.982422f, 0.000239f, 0.981445f, 0.000299f, 0.977539f, 0.000330f, + 0.973145f, 0.000371f, 0.968750f, 0.000425f, 0.961426f, 0.000463f, 0.954590f, 0.000501f, + 0.947754f, 0.000560f, 0.939453f, 0.000602f, 0.929688f, 0.000650f, 0.919434f, 0.000693f, + 0.908203f, 0.000742f, 0.895508f, 0.000782f, 0.882324f, 0.000822f, 0.867676f, 0.000860f, + 0.852539f, 0.000894f, 0.835938f, 0.000925f, 0.818359f, 0.000951f, 0.800293f, 0.000973f, + 0.781250f, 0.000992f, 0.761230f, 0.001005f, 0.740723f, 0.001016f, 0.719727f, 0.001021f, + 0.697754f, 0.001022f, 0.675781f, 0.001020f, 0.653809f, 0.001015f, 0.631348f, 0.001005f, + 0.608398f, 0.000993f, 0.585938f, 0.000977f, 0.563477f, 0.000958f, 0.541016f, 0.000938f, + 0.519043f, 0.000916f, 0.497314f, 0.000892f, 0.475830f, 0.000866f, 0.454834f, 0.000840f, + 0.434570f, 0.000812f, 0.414551f, 0.000784f, 0.395264f, 0.000755f, 0.376465f, 0.000727f, + 0.358398f, 0.000698f, 0.341064f, 0.000669f, 0.324219f, 0.000641f, 0.308105f, 0.000613f, + 0.999512f, 0.000026f, 0.999512f, 0.000026f, 0.999512f, 0.000026f, 0.999512f, 0.000026f, + 0.999512f, 0.000026f, 0.999512f, 0.000026f, 0.999512f, 0.000026f, 0.999512f, 0.000026f, + 0.999512f, 0.000028f, 0.999512f, 0.000031f, 0.999512f, 0.000036f, 0.999512f, 0.000044f, + 0.999512f, 0.000055f, 0.999512f, 0.000072f, 0.999512f, 0.000096f, 0.999512f, 0.000130f, + 0.999023f, 0.000175f, 0.997559f, 0.000208f, 0.993164f, 0.000191f, 0.989746f, 0.000208f, + 0.985352f, 0.000232f, 0.982422f, 0.000275f, 0.980957f, 0.000335f, 0.977051f, 0.000362f, + 0.973145f, 0.000413f, 0.968750f, 0.000471f, 0.961426f, 0.000505f, 0.954102f, 0.000551f, + 0.947266f, 0.000607f, 0.938965f, 0.000657f, 0.929688f, 0.000705f, 0.918945f, 0.000750f, + 0.907715f, 0.000797f, 0.895508f, 0.000842f, 0.881836f, 0.000882f, 0.867676f, 0.000920f, + 0.852051f, 0.000952f, 0.835449f, 0.000984f, 0.817871f, 0.001010f, 0.799805f, 0.001032f, + 0.780762f, 0.001049f, 0.760742f, 0.001062f, 0.740234f, 0.001071f, 0.719238f, 0.001074f, + 0.697754f, 0.001074f, 0.675781f, 0.001070f, 0.653320f, 0.001061f, 0.630859f, 0.001050f, + 0.608398f, 0.001036f, 0.585938f, 0.001018f, 0.563477f, 0.000998f, 0.541016f, 0.000975f, + 0.519043f, 0.000950f, 0.497559f, 0.000925f, 0.476074f, 0.000897f, 0.455322f, 0.000868f, + 0.434814f, 0.000839f, 0.415039f, 0.000809f, 0.395752f, 0.000779f, 0.376953f, 0.000749f, + 0.358887f, 0.000719f, 0.341553f, 0.000689f, 0.324707f, 0.000659f, 0.308594f, 0.000630f, + 0.999512f, 0.000041f, 0.999512f, 0.000041f, 0.999512f, 0.000041f, 0.999512f, 0.000041f, + 0.999512f, 0.000041f, 0.999512f, 0.000041f, 0.999512f, 0.000041f, 0.999512f, 0.000042f, + 0.999512f, 0.000044f, 0.999512f, 0.000048f, 0.999512f, 0.000054f, 0.999512f, 0.000062f, + 0.999512f, 0.000075f, 0.999512f, 0.000094f, 0.999512f, 0.000121f, 0.999512f, 0.000158f, + 0.999023f, 0.000206f, 0.996582f, 0.000219f, 0.993164f, 0.000219f, 0.990234f, 0.000243f, + 0.986328f, 0.000276f, 0.982422f, 0.000320f, 0.980469f, 0.000377f, 0.976562f, 0.000407f, + 0.973145f, 0.000465f, 0.968262f, 0.000524f, 0.961426f, 0.000562f, 0.954102f, 0.000614f, + 0.946777f, 0.000663f, 0.938965f, 0.000721f, 0.929199f, 0.000769f, 0.918457f, 0.000818f, + 0.907227f, 0.000865f, 0.895020f, 0.000910f, 0.881348f, 0.000951f, 0.867188f, 0.000991f, + 0.851562f, 0.001023f, 0.834961f, 0.001053f, 0.817383f, 0.001079f, 0.799316f, 0.001100f, + 0.780273f, 0.001115f, 0.760254f, 0.001127f, 0.739746f, 0.001133f, 0.718750f, 0.001136f, + 0.697266f, 0.001133f, 0.675293f, 0.001126f, 0.653320f, 0.001117f, 0.630859f, 0.001102f, + 0.608398f, 0.001085f, 0.585938f, 0.001065f, 0.563477f, 0.001042f, 0.541016f, 0.001018f, + 0.519531f, 0.000991f, 0.497803f, 0.000962f, 0.476562f, 0.000932f, 0.455566f, 0.000902f, + 0.435303f, 0.000870f, 0.415527f, 0.000839f, 0.396240f, 0.000806f, 0.377686f, 0.000774f, + 0.359619f, 0.000742f, 0.342041f, 0.000711f, 0.325439f, 0.000680f, 0.309326f, 0.000649f, + 0.999512f, 0.000062f, 0.999512f, 0.000062f, 0.999512f, 0.000062f, 0.999512f, 0.000062f, + 0.999512f, 0.000062f, 0.999512f, 0.000062f, 0.999512f, 0.000062f, 0.999512f, 0.000063f, + 0.999512f, 0.000066f, 0.999512f, 0.000071f, 0.999512f, 0.000077f, 0.999512f, 0.000088f, + 0.999512f, 0.000102f, 0.999512f, 0.000124f, 0.999512f, 0.000153f, 0.999512f, 0.000194f, + 0.999023f, 0.000245f, 0.995605f, 0.000245f, 0.993164f, 0.000256f, 0.990234f, 0.000287f, + 0.986816f, 0.000329f, 0.981934f, 0.000374f, 0.979492f, 0.000424f, 0.976074f, 0.000462f, + 0.972656f, 0.000527f, 0.967773f, 0.000584f, 0.961426f, 0.000630f, 0.954102f, 0.000687f, + 0.946289f, 0.000734f, 0.938477f, 0.000796f, 0.928711f, 0.000846f, 0.917969f, 0.000896f, + 0.906738f, 0.000946f, 0.894531f, 0.000991f, 0.880859f, 0.001032f, 0.866211f, 0.001071f, + 0.851074f, 0.001105f, 0.834473f, 0.001134f, 0.816895f, 0.001159f, 0.798828f, 0.001178f, + 0.779785f, 0.001193f, 0.759766f, 0.001202f, 0.739258f, 0.001206f, 0.718262f, 0.001206f, + 0.696777f, 0.001201f, 0.675293f, 0.001191f, 0.652832f, 0.001179f, 0.630859f, 0.001162f, + 0.608398f, 0.001142f, 0.585938f, 0.001119f, 0.563477f, 0.001093f, 0.541504f, 0.001065f, + 0.519531f, 0.001036f, 0.498047f, 0.001005f, 0.476807f, 0.000973f, 0.456055f, 0.000939f, + 0.435791f, 0.000906f, 0.416016f, 0.000872f, 0.396973f, 0.000838f, 0.378174f, 0.000803f, + 0.360352f, 0.000770f, 0.342773f, 0.000737f, 0.326172f, 0.000704f, 0.310059f, 0.000672f, + 0.999512f, 0.000091f, 0.999512f, 0.000091f, 0.999512f, 0.000091f, 0.999512f, 0.000091f, + 0.999512f, 0.000091f, 0.999512f, 0.000091f, 0.999512f, 0.000091f, 0.999512f, 0.000092f, + 0.999512f, 0.000096f, 0.999512f, 0.000101f, 0.999512f, 0.000109f, 0.999512f, 0.000121f, + 0.999512f, 0.000138f, 0.999512f, 0.000162f, 0.999512f, 0.000195f, 0.999512f, 0.000240f, + 0.998535f, 0.000293f, 0.995605f, 0.000285f, 0.992676f, 0.000303f, 0.990234f, 0.000341f, + 0.987305f, 0.000391f, 0.982422f, 0.000442f, 0.979004f, 0.000477f, 0.976074f, 0.000531f, + 0.972656f, 0.000600f, 0.967285f, 0.000652f, 0.961426f, 0.000711f, 0.954102f, 0.000769f, + 0.945312f, 0.000819f, 0.937988f, 0.000881f, 0.928711f, 0.000937f, 0.917480f, 0.000987f, + 0.905762f, 0.001037f, 0.894043f, 0.001085f, 0.880371f, 0.001127f, 0.865723f, 0.001163f, + 0.850098f, 0.001198f, 0.833496f, 0.001225f, 0.816406f, 0.001249f, 0.798340f, 0.001266f, + 0.779297f, 0.001280f, 0.759277f, 0.001287f, 0.738770f, 0.001288f, 0.717773f, 0.001286f, + 0.696777f, 0.001278f, 0.674805f, 0.001266f, 0.652832f, 0.001248f, 0.630371f, 0.001229f, + 0.608398f, 0.001205f, 0.585938f, 0.001180f, 0.563477f, 0.001150f, 0.541504f, 0.001120f, + 0.520020f, 0.001087f, 0.498535f, 0.001053f, 0.477295f, 0.001018f, 0.456543f, 0.000982f, + 0.436279f, 0.000946f, 0.416748f, 0.000909f, 0.397461f, 0.000872f, 0.378906f, 0.000836f, + 0.361084f, 0.000800f, 0.343506f, 0.000765f, 0.326904f, 0.000731f, 0.310791f, 0.000697f, + 0.999512f, 0.000129f, 0.999512f, 0.000129f, 0.999512f, 0.000129f, 0.999512f, 0.000129f, + 0.999512f, 0.000129f, 0.999512f, 0.000129f, 0.999512f, 0.000129f, 0.999512f, 0.000131f, + 0.999512f, 0.000135f, 0.999512f, 0.000142f, 0.999512f, 0.000151f, 0.999512f, 0.000164f, + 0.999512f, 0.000184f, 0.999512f, 0.000210f, 0.999512f, 0.000247f, 0.999023f, 0.000296f, + 0.998535f, 0.000350f, 0.995117f, 0.000337f, 0.992676f, 0.000364f, 0.990723f, 0.000408f, + 0.987793f, 0.000465f, 0.982910f, 0.000521f, 0.978027f, 0.000550f, 0.975586f, 0.000614f, + 0.972168f, 0.000687f, 0.966797f, 0.000738f, 0.960938f, 0.000806f, 0.953613f, 0.000861f, + 0.945312f, 0.000921f, 0.937012f, 0.000978f, 0.928223f, 0.001041f, 0.917480f, 0.001094f, + 0.905273f, 0.001142f, 0.893066f, 0.001192f, 0.879883f, 0.001235f, 0.864746f, 0.001272f, + 0.849609f, 0.001305f, 0.833008f, 0.001332f, 0.815918f, 0.001353f, 0.797363f, 0.001369f, + 0.778320f, 0.001378f, 0.758789f, 0.001383f, 0.738281f, 0.001382f, 0.717773f, 0.001375f, + 0.696289f, 0.001364f, 0.674316f, 0.001348f, 0.652344f, 0.001328f, 0.630371f, 0.001305f, + 0.607910f, 0.001277f, 0.585938f, 0.001247f, 0.563965f, 0.001215f, 0.541992f, 0.001181f, + 0.520020f, 0.001144f, 0.498779f, 0.001106f, 0.477783f, 0.001068f, 0.457275f, 0.001029f, + 0.437012f, 0.000990f, 0.417480f, 0.000951f, 0.398193f, 0.000911f, 0.379639f, 0.000873f, + 0.361816f, 0.000834f, 0.344482f, 0.000796f, 0.327637f, 0.000760f, 0.311768f, 0.000724f, + 0.999512f, 0.000179f, 0.999512f, 0.000179f, 0.999512f, 0.000179f, 0.999512f, 0.000179f, + 0.999512f, 0.000179f, 0.999512f, 0.000179f, 0.999512f, 0.000179f, 0.999512f, 0.000181f, + 0.999512f, 0.000186f, 0.999512f, 0.000193f, 0.999512f, 0.000204f, 0.999512f, 0.000220f, + 0.999512f, 0.000242f, 0.999512f, 0.000272f, 0.999023f, 0.000313f, 0.999023f, 0.000366f, + 0.998047f, 0.000414f, 0.994629f, 0.000404f, 0.992676f, 0.000438f, 0.990723f, 0.000489f, + 0.987793f, 0.000553f, 0.983398f, 0.000611f, 0.977539f, 0.000640f, 0.975098f, 0.000713f, + 0.971680f, 0.000786f, 0.966309f, 0.000842f, 0.960938f, 0.000916f, 0.953613f, 0.000973f, + 0.945312f, 0.001039f, 0.936035f, 0.001096f, 0.927246f, 0.001159f, 0.916992f, 0.001216f, + 0.904785f, 0.001266f, 0.892090f, 0.001312f, 0.878906f, 0.001357f, 0.864258f, 0.001394f, + 0.848633f, 0.001426f, 0.832520f, 0.001451f, 0.814941f, 0.001470f, 0.796875f, 0.001483f, + 0.777832f, 0.001490f, 0.758301f, 0.001491f, 0.737793f, 0.001486f, 0.716797f, 0.001476f, + 0.695801f, 0.001460f, 0.674316f, 0.001440f, 0.652344f, 0.001416f, 0.630371f, 0.001389f, + 0.607910f, 0.001357f, 0.585938f, 0.001323f, 0.563965f, 0.001287f, 0.541992f, 0.001247f, + 0.520508f, 0.001207f, 0.499268f, 0.001166f, 0.478271f, 0.001124f, 0.457764f, 0.001081f, + 0.437744f, 0.001040f, 0.418213f, 0.000997f, 0.399170f, 0.000955f, 0.380615f, 0.000913f, + 0.362793f, 0.000872f, 0.345459f, 0.000832f, 0.328613f, 0.000793f, 0.312744f, 0.000754f, + 0.999512f, 0.000243f, 0.999512f, 0.000243f, 0.999512f, 0.000243f, 0.999512f, 0.000243f, + 0.999512f, 0.000243f, 0.999512f, 0.000243f, 0.999512f, 0.000243f, 0.999512f, 0.000245f, + 0.999512f, 0.000251f, 0.999512f, 0.000259f, 0.999512f, 0.000272f, 0.999512f, 0.000289f, + 0.999512f, 0.000314f, 0.999512f, 0.000348f, 0.999023f, 0.000394f, 0.999023f, 0.000452f, + 0.997070f, 0.000480f, 0.994629f, 0.000487f, 0.992676f, 0.000528f, 0.990723f, 0.000587f, + 0.987793f, 0.000658f, 0.983398f, 0.000711f, 0.977051f, 0.000749f, 0.974609f, 0.000830f, + 0.970703f, 0.000898f, 0.965820f, 0.000966f, 0.960449f, 0.001040f, 0.953125f, 0.001104f, + 0.944824f, 0.001170f, 0.935547f, 0.001232f, 0.926270f, 0.001294f, 0.916016f, 0.001354f, + 0.904297f, 0.001408f, 0.891602f, 0.001453f, 0.877930f, 0.001496f, 0.863770f, 0.001533f, + 0.847656f, 0.001561f, 0.831543f, 0.001585f, 0.813965f, 0.001601f, 0.795898f, 0.001612f, + 0.776855f, 0.001616f, 0.757324f, 0.001612f, 0.737305f, 0.001603f, 0.716309f, 0.001588f, + 0.695312f, 0.001568f, 0.673828f, 0.001544f, 0.651855f, 0.001514f, 0.629883f, 0.001482f, + 0.607910f, 0.001446f, 0.585938f, 0.001407f, 0.563965f, 0.001366f, 0.542480f, 0.001323f, + 0.520996f, 0.001278f, 0.499756f, 0.001232f, 0.478760f, 0.001186f, 0.458496f, 0.001140f, + 0.438477f, 0.001094f, 0.418945f, 0.001047f, 0.399902f, 0.001002f, 0.381592f, 0.000957f, + 0.363770f, 0.000913f, 0.346436f, 0.000870f, 0.329834f, 0.000828f, 0.313721f, 0.000788f, + 0.999512f, 0.000323f, 0.999512f, 0.000323f, 0.999512f, 0.000323f, 0.999512f, 0.000323f, + 0.999512f, 0.000323f, 0.999512f, 0.000323f, 0.999512f, 0.000323f, 0.999512f, 0.000326f, + 0.999512f, 0.000332f, 0.999512f, 0.000342f, 0.999512f, 0.000356f, 0.999512f, 0.000376f, + 0.999023f, 0.000404f, 0.999023f, 0.000442f, 0.999023f, 0.000493f, 0.998535f, 0.000556f, + 0.996582f, 0.000569f, 0.994141f, 0.000590f, 0.992676f, 0.000638f, 0.990723f, 0.000705f, + 0.988281f, 0.000782f, 0.983398f, 0.000825f, 0.977539f, 0.000883f, 0.974121f, 0.000966f, + 0.969727f, 0.001030f, 0.965332f, 0.001111f, 0.959473f, 0.001182f, 0.952637f, 0.001257f, + 0.944336f, 0.001322f, 0.935059f, 0.001389f, 0.925781f, 0.001451f, 0.915527f, 0.001511f, + 0.903809f, 0.001565f, 0.890625f, 0.001612f, 0.876953f, 0.001654f, 0.862793f, 0.001689f, + 0.847168f, 0.001716f, 0.830566f, 0.001737f, 0.813477f, 0.001750f, 0.794922f, 0.001755f, + 0.776367f, 0.001755f, 0.756348f, 0.001746f, 0.736328f, 0.001733f, 0.715820f, 0.001713f, + 0.694824f, 0.001688f, 0.673340f, 0.001657f, 0.651855f, 0.001623f, 0.629883f, 0.001585f, + 0.607910f, 0.001543f, 0.585938f, 0.001499f, 0.564453f, 0.001452f, 0.542480f, 0.001404f, + 0.520996f, 0.001355f, 0.500000f, 0.001306f, 0.479492f, 0.001255f, 0.459229f, 0.001204f, + 0.439209f, 0.001154f, 0.419678f, 0.001103f, 0.400879f, 0.001054f, 0.382568f, 0.001005f, + 0.364746f, 0.000958f, 0.347412f, 0.000913f, 0.330811f, 0.000868f, 0.314941f, 0.000825f, + 0.999512f, 0.000422f, 0.999512f, 0.000422f, 0.999512f, 0.000422f, 0.999512f, 0.000422f, + 0.999512f, 0.000422f, 0.999512f, 0.000422f, 0.999512f, 0.000422f, 0.999512f, 0.000426f, + 0.999512f, 0.000433f, 0.999512f, 0.000445f, 0.999023f, 0.000461f, 0.999023f, 0.000484f, + 0.999023f, 0.000515f, 0.999023f, 0.000557f, 0.999023f, 0.000613f, 0.998535f, 0.000681f, + 0.996094f, 0.000683f, 0.994141f, 0.000715f, 0.992676f, 0.000771f, 0.990723f, 0.000845f, + 0.987793f, 0.000926f, 0.983398f, 0.000968f, 0.978027f, 0.001040f, 0.973633f, 0.001123f, + 0.969238f, 0.001190f, 0.964844f, 0.001278f, 0.958984f, 0.001349f, 0.952148f, 0.001431f, + 0.943848f, 0.001499f, 0.934570f, 0.001565f, 0.924316f, 0.001631f, 0.914551f, 0.001692f, + 0.902832f, 0.001745f, 0.889648f, 0.001791f, 0.875977f, 0.001829f, 0.861816f, 0.001863f, + 0.846191f, 0.001888f, 0.829590f, 0.001904f, 0.812500f, 0.001915f, 0.793945f, 0.001915f, + 0.775391f, 0.001910f, 0.755859f, 0.001897f, 0.735840f, 0.001877f, 0.715332f, 0.001851f, + 0.694336f, 0.001820f, 0.672852f, 0.001783f, 0.651367f, 0.001743f, 0.629395f, 0.001698f, + 0.607910f, 0.001651f, 0.585938f, 0.001600f, 0.564453f, 0.001549f, 0.542969f, 0.001495f, + 0.521484f, 0.001440f, 0.500488f, 0.001385f, 0.480225f, 0.001329f, 0.459961f, 0.001274f, + 0.440186f, 0.001219f, 0.420654f, 0.001164f, 0.401855f, 0.001111f, 0.383545f, 0.001060f, + 0.365967f, 0.001009f, 0.348633f, 0.000959f, 0.332031f, 0.000912f, 0.316162f, 0.000866f, + 0.999023f, 0.000545f, 0.999023f, 0.000545f, 0.999023f, 0.000545f, 0.999023f, 0.000545f, + 0.999023f, 0.000545f, 0.999023f, 0.000545f, 0.999023f, 0.000545f, 0.999023f, 0.000549f, + 0.999023f, 0.000557f, 0.999023f, 0.000570f, 0.999023f, 0.000588f, 0.999023f, 0.000614f, + 0.999023f, 0.000649f, 0.999023f, 0.000696f, 0.998535f, 0.000758f, 0.998047f, 0.000828f, + 0.995605f, 0.000824f, 0.993652f, 0.000865f, 0.992188f, 0.000930f, 0.990723f, 0.001012f, + 0.987793f, 0.001093f, 0.983398f, 0.001141f, 0.978027f, 0.001224f, 0.972656f, 0.001304f, + 0.968750f, 0.001380f, 0.963867f, 0.001470f, 0.958008f, 0.001546f, 0.951660f, 0.001627f, + 0.943359f, 0.001702f, 0.934082f, 0.001769f, 0.923340f, 0.001833f, 0.913574f, 0.001896f, + 0.901855f, 0.001949f, 0.889160f, 0.001995f, 0.875000f, 0.002031f, 0.860352f, 0.002062f, + 0.845215f, 0.002083f, 0.828613f, 0.002094f, 0.811035f, 0.002098f, 0.792969f, 0.002094f, + 0.774414f, 0.002081f, 0.754883f, 0.002062f, 0.734863f, 0.002035f, 0.714355f, 0.002003f, + 0.693359f, 0.001965f, 0.672363f, 0.001923f, 0.650879f, 0.001874f, 0.629395f, 0.001823f, + 0.607910f, 0.001769f, 0.585938f, 0.001712f, 0.564453f, 0.001654f, 0.543457f, 0.001595f, + 0.521973f, 0.001534f, 0.501465f, 0.001472f, 0.480957f, 0.001410f, 0.460693f, 0.001350f, + 0.440918f, 0.001290f, 0.421875f, 0.001232f, 0.403076f, 0.001174f, 0.384766f, 0.001118f, + 0.367188f, 0.001062f, 0.349854f, 0.001010f, 0.333496f, 0.000958f, 0.317383f, 0.000909f, + 0.999023f, 0.000694f, 0.999023f, 0.000694f, 0.999023f, 0.000694f, 0.999023f, 0.000694f, + 0.999023f, 0.000694f, 0.999023f, 0.000694f, 0.999023f, 0.000694f, 0.999023f, 0.000699f, + 0.999023f, 0.000708f, 0.999023f, 0.000723f, 0.999023f, 0.000743f, 0.999023f, 0.000772f, + 0.999023f, 0.000811f, 0.998535f, 0.000864f, 0.998535f, 0.000931f, 0.997559f, 0.000999f, + 0.995117f, 0.000996f, 0.993652f, 0.001045f, 0.992188f, 0.001119f, 0.990234f, 0.001207f, + 0.987305f, 0.001283f, 0.982910f, 0.001344f, 0.978516f, 0.001436f, 0.971680f, 0.001508f, + 0.967773f, 0.001599f, 0.962891f, 0.001686f, 0.957520f, 0.001774f, 0.950684f, 0.001852f, + 0.942871f, 0.001933f, 0.933105f, 0.002003f, 0.922852f, 0.002066f, 0.912109f, 0.002125f, + 0.900879f, 0.002178f, 0.888184f, 0.002222f, 0.874023f, 0.002254f, 0.859375f, 0.002281f, + 0.843750f, 0.002296f, 0.827148f, 0.002304f, 0.810059f, 0.002302f, 0.791992f, 0.002293f, + 0.773438f, 0.002272f, 0.753906f, 0.002247f, 0.733887f, 0.002213f, 0.713867f, 0.002172f, + 0.692871f, 0.002125f, 0.671875f, 0.002073f, 0.650391f, 0.002018f, 0.629395f, 0.001961f, + 0.607910f, 0.001899f, 0.586426f, 0.001835f, 0.564941f, 0.001769f, 0.543457f, 0.001701f, + 0.522461f, 0.001635f, 0.501953f, 0.001567f, 0.481689f, 0.001500f, 0.461670f, 0.001433f, + 0.441895f, 0.001369f, 0.422852f, 0.001305f, 0.404053f, 0.001242f, 0.385986f, 0.001181f, + 0.368408f, 0.001122f, 0.351318f, 0.001065f, 0.334717f, 0.001010f, 0.318848f, 0.000957f, + 0.999023f, 0.000874f, 0.999023f, 0.000874f, 0.999023f, 0.000874f, 0.999023f, 0.000874f, + 0.999023f, 0.000874f, 0.999023f, 0.000874f, 0.999023f, 0.000874f, 0.999023f, 0.000879f, + 0.999023f, 0.000890f, 0.999023f, 0.000906f, 0.998535f, 0.000930f, 0.998535f, 0.000962f, + 0.998535f, 0.001005f, 0.998535f, 0.001063f, 0.998047f, 0.001138f, 0.997070f, 0.001189f, + 0.994629f, 0.001201f, 0.993164f, 0.001258f, 0.991699f, 0.001341f, 0.990234f, 0.001437f, + 0.986816f, 0.001500f, 0.982910f, 0.001581f, 0.978516f, 0.001681f, 0.971680f, 0.001753f, + 0.967285f, 0.001852f, 0.961914f, 0.001937f, 0.956543f, 0.002033f, 0.949707f, 0.002113f, + 0.941895f, 0.002190f, 0.932617f, 0.002268f, 0.921875f, 0.002331f, 0.910645f, 0.002388f, + 0.899414f, 0.002438f, 0.886719f, 0.002478f, 0.873047f, 0.002508f, 0.857910f, 0.002527f, + 0.842773f, 0.002539f, 0.826172f, 0.002539f, 0.808594f, 0.002529f, 0.791016f, 0.002512f, + 0.772461f, 0.002485f, 0.752930f, 0.002449f, 0.733398f, 0.002407f, 0.712891f, 0.002357f, + 0.692383f, 0.002302f, 0.671387f, 0.002241f, 0.650391f, 0.002178f, 0.628906f, 0.002110f, + 0.607422f, 0.002039f, 0.586426f, 0.001966f, 0.564941f, 0.001894f, 0.543945f, 0.001820f, + 0.522949f, 0.001745f, 0.502441f, 0.001671f, 0.482422f, 0.001597f, 0.462646f, 0.001525f, + 0.443115f, 0.001453f, 0.424072f, 0.001384f, 0.405518f, 0.001316f, 0.387451f, 0.001250f, + 0.369873f, 0.001186f, 0.352783f, 0.001124f, 0.336182f, 0.001065f, 0.320312f, 0.001009f, + 0.998535f, 0.001090f, 0.998535f, 0.001090f, 0.998535f, 0.001090f, 0.998535f, 0.001090f, + 0.998535f, 0.001090f, 0.998535f, 0.001090f, 0.998535f, 0.001090f, 0.998535f, 0.001096f, + 0.998535f, 0.001108f, 0.998535f, 0.001126f, 0.998535f, 0.001152f, 0.998535f, 0.001188f, + 0.998535f, 0.001237f, 0.998047f, 0.001301f, 0.998047f, 0.001381f, 0.996094f, 0.001410f, + 0.994141f, 0.001442f, 0.993164f, 0.001511f, 0.991699f, 0.001602f, 0.989746f, 0.001703f, + 0.986328f, 0.001763f, 0.982910f, 0.001861f, 0.978027f, 0.001961f, 0.971680f, 0.002041f, + 0.966309f, 0.002142f, 0.960938f, 0.002230f, 0.955566f, 0.002325f, 0.948730f, 0.002413f, + 0.940918f, 0.002491f, 0.931641f, 0.002563f, 0.920898f, 0.002628f, 0.909668f, 0.002684f, + 0.897949f, 0.002729f, 0.885742f, 0.002766f, 0.871582f, 0.002790f, 0.856934f, 0.002804f, + 0.841309f, 0.002806f, 0.824707f, 0.002800f, 0.807617f, 0.002783f, 0.789551f, 0.002754f, + 0.770996f, 0.002718f, 0.751953f, 0.002672f, 0.732422f, 0.002621f, 0.711914f, 0.002562f, + 0.691406f, 0.002497f, 0.670898f, 0.002426f, 0.649902f, 0.002352f, 0.628906f, 0.002274f, + 0.607422f, 0.002193f, 0.586426f, 0.002113f, 0.565430f, 0.002031f, 0.544434f, 0.001948f, + 0.523926f, 0.001866f, 0.503418f, 0.001784f, 0.483398f, 0.001703f, 0.463623f, 0.001623f, + 0.444092f, 0.001546f, 0.425293f, 0.001470f, 0.406738f, 0.001396f, 0.388672f, 0.001325f, + 0.371338f, 0.001256f, 0.354248f, 0.001190f, 0.337891f, 0.001126f, 0.322021f, 0.001065f, + 0.998535f, 0.001348f, 0.998535f, 0.001348f, 0.998535f, 0.001348f, 0.998535f, 0.001348f, + 0.998535f, 0.001348f, 0.998535f, 0.001348f, 0.998535f, 0.001348f, 0.998535f, 0.001354f, + 0.998535f, 0.001368f, 0.998535f, 0.001389f, 0.998047f, 0.001417f, 0.998047f, 0.001457f, + 0.998047f, 0.001511f, 0.998047f, 0.001581f, 0.997559f, 0.001668f, 0.995605f, 0.001684f, + 0.994141f, 0.001730f, 0.992676f, 0.001808f, 0.991211f, 0.001908f, 0.989258f, 0.002010f, + 0.985840f, 0.002073f, 0.982422f, 0.002182f, 0.978027f, 0.002279f, 0.971680f, 0.002373f, + 0.964844f, 0.002470f, 0.959961f, 0.002567f, 0.954102f, 0.002657f, 0.947754f, 0.002750f, + 0.939941f, 0.002831f, 0.930664f, 0.002901f, 0.919922f, 0.002962f, 0.908691f, 0.003014f, + 0.896484f, 0.003056f, 0.884277f, 0.003088f, 0.870605f, 0.003105f, 0.855469f, 0.003111f, + 0.839355f, 0.003105f, 0.823242f, 0.003088f, 0.806152f, 0.003061f, 0.788086f, 0.003023f, + 0.770020f, 0.002975f, 0.750977f, 0.002920f, 0.730957f, 0.002855f, 0.711426f, 0.002785f, + 0.690918f, 0.002708f, 0.670410f, 0.002626f, 0.649414f, 0.002541f, 0.628418f, 0.002453f, + 0.607422f, 0.002363f, 0.586426f, 0.002272f, 0.565918f, 0.002180f, 0.544922f, 0.002089f, + 0.524414f, 0.001995f, 0.504395f, 0.001906f, 0.484375f, 0.001818f, 0.464600f, 0.001731f, + 0.445312f, 0.001646f, 0.426514f, 0.001563f, 0.408203f, 0.001483f, 0.390381f, 0.001406f, + 0.372803f, 0.001332f, 0.355957f, 0.001261f, 0.339600f, 0.001192f, 0.323730f, 0.001126f, + 0.998047f, 0.001653f, 0.998047f, 0.001653f, 0.998047f, 0.001653f, 0.998047f, 0.001653f, + 0.998047f, 0.001653f, 0.998047f, 0.001653f, 0.998047f, 0.001653f, 0.998047f, 0.001660f, + 0.998047f, 0.001676f, 0.998047f, 0.001698f, 0.998047f, 0.001730f, 0.998047f, 0.001775f, + 0.997559f, 0.001834f, 0.997559f, 0.001911f, 0.997070f, 0.002003f, 0.994629f, 0.002008f, + 0.993652f, 0.002064f, 0.992188f, 0.002155f, 0.990723f, 0.002264f, 0.988281f, 0.002357f, + 0.985352f, 0.002436f, 0.981934f, 0.002554f, 0.977051f, 0.002642f, 0.971680f, 0.002752f, + 0.964355f, 0.002844f, 0.958984f, 0.002951f, 0.953125f, 0.003044f, 0.946289f, 0.003130f, + 0.938477f, 0.003214f, 0.929199f, 0.003284f, 0.918945f, 0.003342f, 0.907227f, 0.003389f, + 0.895020f, 0.003424f, 0.882324f, 0.003447f, 0.868652f, 0.003456f, 0.854004f, 0.003452f, + 0.838379f, 0.003437f, 0.821777f, 0.003408f, 0.804688f, 0.003368f, 0.787109f, 0.003319f, + 0.768555f, 0.003258f, 0.749512f, 0.003189f, 0.729980f, 0.003113f, 0.710449f, 0.003029f, + 0.690430f, 0.002939f, 0.669434f, 0.002846f, 0.648926f, 0.002748f, 0.628418f, 0.002647f, + 0.607422f, 0.002546f, 0.586914f, 0.002443f, 0.565918f, 0.002342f, 0.545410f, 0.002239f, + 0.525391f, 0.002138f, 0.504883f, 0.002039f, 0.485352f, 0.001942f, 0.465820f, 0.001846f, + 0.446777f, 0.001754f, 0.427979f, 0.001664f, 0.409668f, 0.001577f, 0.391846f, 0.001494f, + 0.374512f, 0.001413f, 0.357666f, 0.001337f, 0.341309f, 0.001264f, 0.325439f, 0.001193f, + 0.997559f, 0.002012f, 0.997559f, 0.002012f, 0.997559f, 0.002012f, 0.997559f, 0.002012f, + 0.997559f, 0.002012f, 0.997559f, 0.002012f, 0.997559f, 0.002012f, 0.997559f, 0.002020f, + 0.997559f, 0.002037f, 0.997559f, 0.002062f, 0.997559f, 0.002098f, 0.997559f, 0.002148f, + 0.997070f, 0.002213f, 0.997070f, 0.002296f, 0.996582f, 0.002390f, 0.994141f, 0.002390f, + 0.993164f, 0.002460f, 0.991699f, 0.002558f, 0.990234f, 0.002676f, 0.987793f, 0.002754f, + 0.984863f, 0.002857f, 0.981445f, 0.002977f, 0.976562f, 0.003069f, 0.971191f, 0.003185f, + 0.964355f, 0.003281f, 0.957520f, 0.003384f, 0.951660f, 0.003483f, 0.944824f, 0.003569f, + 0.937012f, 0.003643f, 0.927734f, 0.003712f, 0.917480f, 0.003765f, 0.906250f, 0.003805f, + 0.893555f, 0.003834f, 0.880859f, 0.003847f, 0.867188f, 0.003847f, 0.852539f, 0.003832f, + 0.836914f, 0.003803f, 0.820312f, 0.003761f, 0.803223f, 0.003710f, 0.785645f, 0.003643f, + 0.767090f, 0.003569f, 0.748535f, 0.003485f, 0.729004f, 0.003395f, 0.709473f, 0.003296f, + 0.689453f, 0.003193f, 0.668945f, 0.003084f, 0.648438f, 0.002974f, 0.627930f, 0.002861f, + 0.607422f, 0.002747f, 0.586914f, 0.002632f, 0.566406f, 0.002518f, 0.545898f, 0.002403f, + 0.525879f, 0.002293f, 0.505859f, 0.002184f, 0.486572f, 0.002075f, 0.467041f, 0.001972f, + 0.447998f, 0.001871f, 0.429443f, 0.001774f, 0.411377f, 0.001679f, 0.393555f, 0.001589f, + 0.376221f, 0.001502f, 0.359375f, 0.001419f, 0.343262f, 0.001340f, 0.327393f, 0.001265f, + 0.997070f, 0.002434f, 0.997070f, 0.002434f, 0.997070f, 0.002434f, 0.997070f, 0.002434f, + 0.997070f, 0.002434f, 0.997070f, 0.002434f, 0.997070f, 0.002434f, 0.997070f, 0.002443f, + 0.997070f, 0.002462f, 0.997070f, 0.002489f, 0.997070f, 0.002529f, 0.997070f, 0.002583f, + 0.997070f, 0.002655f, 0.996582f, 0.002747f, 0.995605f, 0.002827f, 0.993652f, 0.002840f, + 0.992188f, 0.002918f, 0.991211f, 0.003027f, 0.989746f, 0.003151f, 0.986816f, 0.003223f, + 0.984375f, 0.003344f, 0.980957f, 0.003462f, 0.976074f, 0.003563f, 0.970703f, 0.003677f, + 0.963867f, 0.003782f, 0.956055f, 0.003876f, 0.950195f, 0.003975f, 0.943359f, 0.004063f, + 0.935547f, 0.004135f, 0.926270f, 0.004196f, 0.916016f, 0.004242f, 0.904785f, 0.004276f, + 0.892090f, 0.004292f, 0.878418f, 0.004292f, 0.865234f, 0.004280f, 0.850586f, 0.004253f, + 0.834961f, 0.004208f, 0.818359f, 0.004150f, 0.801758f, 0.004082f, 0.784180f, 0.004002f, + 0.765625f, 0.003910f, 0.747070f, 0.003811f, 0.728027f, 0.003702f, 0.708496f, 0.003590f, + 0.688477f, 0.003469f, 0.668457f, 0.003345f, 0.648438f, 0.003220f, 0.627930f, 0.003092f, + 0.607422f, 0.002964f, 0.587402f, 0.002834f, 0.566895f, 0.002708f, 0.546875f, 0.002583f, + 0.526855f, 0.002459f, 0.506836f, 0.002338f, 0.487549f, 0.002222f, 0.468506f, 0.002108f, + 0.449463f, 0.001997f, 0.431152f, 0.001892f, 0.413086f, 0.001790f, 0.395264f, 0.001692f, + 0.378174f, 0.001598f, 0.361328f, 0.001509f, 0.345215f, 0.001423f, 0.329346f, 0.001342f, + 0.996582f, 0.002928f, 0.996582f, 0.002928f, 0.996582f, 0.002928f, 0.996582f, 0.002928f, + 0.996582f, 0.002928f, 0.996582f, 0.002928f, 0.996582f, 0.002928f, 0.996582f, 0.002937f, + 0.996582f, 0.002958f, 0.996582f, 0.002989f, 0.996582f, 0.003033f, 0.996582f, 0.003092f, + 0.996094f, 0.003170f, 0.996094f, 0.003271f, 0.994629f, 0.003317f, 0.992676f, 0.003361f, + 0.991699f, 0.003448f, 0.990723f, 0.003571f, 0.988770f, 0.003695f, 0.985840f, 0.003771f, + 0.983398f, 0.003902f, 0.979980f, 0.004005f, 0.975586f, 0.004128f, 0.969727f, 0.004230f, + 0.963379f, 0.004345f, 0.955078f, 0.004440f, 0.948730f, 0.004532f, 0.941406f, 0.004616f, + 0.933594f, 0.004684f, 0.924805f, 0.004738f, 0.914551f, 0.004780f, 0.902832f, 0.004799f, + 0.890625f, 0.004803f, 0.876953f, 0.004791f, 0.863281f, 0.004761f, 0.848633f, 0.004719f, + 0.833496f, 0.004658f, 0.816895f, 0.004585f, 0.799805f, 0.004494f, 0.782227f, 0.004395f, + 0.764160f, 0.004284f, 0.745605f, 0.004166f, 0.726562f, 0.004040f, 0.707520f, 0.003906f, + 0.687500f, 0.003769f, 0.667969f, 0.003630f, 0.647949f, 0.003487f, 0.627930f, 0.003344f, + 0.607422f, 0.003199f, 0.587402f, 0.003056f, 0.567383f, 0.002914f, 0.547363f, 0.002777f, + 0.527832f, 0.002640f, 0.507812f, 0.002508f, 0.488770f, 0.002380f, 0.469727f, 0.002256f, + 0.451172f, 0.002136f, 0.432861f, 0.002020f, 0.414795f, 0.001909f, 0.397217f, 0.001803f, + 0.380127f, 0.001701f, 0.363525f, 0.001605f, 0.347168f, 0.001513f, 0.331543f, 0.001425f, + 0.996094f, 0.003502f, 0.996094f, 0.003502f, 0.996094f, 0.003502f, 0.996094f, 0.003502f, + 0.996094f, 0.003502f, 0.996094f, 0.003502f, 0.996094f, 0.003502f, 0.996094f, 0.003513f, + 0.996094f, 0.003536f, 0.996094f, 0.003571f, 0.996094f, 0.003618f, 0.995605f, 0.003683f, + 0.995605f, 0.003769f, 0.995117f, 0.003878f, 0.993652f, 0.003906f, 0.992188f, 0.003963f, + 0.991211f, 0.004066f, 0.989746f, 0.004196f, 0.987793f, 0.004307f, 0.985352f, 0.004402f, + 0.982422f, 0.004539f, 0.978516f, 0.004639f, 0.974609f, 0.004772f, 0.969238f, 0.004875f, + 0.962402f, 0.004986f, 0.954590f, 0.005085f, 0.946777f, 0.005165f, 0.939941f, 0.005241f, + 0.931641f, 0.005302f, 0.922852f, 0.005348f, 0.912598f, 0.005375f, 0.901367f, 0.005383f, + 0.888672f, 0.005375f, 0.875000f, 0.005344f, 0.860840f, 0.005295f, 0.846680f, 0.005234f, + 0.831543f, 0.005154f, 0.814941f, 0.005058f, 0.797852f, 0.004948f, 0.780762f, 0.004826f, + 0.762695f, 0.004696f, 0.744141f, 0.004555f, 0.725586f, 0.004406f, 0.706543f, 0.004253f, + 0.687012f, 0.004097f, 0.666992f, 0.003937f, 0.647461f, 0.003777f, 0.627441f, 0.003614f, + 0.607422f, 0.003454f, 0.587891f, 0.003296f, 0.567871f, 0.003139f, 0.548340f, 0.002985f, + 0.528320f, 0.002836f, 0.509277f, 0.002691f, 0.490234f, 0.002550f, 0.471191f, 0.002415f, + 0.452637f, 0.002283f, 0.434570f, 0.002157f, 0.416748f, 0.002037f, 0.399170f, 0.001924f, + 0.382080f, 0.001813f, 0.365723f, 0.001709f, 0.349365f, 0.001610f, 0.333740f, 0.001515f, + 0.995605f, 0.004169f, 0.995605f, 0.004169f, 0.995605f, 0.004169f, 0.995605f, 0.004169f, + 0.995605f, 0.004169f, 0.995605f, 0.004169f, 0.995605f, 0.004169f, 0.995605f, 0.004181f, + 0.995605f, 0.004208f, 0.995605f, 0.004242f, 0.995117f, 0.004295f, 0.995117f, 0.004368f, + 0.995117f, 0.004463f, 0.994629f, 0.004578f, 0.992676f, 0.004589f, 0.991211f, 0.004662f, + 0.990234f, 0.004776f, 0.989258f, 0.004917f, 0.986816f, 0.005005f, 0.984375f, 0.005127f, + 0.981445f, 0.005268f, 0.978027f, 0.005371f, 0.973633f, 0.005497f, 0.968262f, 0.005608f, + 0.961426f, 0.005707f, 0.953613f, 0.005806f, 0.944824f, 0.005886f, 0.937500f, 0.005951f, + 0.929688f, 0.006004f, 0.920898f, 0.006035f, 0.910645f, 0.006046f, 0.899414f, 0.006035f, + 0.886719f, 0.006004f, 0.873047f, 0.005959f, 0.858887f, 0.005886f, 0.844238f, 0.005798f, + 0.829102f, 0.005695f, 0.812988f, 0.005577f, 0.796387f, 0.005447f, 0.778809f, 0.005299f, + 0.761230f, 0.005142f, 0.743164f, 0.004978f, 0.724121f, 0.004810f, 0.705078f, 0.004631f, + 0.686035f, 0.004452f, 0.666504f, 0.004272f, 0.646973f, 0.004089f, 0.627441f, 0.003910f, + 0.607910f, 0.003731f, 0.587891f, 0.003555f, 0.568359f, 0.003382f, 0.548828f, 0.003212f, + 0.529785f, 0.003048f, 0.510254f, 0.002888f, 0.491455f, 0.002735f, 0.472900f, 0.002586f, + 0.454590f, 0.002443f, 0.436523f, 0.002308f, 0.418701f, 0.002176f, 0.401367f, 0.002052f, + 0.384277f, 0.001934f, 0.367920f, 0.001822f, 0.351807f, 0.001714f, 0.336182f, 0.001612f, + 0.994629f, 0.004940f, 0.994629f, 0.004940f, 0.994629f, 0.004940f, 0.994629f, 0.004940f, + 0.994629f, 0.004940f, 0.994629f, 0.004940f, 0.994629f, 0.004940f, 0.994629f, 0.004955f, + 0.994629f, 0.004982f, 0.994629f, 0.005024f, 0.994629f, 0.005081f, 0.994141f, 0.005161f, + 0.994141f, 0.005260f, 0.993652f, 0.005379f, 0.991699f, 0.005383f, 0.990234f, 0.005470f, + 0.989258f, 0.005592f, 0.987793f, 0.005741f, 0.985352f, 0.005825f, 0.983398f, 0.005959f, + 0.979980f, 0.006084f, 0.976562f, 0.006207f, 0.972168f, 0.006317f, 0.966797f, 0.006439f, + 0.960449f, 0.006535f, 0.952637f, 0.006615f, 0.943359f, 0.006687f, 0.935547f, 0.006744f, + 0.927246f, 0.006783f, 0.918457f, 0.006798f, 0.908203f, 0.006790f, 0.896973f, 0.006763f, + 0.884766f, 0.006710f, 0.871094f, 0.006634f, 0.856445f, 0.006542f, 0.841797f, 0.006428f, + 0.826660f, 0.006298f, 0.811035f, 0.006153f, 0.794434f, 0.005989f, 0.776855f, 0.005817f, + 0.759277f, 0.005634f, 0.741211f, 0.005444f, 0.723145f, 0.005245f, 0.704102f, 0.005043f, + 0.685059f, 0.004841f, 0.666016f, 0.004639f, 0.646484f, 0.004433f, 0.627441f, 0.004230f, + 0.607910f, 0.004032f, 0.588379f, 0.003836f, 0.569336f, 0.003645f, 0.549805f, 0.003458f, + 0.530762f, 0.003277f, 0.511719f, 0.003101f, 0.493164f, 0.002934f, 0.474609f, 0.002771f, + 0.456299f, 0.002617f, 0.438477f, 0.002468f, 0.420898f, 0.002327f, 0.403564f, 0.002192f, + 0.386719f, 0.002064f, 0.370361f, 0.001942f, 0.354248f, 0.001826f, 0.338623f, 0.001718f, + 0.993652f, 0.005836f, 0.993652f, 0.005836f, 0.993652f, 0.005836f, 0.993652f, 0.005836f, + 0.993652f, 0.005836f, 0.993652f, 0.005836f, 0.993652f, 0.005836f, 0.993652f, 0.005852f, + 0.993652f, 0.005882f, 0.993652f, 0.005924f, 0.993652f, 0.005989f, 0.993164f, 0.006073f, + 0.993164f, 0.006184f, 0.992188f, 0.006290f, 0.990234f, 0.006298f, 0.989258f, 0.006393f, + 0.988281f, 0.006535f, 0.986816f, 0.006680f, 0.984375f, 0.006763f, 0.981934f, 0.006912f, + 0.979004f, 0.007019f, 0.975098f, 0.007156f, 0.970703f, 0.007259f, 0.965332f, 0.007370f, + 0.958984f, 0.007465f, 0.951172f, 0.007542f, 0.942383f, 0.007599f, 0.933105f, 0.007641f, + 0.924805f, 0.007656f, 0.916016f, 0.007652f, 0.905762f, 0.007622f, 0.894531f, 0.007568f, + 0.882324f, 0.007492f, 0.868652f, 0.007389f, 0.854492f, 0.007267f, 0.839355f, 0.007122f, + 0.824219f, 0.006958f, 0.808594f, 0.006779f, 0.792480f, 0.006588f, 0.774902f, 0.006382f, + 0.757324f, 0.006168f, 0.739746f, 0.005951f, 0.721680f, 0.005722f, 0.703125f, 0.005493f, + 0.684082f, 0.005264f, 0.665527f, 0.005032f, 0.646484f, 0.004803f, 0.627441f, 0.004578f, + 0.607910f, 0.004356f, 0.588867f, 0.004139f, 0.569824f, 0.003925f, 0.550781f, 0.003723f, + 0.531738f, 0.003525f, 0.513184f, 0.003332f, 0.494629f, 0.003149f, 0.476318f, 0.002974f, + 0.458252f, 0.002804f, 0.440430f, 0.002644f, 0.423096f, 0.002489f, 0.406006f, 0.002344f, + 0.389160f, 0.002205f, 0.372803f, 0.002073f, 0.356689f, 0.001949f, 0.341309f, 0.001831f, + 0.992676f, 0.006866f, 0.992676f, 0.006866f, 0.992676f, 0.006866f, 0.992676f, 0.006866f, + 0.992676f, 0.006866f, 0.992676f, 0.006866f, 0.992676f, 0.006866f, 0.992676f, 0.006882f, + 0.992676f, 0.006916f, 0.992676f, 0.006966f, 0.992676f, 0.007034f, 0.992188f, 0.007126f, + 0.992188f, 0.007244f, 0.990723f, 0.007305f, 0.989258f, 0.007351f, 0.988281f, 0.007465f, + 0.987305f, 0.007610f, 0.985352f, 0.007732f, 0.982910f, 0.007843f, 0.980469f, 0.007988f, + 0.977051f, 0.008095f, 0.973633f, 0.008224f, 0.969238f, 0.008331f, 0.963867f, 0.008423f, + 0.957520f, 0.008507f, 0.949707f, 0.008575f, 0.940430f, 0.008621f, 0.930664f, 0.008636f, + 0.922363f, 0.008629f, 0.913086f, 0.008606f, 0.902832f, 0.008545f, 0.891602f, 0.008461f, + 0.879395f, 0.008354f, 0.866211f, 0.008217f, 0.852051f, 0.008057f, 0.836914f, 0.007881f, + 0.821777f, 0.007683f, 0.806152f, 0.007469f, 0.790039f, 0.007244f, 0.772949f, 0.007000f, + 0.755859f, 0.006756f, 0.737793f, 0.006500f, 0.720215f, 0.006241f, 0.702148f, 0.005981f, + 0.683594f, 0.005722f, 0.664551f, 0.005463f, 0.645996f, 0.005207f, 0.627441f, 0.004955f, + 0.608398f, 0.004707f, 0.589355f, 0.004467f, 0.570312f, 0.004234f, 0.551758f, 0.004009f, + 0.533203f, 0.003792f, 0.514648f, 0.003582f, 0.496338f, 0.003382f, 0.478271f, 0.003189f, + 0.460205f, 0.003006f, 0.442627f, 0.002831f, 0.425293f, 0.002665f, 0.408203f, 0.002506f, + 0.391602f, 0.002356f, 0.375488f, 0.002214f, 0.359619f, 0.002079f, 0.343994f, 0.001952f, + 0.991699f, 0.008049f, 0.991699f, 0.008049f, 0.991699f, 0.008049f, 0.991699f, 0.008049f, + 0.991699f, 0.008049f, 0.991699f, 0.008049f, 0.991699f, 0.008049f, 0.991699f, 0.008064f, + 0.991699f, 0.008102f, 0.991211f, 0.008156f, 0.991211f, 0.008232f, 0.991211f, 0.008331f, + 0.990723f, 0.008461f, 0.989258f, 0.008492f, 0.987793f, 0.008560f, 0.986816f, 0.008682f, + 0.985840f, 0.008842f, 0.983398f, 0.008934f, 0.981445f, 0.009071f, 0.979004f, 0.009209f, + 0.975586f, 0.009323f, 0.971680f, 0.009430f, 0.967285f, 0.009544f, 0.961914f, 0.009628f, + 0.955566f, 0.009697f, 0.947754f, 0.009743f, 0.938965f, 0.009766f, 0.928711f, 0.009758f, + 0.919434f, 0.009727f, 0.910156f, 0.009666f, 0.899902f, 0.009575f, 0.888672f, 0.009460f, + 0.876953f, 0.009308f, 0.863770f, 0.009132f, 0.849609f, 0.008934f, 0.834473f, 0.008720f, + 0.818848f, 0.008476f, 0.803223f, 0.008224f, 0.787598f, 0.007957f, 0.770996f, 0.007679f, + 0.753906f, 0.007393f, 0.736328f, 0.007099f, 0.718750f, 0.006805f, 0.700684f, 0.006512f, + 0.682617f, 0.006218f, 0.664062f, 0.005928f, 0.645508f, 0.005642f, 0.627441f, 0.005360f, + 0.608398f, 0.005089f, 0.589844f, 0.004822f, 0.571289f, 0.004566f, 0.552734f, 0.004318f, + 0.534668f, 0.004078f, 0.516113f, 0.003851f, 0.498047f, 0.003633f, 0.480225f, 0.003424f, + 0.462402f, 0.003223f, 0.445068f, 0.003035f, 0.427734f, 0.002853f, 0.410889f, 0.002682f, + 0.394287f, 0.002520f, 0.378174f, 0.002367f, 0.362305f, 0.002222f, 0.346924f, 0.002085f, + 0.990234f, 0.009415f, 0.990234f, 0.009415f, 0.990234f, 0.009415f, 0.990234f, 0.009415f, + 0.990234f, 0.009415f, 0.990234f, 0.009415f, 0.990234f, 0.009415f, 0.990234f, 0.009430f, + 0.990234f, 0.009476f, 0.990234f, 0.009529f, 0.989746f, 0.009613f, 0.989746f, 0.009720f, + 0.989258f, 0.009857f, 0.987305f, 0.009865f, 0.986328f, 0.009949f, 0.985352f, 0.010078f, + 0.983887f, 0.010246f, 0.981934f, 0.010330f, 0.979980f, 0.010483f, 0.977051f, 0.010590f, + 0.973633f, 0.010719f, 0.969727f, 0.010811f, 0.965332f, 0.010910f, 0.959961f, 0.010986f, + 0.953613f, 0.011032f, 0.945801f, 0.011055f, 0.937012f, 0.011055f, 0.926758f, 0.011017f, + 0.916016f, 0.010948f, 0.906738f, 0.010849f, 0.896484f, 0.010719f, 0.885742f, 0.010559f, + 0.873535f, 0.010368f, 0.860352f, 0.010147f, 0.846680f, 0.009903f, 0.832031f, 0.009636f, + 0.816406f, 0.009354f, 0.800781f, 0.009048f, 0.785156f, 0.008736f, 0.768555f, 0.008415f, + 0.751953f, 0.008087f, 0.734863f, 0.007751f, 0.717285f, 0.007420f, 0.699707f, 0.007088f, + 0.681641f, 0.006756f, 0.663574f, 0.006432f, 0.645508f, 0.006111f, 0.627441f, 0.005802f, + 0.608887f, 0.005501f, 0.590332f, 0.005207f, 0.572266f, 0.004925f, 0.554199f, 0.004654f, + 0.535645f, 0.004391f, 0.517578f, 0.004143f, 0.500000f, 0.003904f, 0.482178f, 0.003675f, + 0.464844f, 0.003458f, 0.447510f, 0.003254f, 0.430420f, 0.003057f, 0.413574f, 0.002872f, + 0.397217f, 0.002697f, 0.381104f, 0.002531f, 0.365234f, 0.002375f, 0.349854f, 0.002228f, + 0.988770f, 0.010979f, 0.988770f, 0.010979f, 0.988770f, 0.010979f, 0.988770f, 0.010979f, + 0.988770f, 0.010979f, 0.988770f, 0.010979f, 0.988770f, 0.010979f, 0.988770f, 0.011002f, + 0.988770f, 0.011040f, 0.988281f, 0.011108f, 0.988281f, 0.011192f, 0.987793f, 0.011314f, + 0.987305f, 0.011444f, 0.985840f, 0.011436f, 0.984375f, 0.011536f, 0.983398f, 0.011688f, + 0.981934f, 0.011833f, 0.979980f, 0.011925f, 0.978027f, 0.012077f, 0.974609f, 0.012169f, + 0.971680f, 0.012291f, 0.967773f, 0.012383f, 0.962891f, 0.012451f, 0.957520f, 0.012505f, + 0.951172f, 0.012527f, 0.943359f, 0.012527f, 0.934570f, 0.012489f, 0.924316f, 0.012421f, + 0.913574f, 0.012306f, 0.902832f, 0.012161f, 0.893066f, 0.011986f, 0.881836f, 0.011772f, + 0.870117f, 0.011536f, 0.857422f, 0.011261f, 0.843750f, 0.010963f, 0.829102f, 0.010643f, + 0.813477f, 0.010307f, 0.797852f, 0.009949f, 0.782227f, 0.009590f, 0.766113f, 0.009216f, + 0.750000f, 0.008842f, 0.732910f, 0.008461f, 0.715820f, 0.008080f, 0.698242f, 0.007710f, + 0.680664f, 0.007339f, 0.663086f, 0.006977f, 0.645020f, 0.006622f, 0.627441f, 0.006279f, + 0.609375f, 0.005943f, 0.591309f, 0.005623f, 0.573242f, 0.005310f, 0.555176f, 0.005013f, + 0.537598f, 0.004730f, 0.519531f, 0.004456f, 0.501953f, 0.004196f, 0.484375f, 0.003948f, + 0.467041f, 0.003714f, 0.449951f, 0.003490f, 0.433105f, 0.003277f, 0.416504f, 0.003077f, + 0.400146f, 0.002888f, 0.384033f, 0.002708f, 0.368408f, 0.002541f, 0.353271f, 0.002382f, + 0.986816f, 0.012772f, 0.986816f, 0.012772f, 0.986816f, 0.012772f, 0.986816f, 0.012772f, + 0.986816f, 0.012772f, 0.986816f, 0.012772f, 0.986816f, 0.012772f, 0.986816f, 0.012794f, + 0.986816f, 0.012840f, 0.986816f, 0.012909f, 0.986328f, 0.013008f, 0.986328f, 0.013130f, + 0.985352f, 0.013252f, 0.983398f, 0.013237f, 0.982422f, 0.013359f, 0.981445f, 0.013519f, + 0.979492f, 0.013626f, 0.977539f, 0.013741f, 0.975586f, 0.013885f, 0.972656f, 0.013977f, + 0.969238f, 0.014069f, 0.964844f, 0.014153f, 0.960449f, 0.014198f, 0.954590f, 0.014221f, + 0.948242f, 0.014214f, 0.940918f, 0.014175f, 0.932129f, 0.014099f, 0.921875f, 0.013977f, + 0.910645f, 0.013817f, 0.899414f, 0.013626f, 0.889160f, 0.013390f, 0.877930f, 0.013123f, + 0.866211f, 0.012817f, 0.853516f, 0.012489f, 0.840332f, 0.012131f, 0.825684f, 0.011749f, + 0.811035f, 0.011353f, 0.795410f, 0.010941f, 0.779297f, 0.010513f, 0.763672f, 0.010086f, + 0.747559f, 0.009659f, 0.730957f, 0.009224f, 0.714355f, 0.008804f, 0.697266f, 0.008377f, + 0.679688f, 0.007973f, 0.662598f, 0.007565f, 0.645020f, 0.007175f, 0.627441f, 0.006794f, + 0.609863f, 0.006424f, 0.592285f, 0.006069f, 0.574219f, 0.005730f, 0.556641f, 0.005405f, + 0.539062f, 0.005093f, 0.521484f, 0.004795f, 0.503906f, 0.004513f, 0.486816f, 0.004242f, + 0.469727f, 0.003986f, 0.452637f, 0.003746f, 0.436035f, 0.003515f, 0.419434f, 0.003300f, + 0.403320f, 0.003094f, 0.387451f, 0.002901f, 0.371826f, 0.002720f, 0.356445f, 0.002548f, + 0.984863f, 0.014832f, 0.984863f, 0.014832f, 0.984863f, 0.014832f, 0.984863f, 0.014832f, + 0.984863f, 0.014832f, 0.984863f, 0.014832f, 0.984863f, 0.014832f, 0.984863f, 0.014854f, + 0.984863f, 0.014908f, 0.984375f, 0.014977f, 0.984375f, 0.015083f, 0.983887f, 0.015213f, + 0.982910f, 0.015266f, 0.981445f, 0.015312f, 0.980469f, 0.015427f, 0.979492f, 0.015602f, + 0.977051f, 0.015671f, 0.975586f, 0.015808f, 0.972656f, 0.015915f, 0.969727f, 0.016022f, + 0.966309f, 0.016083f, 0.962402f, 0.016129f, 0.957520f, 0.016159f, 0.951660f, 0.016159f, + 0.945312f, 0.016113f, 0.937500f, 0.016022f, 0.928711f, 0.015884f, 0.918945f, 0.015717f, + 0.907715f, 0.015503f, 0.895996f, 0.015244f, 0.884766f, 0.014954f, 0.874023f, 0.014610f, + 0.862305f, 0.014236f, 0.849609f, 0.013840f, 0.836426f, 0.013405f, 0.822754f, 0.012955f, + 0.808105f, 0.012489f, 0.792480f, 0.012016f, 0.776855f, 0.011528f, 0.760742f, 0.011040f, + 0.745605f, 0.010551f, 0.729492f, 0.010063f, 0.712891f, 0.009583f, 0.695801f, 0.009109f, + 0.679199f, 0.008652f, 0.662109f, 0.008202f, 0.645020f, 0.007771f, 0.627930f, 0.007351f, + 0.610352f, 0.006947f, 0.592773f, 0.006554f, 0.575684f, 0.006184f, 0.558105f, 0.005825f, + 0.540527f, 0.005486f, 0.523438f, 0.005161f, 0.506348f, 0.004852f, 0.489258f, 0.004559f, + 0.472412f, 0.004284f, 0.455566f, 0.004021f, 0.438965f, 0.003773f, 0.422607f, 0.003538f, + 0.406494f, 0.003317f, 0.390625f, 0.003109f, 0.375244f, 0.002913f, 0.360107f, 0.002729f, + 0.982422f, 0.017181f, 0.982422f, 0.017181f, 0.982422f, 0.017181f, 0.982422f, 0.017181f, + 0.982422f, 0.017181f, 0.982422f, 0.017181f, 0.982422f, 0.017181f, 0.982422f, 0.017212f, + 0.982422f, 0.017258f, 0.981934f, 0.017349f, 0.981934f, 0.017456f, 0.981445f, 0.017593f, + 0.979980f, 0.017609f, 0.978516f, 0.017670f, 0.978027f, 0.017807f, 0.976562f, 0.017960f, + 0.974609f, 0.018021f, 0.972656f, 0.018173f, 0.969727f, 0.018234f, 0.966797f, 0.018326f, + 0.963379f, 0.018372f, 0.958984f, 0.018402f, 0.954102f, 0.018387f, 0.948242f, 0.018326f, + 0.941895f, 0.018234f, 0.934082f, 0.018097f, 0.925293f, 0.017899f, 0.915527f, 0.017654f, + 0.904297f, 0.017365f, 0.892578f, 0.017029f, 0.880371f, 0.016663f, 0.869629f, 0.016251f, + 0.857910f, 0.015793f, 0.845703f, 0.015320f, 0.832520f, 0.014801f, 0.818848f, 0.014282f, + 0.804688f, 0.013733f, 0.789551f, 0.013184f, 0.774414f, 0.012627f, 0.758301f, 0.012070f, + 0.742676f, 0.011520f, 0.727539f, 0.010971f, 0.711426f, 0.010429f, 0.694824f, 0.009903f, + 0.678223f, 0.009392f, 0.661621f, 0.008896f, 0.645020f, 0.008415f, 0.627930f, 0.007950f, + 0.610840f, 0.007507f, 0.593750f, 0.007080f, 0.576660f, 0.006672f, 0.559570f, 0.006283f, + 0.542480f, 0.005909f, 0.525391f, 0.005558f, 0.508789f, 0.005222f, 0.491943f, 0.004906f, + 0.475098f, 0.004604f, 0.458496f, 0.004318f, 0.442139f, 0.004051f, 0.426025f, 0.003798f, + 0.409912f, 0.003559f, 0.394287f, 0.003334f, 0.378906f, 0.003122f, 0.363770f, 0.002924f, + 0.979980f, 0.019882f, 0.979980f, 0.019882f, 0.979980f, 0.019882f, 0.979980f, 0.019882f, + 0.979980f, 0.019882f, 0.979980f, 0.019882f, 0.979980f, 0.019882f, 0.979980f, 0.019913f, + 0.979492f, 0.019958f, 0.979492f, 0.020050f, 0.979004f, 0.020172f, 0.978516f, 0.020309f, + 0.977051f, 0.020294f, 0.976074f, 0.020370f, 0.975098f, 0.020523f, 0.973633f, 0.020645f, + 0.971680f, 0.020706f, 0.969238f, 0.020828f, 0.966797f, 0.020889f, 0.963379f, 0.020935f, + 0.959961f, 0.020966f, 0.955566f, 0.020950f, 0.950684f, 0.020889f, 0.944824f, 0.020782f, + 0.937988f, 0.020615f, 0.930176f, 0.020401f, 0.921387f, 0.020142f, 0.911621f, 0.019821f, + 0.900879f, 0.019455f, 0.888672f, 0.019028f, 0.876465f, 0.018555f, 0.864746f, 0.018051f, + 0.853027f, 0.017502f, 0.841309f, 0.016937f, 0.828125f, 0.016327f, 0.814941f, 0.015717f, + 0.801270f, 0.015091f, 0.786621f, 0.014465f, 0.771484f, 0.013824f, 0.756348f, 0.013191f, + 0.740723f, 0.012566f, 0.725098f, 0.011955f, 0.709961f, 0.011353f, 0.693848f, 0.010765f, + 0.677734f, 0.010193f, 0.661133f, 0.009644f, 0.644531f, 0.009109f, 0.628418f, 0.008598f, + 0.611816f, 0.008110f, 0.595215f, 0.007645f, 0.578125f, 0.007198f, 0.561523f, 0.006775f, + 0.544922f, 0.006367f, 0.527832f, 0.005985f, 0.511230f, 0.005619f, 0.494629f, 0.005276f, + 0.478027f, 0.004948f, 0.461670f, 0.004642f, 0.445557f, 0.004349f, 0.429443f, 0.004078f, + 0.413574f, 0.003820f, 0.397949f, 0.003576f, 0.382568f, 0.003349f, 0.367676f, 0.003136f, + 0.976562f, 0.022964f, 0.976562f, 0.022964f, 0.976562f, 0.022964f, 0.976562f, 0.022964f, + 0.976562f, 0.022964f, 0.976562f, 0.022964f, 0.976562f, 0.022964f, 0.976562f, 0.022995f, + 0.976562f, 0.023056f, 0.976074f, 0.023148f, 0.976074f, 0.023270f, 0.975586f, 0.023407f, + 0.973633f, 0.023361f, 0.972656f, 0.023453f, 0.971680f, 0.023590f, 0.969727f, 0.023666f, + 0.968262f, 0.023773f, 0.965820f, 0.023834f, 0.962891f, 0.023895f, 0.959473f, 0.023895f, + 0.956055f, 0.023880f, 0.951172f, 0.023804f, 0.946289f, 0.023682f, 0.940430f, 0.023514f, + 0.933594f, 0.023285f, 0.925781f, 0.022980f, 0.917480f, 0.022629f, 0.907715f, 0.022217f, + 0.896973f, 0.021744f, 0.884766f, 0.021210f, 0.872070f, 0.020645f, 0.859375f, 0.020035f, + 0.848145f, 0.019379f, 0.836426f, 0.018707f, 0.823730f, 0.018005f, 0.811035f, 0.017288f, + 0.797363f, 0.016571f, 0.783203f, 0.015854f, 0.768555f, 0.015121f, 0.753906f, 0.014412f, + 0.738281f, 0.013702f, 0.723145f, 0.013016f, 0.708008f, 0.012344f, 0.692871f, 0.011688f, + 0.677246f, 0.011063f, 0.661133f, 0.010452f, 0.645020f, 0.009865f, 0.628906f, 0.009308f, + 0.612793f, 0.008766f, 0.596191f, 0.008255f, 0.580078f, 0.007771f, 0.563477f, 0.007305f, + 0.546875f, 0.006863f, 0.530273f, 0.006447f, 0.513672f, 0.006050f, 0.497559f, 0.005676f, + 0.481201f, 0.005325f, 0.465088f, 0.004990f, 0.448975f, 0.004677f, 0.433105f, 0.004379f, + 0.417236f, 0.004101f, 0.401855f, 0.003841f, 0.386475f, 0.003595f, 0.371582f, 0.003365f, + 0.973145f, 0.026489f, 0.973145f, 0.026489f, 0.973145f, 0.026489f, 0.973145f, 0.026489f, + 0.973145f, 0.026489f, 0.973145f, 0.026489f, 0.973145f, 0.026489f, 0.973145f, 0.026535f, + 0.973145f, 0.026596f, 0.972656f, 0.026688f, 0.972168f, 0.026825f, 0.971680f, 0.026901f, + 0.969727f, 0.026871f, 0.968750f, 0.026978f, 0.967773f, 0.027130f, 0.965820f, 0.027145f, + 0.963867f, 0.027252f, 0.961426f, 0.027252f, 0.958984f, 0.027283f, 0.955566f, 0.027267f, + 0.951660f, 0.027176f, 0.946777f, 0.027039f, 0.941406f, 0.026855f, 0.935547f, 0.026581f, + 0.928711f, 0.026260f, 0.920898f, 0.025864f, 0.912598f, 0.025406f, 0.902832f, 0.024872f, + 0.892090f, 0.024277f, 0.880371f, 0.023636f, 0.868164f, 0.022934f, 0.854980f, 0.022217f, + 0.842285f, 0.021439f, 0.831055f, 0.020645f, 0.818848f, 0.019821f, 0.806641f, 0.019012f, + 0.793457f, 0.018173f, 0.779785f, 0.017349f, 0.765625f, 0.016525f, 0.750977f, 0.015732f, + 0.736328f, 0.014938f, 0.721191f, 0.014168f, 0.706055f, 0.013420f, 0.691406f, 0.012695f, + 0.676270f, 0.011993f, 0.661133f, 0.011322f, 0.645508f, 0.010681f, 0.629395f, 0.010063f, + 0.613281f, 0.009476f, 0.597656f, 0.008919f, 0.581543f, 0.008385f, 0.565430f, 0.007874f, + 0.548828f, 0.007401f, 0.532715f, 0.006947f, 0.516602f, 0.006516f, 0.500488f, 0.006111f, + 0.484375f, 0.005726f, 0.468506f, 0.005367f, 0.452637f, 0.005028f, 0.436768f, 0.004707f, + 0.421387f, 0.004410f, 0.406006f, 0.004128f, 0.390625f, 0.003860f, 0.375977f, 0.003613f, + 0.969238f, 0.030533f, 0.969238f, 0.030533f, 0.969238f, 0.030533f, 0.969238f, 0.030533f, + 0.969238f, 0.030533f, 0.969238f, 0.030533f, 0.969238f, 0.030533f, 0.969238f, 0.030579f, + 0.968750f, 0.030640f, 0.968750f, 0.030746f, 0.968262f, 0.030884f, 0.966797f, 0.030869f, + 0.965820f, 0.030884f, 0.964844f, 0.030991f, 0.963379f, 0.031128f, 0.961426f, 0.031113f, + 0.959473f, 0.031174f, 0.957031f, 0.031158f, 0.954102f, 0.031113f, 0.950684f, 0.031036f, + 0.946289f, 0.030899f, 0.941895f, 0.030685f, 0.936523f, 0.030396f, 0.930176f, 0.030029f, + 0.923340f, 0.029587f, 0.915527f, 0.029083f, 0.907227f, 0.028488f, 0.897461f, 0.027817f, + 0.887207f, 0.027084f, 0.875488f, 0.026306f, 0.863281f, 0.025467f, 0.850586f, 0.024597f, + 0.837402f, 0.023697f, 0.825195f, 0.022766f, 0.813965f, 0.021820f, 0.801758f, 0.020874f, + 0.789062f, 0.019928f, 0.775879f, 0.018982f, 0.762695f, 0.018066f, 0.748535f, 0.017151f, + 0.734375f, 0.016266f, 0.719727f, 0.015411f, 0.705078f, 0.014580f, 0.689941f, 0.013779f, + 0.675781f, 0.013008f, 0.660645f, 0.012268f, 0.645508f, 0.011559f, 0.630371f, 0.010887f, + 0.614746f, 0.010239f, 0.599121f, 0.009628f, 0.583496f, 0.009048f, 0.567383f, 0.008499f, + 0.551758f, 0.007973f, 0.535645f, 0.007484f, 0.519531f, 0.007019f, 0.503906f, 0.006580f, + 0.488037f, 0.006165f, 0.472168f, 0.005775f, 0.456543f, 0.005409f, 0.440918f, 0.005062f, + 0.425537f, 0.004738f, 0.410156f, 0.004433f, 0.395264f, 0.004150f, 0.380371f, 0.003881f, + 0.964355f, 0.035156f, 0.964355f, 0.035156f, 0.964355f, 0.035156f, 0.964355f, 0.035156f, + 0.964355f, 0.035156f, 0.964355f, 0.035156f, 0.964355f, 0.035156f, 0.964355f, 0.035187f, + 0.964355f, 0.035278f, 0.963867f, 0.035370f, 0.963379f, 0.035522f, 0.961914f, 0.035431f, + 0.960938f, 0.035461f, 0.959961f, 0.035583f, 0.958496f, 0.035614f, 0.956543f, 0.035645f, + 0.954102f, 0.035614f, 0.951660f, 0.035583f, 0.948730f, 0.035492f, 0.944824f, 0.035309f, + 0.940918f, 0.035095f, 0.936035f, 0.034760f, 0.930664f, 0.034363f, 0.924316f, 0.033875f, + 0.917480f, 0.033295f, 0.909668f, 0.032623f, 0.900879f, 0.031891f, 0.891602f, 0.031082f, + 0.881348f, 0.030182f, 0.870117f, 0.029236f, 0.858398f, 0.028244f, 0.845703f, 0.027222f, + 0.832520f, 0.026154f, 0.819824f, 0.025070f, 0.808105f, 0.023987f, 0.796387f, 0.022903f, + 0.784668f, 0.021820f, 0.771973f, 0.020767f, 0.759277f, 0.019714f, 0.745605f, 0.018707f, + 0.731934f, 0.017715f, 0.718262f, 0.016754f, 0.703613f, 0.015839f, 0.689453f, 0.014954f, + 0.674805f, 0.014099f, 0.660645f, 0.013283f, 0.645996f, 0.012512f, 0.631348f, 0.011772f, + 0.615723f, 0.011063f, 0.600586f, 0.010399f, 0.584961f, 0.009766f, 0.569824f, 0.009171f, + 0.554199f, 0.008598f, 0.538574f, 0.008064f, 0.522949f, 0.007565f, 0.507324f, 0.007088f, + 0.491699f, 0.006641f, 0.476074f, 0.006218f, 0.460449f, 0.005821f, 0.445068f, 0.005447f, + 0.429932f, 0.005100f, 0.414795f, 0.004768f, 0.399658f, 0.004459f, 0.385010f, 0.004173f, + 0.958984f, 0.040466f, 0.958984f, 0.040466f, 0.958984f, 0.040466f, 0.958984f, 0.040466f, + 0.958984f, 0.040466f, 0.958984f, 0.040466f, 0.958984f, 0.040466f, 0.958984f, 0.040497f, + 0.958984f, 0.040558f, 0.958496f, 0.040680f, 0.958008f, 0.040802f, 0.956543f, 0.040680f, + 0.955566f, 0.040741f, 0.954590f, 0.040833f, 0.952637f, 0.040771f, 0.951172f, 0.040802f, + 0.948730f, 0.040710f, 0.945801f, 0.040588f, 0.942383f, 0.040436f, 0.938965f, 0.040161f, + 0.934570f, 0.039825f, 0.929199f, 0.039368f, 0.923828f, 0.038818f, 0.917480f, 0.038177f, + 0.910645f, 0.037445f, 0.902832f, 0.036621f, 0.894531f, 0.035675f, 0.885254f, 0.034668f, + 0.875000f, 0.033600f, 0.864258f, 0.032471f, 0.852539f, 0.031281f, 0.840332f, 0.030075f, + 0.827637f, 0.028839f, 0.814941f, 0.027588f, 0.802246f, 0.026337f, 0.791016f, 0.025116f, + 0.779785f, 0.023880f, 0.768066f, 0.022690f, 0.755859f, 0.021515f, 0.743164f, 0.020370f, + 0.729980f, 0.019272f, 0.716309f, 0.018219f, 0.702637f, 0.017181f, 0.688965f, 0.016220f, + 0.674316f, 0.015282f, 0.660645f, 0.014389f, 0.646484f, 0.013535f, 0.631836f, 0.012726f, + 0.617676f, 0.011963f, 0.602539f, 0.011230f, 0.587402f, 0.010544f, 0.572266f, 0.009895f, + 0.557129f, 0.009277f, 0.541992f, 0.008698f, 0.526367f, 0.008148f, 0.510742f, 0.007637f, + 0.495605f, 0.007153f, 0.480225f, 0.006699f, 0.464844f, 0.006268f, 0.449463f, 0.005867f, + 0.434326f, 0.005489f, 0.419434f, 0.005135f, 0.404541f, 0.004803f, 0.389893f, 0.004490f, + 0.953125f, 0.046539f, 0.953125f, 0.046539f, 0.953125f, 0.046539f, 0.953125f, 0.046539f, + 0.953125f, 0.046539f, 0.953125f, 0.046539f, 0.953125f, 0.046539f, 0.953125f, 0.046570f, + 0.952637f, 0.046661f, 0.952637f, 0.046753f, 0.951660f, 0.046844f, 0.950195f, 0.046692f, + 0.949219f, 0.046753f, 0.948242f, 0.046814f, 0.946289f, 0.046722f, 0.944336f, 0.046661f, + 0.941895f, 0.046539f, 0.938965f, 0.046295f, 0.935547f, 0.045990f, 0.931641f, 0.045624f, + 0.927246f, 0.045135f, 0.922363f, 0.044525f, 0.916504f, 0.043823f, 0.910156f, 0.042999f, + 0.902832f, 0.042023f, 0.895508f, 0.041016f, 0.887207f, 0.039856f, 0.877930f, 0.038635f, + 0.868164f, 0.037354f, 0.857910f, 0.036011f, 0.846680f, 0.034607f, 0.834961f, 0.033203f, + 0.822266f, 0.031738f, 0.809570f, 0.030334f, 0.797363f, 0.028900f, 0.785645f, 0.027496f, + 0.774902f, 0.026123f, 0.763672f, 0.024765f, 0.751953f, 0.023453f, 0.739746f, 0.022186f, + 0.727539f, 0.020966f, 0.714844f, 0.019775f, 0.701660f, 0.018661f, 0.688477f, 0.017578f, + 0.674805f, 0.016556f, 0.660645f, 0.015572f, 0.646973f, 0.014641f, 0.633301f, 0.013756f, + 0.619141f, 0.012924f, 0.604492f, 0.012131f, 0.589844f, 0.011383f, 0.574707f, 0.010674f, + 0.560059f, 0.010010f, 0.544922f, 0.009377f, 0.529785f, 0.008789f, 0.514648f, 0.008232f, + 0.499756f, 0.007710f, 0.484375f, 0.007217f, 0.469238f, 0.006752f, 0.454346f, 0.006317f, + 0.439209f, 0.005913f, 0.424316f, 0.005531f, 0.409668f, 0.005173f, 0.395020f, 0.004837f, + 0.946289f, 0.053497f, 0.946289f, 0.053497f, 0.946289f, 0.053497f, 0.946289f, 0.053497f, + 0.946289f, 0.053497f, 0.946289f, 0.053497f, 0.946289f, 0.053497f, 0.945801f, 0.053558f, + 0.945801f, 0.053619f, 0.945312f, 0.053741f, 0.944336f, 0.053680f, 0.942871f, 0.053589f, + 0.941895f, 0.053619f, 0.940918f, 0.053589f, 0.938965f, 0.053497f, 0.937012f, 0.053314f, + 0.934570f, 0.053101f, 0.931641f, 0.052765f, 0.927734f, 0.052338f, 0.923828f, 0.051788f, + 0.919434f, 0.051147f, 0.914062f, 0.050354f, 0.908203f, 0.049408f, 0.901855f, 0.048370f, + 0.895020f, 0.047180f, 0.887207f, 0.045868f, 0.878906f, 0.044495f, 0.870117f, 0.042999f, + 0.860840f, 0.041473f, 0.850586f, 0.039886f, 0.839844f, 0.038239f, 0.828613f, 0.036591f, + 0.816895f, 0.034943f, 0.804688f, 0.033295f, 0.792480f, 0.031677f, 0.780273f, 0.030075f, + 0.769531f, 0.028534f, 0.758789f, 0.027008f, 0.748047f, 0.025543f, 0.736816f, 0.024139f, + 0.725098f, 0.022781f, 0.713379f, 0.021484f, 0.700684f, 0.020233f, 0.687988f, 0.019058f, + 0.674805f, 0.017929f, 0.661621f, 0.016846f, 0.647949f, 0.015839f, 0.634277f, 0.014877f, + 0.620605f, 0.013962f, 0.606445f, 0.013100f, 0.592285f, 0.012291f, 0.578125f, 0.011520f, + 0.563477f, 0.010803f, 0.548340f, 0.010117f, 0.533691f, 0.009476f, 0.519043f, 0.008873f, + 0.503906f, 0.008308f, 0.489014f, 0.007778f, 0.474121f, 0.007278f, 0.458984f, 0.006813f, + 0.444336f, 0.006371f, 0.429688f, 0.005959f, 0.415039f, 0.005573f, 0.400391f, 0.005215f, + 0.937988f, 0.061523f, 0.937988f, 0.061523f, 0.937988f, 0.061523f, 0.937988f, 0.061523f, + 0.937988f, 0.061523f, 0.937988f, 0.061523f, 0.937988f, 0.061523f, 0.937988f, 0.061554f, + 0.937500f, 0.061615f, 0.937500f, 0.061737f, 0.936035f, 0.061554f, 0.935059f, 0.061493f, + 0.934082f, 0.061523f, 0.932129f, 0.061340f, 0.930664f, 0.061218f, 0.928223f, 0.060913f, + 0.925781f, 0.060577f, 0.922852f, 0.060089f, 0.918945f, 0.059479f, 0.915039f, 0.058777f, + 0.910156f, 0.057892f, 0.904785f, 0.056854f, 0.898926f, 0.055664f, 0.892578f, 0.054321f, + 0.885742f, 0.052887f, 0.877930f, 0.051270f, 0.870117f, 0.049591f, 0.861328f, 0.047821f, + 0.852539f, 0.045990f, 0.842773f, 0.044098f, 0.832520f, 0.042206f, 0.822266f, 0.040314f, + 0.811035f, 0.038391f, 0.799316f, 0.036530f, 0.787598f, 0.034668f, 0.775879f, 0.032867f, + 0.764648f, 0.031143f, 0.753906f, 0.029449f, 0.744141f, 0.027817f, 0.733398f, 0.026245f, + 0.722656f, 0.024750f, 0.711426f, 0.023315f, 0.699707f, 0.021942f, 0.687500f, 0.020645f, + 0.675293f, 0.019409f, 0.662109f, 0.018234f, 0.649414f, 0.017120f, 0.635742f, 0.016083f, + 0.622070f, 0.015091f, 0.608887f, 0.014153f, 0.595215f, 0.013268f, 0.581055f, 0.012444f, + 0.566895f, 0.011658f, 0.552246f, 0.010918f, 0.537598f, 0.010223f, 0.522949f, 0.009575f, + 0.508301f, 0.008965f, 0.493896f, 0.008385f, 0.479004f, 0.007851f, 0.464355f, 0.007347f, + 0.449463f, 0.006874f, 0.435059f, 0.006428f, 0.420654f, 0.006012f, 0.406250f, 0.005623f, + 0.928711f, 0.070679f, 0.928711f, 0.070679f, 0.928711f, 0.070679f, 0.928711f, 0.070679f, + 0.928711f, 0.070679f, 0.928711f, 0.070679f, 0.928711f, 0.070679f, 0.928711f, 0.070740f, + 0.928223f, 0.070801f, 0.928223f, 0.070923f, 0.926270f, 0.070618f, 0.925781f, 0.070557f, + 0.924805f, 0.070557f, 0.922852f, 0.070251f, 0.920898f, 0.069946f, 0.918945f, 0.069580f, + 0.916016f, 0.069092f, 0.913086f, 0.068420f, 0.909180f, 0.067627f, 0.904785f, 0.066589f, + 0.899902f, 0.065430f, 0.894531f, 0.064148f, 0.888672f, 0.062622f, 0.882324f, 0.060974f, + 0.875488f, 0.059174f, 0.867676f, 0.057251f, 0.860352f, 0.055206f, 0.852051f, 0.053070f, + 0.843262f, 0.050934f, 0.834473f, 0.048737f, 0.825195f, 0.046509f, 0.814941f, 0.044312f, + 0.804688f, 0.042145f, 0.793945f, 0.040009f, 0.783203f, 0.037933f, 0.771973f, 0.035889f, + 0.760742f, 0.033936f, 0.750000f, 0.032074f, 0.739746f, 0.030258f, 0.729980f, 0.028519f, + 0.720215f, 0.026871f, 0.709473f, 0.025284f, 0.698730f, 0.023788f, 0.687500f, 0.022369f, + 0.675781f, 0.021011f, 0.663574f, 0.019730f, 0.650879f, 0.018524f, 0.637695f, 0.017380f, + 0.624512f, 0.016296f, 0.611328f, 0.015289f, 0.597656f, 0.014328f, 0.584473f, 0.013428f, + 0.570312f, 0.012581f, 0.556641f, 0.011787f, 0.541992f, 0.011032f, 0.527832f, 0.010330f, + 0.513184f, 0.009674f, 0.498779f, 0.009048f, 0.484375f, 0.008469f, 0.469727f, 0.007927f, + 0.455322f, 0.007416f, 0.440674f, 0.006939f, 0.426270f, 0.006489f, 0.412354f, 0.006073f, + 0.917969f, 0.081299f, 0.917969f, 0.081299f, 0.917969f, 0.081299f, 0.917969f, 0.081299f, + 0.917969f, 0.081299f, 0.917969f, 0.081299f, 0.917969f, 0.081299f, 0.917969f, 0.081360f, + 0.917969f, 0.081421f, 0.916992f, 0.081421f, 0.915527f, 0.081055f, 0.915039f, 0.080994f, + 0.913574f, 0.080750f, 0.912109f, 0.080444f, 0.910156f, 0.080017f, 0.907715f, 0.079468f, + 0.904785f, 0.078735f, 0.901367f, 0.077820f, 0.897461f, 0.076721f, 0.893555f, 0.075500f, + 0.888184f, 0.073975f, 0.882812f, 0.072266f, 0.876953f, 0.070374f, 0.870605f, 0.068359f, + 0.863770f, 0.066101f, 0.856934f, 0.063782f, 0.849121f, 0.061340f, 0.841797f, 0.058868f, + 0.833496f, 0.056335f, 0.825195f, 0.053741f, 0.816406f, 0.051208f, 0.807617f, 0.048676f, + 0.798340f, 0.046204f, 0.788086f, 0.043793f, 0.777832f, 0.041443f, 0.767578f, 0.039185f, + 0.757324f, 0.036987f, 0.746582f, 0.034882f, 0.736328f, 0.032898f, 0.726562f, 0.030975f, + 0.717285f, 0.029144f, 0.708008f, 0.027420f, 0.697754f, 0.025772f, 0.687012f, 0.024216f, + 0.676270f, 0.022736f, 0.664551f, 0.021347f, 0.652344f, 0.020020f, 0.640137f, 0.018784f, + 0.627441f, 0.017609f, 0.614258f, 0.016510f, 0.601074f, 0.015480f, 0.587402f, 0.014503f, + 0.574219f, 0.013588f, 0.560547f, 0.012726f, 0.546875f, 0.011909f, 0.532715f, 0.011154f, + 0.518066f, 0.010437f, 0.503906f, 0.009773f, 0.489746f, 0.009148f, 0.475342f, 0.008560f, + 0.461182f, 0.008011f, 0.446777f, 0.007496f, 0.432617f, 0.007011f, 0.418457f, 0.006561f, + 0.905762f, 0.093567f, 0.905762f, 0.093567f, 0.905762f, 0.093567f, 0.905762f, 0.093567f, + 0.905762f, 0.093567f, 0.905762f, 0.093567f, 0.905762f, 0.093567f, 0.905762f, 0.093567f, + 0.905273f, 0.093628f, 0.904297f, 0.093384f, 0.903320f, 0.093140f, 0.902344f, 0.093018f, + 0.900879f, 0.092590f, 0.899414f, 0.092224f, 0.897461f, 0.091553f, 0.895020f, 0.090759f, + 0.892090f, 0.089783f, 0.888672f, 0.088562f, 0.884766f, 0.087097f, 0.880371f, 0.085449f, + 0.875488f, 0.083496f, 0.870117f, 0.081360f, 0.863770f, 0.078979f, 0.857910f, 0.076477f, + 0.851074f, 0.073792f, 0.844727f, 0.070984f, 0.837402f, 0.068054f, 0.830566f, 0.065125f, + 0.823242f, 0.062195f, 0.815430f, 0.059204f, 0.807617f, 0.056274f, 0.799805f, 0.053406f, + 0.791016f, 0.050598f, 0.782227f, 0.047852f, 0.772949f, 0.045227f, 0.763672f, 0.042694f, + 0.753906f, 0.040253f, 0.744141f, 0.037933f, 0.733887f, 0.035736f, 0.724121f, 0.033600f, + 0.714844f, 0.031616f, 0.706055f, 0.029709f, 0.696777f, 0.027908f, 0.687012f, 0.026199f, + 0.676270f, 0.024597f, 0.665527f, 0.023087f, 0.654297f, 0.021652f, 0.642578f, 0.020309f, + 0.630371f, 0.019028f, 0.617676f, 0.017838f, 0.604980f, 0.016708f, 0.591797f, 0.015656f, + 0.578125f, 0.014671f, 0.564941f, 0.013741f, 0.551270f, 0.012863f, 0.537598f, 0.012047f, + 0.523926f, 0.011276f, 0.509766f, 0.010559f, 0.495605f, 0.009880f, 0.481445f, 0.009247f, + 0.467285f, 0.008659f, 0.453125f, 0.008102f, 0.439209f, 0.007584f, 0.425293f, 0.007095f, + 0.891602f, 0.107727f, 0.891602f, 0.107727f, 0.891602f, 0.107727f, 0.891602f, 0.107727f, + 0.891602f, 0.107727f, 0.891602f, 0.107727f, 0.891602f, 0.107727f, 0.891602f, 0.107727f, + 0.891113f, 0.107727f, 0.890137f, 0.107300f, 0.889160f, 0.107056f, 0.888184f, 0.106812f, + 0.886719f, 0.106201f, 0.884766f, 0.105530f, 0.882812f, 0.104736f, 0.880371f, 0.103638f, + 0.877441f, 0.102234f, 0.874023f, 0.100708f, 0.870117f, 0.098755f, 0.865234f, 0.096619f, + 0.860352f, 0.094177f, 0.854980f, 0.091492f, 0.849609f, 0.088562f, 0.843750f, 0.085449f, + 0.837402f, 0.082214f, 0.831055f, 0.078857f, 0.824707f, 0.075439f, 0.818359f, 0.071960f, + 0.812012f, 0.068542f, 0.805176f, 0.065125f, 0.798340f, 0.061768f, 0.791504f, 0.058502f, + 0.783691f, 0.055328f, 0.775879f, 0.052246f, 0.768066f, 0.049316f, 0.759766f, 0.046478f, + 0.750977f, 0.043793f, 0.741699f, 0.041199f, 0.732422f, 0.038788f, 0.723145f, 0.036438f, + 0.713379f, 0.034241f, 0.704102f, 0.032166f, 0.695801f, 0.030228f, 0.686523f, 0.028366f, + 0.676758f, 0.026611f, 0.666992f, 0.024963f, 0.656250f, 0.023407f, 0.645020f, 0.021942f, + 0.633301f, 0.020569f, 0.621582f, 0.019272f, 0.608887f, 0.018051f, 0.596191f, 0.016922f, + 0.583008f, 0.015839f, 0.569824f, 0.014847f, 0.556152f, 0.013901f, 0.542969f, 0.013016f, + 0.529297f, 0.012192f, 0.515625f, 0.011414f, 0.501953f, 0.010681f, 0.487793f, 0.010002f, + 0.473877f, 0.009361f, 0.459717f, 0.008766f, 0.445801f, 0.008202f, 0.432129f, 0.007683f, + 0.875488f, 0.124084f, 0.875488f, 0.124084f, 0.875488f, 0.124084f, 0.875488f, 0.124084f, + 0.875488f, 0.124084f, 0.875488f, 0.124084f, 0.875488f, 0.124084f, 0.875000f, 0.124084f, + 0.874512f, 0.124084f, 0.873535f, 0.123474f, 0.872559f, 0.123169f, 0.871582f, 0.122559f, + 0.870117f, 0.121948f, 0.868164f, 0.120972f, 0.866211f, 0.119812f, 0.863770f, 0.118347f, + 0.860840f, 0.116516f, 0.856934f, 0.114380f, 0.853027f, 0.111938f, 0.848633f, 0.109192f, + 0.843750f, 0.106079f, 0.838867f, 0.102722f, 0.833496f, 0.099121f, 0.827637f, 0.095337f, + 0.822266f, 0.091431f, 0.816406f, 0.087463f, 0.811035f, 0.083435f, 0.805664f, 0.079407f, + 0.799805f, 0.075378f, 0.794434f, 0.071472f, 0.788574f, 0.067627f, 0.782715f, 0.063965f, + 0.776367f, 0.060425f, 0.770020f, 0.056976f, 0.762695f, 0.053680f, 0.755371f, 0.050568f, + 0.747559f, 0.047577f, 0.739746f, 0.044739f, 0.731445f, 0.042053f, 0.722656f, 0.039520f, + 0.713379f, 0.037109f, 0.704102f, 0.034851f, 0.695312f, 0.032684f, 0.686035f, 0.030685f, + 0.677246f, 0.028778f, 0.667969f, 0.026978f, 0.658203f, 0.025299f, 0.647461f, 0.023712f, + 0.636719f, 0.022232f, 0.625000f, 0.020828f, 0.613281f, 0.019516f, 0.600586f, 0.018280f, + 0.588379f, 0.017120f, 0.575195f, 0.016037f, 0.562012f, 0.015022f, 0.548340f, 0.014076f, + 0.535156f, 0.013176f, 0.521484f, 0.012337f, 0.508301f, 0.011559f, 0.494629f, 0.010826f, + 0.480713f, 0.010132f, 0.467041f, 0.009491f, 0.453125f, 0.008888f, 0.439453f, 0.008324f, + 0.855957f, 0.143066f, 0.855957f, 0.143066f, 0.855957f, 0.143066f, 0.855957f, 0.143066f, + 0.855957f, 0.143066f, 0.855957f, 0.143066f, 0.855957f, 0.143066f, 0.855957f, 0.143066f, + 0.854980f, 0.142700f, 0.854492f, 0.142212f, 0.853516f, 0.141724f, 0.852539f, 0.140869f, + 0.851074f, 0.139893f, 0.849121f, 0.138672f, 0.847168f, 0.136963f, 0.844238f, 0.135010f, + 0.841309f, 0.132690f, 0.837891f, 0.129883f, 0.833984f, 0.126709f, 0.829590f, 0.123169f, + 0.824707f, 0.119263f, 0.820312f, 0.115112f, 0.815430f, 0.110718f, 0.810547f, 0.106140f, + 0.805664f, 0.101501f, 0.800781f, 0.096802f, 0.796387f, 0.092041f, 0.791992f, 0.087402f, + 0.787598f, 0.082825f, 0.782715f, 0.078369f, 0.778320f, 0.074036f, 0.773926f, 0.069824f, + 0.769043f, 0.065857f, 0.763672f, 0.062042f, 0.757812f, 0.058380f, 0.751465f, 0.054932f, + 0.745117f, 0.051636f, 0.737793f, 0.048523f, 0.730469f, 0.045593f, 0.722168f, 0.042786f, + 0.713867f, 0.040161f, 0.705566f, 0.037689f, 0.696289f, 0.035370f, 0.687500f, 0.033173f, + 0.678223f, 0.031113f, 0.669434f, 0.029175f, 0.660156f, 0.027344f, 0.649902f, 0.025620f, + 0.639648f, 0.024017f, 0.628906f, 0.022507f, 0.617676f, 0.021088f, 0.605469f, 0.019760f, + 0.593262f, 0.018509f, 0.581055f, 0.017334f, 0.567871f, 0.016235f, 0.554688f, 0.015221f, + 0.541504f, 0.014259f, 0.528320f, 0.013359f, 0.514648f, 0.012512f, 0.501465f, 0.011719f, + 0.488037f, 0.010979f, 0.474365f, 0.010284f, 0.460938f, 0.009636f, 0.447266f, 0.009033f, + 0.833984f, 0.165283f, 0.833984f, 0.165283f, 0.833984f, 0.165283f, 0.833984f, 0.165283f, + 0.833984f, 0.165283f, 0.833984f, 0.165283f, 0.833984f, 0.165283f, 0.833984f, 0.165283f, + 0.832520f, 0.164551f, 0.832031f, 0.164062f, 0.831543f, 0.163330f, 0.830078f, 0.162231f, + 0.828613f, 0.160767f, 0.827148f, 0.159058f, 0.824707f, 0.156738f, 0.822266f, 0.154053f, + 0.819336f, 0.150879f, 0.815918f, 0.147217f, 0.812012f, 0.143188f, 0.808105f, 0.138672f, + 0.803711f, 0.133789f, 0.799805f, 0.128662f, 0.795410f, 0.123413f, 0.791504f, 0.117859f, + 0.787598f, 0.112366f, 0.784180f, 0.106812f, 0.780762f, 0.101318f, 0.777344f, 0.095947f, + 0.774414f, 0.090759f, 0.770996f, 0.085693f, 0.768066f, 0.080811f, 0.764648f, 0.076172f, + 0.761230f, 0.071716f, 0.757324f, 0.067444f, 0.752930f, 0.063416f, 0.748047f, 0.059631f, + 0.742676f, 0.056000f, 0.736328f, 0.052612f, 0.729980f, 0.049377f, 0.722656f, 0.046326f, + 0.715332f, 0.043457f, 0.707031f, 0.040771f, 0.698730f, 0.038239f, 0.689941f, 0.035858f, + 0.680664f, 0.033600f, 0.671387f, 0.031525f, 0.662109f, 0.029541f, 0.652832f, 0.027695f, + 0.643066f, 0.025955f, 0.632812f, 0.024323f, 0.622070f, 0.022797f, 0.610352f, 0.021347f, + 0.598633f, 0.020004f, 0.586914f, 0.018753f, 0.574219f, 0.017578f, 0.561523f, 0.016464f, + 0.548828f, 0.015434f, 0.535645f, 0.014458f, 0.521973f, 0.013550f, 0.508789f, 0.012703f, + 0.495361f, 0.011902f, 0.481934f, 0.011154f, 0.468750f, 0.010460f, 0.455566f, 0.009804f, + 0.808105f, 0.191284f, 0.808105f, 0.191284f, 0.808105f, 0.191284f, 0.808105f, 0.191284f, + 0.808105f, 0.191284f, 0.808105f, 0.191284f, 0.808105f, 0.191284f, 0.807617f, 0.191162f, + 0.806641f, 0.190186f, 0.806152f, 0.189453f, 0.805176f, 0.188232f, 0.804199f, 0.186768f, + 0.802734f, 0.184814f, 0.801270f, 0.182373f, 0.799316f, 0.179321f, 0.796875f, 0.175781f, + 0.793945f, 0.171631f, 0.790527f, 0.166870f, 0.787109f, 0.161621f, 0.783691f, 0.155884f, + 0.780273f, 0.149780f, 0.776855f, 0.143555f, 0.773926f, 0.137085f, 0.770996f, 0.130615f, + 0.768066f, 0.124084f, 0.766113f, 0.117676f, 0.764160f, 0.111328f, 0.762207f, 0.105164f, + 0.760742f, 0.099243f, 0.759277f, 0.093567f, 0.757324f, 0.088135f, 0.755859f, 0.082886f, + 0.753418f, 0.077942f, 0.750977f, 0.073303f, 0.748047f, 0.068848f, 0.744141f, 0.064636f, + 0.740234f, 0.060669f, 0.735352f, 0.056946f, 0.729492f, 0.053436f, 0.723633f, 0.050110f, + 0.716797f, 0.046997f, 0.709473f, 0.044067f, 0.701660f, 0.041321f, 0.693359f, 0.038727f, + 0.684570f, 0.036316f, 0.675781f, 0.034027f, 0.666016f, 0.031921f, 0.656250f, 0.029922f, + 0.646484f, 0.028046f, 0.636230f, 0.026276f, 0.625977f, 0.024628f, 0.615723f, 0.023087f, + 0.604492f, 0.021637f, 0.592773f, 0.020279f, 0.580566f, 0.019012f, 0.568359f, 0.017822f, + 0.556152f, 0.016708f, 0.542969f, 0.015671f, 0.530273f, 0.014694f, 0.517090f, 0.013779f, + 0.503906f, 0.012917f, 0.490479f, 0.012115f, 0.477295f, 0.011360f, 0.463867f, 0.010658f, + 0.777344f, 0.221680f, 0.777344f, 0.221680f, 0.777344f, 0.221680f, 0.777344f, 0.221680f, + 0.777344f, 0.221680f, 0.777344f, 0.221680f, 0.777344f, 0.221680f, 0.776855f, 0.221069f, + 0.776367f, 0.220093f, 0.775879f, 0.219116f, 0.774902f, 0.217529f, 0.773926f, 0.215332f, + 0.772949f, 0.212646f, 0.771484f, 0.209229f, 0.769531f, 0.205078f, 0.767090f, 0.200195f, + 0.764648f, 0.194824f, 0.761719f, 0.188599f, 0.759277f, 0.181885f, 0.756348f, 0.174683f, + 0.753906f, 0.167358f, 0.751953f, 0.159668f, 0.750000f, 0.151855f, 0.748535f, 0.144165f, + 0.747559f, 0.136597f, 0.747070f, 0.129150f, 0.747070f, 0.121948f, 0.747070f, 0.114990f, + 0.747070f, 0.108276f, 0.747070f, 0.101929f, 0.747070f, 0.095886f, 0.747070f, 0.090088f, + 0.746094f, 0.084656f, 0.745117f, 0.079468f, 0.743652f, 0.074585f, 0.741211f, 0.070007f, + 0.738281f, 0.065674f, 0.734375f, 0.061584f, 0.729980f, 0.057770f, 0.724609f, 0.054169f, + 0.718750f, 0.050781f, 0.712402f, 0.047607f, 0.705078f, 0.044617f, 0.697754f, 0.041840f, + 0.689453f, 0.039215f, 0.680664f, 0.036774f, 0.671387f, 0.034454f, 0.661621f, 0.032318f, + 0.651855f, 0.030289f, 0.641602f, 0.028397f, 0.630859f, 0.026627f, 0.620117f, 0.024963f, + 0.609863f, 0.023407f, 0.598633f, 0.021942f, 0.587402f, 0.020584f, 0.575195f, 0.019302f, + 0.563477f, 0.018112f, 0.550781f, 0.016983f, 0.538086f, 0.015930f, 0.525391f, 0.014954f, + 0.512695f, 0.014030f, 0.499512f, 0.013161f, 0.486572f, 0.012360f, 0.473389f, 0.011604f, + 0.741211f, 0.257324f, 0.741211f, 0.257324f, 0.741211f, 0.257324f, 0.741211f, 0.257324f, + 0.741211f, 0.257324f, 0.741211f, 0.257324f, 0.741211f, 0.257324f, 0.740723f, 0.256348f, + 0.740234f, 0.255371f, 0.739746f, 0.253418f, 0.739258f, 0.251221f, 0.738770f, 0.248291f, + 0.737793f, 0.244507f, 0.736328f, 0.239868f, 0.734863f, 0.234253f, 0.732910f, 0.227783f, + 0.730957f, 0.220459f, 0.729492f, 0.212524f, 0.727539f, 0.204102f, 0.726074f, 0.195190f, + 0.725098f, 0.186035f, 0.724609f, 0.176758f, 0.724609f, 0.167725f, 0.725586f, 0.158691f, + 0.726562f, 0.149902f, 0.727539f, 0.141357f, 0.729492f, 0.133179f, 0.731445f, 0.125366f, + 0.733398f, 0.117920f, 0.735352f, 0.110840f, 0.737305f, 0.104126f, 0.738770f, 0.097717f, + 0.739258f, 0.091736f, 0.739746f, 0.086060f, 0.739258f, 0.080750f, 0.738281f, 0.075745f, + 0.736328f, 0.070984f, 0.733887f, 0.066528f, 0.730469f, 0.062408f, 0.726074f, 0.058502f, + 0.721191f, 0.054840f, 0.715820f, 0.051392f, 0.708984f, 0.048187f, 0.702148f, 0.045166f, + 0.694336f, 0.042328f, 0.686035f, 0.039703f, 0.677246f, 0.037201f, 0.667969f, 0.034882f, + 0.658691f, 0.032715f, 0.648438f, 0.030685f, 0.638184f, 0.028778f, 0.627441f, 0.026993f, + 0.616211f, 0.025330f, 0.604980f, 0.023758f, 0.593750f, 0.022293f, 0.582031f, 0.020920f, + 0.570801f, 0.019638f, 0.558594f, 0.018433f, 0.546387f, 0.017303f, 0.534180f, 0.016235f, + 0.521484f, 0.015251f, 0.508789f, 0.014328f, 0.496094f, 0.013458f, 0.483398f, 0.012642f, + 0.698242f, 0.299316f, 0.698242f, 0.299316f, 0.698242f, 0.299316f, 0.698242f, 0.299316f, + 0.698242f, 0.299316f, 0.698242f, 0.299316f, 0.698242f, 0.299316f, 0.698242f, 0.298340f, + 0.698242f, 0.296875f, 0.697754f, 0.294189f, 0.697266f, 0.291016f, 0.697266f, 0.286621f, + 0.696289f, 0.281250f, 0.695801f, 0.274658f, 0.694824f, 0.266846f, 0.693848f, 0.258301f, + 0.692871f, 0.248779f, 0.692383f, 0.238525f, 0.692383f, 0.227905f, 0.692871f, 0.216919f, + 0.693848f, 0.205933f, 0.695801f, 0.194946f, 0.698242f, 0.184204f, 0.701172f, 0.173828f, + 0.704590f, 0.163818f, 0.708496f, 0.154175f, 0.712402f, 0.145020f, 0.716309f, 0.136230f, + 0.720703f, 0.128052f, 0.724121f, 0.120178f, 0.728027f, 0.112793f, 0.730957f, 0.105835f, + 0.733398f, 0.099243f, 0.734863f, 0.093079f, 0.735840f, 0.087219f, 0.736328f, 0.081787f, + 0.735352f, 0.076660f, 0.733887f, 0.071838f, 0.731445f, 0.067322f, 0.728027f, 0.063110f, + 0.724121f, 0.059143f, 0.719238f, 0.055450f, 0.713379f, 0.051971f, 0.707031f, 0.048706f, + 0.700195f, 0.045685f, 0.692383f, 0.042816f, 0.684082f, 0.040161f, 0.675293f, 0.037659f, + 0.666016f, 0.035339f, 0.656250f, 0.033142f, 0.645996f, 0.031113f, 0.635254f, 0.029190f, + 0.624512f, 0.027405f, 0.613281f, 0.025726f, 0.602051f, 0.024155f, 0.590332f, 0.022675f, + 0.578613f, 0.021301f, 0.566406f, 0.020004f, 0.554688f, 0.018799f, 0.542969f, 0.017670f, + 0.530762f, 0.016602f, 0.518066f, 0.015602f, 0.505859f, 0.014671f, 0.493408f, 0.013794f, + 0.647461f, 0.349365f, 0.647461f, 0.349365f, 0.647461f, 0.349365f, 0.647461f, 0.349365f, + 0.647461f, 0.349365f, 0.647461f, 0.349365f, 0.647461f, 0.349365f, 0.647461f, 0.348145f, + 0.647461f, 0.345459f, 0.647949f, 0.341797f, 0.647949f, 0.336914f, 0.647949f, 0.330566f, + 0.647949f, 0.322998f, 0.647949f, 0.313721f, 0.648438f, 0.303223f, 0.648926f, 0.291748f, + 0.649902f, 0.279297f, 0.651367f, 0.266113f, 0.653809f, 0.252930f, 0.657227f, 0.239746f, + 0.661133f, 0.226685f, 0.665527f, 0.213867f, 0.670898f, 0.201538f, 0.676758f, 0.189697f, + 0.683105f, 0.178345f, 0.689453f, 0.167603f, 0.695801f, 0.157349f, 0.702148f, 0.147705f, + 0.708496f, 0.138550f, 0.714355f, 0.130005f, 0.719238f, 0.121948f, 0.724121f, 0.114319f, + 0.728027f, 0.107117f, 0.730957f, 0.100403f, 0.733398f, 0.094116f, 0.734375f, 0.088196f, + 0.734863f, 0.082642f, 0.734375f, 0.077393f, 0.732910f, 0.072571f, 0.730469f, 0.067993f, + 0.727051f, 0.063721f, 0.722656f, 0.059753f, 0.717773f, 0.056000f, 0.712402f, 0.052521f, + 0.705566f, 0.049255f, 0.698730f, 0.046204f, 0.690918f, 0.043335f, 0.682617f, 0.040649f, + 0.673828f, 0.038147f, 0.664551f, 0.035797f, 0.654785f, 0.033630f, 0.644531f, 0.031555f, + 0.633789f, 0.029663f, 0.623047f, 0.027863f, 0.611816f, 0.026169f, 0.600586f, 0.024597f, + 0.588867f, 0.023117f, 0.576660f, 0.021744f, 0.564941f, 0.020447f, 0.552734f, 0.019226f, + 0.540039f, 0.018082f, 0.527832f, 0.017014f, 0.515625f, 0.016006f, 0.503418f, 0.015068f, + 0.586914f, 0.409180f, 0.586914f, 0.409180f, 0.586914f, 0.409180f, 0.586914f, 0.409180f, + 0.586914f, 0.409180f, 0.586914f, 0.409180f, 0.586914f, 0.409180f, 0.586914f, 0.406982f, + 0.587891f, 0.402832f, 0.588379f, 0.397461f, 0.589355f, 0.389893f, 0.590332f, 0.380615f, + 0.591797f, 0.369385f, 0.593262f, 0.356445f, 0.595703f, 0.342041f, 0.598633f, 0.326904f, + 0.602539f, 0.310791f, 0.607422f, 0.294678f, 0.613281f, 0.278809f, 0.620117f, 0.262939f, + 0.627441f, 0.247803f, 0.635742f, 0.233154f, 0.644531f, 0.219238f, 0.653809f, 0.205933f, + 0.663086f, 0.193359f, 0.672363f, 0.181519f, 0.681152f, 0.170166f, 0.689941f, 0.159668f, + 0.697754f, 0.149658f, 0.705566f, 0.140259f, 0.712402f, 0.131348f, 0.718262f, 0.123169f, + 0.723633f, 0.115417f, 0.728027f, 0.108093f, 0.731445f, 0.101257f, 0.733398f, 0.094849f, + 0.734863f, 0.088867f, 0.735352f, 0.083313f, 0.734375f, 0.078064f, 0.732910f, 0.073120f, + 0.730469f, 0.068542f, 0.727051f, 0.064270f, 0.722656f, 0.060303f, 0.717773f, 0.056549f, + 0.711914f, 0.053040f, 0.705078f, 0.049774f, 0.698242f, 0.046722f, 0.690430f, 0.043854f, + 0.682129f, 0.041199f, 0.673340f, 0.038696f, 0.663574f, 0.036346f, 0.653809f, 0.034149f, + 0.644043f, 0.032104f, 0.633301f, 0.030182f, 0.622559f, 0.028381f, 0.611328f, 0.026688f, + 0.600098f, 0.025116f, 0.588379f, 0.023621f, 0.576172f, 0.022232f, 0.564453f, 0.020935f, + 0.552246f, 0.019714f, 0.540039f, 0.018570f, 0.527832f, 0.017487f, 0.515137f, 0.016479f, + 0.513672f, 0.480225f, 0.513672f, 0.480225f, 0.513672f, 0.480225f, 0.513672f, 0.480225f, + 0.513672f, 0.480225f, 0.513672f, 0.480225f, 0.513672f, 0.480225f, 0.514648f, 0.477051f, + 0.516113f, 0.470459f, 0.517578f, 0.461426f, 0.520020f, 0.449707f, 0.522949f, 0.435547f, + 0.526367f, 0.419189f, 0.530762f, 0.401123f, 0.536621f, 0.381836f, 0.543457f, 0.362061f, + 0.551758f, 0.342285f, 0.561523f, 0.322998f, 0.571777f, 0.304199f, 0.583496f, 0.286133f, + 0.595703f, 0.268799f, 0.607910f, 0.252441f, 0.620605f, 0.237061f, 0.633301f, 0.222412f, + 0.645508f, 0.208618f, 0.657227f, 0.195557f, 0.668945f, 0.183350f, 0.679688f, 0.171753f, + 0.689453f, 0.160889f, 0.698730f, 0.150757f, 0.707031f, 0.141113f, 0.714355f, 0.132202f, + 0.720703f, 0.123901f, 0.726074f, 0.116028f, 0.729980f, 0.108704f, 0.733398f, 0.101807f, + 0.735352f, 0.095398f, 0.736328f, 0.089417f, 0.736816f, 0.083801f, 0.735840f, 0.078552f, + 0.733887f, 0.073608f, 0.730957f, 0.069031f, 0.727539f, 0.064819f, 0.723145f, 0.060822f, + 0.717773f, 0.057098f, 0.711914f, 0.053589f, 0.705078f, 0.050323f, 0.698242f, 0.047302f, + 0.690430f, 0.044434f, 0.681641f, 0.041779f, 0.672852f, 0.039276f, 0.663574f, 0.036926f, + 0.653809f, 0.034729f, 0.644043f, 0.032684f, 0.633301f, 0.030777f, 0.622559f, 0.028976f, + 0.611816f, 0.027283f, 0.600098f, 0.025711f, 0.588867f, 0.024216f, 0.577148f, 0.022827f, + 0.564941f, 0.021530f, 0.553223f, 0.020294f, 0.541016f, 0.019150f, 0.528809f, 0.018066f, + 0.425781f, 0.564453f, 0.425781f, 0.564453f, 0.425781f, 0.564453f, 0.425781f, 0.564453f, + 0.425781f, 0.564453f, 0.425781f, 0.564453f, 0.425781f, 0.564453f, 0.427246f, 0.558594f, + 0.430176f, 0.547363f, 0.434082f, 0.532227f, 0.438965f, 0.513184f, 0.445312f, 0.491943f, + 0.453125f, 0.468262f, 0.462891f, 0.443848f, 0.474365f, 0.419434f, 0.487549f, 0.395264f, + 0.501953f, 0.372070f, 0.518066f, 0.349854f, 0.534180f, 0.328613f, 0.551270f, 0.308594f, + 0.568359f, 0.289795f, 0.584961f, 0.271729f, 0.601074f, 0.254883f, 0.617188f, 0.238892f, + 0.632324f, 0.223877f, 0.646484f, 0.209717f, 0.659668f, 0.196411f, 0.672363f, 0.183960f, + 0.683594f, 0.172241f, 0.693848f, 0.161255f, 0.703125f, 0.151001f, 0.711426f, 0.141357f, + 0.718750f, 0.132446f, 0.724609f, 0.124023f, 0.729980f, 0.116211f, 0.733887f, 0.108826f, + 0.736328f, 0.101990f, 0.738281f, 0.095642f, 0.738770f, 0.089661f, 0.738770f, 0.084106f, + 0.737305f, 0.078918f, 0.735352f, 0.074036f, 0.732422f, 0.069519f, 0.728516f, 0.065247f, + 0.723633f, 0.061310f, 0.718262f, 0.057617f, 0.712402f, 0.054169f, 0.705566f, 0.050934f, + 0.698242f, 0.047913f, 0.690430f, 0.045074f, 0.682129f, 0.042419f, 0.673340f, 0.039948f, + 0.664062f, 0.037598f, 0.654785f, 0.035431f, 0.644531f, 0.033386f, 0.634277f, 0.031464f, + 0.623535f, 0.029694f, 0.612793f, 0.028000f, 0.601562f, 0.026413f, 0.590332f, 0.024933f, + 0.578613f, 0.023529f, 0.566895f, 0.022217f, 0.555176f, 0.020981f, 0.543457f, 0.019836f, + 0.318848f, 0.661621f, 0.318848f, 0.661621f, 0.318848f, 0.661621f, 0.318848f, 0.661621f, + 0.318848f, 0.661621f, 0.318848f, 0.661621f, 0.318848f, 0.661621f, 0.322266f, 0.649414f, + 0.328613f, 0.627441f, 0.336914f, 0.600586f, 0.347900f, 0.570801f, 0.361572f, 0.539551f, + 0.377930f, 0.508789f, 0.396484f, 0.479248f, 0.416992f, 0.450928f, 0.438965f, 0.424072f, + 0.461426f, 0.398682f, 0.484131f, 0.374512f, 0.506348f, 0.351807f, 0.528320f, 0.330078f, + 0.549805f, 0.309570f, 0.569824f, 0.290039f, 0.589355f, 0.271973f, 0.607422f, 0.254639f, + 0.624512f, 0.238525f, 0.640137f, 0.223267f, 0.654785f, 0.208984f, 0.668457f, 0.195557f, + 0.680664f, 0.183105f, 0.691895f, 0.171387f, 0.701660f, 0.160522f, 0.710449f, 0.150269f, + 0.718262f, 0.140747f, 0.724609f, 0.131836f, 0.729980f, 0.123596f, 0.734375f, 0.115845f, + 0.737793f, 0.108643f, 0.740234f, 0.101868f, 0.741211f, 0.095581f, 0.741699f, 0.089722f, + 0.740723f, 0.084229f, 0.739258f, 0.079102f, 0.736816f, 0.074341f, 0.733398f, 0.069885f, + 0.729492f, 0.065735f, 0.724609f, 0.061859f, 0.719238f, 0.058197f, 0.712891f, 0.054779f, + 0.706543f, 0.051605f, 0.699219f, 0.048615f, 0.691406f, 0.045807f, 0.683105f, 0.043182f, + 0.674316f, 0.040710f, 0.665039f, 0.038422f, 0.655762f, 0.036255f, 0.645508f, 0.034210f, + 0.635254f, 0.032318f, 0.625000f, 0.030518f, 0.614258f, 0.028839f, 0.603516f, 0.027252f, + 0.592285f, 0.025757f, 0.581055f, 0.024368f, 0.569336f, 0.023041f, 0.558105f, 0.021805f, + 0.193481f, 0.746094f, 0.193481f, 0.746094f, 0.193481f, 0.746094f, 0.193481f, 0.746094f, + 0.193481f, 0.746094f, 0.193481f, 0.746094f, 0.193481f, 0.746094f, 0.202271f, 0.719238f, + 0.218872f, 0.678711f, 0.239990f, 0.639648f, 0.264893f, 0.603027f, 0.292725f, 0.568848f, + 0.322266f, 0.537109f, 0.352783f, 0.506348f, 0.383057f, 0.477295f, 0.413086f, 0.449219f, + 0.441895f, 0.422119f, 0.469482f, 0.396484f, 0.495850f, 0.371826f, 0.520508f, 0.348633f, + 0.543945f, 0.326660f, 0.565918f, 0.305908f, 0.586426f, 0.286377f, 0.605469f, 0.268066f, + 0.623047f, 0.250732f, 0.639160f, 0.234863f, 0.654297f, 0.219849f, 0.667969f, 0.205811f, + 0.680176f, 0.192627f, 0.691406f, 0.180420f, 0.701660f, 0.168945f, 0.710938f, 0.158325f, + 0.718750f, 0.148438f, 0.725586f, 0.139160f, 0.730957f, 0.130493f, 0.735840f, 0.122498f, + 0.739258f, 0.114990f, 0.742188f, 0.107971f, 0.743652f, 0.101440f, 0.744141f, 0.095276f, + 0.744141f, 0.089600f, 0.743164f, 0.084290f, 0.741211f, 0.079285f, 0.738281f, 0.074646f, + 0.734863f, 0.070251f, 0.730469f, 0.066162f, 0.725586f, 0.062378f, 0.719727f, 0.058807f, + 0.713867f, 0.055450f, 0.707031f, 0.052338f, 0.699707f, 0.049377f, 0.691895f, 0.046631f, + 0.683594f, 0.044037f, 0.675293f, 0.041595f, 0.666016f, 0.039307f, 0.656738f, 0.037170f, + 0.646973f, 0.035156f, 0.637207f, 0.033264f, 0.626953f, 0.031464f, 0.616211f, 0.029800f, + 0.605469f, 0.028229f, 0.594727f, 0.026733f, 0.583496f, 0.025330f, 0.572266f, 0.024017f, + 0.129028f, 0.758301f, 0.129028f, 0.758301f, 0.129028f, 0.758301f, 0.129028f, 0.758301f, + 0.129028f, 0.758301f, 0.129028f, 0.758301f, 0.129028f, 0.758301f, 0.153564f, 0.733887f, + 0.189453f, 0.698242f, 0.225830f, 0.661621f, 0.261963f, 0.625488f, 0.297363f, 0.590332f, + 0.331543f, 0.556152f, 0.364502f, 0.522949f, 0.395752f, 0.491699f, 0.425781f, 0.461670f, + 0.454102f, 0.433350f, 0.480957f, 0.406494f, 0.505859f, 0.381104f, 0.529785f, 0.357178f, + 0.551758f, 0.334717f, 0.572754f, 0.313721f, 0.592285f, 0.293945f, 0.610352f, 0.275391f, + 0.626953f, 0.258057f, 0.642578f, 0.242065f, 0.656738f, 0.226807f, 0.670410f, 0.212646f, + 0.682129f, 0.199463f, 0.693359f, 0.187012f, 0.703125f, 0.175537f, 0.711914f, 0.164673f, + 0.719727f, 0.154663f, 0.726562f, 0.145264f, 0.732422f, 0.136475f, 0.737305f, 0.128174f, + 0.741211f, 0.120544f, 0.743652f, 0.113403f, 0.745605f, 0.106689f, 0.747070f, 0.100464f, + 0.747070f, 0.094604f, 0.746094f, 0.089111f, 0.744629f, 0.083984f, 0.742676f, 0.079163f, + 0.739258f, 0.074707f, 0.735840f, 0.070435f, 0.731445f, 0.066528f, 0.726074f, 0.062805f, + 0.720703f, 0.059357f, 0.714355f, 0.056091f, 0.707520f, 0.053040f, 0.700684f, 0.050171f, + 0.692871f, 0.047455f, 0.684570f, 0.044922f, 0.676270f, 0.042542f, 0.667480f, 0.040283f, + 0.658203f, 0.038177f, 0.648438f, 0.036194f, 0.638672f, 0.034302f, 0.628906f, 0.032532f, + 0.618652f, 0.030884f, 0.607910f, 0.029312f, 0.597656f, 0.027832f, 0.586426f, 0.026428f, +}; + +const float btdf_split_sum_ggx[16][64 * 64 * 2] = { + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.468994f, 0.999512f, 0.470215f, 0.999512f, 0.480713f, + 0.999512f, 0.490967f, 0.999512f, 0.499756f, 0.999512f, 0.507324f, 0.999512f, 0.513672f, + 0.999512f, 0.518555f, 0.999512f, 0.522949f, 0.999512f, 0.526367f, 0.999512f, 0.529297f, + 0.999512f, 0.531250f, 0.999512f, 0.533203f, 0.999512f, 0.534668f, 0.999512f, 0.535645f, + 0.999512f, 0.536133f, 0.999512f, 0.536133f, 0.999512f, 0.536133f, 0.999512f, 0.535645f, + 0.999512f, 0.535156f, 0.999512f, 0.534180f, 0.999512f, 0.533203f, 0.999512f, 0.532227f, + 0.999512f, 0.530762f, 0.999512f, 0.528809f, 0.999512f, 0.526855f, 0.999512f, 0.524902f, + 0.999512f, 0.522461f, 0.999512f, 0.520020f, 0.999512f, 0.517578f, 0.999512f, 0.514648f, + 0.999512f, 0.511719f, 0.999512f, 0.508789f, 0.999512f, 0.505371f, 0.999512f, 0.501465f, + 0.999512f, 0.498047f, 0.999512f, 0.494141f, 0.999512f, 0.489746f, 0.999512f, 0.485352f, + 0.999512f, 0.480713f, 0.999512f, 0.475830f, 0.999512f, 0.470459f, 0.999512f, 0.464844f, + 0.999512f, 0.458984f, 0.999512f, 0.452881f, 0.999512f, 0.446289f, 0.999512f, 0.439209f, + 0.999512f, 0.431641f, 0.999512f, 0.423584f, 0.999512f, 0.414795f, 0.999512f, 0.405518f, + 0.999512f, 0.395264f, 0.999512f, 0.384277f, 0.999512f, 0.372070f, 0.999512f, 0.358398f, + 0.999512f, 0.343262f, 0.999512f, 0.325928f, 0.999512f, 0.305664f, 0.999512f, 0.281738f, + 0.999512f, 0.251953f, 0.999512f, 0.212524f, 0.999512f, 0.152954f, 0.999512f, 0.040253f, + 0.000000f, 1.000000f, 0.999512f, 0.484131f, 1.000000f, 0.432861f, 0.999512f, 0.411865f, + 0.999512f, 0.400879f, 1.000000f, 0.394287f, 1.000000f, 0.389893f, 0.999512f, 0.386719f, + 0.999512f, 0.384033f, 0.999512f, 0.381836f, 1.000000f, 0.379883f, 0.999512f, 0.377930f, + 1.000000f, 0.375977f, 0.999512f, 0.374023f, 1.000000f, 0.372070f, 0.999512f, 0.370117f, + 0.999512f, 0.367920f, 0.999512f, 0.365723f, 1.000000f, 0.363281f, 0.999512f, 0.361084f, + 0.999512f, 0.358398f, 0.999512f, 0.355957f, 1.000000f, 0.353271f, 0.999512f, 0.350342f, + 0.999512f, 0.347412f, 0.999512f, 0.344238f, 0.999512f, 0.341309f, 0.999512f, 0.337891f, + 1.000000f, 0.334473f, 0.999512f, 0.331055f, 1.000000f, 0.327393f, 0.999512f, 0.323730f, + 0.999512f, 0.319824f, 0.999512f, 0.315674f, 0.999512f, 0.311523f, 0.999512f, 0.307373f, + 0.999512f, 0.302734f, 0.999512f, 0.298096f, 0.999512f, 0.293457f, 0.999512f, 0.288574f, + 0.999512f, 0.283203f, 0.999512f, 0.278076f, 0.999512f, 0.272461f, 0.999512f, 0.266602f, + 0.999512f, 0.260498f, 0.999512f, 0.254395f, 0.999512f, 0.247803f, 0.999512f, 0.240845f, + 0.999512f, 0.233643f, 0.999512f, 0.226074f, 0.999512f, 0.218018f, 0.999512f, 0.209473f, + 0.999512f, 0.200439f, 0.999512f, 0.190796f, 0.999512f, 0.180542f, 1.000000f, 0.169312f, + 0.999512f, 0.157227f, 0.999512f, 0.143921f, 0.999512f, 0.129028f, 0.999512f, 0.112366f, + 0.999512f, 0.093018f, 0.999512f, 0.069946f, 0.999512f, 0.040527f, 0.999512f, 0.004879f, + 0.000000f, 1.000000f, 1.000000f, 0.506836f, 1.000000f, 0.434570f, 1.000000f, 0.398193f, + 1.000000f, 0.375977f, 1.000000f, 0.360352f, 0.999512f, 0.348877f, 0.999512f, 0.339600f, + 1.000000f, 0.332031f, 1.000000f, 0.325684f, 1.000000f, 0.319824f, 1.000000f, 0.314697f, + 1.000000f, 0.310059f, 1.000000f, 0.305664f, 1.000000f, 0.301514f, 1.000000f, 0.297363f, + 1.000000f, 0.293457f, 1.000000f, 0.289795f, 1.000000f, 0.285889f, 1.000000f, 0.282227f, + 1.000000f, 0.278564f, 0.999512f, 0.274902f, 1.000000f, 0.271240f, 1.000000f, 0.267578f, + 1.000000f, 0.263916f, 1.000000f, 0.260254f, 1.000000f, 0.256592f, 1.000000f, 0.252686f, + 1.000000f, 0.249023f, 1.000000f, 0.245117f, 1.000000f, 0.241089f, 1.000000f, 0.237183f, + 1.000000f, 0.233032f, 1.000000f, 0.228882f, 1.000000f, 0.224731f, 1.000000f, 0.220337f, + 1.000000f, 0.215942f, 1.000000f, 0.211426f, 1.000000f, 0.206787f, 0.999512f, 0.202148f, + 1.000000f, 0.197266f, 1.000000f, 0.192261f, 1.000000f, 0.187134f, 0.999512f, 0.181885f, + 1.000000f, 0.176514f, 1.000000f, 0.170898f, 1.000000f, 0.165161f, 1.000000f, 0.159180f, + 1.000000f, 0.152954f, 0.999512f, 0.146484f, 1.000000f, 0.139771f, 0.999512f, 0.132812f, + 1.000000f, 0.125488f, 0.999512f, 0.117737f, 0.999512f, 0.109619f, 0.999512f, 0.101013f, + 0.999512f, 0.091858f, 1.000000f, 0.082092f, 1.000000f, 0.071533f, 0.999512f, 0.060028f, + 0.999512f, 0.047333f, 0.999512f, 0.033081f, 1.000000f, 0.016830f, 0.999512f, 0.001331f, + 0.000000f, 1.000000f, 1.000000f, 0.524902f, 1.000000f, 0.440430f, 1.000000f, 0.395020f, + 1.000000f, 0.365479f, 1.000000f, 0.343994f, 1.000000f, 0.327637f, 1.000000f, 0.314453f, + 1.000000f, 0.303467f, 1.000000f, 0.293945f, 1.000000f, 0.285645f, 1.000000f, 0.278076f, + 1.000000f, 0.271484f, 1.000000f, 0.265381f, 1.000000f, 0.259521f, 1.000000f, 0.254150f, + 1.000000f, 0.249023f, 1.000000f, 0.244141f, 0.999512f, 0.239380f, 1.000000f, 0.234863f, + 1.000000f, 0.230469f, 1.000000f, 0.226074f, 1.000000f, 0.221802f, 1.000000f, 0.217651f, + 1.000000f, 0.213501f, 1.000000f, 0.209473f, 1.000000f, 0.205322f, 1.000000f, 0.201294f, + 0.999512f, 0.197266f, 1.000000f, 0.193237f, 1.000000f, 0.189209f, 1.000000f, 0.185181f, + 1.000000f, 0.181030f, 0.999512f, 0.177002f, 1.000000f, 0.172852f, 0.999512f, 0.168701f, + 1.000000f, 0.164429f, 0.999512f, 0.160156f, 1.000000f, 0.155884f, 1.000000f, 0.151489f, + 1.000000f, 0.147095f, 1.000000f, 0.142578f, 1.000000f, 0.137939f, 1.000000f, 0.133301f, + 1.000000f, 0.128540f, 1.000000f, 0.123657f, 1.000000f, 0.118652f, 1.000000f, 0.113525f, + 1.000000f, 0.108276f, 1.000000f, 0.102844f, 1.000000f, 0.097290f, 1.000000f, 0.091553f, + 1.000000f, 0.085571f, 1.000000f, 0.079407f, 1.000000f, 0.073059f, 1.000000f, 0.066345f, + 1.000000f, 0.059387f, 1.000000f, 0.052063f, 1.000000f, 0.044342f, 0.999512f, 0.036194f, + 0.999512f, 0.027496f, 1.000000f, 0.018219f, 0.999512f, 0.008430f, 0.999512f, 0.000505f, + 0.000000f, 1.000000f, 1.000000f, 0.538574f, 1.000000f, 0.446777f, 1.000000f, 0.395020f, + 1.000000f, 0.360352f, 1.000000f, 0.334717f, 1.000000f, 0.314941f, 1.000000f, 0.298584f, + 1.000000f, 0.284912f, 1.000000f, 0.273193f, 1.000000f, 0.263184f, 1.000000f, 0.253906f, + 1.000000f, 0.245850f, 1.000000f, 0.238281f, 1.000000f, 0.231445f, 1.000000f, 0.224976f, + 1.000000f, 0.218872f, 1.000000f, 0.213257f, 0.999512f, 0.207764f, 1.000000f, 0.202637f, + 1.000000f, 0.197632f, 1.000000f, 0.192749f, 1.000000f, 0.188110f, 1.000000f, 0.183594f, + 1.000000f, 0.179199f, 0.999512f, 0.174927f, 1.000000f, 0.170654f, 1.000000f, 0.166382f, + 0.999512f, 0.162354f, 1.000000f, 0.158203f, 1.000000f, 0.154175f, 1.000000f, 0.150146f, + 1.000000f, 0.146240f, 1.000000f, 0.142212f, 1.000000f, 0.138184f, 1.000000f, 0.134277f, + 1.000000f, 0.130249f, 1.000000f, 0.126343f, 1.000000f, 0.122314f, 1.000000f, 0.118286f, + 1.000000f, 0.114258f, 1.000000f, 0.110168f, 1.000000f, 0.106079f, 1.000000f, 0.101868f, + 0.999512f, 0.097717f, 0.999512f, 0.093445f, 1.000000f, 0.089111f, 1.000000f, 0.084717f, + 1.000000f, 0.080200f, 1.000000f, 0.075684f, 1.000000f, 0.071045f, 1.000000f, 0.066284f, + 1.000000f, 0.061462f, 1.000000f, 0.056488f, 1.000000f, 0.051361f, 1.000000f, 0.046112f, + 0.999512f, 0.040710f, 1.000000f, 0.035126f, 1.000000f, 0.029388f, 1.000000f, 0.023422f, + 1.000000f, 0.017273f, 0.999512f, 0.010963f, 0.999512f, 0.004715f, 0.999512f, 0.000231f, + 0.000000f, 1.000000f, 1.000000f, 0.549316f, 1.000000f, 0.452393f, 1.000000f, 0.396240f, + 1.000000f, 0.357666f, 1.000000f, 0.329102f, 1.000000f, 0.306396f, 1.000000f, 0.287842f, + 1.000000f, 0.272217f, 0.999512f, 0.258789f, 1.000000f, 0.247192f, 1.000000f, 0.236816f, + 0.999512f, 0.227417f, 1.000000f, 0.218872f, 1.000000f, 0.211060f, 1.000000f, 0.203857f, + 1.000000f, 0.197144f, 0.999512f, 0.190796f, 1.000000f, 0.184814f, 1.000000f, 0.179199f, + 1.000000f, 0.173828f, 1.000000f, 0.168701f, 1.000000f, 0.163696f, 1.000000f, 0.158936f, + 1.000000f, 0.154297f, 0.999512f, 0.149902f, 1.000000f, 0.145508f, 1.000000f, 0.141235f, + 1.000000f, 0.137085f, 1.000000f, 0.133057f, 1.000000f, 0.129028f, 1.000000f, 0.125122f, + 0.999512f, 0.121277f, 0.999512f, 0.117432f, 1.000000f, 0.113647f, 1.000000f, 0.109863f, + 1.000000f, 0.106140f, 1.000000f, 0.102417f, 1.000000f, 0.098694f, 1.000000f, 0.094971f, + 1.000000f, 0.091309f, 0.999512f, 0.087585f, 0.999512f, 0.083923f, 1.000000f, 0.080200f, + 1.000000f, 0.076477f, 0.999512f, 0.072754f, 1.000000f, 0.068970f, 0.999512f, 0.065186f, + 0.999512f, 0.061371f, 1.000000f, 0.057495f, 1.000000f, 0.053619f, 1.000000f, 0.049652f, + 1.000000f, 0.045654f, 1.000000f, 0.041595f, 1.000000f, 0.037476f, 1.000000f, 0.033295f, + 0.999512f, 0.029053f, 1.000000f, 0.024734f, 1.000000f, 0.020340f, 1.000000f, 0.015900f, + 0.999512f, 0.011436f, 1.000000f, 0.007008f, 1.000000f, 0.002840f, 0.999512f, 0.000120f, + 0.000000f, 1.000000f, 0.999512f, 0.558105f, 1.000000f, 0.457275f, 0.999512f, 0.397705f, + 1.000000f, 0.356201f, 1.000000f, 0.325195f, 1.000000f, 0.300293f, 0.999512f, 0.280029f, + 1.000000f, 0.262939f, 1.000000f, 0.248291f, 0.999512f, 0.235352f, 1.000000f, 0.223877f, + 1.000000f, 0.213623f, 1.000000f, 0.204346f, 0.999512f, 0.195801f, 0.999512f, 0.187988f, + 1.000000f, 0.180664f, 1.000000f, 0.173828f, 0.999512f, 0.167480f, 1.000000f, 0.161499f, + 0.999512f, 0.155884f, 1.000000f, 0.150391f, 0.999512f, 0.145264f, 1.000000f, 0.140381f, + 1.000000f, 0.135620f, 0.999512f, 0.131104f, 1.000000f, 0.126587f, 1.000000f, 0.122375f, + 1.000000f, 0.118225f, 1.000000f, 0.114197f, 1.000000f, 0.110291f, 1.000000f, 0.106445f, + 1.000000f, 0.102661f, 1.000000f, 0.098999f, 1.000000f, 0.095337f, 1.000000f, 0.091736f, + 0.999512f, 0.088257f, 1.000000f, 0.084778f, 1.000000f, 0.081299f, 0.999512f, 0.077881f, + 0.999512f, 0.074524f, 1.000000f, 0.071167f, 1.000000f, 0.067810f, 1.000000f, 0.064514f, + 1.000000f, 0.061218f, 1.000000f, 0.057922f, 1.000000f, 0.054626f, 1.000000f, 0.051331f, + 0.999512f, 0.048065f, 1.000000f, 0.044739f, 0.999512f, 0.041443f, 0.999512f, 0.038116f, + 1.000000f, 0.034790f, 1.000000f, 0.031464f, 1.000000f, 0.028107f, 0.999512f, 0.024734f, + 0.999512f, 0.021347f, 1.000000f, 0.017960f, 1.000000f, 0.014565f, 1.000000f, 0.011185f, + 1.000000f, 0.007866f, 1.000000f, 0.004681f, 0.999512f, 0.001804f, 1.000000f, 0.000067f, + 0.000000f, 1.000000f, 1.000000f, 0.564941f, 1.000000f, 0.461426f, 1.000000f, 0.399170f, + 1.000000f, 0.355469f, 1.000000f, 0.322510f, 0.999512f, 0.296143f, 1.000000f, 0.274170f, + 1.000000f, 0.255859f, 1.000000f, 0.240112f, 0.999512f, 0.226196f, 1.000000f, 0.213989f, + 0.999512f, 0.202881f, 0.999512f, 0.192993f, 1.000000f, 0.183838f, 1.000000f, 0.175537f, + 1.000000f, 0.167847f, 1.000000f, 0.160645f, 1.000000f, 0.154053f, 1.000000f, 0.147705f, + 0.999512f, 0.141846f, 0.999512f, 0.136230f, 1.000000f, 0.130981f, 1.000000f, 0.125854f, + 1.000000f, 0.121094f, 1.000000f, 0.116455f, 1.000000f, 0.112061f, 1.000000f, 0.107788f, + 1.000000f, 0.103638f, 1.000000f, 0.099670f, 1.000000f, 0.095825f, 1.000000f, 0.092041f, + 1.000000f, 0.088379f, 1.000000f, 0.084839f, 1.000000f, 0.081360f, 1.000000f, 0.078003f, + 1.000000f, 0.074646f, 1.000000f, 0.071411f, 1.000000f, 0.068176f, 1.000000f, 0.065002f, + 0.999512f, 0.061951f, 0.999512f, 0.058868f, 1.000000f, 0.055847f, 0.999512f, 0.052856f, + 1.000000f, 0.049896f, 0.999512f, 0.046967f, 1.000000f, 0.044067f, 1.000000f, 0.041199f, + 1.000000f, 0.038330f, 1.000000f, 0.035492f, 0.999512f, 0.032684f, 0.999512f, 0.029877f, + 1.000000f, 0.027069f, 0.999512f, 0.024292f, 0.999512f, 0.021530f, 1.000000f, 0.018784f, + 1.000000f, 0.016052f, 0.999512f, 0.013351f, 1.000000f, 0.010689f, 1.000000f, 0.008087f, + 1.000000f, 0.005581f, 1.000000f, 0.003231f, 1.000000f, 0.001194f, 0.999512f, 0.000040f, + 0.000000f, 1.000000f, 1.000000f, 0.570801f, 1.000000f, 0.465088f, 1.000000f, 0.400635f, + 1.000000f, 0.355225f, 1.000000f, 0.320557f, 1.000000f, 0.292725f, 1.000000f, 0.269775f, + 0.999512f, 0.250488f, 1.000000f, 0.233765f, 0.999512f, 0.218994f, 1.000000f, 0.206055f, + 1.000000f, 0.194458f, 1.000000f, 0.183960f, 1.000000f, 0.174438f, 1.000000f, 0.165649f, + 1.000000f, 0.157593f, 0.999512f, 0.150146f, 1.000000f, 0.143311f, 1.000000f, 0.136719f, + 1.000000f, 0.130737f, 1.000000f, 0.125000f, 1.000000f, 0.119568f, 1.000000f, 0.114441f, + 1.000000f, 0.109558f, 0.999512f, 0.104919f, 0.999512f, 0.100464f, 1.000000f, 0.096252f, + 1.000000f, 0.092163f, 1.000000f, 0.088196f, 0.999512f, 0.084412f, 1.000000f, 0.080750f, + 1.000000f, 0.077209f, 1.000000f, 0.073792f, 1.000000f, 0.070496f, 1.000000f, 0.067261f, + 1.000000f, 0.064087f, 0.999512f, 0.061035f, 1.000000f, 0.058044f, 1.000000f, 0.055115f, + 1.000000f, 0.052246f, 1.000000f, 0.049408f, 1.000000f, 0.046661f, 1.000000f, 0.043976f, + 0.999512f, 0.041290f, 1.000000f, 0.038696f, 0.999512f, 0.036102f, 1.000000f, 0.033569f, + 1.000000f, 0.031082f, 0.999512f, 0.028610f, 1.000000f, 0.026184f, 1.000000f, 0.023788f, + 1.000000f, 0.021423f, 1.000000f, 0.019073f, 0.999512f, 0.016785f, 1.000000f, 0.014519f, + 0.999512f, 0.012299f, 0.999512f, 0.010124f, 1.000000f, 0.008011f, 1.000000f, 0.005978f, + 1.000000f, 0.004051f, 1.000000f, 0.002293f, 1.000000f, 0.000817f, 1.000000f, 0.000025f, + 0.000000f, 1.000000f, 1.000000f, 0.575684f, 0.999512f, 0.468018f, 1.000000f, 0.402100f, + 1.000000f, 0.354980f, 1.000000f, 0.319092f, 1.000000f, 0.290283f, 1.000000f, 0.266357f, + 1.000000f, 0.246094f, 1.000000f, 0.228638f, 1.000000f, 0.213257f, 1.000000f, 0.199707f, + 1.000000f, 0.187622f, 1.000000f, 0.176758f, 1.000000f, 0.166748f, 1.000000f, 0.157715f, + 1.000000f, 0.149414f, 1.000000f, 0.141724f, 1.000000f, 0.134521f, 1.000000f, 0.127930f, + 0.999512f, 0.121704f, 1.000000f, 0.115906f, 1.000000f, 0.110413f, 1.000000f, 0.105225f, + 1.000000f, 0.100281f, 1.000000f, 0.095642f, 1.000000f, 0.091187f, 1.000000f, 0.086975f, + 0.999512f, 0.082886f, 1.000000f, 0.079041f, 1.000000f, 0.075317f, 1.000000f, 0.071777f, + 1.000000f, 0.068298f, 1.000000f, 0.065002f, 1.000000f, 0.061829f, 0.999512f, 0.058746f, + 1.000000f, 0.055756f, 1.000000f, 0.052856f, 1.000000f, 0.050049f, 1.000000f, 0.047302f, + 1.000000f, 0.044647f, 0.999512f, 0.042053f, 0.999512f, 0.039520f, 1.000000f, 0.037048f, + 0.999512f, 0.034637f, 1.000000f, 0.032288f, 1.000000f, 0.029999f, 1.000000f, 0.027756f, + 1.000000f, 0.025543f, 1.000000f, 0.023392f, 1.000000f, 0.021271f, 1.000000f, 0.019211f, + 0.999512f, 0.017181f, 1.000000f, 0.015213f, 1.000000f, 0.013283f, 1.000000f, 0.011398f, + 0.999512f, 0.009567f, 1.000000f, 0.007805f, 0.999512f, 0.006107f, 1.000000f, 0.004498f, + 0.999512f, 0.003000f, 1.000000f, 0.001662f, 1.000000f, 0.000573f, 1.000000f, 0.000017f, + 0.000000f, 1.000000f, 1.000000f, 0.579590f, 1.000000f, 0.470703f, 0.999512f, 0.403320f, + 1.000000f, 0.355225f, 1.000000f, 0.318115f, 1.000000f, 0.288086f, 1.000000f, 0.263428f, + 1.000000f, 0.242554f, 1.000000f, 0.224365f, 1.000000f, 0.208618f, 1.000000f, 0.194580f, + 1.000000f, 0.182007f, 1.000000f, 0.170776f, 1.000000f, 0.160522f, 1.000000f, 0.151245f, + 1.000000f, 0.142578f, 1.000000f, 0.134766f, 1.000000f, 0.127441f, 1.000000f, 0.120667f, + 0.999512f, 0.114380f, 1.000000f, 0.108459f, 1.000000f, 0.102844f, 1.000000f, 0.097656f, + 1.000000f, 0.092712f, 1.000000f, 0.088013f, 1.000000f, 0.083618f, 1.000000f, 0.079407f, + 1.000000f, 0.075439f, 1.000000f, 0.071594f, 1.000000f, 0.067993f, 1.000000f, 0.064453f, + 1.000000f, 0.061157f, 1.000000f, 0.057953f, 0.999512f, 0.054871f, 1.000000f, 0.051910f, + 1.000000f, 0.049072f, 1.000000f, 0.046326f, 1.000000f, 0.043671f, 1.000000f, 0.041107f, + 1.000000f, 0.038605f, 1.000000f, 0.036194f, 1.000000f, 0.033875f, 1.000000f, 0.031616f, + 1.000000f, 0.029434f, 1.000000f, 0.027298f, 1.000000f, 0.025223f, 1.000000f, 0.023224f, + 1.000000f, 0.021255f, 1.000000f, 0.019363f, 1.000000f, 0.017517f, 1.000000f, 0.015717f, + 1.000000f, 0.013977f, 1.000000f, 0.012291f, 1.000000f, 0.010651f, 1.000000f, 0.009071f, + 1.000000f, 0.007557f, 0.999512f, 0.006104f, 1.000000f, 0.004726f, 0.999512f, 0.003439f, + 0.999512f, 0.002260f, 0.999512f, 0.001228f, 1.000000f, 0.000412f, 0.999512f, 0.000011f, + 0.000000f, 1.000000f, 1.000000f, 0.583008f, 1.000000f, 0.473145f, 1.000000f, 0.404541f, + 1.000000f, 0.355225f, 1.000000f, 0.317139f, 1.000000f, 0.286621f, 1.000000f, 0.261230f, + 1.000000f, 0.239624f, 1.000000f, 0.220947f, 1.000000f, 0.204712f, 1.000000f, 0.190308f, + 1.000000f, 0.177368f, 1.000000f, 0.165771f, 1.000000f, 0.155273f, 1.000000f, 0.145752f, + 1.000000f, 0.137085f, 1.000000f, 0.129028f, 1.000000f, 0.121582f, 1.000000f, 0.114685f, + 1.000000f, 0.108276f, 1.000000f, 0.102295f, 1.000000f, 0.096680f, 1.000000f, 0.091431f, + 1.000000f, 0.086487f, 1.000000f, 0.081787f, 1.000000f, 0.077393f, 1.000000f, 0.073242f, + 1.000000f, 0.069275f, 0.999512f, 0.065552f, 1.000000f, 0.061951f, 1.000000f, 0.058563f, + 0.999512f, 0.055298f, 1.000000f, 0.052216f, 0.999512f, 0.049225f, 1.000000f, 0.046387f, + 1.000000f, 0.043671f, 1.000000f, 0.041046f, 1.000000f, 0.038513f, 1.000000f, 0.036102f, + 1.000000f, 0.033783f, 1.000000f, 0.031525f, 1.000000f, 0.029373f, 1.000000f, 0.027298f, + 1.000000f, 0.025284f, 1.000000f, 0.023346f, 0.999512f, 0.021469f, 1.000000f, 0.019653f, + 1.000000f, 0.017899f, 1.000000f, 0.016220f, 1.000000f, 0.014587f, 1.000000f, 0.013016f, + 1.000000f, 0.011505f, 1.000000f, 0.010048f, 1.000000f, 0.008652f, 1.000000f, 0.007313f, + 1.000000f, 0.006042f, 1.000000f, 0.004837f, 1.000000f, 0.003708f, 1.000000f, 0.002666f, + 1.000000f, 0.001729f, 1.000000f, 0.000923f, 1.000000f, 0.000301f, 1.000000f, 0.000008f, + 0.000000f, 1.000000f, 1.000000f, 0.585938f, 1.000000f, 0.475098f, 1.000000f, 0.405518f, + 1.000000f, 0.355225f, 1.000000f, 0.316650f, 1.000000f, 0.285156f, 1.000000f, 0.259277f, + 1.000000f, 0.237183f, 1.000000f, 0.218140f, 1.000000f, 0.201416f, 1.000000f, 0.186646f, + 1.000000f, 0.173584f, 1.000000f, 0.161743f, 1.000000f, 0.151001f, 1.000000f, 0.141235f, + 1.000000f, 0.132324f, 1.000000f, 0.124207f, 0.999512f, 0.116638f, 1.000000f, 0.109680f, + 1.000000f, 0.103210f, 0.999512f, 0.097168f, 1.000000f, 0.091492f, 1.000000f, 0.086243f, + 1.000000f, 0.081299f, 1.000000f, 0.076660f, 1.000000f, 0.072266f, 1.000000f, 0.068115f, + 1.000000f, 0.064209f, 1.000000f, 0.060516f, 1.000000f, 0.057007f, 1.000000f, 0.053680f, + 1.000000f, 0.050507f, 1.000000f, 0.047485f, 1.000000f, 0.044617f, 1.000000f, 0.041870f, + 1.000000f, 0.039246f, 1.000000f, 0.036743f, 1.000000f, 0.034363f, 0.999512f, 0.032074f, + 1.000000f, 0.029877f, 1.000000f, 0.027771f, 1.000000f, 0.025757f, 1.000000f, 0.023819f, + 1.000000f, 0.021957f, 0.999512f, 0.020172f, 1.000000f, 0.018463f, 1.000000f, 0.016830f, + 1.000000f, 0.015251f, 1.000000f, 0.013741f, 1.000000f, 0.012291f, 0.999512f, 0.010902f, + 1.000000f, 0.009575f, 1.000000f, 0.008308f, 1.000000f, 0.007107f, 1.000000f, 0.005966f, + 1.000000f, 0.004887f, 1.000000f, 0.003880f, 1.000000f, 0.002945f, 1.000000f, 0.002094f, + 0.999512f, 0.001340f, 1.000000f, 0.000703f, 0.999512f, 0.000224f, 1.000000f, 0.000005f, + 0.000000f, 1.000000f, 1.000000f, 0.588379f, 1.000000f, 0.476807f, 1.000000f, 0.406250f, + 1.000000f, 0.355469f, 1.000000f, 0.315918f, 1.000000f, 0.284180f, 1.000000f, 0.257568f, + 1.000000f, 0.235229f, 1.000000f, 0.215698f, 1.000000f, 0.198730f, 1.000000f, 0.183716f, + 1.000000f, 0.170288f, 1.000000f, 0.158203f, 0.999512f, 0.147339f, 1.000000f, 0.137451f, + 0.999512f, 0.128418f, 0.999512f, 0.120178f, 1.000000f, 0.112549f, 0.999512f, 0.105469f, + 1.000000f, 0.098938f, 1.000000f, 0.092896f, 1.000000f, 0.087219f, 1.000000f, 0.081909f, + 1.000000f, 0.076965f, 1.000000f, 0.072327f, 1.000000f, 0.067993f, 1.000000f, 0.063843f, + 1.000000f, 0.059998f, 1.000000f, 0.056366f, 1.000000f, 0.052917f, 1.000000f, 0.049622f, + 1.000000f, 0.046539f, 1.000000f, 0.043610f, 1.000000f, 0.040802f, 1.000000f, 0.038147f, + 1.000000f, 0.035645f, 1.000000f, 0.033234f, 1.000000f, 0.030945f, 1.000000f, 0.028778f, + 1.000000f, 0.026688f, 1.000000f, 0.024704f, 1.000000f, 0.022812f, 1.000000f, 0.021011f, + 1.000000f, 0.019287f, 1.000000f, 0.017639f, 1.000000f, 0.016068f, 1.000000f, 0.014565f, + 0.999512f, 0.013130f, 1.000000f, 0.011772f, 0.999512f, 0.010468f, 1.000000f, 0.009232f, + 1.000000f, 0.008064f, 1.000000f, 0.006954f, 1.000000f, 0.005905f, 1.000000f, 0.004921f, + 0.999512f, 0.004002f, 1.000000f, 0.003149f, 1.000000f, 0.002367f, 1.000000f, 0.001666f, + 1.000000f, 0.001052f, 0.999512f, 0.000543f, 1.000000f, 0.000169f, 0.999512f, 0.000004f, + 0.000000f, 1.000000f, 1.000000f, 0.590820f, 1.000000f, 0.478271f, 1.000000f, 0.407227f, + 1.000000f, 0.355713f, 1.000000f, 0.315674f, 1.000000f, 0.283203f, 1.000000f, 0.256348f, + 1.000000f, 0.233521f, 1.000000f, 0.213745f, 1.000000f, 0.196411f, 1.000000f, 0.181152f, + 1.000000f, 0.167480f, 1.000000f, 0.155273f, 1.000000f, 0.144287f, 1.000000f, 0.134277f, + 1.000000f, 0.125122f, 1.000000f, 0.116760f, 1.000000f, 0.109070f, 1.000000f, 0.101929f, + 1.000000f, 0.095398f, 1.000000f, 0.089294f, 1.000000f, 0.083618f, 1.000000f, 0.078308f, + 1.000000f, 0.073364f, 1.000000f, 0.068726f, 1.000000f, 0.064392f, 0.999512f, 0.060333f, + 1.000000f, 0.056488f, 1.000000f, 0.052887f, 1.000000f, 0.049500f, 1.000000f, 0.046265f, + 1.000000f, 0.043243f, 1.000000f, 0.040375f, 1.000000f, 0.037659f, 1.000000f, 0.035095f, + 1.000000f, 0.032654f, 1.000000f, 0.030350f, 1.000000f, 0.028152f, 1.000000f, 0.026062f, + 1.000000f, 0.024078f, 1.000000f, 0.022202f, 1.000000f, 0.020416f, 1.000000f, 0.018723f, + 0.999512f, 0.017105f, 0.999512f, 0.015579f, 1.000000f, 0.014122f, 1.000000f, 0.012741f, + 1.000000f, 0.011436f, 1.000000f, 0.010193f, 0.999512f, 0.009018f, 0.999512f, 0.007912f, + 1.000000f, 0.006866f, 1.000000f, 0.005882f, 1.000000f, 0.004963f, 1.000000f, 0.004105f, + 1.000000f, 0.003313f, 1.000000f, 0.002586f, 1.000000f, 0.001926f, 1.000000f, 0.001341f, + 1.000000f, 0.000836f, 1.000000f, 0.000425f, 1.000000f, 0.000129f, 1.000000f, 0.000003f, + 0.000000f, 1.000000f, 1.000000f, 0.592773f, 0.999512f, 0.479492f, 0.999512f, 0.407959f, + 1.000000f, 0.355713f, 1.000000f, 0.315186f, 0.999512f, 0.282471f, 1.000000f, 0.255127f, + 0.999512f, 0.232056f, 1.000000f, 0.212036f, 1.000000f, 0.194458f, 1.000000f, 0.178955f, + 1.000000f, 0.165161f, 0.999512f, 0.152832f, 0.999512f, 0.141724f, 0.999512f, 0.131592f, + 1.000000f, 0.122314f, 1.000000f, 0.113892f, 1.000000f, 0.106140f, 1.000000f, 0.098999f, + 1.000000f, 0.092346f, 1.000000f, 0.086243f, 1.000000f, 0.080566f, 1.000000f, 0.075256f, + 0.999512f, 0.070312f, 0.999512f, 0.065674f, 1.000000f, 0.061401f, 1.000000f, 0.057343f, + 1.000000f, 0.053558f, 1.000000f, 0.049988f, 1.000000f, 0.046631f, 0.999512f, 0.043488f, + 1.000000f, 0.040497f, 1.000000f, 0.037689f, 1.000000f, 0.035034f, 0.999512f, 0.032532f, + 1.000000f, 0.030182f, 1.000000f, 0.027954f, 1.000000f, 0.025833f, 1.000000f, 0.023834f, + 1.000000f, 0.021942f, 1.000000f, 0.020157f, 1.000000f, 0.018463f, 1.000000f, 0.016846f, + 1.000000f, 0.015343f, 1.000000f, 0.013908f, 0.999512f, 0.012550f, 1.000000f, 0.011269f, + 1.000000f, 0.010063f, 0.999512f, 0.008926f, 1.000000f, 0.007858f, 1.000000f, 0.006851f, + 1.000000f, 0.005913f, 1.000000f, 0.005035f, 0.999512f, 0.004219f, 1.000000f, 0.003468f, + 0.999512f, 0.002777f, 1.000000f, 0.002148f, 1.000000f, 0.001586f, 1.000000f, 0.001092f, + 1.000000f, 0.000673f, 1.000000f, 0.000337f, 1.000000f, 0.000100f, 1.000000f, 0.000002f, + 0.000000f, 1.000000f, 1.000000f, 0.594238f, 1.000000f, 0.480713f, 1.000000f, 0.408447f, + 1.000000f, 0.355957f, 0.999512f, 0.314941f, 1.000000f, 0.281982f, 1.000000f, 0.254395f, + 1.000000f, 0.230835f, 1.000000f, 0.210571f, 1.000000f, 0.192871f, 0.999512f, 0.177246f, + 1.000000f, 0.163208f, 1.000000f, 0.150757f, 0.999512f, 0.139526f, 1.000000f, 0.129272f, + 1.000000f, 0.119934f, 1.000000f, 0.111450f, 1.000000f, 0.103638f, 1.000000f, 0.096436f, + 0.999512f, 0.089783f, 0.999512f, 0.083679f, 1.000000f, 0.077942f, 0.999512f, 0.072693f, + 1.000000f, 0.067749f, 1.000000f, 0.063171f, 1.000000f, 0.058868f, 1.000000f, 0.054840f, + 1.000000f, 0.051086f, 1.000000f, 0.047546f, 0.999512f, 0.044250f, 1.000000f, 0.041138f, + 1.000000f, 0.038208f, 1.000000f, 0.035461f, 1.000000f, 0.032867f, 1.000000f, 0.030426f, + 1.000000f, 0.028137f, 1.000000f, 0.025970f, 1.000000f, 0.023926f, 1.000000f, 0.021988f, + 1.000000f, 0.020172f, 1.000000f, 0.018463f, 0.999512f, 0.016846f, 1.000000f, 0.015327f, + 1.000000f, 0.013893f, 1.000000f, 0.012543f, 1.000000f, 0.011269f, 1.000000f, 0.010071f, + 1.000000f, 0.008949f, 1.000000f, 0.007904f, 1.000000f, 0.006920f, 1.000000f, 0.006004f, + 1.000000f, 0.005150f, 1.000000f, 0.004360f, 1.000000f, 0.003632f, 1.000000f, 0.002962f, + 1.000000f, 0.002354f, 1.000000f, 0.001807f, 1.000000f, 0.001322f, 1.000000f, 0.000901f, + 0.999512f, 0.000548f, 0.999512f, 0.000270f, 1.000000f, 0.000079f, 1.000000f, 0.000002f, + 0.000000f, 1.000000f, 1.000000f, 0.595703f, 1.000000f, 0.481689f, 1.000000f, 0.408936f, + 1.000000f, 0.355957f, 1.000000f, 0.314697f, 1.000000f, 0.281250f, 1.000000f, 0.253418f, + 1.000000f, 0.229858f, 1.000000f, 0.209351f, 1.000000f, 0.191406f, 1.000000f, 0.175659f, + 1.000000f, 0.161621f, 1.000000f, 0.148926f, 1.000000f, 0.137573f, 0.999512f, 0.127319f, + 1.000000f, 0.117920f, 1.000000f, 0.109375f, 1.000000f, 0.101501f, 1.000000f, 0.094299f, + 1.000000f, 0.087646f, 1.000000f, 0.081482f, 1.000000f, 0.075806f, 1.000000f, 0.070496f, + 1.000000f, 0.065552f, 1.000000f, 0.061005f, 1.000000f, 0.056732f, 1.000000f, 0.052734f, + 1.000000f, 0.049011f, 1.000000f, 0.045502f, 1.000000f, 0.042236f, 1.000000f, 0.039185f, + 0.999512f, 0.036285f, 0.999512f, 0.033600f, 1.000000f, 0.031052f, 1.000000f, 0.028671f, + 1.000000f, 0.026428f, 1.000000f, 0.024323f, 0.999512f, 0.022339f, 0.999512f, 0.020477f, + 1.000000f, 0.018723f, 1.000000f, 0.017075f, 1.000000f, 0.015526f, 1.000000f, 0.014069f, + 1.000000f, 0.012703f, 1.000000f, 0.011421f, 1.000000f, 0.010223f, 1.000000f, 0.009102f, + 1.000000f, 0.008049f, 1.000000f, 0.007076f, 1.000000f, 0.006165f, 1.000000f, 0.005322f, + 1.000000f, 0.004539f, 1.000000f, 0.003820f, 1.000000f, 0.003162f, 1.000000f, 0.002563f, + 0.999512f, 0.002022f, 0.999512f, 0.001540f, 1.000000f, 0.001117f, 1.000000f, 0.000753f, + 0.999512f, 0.000453f, 1.000000f, 0.000220f, 1.000000f, 0.000063f, 1.000000f, 0.000001f, + 0.000000f, 1.000000f, 0.999512f, 0.596680f, 1.000000f, 0.482422f, 1.000000f, 0.409424f, + 1.000000f, 0.356201f, 1.000000f, 0.314697f, 0.999512f, 0.281006f, 1.000000f, 0.252930f, + 0.999512f, 0.229004f, 0.999512f, 0.208252f, 1.000000f, 0.190308f, 1.000000f, 0.174316f, + 0.999512f, 0.160156f, 1.000000f, 0.147461f, 1.000000f, 0.135986f, 1.000000f, 0.125610f, + 0.999512f, 0.116211f, 1.000000f, 0.107605f, 1.000000f, 0.099731f, 1.000000f, 0.092468f, + 1.000000f, 0.085815f, 1.000000f, 0.079651f, 1.000000f, 0.073975f, 1.000000f, 0.068665f, + 1.000000f, 0.063782f, 1.000000f, 0.059204f, 1.000000f, 0.054932f, 1.000000f, 0.050964f, + 1.000000f, 0.047272f, 1.000000f, 0.043793f, 1.000000f, 0.040558f, 0.999512f, 0.037537f, + 1.000000f, 0.034698f, 1.000000f, 0.032043f, 1.000000f, 0.029541f, 1.000000f, 0.027206f, + 1.000000f, 0.025009f, 1.000000f, 0.022949f, 1.000000f, 0.021027f, 1.000000f, 0.019211f, + 1.000000f, 0.017517f, 1.000000f, 0.015915f, 1.000000f, 0.014435f, 1.000000f, 0.013039f, + 1.000000f, 0.011734f, 0.999512f, 0.010513f, 1.000000f, 0.009369f, 0.999512f, 0.008308f, + 0.999512f, 0.007320f, 0.999512f, 0.006405f, 1.000000f, 0.005554f, 1.000000f, 0.004772f, + 1.000000f, 0.004047f, 1.000000f, 0.003389f, 1.000000f, 0.002789f, 1.000000f, 0.002245f, + 1.000000f, 0.001760f, 0.999512f, 0.001329f, 1.000000f, 0.000956f, 1.000000f, 0.000638f, + 1.000000f, 0.000379f, 0.999512f, 0.000182f, 1.000000f, 0.000051f, 1.000000f, 0.000001f, + 0.000000f, 1.000000f, 1.000000f, 0.597656f, 1.000000f, 0.483154f, 1.000000f, 0.409912f, + 1.000000f, 0.356201f, 1.000000f, 0.314453f, 1.000000f, 0.280518f, 1.000000f, 0.252197f, + 1.000000f, 0.228271f, 1.000000f, 0.207397f, 1.000000f, 0.189209f, 1.000000f, 0.173218f, + 1.000000f, 0.158936f, 1.000000f, 0.146118f, 1.000000f, 0.134644f, 0.999512f, 0.124268f, + 1.000000f, 0.114807f, 1.000000f, 0.106140f, 1.000000f, 0.098206f, 0.999512f, 0.090942f, + 1.000000f, 0.084290f, 1.000000f, 0.078125f, 1.000000f, 0.072388f, 0.999512f, 0.067139f, + 1.000000f, 0.062225f, 0.999512f, 0.057678f, 1.000000f, 0.053436f, 1.000000f, 0.049500f, + 1.000000f, 0.045807f, 1.000000f, 0.042358f, 1.000000f, 0.039154f, 1.000000f, 0.036163f, + 1.000000f, 0.033356f, 1.000000f, 0.030746f, 1.000000f, 0.028290f, 1.000000f, 0.025986f, + 1.000000f, 0.023834f, 1.000000f, 0.021820f, 1.000000f, 0.019943f, 1.000000f, 0.018173f, + 1.000000f, 0.016525f, 1.000000f, 0.014977f, 1.000000f, 0.013535f, 1.000000f, 0.012192f, + 1.000000f, 0.010933f, 1.000000f, 0.009766f, 1.000000f, 0.008675f, 1.000000f, 0.007664f, + 1.000000f, 0.006729f, 1.000000f, 0.005859f, 1.000000f, 0.005062f, 1.000000f, 0.004326f, + 1.000000f, 0.003656f, 1.000000f, 0.003044f, 1.000000f, 0.002489f, 1.000000f, 0.001993f, + 1.000000f, 0.001552f, 1.000000f, 0.001163f, 1.000000f, 0.000830f, 1.000000f, 0.000549f, + 1.000000f, 0.000323f, 0.999512f, 0.000152f, 1.000000f, 0.000042f, 1.000000f, 0.000001f, + 0.000000f, 1.000000f, 1.000000f, 0.598633f, 0.999512f, 0.483887f, 1.000000f, 0.410156f, + 0.999512f, 0.356445f, 0.999512f, 0.314453f, 0.999512f, 0.280273f, 0.999512f, 0.251709f, + 1.000000f, 0.227661f, 1.000000f, 0.206665f, 1.000000f, 0.188354f, 1.000000f, 0.172241f, + 0.999512f, 0.157959f, 1.000000f, 0.145020f, 0.999512f, 0.133545f, 1.000000f, 0.123047f, + 0.999512f, 0.113525f, 1.000000f, 0.104858f, 0.999512f, 0.096924f, 1.000000f, 0.089661f, + 1.000000f, 0.082947f, 0.999512f, 0.076782f, 1.000000f, 0.071106f, 0.999512f, 0.065796f, + 1.000000f, 0.060944f, 0.999512f, 0.056396f, 1.000000f, 0.052185f, 1.000000f, 0.048248f, + 0.999512f, 0.044586f, 0.999512f, 0.041168f, 1.000000f, 0.037994f, 1.000000f, 0.035034f, + 1.000000f, 0.032257f, 0.999512f, 0.029663f, 0.999512f, 0.027237f, 1.000000f, 0.024979f, + 1.000000f, 0.022858f, 1.000000f, 0.020889f, 1.000000f, 0.019043f, 1.000000f, 0.017319f, + 1.000000f, 0.015701f, 1.000000f, 0.014206f, 0.999512f, 0.012802f, 0.999512f, 0.011497f, + 1.000000f, 0.010284f, 1.000000f, 0.009155f, 1.000000f, 0.008110f, 1.000000f, 0.007141f, + 1.000000f, 0.006245f, 1.000000f, 0.005421f, 1.000000f, 0.004662f, 1.000000f, 0.003971f, + 1.000000f, 0.003340f, 0.999512f, 0.002768f, 1.000000f, 0.002253f, 1.000000f, 0.001793f, + 1.000000f, 0.001387f, 1.000000f, 0.001033f, 1.000000f, 0.000731f, 1.000000f, 0.000479f, + 1.000000f, 0.000279f, 0.999512f, 0.000130f, 1.000000f, 0.000035f, 1.000000f, 0.000001f, + 0.000000f, 1.000000f, 1.000000f, 0.599609f, 1.000000f, 0.484375f, 1.000000f, 0.410645f, + 0.999512f, 0.356445f, 1.000000f, 0.314209f, 1.000000f, 0.280029f, 0.999512f, 0.251465f, + 0.999512f, 0.227051f, 0.999512f, 0.206055f, 1.000000f, 0.187622f, 0.999512f, 0.171509f, + 1.000000f, 0.156982f, 1.000000f, 0.144165f, 1.000000f, 0.132568f, 1.000000f, 0.122070f, + 1.000000f, 0.112549f, 1.000000f, 0.103821f, 1.000000f, 0.095886f, 1.000000f, 0.088562f, + 0.999512f, 0.081909f, 0.999512f, 0.075684f, 1.000000f, 0.070007f, 1.000000f, 0.064758f, + 1.000000f, 0.059845f, 1.000000f, 0.055328f, 1.000000f, 0.051117f, 1.000000f, 0.047211f, + 1.000000f, 0.043579f, 0.999512f, 0.040192f, 0.999512f, 0.037018f, 1.000000f, 0.034058f, + 1.000000f, 0.031311f, 1.000000f, 0.028763f, 1.000000f, 0.026382f, 1.000000f, 0.024139f, + 1.000000f, 0.022064f, 1.000000f, 0.020111f, 1.000000f, 0.018295f, 0.999512f, 0.016602f, + 1.000000f, 0.015038f, 0.999512f, 0.013565f, 1.000000f, 0.012199f, 0.999512f, 0.010933f, + 0.999512f, 0.009750f, 1.000000f, 0.008659f, 1.000000f, 0.007648f, 1.000000f, 0.006718f, + 0.999512f, 0.005856f, 1.000000f, 0.005066f, 0.999512f, 0.004341f, 0.999512f, 0.003685f, + 0.999512f, 0.003086f, 1.000000f, 0.002546f, 1.000000f, 0.002062f, 1.000000f, 0.001634f, + 1.000000f, 0.001256f, 1.000000f, 0.000930f, 1.000000f, 0.000653f, 1.000000f, 0.000425f, + 1.000000f, 0.000245f, 1.000000f, 0.000113f, 1.000000f, 0.000030f, 1.000000f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.600098f, 1.000000f, 0.484863f, 1.000000f, 0.410889f, + 0.999512f, 0.356689f, 1.000000f, 0.314209f, 0.999512f, 0.279785f, 1.000000f, 0.250977f, + 1.000000f, 0.226685f, 1.000000f, 0.205566f, 1.000000f, 0.187012f, 1.000000f, 0.170776f, + 1.000000f, 0.156372f, 1.000000f, 0.143311f, 0.999512f, 0.131714f, 1.000000f, 0.121216f, + 1.000000f, 0.111633f, 1.000000f, 0.102966f, 1.000000f, 0.094971f, 1.000000f, 0.087708f, + 1.000000f, 0.080994f, 0.999512f, 0.074768f, 1.000000f, 0.069092f, 1.000000f, 0.063843f, + 1.000000f, 0.058960f, 0.999512f, 0.054443f, 0.999512f, 0.050232f, 1.000000f, 0.046356f, + 1.000000f, 0.042725f, 1.000000f, 0.039337f, 0.999512f, 0.036224f, 1.000000f, 0.033295f, + 1.000000f, 0.030579f, 1.000000f, 0.028030f, 1.000000f, 0.025665f, 1.000000f, 0.023453f, + 1.000000f, 0.021393f, 0.999512f, 0.019485f, 1.000000f, 0.017700f, 0.999512f, 0.016037f, + 1.000000f, 0.014488f, 1.000000f, 0.013046f, 0.999512f, 0.011711f, 0.999512f, 0.010468f, + 1.000000f, 0.009323f, 0.999512f, 0.008255f, 1.000000f, 0.007278f, 0.999512f, 0.006374f, + 1.000000f, 0.005543f, 0.999512f, 0.004780f, 0.999512f, 0.004086f, 1.000000f, 0.003456f, + 0.999512f, 0.002884f, 1.000000f, 0.002371f, 0.999512f, 0.001913f, 1.000000f, 0.001508f, + 1.000000f, 0.001154f, 0.999512f, 0.000850f, 1.000000f, 0.000593f, 1.000000f, 0.000383f, + 1.000000f, 0.000219f, 1.000000f, 0.000099f, 1.000000f, 0.000026f, 1.000000f, 0.000000f, + 0.000000f, 1.000000f, 1.000000f, 0.600586f, 0.999512f, 0.485352f, 1.000000f, 0.411133f, + 1.000000f, 0.356689f, 1.000000f, 0.314209f, 1.000000f, 0.279541f, 0.999512f, 0.250732f, + 0.999512f, 0.226318f, 1.000000f, 0.205078f, 0.999512f, 0.186523f, 1.000000f, 0.170288f, + 1.000000f, 0.155762f, 1.000000f, 0.142700f, 0.999512f, 0.131104f, 0.999512f, 0.120544f, + 1.000000f, 0.110962f, 1.000000f, 0.102234f, 1.000000f, 0.094238f, 1.000000f, 0.086914f, + 1.000000f, 0.080200f, 1.000000f, 0.074036f, 1.000000f, 0.068359f, 0.999512f, 0.063049f, + 1.000000f, 0.058228f, 1.000000f, 0.053711f, 1.000000f, 0.049530f, 1.000000f, 0.045654f, + 1.000000f, 0.042023f, 0.999512f, 0.038666f, 1.000000f, 0.035553f, 1.000000f, 0.032654f, + 0.999512f, 0.029953f, 0.999512f, 0.027435f, 1.000000f, 0.025085f, 0.999512f, 0.022903f, + 1.000000f, 0.020859f, 1.000000f, 0.018967f, 1.000000f, 0.017197f, 1.000000f, 0.015564f, + 1.000000f, 0.014046f, 1.000000f, 0.012627f, 1.000000f, 0.011314f, 0.999512f, 0.010101f, + 1.000000f, 0.008972f, 1.000000f, 0.007935f, 1.000000f, 0.006981f, 1.000000f, 0.006100f, + 1.000000f, 0.005291f, 1.000000f, 0.004555f, 1.000000f, 0.003883f, 1.000000f, 0.003275f, + 1.000000f, 0.002726f, 1.000000f, 0.002232f, 1.000000f, 0.001795f, 1.000000f, 0.001410f, + 1.000000f, 0.001074f, 0.999512f, 0.000787f, 1.000000f, 0.000546f, 1.000000f, 0.000350f, + 0.999512f, 0.000198f, 1.000000f, 0.000089f, 1.000000f, 0.000023f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 1.000000f, 0.601074f, 1.000000f, 0.485596f, 1.000000f, 0.411133f, + 1.000000f, 0.356689f, 1.000000f, 0.313965f, 1.000000f, 0.279541f, 0.999512f, 0.250488f, + 1.000000f, 0.225952f, 1.000000f, 0.204712f, 1.000000f, 0.186157f, 1.000000f, 0.169800f, + 1.000000f, 0.155273f, 0.999512f, 0.142212f, 1.000000f, 0.130493f, 1.000000f, 0.119934f, + 1.000000f, 0.110352f, 1.000000f, 0.101624f, 1.000000f, 0.093628f, 1.000000f, 0.086304f, + 1.000000f, 0.079590f, 0.999512f, 0.073425f, 1.000000f, 0.067749f, 1.000000f, 0.062469f, + 1.000000f, 0.057617f, 1.000000f, 0.053101f, 1.000000f, 0.048950f, 1.000000f, 0.045074f, + 1.000000f, 0.041473f, 1.000000f, 0.038116f, 1.000000f, 0.035034f, 1.000000f, 0.032135f, + 1.000000f, 0.029449f, 1.000000f, 0.026947f, 1.000000f, 0.024612f, 1.000000f, 0.022446f, + 1.000000f, 0.020432f, 1.000000f, 0.018555f, 0.999512f, 0.016815f, 1.000000f, 0.015190f, + 0.999512f, 0.013687f, 1.000000f, 0.012291f, 1.000000f, 0.011002f, 1.000000f, 0.009804f, + 0.999512f, 0.008698f, 1.000000f, 0.007683f, 1.000000f, 0.006744f, 1.000000f, 0.005882f, + 1.000000f, 0.005093f, 0.999512f, 0.004375f, 0.999512f, 0.003723f, 1.000000f, 0.003132f, + 1.000000f, 0.002600f, 1.000000f, 0.002125f, 1.000000f, 0.001703f, 0.999512f, 0.001333f, + 1.000000f, 0.001012f, 1.000000f, 0.000739f, 1.000000f, 0.000510f, 1.000000f, 0.000326f, + 1.000000f, 0.000183f, 1.000000f, 0.000082f, 1.000000f, 0.000021f, 1.000000f, 0.000000f, + 0.000000f, 1.000000f, 1.000000f, 0.601562f, 1.000000f, 0.485840f, 1.000000f, 0.411377f, + 0.999512f, 0.356689f, 1.000000f, 0.313965f, 1.000000f, 0.279297f, 1.000000f, 0.250244f, + 0.999512f, 0.225708f, 1.000000f, 0.204468f, 1.000000f, 0.185791f, 1.000000f, 0.169434f, + 1.000000f, 0.154785f, 1.000000f, 0.141724f, 1.000000f, 0.130005f, 0.999512f, 0.119507f, + 1.000000f, 0.109863f, 1.000000f, 0.101135f, 0.999512f, 0.093140f, 1.000000f, 0.085815f, + 1.000000f, 0.079102f, 1.000000f, 0.072937f, 1.000000f, 0.067261f, 1.000000f, 0.061981f, + 1.000000f, 0.057129f, 1.000000f, 0.052643f, 0.999512f, 0.048462f, 1.000000f, 0.044617f, + 1.000000f, 0.041016f, 1.000000f, 0.037689f, 1.000000f, 0.034607f, 1.000000f, 0.031708f, + 0.999512f, 0.029053f, 1.000000f, 0.026550f, 0.999512f, 0.024246f, 1.000000f, 0.022095f, + 1.000000f, 0.020081f, 0.999512f, 0.018219f, 0.999512f, 0.016495f, 1.000000f, 0.014900f, + 0.999512f, 0.013405f, 1.000000f, 0.012032f, 1.000000f, 0.010750f, 1.000000f, 0.009575f, + 1.000000f, 0.008484f, 1.000000f, 0.007481f, 0.999512f, 0.006557f, 1.000000f, 0.005714f, + 1.000000f, 0.004940f, 1.000000f, 0.004234f, 1.000000f, 0.003597f, 1.000000f, 0.003021f, + 1.000000f, 0.002502f, 1.000000f, 0.002041f, 1.000000f, 0.001633f, 1.000000f, 0.001274f, + 0.999512f, 0.000965f, 0.999512f, 0.000702f, 1.000000f, 0.000483f, 1.000000f, 0.000307f, + 0.999512f, 0.000172f, 1.000000f, 0.000076f, 1.000000f, 0.000019f, 1.000000f, 0.000000f, + 0.000000f, 1.000000f, 1.000000f, 0.601562f, 1.000000f, 0.486084f, 1.000000f, 0.411377f, + 1.000000f, 0.356689f, 1.000000f, 0.313965f, 1.000000f, 0.279297f, 1.000000f, 0.250244f, + 1.000000f, 0.225464f, 0.999512f, 0.204224f, 0.999512f, 0.185547f, 0.999512f, 0.169067f, + 1.000000f, 0.154541f, 1.000000f, 0.141479f, 1.000000f, 0.129639f, 1.000000f, 0.119141f, + 1.000000f, 0.109497f, 1.000000f, 0.100769f, 0.999512f, 0.092773f, 1.000000f, 0.085449f, + 1.000000f, 0.078735f, 1.000000f, 0.072510f, 1.000000f, 0.066833f, 1.000000f, 0.061615f, + 1.000000f, 0.056763f, 1.000000f, 0.052277f, 1.000000f, 0.048096f, 1.000000f, 0.044250f, + 1.000000f, 0.040680f, 1.000000f, 0.037354f, 0.999512f, 0.034271f, 1.000000f, 0.031403f, + 1.000000f, 0.028732f, 1.000000f, 0.026260f, 1.000000f, 0.023956f, 1.000000f, 0.021805f, + 0.999512f, 0.019821f, 1.000000f, 0.017975f, 0.999512f, 0.016251f, 1.000000f, 0.014671f, + 1.000000f, 0.013191f, 1.000000f, 0.011826f, 1.000000f, 0.010559f, 1.000000f, 0.009392f, + 1.000000f, 0.008316f, 0.999512f, 0.007328f, 1.000000f, 0.006416f, 1.000000f, 0.005585f, + 1.000000f, 0.004822f, 1.000000f, 0.004131f, 0.999512f, 0.003504f, 1.000000f, 0.002937f, + 1.000000f, 0.002430f, 1.000000f, 0.001978f, 0.999512f, 0.001579f, 0.999512f, 0.001230f, + 1.000000f, 0.000929f, 1.000000f, 0.000674f, 0.999512f, 0.000463f, 0.999512f, 0.000293f, + 1.000000f, 0.000163f, 1.000000f, 0.000072f, 1.000000f, 0.000018f, 1.000000f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.602051f, 0.999512f, 0.486084f, 0.999512f, 0.411621f, + 1.000000f, 0.356689f, 1.000000f, 0.313965f, 1.000000f, 0.279053f, 1.000000f, 0.250000f, + 1.000000f, 0.225342f, 1.000000f, 0.203979f, 1.000000f, 0.185303f, 1.000000f, 0.168823f, + 1.000000f, 0.154297f, 1.000000f, 0.141235f, 1.000000f, 0.129395f, 1.000000f, 0.118835f, + 1.000000f, 0.109192f, 1.000000f, 0.100464f, 1.000000f, 0.092468f, 1.000000f, 0.085144f, + 1.000000f, 0.078430f, 1.000000f, 0.072266f, 0.999512f, 0.066528f, 1.000000f, 0.061310f, + 1.000000f, 0.056458f, 1.000000f, 0.051971f, 1.000000f, 0.047821f, 1.000000f, 0.043976f, + 0.999512f, 0.040405f, 0.999512f, 0.037079f, 0.999512f, 0.033997f, 0.999512f, 0.031158f, + 1.000000f, 0.028503f, 0.999512f, 0.026031f, 1.000000f, 0.023727f, 1.000000f, 0.021606f, + 1.000000f, 0.019623f, 1.000000f, 0.017776f, 1.000000f, 0.016068f, 1.000000f, 0.014496f, + 1.000000f, 0.013031f, 1.000000f, 0.011673f, 1.000000f, 0.010414f, 1.000000f, 0.009262f, + 1.000000f, 0.008194f, 1.000000f, 0.007214f, 1.000000f, 0.006313f, 1.000000f, 0.005489f, + 0.999512f, 0.004734f, 1.000000f, 0.004051f, 1.000000f, 0.003433f, 1.000000f, 0.002876f, + 1.000000f, 0.002377f, 0.999512f, 0.001932f, 1.000000f, 0.001540f, 1.000000f, 0.001198f, + 1.000000f, 0.000904f, 1.000000f, 0.000654f, 0.999512f, 0.000448f, 1.000000f, 0.000283f, + 1.000000f, 0.000157f, 1.000000f, 0.000069f, 1.000000f, 0.000017f, 1.000000f, 0.000000f, + 0.000000f, 1.000000f, 1.000000f, 0.602051f, 1.000000f, 0.486328f, 1.000000f, 0.411621f, + 1.000000f, 0.356934f, 1.000000f, 0.313965f, 1.000000f, 0.279053f, 1.000000f, 0.250000f, + 1.000000f, 0.225220f, 1.000000f, 0.203857f, 1.000000f, 0.185181f, 0.999512f, 0.168701f, + 1.000000f, 0.154053f, 0.999512f, 0.140991f, 1.000000f, 0.129272f, 1.000000f, 0.118652f, + 1.000000f, 0.109009f, 1.000000f, 0.100220f, 1.000000f, 0.092224f, 1.000000f, 0.084900f, + 0.999512f, 0.078186f, 0.999512f, 0.072021f, 0.999512f, 0.066345f, 1.000000f, 0.061096f, + 0.999512f, 0.056244f, 1.000000f, 0.051758f, 1.000000f, 0.047607f, 1.000000f, 0.043762f, + 1.000000f, 0.040222f, 0.999512f, 0.036896f, 1.000000f, 0.033813f, 1.000000f, 0.030975f, + 1.000000f, 0.028320f, 1.000000f, 0.025864f, 1.000000f, 0.023575f, 1.000000f, 0.021454f, + 1.000000f, 0.019470f, 1.000000f, 0.017639f, 1.000000f, 0.015945f, 1.000000f, 0.014374f, + 1.000000f, 0.012917f, 1.000000f, 0.011566f, 1.000000f, 0.010315f, 1.000000f, 0.009163f, + 0.999512f, 0.008102f, 1.000000f, 0.007133f, 1.000000f, 0.006237f, 1.000000f, 0.005421f, + 1.000000f, 0.004673f, 1.000000f, 0.003998f, 0.999512f, 0.003384f, 1.000000f, 0.002832f, + 0.999512f, 0.002338f, 0.999512f, 0.001900f, 1.000000f, 0.001513f, 1.000000f, 0.001176f, + 0.999512f, 0.000886f, 1.000000f, 0.000640f, 0.999512f, 0.000438f, 0.999512f, 0.000276f, + 1.000000f, 0.000153f, 1.000000f, 0.000067f, 1.000000f, 0.000017f, 1.000000f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.602051f, 0.999512f, 0.486328f, 1.000000f, 0.411621f, + 1.000000f, 0.356934f, 1.000000f, 0.313965f, 1.000000f, 0.279053f, 0.999512f, 0.250000f, + 0.999512f, 0.225220f, 0.999512f, 0.203735f, 1.000000f, 0.185059f, 1.000000f, 0.168579f, + 0.999512f, 0.153931f, 1.000000f, 0.140869f, 1.000000f, 0.129150f, 0.999512f, 0.118469f, + 0.999512f, 0.108887f, 1.000000f, 0.100098f, 0.999512f, 0.092102f, 0.999512f, 0.084778f, + 0.999512f, 0.078064f, 1.000000f, 0.071899f, 1.000000f, 0.066162f, 1.000000f, 0.060944f, + 1.000000f, 0.056122f, 0.999512f, 0.051636f, 1.000000f, 0.047485f, 1.000000f, 0.043640f, + 1.000000f, 0.040070f, 1.000000f, 0.036774f, 1.000000f, 0.033691f, 1.000000f, 0.030869f, + 1.000000f, 0.028214f, 1.000000f, 0.025757f, 1.000000f, 0.023468f, 1.000000f, 0.021347f, + 1.000000f, 0.019379f, 1.000000f, 0.017548f, 1.000000f, 0.015854f, 1.000000f, 0.014290f, + 0.999512f, 0.012840f, 1.000000f, 0.011490f, 0.999512f, 0.010246f, 0.999512f, 0.009102f, + 0.999512f, 0.008049f, 1.000000f, 0.007080f, 0.999512f, 0.006187f, 0.999512f, 0.005375f, + 1.000000f, 0.004635f, 0.999512f, 0.003960f, 1.000000f, 0.003353f, 1.000000f, 0.002804f, + 0.999512f, 0.002314f, 1.000000f, 0.001879f, 0.999512f, 0.001495f, 0.999512f, 0.001162f, + 1.000000f, 0.000875f, 1.000000f, 0.000632f, 1.000000f, 0.000432f, 1.000000f, 0.000272f, + 1.000000f, 0.000151f, 0.999512f, 0.000066f, 1.000000f, 0.000016f, 1.000000f, 0.000000f, + 0.000000f, 1.000000f, 1.000000f, 0.602051f, 1.000000f, 0.486328f, 1.000000f, 0.411621f, + 0.999512f, 0.356934f, 1.000000f, 0.313965f, 0.999512f, 0.279053f, 1.000000f, 0.250000f, + 1.000000f, 0.225098f, 0.999512f, 0.203735f, 1.000000f, 0.185059f, 1.000000f, 0.168579f, + 1.000000f, 0.153931f, 1.000000f, 0.140747f, 1.000000f, 0.129028f, 1.000000f, 0.118408f, + 1.000000f, 0.108765f, 1.000000f, 0.100037f, 1.000000f, 0.091980f, 1.000000f, 0.084656f, + 1.000000f, 0.077942f, 0.999512f, 0.071777f, 1.000000f, 0.066101f, 0.999512f, 0.060883f, + 1.000000f, 0.056030f, 0.999512f, 0.051544f, 1.000000f, 0.047424f, 0.999512f, 0.043579f, + 1.000000f, 0.040009f, 1.000000f, 0.036713f, 0.999512f, 0.033630f, 1.000000f, 0.030792f, + 1.000000f, 0.028152f, 1.000000f, 0.025696f, 1.000000f, 0.023407f, 1.000000f, 0.021301f, + 1.000000f, 0.019333f, 1.000000f, 0.017502f, 0.999512f, 0.015808f, 1.000000f, 0.014244f, + 1.000000f, 0.012794f, 1.000000f, 0.011452f, 1.000000f, 0.010216f, 1.000000f, 0.009071f, + 0.999512f, 0.008018f, 1.000000f, 0.007050f, 1.000000f, 0.006161f, 1.000000f, 0.005352f, + 1.000000f, 0.004612f, 1.000000f, 0.003941f, 1.000000f, 0.003336f, 1.000000f, 0.002789f, + 1.000000f, 0.002300f, 1.000000f, 0.001868f, 1.000000f, 0.001486f, 0.999512f, 0.001154f, + 0.999512f, 0.000868f, 0.999512f, 0.000627f, 1.000000f, 0.000428f, 1.000000f, 0.000269f, + 1.000000f, 0.000149f, 1.000000f, 0.000065f, 1.000000f, 0.000016f, 1.000000f, 0.000000f, + 0.000000f, 1.000000f, 1.000000f, 0.602051f, 1.000000f, 0.486328f, 1.000000f, 0.411621f, + 1.000000f, 0.356934f, 1.000000f, 0.313965f, 1.000000f, 0.279053f, 1.000000f, 0.250000f, + 1.000000f, 0.225098f, 1.000000f, 0.203735f, 1.000000f, 0.185059f, 1.000000f, 0.168457f, + 1.000000f, 0.153809f, 1.000000f, 0.140747f, 1.000000f, 0.129028f, 1.000000f, 0.118408f, + 1.000000f, 0.108765f, 1.000000f, 0.099976f, 1.000000f, 0.091980f, 1.000000f, 0.084656f, + 1.000000f, 0.077942f, 1.000000f, 0.071777f, 1.000000f, 0.066101f, 1.000000f, 0.060852f, + 1.000000f, 0.056000f, 1.000000f, 0.051544f, 1.000000f, 0.047394f, 1.000000f, 0.043549f, + 1.000000f, 0.039978f, 1.000000f, 0.036682f, 1.000000f, 0.033630f, 1.000000f, 0.030777f, + 1.000000f, 0.028137f, 1.000000f, 0.025681f, 1.000000f, 0.023392f, 1.000000f, 0.021286f, + 1.000000f, 0.019318f, 1.000000f, 0.017487f, 1.000000f, 0.015793f, 1.000000f, 0.014236f, + 1.000000f, 0.012779f, 1.000000f, 0.011444f, 1.000000f, 0.010201f, 1.000000f, 0.009056f, + 1.000000f, 0.008003f, 1.000000f, 0.007042f, 1.000000f, 0.006153f, 1.000000f, 0.005344f, + 1.000000f, 0.004604f, 1.000000f, 0.003937f, 1.000000f, 0.003330f, 1.000000f, 0.002785f, + 1.000000f, 0.002296f, 1.000000f, 0.001864f, 1.000000f, 0.001483f, 1.000000f, 0.001151f, + 1.000000f, 0.000866f, 1.000000f, 0.000626f, 1.000000f, 0.000427f, 1.000000f, 0.000269f, + 1.000000f, 0.000149f, 1.000000f, 0.000065f, 1.000000f, 0.000016f, 1.000000f, 0.000000f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996094f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996582f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996582f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996582f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.997070f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996582f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996582f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996094f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996094f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.995605f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.995605f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.995605f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.994629f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000912f, 0.993652f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.001939f, 0.993164f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.002798f, 0.992676f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.003477f, 0.991699f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.004002f, 0.990234f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.005341f, 0.989258f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.006973f, 0.987305f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.998535f, 0.008606f, 0.985352f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.998047f, 0.011108f, 0.982910f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.001425f, 0.997070f, 0.014374f, 0.979492f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.002775f, 0.996582f, 0.018860f, 0.975586f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000144f, 0.998047f, 0.003784f, 0.996094f, 0.024811f, 0.969727f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999023f, 0.002699f, 0.997559f, 0.004440f, 0.994629f, 0.034180f, 0.961426f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, + 0.002378f, 0.997559f, 0.003843f, 0.996582f, 0.007648f, 0.993164f, 0.047485f, 0.950684f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000106f, 0.999023f, 0.001904f, 0.998047f, 0.002897f, 0.997559f, + 0.003870f, 0.996582f, 0.005512f, 0.995117f, 0.011642f, 0.989746f, 0.068420f, 0.933594f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.001366f, 0.999023f, 0.002296f, 0.998535f, + 0.002888f, 0.998047f, 0.003391f, 0.997559f, 0.003883f, 0.997070f, 0.004372f, 0.996582f, + 0.006683f, 0.994629f, 0.009514f, 0.992188f, 0.019272f, 0.984375f, 0.102539f, 0.907715f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000374f, 0.999512f, 0.001418f, 0.999023f, + 0.001929f, 0.998535f, 0.002419f, 0.998535f, 0.002895f, 0.998047f, 0.003201f, 0.998047f, + 0.003405f, 0.997559f, 0.003880f, 0.997559f, 0.003897f, 0.997070f, 0.004379f, 0.997070f, + 0.004784f, 0.996094f, 0.006626f, 0.995605f, 0.008133f, 0.994629f, 0.009506f, 0.992676f, + 0.012962f, 0.990723f, 0.019562f, 0.985840f, 0.037567f, 0.972656f, 0.159668f, 0.867188f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000064f, 0.999512f, 0.000964f, 0.999512f, + 0.001456f, 0.999023f, 0.001945f, 0.999023f, 0.002424f, 0.998535f, 0.002436f, 0.998535f, + 0.002918f, 0.998535f, 0.002924f, 0.998047f, 0.003403f, 0.998047f, 0.003412f, 0.998047f, + 0.003733f, 0.997559f, 0.003897f, 0.997559f, 0.003901f, 0.997559f, 0.004292f, 0.997559f, + 0.004383f, 0.997070f, 0.004387f, 0.997070f, 0.004391f, 0.997070f, 0.005638f, 0.996582f, + 0.006310f, 0.996094f, 0.006813f, 0.995605f, 0.007763f, 0.995117f, 0.008270f, 0.995117f, + 0.008751f, 0.994629f, 0.010361f, 0.993652f, 0.011818f, 0.992676f, 0.013054f, 0.991699f, + 0.015396f, 0.990723f, 0.018417f, 0.988770f, 0.022064f, 0.986816f, 0.027237f, 0.983398f, + 0.035950f, 0.978027f, 0.051636f, 0.968262f, 0.089050f, 0.942871f, 0.253662f, 0.802734f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.001949f, 0.999023f, 0.002439f, 0.998535f, + 0.002928f, 0.998047f, 0.003416f, 0.997559f, 0.003899f, 0.997559f, 0.003904f, 0.997559f, + 0.004379f, 0.997070f, 0.004391f, 0.997070f, 0.004391f, 0.997070f, 0.005844f, 0.996582f, + 0.006790f, 0.996094f, 0.007160f, 0.996094f, 0.007317f, 0.995605f, 0.008286f, 0.995117f, + 0.008293f, 0.995117f, 0.008774f, 0.995117f, 0.009735f, 0.994629f, 0.010704f, 0.994141f, + 0.011215f, 0.993652f, 0.012184f, 0.993652f, 0.012642f, 0.993164f, 0.013733f, 0.992676f, + 0.014603f, 0.992188f, 0.015579f, 0.992188f, 0.016418f, 0.991699f, 0.017120f, 0.991211f, + 0.019241f, 0.990723f, 0.019836f, 0.990234f, 0.020416f, 0.989746f, 0.022781f, 0.989258f, + 0.023727f, 0.988281f, 0.024826f, 0.987793f, 0.026901f, 0.987305f, 0.027756f, 0.986328f, + 0.029617f, 0.985840f, 0.032043f, 0.984863f, 0.034210f, 0.983887f, 0.036804f, 0.982910f, + 0.039612f, 0.981934f, 0.041321f, 0.980957f, 0.044220f, 0.979492f, 0.048370f, 0.978027f, + 0.051941f, 0.976562f, 0.055420f, 0.974609f, 0.059326f, 0.972656f, 0.064880f, 0.970703f, + 0.070557f, 0.967773f, 0.077026f, 0.964844f, 0.085449f, 0.961426f, 0.094055f, 0.957031f, + 0.104126f, 0.952148f, 0.117554f, 0.945801f, 0.133179f, 0.937500f, 0.154053f, 0.926758f, + 0.181152f, 0.911133f, 0.219604f, 0.887207f, 0.281738f, 0.841797f, 0.392822f, 0.706055f, + 0.000000f, 1.000000f, 0.600586f, 0.700195f, 0.647461f, 0.655273f, 0.678711f, 0.636719f, + 0.704590f, 0.626953f, 0.724609f, 0.621094f, 0.743652f, 0.617676f, 0.759277f, 0.614746f, + 0.773438f, 0.612305f, 0.784180f, 0.610840f, 0.796875f, 0.608887f, 0.806152f, 0.607422f, + 0.815430f, 0.605469f, 0.824219f, 0.604004f, 0.831543f, 0.602051f, 0.839355f, 0.600586f, + 0.845703f, 0.598633f, 0.851074f, 0.596680f, 0.857422f, 0.594238f, 0.864258f, 0.592285f, + 0.868652f, 0.589844f, 0.874512f, 0.587402f, 0.878906f, 0.584961f, 0.883301f, 0.582031f, + 0.887207f, 0.579590f, 0.891602f, 0.576660f, 0.895508f, 0.573730f, 0.899414f, 0.570801f, + 0.902832f, 0.567383f, 0.905273f, 0.563965f, 0.908691f, 0.560547f, 0.912109f, 0.557129f, + 0.914551f, 0.553223f, 0.917480f, 0.549316f, 0.919922f, 0.545410f, 0.922363f, 0.541016f, + 0.924805f, 0.536621f, 0.927734f, 0.532227f, 0.929688f, 0.527344f, 0.932617f, 0.522461f, + 0.934570f, 0.517090f, 0.936035f, 0.511719f, 0.939941f, 0.505859f, 0.940918f, 0.500000f, + 0.942871f, 0.493896f, 0.945312f, 0.487061f, 0.946777f, 0.480225f, 0.948730f, 0.472900f, + 0.949707f, 0.464844f, 0.951660f, 0.456543f, 0.953125f, 0.447510f, 0.956543f, 0.437744f, + 0.957520f, 0.427246f, 0.958496f, 0.416016f, 0.960449f, 0.403564f, 0.961914f, 0.389648f, + 0.963867f, 0.374268f, 0.965820f, 0.356689f, 0.966797f, 0.336426f, 0.968750f, 0.312500f, + 0.971191f, 0.282471f, 0.973633f, 0.242798f, 0.975098f, 0.183105f, 0.976562f, 0.067505f, + 0.000000f, 1.000000f, 0.776367f, 0.615723f, 0.843262f, 0.534180f, 0.880859f, 0.493896f, + 0.903320f, 0.469971f, 0.918945f, 0.454102f, 0.929199f, 0.442627f, 0.938965f, 0.433838f, + 0.945312f, 0.427002f, 0.950195f, 0.421143f, 0.956055f, 0.416016f, 0.959961f, 0.411377f, + 0.963379f, 0.407227f, 0.965820f, 0.403320f, 0.968262f, 0.399658f, 0.970215f, 0.396240f, + 0.971680f, 0.392822f, 0.974121f, 0.389160f, 0.975586f, 0.385986f, 0.977051f, 0.382324f, + 0.978027f, 0.378906f, 0.979980f, 0.375488f, 0.980469f, 0.372070f, 0.981934f, 0.368408f, + 0.982422f, 0.364990f, 0.982910f, 0.361328f, 0.983887f, 0.357666f, 0.984375f, 0.353760f, + 0.985840f, 0.349854f, 0.986328f, 0.345703f, 0.986816f, 0.341553f, 0.987305f, 0.337402f, + 0.987793f, 0.333252f, 0.987793f, 0.328857f, 0.988281f, 0.324463f, 0.989258f, 0.319824f, + 0.989746f, 0.314941f, 0.990723f, 0.309814f, 0.990723f, 0.304688f, 0.991211f, 0.299561f, + 0.991211f, 0.294189f, 0.991211f, 0.288574f, 0.991699f, 0.282715f, 0.991699f, 0.276611f, + 0.991699f, 0.270508f, 0.992676f, 0.263916f, 0.992676f, 0.257080f, 0.993164f, 0.250000f, + 0.993652f, 0.242432f, 0.994629f, 0.234497f, 0.994629f, 0.226196f, 0.994629f, 0.217529f, + 0.995117f, 0.208130f, 0.995117f, 0.198242f, 0.995117f, 0.187744f, 0.995117f, 0.176392f, + 0.995605f, 0.164062f, 0.995605f, 0.150391f, 0.995605f, 0.135376f, 0.995605f, 0.118469f, + 0.996094f, 0.098755f, 0.996094f, 0.075256f, 0.996582f, 0.045105f, 0.997070f, 0.007687f, + 0.000000f, 1.000000f, 0.871582f, 0.576172f, 0.923340f, 0.484863f, 0.945801f, 0.438477f, + 0.958008f, 0.409668f, 0.965820f, 0.389648f, 0.970703f, 0.374756f, 0.974609f, 0.363037f, + 0.977539f, 0.353271f, 0.980469f, 0.344971f, 0.982910f, 0.337646f, 0.983887f, 0.331543f, + 0.985840f, 0.325439f, 0.986816f, 0.320068f, 0.987793f, 0.315186f, 0.988281f, 0.310303f, + 0.989746f, 0.305908f, 0.990234f, 0.301270f, 0.991211f, 0.296875f, 0.991211f, 0.292725f, + 0.991699f, 0.288818f, 0.991699f, 0.284668f, 0.992188f, 0.280762f, 0.993164f, 0.276611f, + 0.993652f, 0.272705f, 0.994141f, 0.268555f, 0.994629f, 0.264404f, 0.994629f, 0.260254f, + 0.995117f, 0.256104f, 0.995117f, 0.251953f, 0.995117f, 0.247925f, 0.995117f, 0.243774f, + 0.995117f, 0.239502f, 0.995605f, 0.235107f, 0.995605f, 0.230713f, 0.995605f, 0.226196f, + 0.995605f, 0.221680f, 0.996094f, 0.217041f, 0.996094f, 0.212280f, 0.996094f, 0.207397f, + 0.996094f, 0.202393f, 0.996582f, 0.197266f, 0.996582f, 0.192017f, 0.996582f, 0.186646f, + 0.997070f, 0.181030f, 0.997070f, 0.175293f, 0.997070f, 0.169312f, 0.997559f, 0.163208f, + 0.998047f, 0.156738f, 0.998047f, 0.150146f, 0.998535f, 0.143188f, 0.999512f, 0.135742f, + 0.999512f, 0.128174f, 0.999512f, 0.120239f, 0.999512f, 0.111877f, 0.999512f, 0.103088f, + 0.999512f, 0.093750f, 0.999512f, 0.083801f, 0.999512f, 0.072998f, 0.999512f, 0.061340f, + 0.999512f, 0.048401f, 0.999512f, 0.033936f, 0.999512f, 0.017349f, 0.999512f, 0.001410f, + 0.000000f, 1.000000f, 0.921387f, 0.562988f, 0.956543f, 0.467773f, 0.969727f, 0.417236f, + 0.977051f, 0.384277f, 0.981934f, 0.360352f, 0.984863f, 0.342285f, 0.986328f, 0.327637f, + 0.988281f, 0.315430f, 0.990234f, 0.304932f, 0.990723f, 0.295898f, 0.991699f, 0.287842f, + 0.992188f, 0.280518f, 0.992676f, 0.273926f, 0.994141f, 0.267334f, 0.994629f, 0.261475f, + 0.994629f, 0.256104f, 0.995117f, 0.250732f, 0.995117f, 0.245850f, 0.995117f, 0.240967f, + 0.995605f, 0.236328f, 0.995605f, 0.231812f, 0.995605f, 0.227295f, 0.996094f, 0.222900f, + 0.996094f, 0.218628f, 0.996094f, 0.214355f, 0.996582f, 0.210083f, 0.996582f, 0.205933f, + 0.997070f, 0.201660f, 0.997070f, 0.197510f, 0.997559f, 0.193237f, 0.997559f, 0.188965f, + 0.998047f, 0.184692f, 0.998535f, 0.180420f, 0.999023f, 0.176025f, 0.999512f, 0.171509f, + 0.999512f, 0.167114f, 0.999512f, 0.162598f, 0.999512f, 0.158203f, 0.999512f, 0.153687f, + 0.999512f, 0.149170f, 0.999512f, 0.144531f, 0.999512f, 0.139771f, 0.999512f, 0.135010f, + 0.999512f, 0.130127f, 0.999512f, 0.125122f, 0.999512f, 0.120117f, 0.999512f, 0.114929f, + 0.999512f, 0.109558f, 0.999512f, 0.104065f, 0.999512f, 0.098450f, 0.999512f, 0.092590f, + 0.999512f, 0.086609f, 0.999512f, 0.080383f, 0.999512f, 0.073914f, 0.999512f, 0.067139f, + 0.999512f, 0.060120f, 0.999512f, 0.052704f, 0.999512f, 0.044922f, 0.999512f, 0.036652f, + 0.999512f, 0.027878f, 0.999512f, 0.018494f, 0.999512f, 0.008583f, 0.999512f, 0.000521f, + 0.000000f, 1.000000f, 0.948730f, 0.560059f, 0.972656f, 0.462891f, 0.981445f, 0.408447f, + 0.985840f, 0.371826f, 0.988281f, 0.344971f, 0.990234f, 0.323975f, 0.991699f, 0.306885f, + 0.992676f, 0.292725f, 0.994629f, 0.280273f, 0.994629f, 0.269531f, 0.995117f, 0.260010f, + 0.995117f, 0.251465f, 0.995605f, 0.243774f, 0.995605f, 0.236572f, 0.996094f, 0.229858f, + 0.996094f, 0.223633f, 0.996582f, 0.217773f, 0.996582f, 0.212158f, 0.997070f, 0.206665f, + 0.997559f, 0.201538f, 0.997559f, 0.196411f, 0.998047f, 0.191528f, 0.999023f, 0.186646f, + 0.999512f, 0.181885f, 0.999512f, 0.177246f, 0.999512f, 0.172852f, 0.999512f, 0.168579f, + 0.999512f, 0.164307f, 0.999512f, 0.160034f, 0.999512f, 0.156006f, 0.999512f, 0.151855f, + 0.999512f, 0.147705f, 0.999512f, 0.143677f, 0.999512f, 0.139648f, 0.999512f, 0.135620f, + 0.999512f, 0.131592f, 0.999512f, 0.127563f, 0.999512f, 0.123474f, 0.999512f, 0.119446f, + 0.999512f, 0.115295f, 0.999512f, 0.111206f, 0.999512f, 0.106995f, 0.999512f, 0.102783f, + 0.999512f, 0.098511f, 0.999512f, 0.094238f, 0.999512f, 0.089844f, 0.999512f, 0.085388f, + 0.999512f, 0.080933f, 0.999512f, 0.076294f, 0.999512f, 0.071655f, 0.999512f, 0.066833f, + 0.999512f, 0.061951f, 0.999512f, 0.056946f, 0.999512f, 0.051819f, 0.999512f, 0.046509f, + 0.999512f, 0.041077f, 0.999512f, 0.035431f, 0.999512f, 0.029648f, 0.999512f, 0.023636f, + 0.999512f, 0.017441f, 0.999512f, 0.011086f, 0.999512f, 0.004772f, 0.999512f, 0.000236f, + 0.000000f, 1.000000f, 0.963867f, 0.562988f, 0.980957f, 0.462646f, 0.986816f, 0.405029f, + 0.990234f, 0.365234f, 0.992188f, 0.335938f, 0.994629f, 0.312256f, 0.994629f, 0.293213f, + 0.995117f, 0.277344f, 0.995605f, 0.263672f, 0.995605f, 0.251709f, 0.996094f, 0.241089f, + 0.996582f, 0.231567f, 0.997070f, 0.222778f, 0.997559f, 0.214722f, 0.998047f, 0.207153f, + 0.998535f, 0.200073f, 0.999512f, 0.193237f, 0.999512f, 0.187012f, 0.999512f, 0.181152f, + 0.999512f, 0.175659f, 0.999512f, 0.170410f, 0.999512f, 0.165283f, 0.999512f, 0.160400f, + 0.999512f, 0.155762f, 0.999512f, 0.151245f, 0.999512f, 0.146851f, 0.999512f, 0.142456f, + 0.999512f, 0.138306f, 0.999512f, 0.134155f, 0.999512f, 0.130127f, 0.999512f, 0.126099f, + 0.999512f, 0.122192f, 0.999512f, 0.118347f, 0.999512f, 0.114502f, 0.999512f, 0.110657f, + 0.999512f, 0.106873f, 0.999512f, 0.103149f, 0.999512f, 0.099365f, 0.999512f, 0.095642f, + 0.999512f, 0.091919f, 0.999512f, 0.088196f, 0.999512f, 0.084473f, 0.999512f, 0.080750f, + 0.999512f, 0.076965f, 0.999512f, 0.073181f, 0.999512f, 0.069397f, 0.999512f, 0.065613f, + 0.999512f, 0.061768f, 0.999512f, 0.057892f, 0.999512f, 0.053955f, 0.999512f, 0.049988f, + 0.999512f, 0.045959f, 0.999512f, 0.041870f, 0.999512f, 0.037720f, 0.999512f, 0.033508f, + 0.999512f, 0.029251f, 0.999512f, 0.024902f, 0.999512f, 0.020493f, 0.999512f, 0.016022f, + 0.999512f, 0.011520f, 0.999512f, 0.007065f, 0.999512f, 0.002867f, 0.999512f, 0.000121f, + 0.000000f, 1.000000f, 0.973145f, 0.566406f, 0.986328f, 0.463867f, 0.990723f, 0.403564f, + 0.992676f, 0.361816f, 0.994629f, 0.329590f, 0.995117f, 0.304688f, 0.995605f, 0.284180f, + 0.996094f, 0.266846f, 0.996582f, 0.251709f, 0.997070f, 0.238647f, 0.998047f, 0.226807f, + 0.999512f, 0.215942f, 0.999512f, 0.206177f, 0.999512f, 0.197510f, 0.999512f, 0.189453f, + 0.999512f, 0.182129f, 0.999512f, 0.175171f, 0.999512f, 0.168823f, 0.999512f, 0.162720f, + 0.999512f, 0.156982f, 0.999512f, 0.151489f, 0.999512f, 0.146240f, 0.999512f, 0.141357f, + 0.999512f, 0.136475f, 0.999512f, 0.131958f, 0.999512f, 0.127441f, 0.999512f, 0.123169f, + 0.999512f, 0.119019f, 0.999512f, 0.114929f, 0.999512f, 0.110962f, 0.999512f, 0.107056f, + 0.999512f, 0.103271f, 0.999512f, 0.099548f, 0.999512f, 0.095886f, 0.999512f, 0.092285f, + 0.999512f, 0.088745f, 0.999512f, 0.085266f, 0.999512f, 0.081787f, 0.999512f, 0.078369f, + 0.999512f, 0.074951f, 0.999512f, 0.071533f, 0.999512f, 0.068176f, 0.999512f, 0.064880f, + 0.999512f, 0.061554f, 0.999512f, 0.058228f, 0.999512f, 0.054932f, 0.999512f, 0.051605f, + 0.999512f, 0.048309f, 0.999512f, 0.044983f, 0.999512f, 0.041656f, 0.999512f, 0.038330f, + 0.999512f, 0.034973f, 0.999512f, 0.031616f, 0.999512f, 0.028259f, 0.999512f, 0.024872f, + 0.999512f, 0.021469f, 0.999512f, 0.018051f, 0.999512f, 0.014641f, 0.999512f, 0.011253f, + 0.999512f, 0.007919f, 0.999512f, 0.004711f, 0.999512f, 0.001818f, 0.999512f, 0.000068f, + 0.000000f, 1.000000f, 0.979492f, 0.570801f, 0.989746f, 0.466064f, 0.993164f, 0.403564f, + 0.994629f, 0.359375f, 0.995605f, 0.325928f, 0.996094f, 0.299316f, 0.996582f, 0.277344f, + 0.997559f, 0.258545f, 0.999023f, 0.242188f, 0.999512f, 0.227783f, 0.999512f, 0.215332f, + 0.999512f, 0.204102f, 0.999512f, 0.194092f, 0.999512f, 0.184937f, 0.999512f, 0.176514f, + 0.999512f, 0.168823f, 0.999512f, 0.161621f, 0.999512f, 0.154785f, 0.999512f, 0.148560f, + 0.999512f, 0.142578f, 0.999512f, 0.136963f, 0.999512f, 0.131592f, 0.999512f, 0.126587f, + 0.999512f, 0.121704f, 0.999512f, 0.117065f, 0.999512f, 0.112610f, 0.999512f, 0.108337f, + 0.999512f, 0.104187f, 0.999512f, 0.100159f, 0.999512f, 0.096252f, 0.999512f, 0.092468f, + 0.999512f, 0.088806f, 0.999512f, 0.085266f, 0.999512f, 0.081726f, 0.999512f, 0.078308f, + 0.999512f, 0.075012f, 0.999512f, 0.071716f, 0.999512f, 0.068481f, 0.999512f, 0.065308f, + 0.999512f, 0.062225f, 0.999512f, 0.059143f, 0.999512f, 0.056091f, 0.999512f, 0.053101f, + 0.999512f, 0.050140f, 0.999512f, 0.047180f, 0.999512f, 0.044281f, 0.999512f, 0.041382f, + 0.999512f, 0.038513f, 0.999512f, 0.035645f, 0.999512f, 0.032806f, 0.999512f, 0.029999f, + 0.999512f, 0.027191f, 0.999512f, 0.024399f, 0.999512f, 0.021622f, 0.999512f, 0.018860f, + 0.999512f, 0.016113f, 0.999512f, 0.013412f, 0.999512f, 0.010742f, 0.999512f, 0.008125f, + 0.999512f, 0.005608f, 0.999512f, 0.003248f, 0.999512f, 0.001202f, 0.999512f, 0.000041f, + 0.000000f, 1.000000f, 0.984375f, 0.574707f, 0.991211f, 0.468750f, 0.994629f, 0.403564f, + 0.995605f, 0.358154f, 0.996582f, 0.323242f, 0.997559f, 0.295166f, 0.999023f, 0.271484f, + 0.999512f, 0.251465f, 0.999512f, 0.234741f, 0.999512f, 0.219971f, 0.999512f, 0.206909f, + 0.999512f, 0.195312f, 0.999512f, 0.184692f, 0.999512f, 0.175171f, 0.999512f, 0.166382f, + 0.999512f, 0.158325f, 0.999512f, 0.150879f, 0.999512f, 0.143799f, 0.999512f, 0.137329f, + 0.999512f, 0.131226f, 0.999512f, 0.125488f, 0.999512f, 0.120056f, 0.999512f, 0.114929f, + 0.999512f, 0.109985f, 0.999512f, 0.105347f, 0.999512f, 0.100891f, 0.999512f, 0.096619f, + 0.999512f, 0.092529f, 0.999512f, 0.088562f, 0.999512f, 0.084778f, 0.999512f, 0.081055f, + 0.999512f, 0.077515f, 0.999512f, 0.074097f, 0.999512f, 0.070740f, 0.999512f, 0.067505f, + 0.999512f, 0.064331f, 0.999512f, 0.061249f, 0.999512f, 0.058258f, 0.999512f, 0.055298f, + 0.999512f, 0.052429f, 0.999512f, 0.049622f, 0.999512f, 0.046844f, 0.999512f, 0.044128f, + 0.999512f, 0.041443f, 0.999512f, 0.038818f, 0.999512f, 0.036255f, 0.999512f, 0.033691f, + 0.999512f, 0.031204f, 0.999512f, 0.028717f, 0.999512f, 0.026276f, 0.999512f, 0.023865f, + 0.999512f, 0.021500f, 0.999512f, 0.019150f, 0.999512f, 0.016846f, 0.999512f, 0.014572f, + 0.999512f, 0.012344f, 0.999512f, 0.010162f, 0.999512f, 0.008041f, 0.999512f, 0.006001f, + 0.999512f, 0.004066f, 0.999512f, 0.002302f, 0.999512f, 0.000821f, 0.999512f, 0.000026f, + 0.000000f, 1.000000f, 0.986328f, 0.578613f, 0.994141f, 0.470215f, 0.995117f, 0.404541f, + 0.996582f, 0.357422f, 0.997559f, 0.321045f, 0.999512f, 0.291016f, 0.999512f, 0.267090f, + 0.999512f, 0.246826f, 0.999512f, 0.229248f, 0.999512f, 0.213867f, 0.999512f, 0.200317f, + 0.999512f, 0.188232f, 0.999512f, 0.177246f, 0.999512f, 0.167358f, 0.999512f, 0.158203f, + 0.999512f, 0.149902f, 0.999512f, 0.142212f, 0.999512f, 0.135010f, 0.999512f, 0.128296f, + 0.999512f, 0.122131f, 0.999512f, 0.116272f, 0.999512f, 0.110718f, 0.999512f, 0.105530f, + 0.999512f, 0.100586f, 0.999512f, 0.095947f, 0.999512f, 0.091492f, 0.999512f, 0.087219f, + 0.999512f, 0.083191f, 0.999512f, 0.079285f, 0.999512f, 0.075562f, 0.999512f, 0.072021f, + 0.999512f, 0.068542f, 0.999512f, 0.065247f, 0.999512f, 0.062042f, 0.999512f, 0.058929f, + 0.999512f, 0.055939f, 0.999512f, 0.053009f, 0.999512f, 0.050201f, 0.999512f, 0.047455f, + 0.999512f, 0.044769f, 0.999512f, 0.042175f, 0.999512f, 0.039642f, 0.999512f, 0.037170f, + 0.999512f, 0.034760f, 0.999512f, 0.032410f, 0.999512f, 0.030090f, 0.999512f, 0.027832f, + 0.999512f, 0.025635f, 0.999512f, 0.023468f, 0.999512f, 0.021347f, 0.999512f, 0.019272f, + 0.999512f, 0.017242f, 0.999512f, 0.015259f, 0.999512f, 0.013329f, 0.999512f, 0.011436f, + 0.999512f, 0.009605f, 0.999512f, 0.007828f, 0.999512f, 0.006130f, 0.999512f, 0.004513f, + 0.999512f, 0.003012f, 0.999512f, 0.001669f, 0.999512f, 0.000576f, 0.999512f, 0.000017f, + 0.000000f, 1.000000f, 0.989746f, 0.581543f, 0.994629f, 0.472656f, 0.996094f, 0.405273f, + 0.997559f, 0.356689f, 0.999512f, 0.318604f, 0.999512f, 0.288574f, 0.999512f, 0.263916f, + 0.999512f, 0.243042f, 0.999512f, 0.224854f, 0.999512f, 0.208984f, 0.999512f, 0.194946f, + 0.999512f, 0.182495f, 0.999512f, 0.171143f, 0.999512f, 0.160889f, 0.999512f, 0.151611f, + 0.999512f, 0.142944f, 0.999512f, 0.135132f, 0.999512f, 0.127808f, 0.999512f, 0.120972f, + 0.999512f, 0.114624f, 0.999512f, 0.108704f, 0.999512f, 0.103149f, 0.999512f, 0.097900f, + 0.999512f, 0.092957f, 0.999512f, 0.088257f, 0.999512f, 0.083862f, 0.999512f, 0.079651f, + 0.999512f, 0.075623f, 0.999512f, 0.071777f, 0.999512f, 0.068176f, 0.999512f, 0.064636f, + 0.999512f, 0.061310f, 0.999512f, 0.058105f, 0.999512f, 0.055023f, 0.999512f, 0.052063f, + 0.999512f, 0.049194f, 0.999512f, 0.046448f, 0.999512f, 0.043793f, 0.999512f, 0.041199f, + 0.999512f, 0.038727f, 0.999512f, 0.036316f, 0.999512f, 0.033966f, 0.999512f, 0.031708f, + 0.999512f, 0.029510f, 0.999512f, 0.027374f, 0.999512f, 0.025299f, 0.999512f, 0.023285f, + 0.999512f, 0.021317f, 0.999512f, 0.019409f, 0.999512f, 0.017563f, 0.999512f, 0.015762f, + 0.999512f, 0.014015f, 0.999512f, 0.012321f, 0.999512f, 0.010681f, 0.999512f, 0.009102f, + 0.999512f, 0.007580f, 0.999512f, 0.006123f, 0.999512f, 0.004742f, 0.999512f, 0.003450f, + 0.999512f, 0.002268f, 0.999512f, 0.001232f, 0.999512f, 0.000413f, 0.999512f, 0.000011f, + 0.000000f, 1.000000f, 0.990723f, 0.584961f, 0.995117f, 0.474854f, 0.997070f, 0.406006f, + 0.999512f, 0.355469f, 0.999512f, 0.317383f, 0.999512f, 0.286865f, 0.999512f, 0.261475f, + 0.999512f, 0.239990f, 0.999512f, 0.221313f, 0.999512f, 0.205078f, 0.999512f, 0.190552f, + 0.999512f, 0.177734f, 0.999512f, 0.166138f, 0.999512f, 0.155640f, 0.999512f, 0.146118f, + 0.999512f, 0.137329f, 0.999512f, 0.129272f, 0.999512f, 0.121826f, 0.999512f, 0.114929f, + 0.999512f, 0.108521f, 0.999512f, 0.102478f, 0.999512f, 0.096863f, 0.999512f, 0.091614f, + 0.999512f, 0.086670f, 0.999512f, 0.081970f, 0.999512f, 0.077576f, 0.999512f, 0.073425f, + 0.999512f, 0.069458f, 0.999512f, 0.065674f, 0.999512f, 0.062103f, 0.999512f, 0.058685f, + 0.999512f, 0.055450f, 0.999512f, 0.052338f, 0.999512f, 0.049347f, 0.999512f, 0.046509f, + 0.999512f, 0.043762f, 0.999512f, 0.041138f, 0.999512f, 0.038605f, 0.999512f, 0.036194f, + 0.999512f, 0.033844f, 0.999512f, 0.031616f, 0.999512f, 0.029449f, 0.999512f, 0.027359f, + 0.999512f, 0.025345f, 0.999512f, 0.023392f, 0.999512f, 0.021515f, 0.999512f, 0.019699f, + 0.999512f, 0.017944f, 0.999512f, 0.016251f, 0.999512f, 0.014626f, 0.999512f, 0.013046f, + 0.999512f, 0.011528f, 0.999512f, 0.010071f, 0.999512f, 0.008667f, 0.999512f, 0.007332f, + 0.999512f, 0.006058f, 0.999512f, 0.004848f, 0.999512f, 0.003717f, 0.999512f, 0.002674f, + 0.999512f, 0.001734f, 0.999512f, 0.000925f, 0.999512f, 0.000302f, 0.999512f, 0.000008f, + 0.000000f, 1.000000f, 0.992676f, 0.587402f, 0.995605f, 0.476562f, 0.998535f, 0.406006f, + 0.999512f, 0.355469f, 0.999512f, 0.316650f, 0.999512f, 0.285400f, 0.999512f, 0.259521f, + 0.999512f, 0.237427f, 0.999512f, 0.218384f, 0.999512f, 0.201660f, 0.999512f, 0.186890f, + 0.999512f, 0.173828f, 0.999512f, 0.161987f, 0.999512f, 0.151245f, 0.999512f, 0.141479f, + 0.999512f, 0.132568f, 0.999512f, 0.124390f, 0.999512f, 0.116882f, 0.999512f, 0.109863f, + 0.999512f, 0.103394f, 0.999512f, 0.097351f, 0.999512f, 0.091675f, 0.999512f, 0.086426f, + 0.999512f, 0.081421f, 0.999512f, 0.076782f, 0.999512f, 0.072388f, 0.999512f, 0.068237f, + 0.999512f, 0.064331f, 0.999512f, 0.060638f, 0.999512f, 0.057129f, 0.999512f, 0.053772f, + 0.999512f, 0.050598f, 0.999512f, 0.047577f, 0.999512f, 0.044708f, 0.999512f, 0.041962f, + 0.999512f, 0.039337f, 0.999512f, 0.036835f, 0.999512f, 0.034424f, 0.999512f, 0.032135f, + 0.999512f, 0.029938f, 0.999512f, 0.027832f, 0.999512f, 0.025803f, 0.999512f, 0.023865f, + 0.999512f, 0.022003f, 0.999512f, 0.020218f, 0.999512f, 0.018509f, 0.999512f, 0.016861f, + 0.999512f, 0.015282f, 0.999512f, 0.013771f, 0.999512f, 0.012314f, 0.999512f, 0.010925f, + 0.999512f, 0.009598f, 0.999512f, 0.008331f, 0.999512f, 0.007122f, 0.999512f, 0.005978f, + 0.999512f, 0.004898f, 0.999512f, 0.003889f, 0.999512f, 0.002953f, 0.999512f, 0.002100f, + 0.999512f, 0.001343f, 0.999512f, 0.000705f, 0.999512f, 0.000224f, 0.999512f, 0.000006f, + 0.000000f, 1.000000f, 0.994141f, 0.589355f, 0.996582f, 0.477783f, 0.999512f, 0.406250f, + 0.999512f, 0.355469f, 0.999512f, 0.316162f, 0.999512f, 0.284424f, 0.999512f, 0.257812f, + 0.999512f, 0.235352f, 0.999512f, 0.215942f, 0.999512f, 0.198975f, 0.999512f, 0.183838f, + 0.999512f, 0.170532f, 0.999512f, 0.158447f, 0.999512f, 0.147583f, 0.999512f, 0.137695f, + 0.999512f, 0.128540f, 0.999512f, 0.120300f, 0.999512f, 0.112671f, 0.999512f, 0.105652f, + 0.999512f, 0.099060f, 0.999512f, 0.093018f, 0.999512f, 0.087341f, 0.999512f, 0.082031f, + 0.999512f, 0.077087f, 0.999512f, 0.072449f, 0.999512f, 0.068054f, 0.999512f, 0.063965f, + 0.999512f, 0.060120f, 0.999512f, 0.056458f, 0.999512f, 0.052979f, 0.999512f, 0.049713f, + 0.999512f, 0.046600f, 0.999512f, 0.043671f, 0.999512f, 0.040863f, 0.999512f, 0.038208f, + 0.999512f, 0.035706f, 0.999512f, 0.033295f, 0.999512f, 0.031006f, 0.999512f, 0.028824f, + 0.999512f, 0.026733f, 0.999512f, 0.024750f, 0.999512f, 0.022858f, 0.999512f, 0.021042f, + 0.999512f, 0.019318f, 0.999512f, 0.017670f, 0.999512f, 0.016098f, 0.999512f, 0.014595f, + 0.999512f, 0.013161f, 0.999512f, 0.011795f, 0.999512f, 0.010490f, 0.999512f, 0.009254f, + 0.999512f, 0.008080f, 0.999512f, 0.006966f, 0.999512f, 0.005917f, 0.999512f, 0.004932f, + 0.999512f, 0.004009f, 0.999512f, 0.003155f, 0.999512f, 0.002373f, 0.999512f, 0.001669f, + 0.999512f, 0.001054f, 0.999512f, 0.000544f, 0.999512f, 0.000169f, 0.999512f, 0.000004f, + 0.000000f, 1.000000f, 0.994629f, 0.591309f, 0.997559f, 0.478760f, 0.999512f, 0.406982f, + 0.999512f, 0.355713f, 0.999512f, 0.315674f, 0.999512f, 0.283447f, 0.999512f, 0.256592f, + 0.999512f, 0.233643f, 0.999512f, 0.213867f, 0.999512f, 0.196533f, 0.999512f, 0.181274f, + 0.999512f, 0.167725f, 0.999512f, 0.155518f, 0.999512f, 0.144409f, 0.999512f, 0.134399f, + 0.999512f, 0.125244f, 0.999512f, 0.116882f, 0.999512f, 0.109192f, 0.999512f, 0.102051f, + 0.999512f, 0.095459f, 0.999512f, 0.089355f, 0.999512f, 0.083679f, 0.999512f, 0.078369f, + 0.999512f, 0.073425f, 0.999512f, 0.068787f, 0.999512f, 0.064453f, 0.999512f, 0.060394f, + 0.999512f, 0.056580f, 0.999512f, 0.052948f, 0.999512f, 0.049561f, 0.999512f, 0.046326f, + 0.999512f, 0.043304f, 0.999512f, 0.040436f, 0.999512f, 0.037720f, 0.999512f, 0.035126f, + 0.999512f, 0.032684f, 0.999512f, 0.030380f, 0.999512f, 0.028183f, 0.999512f, 0.026108f, + 0.999512f, 0.024124f, 0.999512f, 0.022232f, 0.999512f, 0.020447f, 0.999512f, 0.018753f, + 0.999512f, 0.017136f, 0.999512f, 0.015602f, 0.999512f, 0.014145f, 0.999512f, 0.012764f, + 0.999512f, 0.011452f, 0.999512f, 0.010208f, 0.999512f, 0.009033f, 0.999512f, 0.007919f, + 0.999512f, 0.006878f, 0.999512f, 0.005894f, 0.999512f, 0.004971f, 0.999512f, 0.004112f, + 0.999512f, 0.003319f, 0.999512f, 0.002590f, 0.999512f, 0.001930f, 0.999512f, 0.001343f, + 0.999512f, 0.000838f, 0.999512f, 0.000426f, 0.999512f, 0.000129f, 0.999512f, 0.000003f, + 0.000000f, 1.000000f, 0.995117f, 0.593262f, 0.999512f, 0.479004f, 0.999512f, 0.407715f, + 0.999512f, 0.355713f, 0.999512f, 0.315430f, 0.999512f, 0.282715f, 0.999512f, 0.255371f, + 0.999512f, 0.232178f, 0.999512f, 0.212158f, 0.999512f, 0.194580f, 0.999512f, 0.179077f, + 0.999512f, 0.165283f, 0.999512f, 0.152954f, 0.999512f, 0.141846f, 0.999512f, 0.131714f, + 0.999512f, 0.122437f, 0.999512f, 0.114014f, 0.999512f, 0.106201f, 0.999512f, 0.099060f, + 0.999512f, 0.092468f, 0.999512f, 0.086304f, 0.999512f, 0.080627f, 0.999512f, 0.075317f, + 0.999512f, 0.070374f, 0.999512f, 0.065735f, 0.999512f, 0.061462f, 0.999512f, 0.057404f, + 0.999512f, 0.053619f, 0.999512f, 0.050049f, 0.999512f, 0.046692f, 0.999512f, 0.043518f, + 0.999512f, 0.040558f, 0.999512f, 0.037750f, 0.999512f, 0.035095f, 0.999512f, 0.032593f, + 0.999512f, 0.030228f, 0.999512f, 0.027985f, 0.999512f, 0.025864f, 0.999512f, 0.023865f, + 0.999512f, 0.021973f, 0.999512f, 0.020172f, 0.999512f, 0.018478f, 0.999512f, 0.016876f, + 0.999512f, 0.015358f, 0.999512f, 0.013924f, 0.999512f, 0.012566f, 0.999512f, 0.011284f, + 0.999512f, 0.010078f, 0.999512f, 0.008934f, 0.999512f, 0.007866f, 0.999512f, 0.006863f, + 0.999512f, 0.005920f, 0.999512f, 0.005043f, 0.999512f, 0.004227f, 0.999512f, 0.003473f, + 0.999512f, 0.002781f, 0.999512f, 0.002151f, 0.999512f, 0.001589f, 0.999512f, 0.001094f, + 0.999512f, 0.000674f, 0.999512f, 0.000337f, 0.999512f, 0.000100f, 0.999512f, 0.000002f, + 0.000000f, 1.000000f, 0.995605f, 0.594727f, 0.999512f, 0.480225f, 0.999512f, 0.408447f, + 0.999512f, 0.355957f, 0.999512f, 0.315186f, 0.999512f, 0.281982f, 0.999512f, 0.254395f, + 0.999512f, 0.230957f, 0.999512f, 0.210693f, 0.999512f, 0.192993f, 0.999512f, 0.177246f, + 0.999512f, 0.163330f, 0.999512f, 0.150879f, 0.999512f, 0.139526f, 0.999512f, 0.129395f, + 0.999512f, 0.120056f, 0.999512f, 0.111511f, 0.999512f, 0.103699f, 0.999512f, 0.096497f, + 0.999512f, 0.089905f, 0.999512f, 0.083740f, 0.999512f, 0.078003f, 0.999512f, 0.072754f, + 0.999512f, 0.067810f, 0.999512f, 0.063171f, 0.999512f, 0.058929f, 0.999512f, 0.054901f, + 0.999512f, 0.051117f, 0.999512f, 0.047607f, 0.999512f, 0.044281f, 0.999512f, 0.041168f, + 0.999512f, 0.038239f, 0.999512f, 0.035492f, 0.999512f, 0.032898f, 0.999512f, 0.030457f, + 0.999512f, 0.028168f, 0.999512f, 0.025986f, 0.999512f, 0.023941f, 0.999512f, 0.022018f, + 0.999512f, 0.020203f, 0.999512f, 0.018478f, 0.999512f, 0.016861f, 0.999512f, 0.015343f, + 0.999512f, 0.013908f, 0.999512f, 0.012550f, 0.999512f, 0.011284f, 0.999512f, 0.010086f, + 0.999512f, 0.008965f, 0.999512f, 0.007912f, 0.999512f, 0.006927f, 0.999512f, 0.006012f, + 0.999512f, 0.005157f, 0.999512f, 0.004364f, 0.999512f, 0.003637f, 0.999512f, 0.002968f, + 0.999512f, 0.002357f, 0.999512f, 0.001810f, 0.999512f, 0.001324f, 0.999512f, 0.000903f, + 0.999512f, 0.000549f, 0.999512f, 0.000271f, 0.999512f, 0.000079f, 0.999512f, 0.000002f, + 0.000000f, 1.000000f, 0.996094f, 0.596191f, 0.999512f, 0.481201f, 0.999512f, 0.408936f, + 0.999512f, 0.355957f, 0.999512f, 0.314941f, 0.999512f, 0.281494f, 0.999512f, 0.253662f, + 0.999512f, 0.229858f, 0.999512f, 0.209473f, 0.999512f, 0.191528f, 0.999512f, 0.175781f, + 0.999512f, 0.161621f, 0.999512f, 0.149048f, 0.999512f, 0.137695f, 0.999512f, 0.127319f, + 0.999512f, 0.118042f, 0.999512f, 0.109436f, 0.999512f, 0.101562f, 0.999512f, 0.094360f, + 0.999512f, 0.087708f, 0.999512f, 0.081543f, 0.999512f, 0.075867f, 0.999512f, 0.070557f, + 0.999512f, 0.065613f, 0.999512f, 0.061066f, 0.999512f, 0.056763f, 0.999512f, 0.052795f, + 0.999512f, 0.049042f, 0.999512f, 0.045563f, 0.999512f, 0.042267f, 0.999512f, 0.039215f, + 0.999512f, 0.036316f, 0.999512f, 0.033630f, 0.999512f, 0.031082f, 0.999512f, 0.028702f, + 0.999512f, 0.026459f, 0.999512f, 0.024338f, 0.999512f, 0.022354f, 0.999512f, 0.020493f, + 0.999512f, 0.018738f, 0.999512f, 0.017090f, 0.999512f, 0.015541f, 0.999512f, 0.014084f, + 0.999512f, 0.012718f, 0.999512f, 0.011436f, 0.999512f, 0.010231f, 0.999512f, 0.009109f, + 0.999512f, 0.008057f, 0.999512f, 0.007084f, 0.999512f, 0.006172f, 0.999512f, 0.005325f, + 0.999512f, 0.004543f, 0.999512f, 0.003826f, 0.999512f, 0.003166f, 0.999512f, 0.002565f, + 0.999512f, 0.002024f, 0.999512f, 0.001542f, 0.999512f, 0.001118f, 0.999512f, 0.000754f, + 0.999512f, 0.000453f, 0.999512f, 0.000220f, 0.999512f, 0.000063f, 0.999512f, 0.000001f, + 0.000000f, 1.000000f, 0.996582f, 0.597168f, 0.999512f, 0.482178f, 0.999512f, 0.409424f, + 0.999512f, 0.356201f, 0.999512f, 0.314697f, 0.999512f, 0.281006f, 0.999512f, 0.252930f, + 0.999512f, 0.229004f, 0.999512f, 0.208374f, 0.999512f, 0.190308f, 0.999512f, 0.174438f, + 0.999512f, 0.160156f, 0.999512f, 0.147461f, 0.999512f, 0.136108f, 0.999512f, 0.125732f, + 0.999512f, 0.116272f, 0.999512f, 0.107666f, 0.999512f, 0.099792f, 0.999512f, 0.092529f, + 0.999512f, 0.085876f, 0.999512f, 0.079712f, 0.999512f, 0.073975f, 0.999512f, 0.068726f, + 0.999512f, 0.063782f, 0.999512f, 0.059235f, 0.999512f, 0.054962f, 0.999512f, 0.050995f, + 0.999512f, 0.047302f, 0.999512f, 0.043823f, 0.999512f, 0.040588f, 0.999512f, 0.037567f, + 0.999512f, 0.034729f, 0.999512f, 0.032043f, 0.999512f, 0.029572f, 0.999512f, 0.027222f, + 0.999512f, 0.025024f, 0.999512f, 0.022964f, 0.999512f, 0.021042f, 0.999512f, 0.019226f, + 0.999512f, 0.017532f, 0.999512f, 0.015930f, 0.999512f, 0.014442f, 0.999512f, 0.013046f, + 0.999512f, 0.011742f, 0.999512f, 0.010521f, 0.999512f, 0.009377f, 0.999512f, 0.008316f, + 0.999512f, 0.007328f, 0.999512f, 0.006409f, 0.999512f, 0.005558f, 0.999512f, 0.004776f, + 0.999512f, 0.004051f, 0.999512f, 0.003393f, 0.999512f, 0.002790f, 0.999512f, 0.002247f, + 0.999512f, 0.001761f, 0.999512f, 0.001330f, 0.999512f, 0.000957f, 0.999512f, 0.000639f, + 0.999512f, 0.000380f, 0.999512f, 0.000182f, 0.999512f, 0.000051f, 0.999512f, 0.000001f, + 0.000000f, 1.000000f, 0.998047f, 0.597656f, 0.999512f, 0.482910f, 0.999512f, 0.409912f, + 0.999512f, 0.356201f, 0.999512f, 0.314453f, 0.999512f, 0.280518f, 0.999512f, 0.252197f, + 0.999512f, 0.228271f, 0.999512f, 0.207520f, 0.999512f, 0.189331f, 0.999512f, 0.173218f, + 0.999512f, 0.158936f, 0.999512f, 0.146240f, 0.999512f, 0.134644f, 0.999512f, 0.124329f, + 0.999512f, 0.114807f, 0.999512f, 0.106201f, 0.999512f, 0.098267f, 0.999512f, 0.091003f, + 0.999512f, 0.084290f, 0.999512f, 0.078125f, 0.999512f, 0.072449f, 0.999512f, 0.067139f, + 0.999512f, 0.062256f, 0.999512f, 0.057709f, 0.999512f, 0.053467f, 0.999512f, 0.049500f, + 0.999512f, 0.045837f, 0.999512f, 0.042389f, 0.999512f, 0.039185f, 0.999512f, 0.036194f, + 0.999512f, 0.033386f, 0.999512f, 0.030762f, 0.999512f, 0.028305f, 0.999512f, 0.026001f, + 0.999512f, 0.023849f, 0.999512f, 0.021835f, 0.999512f, 0.019943f, 0.999512f, 0.018188f, + 0.999512f, 0.016525f, 0.999512f, 0.014992f, 0.999512f, 0.013550f, 0.999512f, 0.012199f, + 0.999512f, 0.010941f, 0.999512f, 0.009773f, 0.999512f, 0.008682f, 0.999512f, 0.007671f, + 0.999512f, 0.006733f, 0.999512f, 0.005867f, 0.999512f, 0.005066f, 0.999512f, 0.004330f, + 0.999512f, 0.003658f, 0.999512f, 0.003046f, 0.999512f, 0.002493f, 0.999512f, 0.001995f, + 0.999512f, 0.001553f, 0.999512f, 0.001164f, 0.999512f, 0.000830f, 0.999512f, 0.000549f, + 0.999512f, 0.000323f, 0.999512f, 0.000152f, 0.999512f, 0.000042f, 0.999512f, 0.000001f, + 0.000000f, 1.000000f, 0.999512f, 0.597656f, 0.999512f, 0.483643f, 0.999512f, 0.410156f, + 0.999512f, 0.356445f, 0.999512f, 0.314453f, 0.999512f, 0.280273f, 0.999512f, 0.251709f, + 0.999512f, 0.227661f, 0.999512f, 0.206665f, 0.999512f, 0.188477f, 0.999512f, 0.172241f, + 0.999512f, 0.157959f, 0.999512f, 0.145142f, 0.999512f, 0.133545f, 0.999512f, 0.123108f, + 0.999512f, 0.113586f, 0.999512f, 0.104919f, 0.999512f, 0.096985f, 0.999512f, 0.089722f, + 0.999512f, 0.083008f, 0.999512f, 0.076843f, 0.999512f, 0.071106f, 0.999512f, 0.065857f, + 0.999512f, 0.060974f, 0.999512f, 0.056427f, 0.999512f, 0.052185f, 0.999512f, 0.048279f, + 0.999512f, 0.044617f, 0.999512f, 0.041199f, 0.999512f, 0.037994f, 0.999512f, 0.035034f, + 0.999512f, 0.032257f, 0.999512f, 0.029678f, 0.999512f, 0.027252f, 0.999512f, 0.024994f, + 0.999512f, 0.022873f, 0.999512f, 0.020889f, 0.999512f, 0.019043f, 0.999512f, 0.017319f, + 0.999512f, 0.015717f, 0.999512f, 0.014214f, 0.999512f, 0.012810f, 0.999512f, 0.011505f, + 0.999512f, 0.010292f, 0.999512f, 0.009163f, 0.999512f, 0.008110f, 0.999512f, 0.007145f, + 0.999512f, 0.006248f, 0.999512f, 0.005424f, 0.999512f, 0.004665f, 0.999512f, 0.003971f, + 0.999512f, 0.003342f, 0.999512f, 0.002769f, 0.999512f, 0.002254f, 0.999512f, 0.001794f, + 0.999512f, 0.001388f, 0.999512f, 0.001034f, 0.999512f, 0.000731f, 0.999512f, 0.000480f, + 0.999512f, 0.000279f, 0.999512f, 0.000130f, 0.999512f, 0.000035f, 0.999512f, 0.000001f, + 0.000000f, 1.000000f, 0.999512f, 0.598633f, 0.999512f, 0.484131f, 0.999512f, 0.410400f, + 0.999512f, 0.356445f, 0.999512f, 0.314209f, 0.999512f, 0.280029f, 0.999512f, 0.251465f, + 0.999512f, 0.227051f, 0.999512f, 0.206055f, 0.999512f, 0.187744f, 0.999512f, 0.171509f, + 0.999512f, 0.157104f, 0.999512f, 0.144165f, 0.999512f, 0.132568f, 0.999512f, 0.122070f, + 0.999512f, 0.112549f, 0.999512f, 0.103882f, 0.999512f, 0.095886f, 0.999512f, 0.088623f, + 0.999512f, 0.081909f, 0.999512f, 0.075745f, 0.999512f, 0.070007f, 0.999512f, 0.064758f, + 0.999512f, 0.059875f, 0.999512f, 0.055359f, 0.999512f, 0.051147f, 0.999512f, 0.047211f, + 0.999512f, 0.043579f, 0.999512f, 0.040192f, 0.999512f, 0.037018f, 0.999512f, 0.034088f, + 0.999512f, 0.031342f, 0.999512f, 0.028778f, 0.999512f, 0.026382f, 0.999512f, 0.024155f, + 0.999512f, 0.022064f, 0.999512f, 0.020126f, 0.999512f, 0.018311f, 0.999512f, 0.016617f, + 0.999512f, 0.015045f, 0.999512f, 0.013573f, 0.999512f, 0.012207f, 0.999512f, 0.010933f, + 0.999512f, 0.009758f, 0.999512f, 0.008659f, 0.999512f, 0.007652f, 0.999512f, 0.006718f, + 0.999512f, 0.005859f, 0.999512f, 0.005070f, 0.999512f, 0.004345f, 0.999512f, 0.003687f, + 0.999512f, 0.003088f, 0.999512f, 0.002548f, 0.999512f, 0.002064f, 0.999512f, 0.001635f, + 0.999512f, 0.001257f, 0.999512f, 0.000931f, 0.999512f, 0.000654f, 0.999512f, 0.000425f, + 0.999512f, 0.000245f, 0.999512f, 0.000113f, 0.999512f, 0.000030f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.599609f, 0.999512f, 0.484619f, 0.999512f, 0.410645f, + 0.999512f, 0.356445f, 0.999512f, 0.314209f, 0.999512f, 0.279785f, 0.999512f, 0.250977f, + 0.999512f, 0.226685f, 0.999512f, 0.205566f, 0.999512f, 0.187134f, 0.999512f, 0.170776f, + 0.999512f, 0.156372f, 0.999512f, 0.143433f, 0.999512f, 0.131714f, 0.999512f, 0.121216f, + 0.999512f, 0.111694f, 0.999512f, 0.102966f, 0.999512f, 0.094971f, 0.999512f, 0.087708f, + 0.999512f, 0.080994f, 0.999512f, 0.074829f, 0.999512f, 0.069092f, 0.999512f, 0.063843f, + 0.999512f, 0.058990f, 0.999512f, 0.054443f, 0.999512f, 0.050262f, 0.999512f, 0.046356f, + 0.999512f, 0.042725f, 0.999512f, 0.039368f, 0.999512f, 0.036224f, 0.999512f, 0.033295f, + 0.999512f, 0.030579f, 0.999512f, 0.028046f, 0.999512f, 0.025665f, 0.999512f, 0.023468f, + 0.999512f, 0.021408f, 0.999512f, 0.019485f, 0.999512f, 0.017700f, 0.999512f, 0.016037f, + 0.999512f, 0.014496f, 0.999512f, 0.013054f, 0.999512f, 0.011719f, 0.999512f, 0.010475f, + 0.999512f, 0.009323f, 0.999512f, 0.008263f, 0.999512f, 0.007282f, 0.999512f, 0.006378f, + 0.999512f, 0.005547f, 0.999512f, 0.004784f, 0.999512f, 0.004089f, 0.999512f, 0.003458f, + 0.999512f, 0.002886f, 0.999512f, 0.002373f, 0.999512f, 0.001914f, 0.999512f, 0.001509f, + 0.999512f, 0.001155f, 0.999512f, 0.000850f, 0.999512f, 0.000593f, 0.999512f, 0.000383f, + 0.999512f, 0.000219f, 0.999512f, 0.000100f, 0.999512f, 0.000026f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.600098f, 0.999512f, 0.485107f, 0.999512f, 0.410889f, + 0.999512f, 0.356689f, 0.999512f, 0.314209f, 0.999512f, 0.279541f, 0.999512f, 0.250732f, + 0.999512f, 0.226318f, 0.999512f, 0.205078f, 0.999512f, 0.186523f, 0.999512f, 0.170288f, + 0.999512f, 0.155762f, 0.999512f, 0.142700f, 0.999512f, 0.131104f, 0.999512f, 0.120544f, + 0.999512f, 0.110962f, 0.999512f, 0.102234f, 0.999512f, 0.094238f, 0.999512f, 0.086975f, + 0.999512f, 0.080261f, 0.999512f, 0.074036f, 0.999512f, 0.068359f, 0.999512f, 0.063110f, + 0.999512f, 0.058228f, 0.999512f, 0.053711f, 0.999512f, 0.049530f, 0.999512f, 0.045654f, + 0.999512f, 0.042053f, 0.999512f, 0.038696f, 0.999512f, 0.035553f, 0.999512f, 0.032654f, + 0.999512f, 0.029953f, 0.999512f, 0.027435f, 0.999512f, 0.025085f, 0.999512f, 0.022903f, + 0.999512f, 0.020874f, 0.999512f, 0.018967f, 0.999512f, 0.017212f, 0.999512f, 0.015572f, + 0.999512f, 0.014046f, 0.999512f, 0.012634f, 0.999512f, 0.011322f, 0.999512f, 0.010101f, + 0.999512f, 0.008980f, 0.999512f, 0.007935f, 0.999512f, 0.006981f, 0.999512f, 0.006104f, + 0.999512f, 0.005295f, 0.999512f, 0.004555f, 0.999512f, 0.003885f, 0.999512f, 0.003275f, + 0.999512f, 0.002726f, 0.999512f, 0.002234f, 0.999512f, 0.001796f, 0.999512f, 0.001410f, + 0.999512f, 0.001075f, 0.999512f, 0.000787f, 0.999512f, 0.000546f, 0.999512f, 0.000351f, + 0.999512f, 0.000199f, 0.999512f, 0.000089f, 0.999512f, 0.000023f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.600586f, 0.999512f, 0.485596f, 0.999512f, 0.411133f, + 0.999512f, 0.356689f, 0.999512f, 0.313965f, 0.999512f, 0.279541f, 0.999512f, 0.250488f, + 0.999512f, 0.225952f, 0.999512f, 0.204712f, 0.999512f, 0.186157f, 0.999512f, 0.169800f, + 0.999512f, 0.155273f, 0.999512f, 0.142212f, 0.999512f, 0.130493f, 0.999512f, 0.119995f, + 0.999512f, 0.110352f, 0.999512f, 0.101624f, 0.999512f, 0.093628f, 0.999512f, 0.086304f, + 0.999512f, 0.079590f, 0.999512f, 0.073425f, 0.999512f, 0.067749f, 0.999512f, 0.062500f, + 0.999512f, 0.057617f, 0.999512f, 0.053131f, 0.999512f, 0.048950f, 0.999512f, 0.045074f, + 0.999512f, 0.041473f, 0.999512f, 0.038147f, 0.999512f, 0.035034f, 0.999512f, 0.032135f, + 0.999512f, 0.029449f, 0.999512f, 0.026947f, 0.999512f, 0.024612f, 0.999512f, 0.022446f, + 0.999512f, 0.020432f, 0.999512f, 0.018555f, 0.999512f, 0.016815f, 0.999512f, 0.015198f, + 0.999512f, 0.013695f, 0.999512f, 0.012299f, 0.999512f, 0.011002f, 0.999512f, 0.009804f, + 0.999512f, 0.008698f, 0.999512f, 0.007683f, 0.999512f, 0.006744f, 0.999512f, 0.005882f, + 0.999512f, 0.005096f, 0.999512f, 0.004375f, 0.999512f, 0.003723f, 0.999512f, 0.003132f, + 0.999512f, 0.002600f, 0.999512f, 0.002125f, 0.999512f, 0.001703f, 0.999512f, 0.001333f, + 0.999512f, 0.001013f, 0.999512f, 0.000739f, 0.999512f, 0.000510f, 0.999512f, 0.000326f, + 0.999512f, 0.000183f, 0.999512f, 0.000082f, 0.999512f, 0.000021f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.601074f, 0.999512f, 0.485840f, 0.999512f, 0.411377f, + 0.999512f, 0.356689f, 0.999512f, 0.313965f, 0.999512f, 0.279297f, 0.999512f, 0.250244f, + 0.999512f, 0.225708f, 0.999512f, 0.204468f, 0.999512f, 0.185791f, 0.999512f, 0.169434f, + 0.999512f, 0.154785f, 0.999512f, 0.141846f, 0.999512f, 0.130005f, 0.999512f, 0.119507f, + 0.999512f, 0.109863f, 0.999512f, 0.101135f, 0.999512f, 0.093140f, 0.999512f, 0.085815f, + 0.999512f, 0.079102f, 0.999512f, 0.072937f, 0.999512f, 0.067261f, 0.999512f, 0.062012f, + 0.999512f, 0.057129f, 0.999512f, 0.052643f, 0.999512f, 0.048492f, 0.999512f, 0.044617f, + 0.999512f, 0.041016f, 0.999512f, 0.037689f, 0.999512f, 0.034607f, 0.999512f, 0.031708f, + 0.999512f, 0.029053f, 0.999512f, 0.026566f, 0.999512f, 0.024246f, 0.999512f, 0.022095f, + 0.999512f, 0.020096f, 0.999512f, 0.018234f, 0.999512f, 0.016495f, 0.999512f, 0.014900f, + 0.999512f, 0.013412f, 0.999512f, 0.012032f, 0.999512f, 0.010757f, 0.999512f, 0.009575f, + 0.999512f, 0.008484f, 0.999512f, 0.007481f, 0.999512f, 0.006561f, 0.999512f, 0.005714f, + 0.999512f, 0.004940f, 0.999512f, 0.004238f, 0.999512f, 0.003599f, 0.999512f, 0.003021f, + 0.999512f, 0.002504f, 0.999512f, 0.002041f, 0.999512f, 0.001633f, 0.999512f, 0.001274f, + 0.999512f, 0.000965f, 0.999512f, 0.000702f, 0.999512f, 0.000483f, 0.999512f, 0.000307f, + 0.999512f, 0.000172f, 0.999512f, 0.000076f, 0.999512f, 0.000019f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.601562f, 0.999512f, 0.486084f, 0.999512f, 0.411377f, + 0.999512f, 0.356689f, 0.999512f, 0.313965f, 0.999512f, 0.279297f, 0.999512f, 0.250244f, + 0.999512f, 0.225586f, 0.999512f, 0.204224f, 0.999512f, 0.185547f, 0.999512f, 0.169067f, + 0.999512f, 0.154541f, 0.999512f, 0.141479f, 0.999512f, 0.129761f, 0.999512f, 0.119141f, + 0.999512f, 0.109497f, 0.999512f, 0.100769f, 0.999512f, 0.092773f, 0.999512f, 0.085449f, + 0.999512f, 0.078735f, 0.999512f, 0.072571f, 0.999512f, 0.066833f, 0.999512f, 0.061615f, + 0.999512f, 0.056763f, 0.999512f, 0.052277f, 0.999512f, 0.048096f, 0.999512f, 0.044250f, + 0.999512f, 0.040680f, 0.999512f, 0.037354f, 0.999512f, 0.034271f, 0.999512f, 0.031403f, + 0.999512f, 0.028732f, 0.999512f, 0.026260f, 0.999512f, 0.023956f, 0.999512f, 0.021820f, + 0.999512f, 0.019821f, 0.999512f, 0.017975f, 0.999512f, 0.016251f, 0.999512f, 0.014671f, + 0.999512f, 0.013191f, 0.999512f, 0.011826f, 0.999512f, 0.010559f, 0.999512f, 0.009392f, + 0.999512f, 0.008316f, 0.999512f, 0.007328f, 0.999512f, 0.006416f, 0.999512f, 0.005585f, + 0.999512f, 0.004822f, 0.999512f, 0.004131f, 0.999512f, 0.003504f, 0.999512f, 0.002937f, + 0.999512f, 0.002430f, 0.999512f, 0.001978f, 0.999512f, 0.001579f, 0.999512f, 0.001230f, + 0.999512f, 0.000930f, 0.999512f, 0.000674f, 0.999512f, 0.000463f, 0.999512f, 0.000293f, + 0.999512f, 0.000163f, 0.999512f, 0.000072f, 0.999512f, 0.000018f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.601562f, 0.999512f, 0.486084f, 0.999512f, 0.411621f, + 0.999512f, 0.356689f, 0.999512f, 0.313965f, 0.999512f, 0.279053f, 0.999512f, 0.250000f, + 0.999512f, 0.225342f, 0.999512f, 0.203979f, 0.999512f, 0.185303f, 0.999512f, 0.168945f, + 0.999512f, 0.154297f, 0.999512f, 0.141235f, 0.999512f, 0.129395f, 0.999512f, 0.118835f, + 0.999512f, 0.109192f, 0.999512f, 0.100464f, 0.999512f, 0.092468f, 0.999512f, 0.085144f, + 0.999512f, 0.078430f, 0.999512f, 0.072266f, 0.999512f, 0.066528f, 0.999512f, 0.061310f, + 0.999512f, 0.056458f, 0.999512f, 0.051971f, 0.999512f, 0.047821f, 0.999512f, 0.043976f, + 0.999512f, 0.040405f, 0.999512f, 0.037079f, 0.999512f, 0.033997f, 0.999512f, 0.031158f, + 0.999512f, 0.028503f, 0.999512f, 0.026031f, 0.999512f, 0.023743f, 0.999512f, 0.021606f, + 0.999512f, 0.019623f, 0.999512f, 0.017776f, 0.999512f, 0.016083f, 0.999512f, 0.014496f, + 0.999512f, 0.013031f, 0.999512f, 0.011673f, 0.999512f, 0.010422f, 0.999512f, 0.009262f, + 0.999512f, 0.008194f, 0.999512f, 0.007214f, 0.999512f, 0.006313f, 0.999512f, 0.005489f, + 0.999512f, 0.004738f, 0.999512f, 0.004051f, 0.999512f, 0.003433f, 0.999512f, 0.002876f, + 0.999512f, 0.002377f, 0.999512f, 0.001932f, 0.999512f, 0.001540f, 0.999512f, 0.001198f, + 0.999512f, 0.000904f, 0.999512f, 0.000654f, 0.999512f, 0.000448f, 0.999512f, 0.000283f, + 0.999512f, 0.000157f, 0.999512f, 0.000069f, 0.999512f, 0.000017f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.602051f, 0.999512f, 0.486328f, 0.999512f, 0.411621f, + 0.999512f, 0.356934f, 0.999512f, 0.313965f, 0.999512f, 0.279053f, 0.999512f, 0.250000f, + 0.999512f, 0.225220f, 0.999512f, 0.203857f, 0.999512f, 0.185181f, 0.999512f, 0.168701f, + 0.999512f, 0.154053f, 0.999512f, 0.140991f, 0.999512f, 0.129272f, 0.999512f, 0.118652f, + 0.999512f, 0.109009f, 0.999512f, 0.100220f, 0.999512f, 0.092224f, 0.999512f, 0.084900f, + 0.999512f, 0.078186f, 0.999512f, 0.072021f, 0.999512f, 0.066345f, 0.999512f, 0.061096f, + 0.999512f, 0.056244f, 0.999512f, 0.051788f, 0.999512f, 0.047638f, 0.999512f, 0.043762f, + 0.999512f, 0.040222f, 0.999512f, 0.036896f, 0.999512f, 0.033813f, 0.999512f, 0.030975f, + 0.999512f, 0.028336f, 0.999512f, 0.025864f, 0.999512f, 0.023575f, 0.999512f, 0.021454f, + 0.999512f, 0.019485f, 0.999512f, 0.017639f, 0.999512f, 0.015945f, 0.999512f, 0.014374f, + 0.999512f, 0.012917f, 0.999512f, 0.011566f, 0.999512f, 0.010315f, 0.999512f, 0.009163f, + 0.999512f, 0.008102f, 0.999512f, 0.007133f, 0.999512f, 0.006237f, 0.999512f, 0.005421f, + 0.999512f, 0.004673f, 0.999512f, 0.003998f, 0.999512f, 0.003386f, 0.999512f, 0.002832f, + 0.999512f, 0.002338f, 0.999512f, 0.001900f, 0.999512f, 0.001513f, 0.999512f, 0.001176f, + 0.999512f, 0.000886f, 0.999512f, 0.000640f, 0.999512f, 0.000438f, 0.999512f, 0.000276f, + 0.999512f, 0.000153f, 0.999512f, 0.000067f, 0.999512f, 0.000017f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.602051f, 0.999512f, 0.486328f, 0.999512f, 0.411621f, + 0.999512f, 0.356934f, 0.999512f, 0.313965f, 0.999512f, 0.279053f, 0.999512f, 0.250000f, + 0.999512f, 0.225220f, 0.999512f, 0.203735f, 0.999512f, 0.185059f, 0.999512f, 0.168579f, + 0.999512f, 0.153931f, 0.999512f, 0.140869f, 0.999512f, 0.129150f, 0.999512f, 0.118530f, + 0.999512f, 0.108887f, 0.999512f, 0.100098f, 0.999512f, 0.092102f, 0.999512f, 0.084778f, + 0.999512f, 0.078064f, 0.999512f, 0.071899f, 0.999512f, 0.066162f, 0.999512f, 0.060974f, + 0.999512f, 0.056122f, 0.999512f, 0.051636f, 0.999512f, 0.047485f, 0.999512f, 0.043640f, + 0.999512f, 0.040070f, 0.999512f, 0.036774f, 0.999512f, 0.033691f, 0.999512f, 0.030869f, + 0.999512f, 0.028214f, 0.999512f, 0.025757f, 0.999512f, 0.023468f, 0.999512f, 0.021347f, + 0.999512f, 0.019379f, 0.999512f, 0.017548f, 0.999512f, 0.015854f, 0.999512f, 0.014290f, + 0.999512f, 0.012840f, 0.999512f, 0.011490f, 0.999512f, 0.010246f, 0.999512f, 0.009102f, + 0.999512f, 0.008049f, 0.999512f, 0.007080f, 0.999512f, 0.006191f, 0.999512f, 0.005375f, + 0.999512f, 0.004635f, 0.999512f, 0.003960f, 0.999512f, 0.003353f, 0.999512f, 0.002804f, + 0.999512f, 0.002314f, 0.999512f, 0.001879f, 0.999512f, 0.001495f, 0.999512f, 0.001162f, + 0.999512f, 0.000875f, 0.999512f, 0.000632f, 0.999512f, 0.000432f, 0.999512f, 0.000272f, + 0.999512f, 0.000151f, 0.999512f, 0.000066f, 0.999512f, 0.000016f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.602051f, 1.000000f, 0.486328f, 0.999512f, 0.411621f, + 0.999512f, 0.356934f, 1.000000f, 0.313965f, 1.000000f, 0.279053f, 0.999512f, 0.250000f, + 0.999512f, 0.225098f, 0.999512f, 0.203735f, 0.999512f, 0.185059f, 0.999512f, 0.168579f, + 1.000000f, 0.153931f, 1.000000f, 0.140747f, 1.000000f, 0.129028f, 0.999512f, 0.118408f, + 1.000000f, 0.108765f, 0.999512f, 0.100037f, 0.999512f, 0.092041f, 0.999512f, 0.084717f, + 0.999512f, 0.077942f, 0.999512f, 0.071777f, 0.999512f, 0.066101f, 0.999512f, 0.060883f, + 0.999512f, 0.056030f, 0.999512f, 0.051544f, 0.999512f, 0.047424f, 0.999512f, 0.043579f, + 0.999512f, 0.040009f, 0.999512f, 0.036713f, 0.999512f, 0.033630f, 0.999512f, 0.030792f, + 0.999512f, 0.028152f, 0.999512f, 0.025696f, 0.999512f, 0.023422f, 0.999512f, 0.021301f, + 0.999512f, 0.019333f, 0.999512f, 0.017502f, 0.999512f, 0.015808f, 0.999512f, 0.014252f, + 0.999512f, 0.012794f, 0.999512f, 0.011452f, 0.999512f, 0.010216f, 0.999512f, 0.009071f, + 0.999512f, 0.008018f, 0.999512f, 0.007050f, 0.999512f, 0.006165f, 0.999512f, 0.005352f, + 0.999512f, 0.004612f, 0.999512f, 0.003941f, 0.999512f, 0.003336f, 0.999512f, 0.002789f, + 0.999512f, 0.002300f, 0.999512f, 0.001868f, 0.999512f, 0.001486f, 0.999512f, 0.001154f, + 0.999512f, 0.000868f, 0.999512f, 0.000627f, 0.999512f, 0.000428f, 0.999512f, 0.000269f, + 0.999512f, 0.000149f, 0.999512f, 0.000065f, 0.999512f, 0.000016f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 1.000000f, 0.602051f, 1.000000f, 0.486328f, 1.000000f, 0.411621f, + 1.000000f, 0.356934f, 1.000000f, 0.313965f, 1.000000f, 0.279053f, 1.000000f, 0.250000f, + 1.000000f, 0.225098f, 1.000000f, 0.203735f, 1.000000f, 0.185059f, 1.000000f, 0.168457f, + 1.000000f, 0.153809f, 1.000000f, 0.140747f, 1.000000f, 0.129028f, 1.000000f, 0.118408f, + 1.000000f, 0.108765f, 1.000000f, 0.099976f, 1.000000f, 0.091980f, 1.000000f, 0.084656f, + 1.000000f, 0.077942f, 1.000000f, 0.071777f, 1.000000f, 0.066101f, 1.000000f, 0.060852f, + 1.000000f, 0.056000f, 1.000000f, 0.051544f, 1.000000f, 0.047394f, 1.000000f, 0.043549f, + 1.000000f, 0.039978f, 1.000000f, 0.036682f, 1.000000f, 0.033630f, 1.000000f, 0.030777f, + 1.000000f, 0.028137f, 1.000000f, 0.025681f, 1.000000f, 0.023392f, 1.000000f, 0.021286f, + 1.000000f, 0.019318f, 1.000000f, 0.017487f, 1.000000f, 0.015793f, 1.000000f, 0.014236f, + 1.000000f, 0.012779f, 1.000000f, 0.011444f, 1.000000f, 0.010201f, 1.000000f, 0.009056f, + 1.000000f, 0.008003f, 1.000000f, 0.007042f, 1.000000f, 0.006153f, 1.000000f, 0.005344f, + 1.000000f, 0.004604f, 1.000000f, 0.003937f, 1.000000f, 0.003330f, 1.000000f, 0.002785f, + 1.000000f, 0.002296f, 1.000000f, 0.001864f, 1.000000f, 0.001483f, 1.000000f, 0.001151f, + 1.000000f, 0.000866f, 1.000000f, 0.000626f, 1.000000f, 0.000427f, 1.000000f, 0.000269f, + 1.000000f, 0.000149f, 1.000000f, 0.000065f, 1.000000f, 0.000016f, 1.000000f, 0.000000f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.996582f, 0.000000f, 0.991699f, 0.000000f, 0.935059f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.996582f, 0.000000f, 0.991699f, 0.000000f, 0.935059f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.996582f, 0.000000f, 0.991699f, 0.000000f, 0.934082f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.997070f, 0.000000f, 0.991699f, 0.000000f, 0.934570f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999023f, 0.000000f, 0.997070f, 0.000000f, 0.990723f, 0.000045f, 0.933594f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.998535f, 0.000000f, 0.996582f, 0.000000f, 0.990723f, 0.000103f, 0.931641f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.998047f, 0.000000f, 0.996582f, 0.000000f, 0.990234f, 0.000173f, 0.930176f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.998047f, 0.000000f, 0.996094f, 0.000000f, 0.989746f, 0.000454f, 0.928223f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, + 0.000000f, 0.997559f, 0.000000f, 0.996094f, 0.000000f, 0.989258f, 0.000752f, 0.925293f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.998535f, + 0.000000f, 0.997070f, 0.000000f, 0.995605f, 0.000000f, 0.989258f, 0.001340f, 0.922852f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998047f, + 0.000000f, 0.997070f, 0.000000f, 0.995605f, 0.000613f, 0.988770f, 0.002121f, 0.919922f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.997559f, + 0.000000f, 0.996582f, 0.000000f, 0.995605f, 0.001522f, 0.987793f, 0.003326f, 0.916016f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.997559f, + 0.000000f, 0.996094f, 0.000000f, 0.994629f, 0.002142f, 0.986816f, 0.004902f, 0.911133f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.998047f, 0.000000f, 0.997070f, + 0.000000f, 0.996094f, 0.000865f, 0.994141f, 0.002377f, 0.986328f, 0.007065f, 0.905762f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999023f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, + 0.000006f, 0.995605f, 0.001914f, 0.993164f, 0.002640f, 0.985352f, 0.010147f, 0.900391f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996094f, + 0.001153f, 0.995605f, 0.002747f, 0.992676f, 0.003948f, 0.984375f, 0.014236f, 0.894043f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000743f, 0.996094f, + 0.002214f, 0.994629f, 0.003420f, 0.992188f, 0.005241f, 0.982422f, 0.019714f, 0.886719f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000686f, 0.996582f, 0.002001f, 0.995605f, + 0.003027f, 0.993652f, 0.003918f, 0.990723f, 0.007099f, 0.980957f, 0.026337f, 0.878418f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000896f, 0.996582f, 0.001984f, 0.996094f, 0.002903f, 0.994629f, + 0.003674f, 0.992676f, 0.005245f, 0.989258f, 0.009995f, 0.979004f, 0.034637f, 0.868652f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000255f, 0.997070f, + 0.001376f, 0.996582f, 0.002239f, 0.996094f, 0.002960f, 0.995605f, 0.003559f, 0.993652f, + 0.004147f, 0.992188f, 0.006874f, 0.987793f, 0.012512f, 0.976074f, 0.044891f, 0.858398f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000094f, 0.997070f, 0.001110f, 0.997070f, 0.001945f, 0.996582f, + 0.002563f, 0.996094f, 0.003107f, 0.996094f, 0.003622f, 0.994141f, 0.004120f, 0.992676f, + 0.005798f, 0.990234f, 0.008347f, 0.985840f, 0.015884f, 0.972168f, 0.056793f, 0.846191f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000411f, 0.997559f, + 0.001294f, 0.997070f, 0.001970f, 0.996582f, 0.002508f, 0.996582f, 0.002974f, 0.996094f, + 0.003359f, 0.996094f, 0.003719f, 0.994629f, 0.004181f, 0.993164f, 0.005527f, 0.991699f, + 0.007481f, 0.988770f, 0.010933f, 0.983398f, 0.020096f, 0.967773f, 0.070923f, 0.832031f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000279f, 0.997559f, 0.001101f, 0.997559f, 0.001685f, 0.997070f, 0.002193f, 0.997070f, + 0.002655f, 0.996582f, 0.003038f, 0.996094f, 0.003267f, 0.996094f, 0.003710f, 0.995605f, + 0.004074f, 0.994629f, 0.004257f, 0.993164f, 0.005833f, 0.992188f, 0.007458f, 0.989746f, + 0.009766f, 0.986816f, 0.014023f, 0.979980f, 0.025726f, 0.961914f, 0.087708f, 0.816406f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000735f, 0.997559f, 0.001388f, 0.997559f, 0.001780f, 0.997070f, + 0.002251f, 0.997070f, 0.002659f, 0.996582f, 0.002811f, 0.996582f, 0.003246f, 0.996094f, + 0.003510f, 0.996094f, 0.003769f, 0.996094f, 0.004089f, 0.995117f, 0.004272f, 0.994141f, + 0.005089f, 0.993164f, 0.006470f, 0.992188f, 0.007740f, 0.990234f, 0.009552f, 0.987793f, + 0.012672f, 0.983887f, 0.018448f, 0.976074f, 0.033417f, 0.954590f, 0.107422f, 0.798340f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000339f, 0.998047f, 0.001081f, 0.998047f, 0.001574f, 0.997559f, 0.001827f, 0.997559f, + 0.002275f, 0.997070f, 0.002583f, 0.997070f, 0.002810f, 0.996582f, 0.003122f, 0.996582f, + 0.003309f, 0.996582f, 0.003561f, 0.996094f, 0.003790f, 0.996094f, 0.003849f, 0.995605f, + 0.004253f, 0.994629f, 0.004314f, 0.994141f, 0.005405f, 0.993652f, 0.006416f, 0.992676f, + 0.007534f, 0.991699f, 0.008308f, 0.990234f, 0.010536f, 0.987793f, 0.012924f, 0.984863f, + 0.017166f, 0.979980f, 0.024399f, 0.970215f, 0.043671f, 0.944824f, 0.130005f, 0.778320f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000720f, 0.998047f, + 0.001271f, 0.998047f, 0.001718f, 0.998047f, 0.001868f, 0.997559f, 0.002308f, 0.997559f, + 0.002445f, 0.997070f, 0.002810f, 0.997070f, 0.002867f, 0.997070f, 0.003267f, 0.996582f, + 0.003347f, 0.996582f, 0.003590f, 0.996582f, 0.003809f, 0.996094f, 0.003849f, 0.996094f, + 0.004181f, 0.995605f, 0.004311f, 0.995117f, 0.004337f, 0.994629f, 0.005432f, 0.994141f, + 0.006378f, 0.993164f, 0.006992f, 0.992676f, 0.007889f, 0.991699f, 0.008499f, 0.990234f, + 0.010254f, 0.988770f, 0.011909f, 0.987305f, 0.014374f, 0.984375f, 0.017975f, 0.980469f, + 0.023239f, 0.974121f, 0.033539f, 0.962402f, 0.057526f, 0.932129f, 0.156372f, 0.755859f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000325f, 0.998535f, 0.001050f, 0.998535f, 0.001381f, 0.998047f, 0.001841f, 0.998047f, + 0.002081f, 0.997559f, 0.002359f, 0.997559f, 0.002447f, 0.997559f, 0.002836f, 0.997070f, + 0.002882f, 0.997070f, 0.003223f, 0.997070f, 0.003353f, 0.996582f, 0.003378f, 0.996582f, + 0.003727f, 0.996582f, 0.003841f, 0.996582f, 0.003866f, 0.996094f, 0.004097f, 0.996094f, + 0.004311f, 0.995605f, 0.004345f, 0.995117f, 0.004463f, 0.994629f, 0.005764f, 0.994141f, + 0.006466f, 0.993652f, 0.006981f, 0.993164f, 0.007450f, 0.992676f, 0.008064f, 0.991699f, + 0.008682f, 0.991211f, 0.010078f, 0.990234f, 0.011444f, 0.988770f, 0.012810f, 0.987305f, + 0.014717f, 0.985352f, 0.017349f, 0.982422f, 0.020828f, 0.979004f, 0.025436f, 0.974121f, + 0.033142f, 0.966309f, 0.046814f, 0.951172f, 0.078186f, 0.914551f, 0.186279f, 0.730957f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000789f, 0.998535f, 0.001338f, 0.998535f, 0.001708f, 0.998047f, + 0.001906f, 0.998047f, 0.002312f, 0.998047f, 0.002401f, 0.997559f, 0.002708f, 0.997559f, + 0.002880f, 0.997559f, 0.002903f, 0.997070f, 0.003292f, 0.997070f, 0.003376f, 0.997070f, + 0.003391f, 0.996582f, 0.003693f, 0.996582f, 0.003853f, 0.996582f, 0.003876f, 0.996582f, + 0.003883f, 0.996094f, 0.004257f, 0.996094f, 0.004345f, 0.995605f, 0.004364f, 0.995117f, + 0.004715f, 0.994629f, 0.005821f, 0.994629f, 0.006481f, 0.994141f, 0.006840f, 0.993652f, + 0.007168f, 0.993652f, 0.007568f, 0.993164f, 0.008102f, 0.992188f, 0.008560f, 0.991699f, + 0.009575f, 0.991211f, 0.010666f, 0.990234f, 0.011513f, 0.989258f, 0.012497f, 0.988281f, + 0.013969f, 0.987305f, 0.015282f, 0.985840f, 0.017303f, 0.983887f, 0.019363f, 0.981934f, + 0.022629f, 0.979004f, 0.026077f, 0.975586f, 0.030899f, 0.970703f, 0.038208f, 0.964355f, + 0.048920f, 0.953613f, 0.067078f, 0.934570f, 0.107483f, 0.891113f, 0.220215f, 0.703613f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000422f, 0.999023f, 0.001333f, 0.998535f, 0.001707f, 0.998535f, + 0.001929f, 0.998047f, 0.002382f, 0.998047f, 0.002422f, 0.997559f, 0.002855f, 0.997559f, + 0.002909f, 0.997559f, 0.002916f, 0.997070f, 0.003376f, 0.997070f, 0.003399f, 0.997070f, + 0.003405f, 0.996582f, 0.003839f, 0.996582f, 0.003881f, 0.996582f, 0.003889f, 0.996582f, + 0.003893f, 0.996094f, 0.004330f, 0.996094f, 0.004368f, 0.995605f, 0.004555f, 0.995605f, + 0.005287f, 0.995117f, 0.005974f, 0.994629f, 0.006672f, 0.994141f, 0.007069f, 0.994141f, + 0.007229f, 0.993652f, 0.007607f, 0.993652f, 0.007729f, 0.993164f, 0.008400f, 0.992676f, + 0.009026f, 0.992188f, 0.009872f, 0.991699f, 0.010773f, 0.991211f, 0.011246f, 0.990723f, + 0.011604f, 0.989746f, 0.012962f, 0.988770f, 0.014107f, 0.988281f, 0.015137f, 0.987305f, + 0.016022f, 0.986328f, 0.017838f, 0.985352f, 0.018921f, 0.983398f, 0.021347f, 0.981934f, + 0.023483f, 0.980469f, 0.025940f, 0.978516f, 0.028519f, 0.975586f, 0.032196f, 0.972656f, + 0.037262f, 0.968750f, 0.042358f, 0.963379f, 0.050262f, 0.957031f, 0.060425f, 0.947754f, + 0.075745f, 0.933594f, 0.100952f, 0.909180f, 0.150269f, 0.857422f, 0.257080f, 0.674316f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000370f, 0.999023f, 0.001435f, 0.998535f, + 0.001935f, 0.998535f, 0.002403f, 0.998047f, 0.002434f, 0.997559f, 0.002914f, 0.997559f, + 0.002922f, 0.997559f, 0.003397f, 0.997070f, 0.003408f, 0.997070f, 0.003412f, 0.997070f, + 0.003889f, 0.996582f, 0.003897f, 0.996582f, 0.003899f, 0.996582f, 0.004349f, 0.996094f, + 0.005032f, 0.995605f, 0.005718f, 0.995117f, 0.006176f, 0.995117f, 0.006611f, 0.994629f, + 0.007233f, 0.994141f, 0.007278f, 0.994141f, 0.007736f, 0.993652f, 0.007771f, 0.993652f, + 0.008148f, 0.992676f, 0.009468f, 0.992188f, 0.010078f, 0.991699f, 0.010925f, 0.991211f, + 0.011299f, 0.991211f, 0.011597f, 0.990723f, 0.011902f, 0.990234f, 0.013397f, 0.989258f, + 0.014366f, 0.988770f, 0.015320f, 0.988281f, 0.015762f, 0.987305f, 0.017136f, 0.986328f, + 0.018494f, 0.985840f, 0.019135f, 0.984863f, 0.020325f, 0.983887f, 0.022293f, 0.982910f, + 0.023926f, 0.981934f, 0.025345f, 0.980469f, 0.027115f, 0.979004f, 0.029114f, 0.977539f, + 0.031433f, 0.976074f, 0.033905f, 0.973633f, 0.037201f, 0.971680f, 0.040192f, 0.969238f, + 0.043945f, 0.966309f, 0.048737f, 0.962891f, 0.053955f, 0.958984f, 0.059631f, 0.954102f, + 0.067017f, 0.948242f, 0.076050f, 0.940918f, 0.087769f, 0.931152f, 0.103699f, 0.917969f, + 0.125244f, 0.898438f, 0.157471f, 0.868652f, 0.212036f, 0.811035f, 0.298584f, 0.642578f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.001461f, 0.999023f, 0.002430f, 0.998535f, + 0.002922f, 0.998047f, 0.003342f, 0.997559f, 0.003414f, 0.997559f, 0.003899f, 0.997070f, + 0.004780f, 0.996094f, 0.005817f, 0.995605f, 0.006329f, 0.995117f, 0.006817f, 0.994629f, + 0.007732f, 0.994141f, 0.007793f, 0.993652f, 0.009407f, 0.992676f, 0.010078f, 0.992188f, + 0.010658f, 0.991699f, 0.011658f, 0.991211f, 0.012436f, 0.990723f, 0.013901f, 0.989746f, + 0.014809f, 0.989258f, 0.015106f, 0.988770f, 0.015961f, 0.987793f, 0.018448f, 0.986816f, + 0.019196f, 0.986328f, 0.019440f, 0.985352f, 0.021423f, 0.984375f, 0.022339f, 0.983887f, + 0.023834f, 0.982910f, 0.025330f, 0.981934f, 0.026566f, 0.980957f, 0.028549f, 0.979980f, + 0.030380f, 0.979004f, 0.031799f, 0.977539f, 0.033600f, 0.976562f, 0.035095f, 0.975098f, + 0.038330f, 0.973633f, 0.040131f, 0.972656f, 0.041656f, 0.971191f, 0.044373f, 0.969238f, + 0.046631f, 0.967773f, 0.050232f, 0.965820f, 0.053284f, 0.963867f, 0.056763f, 0.961426f, + 0.060303f, 0.959473f, 0.063721f, 0.957031f, 0.067627f, 0.954102f, 0.071960f, 0.951172f, + 0.076660f, 0.947754f, 0.082336f, 0.944336f, 0.087891f, 0.940430f, 0.094604f, 0.936035f, + 0.101562f, 0.931152f, 0.109619f, 0.925293f, 0.119080f, 0.918457f, 0.129517f, 0.910645f, + 0.141357f, 0.901855f, 0.155518f, 0.890625f, 0.172363f, 0.876953f, 0.192383f, 0.859863f, + 0.217896f, 0.836914f, 0.250977f, 0.803711f, 0.297852f, 0.748047f, 0.341553f, 0.608398f, + 0.000000f, 1.000000f, 0.005363f, 0.997559f, 0.010078f, 0.994141f, 0.015091f, 0.990723f, + 0.020065f, 0.987305f, 0.024734f, 0.983887f, 0.028702f, 0.980957f, 0.034027f, 0.977539f, + 0.039154f, 0.974121f, 0.044220f, 0.971191f, 0.049164f, 0.967773f, 0.053772f, 0.964844f, + 0.058350f, 0.962402f, 0.063538f, 0.959473f, 0.068420f, 0.956543f, 0.072754f, 0.953613f, + 0.078552f, 0.950684f, 0.083374f, 0.948242f, 0.088318f, 0.945312f, 0.093262f, 0.942383f, + 0.097961f, 0.939941f, 0.103149f, 0.937500f, 0.109009f, 0.934570f, 0.114319f, 0.931641f, + 0.119019f, 0.929199f, 0.125000f, 0.926270f, 0.130127f, 0.923340f, 0.135376f, 0.920410f, + 0.140503f, 0.917969f, 0.146118f, 0.915039f, 0.151245f, 0.912109f, 0.157104f, 0.909180f, + 0.162354f, 0.906250f, 0.168335f, 0.902832f, 0.173828f, 0.899902f, 0.179443f, 0.896973f, + 0.185303f, 0.893555f, 0.191284f, 0.890137f, 0.197510f, 0.886719f, 0.203735f, 0.883301f, + 0.209717f, 0.879395f, 0.216553f, 0.875488f, 0.222656f, 0.871582f, 0.229248f, 0.867676f, + 0.235596f, 0.863770f, 0.242798f, 0.858887f, 0.249756f, 0.854492f, 0.256592f, 0.849609f, + 0.264160f, 0.844727f, 0.271484f, 0.839355f, 0.279297f, 0.833496f, 0.286865f, 0.827637f, + 0.295410f, 0.820801f, 0.303711f, 0.813965f, 0.312500f, 0.806152f, 0.321777f, 0.797852f, + 0.331299f, 0.788086f, 0.341309f, 0.777344f, 0.352051f, 0.765137f, 0.364014f, 0.750000f, + 0.376709f, 0.731445f, 0.390625f, 0.706543f, 0.405518f, 0.667969f, 0.387695f, 0.570801f, + 0.000000f, 1.000000f, 0.492188f, 0.772461f, 0.515137f, 0.719727f, 0.529297f, 0.693848f, + 0.538574f, 0.678711f, 0.547363f, 0.668945f, 0.554199f, 0.662598f, 0.562012f, 0.657715f, + 0.568359f, 0.654297f, 0.573730f, 0.651367f, 0.579102f, 0.648926f, 0.584473f, 0.646973f, + 0.589355f, 0.645508f, 0.593750f, 0.644043f, 0.598145f, 0.642578f, 0.602051f, 0.641113f, + 0.606445f, 0.639648f, 0.611816f, 0.638184f, 0.615234f, 0.637207f, 0.619629f, 0.635254f, + 0.623535f, 0.633789f, 0.627441f, 0.632324f, 0.630859f, 0.630859f, 0.634766f, 0.628906f, + 0.638184f, 0.627441f, 0.642090f, 0.625488f, 0.645508f, 0.623535f, 0.649414f, 0.621582f, + 0.652832f, 0.619141f, 0.655762f, 0.617188f, 0.659180f, 0.614746f, 0.663574f, 0.612305f, + 0.666504f, 0.609863f, 0.670410f, 0.606934f, 0.673340f, 0.604492f, 0.676758f, 0.601562f, + 0.679688f, 0.598145f, 0.684082f, 0.594727f, 0.688477f, 0.591309f, 0.690430f, 0.587891f, + 0.694824f, 0.583984f, 0.698242f, 0.580078f, 0.701172f, 0.575684f, 0.705078f, 0.571289f, + 0.708008f, 0.566406f, 0.712891f, 0.561523f, 0.715820f, 0.556152f, 0.720215f, 0.550781f, + 0.722656f, 0.544434f, 0.728027f, 0.538086f, 0.731445f, 0.531250f, 0.735352f, 0.523438f, + 0.739746f, 0.515625f, 0.743652f, 0.506836f, 0.747559f, 0.497070f, 0.752441f, 0.486084f, + 0.756836f, 0.473877f, 0.761230f, 0.460205f, 0.767090f, 0.443848f, 0.772461f, 0.424805f, + 0.777832f, 0.401123f, 0.784180f, 0.369385f, 0.790527f, 0.321533f, 0.778809f, 0.219238f, + 0.000000f, 1.000000f, 0.548828f, 0.747070f, 0.594238f, 0.676270f, 0.623535f, 0.636230f, + 0.645996f, 0.608887f, 0.666016f, 0.588867f, 0.682617f, 0.573242f, 0.698242f, 0.560547f, + 0.711914f, 0.549316f, 0.722656f, 0.540039f, 0.735352f, 0.531738f, 0.745117f, 0.523926f, + 0.754395f, 0.517090f, 0.763184f, 0.510254f, 0.772949f, 0.503906f, 0.780273f, 0.498291f, + 0.787109f, 0.492676f, 0.793457f, 0.487305f, 0.800781f, 0.481934f, 0.806641f, 0.476807f, + 0.813477f, 0.471680f, 0.818359f, 0.466797f, 0.824219f, 0.461670f, 0.830078f, 0.456543f, + 0.835938f, 0.451416f, 0.840820f, 0.446533f, 0.844727f, 0.441650f, 0.849121f, 0.436523f, + 0.854492f, 0.431152f, 0.857910f, 0.426270f, 0.862305f, 0.421143f, 0.865723f, 0.415771f, + 0.869629f, 0.410645f, 0.874023f, 0.405273f, 0.876953f, 0.399658f, 0.879883f, 0.394043f, + 0.884277f, 0.388428f, 0.886719f, 0.382568f, 0.890137f, 0.376709f, 0.893066f, 0.370605f, + 0.895996f, 0.364258f, 0.899902f, 0.357910f, 0.902832f, 0.351074f, 0.905273f, 0.344238f, + 0.908691f, 0.337158f, 0.911133f, 0.329834f, 0.913086f, 0.322266f, 0.916016f, 0.314453f, + 0.918457f, 0.306152f, 0.921387f, 0.297607f, 0.923340f, 0.288574f, 0.926270f, 0.279053f, + 0.928711f, 0.269043f, 0.931641f, 0.258301f, 0.933105f, 0.246948f, 0.937012f, 0.234497f, + 0.938477f, 0.221191f, 0.940918f, 0.206543f, 0.943848f, 0.190308f, 0.946289f, 0.171753f, + 0.947754f, 0.150757f, 0.952148f, 0.124451f, 0.953613f, 0.090881f, 0.949707f, 0.040405f, + 0.000000f, 1.000000f, 0.603516f, 0.723633f, 0.665527f, 0.637207f, 0.707031f, 0.584473f, + 0.735352f, 0.548340f, 0.760254f, 0.520020f, 0.779785f, 0.498291f, 0.796875f, 0.479980f, + 0.811035f, 0.464600f, 0.822754f, 0.451172f, 0.834473f, 0.439209f, 0.845215f, 0.428467f, + 0.853516f, 0.418945f, 0.861328f, 0.409912f, 0.870117f, 0.401367f, 0.875977f, 0.393555f, + 0.881836f, 0.386230f, 0.887695f, 0.379150f, 0.892578f, 0.372314f, 0.896973f, 0.365967f, + 0.902344f, 0.359619f, 0.905762f, 0.353516f, 0.911133f, 0.347412f, 0.914551f, 0.341553f, + 0.917969f, 0.335938f, 0.921387f, 0.330078f, 0.923828f, 0.324707f, 0.926758f, 0.319092f, + 0.928711f, 0.313721f, 0.932617f, 0.308105f, 0.933594f, 0.302734f, 0.937012f, 0.297119f, + 0.938965f, 0.291748f, 0.942383f, 0.285889f, 0.943848f, 0.280273f, 0.945801f, 0.274902f, + 0.948242f, 0.269043f, 0.949219f, 0.263428f, 0.950195f, 0.257812f, 0.951660f, 0.252197f, + 0.954590f, 0.245972f, 0.956055f, 0.239868f, 0.957031f, 0.233765f, 0.958496f, 0.227539f, + 0.960938f, 0.220825f, 0.962402f, 0.214233f, 0.963379f, 0.207397f, 0.964844f, 0.200317f, + 0.965332f, 0.193237f, 0.966309f, 0.185791f, 0.967773f, 0.177979f, 0.969238f, 0.170044f, + 0.969727f, 0.161743f, 0.971680f, 0.152832f, 0.972656f, 0.143555f, 0.973633f, 0.133911f, + 0.975098f, 0.123474f, 0.976074f, 0.112427f, 0.977051f, 0.100403f, 0.978027f, 0.087280f, + 0.979492f, 0.072815f, 0.979980f, 0.056366f, 0.981445f, 0.036926f, 0.978027f, 0.012779f, + 0.000000f, 1.000000f, 0.655273f, 0.702148f, 0.727051f, 0.603516f, 0.772461f, 0.542480f, + 0.804199f, 0.499756f, 0.827148f, 0.467773f, 0.846191f, 0.441895f, 0.860840f, 0.420654f, + 0.873047f, 0.403076f, 0.884277f, 0.387451f, 0.894043f, 0.373779f, 0.901367f, 0.361816f, + 0.907715f, 0.350830f, 0.914062f, 0.341064f, 0.919434f, 0.332031f, 0.924805f, 0.323242f, + 0.928711f, 0.315186f, 0.933105f, 0.307617f, 0.937012f, 0.300293f, 0.938965f, 0.293945f, + 0.942871f, 0.287109f, 0.945312f, 0.281006f, 0.948730f, 0.274658f, 0.950684f, 0.268555f, + 0.952148f, 0.262939f, 0.955566f, 0.257324f, 0.957031f, 0.251709f, 0.958496f, 0.246338f, + 0.959961f, 0.240967f, 0.961426f, 0.235840f, 0.963379f, 0.230469f, 0.964844f, 0.225220f, + 0.965820f, 0.220093f, 0.968262f, 0.214844f, 0.968750f, 0.209595f, 0.969727f, 0.204468f, + 0.970703f, 0.199341f, 0.972656f, 0.193970f, 0.973145f, 0.188721f, 0.974121f, 0.183472f, + 0.975586f, 0.178101f, 0.976074f, 0.172852f, 0.977051f, 0.167358f, 0.977539f, 0.161987f, + 0.979004f, 0.156250f, 0.979492f, 0.150513f, 0.980469f, 0.144775f, 0.981445f, 0.138672f, + 0.981445f, 0.132690f, 0.981934f, 0.126465f, 0.981934f, 0.120361f, 0.982910f, 0.113831f, + 0.983887f, 0.106995f, 0.984863f, 0.099976f, 0.985352f, 0.092651f, 0.985840f, 0.085083f, + 0.986328f, 0.077271f, 0.986816f, 0.069031f, 0.987305f, 0.060425f, 0.988281f, 0.051086f, + 0.989258f, 0.040802f, 0.989746f, 0.029984f, 0.989746f, 0.018524f, 0.988770f, 0.007530f, + 0.000000f, 1.000000f, 0.700195f, 0.684082f, 0.778809f, 0.576172f, 0.823730f, 0.509766f, + 0.852051f, 0.464111f, 0.874023f, 0.428955f, 0.888672f, 0.401611f, 0.902832f, 0.378662f, + 0.911621f, 0.359619f, 0.920410f, 0.343018f, 0.926758f, 0.328857f, 0.932129f, 0.315918f, + 0.937500f, 0.304443f, 0.941895f, 0.293945f, 0.947266f, 0.284180f, 0.949707f, 0.275391f, + 0.952637f, 0.267334f, 0.956543f, 0.259521f, 0.958984f, 0.251953f, 0.960938f, 0.245117f, + 0.962891f, 0.238525f, 0.964844f, 0.232178f, 0.966797f, 0.226074f, 0.968262f, 0.220215f, + 0.969238f, 0.214600f, 0.970703f, 0.209106f, 0.972656f, 0.203613f, 0.973145f, 0.198486f, + 0.975586f, 0.193115f, 0.976074f, 0.187988f, 0.977051f, 0.182983f, 0.977539f, 0.178223f, + 0.978516f, 0.173340f, 0.979004f, 0.168701f, 0.980957f, 0.163818f, 0.981445f, 0.158936f, + 0.982422f, 0.154175f, 0.982422f, 0.149414f, 0.982910f, 0.144897f, 0.983398f, 0.140259f, + 0.984863f, 0.135376f, 0.985352f, 0.130493f, 0.985352f, 0.125854f, 0.985840f, 0.121094f, + 0.986328f, 0.116333f, 0.987305f, 0.111328f, 0.987305f, 0.106445f, 0.987793f, 0.101440f, + 0.988281f, 0.096436f, 0.989258f, 0.091125f, 0.989746f, 0.085815f, 0.989746f, 0.080505f, + 0.990723f, 0.075012f, 0.990723f, 0.069397f, 0.990723f, 0.063782f, 0.991211f, 0.057953f, + 0.991211f, 0.052032f, 0.991699f, 0.045807f, 0.992188f, 0.039154f, 0.992676f, 0.032318f, + 0.993652f, 0.024948f, 0.993652f, 0.017715f, 0.993652f, 0.010201f, 0.993652f, 0.004353f, + 0.000000f, 1.000000f, 0.741211f, 0.668457f, 0.819336f, 0.555176f, 0.861328f, 0.486084f, + 0.888184f, 0.437744f, 0.904785f, 0.401611f, 0.917969f, 0.372559f, 0.927734f, 0.349121f, + 0.936523f, 0.328857f, 0.942383f, 0.312012f, 0.948730f, 0.296875f, 0.952148f, 0.283691f, + 0.956543f, 0.271484f, 0.959473f, 0.260742f, 0.962891f, 0.250977f, 0.965332f, 0.241943f, + 0.967773f, 0.233276f, 0.969727f, 0.225342f, 0.971680f, 0.218018f, 0.972656f, 0.211060f, + 0.974121f, 0.204590f, 0.977051f, 0.197876f, 0.977539f, 0.191772f, 0.978516f, 0.186035f, + 0.979492f, 0.180542f, 0.980957f, 0.175171f, 0.981445f, 0.169800f, 0.982422f, 0.164673f, + 0.982422f, 0.159912f, 0.983398f, 0.155029f, 0.984863f, 0.150269f, 0.985840f, 0.145386f, + 0.985840f, 0.140869f, 0.986328f, 0.136475f, 0.986328f, 0.132080f, 0.986816f, 0.127686f, + 0.987305f, 0.123474f, 0.987793f, 0.119141f, 0.988281f, 0.114868f, 0.989746f, 0.110413f, + 0.989746f, 0.106140f, 0.989746f, 0.101990f, 0.990234f, 0.097900f, 0.990234f, 0.093689f, + 0.990723f, 0.089478f, 0.991211f, 0.085266f, 0.991211f, 0.081055f, 0.991211f, 0.076904f, + 0.991699f, 0.072632f, 0.991699f, 0.068420f, 0.992676f, 0.063965f, 0.993164f, 0.059418f, + 0.994141f, 0.054688f, 0.994141f, 0.050110f, 0.994141f, 0.045532f, 0.994141f, 0.040955f, + 0.994629f, 0.036133f, 0.994629f, 0.031403f, 0.994629f, 0.026627f, 0.995117f, 0.021637f, + 0.995117f, 0.016663f, 0.994629f, 0.011780f, 0.995117f, 0.006794f, 0.995117f, 0.003134f, + 0.000000f, 1.000000f, 0.776855f, 0.655762f, 0.853027f, 0.539062f, 0.889648f, 0.468506f, + 0.912109f, 0.419189f, 0.926758f, 0.381592f, 0.937988f, 0.352051f, 0.944824f, 0.327881f, + 0.952148f, 0.306885f, 0.957520f, 0.289307f, 0.961914f, 0.273682f, 0.964355f, 0.260254f, + 0.967285f, 0.247925f, 0.970215f, 0.236694f, 0.972656f, 0.226318f, 0.974121f, 0.217285f, + 0.976562f, 0.208496f, 0.977539f, 0.200562f, 0.979492f, 0.192993f, 0.980957f, 0.185791f, + 0.981445f, 0.179199f, 0.982422f, 0.172852f, 0.982910f, 0.166870f, 0.983887f, 0.161255f, + 0.985840f, 0.155396f, 0.986328f, 0.150024f, 0.986328f, 0.145020f, 0.986816f, 0.140259f, + 0.987305f, 0.135498f, 0.987793f, 0.130859f, 0.988770f, 0.126343f, 0.990234f, 0.121643f, + 0.990234f, 0.117310f, 0.990234f, 0.113159f, 0.990723f, 0.109070f, 0.990723f, 0.105042f, + 0.990723f, 0.101196f, 0.991699f, 0.097168f, 0.991699f, 0.093323f, 0.992188f, 0.089539f, + 0.992188f, 0.085754f, 0.992676f, 0.081970f, 0.993164f, 0.078247f, 0.994141f, 0.074341f, + 0.994629f, 0.070435f, 0.994629f, 0.066711f, 0.994629f, 0.063049f, 0.994629f, 0.059479f, + 0.994629f, 0.055908f, 0.995117f, 0.052185f, 0.995117f, 0.048584f, 0.995117f, 0.044983f, + 0.994629f, 0.041412f, 0.995117f, 0.037689f, 0.995117f, 0.034027f, 0.995117f, 0.030380f, + 0.995117f, 0.026764f, 0.995605f, 0.022888f, 0.995605f, 0.019196f, 0.996094f, 0.015350f, + 0.996094f, 0.011658f, 0.996582f, 0.007851f, 0.997070f, 0.004223f, 0.998535f, 0.000417f, + 0.000000f, 1.000000f, 0.807617f, 0.645508f, 0.878906f, 0.526855f, 0.911621f, 0.455566f, + 0.929199f, 0.405518f, 0.942383f, 0.367188f, 0.951660f, 0.336670f, 0.957520f, 0.311768f, + 0.963867f, 0.290527f, 0.966797f, 0.272461f, 0.970215f, 0.256592f, 0.973145f, 0.242554f, + 0.976074f, 0.229736f, 0.977051f, 0.218506f, 0.979004f, 0.208130f, 0.980957f, 0.198486f, + 0.982422f, 0.189697f, 0.982910f, 0.181641f, 0.984375f, 0.174072f, 0.985352f, 0.166748f, + 0.986328f, 0.160034f, 0.986328f, 0.153809f, 0.987305f, 0.147827f, 0.987793f, 0.142090f, + 0.988770f, 0.136719f, 0.990234f, 0.131226f, 0.990234f, 0.126099f, 0.990234f, 0.121460f, + 0.990723f, 0.116821f, 0.990723f, 0.112488f, 0.991211f, 0.108215f, 0.991699f, 0.104004f, + 0.992188f, 0.099915f, 0.992188f, 0.095947f, 0.992676f, 0.092041f, 0.993164f, 0.088257f, + 0.994141f, 0.084351f, 0.994629f, 0.080505f, 0.994629f, 0.076904f, 0.994629f, 0.073486f, + 0.994629f, 0.070068f, 0.994629f, 0.066772f, 0.995117f, 0.063354f, 0.995117f, 0.060150f, + 0.995117f, 0.056946f, 0.995117f, 0.053802f, 0.995605f, 0.050690f, 0.995605f, 0.047455f, + 0.995605f, 0.044373f, 0.995605f, 0.041351f, 0.996094f, 0.038239f, 0.996094f, 0.035156f, + 0.996094f, 0.032135f, 0.996582f, 0.029144f, 0.996582f, 0.026001f, 0.996582f, 0.023026f, + 0.997070f, 0.019897f, 0.997070f, 0.016907f, 0.997070f, 0.013779f, 0.997559f, 0.010658f, + 0.998535f, 0.007397f, 0.999023f, 0.004097f, 0.999023f, 0.001551f, 0.998535f, 0.000064f, + 0.000000f, 1.000000f, 0.832031f, 0.637695f, 0.897461f, 0.518555f, 0.927734f, 0.446045f, + 0.942871f, 0.395264f, 0.954102f, 0.356445f, 0.960938f, 0.325439f, 0.966309f, 0.300049f, + 0.970703f, 0.278320f, 0.973633f, 0.259766f, 0.976562f, 0.243408f, 0.978516f, 0.229004f, + 0.980469f, 0.216064f, 0.982422f, 0.204468f, 0.983398f, 0.193848f, 0.984863f, 0.184082f, + 0.985840f, 0.175171f, 0.986816f, 0.166992f, 0.987793f, 0.159180f, 0.988281f, 0.152100f, + 0.989746f, 0.145142f, 0.989746f, 0.138794f, 0.990234f, 0.132812f, 0.990723f, 0.127197f, + 0.990723f, 0.121948f, 0.991211f, 0.116882f, 0.991699f, 0.112061f, 0.992188f, 0.107239f, + 0.992676f, 0.102722f, 0.993164f, 0.098328f, 0.994141f, 0.093933f, 0.994629f, 0.089783f, + 0.994629f, 0.085815f, 0.994629f, 0.082092f, 0.994629f, 0.078491f, 0.994629f, 0.075073f, + 0.995117f, 0.071594f, 0.995117f, 0.068237f, 0.995117f, 0.065002f, 0.995117f, 0.061920f, + 0.995605f, 0.058807f, 0.995605f, 0.055725f, 0.995605f, 0.052765f, 0.995605f, 0.049866f, + 0.996094f, 0.046967f, 0.996094f, 0.044098f, 0.996094f, 0.041321f, 0.996094f, 0.038635f, + 0.996582f, 0.035797f, 0.996582f, 0.033142f, 0.997070f, 0.030411f, 0.997070f, 0.027756f, + 0.997559f, 0.025085f, 0.997559f, 0.022461f, 0.998047f, 0.019760f, 0.998535f, 0.017059f, + 0.999512f, 0.014137f, 0.999512f, 0.011505f, 0.999512f, 0.009064f, 0.999512f, 0.006756f, + 0.999512f, 0.004593f, 0.999023f, 0.002617f, 0.999023f, 0.000950f, 0.999023f, 0.000032f, + 0.000000f, 1.000000f, 0.853027f, 0.631836f, 0.915039f, 0.511230f, 0.940918f, 0.438965f, + 0.953125f, 0.387939f, 0.961914f, 0.348633f, 0.968262f, 0.316895f, 0.972656f, 0.290771f, + 0.976074f, 0.268799f, 0.979004f, 0.249878f, 0.980957f, 0.233154f, 0.982422f, 0.218506f, + 0.984863f, 0.205078f, 0.985840f, 0.193237f, 0.986328f, 0.182739f, 0.987793f, 0.172729f, + 0.989258f, 0.163452f, 0.989746f, 0.155029f, 0.989746f, 0.147461f, 0.990723f, 0.140259f, + 0.990723f, 0.133545f, 0.991211f, 0.127319f, 0.991699f, 0.121399f, 0.992676f, 0.115601f, + 0.993164f, 0.110229f, 0.994141f, 0.104919f, 0.994141f, 0.100037f, 0.994629f, 0.095398f, + 0.994629f, 0.091003f, 0.994629f, 0.086853f, 0.994629f, 0.082947f, 0.995117f, 0.079102f, + 0.995117f, 0.075378f, 0.995117f, 0.071838f, 0.995117f, 0.068481f, 0.995605f, 0.065125f, + 0.995605f, 0.061920f, 0.995605f, 0.058838f, 0.995605f, 0.055878f, 0.996094f, 0.052826f, + 0.996094f, 0.049957f, 0.996094f, 0.047211f, 0.996582f, 0.044403f, 0.996582f, 0.041718f, + 0.996582f, 0.039154f, 0.997070f, 0.036469f, 0.997070f, 0.033997f, 0.997559f, 0.031403f, + 0.998047f, 0.028961f, 0.998047f, 0.026474f, 0.998535f, 0.023956f, 0.999512f, 0.021255f, + 0.999512f, 0.018890f, 0.999512f, 0.016647f, 0.999512f, 0.014503f, 0.999512f, 0.012428f, + 0.999512f, 0.010422f, 0.999512f, 0.008499f, 0.999512f, 0.006653f, 0.999512f, 0.004906f, + 0.999512f, 0.003284f, 0.999512f, 0.001829f, 0.999023f, 0.000638f, 0.999023f, 0.000019f, + 0.000000f, 1.000000f, 0.873047f, 0.625977f, 0.927246f, 0.506836f, 0.949707f, 0.433838f, + 0.961426f, 0.381836f, 0.968750f, 0.342041f, 0.974121f, 0.310303f, 0.977051f, 0.283936f, + 0.980469f, 0.261230f, 0.982422f, 0.242065f, 0.984375f, 0.224976f, 0.985840f, 0.209961f, + 0.986816f, 0.196777f, 0.988770f, 0.184448f, 0.989746f, 0.173218f, 0.989746f, 0.163452f, + 0.990723f, 0.154419f, 0.991211f, 0.145996f, 0.991699f, 0.138184f, 0.992188f, 0.130981f, + 0.993164f, 0.124023f, 0.994141f, 0.117371f, 0.994141f, 0.111389f, 0.994629f, 0.105835f, + 0.994629f, 0.100525f, 0.994629f, 0.095581f, 0.994629f, 0.090942f, 0.995117f, 0.086426f, + 0.995117f, 0.082214f, 0.995117f, 0.078247f, 0.995117f, 0.074402f, 0.995605f, 0.070618f, + 0.995605f, 0.067078f, 0.995605f, 0.063721f, 0.996094f, 0.060364f, 0.996094f, 0.057220f, + 0.996094f, 0.054230f, 0.996582f, 0.051178f, 0.996582f, 0.048340f, 0.997070f, 0.045502f, + 0.997070f, 0.042786f, 0.997559f, 0.040161f, 0.997559f, 0.037567f, 0.998047f, 0.034973f, + 0.998535f, 0.032471f, 0.999023f, 0.029922f, 0.999512f, 0.027359f, 0.999512f, 0.025055f, + 0.999512f, 0.022873f, 0.999512f, 0.020782f, 0.999512f, 0.018768f, 0.999512f, 0.016830f, + 0.999512f, 0.014954f, 0.999512f, 0.013130f, 0.999512f, 0.011383f, 0.999512f, 0.009689f, + 0.999512f, 0.008072f, 0.999512f, 0.006523f, 0.999512f, 0.005054f, 0.999512f, 0.003685f, + 0.999512f, 0.002428f, 0.999512f, 0.001325f, 0.999512f, 0.000447f, 0.999023f, 0.000013f, + 0.000000f, 1.000000f, 0.888184f, 0.623047f, 0.937988f, 0.503418f, 0.956543f, 0.430420f, + 0.967285f, 0.377686f, 0.973633f, 0.337402f, 0.978027f, 0.304932f, 0.980469f, 0.278320f, + 0.984375f, 0.255127f, 0.985352f, 0.235718f, 0.986816f, 0.218506f, 0.988770f, 0.203003f, + 0.989746f, 0.189331f, 0.990234f, 0.177246f, 0.990234f, 0.166382f, 0.991211f, 0.156250f, + 0.992188f, 0.146973f, 0.993164f, 0.138306f, 0.994141f, 0.130005f, 0.994141f, 0.122742f, + 0.994629f, 0.116089f, 0.994629f, 0.109680f, 0.994629f, 0.103882f, 0.994629f, 0.098389f, + 0.995117f, 0.093140f, 0.995117f, 0.088257f, 0.995117f, 0.083679f, 0.995605f, 0.079224f, + 0.995605f, 0.075073f, 0.995605f, 0.071167f, 0.996094f, 0.067261f, 0.996094f, 0.063721f, + 0.996582f, 0.060242f, 0.996582f, 0.056915f, 0.996582f, 0.053772f, 0.997070f, 0.050629f, + 0.997070f, 0.047729f, 0.997559f, 0.044769f, 0.998047f, 0.041962f, 0.998535f, 0.039215f, + 0.999023f, 0.036469f, 0.999512f, 0.033752f, 0.999512f, 0.031311f, 0.999512f, 0.029022f, + 0.999512f, 0.026840f, 0.999512f, 0.024734f, 0.999512f, 0.022720f, 0.999512f, 0.020782f, + 0.999512f, 0.018921f, 0.999512f, 0.017120f, 0.999512f, 0.015404f, 0.999512f, 0.013741f, + 0.999512f, 0.012138f, 0.999512f, 0.010597f, 0.999512f, 0.009125f, 0.999512f, 0.007717f, + 0.999512f, 0.006378f, 0.999512f, 0.005108f, 0.999512f, 0.003922f, 0.999512f, 0.002823f, + 0.999512f, 0.001834f, 0.999512f, 0.000981f, 0.999512f, 0.000322f, 0.999512f, 0.000008f, + 0.000000f, 1.000000f, 0.901855f, 0.619629f, 0.946289f, 0.500488f, 0.963867f, 0.426758f, + 0.971680f, 0.374512f, 0.977539f, 0.333740f, 0.980957f, 0.301025f, 0.984375f, 0.273193f, + 0.985840f, 0.250488f, 0.988281f, 0.230347f, 0.989258f, 0.212891f, 0.990234f, 0.197510f, + 0.990723f, 0.183838f, 0.991699f, 0.171387f, 0.992188f, 0.160156f, 0.994141f, 0.149536f, + 0.994141f, 0.140137f, 0.994141f, 0.131714f, 0.994629f, 0.123779f, 0.994629f, 0.116577f, + 0.994629f, 0.109924f, 0.995117f, 0.103577f, 0.995117f, 0.097717f, 0.995605f, 0.092224f, + 0.995605f, 0.087036f, 0.995605f, 0.082214f, 0.996094f, 0.077515f, 0.996094f, 0.073242f, + 0.996582f, 0.069031f, 0.996582f, 0.065125f, 0.997070f, 0.061401f, 0.997070f, 0.057831f, + 0.997559f, 0.054382f, 0.997559f, 0.051117f, 0.998047f, 0.047913f, 0.998535f, 0.044800f, + 0.999512f, 0.041626f, 0.999512f, 0.038818f, 0.999512f, 0.036194f, 0.999512f, 0.033722f, + 0.999512f, 0.031372f, 0.999512f, 0.029144f, 0.999512f, 0.027008f, 0.999512f, 0.024963f, + 0.999512f, 0.022995f, 0.999512f, 0.021118f, 0.999512f, 0.019318f, 0.999512f, 0.017593f, + 0.999512f, 0.015945f, 0.999512f, 0.014366f, 0.999512f, 0.012856f, 0.999512f, 0.011398f, + 0.999512f, 0.010017f, 0.999512f, 0.008690f, 0.999512f, 0.007435f, 0.999512f, 0.006241f, + 0.999512f, 0.005116f, 0.999512f, 0.004063f, 0.999512f, 0.003088f, 0.999512f, 0.002197f, + 0.999512f, 0.001409f, 0.999512f, 0.000741f, 0.999512f, 0.000237f, 0.999512f, 0.000006f, + 0.000000f, 1.000000f, 0.912598f, 0.617676f, 0.952637f, 0.498779f, 0.968262f, 0.424805f, + 0.976074f, 0.371826f, 0.980469f, 0.330566f, 0.983887f, 0.297363f, 0.985840f, 0.270020f, + 0.988770f, 0.246094f, 0.989258f, 0.226196f, 0.990234f, 0.208618f, 0.991211f, 0.193115f, + 0.992188f, 0.178955f, 0.993652f, 0.166138f, 0.994141f, 0.154663f, 0.994141f, 0.144531f, + 0.994629f, 0.135132f, 0.994629f, 0.126709f, 0.995117f, 0.118774f, 0.995117f, 0.111511f, + 0.995117f, 0.104797f, 0.995605f, 0.098450f, 0.995605f, 0.092590f, 0.996094f, 0.087036f, + 0.996094f, 0.081909f, 0.996582f, 0.076965f, 0.996582f, 0.072388f, 0.997070f, 0.067993f, + 0.997559f, 0.063904f, 0.997559f, 0.059967f, 0.998047f, 0.056152f, 0.999023f, 0.052460f, + 0.999512f, 0.048828f, 0.999512f, 0.045593f, 0.999512f, 0.042603f, 0.999512f, 0.039795f, + 0.999512f, 0.037109f, 0.999512f, 0.034576f, 0.999512f, 0.032196f, 0.999512f, 0.029907f, + 0.999512f, 0.027740f, 0.999512f, 0.025665f, 0.999512f, 0.023697f, 0.999512f, 0.021820f, + 0.999512f, 0.020020f, 0.999512f, 0.018311f, 0.999512f, 0.016678f, 0.999512f, 0.015121f, + 0.999512f, 0.013634f, 0.999512f, 0.012222f, 0.999512f, 0.010872f, 0.999512f, 0.009590f, + 0.999512f, 0.008377f, 0.999512f, 0.007225f, 0.999512f, 0.006138f, 0.999512f, 0.005116f, + 0.999512f, 0.004162f, 0.999512f, 0.003277f, 0.999512f, 0.002466f, 0.999512f, 0.001737f, + 0.999512f, 0.001098f, 0.999512f, 0.000568f, 0.999512f, 0.000177f, 0.999512f, 0.000004f, + 0.000000f, 1.000000f, 0.921387f, 0.616211f, 0.958496f, 0.497314f, 0.972656f, 0.422852f, + 0.979004f, 0.369629f, 0.983887f, 0.327881f, 0.985840f, 0.294678f, 0.988770f, 0.266602f, + 0.989258f, 0.243286f, 0.990723f, 0.222778f, 0.991699f, 0.205078f, 0.993652f, 0.188599f, + 0.994141f, 0.174561f, 0.994141f, 0.161987f, 0.994629f, 0.150635f, 0.994629f, 0.140503f, + 0.995117f, 0.130981f, 0.995117f, 0.122498f, 0.995605f, 0.114502f, 0.995605f, 0.107239f, + 0.996094f, 0.100342f, 0.996094f, 0.094055f, 0.996582f, 0.088074f, 0.996582f, 0.082642f, + 0.997070f, 0.077332f, 0.997559f, 0.072388f, 0.998047f, 0.067749f, 0.998535f, 0.063293f, + 0.999512f, 0.058868f, 0.999512f, 0.054901f, 0.999512f, 0.051300f, 0.999512f, 0.047913f, + 0.999512f, 0.044739f, 0.999512f, 0.041718f, 0.999512f, 0.038910f, 0.999512f, 0.036224f, + 0.999512f, 0.033691f, 0.999512f, 0.031311f, 0.999512f, 0.029053f, 0.999512f, 0.026901f, + 0.999512f, 0.024857f, 0.999512f, 0.022903f, 0.999512f, 0.021072f, 0.999512f, 0.019318f, + 0.999512f, 0.017654f, 0.999512f, 0.016068f, 0.999512f, 0.014572f, 0.999512f, 0.013153f, + 0.999512f, 0.011803f, 0.999512f, 0.010521f, 0.999512f, 0.009308f, 0.999512f, 0.008171f, + 0.999512f, 0.007092f, 0.999512f, 0.006081f, 0.999512f, 0.005131f, 0.999512f, 0.004246f, + 0.999512f, 0.003428f, 0.999512f, 0.002676f, 0.999512f, 0.001995f, 0.999512f, 0.001390f, + 0.999512f, 0.000868f, 0.999512f, 0.000442f, 0.999512f, 0.000135f, 0.999512f, 0.000003f, + 0.000000f, 1.000000f, 0.929688f, 0.614746f, 0.962891f, 0.496338f, 0.975098f, 0.421875f, + 0.981934f, 0.367676f, 0.984863f, 0.326416f, 0.988281f, 0.291992f, 0.989258f, 0.264404f, + 0.990723f, 0.240601f, 0.992188f, 0.219849f, 0.993652f, 0.201294f, 0.994141f, 0.185425f, + 0.994141f, 0.171509f, 0.994629f, 0.158813f, 0.994629f, 0.147461f, 0.995117f, 0.136963f, + 0.995605f, 0.127563f, 0.995605f, 0.118896f, 0.996094f, 0.110840f, 0.996094f, 0.103516f, + 0.996582f, 0.096558f, 0.997070f, 0.090149f, 0.997559f, 0.084106f, 0.998047f, 0.078491f, + 0.998535f, 0.073120f, 0.999512f, 0.067871f, 0.999512f, 0.063232f, 0.999512f, 0.059021f, + 0.999512f, 0.055054f, 0.999512f, 0.051361f, 0.999512f, 0.047913f, 0.999512f, 0.044647f, + 0.999512f, 0.041565f, 0.999512f, 0.038696f, 0.999512f, 0.035950f, 0.999512f, 0.033386f, + 0.999512f, 0.030975f, 0.999512f, 0.028671f, 0.999512f, 0.026505f, 0.999512f, 0.024460f, + 0.999512f, 0.022522f, 0.999512f, 0.020676f, 0.999512f, 0.018936f, 0.999512f, 0.017303f, + 0.999512f, 0.015747f, 0.999512f, 0.014275f, 0.999512f, 0.012886f, 0.999512f, 0.011574f, + 0.999512f, 0.010338f, 0.999512f, 0.009171f, 0.999512f, 0.008072f, 0.999512f, 0.007046f, + 0.999512f, 0.006081f, 0.999512f, 0.005180f, 0.999512f, 0.004341f, 0.999512f, 0.003571f, + 0.999512f, 0.002859f, 0.999512f, 0.002214f, 0.999512f, 0.001636f, 0.999512f, 0.001127f, + 0.999512f, 0.000695f, 0.999512f, 0.000348f, 0.999512f, 0.000104f, 0.999512f, 0.000002f, + 0.000000f, 1.000000f, 0.936035f, 0.614258f, 0.966797f, 0.495605f, 0.978027f, 0.420654f, + 0.983398f, 0.366699f, 0.987793f, 0.324219f, 0.989258f, 0.290527f, 0.990234f, 0.262451f, + 0.992676f, 0.238037f, 0.993652f, 0.216919f, 0.994141f, 0.198853f, 0.994141f, 0.183105f, + 0.994629f, 0.168823f, 0.995117f, 0.156006f, 0.995117f, 0.144653f, 0.995605f, 0.134033f, + 0.996094f, 0.124512f, 0.996582f, 0.115723f, 0.996582f, 0.107666f, 0.997070f, 0.100098f, + 0.997559f, 0.093140f, 0.998535f, 0.086487f, 0.999512f, 0.080139f, 0.999512f, 0.074463f, + 0.999512f, 0.069336f, 0.999512f, 0.064575f, 0.999512f, 0.060181f, 0.999512f, 0.056030f, + 0.999512f, 0.052185f, 0.999512f, 0.048584f, 0.999512f, 0.045197f, 0.999512f, 0.041992f, + 0.999512f, 0.039001f, 0.999512f, 0.036194f, 0.999512f, 0.033569f, 0.999512f, 0.031082f, + 0.999512f, 0.028732f, 0.999512f, 0.026520f, 0.999512f, 0.024429f, 0.999512f, 0.022461f, + 0.999512f, 0.020615f, 0.999512f, 0.018860f, 0.999512f, 0.017212f, 0.999512f, 0.015656f, + 0.999512f, 0.014198f, 0.999512f, 0.012817f, 0.999512f, 0.011520f, 0.999512f, 0.010307f, + 0.999512f, 0.009155f, 0.999512f, 0.008087f, 0.999512f, 0.007084f, 0.999512f, 0.006145f, + 0.999512f, 0.005276f, 0.999512f, 0.004467f, 0.999512f, 0.003723f, 0.999512f, 0.003038f, + 0.999512f, 0.002415f, 0.999512f, 0.001856f, 0.999512f, 0.001358f, 0.999512f, 0.000926f, + 0.999512f, 0.000564f, 0.999512f, 0.000278f, 0.999512f, 0.000081f, 0.999512f, 0.000002f, + 0.000000f, 1.000000f, 0.942383f, 0.613281f, 0.970703f, 0.494385f, 0.980957f, 0.419678f, + 0.985840f, 0.365479f, 0.988770f, 0.322998f, 0.990234f, 0.289062f, 0.992676f, 0.260010f, + 0.993652f, 0.235718f, 0.994141f, 0.214966f, 0.994629f, 0.196899f, 0.994629f, 0.180908f, + 0.995117f, 0.166504f, 0.995605f, 0.153564f, 0.996094f, 0.141968f, 0.996094f, 0.131470f, + 0.996582f, 0.121826f, 0.997070f, 0.112915f, 0.998047f, 0.104553f, 0.999023f, 0.096741f, + 0.999512f, 0.089478f, 0.999512f, 0.083069f, 0.999512f, 0.077209f, 0.999512f, 0.071777f, + 0.999512f, 0.066711f, 0.999512f, 0.062073f, 0.999512f, 0.057709f, 0.999512f, 0.053650f, + 0.999512f, 0.049835f, 0.999512f, 0.046295f, 0.999512f, 0.042969f, 0.999512f, 0.039856f, + 0.999512f, 0.036926f, 0.999512f, 0.034180f, 0.999512f, 0.031586f, 0.999512f, 0.029175f, + 0.999512f, 0.026886f, 0.999512f, 0.024750f, 0.999512f, 0.022736f, 0.999512f, 0.020844f, + 0.999512f, 0.019058f, 0.999512f, 0.017380f, 0.999512f, 0.015808f, 0.999512f, 0.014328f, + 0.999512f, 0.012939f, 0.999512f, 0.011642f, 0.999512f, 0.010422f, 0.999512f, 0.009277f, + 0.999512f, 0.008209f, 0.999512f, 0.007214f, 0.999512f, 0.006290f, 0.999512f, 0.005428f, + 0.999512f, 0.004635f, 0.999512f, 0.003902f, 0.999512f, 0.003231f, 0.999512f, 0.002619f, + 0.999512f, 0.002068f, 0.999512f, 0.001575f, 0.999512f, 0.001143f, 0.999512f, 0.000772f, + 0.999512f, 0.000464f, 0.999512f, 0.000226f, 0.999512f, 0.000065f, 0.999512f, 0.000001f, + 0.000000f, 1.000000f, 0.947266f, 0.612793f, 0.973633f, 0.494141f, 0.982422f, 0.418945f, + 0.987793f, 0.364014f, 0.989258f, 0.322266f, 0.992188f, 0.287354f, 0.993652f, 0.258301f, + 0.994141f, 0.234375f, 0.994141f, 0.213501f, 0.994629f, 0.195190f, 0.995117f, 0.178955f, + 0.995605f, 0.164551f, 0.996094f, 0.151489f, 0.996582f, 0.139771f, 0.997070f, 0.129028f, + 0.998047f, 0.119080f, 0.999512f, 0.109741f, 0.999512f, 0.101379f, 0.999512f, 0.093872f, + 0.999512f, 0.087036f, 0.999512f, 0.080811f, 0.999512f, 0.074951f, 0.999512f, 0.069580f, + 0.999512f, 0.064636f, 0.999512f, 0.059998f, 0.999512f, 0.055695f, 0.999512f, 0.051666f, + 0.999512f, 0.047913f, 0.999512f, 0.044403f, 0.999512f, 0.041107f, 0.999512f, 0.038055f, + 0.999512f, 0.035187f, 0.999512f, 0.032471f, 0.999512f, 0.029968f, 0.999512f, 0.027588f, + 0.999512f, 0.025375f, 0.999512f, 0.023285f, 0.999512f, 0.021332f, 0.999512f, 0.019501f, + 0.999512f, 0.017776f, 0.999512f, 0.016159f, 0.999512f, 0.014656f, 0.999512f, 0.013237f, + 0.999512f, 0.011917f, 0.999512f, 0.010674f, 0.999512f, 0.009521f, 0.999512f, 0.008446f, + 0.999512f, 0.007442f, 0.999512f, 0.006512f, 0.999512f, 0.005650f, 0.999512f, 0.004852f, + 0.999512f, 0.004120f, 0.999512f, 0.003450f, 0.999512f, 0.002840f, 0.999512f, 0.002287f, + 0.999512f, 0.001793f, 0.999512f, 0.001355f, 0.999512f, 0.000975f, 0.999512f, 0.000652f, + 0.999512f, 0.000388f, 0.999512f, 0.000186f, 0.999512f, 0.000052f, 0.999512f, 0.000001f, + 0.000000f, 1.000000f, 0.951660f, 0.612305f, 0.976074f, 0.493652f, 0.983887f, 0.418457f, + 0.988281f, 0.363525f, 0.990723f, 0.321045f, 0.993164f, 0.285889f, 0.993652f, 0.257324f, + 0.994141f, 0.233154f, 0.994629f, 0.212158f, 0.995117f, 0.193726f, 0.995605f, 0.177368f, + 0.996582f, 0.162720f, 0.997070f, 0.149414f, 0.997559f, 0.137573f, 0.999023f, 0.126343f, + 0.999512f, 0.116272f, 0.999512f, 0.107422f, 0.999512f, 0.099365f, 0.999512f, 0.091980f, + 0.999512f, 0.085205f, 0.999512f, 0.078979f, 0.999512f, 0.073181f, 0.999512f, 0.067810f, + 0.999512f, 0.062866f, 0.999512f, 0.058289f, 0.999512f, 0.054016f, 0.999512f, 0.050018f, + 0.999512f, 0.046295f, 0.999512f, 0.042847f, 0.999512f, 0.039612f, 0.999512f, 0.036560f, + 0.999512f, 0.033722f, 0.999512f, 0.031097f, 0.999512f, 0.028610f, 0.999512f, 0.026291f, + 0.999512f, 0.024109f, 0.999512f, 0.022079f, 0.999512f, 0.020172f, 0.999512f, 0.018387f, + 0.999512f, 0.016724f, 0.999512f, 0.015167f, 0.999512f, 0.013710f, 0.999512f, 0.012344f, + 0.999512f, 0.011078f, 0.999512f, 0.009895f, 0.999512f, 0.008789f, 0.999512f, 0.007771f, + 0.999512f, 0.006821f, 0.999512f, 0.005943f, 0.999512f, 0.005135f, 0.999512f, 0.004391f, + 0.999512f, 0.003710f, 0.999512f, 0.003090f, 0.999512f, 0.002529f, 0.999512f, 0.002024f, + 0.999512f, 0.001576f, 0.999512f, 0.001183f, 0.999512f, 0.000844f, 0.999512f, 0.000559f, + 0.999512f, 0.000329f, 0.999512f, 0.000155f, 0.999512f, 0.000043f, 0.999512f, 0.000001f, + 0.000000f, 1.000000f, 0.955078f, 0.612305f, 0.978516f, 0.493164f, 0.986816f, 0.417480f, + 0.989258f, 0.363037f, 0.992676f, 0.319580f, 0.993652f, 0.285156f, 0.994141f, 0.256348f, + 0.994629f, 0.232056f, 0.995117f, 0.210938f, 0.996094f, 0.192261f, 0.996582f, 0.175659f, + 0.997070f, 0.160889f, 0.998535f, 0.147339f, 0.999512f, 0.134888f, 0.999512f, 0.124268f, + 0.999512f, 0.114563f, 0.999512f, 0.105774f, 0.999512f, 0.097778f, 0.999512f, 0.090454f, + 0.999512f, 0.083679f, 0.999512f, 0.077454f, 0.999512f, 0.071716f, 0.999512f, 0.066406f, + 0.999512f, 0.061462f, 0.999512f, 0.056885f, 0.999512f, 0.052612f, 0.999512f, 0.048676f, + 0.999512f, 0.044983f, 0.999512f, 0.041534f, 0.999512f, 0.038330f, 0.999512f, 0.035339f, + 0.999512f, 0.032532f, 0.999512f, 0.029938f, 0.999512f, 0.027496f, 0.999512f, 0.025208f, + 0.999512f, 0.023087f, 0.999512f, 0.021088f, 0.999512f, 0.019226f, 0.999512f, 0.017487f, + 0.999512f, 0.015854f, 0.999512f, 0.014351f, 0.999512f, 0.012932f, 0.999512f, 0.011620f, + 0.999512f, 0.010391f, 0.999512f, 0.009254f, 0.999512f, 0.008194f, 0.999512f, 0.007221f, + 0.999512f, 0.006317f, 0.999512f, 0.005486f, 0.999512f, 0.004719f, 0.999512f, 0.004017f, + 0.999512f, 0.003380f, 0.999512f, 0.002802f, 0.999512f, 0.002281f, 0.999512f, 0.001817f, + 0.999512f, 0.001406f, 0.999512f, 0.001047f, 0.999512f, 0.000741f, 0.999512f, 0.000487f, + 0.999512f, 0.000283f, 0.999512f, 0.000132f, 0.999512f, 0.000036f, 0.999512f, 0.000001f, + 0.000000f, 1.000000f, 0.958496f, 0.612305f, 0.979980f, 0.492920f, 0.987305f, 0.417236f, + 0.990723f, 0.362305f, 0.993164f, 0.319092f, 0.993652f, 0.284668f, 0.994629f, 0.255615f, + 0.995117f, 0.231079f, 0.996094f, 0.209717f, 0.996582f, 0.190918f, 0.997559f, 0.174072f, + 0.999512f, 0.158569f, 0.999512f, 0.145264f, 0.999512f, 0.133545f, 0.999512f, 0.122925f, + 0.999512f, 0.113281f, 0.999512f, 0.104492f, 0.999512f, 0.096497f, 0.999512f, 0.089172f, + 0.999512f, 0.082397f, 0.999512f, 0.076233f, 0.999512f, 0.070496f, 0.999512f, 0.065186f, + 0.999512f, 0.060272f, 0.999512f, 0.055695f, 0.999512f, 0.051483f, 0.999512f, 0.047546f, + 0.999512f, 0.043884f, 0.999512f, 0.040466f, 0.999512f, 0.037292f, 0.999512f, 0.034332f, + 0.999512f, 0.031555f, 0.999512f, 0.028976f, 0.999512f, 0.026581f, 0.999512f, 0.024323f, + 0.999512f, 0.022232f, 0.999512f, 0.020279f, 0.999512f, 0.018448f, 0.999512f, 0.016739f, + 0.999512f, 0.015160f, 0.999512f, 0.013680f, 0.999512f, 0.012306f, 0.999512f, 0.011024f, + 0.999512f, 0.009834f, 0.999512f, 0.008736f, 0.999512f, 0.007717f, 0.999512f, 0.006779f, + 0.999512f, 0.005913f, 0.999512f, 0.005116f, 0.999512f, 0.004387f, 0.999512f, 0.003721f, + 0.999512f, 0.003119f, 0.999512f, 0.002573f, 0.999512f, 0.002085f, 0.999512f, 0.001652f, + 0.999512f, 0.001270f, 0.999512f, 0.000941f, 0.999512f, 0.000661f, 0.999512f, 0.000430f, + 0.999512f, 0.000248f, 0.999512f, 0.000114f, 0.999512f, 0.000030f, 0.999512f, 0.000001f, + 0.000000f, 1.000000f, 0.961914f, 0.611816f, 0.981934f, 0.492676f, 0.988281f, 0.417236f, + 0.992188f, 0.361328f, 0.993164f, 0.318848f, 0.994141f, 0.283936f, 0.995117f, 0.254883f, + 0.995605f, 0.230225f, 0.996582f, 0.208496f, 0.998047f, 0.189331f, 0.999512f, 0.171997f, + 0.999512f, 0.157227f, 0.999512f, 0.144165f, 0.999512f, 0.132446f, 0.999512f, 0.121826f, + 0.999512f, 0.112244f, 0.999512f, 0.103455f, 0.999512f, 0.095459f, 0.999512f, 0.088135f, + 0.999512f, 0.081421f, 0.999512f, 0.075195f, 0.999512f, 0.069458f, 0.999512f, 0.064148f, + 0.999512f, 0.059296f, 0.999512f, 0.054749f, 0.999512f, 0.050537f, 0.999512f, 0.046600f, + 0.999512f, 0.042969f, 0.999512f, 0.039581f, 0.999512f, 0.036438f, 0.999512f, 0.033478f, + 0.999512f, 0.030746f, 0.999512f, 0.028198f, 0.999512f, 0.025818f, 0.999512f, 0.023605f, + 0.999512f, 0.021530f, 0.999512f, 0.019608f, 0.999512f, 0.017807f, 0.999512f, 0.016129f, + 0.999512f, 0.014580f, 0.999512f, 0.013138f, 0.999512f, 0.011787f, 0.999512f, 0.010544f, + 0.999512f, 0.009384f, 0.999512f, 0.008316f, 0.999512f, 0.007332f, 0.999512f, 0.006420f, + 0.999512f, 0.005585f, 0.999512f, 0.004818f, 0.999512f, 0.004120f, 0.999512f, 0.003483f, + 0.999512f, 0.002909f, 0.999512f, 0.002392f, 0.999512f, 0.001929f, 0.999512f, 0.001521f, + 0.999512f, 0.001164f, 0.999512f, 0.000858f, 0.999512f, 0.000599f, 0.999512f, 0.000387f, + 0.999512f, 0.000221f, 0.999512f, 0.000101f, 0.999512f, 0.000026f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.964355f, 0.611816f, 0.984863f, 0.491699f, 0.989258f, 0.416748f, + 0.992676f, 0.361084f, 0.993652f, 0.318359f, 0.994629f, 0.283447f, 0.995605f, 0.254150f, + 0.996582f, 0.229126f, 0.998047f, 0.207153f, 0.999512f, 0.187500f, 0.999512f, 0.171021f, + 0.999512f, 0.156372f, 0.999512f, 0.143311f, 0.999512f, 0.131592f, 0.999512f, 0.120972f, + 0.999512f, 0.111389f, 0.999512f, 0.102600f, 0.999512f, 0.094604f, 0.999512f, 0.087280f, + 0.999512f, 0.080566f, 0.999512f, 0.074341f, 0.999512f, 0.068604f, 0.999512f, 0.063354f, + 0.999512f, 0.058472f, 0.999512f, 0.053955f, 0.999512f, 0.049744f, 0.999512f, 0.045837f, + 0.999512f, 0.042236f, 0.999512f, 0.038849f, 0.999512f, 0.035706f, 0.999512f, 0.032806f, + 0.999512f, 0.030090f, 0.999512f, 0.027557f, 0.999512f, 0.025208f, 0.999512f, 0.023010f, + 0.999512f, 0.020966f, 0.999512f, 0.019058f, 0.999512f, 0.017288f, 0.999512f, 0.015640f, + 0.999512f, 0.014114f, 0.999512f, 0.012695f, 0.999512f, 0.011375f, 0.999512f, 0.010155f, + 0.999512f, 0.009026f, 0.999512f, 0.007980f, 0.999512f, 0.007019f, 0.999512f, 0.006134f, + 0.999512f, 0.005325f, 0.999512f, 0.004581f, 0.999512f, 0.003906f, 0.999512f, 0.003296f, + 0.999512f, 0.002743f, 0.999512f, 0.002247f, 0.999512f, 0.001807f, 0.999512f, 0.001419f, + 0.999512f, 0.001081f, 0.999512f, 0.000793f, 0.999512f, 0.000550f, 0.999512f, 0.000353f, + 0.999512f, 0.000200f, 0.999512f, 0.000090f, 0.999512f, 0.000023f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.967285f, 0.611328f, 0.985352f, 0.491943f, 0.991699f, 0.415527f, + 0.993164f, 0.360840f, 0.994141f, 0.317871f, 0.995117f, 0.282959f, 0.996582f, 0.253418f, + 0.998047f, 0.227905f, 0.999512f, 0.205444f, 0.999512f, 0.186768f, 0.999512f, 0.170288f, + 0.999512f, 0.155640f, 0.999512f, 0.142578f, 0.999512f, 0.130859f, 0.999512f, 0.120300f, + 0.999512f, 0.110718f, 0.999512f, 0.101929f, 0.999512f, 0.093933f, 0.999512f, 0.086609f, + 0.999512f, 0.079834f, 0.999512f, 0.073669f, 0.999512f, 0.067932f, 0.999512f, 0.062683f, + 0.999512f, 0.057800f, 0.999512f, 0.053284f, 0.999512f, 0.049103f, 0.999512f, 0.045227f, + 0.999512f, 0.041626f, 0.999512f, 0.038269f, 0.999512f, 0.035156f, 0.999512f, 0.032257f, + 0.999512f, 0.029556f, 0.999512f, 0.027039f, 0.999512f, 0.024704f, 0.999512f, 0.022537f, + 0.999512f, 0.020508f, 0.999512f, 0.018631f, 0.999512f, 0.016876f, 0.999512f, 0.015251f, + 0.999512f, 0.013748f, 0.999512f, 0.012344f, 0.999512f, 0.011047f, 0.999512f, 0.009850f, + 0.999512f, 0.008736f, 0.999512f, 0.007717f, 0.999512f, 0.006775f, 0.999512f, 0.005909f, + 0.999512f, 0.005119f, 0.999512f, 0.004395f, 0.999512f, 0.003740f, 0.999512f, 0.003147f, + 0.999512f, 0.002613f, 0.999512f, 0.002136f, 0.999512f, 0.001712f, 0.999512f, 0.001340f, + 0.999512f, 0.001018f, 0.999512f, 0.000743f, 0.999512f, 0.000514f, 0.999512f, 0.000328f, + 0.999512f, 0.000184f, 0.999512f, 0.000082f, 0.999512f, 0.000021f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.969238f, 0.611328f, 0.985840f, 0.491943f, 0.991699f, 0.415527f, + 0.993164f, 0.360840f, 0.994629f, 0.317627f, 0.996094f, 0.282227f, 0.997559f, 0.252197f, + 0.999512f, 0.226318f, 0.999512f, 0.204956f, 0.999512f, 0.186279f, 0.999512f, 0.169800f, + 0.999512f, 0.155151f, 0.999512f, 0.142090f, 0.999512f, 0.130371f, 0.999512f, 0.119751f, + 0.999512f, 0.110107f, 0.999512f, 0.101379f, 0.999512f, 0.093384f, 0.999512f, 0.085999f, + 0.999512f, 0.079285f, 0.999512f, 0.073120f, 0.999512f, 0.067383f, 0.999512f, 0.062164f, + 0.999512f, 0.057281f, 0.999512f, 0.052765f, 0.999512f, 0.048615f, 0.999512f, 0.044739f, + 0.999512f, 0.041138f, 0.999512f, 0.037781f, 0.999512f, 0.034698f, 0.999512f, 0.031799f, + 0.999512f, 0.029129f, 0.999512f, 0.026627f, 0.999512f, 0.024307f, 0.999512f, 0.022156f, + 0.999512f, 0.020142f, 0.999512f, 0.018280f, 0.999512f, 0.016556f, 0.999512f, 0.014946f, + 0.999512f, 0.013451f, 0.999512f, 0.012070f, 0.999512f, 0.010788f, 0.999512f, 0.009605f, + 0.999512f, 0.008514f, 0.999512f, 0.007507f, 0.999512f, 0.006580f, 0.999512f, 0.005733f, + 0.999512f, 0.004959f, 0.999512f, 0.004253f, 0.999512f, 0.003613f, 0.999512f, 0.003033f, + 0.999512f, 0.002512f, 0.999512f, 0.002048f, 0.999512f, 0.001639f, 0.999512f, 0.001280f, + 0.999512f, 0.000969f, 0.999512f, 0.000705f, 0.999512f, 0.000485f, 0.999512f, 0.000308f, + 0.999512f, 0.000173f, 0.999512f, 0.000077f, 0.999512f, 0.000019f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.971680f, 0.610840f, 0.986816f, 0.491943f, 0.992188f, 0.415771f, + 0.993652f, 0.360596f, 0.995117f, 0.317139f, 0.997070f, 0.281250f, 0.999512f, 0.250732f, + 0.999512f, 0.225952f, 0.999512f, 0.204468f, 0.999512f, 0.185791f, 0.999512f, 0.169434f, + 0.999512f, 0.154785f, 0.999512f, 0.141724f, 0.999512f, 0.129883f, 0.999512f, 0.119324f, + 0.999512f, 0.109680f, 0.999512f, 0.100952f, 0.999512f, 0.092896f, 0.999512f, 0.085571f, + 0.999512f, 0.078857f, 0.999512f, 0.072693f, 0.999512f, 0.066956f, 0.999512f, 0.061737f, + 0.999512f, 0.056854f, 0.999512f, 0.052368f, 0.999512f, 0.048187f, 0.999512f, 0.044342f, + 0.999512f, 0.040741f, 0.999512f, 0.037415f, 0.999512f, 0.034332f, 0.999512f, 0.031464f, + 0.999512f, 0.028793f, 0.999512f, 0.026306f, 0.999512f, 0.024002f, 0.999512f, 0.021866f, + 0.999512f, 0.019867f, 0.999512f, 0.018021f, 0.999512f, 0.016296f, 0.999512f, 0.014702f, + 0.999512f, 0.013222f, 0.999512f, 0.011856f, 0.999512f, 0.010590f, 0.999512f, 0.009415f, + 0.999512f, 0.008339f, 0.999512f, 0.007347f, 0.999512f, 0.006435f, 0.999512f, 0.005600f, + 0.999512f, 0.004837f, 0.999512f, 0.004143f, 0.999512f, 0.003513f, 0.999512f, 0.002945f, + 0.999512f, 0.002438f, 0.999512f, 0.001984f, 0.999512f, 0.001584f, 0.999512f, 0.001234f, + 0.999512f, 0.000932f, 0.999512f, 0.000677f, 0.999512f, 0.000464f, 0.999512f, 0.000294f, + 0.999512f, 0.000164f, 0.999512f, 0.000072f, 0.999512f, 0.000018f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.973145f, 0.610840f, 0.989258f, 0.490723f, 0.992188f, 0.415771f, + 0.994141f, 0.360352f, 0.996094f, 0.316406f, 0.999512f, 0.279541f, 0.999512f, 0.250244f, + 0.999512f, 0.225586f, 0.999512f, 0.204224f, 0.999512f, 0.185547f, 0.999512f, 0.169067f, + 0.999512f, 0.154419f, 0.999512f, 0.141357f, 0.999512f, 0.129639f, 0.999512f, 0.119019f, + 0.999512f, 0.109375f, 0.999512f, 0.100586f, 0.999512f, 0.092590f, 0.999512f, 0.085266f, + 0.999512f, 0.078491f, 0.999512f, 0.072327f, 0.999512f, 0.066650f, 0.999512f, 0.061401f, + 0.999512f, 0.056549f, 0.999512f, 0.052063f, 0.999512f, 0.047882f, 0.999512f, 0.044037f, + 0.999512f, 0.040466f, 0.999512f, 0.037140f, 0.999512f, 0.034058f, 0.999512f, 0.031204f, + 0.999512f, 0.028549f, 0.999512f, 0.026062f, 0.999512f, 0.023773f, 0.999512f, 0.021637f, + 0.999512f, 0.019653f, 0.999512f, 0.017807f, 0.999512f, 0.016098f, 0.999512f, 0.014519f, + 0.999512f, 0.013054f, 0.999512f, 0.011696f, 0.999512f, 0.010437f, 0.999512f, 0.009277f, + 0.999512f, 0.008209f, 0.999512f, 0.007225f, 0.999512f, 0.006325f, 0.999512f, 0.005497f, + 0.999512f, 0.004745f, 0.999512f, 0.004059f, 0.999512f, 0.003441f, 0.999512f, 0.002882f, + 0.999512f, 0.002380f, 0.999512f, 0.001936f, 0.999512f, 0.001543f, 0.999512f, 0.001201f, + 0.999512f, 0.000906f, 0.999512f, 0.000656f, 0.999512f, 0.000449f, 0.999512f, 0.000284f, + 0.999512f, 0.000158f, 0.999512f, 0.000069f, 0.999512f, 0.000017f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.976074f, 0.609863f, 0.989258f, 0.490967f, 0.992676f, 0.415527f, + 0.995117f, 0.359619f, 0.999512f, 0.314697f, 0.999512f, 0.279297f, 0.999512f, 0.250244f, + 0.999512f, 0.225464f, 0.999512f, 0.203979f, 0.999512f, 0.185303f, 0.999512f, 0.168823f, + 0.999512f, 0.154175f, 0.999512f, 0.141113f, 0.999512f, 0.129395f, 0.999512f, 0.118713f, + 0.999512f, 0.109131f, 0.999512f, 0.100342f, 0.999512f, 0.092346f, 0.999512f, 0.085022f, + 0.999512f, 0.078247f, 0.999512f, 0.072083f, 0.999512f, 0.066406f, 0.999512f, 0.061157f, + 0.999512f, 0.056305f, 0.999512f, 0.051819f, 0.999512f, 0.047668f, 0.999512f, 0.043823f, + 0.999512f, 0.040253f, 0.999512f, 0.036926f, 0.999512f, 0.033875f, 0.999512f, 0.031006f, + 0.999512f, 0.028351f, 0.999512f, 0.025894f, 0.999512f, 0.023605f, 0.999512f, 0.021469f, + 0.999512f, 0.019501f, 0.999512f, 0.017670f, 0.999512f, 0.015961f, 0.999512f, 0.014389f, + 0.999512f, 0.012932f, 0.999512f, 0.011574f, 0.999512f, 0.010330f, 0.999512f, 0.009178f, + 0.999512f, 0.008118f, 0.999512f, 0.007141f, 0.999512f, 0.006245f, 0.999512f, 0.005428f, + 0.999512f, 0.004681f, 0.999512f, 0.004002f, 0.999512f, 0.003389f, 0.999512f, 0.002836f, + 0.999512f, 0.002342f, 0.999512f, 0.001903f, 0.999512f, 0.001515f, 0.999512f, 0.001178f, + 0.999512f, 0.000887f, 0.999512f, 0.000641f, 0.999512f, 0.000439f, 0.999512f, 0.000277f, + 0.999512f, 0.000153f, 0.999512f, 0.000067f, 0.999512f, 0.000017f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.977539f, 0.609863f, 0.989258f, 0.491211f, 0.993164f, 0.415283f, + 0.996582f, 0.358887f, 0.999512f, 0.313965f, 0.999512f, 0.279053f, 0.999512f, 0.250000f, + 0.999512f, 0.225342f, 0.999512f, 0.203857f, 0.999512f, 0.185181f, 0.999512f, 0.168701f, + 0.999512f, 0.154053f, 0.999512f, 0.140991f, 0.999512f, 0.129150f, 0.999512f, 0.118591f, + 0.999512f, 0.108948f, 0.999512f, 0.100159f, 0.999512f, 0.092163f, 0.999512f, 0.084839f, + 0.999512f, 0.078125f, 0.999512f, 0.071899f, 0.999512f, 0.066223f, 0.999512f, 0.061005f, + 0.999512f, 0.056152f, 0.999512f, 0.051666f, 0.999512f, 0.047516f, 0.999512f, 0.043671f, + 0.999512f, 0.040100f, 0.999512f, 0.036804f, 0.999512f, 0.033722f, 0.999512f, 0.030884f, + 0.999512f, 0.028229f, 0.999512f, 0.025772f, 0.999512f, 0.023483f, 0.999512f, 0.021362f, + 0.999512f, 0.019394f, 0.999512f, 0.017563f, 0.999512f, 0.015869f, 0.999512f, 0.014305f, + 0.999512f, 0.012848f, 0.999512f, 0.011497f, 0.999512f, 0.010254f, 0.999512f, 0.009109f, + 0.999512f, 0.008057f, 0.999512f, 0.007084f, 0.999512f, 0.006195f, 0.999512f, 0.005379f, + 0.999512f, 0.004639f, 0.999512f, 0.003963f, 0.999512f, 0.003355f, 0.999512f, 0.002808f, + 0.999512f, 0.002316f, 0.999512f, 0.001881f, 0.999512f, 0.001497f, 0.999512f, 0.001163f, + 0.999512f, 0.000875f, 0.999512f, 0.000632f, 0.999512f, 0.000432f, 0.999512f, 0.000272f, + 0.999512f, 0.000151f, 0.999512f, 0.000066f, 0.999512f, 0.000016f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.978516f, 0.609863f, 0.988281f, 0.491699f, 0.994141f, 0.414795f, + 0.999512f, 0.356934f, 0.999512f, 0.313965f, 0.999512f, 0.279053f, 0.999512f, 0.250000f, + 0.999512f, 0.225220f, 0.999512f, 0.203735f, 0.999512f, 0.185059f, 0.999512f, 0.168579f, + 0.999512f, 0.153931f, 0.999512f, 0.140869f, 0.999512f, 0.129028f, 0.999512f, 0.118469f, + 0.999512f, 0.108826f, 0.999512f, 0.100037f, 0.999512f, 0.092041f, 0.999512f, 0.084717f, + 0.999512f, 0.078003f, 0.999512f, 0.071838f, 0.999512f, 0.066101f, 0.999512f, 0.060883f, + 0.999512f, 0.056061f, 0.999512f, 0.051575f, 0.999512f, 0.047424f, 0.999512f, 0.043579f, + 0.999512f, 0.040009f, 0.999512f, 0.036713f, 0.999512f, 0.033661f, 0.999512f, 0.030807f, + 0.999512f, 0.028168f, 0.999512f, 0.025711f, 0.999512f, 0.023422f, 0.999512f, 0.021301f, + 0.999512f, 0.019333f, 0.999512f, 0.017517f, 0.999512f, 0.015823f, 0.999512f, 0.014252f, + 0.999512f, 0.012802f, 0.999512f, 0.011459f, 0.999512f, 0.010216f, 0.999512f, 0.009071f, + 0.999512f, 0.008018f, 0.999512f, 0.007053f, 0.999512f, 0.006165f, 0.999512f, 0.005352f, + 0.999512f, 0.004616f, 0.999512f, 0.003944f, 0.999512f, 0.003336f, 0.999512f, 0.002790f, + 0.999512f, 0.002302f, 0.999512f, 0.001868f, 0.999512f, 0.001487f, 0.999512f, 0.001154f, + 0.999512f, 0.000868f, 0.999512f, 0.000627f, 0.999512f, 0.000428f, 0.999512f, 0.000270f, + 0.999512f, 0.000149f, 0.999512f, 0.000065f, 0.999512f, 0.000016f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.980957f, 0.608398f, 0.983887f, 0.494385f, 0.999512f, 0.411377f, + 0.999512f, 0.356934f, 0.999512f, 0.313965f, 0.999512f, 0.279053f, 0.999512f, 0.250000f, + 1.000000f, 0.225220f, 0.999512f, 0.203735f, 0.999512f, 0.185059f, 1.000000f, 0.168579f, + 1.000000f, 0.153931f, 1.000000f, 0.140747f, 1.000000f, 0.129028f, 1.000000f, 0.118408f, + 1.000000f, 0.108765f, 1.000000f, 0.099976f, 1.000000f, 0.091980f, 1.000000f, 0.084656f, + 1.000000f, 0.077942f, 1.000000f, 0.071777f, 1.000000f, 0.066101f, 1.000000f, 0.060852f, + 1.000000f, 0.056030f, 1.000000f, 0.051544f, 1.000000f, 0.047394f, 1.000000f, 0.043549f, + 1.000000f, 0.039978f, 1.000000f, 0.036682f, 1.000000f, 0.033630f, 1.000000f, 0.030777f, + 1.000000f, 0.028137f, 1.000000f, 0.025681f, 1.000000f, 0.023392f, 1.000000f, 0.021286f, + 1.000000f, 0.019318f, 1.000000f, 0.017487f, 1.000000f, 0.015793f, 1.000000f, 0.014236f, + 1.000000f, 0.012787f, 1.000000f, 0.011444f, 1.000000f, 0.010201f, 1.000000f, 0.009056f, + 1.000000f, 0.008003f, 1.000000f, 0.007042f, 1.000000f, 0.006153f, 1.000000f, 0.005344f, + 1.000000f, 0.004604f, 1.000000f, 0.003937f, 1.000000f, 0.003330f, 1.000000f, 0.002785f, + 1.000000f, 0.002296f, 1.000000f, 0.001864f, 1.000000f, 0.001483f, 1.000000f, 0.001151f, + 1.000000f, 0.000866f, 1.000000f, 0.000626f, 1.000000f, 0.000427f, 1.000000f, 0.000269f, + 1.000000f, 0.000149f, 1.000000f, 0.000065f, 1.000000f, 0.000016f, 1.000000f, 0.000000f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.998535f, 0.000000f, 0.996582f, 0.000000f, 0.995605f, + 0.000000f, 0.994629f, 0.000000f, 0.993652f, 0.000000f, 0.992188f, 0.000000f, 0.991211f, + 0.000000f, 0.986328f, 0.000000f, 0.979004f, 0.000000f, 0.958008f, 0.000000f, 0.762695f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.997070f, 0.000000f, 0.995605f, + 0.000000f, 0.994141f, 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.990723f, + 0.000000f, 0.986328f, 0.000000f, 0.979004f, 0.000000f, 0.958496f, 0.000000f, 0.762207f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999023f, 0.000000f, 0.998047f, 0.000000f, 0.997070f, 0.000000f, 0.995605f, + 0.000000f, 0.994629f, 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.990234f, + 0.000000f, 0.985840f, 0.000000f, 0.979492f, 0.000000f, 0.958008f, 0.000004f, 0.761719f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.995605f, + 0.000000f, 0.994629f, 0.000000f, 0.993652f, 0.000000f, 0.992188f, 0.000000f, 0.989746f, + 0.000000f, 0.986328f, 0.000000f, 0.979004f, 0.000000f, 0.957031f, 0.000018f, 0.760742f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996094f, + 0.000000f, 0.994629f, 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.989258f, + 0.000000f, 0.986328f, 0.000000f, 0.978516f, 0.000000f, 0.957031f, 0.000067f, 0.758789f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.994629f, 0.000000f, 0.993652f, 0.000000f, 0.991211f, 0.000000f, 0.989258f, + 0.000000f, 0.986328f, 0.000000f, 0.977539f, 0.000117f, 0.956055f, 0.000197f, 0.756348f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.995117f, 0.000000f, 0.993652f, 0.000000f, 0.991211f, 0.000000f, 0.988770f, + 0.000000f, 0.985352f, 0.000000f, 0.977051f, 0.000230f, 0.955078f, 0.000445f, 0.753418f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.995117f, 0.000000f, 0.993652f, 0.000000f, 0.990723f, 0.000000f, 0.988281f, + 0.000000f, 0.984863f, 0.000396f, 0.976074f, 0.000321f, 0.953125f, 0.000923f, 0.750488f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, + 0.000000f, 0.995605f, 0.000000f, 0.992676f, 0.000000f, 0.990234f, 0.000000f, 0.987793f, + 0.000358f, 0.983887f, 0.000641f, 0.975098f, 0.000618f, 0.951172f, 0.001679f, 0.746094f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, + 0.000000f, 0.995117f, 0.000000f, 0.992188f, 0.000000f, 0.990234f, 0.000387f, 0.986816f, + 0.000991f, 0.982910f, 0.000816f, 0.974121f, 0.001087f, 0.949219f, 0.002859f, 0.741699f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, + 0.000000f, 0.994141f, 0.000006f, 0.992676f, 0.000530f, 0.989746f, 0.001236f, 0.986328f, + 0.001287f, 0.981934f, 0.000954f, 0.972168f, 0.001658f, 0.947266f, 0.004513f, 0.736816f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, + 0.000205f, 0.993652f, 0.000805f, 0.992676f, 0.001437f, 0.989258f, 0.001783f, 0.985840f, + 0.001449f, 0.980957f, 0.001559f, 0.971191f, 0.002533f, 0.944336f, 0.006859f, 0.731445f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000081f, 0.995117f, 0.000594f, 0.993652f, + 0.001163f, 0.993164f, 0.001719f, 0.991699f, 0.002253f, 0.988281f, 0.001995f, 0.984375f, + 0.001696f, 0.979004f, 0.002380f, 0.969727f, 0.003784f, 0.940430f, 0.009933f, 0.725586f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, + 0.000082f, 0.995605f, 0.000549f, 0.995117f, 0.001094f, 0.994141f, 0.001608f, 0.993164f, + 0.002090f, 0.992676f, 0.002542f, 0.990723f, 0.002600f, 0.988281f, 0.002073f, 0.983398f, + 0.002438f, 0.978027f, 0.003592f, 0.967773f, 0.005383f, 0.937012f, 0.013847f, 0.718750f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000201f, 0.996094f, 0.000678f, 0.995605f, + 0.001168f, 0.995117f, 0.001616f, 0.994141f, 0.002028f, 0.993164f, 0.002453f, 0.992676f, + 0.002846f, 0.991211f, 0.003202f, 0.989746f, 0.003056f, 0.986816f, 0.003082f, 0.982422f, + 0.003553f, 0.975586f, 0.005165f, 0.964844f, 0.007755f, 0.932617f, 0.018951f, 0.711914f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000058f, 0.996094f, + 0.000488f, 0.996094f, 0.000952f, 0.996094f, 0.001387f, 0.995605f, 0.001765f, 0.995117f, + 0.002134f, 0.994141f, 0.002506f, 0.993164f, 0.002806f, 0.992676f, 0.003134f, 0.991699f, + 0.003462f, 0.990234f, 0.003700f, 0.989258f, 0.004452f, 0.985840f, 0.004211f, 0.980469f, + 0.005016f, 0.973633f, 0.007156f, 0.961426f, 0.010925f, 0.927734f, 0.025650f, 0.703613f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000059f, 0.996582f, 0.000468f, 0.996582f, 0.000903f, 0.996094f, 0.001275f, 0.996094f, + 0.001681f, 0.996094f, 0.002024f, 0.995605f, 0.002304f, 0.994629f, 0.002640f, 0.994141f, + 0.002855f, 0.993164f, 0.003193f, 0.992676f, 0.003401f, 0.992188f, 0.003712f, 0.990234f, + 0.004063f, 0.989258f, 0.005070f, 0.987305f, 0.006126f, 0.984375f, 0.005840f, 0.979004f, + 0.006832f, 0.971191f, 0.009766f, 0.958008f, 0.015457f, 0.922363f, 0.033997f, 0.695312f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000196f, 0.996582f, 0.000625f, 0.996582f, 0.001025f, 0.996582f, + 0.001363f, 0.996094f, 0.001736f, 0.996094f, 0.001995f, 0.996094f, 0.002314f, 0.995605f, + 0.002537f, 0.995117f, 0.002829f, 0.994629f, 0.002998f, 0.993652f, 0.003304f, 0.993164f, + 0.003460f, 0.992676f, 0.003752f, 0.991699f, 0.003918f, 0.990723f, 0.004654f, 0.989746f, + 0.005566f, 0.987793f, 0.006470f, 0.985840f, 0.007542f, 0.982910f, 0.007732f, 0.976562f, + 0.009079f, 0.968262f, 0.013046f, 0.953613f, 0.020752f, 0.915527f, 0.043671f, 0.686035f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000090f, 0.997070f, 0.000474f, 0.997070f, 0.000895f, 0.996582f, + 0.001283f, 0.996582f, 0.001553f, 0.996582f, 0.001886f, 0.996094f, 0.002098f, 0.996094f, + 0.002399f, 0.996094f, 0.002554f, 0.996094f, 0.002850f, 0.995117f, 0.003019f, 0.994629f, + 0.003233f, 0.994141f, 0.003452f, 0.993652f, 0.003563f, 0.993164f, 0.003841f, 0.992676f, + 0.003994f, 0.991699f, 0.004517f, 0.990234f, 0.005398f, 0.989746f, 0.006092f, 0.987793f, + 0.006924f, 0.986328f, 0.007996f, 0.983398f, 0.009567f, 0.979980f, 0.010490f, 0.974121f, + 0.012444f, 0.964355f, 0.017044f, 0.948730f, 0.027420f, 0.907715f, 0.054840f, 0.676270f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000119f, 0.997559f, 0.000519f, 0.997070f, 0.000944f, 0.997070f, + 0.001301f, 0.997070f, 0.001555f, 0.996582f, 0.001870f, 0.996582f, 0.002073f, 0.996582f, + 0.002321f, 0.996094f, 0.002539f, 0.996094f, 0.002649f, 0.996094f, 0.002943f, 0.995605f, + 0.003090f, 0.995117f, 0.003222f, 0.994629f, 0.003479f, 0.994141f, 0.003599f, 0.993652f, + 0.003733f, 0.993164f, 0.003975f, 0.992676f, 0.004086f, 0.992188f, 0.004692f, 0.991211f, + 0.005527f, 0.990234f, 0.006172f, 0.989258f, 0.006809f, 0.987793f, 0.007534f, 0.986328f, + 0.008774f, 0.983887f, 0.010117f, 0.981445f, 0.012115f, 0.977051f, 0.013428f, 0.970703f, + 0.016235f, 0.960449f, 0.022552f, 0.942383f, 0.035095f, 0.898438f, 0.067566f, 0.666016f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000310f, 0.997559f, 0.000725f, 0.997559f, 0.001081f, 0.997070f, + 0.001432f, 0.997070f, 0.001645f, 0.997070f, 0.001943f, 0.997070f, 0.002136f, 0.996582f, + 0.002308f, 0.996582f, 0.002567f, 0.996582f, 0.002684f, 0.996094f, 0.002874f, 0.996094f, + 0.003086f, 0.996094f, 0.003183f, 0.995605f, 0.003325f, 0.995117f, 0.003557f, 0.994629f, + 0.003660f, 0.994141f, 0.003712f, 0.993652f, 0.003983f, 0.993164f, 0.004116f, 0.993164f, + 0.004452f, 0.992676f, 0.005173f, 0.991211f, 0.005871f, 0.990723f, 0.006416f, 0.989746f, + 0.006897f, 0.988770f, 0.007572f, 0.987305f, 0.008537f, 0.985840f, 0.009705f, 0.983887f, + 0.011070f, 0.981445f, 0.012840f, 0.978027f, 0.015175f, 0.973633f, 0.017761f, 0.966797f, + 0.020950f, 0.955078f, 0.028900f, 0.935547f, 0.044983f, 0.888184f, 0.081360f, 0.654785f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000138f, 0.998047f, 0.000599f, 0.997559f, 0.001024f, 0.997559f, 0.001263f, 0.997559f, + 0.001619f, 0.997070f, 0.001754f, 0.997070f, 0.002087f, 0.997070f, 0.002228f, 0.997070f, + 0.002401f, 0.996582f, 0.002644f, 0.996582f, 0.002741f, 0.996582f, 0.002869f, 0.996582f, + 0.003120f, 0.996094f, 0.003220f, 0.996094f, 0.003269f, 0.995605f, 0.003521f, 0.995117f, + 0.003668f, 0.994629f, 0.003733f, 0.994629f, 0.003765f, 0.994141f, 0.004055f, 0.993652f, + 0.004169f, 0.993164f, 0.004597f, 0.993164f, 0.005142f, 0.992188f, 0.005901f, 0.991699f, + 0.006443f, 0.990723f, 0.006851f, 0.989746f, 0.007206f, 0.989258f, 0.007919f, 0.987793f, + 0.008850f, 0.986816f, 0.009880f, 0.984863f, 0.010818f, 0.983398f, 0.012459f, 0.980957f, + 0.013992f, 0.978027f, 0.016190f, 0.974609f, 0.019409f, 0.969727f, 0.023407f, 0.962402f, + 0.027603f, 0.948242f, 0.037109f, 0.926758f, 0.056854f, 0.875488f, 0.096924f, 0.643066f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000534f, 0.998047f, 0.000953f, 0.998047f, 0.001250f, 0.997559f, 0.001594f, 0.997559f, + 0.001774f, 0.997559f, 0.002012f, 0.997070f, 0.002235f, 0.997070f, 0.002312f, 0.997070f, + 0.002581f, 0.997070f, 0.002743f, 0.996582f, 0.002804f, 0.996582f, 0.002975f, 0.996582f, + 0.003197f, 0.996582f, 0.003273f, 0.996094f, 0.003309f, 0.996094f, 0.003540f, 0.995605f, + 0.003704f, 0.995117f, 0.003765f, 0.994629f, 0.003796f, 0.994629f, 0.003983f, 0.994141f, + 0.004169f, 0.993652f, 0.004555f, 0.993164f, 0.005089f, 0.993164f, 0.005577f, 0.992676f, + 0.006222f, 0.991699f, 0.006660f, 0.991211f, 0.007030f, 0.990234f, 0.007286f, 0.989746f, + 0.007843f, 0.989258f, 0.008766f, 0.987793f, 0.009682f, 0.986816f, 0.010422f, 0.985352f, + 0.011269f, 0.983887f, 0.012802f, 0.982422f, 0.014076f, 0.979980f, 0.015961f, 0.977051f, + 0.017990f, 0.974121f, 0.020966f, 0.969727f, 0.024612f, 0.964355f, 0.029800f, 0.955078f, + 0.035370f, 0.940430f, 0.047211f, 0.916016f, 0.071106f, 0.861328f, 0.113159f, 0.630859f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000287f, 0.998535f, + 0.000802f, 0.998047f, 0.001254f, 0.998047f, 0.001492f, 0.997559f, 0.001792f, 0.997559f, + 0.001864f, 0.997559f, 0.002239f, 0.997559f, 0.002335f, 0.997070f, 0.002436f, 0.997070f, + 0.002747f, 0.997070f, 0.002825f, 0.997070f, 0.002855f, 0.996582f, 0.003153f, 0.996582f, + 0.003283f, 0.996582f, 0.003326f, 0.996582f, 0.003345f, 0.996094f, 0.003639f, 0.995605f, + 0.003763f, 0.995117f, 0.003807f, 0.994629f, 0.003828f, 0.994629f, 0.003983f, 0.994141f, + 0.004292f, 0.994141f, 0.004826f, 0.993652f, 0.005314f, 0.993164f, 0.005756f, 0.993164f, + 0.006271f, 0.992188f, 0.006741f, 0.991699f, 0.007065f, 0.991211f, 0.007339f, 0.990723f, + 0.007534f, 0.989746f, 0.008324f, 0.989258f, 0.009163f, 0.988281f, 0.010002f, 0.987305f, + 0.010643f, 0.986816f, 0.011169f, 0.984863f, 0.012535f, 0.983887f, 0.013802f, 0.982422f, + 0.014900f, 0.980469f, 0.016663f, 0.978516f, 0.018265f, 0.975586f, 0.020844f, 0.972656f, + 0.023605f, 0.968262f, 0.027084f, 0.963867f, 0.031891f, 0.956543f, 0.038330f, 0.946777f, + 0.045868f, 0.930176f, 0.060303f, 0.903320f, 0.088989f, 0.844727f, 0.131714f, 0.618652f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000621f, 0.998535f, + 0.001072f, 0.998047f, 0.001372f, 0.998047f, 0.001758f, 0.998047f, 0.001880f, 0.997559f, + 0.002172f, 0.997559f, 0.002350f, 0.997559f, 0.002388f, 0.997559f, 0.002720f, 0.997070f, + 0.002842f, 0.997070f, 0.002872f, 0.997070f, 0.003027f, 0.996582f, 0.003290f, 0.996582f, + 0.003344f, 0.996582f, 0.003365f, 0.996582f, 0.003483f, 0.996094f, 0.003761f, 0.995605f, + 0.003822f, 0.995605f, 0.003843f, 0.994629f, 0.003855f, 0.994629f, 0.004311f, 0.994141f, + 0.004990f, 0.994141f, 0.005428f, 0.993652f, 0.005856f, 0.993164f, 0.006100f, 0.993164f, + 0.006607f, 0.992676f, 0.006943f, 0.991699f, 0.007343f, 0.991699f, 0.007496f, 0.991211f, + 0.007790f, 0.990234f, 0.008484f, 0.989746f, 0.009346f, 0.989258f, 0.010162f, 0.988281f, + 0.010765f, 0.987305f, 0.011093f, 0.986816f, 0.012093f, 0.985352f, 0.013084f, 0.984375f, + 0.014252f, 0.982910f, 0.015282f, 0.981445f, 0.016876f, 0.979980f, 0.017990f, 0.978027f, + 0.019806f, 0.975586f, 0.022079f, 0.973145f, 0.024582f, 0.970215f, 0.027435f, 0.966309f, + 0.030914f, 0.961426f, 0.035553f, 0.955566f, 0.041687f, 0.947266f, 0.050049f, 0.936035f, + 0.059875f, 0.917480f, 0.077820f, 0.887207f, 0.110535f, 0.825195f, 0.149780f, 0.604492f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000407f, 0.998535f, + 0.000981f, 0.998535f, 0.001412f, 0.998535f, 0.001839f, 0.998047f, 0.001915f, 0.998047f, + 0.002306f, 0.998047f, 0.002396f, 0.997559f, 0.002413f, 0.997559f, 0.002840f, 0.997559f, + 0.002886f, 0.997070f, 0.002899f, 0.997070f, 0.003267f, 0.997070f, 0.003359f, 0.996582f, + 0.003378f, 0.996582f, 0.003387f, 0.996094f, 0.003742f, 0.996094f, 0.003838f, 0.995605f, + 0.003860f, 0.995117f, 0.004036f, 0.994629f, 0.004555f, 0.994141f, 0.005417f, 0.994141f, + 0.005867f, 0.994141f, 0.006088f, 0.993652f, 0.006443f, 0.993652f, 0.006603f, 0.992676f, + 0.007149f, 0.992188f, 0.007484f, 0.991699f, 0.007591f, 0.991211f, 0.008156f, 0.990723f, + 0.008858f, 0.990234f, 0.009338f, 0.989746f, 0.010201f, 0.988770f, 0.010872f, 0.988281f, + 0.011177f, 0.987305f, 0.011848f, 0.986816f, 0.012886f, 0.985840f, 0.013748f, 0.984863f, + 0.014511f, 0.983887f, 0.015541f, 0.982422f, 0.017105f, 0.981445f, 0.018051f, 0.979980f, + 0.019440f, 0.978516f, 0.020950f, 0.976562f, 0.022736f, 0.974609f, 0.025009f, 0.972168f, + 0.027405f, 0.969238f, 0.029999f, 0.965820f, 0.033325f, 0.962402f, 0.036957f, 0.957520f, + 0.041565f, 0.951660f, 0.048035f, 0.944336f, 0.055511f, 0.935059f, 0.065552f, 0.921387f, + 0.078369f, 0.900879f, 0.099731f, 0.867676f, 0.136108f, 0.802734f, 0.169189f, 0.590820f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000622f, 0.999023f, 0.001336f, 0.998535f, 0.001448f, 0.998535f, 0.001925f, 0.998535f, + 0.002174f, 0.998047f, 0.002413f, 0.998047f, 0.002424f, 0.997559f, 0.002876f, 0.997559f, + 0.002905f, 0.997559f, 0.002913f, 0.997070f, 0.003349f, 0.997070f, 0.003387f, 0.997070f, + 0.003397f, 0.996582f, 0.003448f, 0.996094f, 0.003845f, 0.995605f, 0.004284f, 0.995117f, + 0.004864f, 0.995117f, 0.005184f, 0.994629f, 0.005962f, 0.994141f, 0.006187f, 0.993652f, + 0.006592f, 0.993652f, 0.006691f, 0.993164f, 0.007015f, 0.992676f, 0.007278f, 0.992188f, + 0.007660f, 0.991699f, 0.008560f, 0.991211f, 0.009201f, 0.990723f, 0.009651f, 0.990234f, + 0.010071f, 0.989746f, 0.010651f, 0.988770f, 0.011253f, 0.988281f, 0.012024f, 0.987793f, + 0.012939f, 0.986816f, 0.013718f, 0.986328f, 0.014351f, 0.985352f, 0.014923f, 0.984375f, + 0.015808f, 0.983398f, 0.017593f, 0.981934f, 0.018402f, 0.980957f, 0.019608f, 0.979492f, + 0.020889f, 0.978516f, 0.022232f, 0.977051f, 0.023972f, 0.975098f, 0.025543f, 0.973145f, + 0.027863f, 0.971680f, 0.029922f, 0.968750f, 0.032166f, 0.966309f, 0.035461f, 0.963379f, + 0.038208f, 0.959961f, 0.041809f, 0.955566f, 0.046082f, 0.950684f, 0.051605f, 0.944824f, + 0.057800f, 0.937988f, 0.065308f, 0.929199f, 0.074890f, 0.917969f, 0.087708f, 0.902344f, + 0.103943f, 0.879395f, 0.127808f, 0.843262f, 0.167114f, 0.776855f, 0.189941f, 0.576660f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000952f, 0.999023f, 0.001452f, 0.999023f, + 0.001934f, 0.998535f, 0.001946f, 0.998047f, 0.002428f, 0.998047f, 0.002434f, 0.997559f, + 0.002913f, 0.997559f, 0.002918f, 0.997559f, 0.003349f, 0.997070f, 0.003401f, 0.996582f, + 0.003405f, 0.996094f, 0.004257f, 0.995605f, 0.005157f, 0.995117f, 0.005558f, 0.994629f, + 0.005756f, 0.994629f, 0.006145f, 0.994141f, 0.006710f, 0.993652f, 0.007019f, 0.993164f, + 0.007206f, 0.992676f, 0.007500f, 0.992188f, 0.008469f, 0.991699f, 0.009399f, 0.991211f, + 0.009903f, 0.990723f, 0.010246f, 0.990234f, 0.010857f, 0.989258f, 0.011108f, 0.988770f, + 0.012054f, 0.988281f, 0.013046f, 0.987305f, 0.014084f, 0.986816f, 0.014648f, 0.985840f, + 0.015289f, 0.985352f, 0.016068f, 0.984375f, 0.017319f, 0.983398f, 0.018158f, 0.982422f, + 0.019470f, 0.981445f, 0.020798f, 0.979980f, 0.021881f, 0.979004f, 0.022995f, 0.977539f, + 0.024689f, 0.976074f, 0.025925f, 0.975098f, 0.027664f, 0.973145f, 0.029327f, 0.972168f, + 0.031372f, 0.969727f, 0.033081f, 0.967285f, 0.036224f, 0.965332f, 0.038635f, 0.962891f, + 0.041077f, 0.960449f, 0.043884f, 0.957031f, 0.047394f, 0.953613f, 0.051422f, 0.949707f, + 0.056061f, 0.945312f, 0.061127f, 0.939941f, 0.066956f, 0.934082f, 0.073730f, 0.926758f, + 0.081543f, 0.918457f, 0.091553f, 0.907715f, 0.103455f, 0.894531f, 0.119080f, 0.876953f, + 0.137817f, 0.851562f, 0.164062f, 0.812988f, 0.202881f, 0.747070f, 0.211182f, 0.562012f, + 0.000000f, 1.000000f, 0.000975f, 0.999512f, 0.001929f, 0.998535f, 0.001950f, 0.998535f, + 0.002436f, 0.998047f, 0.002913f, 0.997559f, 0.002924f, 0.997559f, 0.003853f, 0.996582f, + 0.004753f, 0.996094f, 0.005226f, 0.995605f, 0.005798f, 0.995117f, 0.006279f, 0.994629f, + 0.006348f, 0.994141f, 0.006870f, 0.993652f, 0.008102f, 0.992676f, 0.009018f, 0.992188f, + 0.009567f, 0.991699f, 0.009888f, 0.990723f, 0.010857f, 0.989746f, 0.011917f, 0.989258f, + 0.012749f, 0.988770f, 0.013237f, 0.987793f, 0.014107f, 0.987305f, 0.014961f, 0.986328f, + 0.016220f, 0.985352f, 0.017273f, 0.984375f, 0.017990f, 0.983398f, 0.019302f, 0.982422f, + 0.020477f, 0.981445f, 0.021515f, 0.980469f, 0.022446f, 0.979492f, 0.024216f, 0.978516f, + 0.025452f, 0.977051f, 0.027023f, 0.975586f, 0.028717f, 0.974121f, 0.030289f, 0.973145f, + 0.031952f, 0.971680f, 0.033173f, 0.970215f, 0.034973f, 0.968262f, 0.037720f, 0.966309f, + 0.040070f, 0.964355f, 0.042511f, 0.962402f, 0.044647f, 0.959961f, 0.047485f, 0.958008f, + 0.050201f, 0.955078f, 0.053345f, 0.952148f, 0.056763f, 0.949219f, 0.060608f, 0.945801f, + 0.064514f, 0.941895f, 0.069336f, 0.937988f, 0.073914f, 0.933105f, 0.079529f, 0.928223f, + 0.085510f, 0.922363f, 0.092224f, 0.916016f, 0.100220f, 0.908203f, 0.109009f, 0.899414f, + 0.119141f, 0.889160f, 0.131104f, 0.876953f, 0.145752f, 0.861328f, 0.163086f, 0.841797f, + 0.184082f, 0.815430f, 0.209839f, 0.776367f, 0.244873f, 0.713867f, 0.232666f, 0.546875f, + 0.000000f, 1.000000f, 0.001464f, 0.999023f, 0.001952f, 0.998535f, 0.003386f, 0.997559f, + 0.004776f, 0.996582f, 0.005711f, 0.996094f, 0.005840f, 0.995117f, 0.007530f, 0.994141f, + 0.008636f, 0.993164f, 0.009453f, 0.992188f, 0.010834f, 0.991211f, 0.012413f, 0.989746f, + 0.013000f, 0.989258f, 0.014084f, 0.988281f, 0.016068f, 0.986816f, 0.017075f, 0.985840f, + 0.018051f, 0.984375f, 0.019699f, 0.983398f, 0.020798f, 0.982422f, 0.022858f, 0.980957f, + 0.024506f, 0.979492f, 0.025665f, 0.978516f, 0.027069f, 0.977539f, 0.028107f, 0.975586f, + 0.031128f, 0.974121f, 0.032806f, 0.973145f, 0.034576f, 0.971191f, 0.036438f, 0.969727f, + 0.038727f, 0.967773f, 0.040405f, 0.966309f, 0.043030f, 0.964355f, 0.044983f, 0.962402f, + 0.047729f, 0.960449f, 0.049713f, 0.958496f, 0.052612f, 0.956543f, 0.055695f, 0.954102f, + 0.058594f, 0.951660f, 0.061584f, 0.949219f, 0.064697f, 0.946777f, 0.068054f, 0.943848f, + 0.071899f, 0.940918f, 0.075439f, 0.937988f, 0.079346f, 0.934570f, 0.083557f, 0.931152f, + 0.088013f, 0.927734f, 0.093018f, 0.923340f, 0.097961f, 0.919434f, 0.103333f, 0.914551f, + 0.109436f, 0.909180f, 0.115845f, 0.903809f, 0.122314f, 0.897949f, 0.129639f, 0.891602f, + 0.137695f, 0.884277f, 0.146240f, 0.875977f, 0.155884f, 0.867188f, 0.166504f, 0.856934f, + 0.178589f, 0.844727f, 0.192139f, 0.831055f, 0.207153f, 0.814453f, 0.224731f, 0.794434f, + 0.244629f, 0.769043f, 0.266357f, 0.731934f, 0.291260f, 0.676758f, 0.255127f, 0.532227f, + 0.000000f, 1.000000f, 0.002438f, 0.998535f, 0.005825f, 0.996582f, 0.008965f, 0.994141f, + 0.011604f, 0.992188f, 0.013985f, 0.990234f, 0.016846f, 0.987793f, 0.019501f, 0.985352f, + 0.022583f, 0.983398f, 0.025314f, 0.980469f, 0.028046f, 0.978516f, 0.031204f, 0.976074f, + 0.033875f, 0.973633f, 0.037201f, 0.971680f, 0.039764f, 0.969238f, 0.043671f, 0.966309f, + 0.046661f, 0.964355f, 0.049591f, 0.961426f, 0.052917f, 0.958984f, 0.055847f, 0.956543f, + 0.059906f, 0.954102f, 0.063477f, 0.951172f, 0.067139f, 0.948730f, 0.070862f, 0.945801f, + 0.074463f, 0.943359f, 0.077759f, 0.940430f, 0.081787f, 0.937500f, 0.085693f, 0.935059f, + 0.089905f, 0.931641f, 0.094482f, 0.928711f, 0.098694f, 0.925781f, 0.103210f, 0.922363f, + 0.107605f, 0.918945f, 0.111816f, 0.916016f, 0.116577f, 0.912598f, 0.121155f, 0.909180f, + 0.125977f, 0.905273f, 0.130981f, 0.901367f, 0.136108f, 0.897949f, 0.141724f, 0.893555f, + 0.147461f, 0.889160f, 0.153198f, 0.884766f, 0.159302f, 0.880371f, 0.165039f, 0.875488f, + 0.171143f, 0.870605f, 0.177612f, 0.865234f, 0.184326f, 0.859863f, 0.191284f, 0.854004f, + 0.198242f, 0.848145f, 0.205688f, 0.841309f, 0.213379f, 0.834473f, 0.221558f, 0.827148f, + 0.230713f, 0.819336f, 0.239624f, 0.810547f, 0.249268f, 0.800781f, 0.259277f, 0.790527f, + 0.270020f, 0.778809f, 0.281250f, 0.765625f, 0.293213f, 0.750488f, 0.306396f, 0.732910f, + 0.320312f, 0.711426f, 0.332031f, 0.680664f, 0.342773f, 0.635742f, 0.278564f, 0.515137f, + 0.000000f, 1.000000f, 0.020798f, 0.990723f, 0.040283f, 0.977539f, 0.057739f, 0.964355f, + 0.075012f, 0.952148f, 0.089172f, 0.941406f, 0.103394f, 0.930664f, 0.115723f, 0.921387f, + 0.128052f, 0.912598f, 0.139526f, 0.903809f, 0.149780f, 0.896484f, 0.159302f, 0.889160f, + 0.168701f, 0.883301f, 0.177612f, 0.876465f, 0.187134f, 0.870605f, 0.195435f, 0.865234f, + 0.202759f, 0.859863f, 0.210083f, 0.854492f, 0.217041f, 0.850098f, 0.223633f, 0.845215f, + 0.229980f, 0.841309f, 0.236084f, 0.836914f, 0.243530f, 0.832520f, 0.250000f, 0.828125f, + 0.255859f, 0.824219f, 0.261475f, 0.820312f, 0.267090f, 0.816895f, 0.272461f, 0.812988f, + 0.277344f, 0.809570f, 0.282471f, 0.805664f, 0.287109f, 0.802246f, 0.291992f, 0.798828f, + 0.297119f, 0.795410f, 0.301514f, 0.791992f, 0.306152f, 0.788574f, 0.310547f, 0.785156f, + 0.314697f, 0.781738f, 0.318604f, 0.778320f, 0.323975f, 0.774414f, 0.328369f, 0.770996f, + 0.333008f, 0.767090f, 0.337158f, 0.763672f, 0.341309f, 0.759766f, 0.345215f, 0.755859f, + 0.349365f, 0.751465f, 0.353516f, 0.747559f, 0.357178f, 0.743652f, 0.361572f, 0.738770f, + 0.365723f, 0.734375f, 0.369629f, 0.729492f, 0.373047f, 0.724609f, 0.376953f, 0.719238f, + 0.380859f, 0.713867f, 0.384521f, 0.708008f, 0.387939f, 0.701660f, 0.391357f, 0.694824f, + 0.395020f, 0.687012f, 0.398438f, 0.678711f, 0.401367f, 0.668945f, 0.404541f, 0.657715f, + 0.407227f, 0.643555f, 0.406250f, 0.621582f, 0.398682f, 0.591309f, 0.302979f, 0.497314f, + 0.000000f, 1.000000f, 0.431641f, 0.809570f, 0.458984f, 0.751953f, 0.473389f, 0.719727f, + 0.483398f, 0.698730f, 0.491455f, 0.684082f, 0.496826f, 0.673340f, 0.500977f, 0.665527f, + 0.505859f, 0.659180f, 0.509277f, 0.654297f, 0.513184f, 0.649902f, 0.516602f, 0.646484f, + 0.520020f, 0.643555f, 0.523926f, 0.640625f, 0.525879f, 0.638184f, 0.527344f, 0.636230f, + 0.530762f, 0.634277f, 0.532715f, 0.632812f, 0.535156f, 0.630859f, 0.536621f, 0.629395f, + 0.539062f, 0.627930f, 0.541016f, 0.626465f, 0.542480f, 0.625000f, 0.544434f, 0.623535f, + 0.546875f, 0.622070f, 0.548340f, 0.620605f, 0.550293f, 0.619141f, 0.552734f, 0.617676f, + 0.554688f, 0.615723f, 0.556641f, 0.614258f, 0.558594f, 0.612305f, 0.561035f, 0.610840f, + 0.562012f, 0.608887f, 0.563965f, 0.606934f, 0.564941f, 0.604980f, 0.566406f, 0.603027f, + 0.568848f, 0.601074f, 0.570801f, 0.598633f, 0.572266f, 0.596191f, 0.574219f, 0.593750f, + 0.576172f, 0.591309f, 0.578125f, 0.588379f, 0.580566f, 0.585449f, 0.582031f, 0.582520f, + 0.583496f, 0.579102f, 0.585449f, 0.575684f, 0.587402f, 0.572266f, 0.589844f, 0.568359f, + 0.590820f, 0.564453f, 0.593750f, 0.560059f, 0.595215f, 0.555176f, 0.597656f, 0.550293f, + 0.599609f, 0.544434f, 0.601074f, 0.538574f, 0.603516f, 0.532227f, 0.605957f, 0.524414f, + 0.608398f, 0.516113f, 0.610352f, 0.506836f, 0.612793f, 0.496094f, 0.614746f, 0.483154f, + 0.616699f, 0.467041f, 0.614258f, 0.444336f, 0.607910f, 0.410889f, 0.540039f, 0.323730f, + 0.000000f, 1.000000f, 0.456787f, 0.798828f, 0.495850f, 0.732422f, 0.516602f, 0.693848f, + 0.535645f, 0.665527f, 0.548340f, 0.645508f, 0.560059f, 0.629883f, 0.569824f, 0.617188f, + 0.579102f, 0.605957f, 0.585938f, 0.597168f, 0.594727f, 0.588867f, 0.601562f, 0.582031f, + 0.608887f, 0.575195f, 0.615723f, 0.568848f, 0.621094f, 0.563477f, 0.626953f, 0.558594f, + 0.632324f, 0.553711f, 0.638672f, 0.548828f, 0.643555f, 0.543945f, 0.649414f, 0.539551f, + 0.654785f, 0.535156f, 0.659180f, 0.530762f, 0.664551f, 0.526855f, 0.668945f, 0.522461f, + 0.672852f, 0.518555f, 0.678711f, 0.514160f, 0.682617f, 0.509766f, 0.687500f, 0.505371f, + 0.690918f, 0.501465f, 0.695801f, 0.497314f, 0.699707f, 0.492920f, 0.704102f, 0.488770f, + 0.708496f, 0.484131f, 0.712891f, 0.479736f, 0.716309f, 0.475098f, 0.721191f, 0.470215f, + 0.725098f, 0.465332f, 0.729004f, 0.460205f, 0.732910f, 0.455322f, 0.736328f, 0.450195f, + 0.740723f, 0.444580f, 0.745117f, 0.439209f, 0.748535f, 0.433350f, 0.752930f, 0.427490f, + 0.756836f, 0.421387f, 0.760254f, 0.415039f, 0.764160f, 0.408203f, 0.767090f, 0.401611f, + 0.772461f, 0.394043f, 0.775879f, 0.386475f, 0.779785f, 0.378418f, 0.784668f, 0.369629f, + 0.789551f, 0.360596f, 0.792969f, 0.350830f, 0.797852f, 0.340332f, 0.802246f, 0.329102f, + 0.806641f, 0.316895f, 0.810547f, 0.303467f, 0.815918f, 0.288330f, 0.820312f, 0.270996f, + 0.826172f, 0.250732f, 0.828125f, 0.224243f, 0.831055f, 0.187866f, 0.804688f, 0.119873f, + 0.000000f, 1.000000f, 0.481445f, 0.788574f, 0.530273f, 0.713867f, 0.561035f, 0.667480f, + 0.584473f, 0.633301f, 0.604492f, 0.607422f, 0.620117f, 0.586914f, 0.633301f, 0.569824f, + 0.646484f, 0.554688f, 0.657715f, 0.541992f, 0.667969f, 0.530273f, 0.679199f, 0.519531f, + 0.687500f, 0.509766f, 0.695801f, 0.500977f, 0.704590f, 0.492676f, 0.711914f, 0.484863f, + 0.720215f, 0.477295f, 0.727539f, 0.469971f, 0.734863f, 0.462891f, 0.741211f, 0.456299f, + 0.747559f, 0.449707f, 0.752930f, 0.443604f, 0.758301f, 0.437500f, 0.765625f, 0.430908f, + 0.770508f, 0.425049f, 0.775391f, 0.419189f, 0.781250f, 0.413086f, 0.785645f, 0.407227f, + 0.791016f, 0.401367f, 0.796387f, 0.395508f, 0.800293f, 0.389648f, 0.805664f, 0.383789f, + 0.810547f, 0.377686f, 0.813477f, 0.371826f, 0.817871f, 0.365967f, 0.822754f, 0.359863f, + 0.825684f, 0.354004f, 0.830078f, 0.347656f, 0.834961f, 0.341553f, 0.838379f, 0.335205f, + 0.842285f, 0.328613f, 0.845215f, 0.322266f, 0.849121f, 0.315674f, 0.853516f, 0.308594f, + 0.857910f, 0.301758f, 0.860840f, 0.294434f, 0.864258f, 0.287109f, 0.867676f, 0.279541f, + 0.871094f, 0.271729f, 0.874512f, 0.263428f, 0.877441f, 0.255127f, 0.880859f, 0.246460f, + 0.884277f, 0.237305f, 0.887207f, 0.227783f, 0.890625f, 0.217529f, 0.895508f, 0.206665f, + 0.897461f, 0.195190f, 0.901855f, 0.182739f, 0.904785f, 0.169189f, 0.908203f, 0.154419f, + 0.912109f, 0.137817f, 0.914551f, 0.118591f, 0.914551f, 0.090881f, 0.900879f, 0.050354f, + 0.000000f, 1.000000f, 0.506348f, 0.778320f, 0.566406f, 0.695312f, 0.603027f, 0.642090f, + 0.632812f, 0.602539f, 0.655273f, 0.571777f, 0.674805f, 0.546387f, 0.691406f, 0.525879f, + 0.705566f, 0.507324f, 0.721191f, 0.490967f, 0.730957f, 0.476807f, 0.743652f, 0.463623f, + 0.753906f, 0.451416f, 0.762695f, 0.440430f, 0.771484f, 0.429932f, 0.780273f, 0.420166f, + 0.789062f, 0.410645f, 0.795410f, 0.401855f, 0.802734f, 0.393555f, 0.809082f, 0.385498f, + 0.815430f, 0.377930f, 0.821777f, 0.370117f, 0.827637f, 0.362793f, 0.833008f, 0.355469f, + 0.837891f, 0.348633f, 0.842285f, 0.342041f, 0.847656f, 0.335205f, 0.852539f, 0.328613f, + 0.856934f, 0.322021f, 0.860352f, 0.315674f, 0.864258f, 0.309326f, 0.869141f, 0.302979f, + 0.872559f, 0.296631f, 0.876465f, 0.290283f, 0.880371f, 0.283936f, 0.882812f, 0.278076f, + 0.887207f, 0.271484f, 0.890137f, 0.265381f, 0.892578f, 0.259033f, 0.895020f, 0.252930f, + 0.899902f, 0.246338f, 0.901855f, 0.239990f, 0.904785f, 0.233643f, 0.908203f, 0.227051f, + 0.911133f, 0.220215f, 0.913086f, 0.213379f, 0.916016f, 0.206543f, 0.918457f, 0.199463f, + 0.919922f, 0.192383f, 0.923828f, 0.184937f, 0.924805f, 0.177612f, 0.928711f, 0.169678f, + 0.929688f, 0.161865f, 0.932617f, 0.153442f, 0.935059f, 0.144775f, 0.938477f, 0.135498f, + 0.939453f, 0.126221f, 0.941406f, 0.116333f, 0.943359f, 0.105835f, 0.944824f, 0.094849f, + 0.949219f, 0.081726f, 0.950195f, 0.067993f, 0.948730f, 0.049408f, 0.941406f, 0.025864f, + 0.000000f, 1.000000f, 0.531738f, 0.768066f, 0.601562f, 0.676758f, 0.642578f, 0.618652f, + 0.676758f, 0.573242f, 0.700684f, 0.539062f, 0.724121f, 0.509766f, 0.740723f, 0.486084f, + 0.755859f, 0.465088f, 0.770996f, 0.446289f, 0.783691f, 0.429932f, 0.794434f, 0.415039f, + 0.805664f, 0.401123f, 0.814941f, 0.388672f, 0.822754f, 0.376953f, 0.831055f, 0.365967f, + 0.838867f, 0.355713f, 0.844727f, 0.346191f, 0.852051f, 0.336914f, 0.857422f, 0.328369f, + 0.864258f, 0.319580f, 0.868164f, 0.311523f, 0.873047f, 0.303955f, 0.879395f, 0.296387f, + 0.881836f, 0.289307f, 0.885254f, 0.282471f, 0.891113f, 0.275391f, 0.895508f, 0.268311f, + 0.897949f, 0.261963f, 0.902344f, 0.255371f, 0.905273f, 0.249146f, 0.908691f, 0.242798f, + 0.911621f, 0.236816f, 0.914062f, 0.230713f, 0.916992f, 0.224854f, 0.919434f, 0.218872f, + 0.923828f, 0.212524f, 0.925781f, 0.206543f, 0.927734f, 0.200684f, 0.929688f, 0.194702f, + 0.932129f, 0.188965f, 0.934570f, 0.182983f, 0.935547f, 0.177246f, 0.937500f, 0.171509f, + 0.939941f, 0.165283f, 0.941406f, 0.159424f, 0.944336f, 0.153076f, 0.946289f, 0.146729f, + 0.947754f, 0.140503f, 0.948730f, 0.134399f, 0.950684f, 0.128174f, 0.952637f, 0.121277f, + 0.954102f, 0.114563f, 0.955566f, 0.107849f, 0.957031f, 0.100891f, 0.958984f, 0.093567f, + 0.960938f, 0.085754f, 0.961914f, 0.078064f, 0.963867f, 0.069824f, 0.965332f, 0.061340f, + 0.966309f, 0.052460f, 0.967773f, 0.042450f, 0.966797f, 0.029526f, 0.960938f, 0.013649f, + 0.000000f, 1.000000f, 0.557617f, 0.757324f, 0.634277f, 0.659668f, 0.678711f, 0.596191f, + 0.717285f, 0.546875f, 0.742676f, 0.508789f, 0.765625f, 0.477295f, 0.783203f, 0.451416f, + 0.799805f, 0.428223f, 0.812988f, 0.407959f, 0.824707f, 0.390381f, 0.835938f, 0.374023f, + 0.845215f, 0.359375f, 0.854004f, 0.345947f, 0.861328f, 0.333740f, 0.868652f, 0.322266f, + 0.875000f, 0.311279f, 0.881348f, 0.301270f, 0.886719f, 0.291748f, 0.892090f, 0.282959f, + 0.896484f, 0.274170f, 0.900879f, 0.266113f, 0.905762f, 0.258057f, 0.909180f, 0.250732f, + 0.913086f, 0.243408f, 0.916992f, 0.236328f, 0.919434f, 0.229614f, 0.922852f, 0.223022f, + 0.924805f, 0.216919f, 0.928223f, 0.210449f, 0.930176f, 0.204346f, 0.934082f, 0.198242f, + 0.935059f, 0.192505f, 0.937500f, 0.186768f, 0.939941f, 0.180908f, 0.941895f, 0.175537f, + 0.943848f, 0.170044f, 0.946777f, 0.164307f, 0.947754f, 0.158936f, 0.949219f, 0.153687f, + 0.950684f, 0.148560f, 0.953125f, 0.143066f, 0.955078f, 0.137695f, 0.957031f, 0.132324f, + 0.958008f, 0.127075f, 0.958984f, 0.121887f, 0.960449f, 0.116638f, 0.961914f, 0.111389f, + 0.962891f, 0.106018f, 0.963867f, 0.100647f, 0.965820f, 0.095093f, 0.967285f, 0.089600f, + 0.968262f, 0.084045f, 0.968750f, 0.078491f, 0.970215f, 0.072632f, 0.971680f, 0.066772f, + 0.972656f, 0.060760f, 0.973633f, 0.054718f, 0.974121f, 0.048645f, 0.975586f, 0.041931f, + 0.976562f, 0.035217f, 0.977539f, 0.028076f, 0.976562f, 0.020004f, 0.973145f, 0.009071f, + 0.000000f, 1.000000f, 0.581543f, 0.747559f, 0.664062f, 0.644043f, 0.713379f, 0.575684f, + 0.750488f, 0.523926f, 0.777832f, 0.482910f, 0.800293f, 0.449463f, 0.817383f, 0.421387f, + 0.832520f, 0.397217f, 0.845703f, 0.375977f, 0.857910f, 0.357178f, 0.866211f, 0.340332f, + 0.875000f, 0.325195f, 0.882324f, 0.311768f, 0.890137f, 0.298584f, 0.895996f, 0.286865f, + 0.901367f, 0.275879f, 0.906250f, 0.265869f, 0.911621f, 0.256104f, 0.916504f, 0.246948f, + 0.919922f, 0.238403f, 0.923828f, 0.230347f, 0.927246f, 0.222656f, 0.930176f, 0.215454f, + 0.934082f, 0.208008f, 0.936035f, 0.201294f, 0.939941f, 0.194580f, 0.940918f, 0.188354f, + 0.942383f, 0.182495f, 0.946289f, 0.176270f, 0.948242f, 0.170288f, 0.949219f, 0.164795f, + 0.951660f, 0.159302f, 0.953125f, 0.154053f, 0.955078f, 0.148682f, 0.957031f, 0.143433f, + 0.958008f, 0.138428f, 0.959473f, 0.133423f, 0.960938f, 0.128540f, 0.962402f, 0.123657f, + 0.963867f, 0.118896f, 0.965332f, 0.114075f, 0.966309f, 0.109375f, 0.967773f, 0.104614f, + 0.968262f, 0.100159f, 0.969727f, 0.095581f, 0.970703f, 0.090881f, 0.971680f, 0.086426f, + 0.973145f, 0.081848f, 0.974609f, 0.077026f, 0.975098f, 0.072388f, 0.975098f, 0.067932f, + 0.976074f, 0.063416f, 0.976562f, 0.058899f, 0.978516f, 0.054138f, 0.979492f, 0.049103f, + 0.980469f, 0.044312f, 0.979980f, 0.039673f, 0.980957f, 0.035004f, 0.982422f, 0.029785f, + 0.982422f, 0.024826f, 0.983398f, 0.019531f, 0.983887f, 0.014717f, 0.979980f, 0.005009f, + 0.000000f, 1.000000f, 0.604980f, 0.738770f, 0.693848f, 0.628906f, 0.744141f, 0.557617f, + 0.781738f, 0.502930f, 0.807129f, 0.460449f, 0.829590f, 0.425293f, 0.847168f, 0.396240f, + 0.861328f, 0.371338f, 0.872070f, 0.349365f, 0.881348f, 0.330322f, 0.891602f, 0.312744f, + 0.898926f, 0.297363f, 0.905273f, 0.283203f, 0.911133f, 0.270264f, 0.916504f, 0.258545f, + 0.921387f, 0.247559f, 0.926758f, 0.237183f, 0.929688f, 0.227783f, 0.933594f, 0.218750f, + 0.936523f, 0.210327f, 0.939941f, 0.202271f, 0.941895f, 0.194824f, 0.946289f, 0.187500f, + 0.947754f, 0.180420f, 0.950195f, 0.173828f, 0.952148f, 0.167603f, 0.953613f, 0.161621f, + 0.956055f, 0.155640f, 0.958008f, 0.149902f, 0.959473f, 0.144531f, 0.960938f, 0.139160f, + 0.962402f, 0.133911f, 0.963867f, 0.129028f, 0.965332f, 0.124146f, 0.966797f, 0.119568f, + 0.968262f, 0.114624f, 0.968750f, 0.110107f, 0.971191f, 0.105408f, 0.971191f, 0.101135f, + 0.971680f, 0.097046f, 0.973145f, 0.092896f, 0.974609f, 0.088501f, 0.976074f, 0.084290f, + 0.976074f, 0.080200f, 0.977051f, 0.076172f, 0.977539f, 0.072266f, 0.978516f, 0.068359f, + 0.979980f, 0.064209f, 0.979980f, 0.060425f, 0.980469f, 0.056519f, 0.980957f, 0.052734f, + 0.981445f, 0.048920f, 0.982910f, 0.044952f, 0.983887f, 0.040863f, 0.983887f, 0.037170f, + 0.984375f, 0.033447f, 0.985840f, 0.029572f, 0.985352f, 0.025757f, 0.985840f, 0.022049f, + 0.987793f, 0.017807f, 0.987305f, 0.014160f, 0.987793f, 0.010384f, 0.983887f, 0.003956f, + 0.000000f, 1.000000f, 0.628418f, 0.729492f, 0.720215f, 0.615723f, 0.771484f, 0.541016f, + 0.809570f, 0.484131f, 0.833496f, 0.440918f, 0.854492f, 0.404785f, 0.870117f, 0.375000f, + 0.882324f, 0.349609f, 0.893066f, 0.327393f, 0.902832f, 0.307617f, 0.910645f, 0.290283f, + 0.915527f, 0.274902f, 0.922852f, 0.260254f, 0.927246f, 0.247437f, 0.932617f, 0.235718f, + 0.936523f, 0.224854f, 0.941406f, 0.214111f, 0.942383f, 0.205078f, 0.946777f, 0.196167f, + 0.948730f, 0.187866f, 0.952148f, 0.179810f, 0.954102f, 0.172485f, 0.956543f, 0.165405f, + 0.958008f, 0.158813f, 0.960449f, 0.152466f, 0.962891f, 0.146118f, 0.963379f, 0.140381f, + 0.965820f, 0.134644f, 0.966797f, 0.129395f, 0.967285f, 0.124451f, 0.969238f, 0.119385f, + 0.971191f, 0.114319f, 0.971680f, 0.109619f, 0.972168f, 0.105225f, 0.973633f, 0.100891f, + 0.975098f, 0.096375f, 0.976074f, 0.092163f, 0.976074f, 0.088318f, 0.977051f, 0.084351f, + 0.978516f, 0.080322f, 0.979492f, 0.076294f, 0.979492f, 0.072632f, 0.980469f, 0.069031f, + 0.980957f, 0.065369f, 0.981445f, 0.061920f, 0.981445f, 0.058655f, 0.983398f, 0.055054f, + 0.984375f, 0.051270f, 0.984375f, 0.047974f, 0.984863f, 0.044708f, 0.984863f, 0.041626f, + 0.985840f, 0.038361f, 0.985840f, 0.035339f, 0.986816f, 0.032013f, 0.987793f, 0.028793f, + 0.988770f, 0.025299f, 0.988281f, 0.022339f, 0.988770f, 0.019379f, 0.989258f, 0.016373f, + 0.989746f, 0.013504f, 0.989746f, 0.010826f, 0.990234f, 0.007904f, 0.987793f, 0.002123f, + 0.000000f, 1.000000f, 0.649902f, 0.721191f, 0.745117f, 0.603027f, 0.796875f, 0.526367f, + 0.832031f, 0.468506f, 0.856934f, 0.423828f, 0.874023f, 0.387939f, 0.889648f, 0.356934f, + 0.900391f, 0.331543f, 0.909668f, 0.309082f, 0.917969f, 0.289307f, 0.925293f, 0.271484f, + 0.930664f, 0.256104f, 0.934082f, 0.242188f, 0.940430f, 0.228638f, 0.942871f, 0.217285f, + 0.947754f, 0.206055f, 0.950684f, 0.196045f, 0.952637f, 0.186768f, 0.956055f, 0.177856f, + 0.958496f, 0.169678f, 0.959961f, 0.161987f, 0.962891f, 0.154785f, 0.964844f, 0.147827f, + 0.965332f, 0.141479f, 0.967285f, 0.135132f, 0.968750f, 0.129395f, 0.971191f, 0.123596f, + 0.971680f, 0.118225f, 0.972168f, 0.113403f, 0.974609f, 0.108337f, 0.975586f, 0.103394f, + 0.975586f, 0.098999f, 0.977051f, 0.094543f, 0.977539f, 0.090393f, 0.979004f, 0.086182f, + 0.979492f, 0.082214f, 0.979980f, 0.078430f, 0.981445f, 0.074524f, 0.981934f, 0.070923f, + 0.981934f, 0.067505f, 0.983398f, 0.064026f, 0.983887f, 0.060547f, 0.984375f, 0.057251f, + 0.985352f, 0.053894f, 0.985352f, 0.050873f, 0.985840f, 0.047913f, 0.986328f, 0.044891f, + 0.986816f, 0.041962f, 0.987305f, 0.039124f, 0.988770f, 0.036102f, 0.989258f, 0.032959f, + 0.988770f, 0.030273f, 0.988770f, 0.027756f, 0.989258f, 0.025116f, 0.989258f, 0.022736f, + 0.990234f, 0.020004f, 0.990234f, 0.017654f, 0.990723f, 0.015228f, 0.991211f, 0.012878f, + 0.992188f, 0.010071f, 0.992676f, 0.007557f, 0.992676f, 0.005527f, 0.989746f, 0.002165f, + 0.000000f, 1.000000f, 0.671387f, 0.713379f, 0.768066f, 0.591797f, 0.817383f, 0.513672f, + 0.851562f, 0.455078f, 0.874023f, 0.409668f, 0.892578f, 0.372803f, 0.904297f, 0.342529f, + 0.914551f, 0.316406f, 0.922852f, 0.293945f, 0.931641f, 0.273682f, 0.934570f, 0.256836f, + 0.940918f, 0.240723f, 0.945312f, 0.226562f, 0.949219f, 0.213623f, 0.952637f, 0.201904f, + 0.956055f, 0.190918f, 0.958984f, 0.180908f, 0.960938f, 0.171753f, 0.962891f, 0.163208f, + 0.965820f, 0.154907f, 0.967285f, 0.147339f, 0.968750f, 0.140381f, 0.970703f, 0.133545f, + 0.972168f, 0.127197f, 0.973145f, 0.121338f, 0.974121f, 0.115601f, 0.975098f, 0.110229f, + 0.976562f, 0.105225f, 0.977539f, 0.100159f, 0.979004f, 0.095337f, 0.979492f, 0.090759f, + 0.979492f, 0.086731f, 0.980469f, 0.082703f, 0.981934f, 0.078491f, 0.982422f, 0.074646f, + 0.983887f, 0.070862f, 0.983887f, 0.067200f, 0.984375f, 0.063782f, 0.984863f, 0.060516f, + 0.984863f, 0.057465f, 0.985840f, 0.054230f, 0.986328f, 0.051208f, 0.986816f, 0.048218f, + 0.987305f, 0.045349f, 0.988281f, 0.042389f, 0.988770f, 0.039551f, 0.989258f, 0.036804f, + 0.989258f, 0.034302f, 0.989746f, 0.031799f, 0.989746f, 0.029480f, 0.990234f, 0.027191f, + 0.990723f, 0.024826f, 0.991211f, 0.022507f, 0.991211f, 0.020325f, 0.991699f, 0.018127f, + 0.992188f, 0.015945f, 0.993652f, 0.013298f, 0.993164f, 0.011261f, 0.993164f, 0.009483f, + 0.993652f, 0.007664f, 0.993652f, 0.006149f, 0.993652f, 0.004696f, 0.992676f, 0.002760f, + 0.000000f, 1.000000f, 0.692383f, 0.705566f, 0.788574f, 0.582031f, 0.835449f, 0.502930f, + 0.868652f, 0.443604f, 0.889160f, 0.397949f, 0.905273f, 0.360840f, 0.917969f, 0.329834f, + 0.925781f, 0.304199f, 0.934082f, 0.281250f, 0.940430f, 0.261230f, 0.945312f, 0.244019f, + 0.950195f, 0.227905f, 0.954590f, 0.213867f, 0.957520f, 0.201172f, 0.960938f, 0.189087f, + 0.962402f, 0.178589f, 0.964844f, 0.168823f, 0.967773f, 0.159180f, 0.969238f, 0.150757f, + 0.971191f, 0.142822f, 0.971680f, 0.135742f, 0.974609f, 0.128296f, 0.975586f, 0.121826f, + 0.976074f, 0.115906f, 0.977051f, 0.110229f, 0.979492f, 0.104492f, 0.979980f, 0.099060f, + 0.980469f, 0.094299f, 0.980957f, 0.089722f, 0.981934f, 0.085205f, 0.982910f, 0.080933f, + 0.984375f, 0.076477f, 0.984375f, 0.072632f, 0.985352f, 0.068848f, 0.985352f, 0.065369f, + 0.985840f, 0.062042f, 0.985840f, 0.058929f, 0.987305f, 0.055420f, 0.987793f, 0.052277f, + 0.988770f, 0.049103f, 0.989258f, 0.046173f, 0.989258f, 0.043457f, 0.989258f, 0.040924f, + 0.990234f, 0.038177f, 0.990234f, 0.035736f, 0.989746f, 0.033478f, 0.990234f, 0.031128f, + 0.990234f, 0.029007f, 0.991211f, 0.026596f, 0.991699f, 0.024445f, 0.991699f, 0.022354f, + 0.992676f, 0.020142f, 0.993164f, 0.017929f, 0.993652f, 0.015808f, 0.993652f, 0.014038f, + 0.993652f, 0.012398f, 0.994141f, 0.010811f, 0.994141f, 0.009163f, 0.994141f, 0.007805f, + 0.994629f, 0.006386f, 0.994141f, 0.005188f, 0.994629f, 0.003971f, 0.994629f, 0.002979f, + 0.000000f, 1.000000f, 0.712402f, 0.698242f, 0.807129f, 0.572754f, 0.853516f, 0.492920f, + 0.882812f, 0.433838f, 0.902344f, 0.387695f, 0.917969f, 0.350342f, 0.928223f, 0.319824f, + 0.936035f, 0.293701f, 0.942871f, 0.270508f, 0.947754f, 0.250977f, 0.953125f, 0.233276f, + 0.957520f, 0.217407f, 0.960449f, 0.203369f, 0.963867f, 0.190308f, 0.965820f, 0.178955f, + 0.968262f, 0.168091f, 0.970703f, 0.158203f, 0.971680f, 0.149292f, 0.974121f, 0.140747f, + 0.975098f, 0.133057f, 0.976562f, 0.125610f, 0.978027f, 0.118835f, 0.979492f, 0.112183f, + 0.979980f, 0.106384f, 0.980469f, 0.100830f, 0.981445f, 0.095459f, 0.982910f, 0.090271f, + 0.983887f, 0.085266f, 0.983887f, 0.080933f, 0.985352f, 0.076477f, 0.985352f, 0.072449f, + 0.985840f, 0.068665f, 0.986328f, 0.065063f, 0.987305f, 0.061401f, 0.988770f, 0.057739f, + 0.988770f, 0.054352f, 0.989258f, 0.051178f, 0.989258f, 0.048309f, 0.989258f, 0.045624f, + 0.990234f, 0.042877f, 0.990234f, 0.040192f, 0.990723f, 0.037659f, 0.990723f, 0.035309f, + 0.991211f, 0.032990f, 0.991211f, 0.030823f, 0.992188f, 0.028397f, 0.992676f, 0.026184f, + 0.993652f, 0.023880f, 0.993652f, 0.021820f, 0.994141f, 0.019882f, 0.994141f, 0.018005f, + 0.994141f, 0.016342f, 0.994141f, 0.014786f, 0.994141f, 0.013229f, 0.994141f, 0.011673f, + 0.994141f, 0.010323f, 0.994141f, 0.009087f, 0.994629f, 0.007652f, 0.994629f, 0.006546f, + 0.995117f, 0.005310f, 0.995117f, 0.004387f, 0.995117f, 0.003315f, 0.996094f, 0.002047f, + 0.000000f, 1.000000f, 0.730469f, 0.691895f, 0.822754f, 0.565430f, 0.868164f, 0.484863f, + 0.894531f, 0.425537f, 0.913086f, 0.379150f, 0.925781f, 0.342285f, 0.936523f, 0.310791f, + 0.944824f, 0.284424f, 0.949707f, 0.261963f, 0.954590f, 0.241943f, 0.958984f, 0.224487f, + 0.963379f, 0.208374f, 0.965332f, 0.194824f, 0.968262f, 0.181641f, 0.970215f, 0.170166f, + 0.973145f, 0.159302f, 0.974121f, 0.149658f, 0.975586f, 0.140747f, 0.977539f, 0.132324f, + 0.979004f, 0.124512f, 0.979980f, 0.117310f, 0.980469f, 0.110901f, 0.981445f, 0.104614f, + 0.983398f, 0.098328f, 0.983887f, 0.092773f, 0.984375f, 0.087769f, 0.984863f, 0.082886f, + 0.985840f, 0.078186f, 0.986328f, 0.073853f, 0.987305f, 0.069641f, 0.988281f, 0.065491f, + 0.988281f, 0.061798f, 0.989258f, 0.058044f, 0.989258f, 0.054749f, 0.989258f, 0.051697f, + 0.989746f, 0.048645f, 0.989746f, 0.045868f, 0.990723f, 0.042908f, 0.990723f, 0.040314f, + 0.991211f, 0.037750f, 0.991211f, 0.035400f, 0.991699f, 0.033020f, 0.992676f, 0.030472f, + 0.993652f, 0.027954f, 0.993652f, 0.025848f, 0.993652f, 0.023926f, 0.994141f, 0.021973f, + 0.994141f, 0.020172f, 0.994141f, 0.018524f, 0.994141f, 0.016983f, 0.994629f, 0.015373f, + 0.994629f, 0.013885f, 0.994629f, 0.012543f, 0.994629f, 0.011292f, 0.995117f, 0.009865f, + 0.995117f, 0.008713f, 0.995605f, 0.007580f, 0.995605f, 0.006413f, 0.995117f, 0.005505f, + 0.995605f, 0.004375f, 0.996094f, 0.003344f, 0.996582f, 0.002335f, 0.998047f, 0.000193f, + 0.000000f, 1.000000f, 0.748047f, 0.685547f, 0.839355f, 0.558105f, 0.880859f, 0.477539f, + 0.906738f, 0.417969f, 0.923340f, 0.371338f, 0.934570f, 0.334473f, 0.943848f, 0.303223f, + 0.950684f, 0.276855f, 0.956543f, 0.254150f, 0.960938f, 0.234375f, 0.963867f, 0.216919f, + 0.967773f, 0.200928f, 0.969727f, 0.187256f, 0.972656f, 0.174072f, 0.973633f, 0.162964f, + 0.976562f, 0.152100f, 0.977539f, 0.142456f, 0.978516f, 0.133667f, 0.979980f, 0.125366f, + 0.981445f, 0.117676f, 0.982910f, 0.110535f, 0.983887f, 0.103699f, 0.984375f, 0.097656f, + 0.984863f, 0.092041f, 0.985352f, 0.086670f, 0.986328f, 0.081543f, 0.987793f, 0.076538f, + 0.988281f, 0.071838f, 0.988281f, 0.067688f, 0.988770f, 0.063721f, 0.989258f, 0.059906f, + 0.989746f, 0.056335f, 0.989746f, 0.053040f, 0.990234f, 0.049896f, 0.990723f, 0.046783f, + 0.991211f, 0.043793f, 0.991211f, 0.041107f, 0.991699f, 0.038422f, 0.992676f, 0.035736f, + 0.993652f, 0.032867f, 0.993652f, 0.030548f, 0.993652f, 0.028412f, 0.993652f, 0.026428f, + 0.994141f, 0.024384f, 0.994141f, 0.022552f, 0.994141f, 0.020844f, 0.994141f, 0.019257f, + 0.994629f, 0.017563f, 0.994629f, 0.016052f, 0.994629f, 0.014679f, 0.994629f, 0.013397f, + 0.995117f, 0.011932f, 0.995117f, 0.010742f, 0.995605f, 0.009621f, 0.995605f, 0.008362f, + 0.995605f, 0.007374f, 0.996094f, 0.006222f, 0.996094f, 0.005341f, 0.996582f, 0.004272f, + 0.997070f, 0.003265f, 0.997070f, 0.002253f, 0.998535f, 0.000515f, 0.998535f, 0.000015f, + 0.000000f, 1.000000f, 0.762695f, 0.680664f, 0.852539f, 0.552246f, 0.892090f, 0.471191f, + 0.913574f, 0.412598f, 0.931641f, 0.365234f, 0.942383f, 0.327881f, 0.950684f, 0.296631f, + 0.956543f, 0.270508f, 0.961914f, 0.247803f, 0.965332f, 0.228027f, 0.968750f, 0.210327f, + 0.971680f, 0.194702f, 0.973633f, 0.180664f, 0.975586f, 0.168213f, 0.978027f, 0.156372f, + 0.979004f, 0.145996f, 0.979980f, 0.136475f, 0.982422f, 0.127319f, 0.983398f, 0.119141f, + 0.983887f, 0.111816f, 0.984863f, 0.104797f, 0.985352f, 0.098267f, 0.985840f, 0.092285f, + 0.987305f, 0.086487f, 0.988281f, 0.080750f, 0.988281f, 0.075928f, 0.988770f, 0.071289f, + 0.988770f, 0.067139f, 0.989746f, 0.062805f, 0.989746f, 0.059113f, 0.990234f, 0.055450f, + 0.990723f, 0.052063f, 0.991211f, 0.048645f, 0.991699f, 0.045441f, 0.992188f, 0.042419f, + 0.993164f, 0.039307f, 0.993652f, 0.036499f, 0.993652f, 0.033966f, 0.993652f, 0.031677f, + 0.993652f, 0.029541f, 0.994141f, 0.027359f, 0.994141f, 0.025360f, 0.994141f, 0.023544f, + 0.994141f, 0.021835f, 0.994629f, 0.020020f, 0.994629f, 0.018433f, 0.994629f, 0.016968f, + 0.995117f, 0.015480f, 0.995117f, 0.014053f, 0.995117f, 0.012802f, 0.995605f, 0.011520f, + 0.995605f, 0.010292f, 0.995605f, 0.009232f, 0.996094f, 0.008034f, 0.996094f, 0.007069f, + 0.996582f, 0.005962f, 0.997070f, 0.005047f, 0.997070f, 0.004066f, 0.998047f, 0.002935f, + 0.999023f, 0.001466f, 0.999023f, 0.000664f, 0.999023f, 0.000200f, 0.998535f, 0.000005f, + 0.000000f, 1.000000f, 0.778809f, 0.675293f, 0.863770f, 0.546875f, 0.901367f, 0.465576f, + 0.922363f, 0.406738f, 0.937988f, 0.359863f, 0.948242f, 0.322510f, 0.956055f, 0.291260f, + 0.962402f, 0.264893f, 0.965820f, 0.242554f, 0.969238f, 0.222656f, 0.972168f, 0.205078f, + 0.974121f, 0.189697f, 0.977539f, 0.175171f, 0.979004f, 0.162720f, 0.980469f, 0.151367f, + 0.982422f, 0.140503f, 0.983398f, 0.130981f, 0.984375f, 0.122314f, 0.984863f, 0.114502f, + 0.986328f, 0.106812f, 0.986816f, 0.099915f, 0.988281f, 0.093140f, 0.988770f, 0.087158f, + 0.989258f, 0.081543f, 0.989258f, 0.076538f, 0.989746f, 0.071777f, 0.990234f, 0.067200f, + 0.990723f, 0.062866f, 0.991211f, 0.058899f, 0.991699f, 0.055145f, 0.992676f, 0.051300f, + 0.993652f, 0.047607f, 0.993652f, 0.044342f, 0.994141f, 0.041351f, 0.994141f, 0.038452f, + 0.994141f, 0.035858f, 0.994141f, 0.033478f, 0.994629f, 0.031082f, 0.994629f, 0.028854f, + 0.994629f, 0.026825f, 0.994629f, 0.024933f, 0.995117f, 0.022949f, 0.995117f, 0.021210f, + 0.994629f, 0.019608f, 0.995117f, 0.017944f, 0.995117f, 0.016434f, 0.995117f, 0.015068f, + 0.995605f, 0.013634f, 0.995605f, 0.012344f, 0.995605f, 0.011200f, 0.996094f, 0.009903f, + 0.996094f, 0.008865f, 0.996582f, 0.007683f, 0.996582f, 0.006748f, 0.997070f, 0.005638f, + 0.997559f, 0.004570f, 0.998535f, 0.003340f, 0.999023f, 0.002111f, 0.999023f, 0.001382f, + 0.999023f, 0.000828f, 0.999023f, 0.000409f, 0.999023f, 0.000123f, 0.999023f, 0.000003f, + 0.000000f, 1.000000f, 0.792480f, 0.670410f, 0.874512f, 0.541992f, 0.910645f, 0.460693f, + 0.930664f, 0.401855f, 0.945312f, 0.354980f, 0.953125f, 0.317871f, 0.960449f, 0.286865f, + 0.965820f, 0.260254f, 0.970703f, 0.237549f, 0.972656f, 0.218018f, 0.976074f, 0.200195f, + 0.978027f, 0.184692f, 0.979492f, 0.170776f, 0.982422f, 0.157837f, 0.982910f, 0.146484f, + 0.983887f, 0.136353f, 0.984863f, 0.126831f, 0.985840f, 0.118164f, 0.987793f, 0.109741f, + 0.988281f, 0.102234f, 0.988281f, 0.095642f, 0.989258f, 0.089172f, 0.989746f, 0.083374f, + 0.989746f, 0.078003f, 0.990723f, 0.072815f, 0.991211f, 0.067993f, 0.991699f, 0.063477f, + 0.992188f, 0.059235f, 0.993652f, 0.054749f, 0.993652f, 0.050995f, 0.993652f, 0.047607f, + 0.994141f, 0.044312f, 0.994141f, 0.041260f, 0.994141f, 0.038483f, 0.994141f, 0.035919f, + 0.994629f, 0.033264f, 0.994629f, 0.030945f, 0.994629f, 0.028778f, 0.995117f, 0.026581f, + 0.995117f, 0.024597f, 0.995117f, 0.022781f, 0.995605f, 0.020935f, 0.995605f, 0.019241f, + 0.995605f, 0.017715f, 0.996094f, 0.016113f, 0.996094f, 0.014709f, 0.996094f, 0.013435f, + 0.996582f, 0.012009f, 0.996582f, 0.010857f, 0.997070f, 0.009560f, 0.997559f, 0.008408f, + 0.997559f, 0.007324f, 0.997559f, 0.006172f, 0.998535f, 0.004894f, 0.999023f, 0.003607f, + 0.999023f, 0.002758f, 0.999023f, 0.002066f, 0.999023f, 0.001485f, 0.999023f, 0.000998f, + 0.999023f, 0.000601f, 0.999023f, 0.000295f, 0.999023f, 0.000086f, 0.999023f, 0.000002f, + 0.000000f, 1.000000f, 0.805664f, 0.666016f, 0.885254f, 0.537598f, 0.917969f, 0.456787f, + 0.935547f, 0.398193f, 0.949707f, 0.351074f, 0.958496f, 0.313721f, 0.964844f, 0.282715f, + 0.969238f, 0.256348f, 0.973145f, 0.233643f, 0.976074f, 0.213745f, 0.978027f, 0.196411f, + 0.979980f, 0.180786f, 0.981934f, 0.166626f, 0.982910f, 0.154297f, 0.984375f, 0.142944f, + 0.985840f, 0.132446f, 0.987305f, 0.122742f, 0.988281f, 0.113953f, 0.988281f, 0.106201f, + 0.988770f, 0.098999f, 0.989746f, 0.092102f, 0.990234f, 0.085938f, 0.990234f, 0.080261f, + 0.991211f, 0.074646f, 0.992188f, 0.069397f, 0.993164f, 0.064331f, 0.993652f, 0.059723f, + 0.993652f, 0.055634f, 0.993652f, 0.051910f, 0.994141f, 0.048248f, 0.994141f, 0.044952f, + 0.994141f, 0.041901f, 0.994629f, 0.038910f, 0.994629f, 0.036163f, 0.994629f, 0.033630f, + 0.995117f, 0.031158f, 0.995117f, 0.028839f, 0.995117f, 0.026749f, 0.995605f, 0.024643f, + 0.995605f, 0.022705f, 0.995605f, 0.020966f, 0.996094f, 0.019135f, 0.996094f, 0.017548f, + 0.996582f, 0.015961f, 0.996582f, 0.014496f, 0.997070f, 0.013092f, 0.997070f, 0.011742f, + 0.997559f, 0.010406f, 0.998047f, 0.009201f, 0.998535f, 0.007942f, 0.999512f, 0.006516f, + 0.999512f, 0.005203f, 0.999512f, 0.004269f, 0.999512f, 0.003471f, 0.999512f, 0.002773f, + 0.999512f, 0.002163f, 0.999512f, 0.001632f, 0.999512f, 0.001172f, 0.999023f, 0.000785f, + 0.999023f, 0.000469f, 0.999023f, 0.000226f, 0.999023f, 0.000064f, 0.999023f, 0.000001f, + 0.000000f, 1.000000f, 0.817871f, 0.662109f, 0.894043f, 0.533691f, 0.924805f, 0.453125f, + 0.941406f, 0.394531f, 0.954590f, 0.347656f, 0.962402f, 0.310059f, 0.967773f, 0.279053f, + 0.972168f, 0.252686f, 0.975586f, 0.229980f, 0.978027f, 0.210571f, 0.980957f, 0.192627f, + 0.982422f, 0.177124f, 0.983887f, 0.163452f, 0.984863f, 0.151001f, 0.987305f, 0.139160f, + 0.987793f, 0.128784f, 0.988281f, 0.119751f, 0.988770f, 0.111084f, 0.989258f, 0.103333f, + 0.990234f, 0.095947f, 0.990723f, 0.089233f, 0.991699f, 0.082947f, 0.993164f, 0.076660f, + 0.993164f, 0.071167f, 0.993652f, 0.066101f, 0.993652f, 0.061523f, 0.993652f, 0.057312f, + 0.994141f, 0.053253f, 0.994141f, 0.049561f, 0.994141f, 0.046173f, 0.994629f, 0.042816f, + 0.994629f, 0.039795f, 0.994629f, 0.036987f, 0.995117f, 0.034180f, 0.995117f, 0.031708f, + 0.995605f, 0.029358f, 0.995605f, 0.027039f, 0.995605f, 0.024979f, 0.996094f, 0.022888f, + 0.996094f, 0.021042f, 0.996582f, 0.019211f, 0.996582f, 0.017532f, 0.997070f, 0.015884f, + 0.997070f, 0.014389f, 0.997559f, 0.012848f, 0.998047f, 0.011383f, 0.998535f, 0.009941f, + 0.999512f, 0.008308f, 0.999512f, 0.007061f, 0.999512f, 0.006020f, 0.999512f, 0.005104f, + 0.999512f, 0.004288f, 0.999512f, 0.003557f, 0.999512f, 0.002905f, 0.999512f, 0.002321f, + 0.999512f, 0.001806f, 0.999512f, 0.001356f, 0.999512f, 0.000968f, 0.999512f, 0.000643f, + 0.999512f, 0.000380f, 0.999512f, 0.000181f, 0.999023f, 0.000050f, 0.999023f, 0.000001f, + 0.000000f, 1.000000f, 0.829102f, 0.658691f, 0.903320f, 0.530273f, 0.932129f, 0.449463f, + 0.945801f, 0.391357f, 0.957520f, 0.344727f, 0.965820f, 0.307129f, 0.970215f, 0.276367f, + 0.974609f, 0.249756f, 0.978027f, 0.227173f, 0.980957f, 0.206909f, 0.981934f, 0.189941f, + 0.983887f, 0.174438f, 0.985352f, 0.160522f, 0.986816f, 0.147705f, 0.987793f, 0.136353f, + 0.988281f, 0.126343f, 0.989258f, 0.117004f, 0.989746f, 0.108582f, 0.990723f, 0.100525f, + 0.991699f, 0.093201f, 0.993164f, 0.085938f, 0.993164f, 0.079712f, 0.993164f, 0.074158f, + 0.993652f, 0.068787f, 0.993652f, 0.063965f, 0.994141f, 0.059448f, 0.994141f, 0.055237f, + 0.994141f, 0.051422f, 0.994629f, 0.047638f, 0.994629f, 0.044250f, 0.995117f, 0.041046f, + 0.995117f, 0.037994f, 0.995117f, 0.035248f, 0.995605f, 0.032471f, 0.995605f, 0.030045f, + 0.996094f, 0.027618f, 0.996094f, 0.025436f, 0.996582f, 0.023285f, 0.996582f, 0.021332f, + 0.997070f, 0.019394f, 0.997070f, 0.017670f, 0.997559f, 0.015884f, 0.998047f, 0.014183f, + 0.999023f, 0.012512f, 0.999512f, 0.010674f, 0.999512f, 0.009315f, 0.999512f, 0.008133f, + 0.999512f, 0.007080f, 0.999512f, 0.006119f, 0.999512f, 0.005249f, 0.999512f, 0.004463f, + 0.999512f, 0.003748f, 0.999512f, 0.003103f, 0.999512f, 0.002525f, 0.999512f, 0.002010f, + 0.999512f, 0.001557f, 0.999512f, 0.001162f, 0.999512f, 0.000824f, 0.999512f, 0.000542f, + 0.999512f, 0.000317f, 0.999512f, 0.000149f, 0.999512f, 0.000040f, 0.999023f, 0.000001f, + 0.000000f, 1.000000f, 0.837891f, 0.656250f, 0.908691f, 0.527344f, 0.937012f, 0.446533f, + 0.950684f, 0.388428f, 0.960938f, 0.342041f, 0.967773f, 0.304688f, 0.973633f, 0.273193f, + 0.977051f, 0.247192f, 0.980469f, 0.224121f, 0.981934f, 0.204712f, 0.984375f, 0.187378f, + 0.986328f, 0.171387f, 0.987305f, 0.157715f, 0.987793f, 0.145386f, 0.988281f, 0.134277f, + 0.989746f, 0.124023f, 0.990234f, 0.114685f, 0.991699f, 0.105896f, 0.992676f, 0.097656f, + 0.993164f, 0.090332f, 0.993164f, 0.083801f, 0.993652f, 0.077759f, 0.993652f, 0.072144f, + 0.993652f, 0.067078f, 0.994141f, 0.062164f, 0.994141f, 0.057800f, 0.994629f, 0.053528f, + 0.994629f, 0.049683f, 0.995117f, 0.045990f, 0.995117f, 0.042633f, 0.995605f, 0.039429f, + 0.995605f, 0.036407f, 0.996094f, 0.033630f, 0.996094f, 0.030945f, 0.996582f, 0.028442f, + 0.996582f, 0.026093f, 0.997070f, 0.023804f, 0.997070f, 0.021790f, 0.997559f, 0.019699f, + 0.998047f, 0.017715f, 0.999512f, 0.015594f, 0.999512f, 0.013680f, 0.999512f, 0.012138f, + 0.999512f, 0.010765f, 0.999512f, 0.009521f, 0.999512f, 0.008385f, 0.999512f, 0.007351f, + 0.999512f, 0.006397f, 0.999512f, 0.005531f, 0.999512f, 0.004738f, 0.999512f, 0.004017f, + 0.999512f, 0.003366f, 0.999512f, 0.002777f, 0.999512f, 0.002251f, 0.999512f, 0.001785f, + 0.999512f, 0.001374f, 0.999512f, 0.001019f, 0.999512f, 0.000718f, 0.999512f, 0.000468f, + 0.999512f, 0.000271f, 0.999512f, 0.000125f, 0.999512f, 0.000033f, 0.999512f, 0.000001f, + 0.000000f, 1.000000f, 0.849609f, 0.652344f, 0.916992f, 0.523926f, 0.941895f, 0.444092f, + 0.955078f, 0.385742f, 0.964355f, 0.339844f, 0.971191f, 0.302002f, 0.975098f, 0.271240f, + 0.979492f, 0.244629f, 0.981934f, 0.222290f, 0.983887f, 0.202393f, 0.986328f, 0.184570f, + 0.987305f, 0.169434f, 0.987793f, 0.155762f, 0.988770f, 0.143311f, 0.989746f, 0.132202f, + 0.990723f, 0.121826f, 0.992676f, 0.111877f, 0.992676f, 0.103455f, 0.993164f, 0.095642f, + 0.993164f, 0.088684f, 0.993652f, 0.082092f, 0.993652f, 0.076172f, 0.994141f, 0.070557f, + 0.994141f, 0.065491f, 0.994629f, 0.060638f, 0.994629f, 0.056244f, 0.995117f, 0.052032f, + 0.995117f, 0.048218f, 0.995605f, 0.044495f, 0.995605f, 0.041168f, 0.996094f, 0.037903f, + 0.996094f, 0.035004f, 0.996582f, 0.032074f, 0.997070f, 0.029388f, 0.997070f, 0.026947f, + 0.997559f, 0.024490f, 0.998535f, 0.022049f, 0.999512f, 0.019547f, 0.999512f, 0.017487f, + 0.999512f, 0.015686f, 0.999512f, 0.014069f, 0.999512f, 0.012589f, 0.999512f, 0.011230f, + 0.999512f, 0.009979f, 0.999512f, 0.008835f, 0.999512f, 0.007778f, 0.999512f, 0.006805f, + 0.999512f, 0.005917f, 0.999512f, 0.005104f, 0.999512f, 0.004364f, 0.999512f, 0.003689f, + 0.999512f, 0.003080f, 0.999512f, 0.002533f, 0.999512f, 0.002047f, 0.999512f, 0.001615f, + 0.999512f, 0.001237f, 0.999512f, 0.000912f, 0.999512f, 0.000638f, 0.999512f, 0.000413f, + 0.999512f, 0.000237f, 0.999512f, 0.000108f, 0.999512f, 0.000028f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.857910f, 0.649902f, 0.921875f, 0.521973f, 0.947266f, 0.441406f, + 0.958008f, 0.383789f, 0.965820f, 0.338379f, 0.972656f, 0.300293f, 0.978027f, 0.268799f, + 0.980469f, 0.242920f, 0.983398f, 0.220215f, 0.985840f, 0.200073f, 0.986816f, 0.182861f, + 0.987793f, 0.167725f, 0.989258f, 0.153931f, 0.990234f, 0.141479f, 0.992188f, 0.129517f, + 0.992676f, 0.119385f, 0.992676f, 0.110229f, 0.993164f, 0.101868f, 0.993164f, 0.094299f, + 0.993652f, 0.087219f, 0.993652f, 0.080872f, 0.994141f, 0.074768f, 0.994629f, 0.069214f, + 0.994629f, 0.064087f, 0.995117f, 0.059296f, 0.995117f, 0.054901f, 0.995605f, 0.050659f, + 0.995605f, 0.046875f, 0.996094f, 0.043152f, 0.996582f, 0.039673f, 0.997070f, 0.036499f, + 0.997070f, 0.033447f, 0.997559f, 0.030548f, 0.998535f, 0.027634f, 0.999512f, 0.024704f, + 0.999512f, 0.022293f, 0.999512f, 0.020157f, 0.999512f, 0.018219f, 0.999512f, 0.016449f, + 0.999512f, 0.014816f, 0.999512f, 0.013306f, 0.999512f, 0.011909f, 0.999512f, 0.010620f, + 0.999512f, 0.009430f, 0.999512f, 0.008339f, 0.999512f, 0.007332f, 0.999512f, 0.006405f, + 0.999512f, 0.005558f, 0.999512f, 0.004784f, 0.999512f, 0.004078f, 0.999512f, 0.003441f, + 0.999512f, 0.002865f, 0.999512f, 0.002348f, 0.999512f, 0.001890f, 0.999512f, 0.001485f, + 0.999512f, 0.001133f, 0.999512f, 0.000831f, 0.999512f, 0.000578f, 0.999512f, 0.000371f, + 0.999512f, 0.000211f, 0.999512f, 0.000095f, 0.999512f, 0.000025f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.864746f, 0.647949f, 0.926758f, 0.520020f, 0.949707f, 0.439697f, + 0.961426f, 0.381592f, 0.967773f, 0.336670f, 0.975586f, 0.298340f, 0.979004f, 0.267334f, + 0.982422f, 0.241211f, 0.984863f, 0.218140f, 0.986328f, 0.198730f, 0.987305f, 0.181641f, + 0.988770f, 0.166138f, 0.990723f, 0.151855f, 0.992188f, 0.139038f, 0.992188f, 0.128052f, + 0.992676f, 0.118042f, 0.993164f, 0.108948f, 0.993164f, 0.100769f, 0.993652f, 0.093018f, + 0.994141f, 0.085999f, 0.994141f, 0.079590f, 0.994629f, 0.073547f, 0.995117f, 0.067993f, + 0.995117f, 0.062866f, 0.995605f, 0.058014f, 0.996094f, 0.053528f, 0.996094f, 0.049408f, + 0.996582f, 0.045441f, 0.997070f, 0.041687f, 0.997559f, 0.038177f, 0.998535f, 0.034729f, + 0.999512f, 0.031250f, 0.999512f, 0.028366f, 0.999512f, 0.025803f, 0.999512f, 0.023468f, + 0.999512f, 0.021317f, 0.999512f, 0.019318f, 0.999512f, 0.017487f, 0.999512f, 0.015793f, + 0.999512f, 0.014221f, 0.999512f, 0.012764f, 0.999512f, 0.011414f, 0.999512f, 0.010170f, + 0.999512f, 0.009026f, 0.999512f, 0.007965f, 0.999512f, 0.006992f, 0.999512f, 0.006100f, + 0.999512f, 0.005283f, 0.999512f, 0.004539f, 0.999512f, 0.003864f, 0.999512f, 0.003250f, + 0.999512f, 0.002701f, 0.999512f, 0.002207f, 0.999512f, 0.001771f, 0.999512f, 0.001387f, + 0.999512f, 0.001054f, 0.999512f, 0.000770f, 0.999512f, 0.000533f, 0.999512f, 0.000340f, + 0.999512f, 0.000192f, 0.999512f, 0.000086f, 0.999512f, 0.000022f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.874023f, 0.645020f, 0.931641f, 0.518066f, 0.953125f, 0.437744f, + 0.964355f, 0.379883f, 0.969727f, 0.335205f, 0.976074f, 0.297363f, 0.980469f, 0.266113f, + 0.983887f, 0.239380f, 0.985840f, 0.216919f, 0.987305f, 0.197388f, 0.988770f, 0.180054f, + 0.991211f, 0.163818f, 0.991699f, 0.150146f, 0.992188f, 0.137939f, 0.992676f, 0.126953f, + 0.993164f, 0.116943f, 0.993164f, 0.108032f, 0.993652f, 0.099609f, 0.994141f, 0.091919f, + 0.994629f, 0.084900f, 0.994629f, 0.078491f, 0.995117f, 0.072449f, 0.995605f, 0.066772f, + 0.996094f, 0.061584f, 0.996582f, 0.056732f, 0.997070f, 0.052185f, 0.997559f, 0.047852f, + 0.998047f, 0.043762f, 0.999512f, 0.039520f, 0.999512f, 0.036011f, 0.999512f, 0.032898f, + 0.999512f, 0.030060f, 0.999512f, 0.027435f, 0.999512f, 0.025009f, 0.999512f, 0.022766f, + 0.999512f, 0.020676f, 0.999512f, 0.018753f, 0.999512f, 0.016968f, 0.999512f, 0.015312f, + 0.999512f, 0.013779f, 0.999512f, 0.012360f, 0.999512f, 0.011047f, 0.999512f, 0.009834f, + 0.999512f, 0.008713f, 0.999512f, 0.007687f, 0.999512f, 0.006737f, 0.999512f, 0.005871f, + 0.999512f, 0.005077f, 0.999512f, 0.004353f, 0.999512f, 0.003698f, 0.999512f, 0.003107f, + 0.999512f, 0.002575f, 0.999512f, 0.002100f, 0.999512f, 0.001680f, 0.999512f, 0.001312f, + 0.999512f, 0.000995f, 0.999512f, 0.000724f, 0.999512f, 0.000499f, 0.999512f, 0.000317f, + 0.999512f, 0.000178f, 0.999512f, 0.000079f, 0.999512f, 0.000020f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.880371f, 0.643555f, 0.934570f, 0.517090f, 0.957031f, 0.435791f, + 0.966309f, 0.378174f, 0.972656f, 0.333008f, 0.977539f, 0.296143f, 0.982422f, 0.264160f, + 0.984375f, 0.238403f, 0.986816f, 0.215820f, 0.988770f, 0.195923f, 0.991211f, 0.177856f, + 0.991699f, 0.162598f, 0.992188f, 0.149170f, 0.992676f, 0.136963f, 0.993164f, 0.125977f, + 0.993164f, 0.116150f, 0.993652f, 0.107056f, 0.994141f, 0.098633f, 0.994629f, 0.090942f, + 0.995117f, 0.083862f, 0.995605f, 0.077271f, 0.996094f, 0.071167f, 0.996582f, 0.065552f, + 0.997070f, 0.060242f, 0.998047f, 0.055176f, 0.999512f, 0.050110f, 0.999512f, 0.045685f, + 0.999512f, 0.041840f, 0.999512f, 0.038330f, 0.999512f, 0.035126f, 0.999512f, 0.032135f, + 0.999512f, 0.029388f, 0.999512f, 0.026840f, 0.999512f, 0.024475f, 0.999512f, 0.022278f, + 0.999512f, 0.020233f, 0.999512f, 0.018341f, 0.999512f, 0.016586f, 0.999512f, 0.014961f, + 0.999512f, 0.013458f, 0.999512f, 0.012062f, 0.999512f, 0.010773f, 0.999512f, 0.009575f, + 0.999512f, 0.008484f, 0.999512f, 0.007473f, 0.999512f, 0.006542f, 0.999512f, 0.005695f, + 0.999512f, 0.004917f, 0.999512f, 0.004211f, 0.999512f, 0.003574f, 0.999512f, 0.002998f, + 0.999512f, 0.002480f, 0.999512f, 0.002020f, 0.999512f, 0.001613f, 0.999512f, 0.001257f, + 0.999512f, 0.000950f, 0.999512f, 0.000690f, 0.999512f, 0.000473f, 0.999512f, 0.000300f, + 0.999512f, 0.000167f, 0.999512f, 0.000074f, 0.999512f, 0.000018f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.887695f, 0.641113f, 0.938965f, 0.515137f, 0.959473f, 0.434570f, + 0.969727f, 0.376465f, 0.974121f, 0.332031f, 0.979004f, 0.295166f, 0.982910f, 0.263672f, + 0.985352f, 0.237427f, 0.988770f, 0.214233f, 0.990234f, 0.194214f, 0.991211f, 0.177002f, + 0.991699f, 0.161987f, 0.992188f, 0.148438f, 0.992676f, 0.136353f, 0.993164f, 0.125366f, + 0.993652f, 0.115295f, 0.994141f, 0.106140f, 0.995117f, 0.097656f, 0.995605f, 0.089844f, + 0.996094f, 0.082703f, 0.996582f, 0.076050f, 0.997559f, 0.069763f, 0.998535f, 0.063721f, + 0.999512f, 0.057983f, 0.999512f, 0.053162f, 0.999512f, 0.048828f, 0.999512f, 0.044830f, + 0.999512f, 0.041138f, 0.999512f, 0.037720f, 0.999512f, 0.034576f, 0.999512f, 0.031647f, + 0.999512f, 0.028946f, 0.999512f, 0.026428f, 0.999512f, 0.024094f, 0.999512f, 0.021912f, + 0.999512f, 0.019913f, 0.999512f, 0.018036f, 0.999512f, 0.016296f, 0.999512f, 0.014702f, + 0.999512f, 0.013214f, 0.999512f, 0.011833f, 0.999512f, 0.010567f, 0.999512f, 0.009392f, + 0.999512f, 0.008308f, 0.999512f, 0.007313f, 0.999512f, 0.006401f, 0.999512f, 0.005566f, + 0.999512f, 0.004803f, 0.999512f, 0.004108f, 0.999512f, 0.003483f, 0.999512f, 0.002916f, + 0.999512f, 0.002411f, 0.999512f, 0.001961f, 0.999512f, 0.001563f, 0.999512f, 0.001216f, + 0.999512f, 0.000918f, 0.999512f, 0.000665f, 0.999512f, 0.000455f, 0.999512f, 0.000288f, + 0.999512f, 0.000160f, 0.999512f, 0.000070f, 0.999512f, 0.000017f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.892090f, 0.640137f, 0.942383f, 0.513672f, 0.962891f, 0.432617f, + 0.971191f, 0.375000f, 0.977051f, 0.330078f, 0.979004f, 0.294678f, 0.983398f, 0.263184f, + 0.987793f, 0.235840f, 0.989746f, 0.212891f, 0.990234f, 0.193726f, 0.991211f, 0.176514f, + 0.992188f, 0.161377f, 0.992676f, 0.147827f, 0.993164f, 0.135620f, 0.994141f, 0.124451f, + 0.994629f, 0.114319f, 0.995117f, 0.105103f, 0.996094f, 0.096497f, 0.996582f, 0.088623f, + 0.998047f, 0.081055f, 0.999512f, 0.073669f, 0.999512f, 0.067566f, 0.999512f, 0.062073f, + 0.999512f, 0.057068f, 0.999512f, 0.052460f, 0.999512f, 0.048218f, 0.999512f, 0.044312f, + 0.999512f, 0.040680f, 0.999512f, 0.037323f, 0.999512f, 0.034210f, 0.999512f, 0.031311f, + 0.999512f, 0.028625f, 0.999512f, 0.026123f, 0.999512f, 0.023819f, 0.999512f, 0.021667f, + 0.999512f, 0.019669f, 0.999512f, 0.017822f, 0.999512f, 0.016098f, 0.999512f, 0.014511f, + 0.999512f, 0.013039f, 0.999512f, 0.011673f, 0.999512f, 0.010414f, 0.999512f, 0.009254f, + 0.999512f, 0.008179f, 0.999512f, 0.007198f, 0.999512f, 0.006298f, 0.999512f, 0.005470f, + 0.999512f, 0.004719f, 0.999512f, 0.004036f, 0.999512f, 0.003416f, 0.999512f, 0.002859f, + 0.999512f, 0.002361f, 0.999512f, 0.001919f, 0.999512f, 0.001528f, 0.999512f, 0.001187f, + 0.999512f, 0.000895f, 0.999512f, 0.000647f, 0.999512f, 0.000443f, 0.999512f, 0.000279f, + 0.999512f, 0.000155f, 0.999512f, 0.000068f, 0.999512f, 0.000017f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.898926f, 0.637695f, 0.947266f, 0.511230f, 0.965820f, 0.431152f, + 0.973145f, 0.373779f, 0.978027f, 0.329102f, 0.979980f, 0.293701f, 0.984863f, 0.262451f, + 0.987793f, 0.235229f, 0.989258f, 0.212769f, 0.990234f, 0.193359f, 0.991699f, 0.176147f, + 0.992188f, 0.160889f, 0.993164f, 0.147095f, 0.994141f, 0.134766f, 0.995117f, 0.123474f, + 0.996094f, 0.113159f, 0.997070f, 0.103516f, 0.999512f, 0.094177f, 0.999512f, 0.086060f, + 0.999512f, 0.079041f, 0.999512f, 0.072693f, 0.999512f, 0.066833f, 0.999512f, 0.061523f, + 0.999512f, 0.056610f, 0.999512f, 0.052063f, 0.999512f, 0.047852f, 0.999512f, 0.043976f, + 0.999512f, 0.040375f, 0.999512f, 0.037048f, 0.999512f, 0.033936f, 0.999512f, 0.031067f, + 0.999512f, 0.028412f, 0.999512f, 0.025925f, 0.999512f, 0.023621f, 0.999512f, 0.021484f, + 0.999512f, 0.019501f, 0.999512f, 0.017670f, 0.999512f, 0.015961f, 0.999512f, 0.014381f, + 0.999512f, 0.012917f, 0.999512f, 0.011559f, 0.999512f, 0.010315f, 0.999512f, 0.009155f, + 0.999512f, 0.008095f, 0.999512f, 0.007122f, 0.999512f, 0.006226f, 0.999512f, 0.005409f, + 0.999512f, 0.004662f, 0.999512f, 0.003983f, 0.999512f, 0.003372f, 0.999512f, 0.002821f, + 0.999512f, 0.002329f, 0.999512f, 0.001890f, 0.999512f, 0.001505f, 0.999512f, 0.001168f, + 0.999512f, 0.000880f, 0.999512f, 0.000636f, 0.999512f, 0.000434f, 0.999512f, 0.000273f, + 0.999512f, 0.000152f, 0.999512f, 0.000066f, 0.999512f, 0.000016f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.905273f, 0.635742f, 0.951660f, 0.509277f, 0.965820f, 0.431152f, + 0.976074f, 0.372070f, 0.979004f, 0.328369f, 0.983887f, 0.291016f, 0.983887f, 0.261963f, + 0.985840f, 0.236572f, 0.988770f, 0.213257f, 0.990234f, 0.193359f, 0.991699f, 0.175903f, + 0.993164f, 0.160156f, 0.994629f, 0.146240f, 0.995605f, 0.133423f, 0.998047f, 0.121338f, + 0.999512f, 0.110107f, 0.999512f, 0.100952f, 0.999512f, 0.092773f, 0.999512f, 0.085327f, + 0.999512f, 0.078491f, 0.999512f, 0.072205f, 0.999512f, 0.066467f, 0.999512f, 0.061218f, + 0.999512f, 0.056305f, 0.999512f, 0.051819f, 0.999512f, 0.047638f, 0.999512f, 0.043762f, + 0.999512f, 0.040192f, 0.999512f, 0.036865f, 0.999512f, 0.033783f, 0.999512f, 0.030914f, + 0.999512f, 0.028259f, 0.999512f, 0.025787f, 0.999512f, 0.023499f, 0.999512f, 0.021378f, + 0.999512f, 0.019394f, 0.999512f, 0.017563f, 0.999512f, 0.015869f, 0.999512f, 0.014297f, + 0.999512f, 0.012840f, 0.999512f, 0.011490f, 0.999512f, 0.010246f, 0.999512f, 0.009102f, + 0.999512f, 0.008041f, 0.999512f, 0.007072f, 0.999512f, 0.006184f, 0.999512f, 0.005367f, + 0.999512f, 0.004627f, 0.999512f, 0.003952f, 0.999512f, 0.003345f, 0.999512f, 0.002798f, + 0.999512f, 0.002308f, 0.999512f, 0.001874f, 0.999512f, 0.001491f, 0.999512f, 0.001158f, + 0.999512f, 0.000871f, 0.999512f, 0.000629f, 0.999512f, 0.000430f, 0.999512f, 0.000270f, + 0.999512f, 0.000150f, 0.999512f, 0.000065f, 0.999512f, 0.000016f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.907227f, 0.635254f, 0.952637f, 0.509277f, 0.968262f, 0.429688f, + 0.976562f, 0.371826f, 0.983887f, 0.324951f, 0.983887f, 0.290527f, 0.983887f, 0.261719f, + 0.983887f, 0.237427f, 0.983887f, 0.216309f, 0.984863f, 0.197632f, 0.994629f, 0.175171f, + 0.999512f, 0.155884f, 0.999512f, 0.141968f, 0.999512f, 0.129883f, 0.999512f, 0.119080f, + 0.999512f, 0.109314f, 0.999512f, 0.100403f, 0.999512f, 0.092346f, 0.999512f, 0.084961f, + 0.999512f, 0.078186f, 0.999512f, 0.071960f, 0.999512f, 0.066284f, 0.999512f, 0.061005f, + 0.999512f, 0.056152f, 0.999512f, 0.051666f, 0.999512f, 0.047485f, 0.999512f, 0.043640f, + 0.999512f, 0.040070f, 0.999512f, 0.036743f, 0.999512f, 0.033691f, 0.999512f, 0.030838f, + 0.999512f, 0.028183f, 0.999512f, 0.025726f, 0.999512f, 0.023438f, 0.999512f, 0.021317f, + 0.999512f, 0.019348f, 0.999512f, 0.017517f, 0.999512f, 0.015823f, 0.999512f, 0.014252f, + 1.000000f, 0.012802f, 0.999512f, 0.011452f, 1.000000f, 0.010216f, 1.000000f, 0.009071f, + 1.000000f, 0.008018f, 1.000000f, 0.007050f, 1.000000f, 0.006161f, 1.000000f, 0.005348f, + 1.000000f, 0.004612f, 1.000000f, 0.003941f, 1.000000f, 0.003334f, 1.000000f, 0.002787f, + 1.000000f, 0.002298f, 1.000000f, 0.001866f, 1.000000f, 0.001485f, 0.999512f, 0.001152f, + 1.000000f, 0.000867f, 1.000000f, 0.000626f, 1.000000f, 0.000427f, 1.000000f, 0.000269f, + 1.000000f, 0.000149f, 1.000000f, 0.000065f, 1.000000f, 0.000016f, 1.000000f, 0.000000f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, + 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992188f, + 0.000000f, 0.991699f, 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.985840f, + 0.000000f, 0.984375f, 0.000000f, 0.979980f, 0.000000f, 0.976562f, 0.000000f, 0.969727f, + 0.000000f, 0.958984f, 0.000000f, 0.938477f, 0.000000f, 0.883789f, 0.000000f, 0.555176f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, + 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992188f, + 0.000000f, 0.991211f, 0.000000f, 0.989746f, 0.000000f, 0.987793f, 0.000000f, 0.985840f, + 0.000000f, 0.983887f, 0.000000f, 0.979980f, 0.000000f, 0.976074f, 0.000000f, 0.969238f, + 0.000000f, 0.958984f, 0.000000f, 0.937988f, 0.000000f, 0.883789f, 0.000000f, 0.555176f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, + 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.991699f, + 0.000000f, 0.990723f, 0.000000f, 0.989746f, 0.000000f, 0.987793f, 0.000000f, 0.986328f, + 0.000000f, 0.983398f, 0.000000f, 0.980469f, 0.000000f, 0.975586f, 0.000000f, 0.968750f, + 0.000000f, 0.958496f, 0.000000f, 0.937988f, 0.000000f, 0.883301f, 0.000004f, 0.554688f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.996094f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994629f, + 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.991699f, + 0.000000f, 0.990234f, 0.000000f, 0.989746f, 0.000000f, 0.987793f, 0.000000f, 0.985840f, + 0.000000f, 0.982910f, 0.000000f, 0.980957f, 0.000000f, 0.975098f, 0.000000f, 0.969238f, + 0.000000f, 0.957520f, 0.000000f, 0.937012f, 0.000022f, 0.882324f, 0.000029f, 0.553711f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994141f, + 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992188f, 0.000000f, 0.991211f, + 0.000000f, 0.990234f, 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.985840f, + 0.000000f, 0.982422f, 0.000000f, 0.979492f, 0.000000f, 0.975098f, 0.000000f, 0.968750f, + 0.000000f, 0.957031f, 0.000065f, 0.936035f, 0.000051f, 0.880859f, 0.000110f, 0.552734f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.996582f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, + 0.000000f, 0.994141f, 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.990723f, + 0.000000f, 0.989746f, 0.000000f, 0.988770f, 0.000000f, 0.987793f, 0.000000f, 0.984863f, + 0.000000f, 0.982910f, 0.000000f, 0.979004f, 0.000000f, 0.974121f, 0.000014f, 0.967773f, + 0.000153f, 0.956055f, 0.000141f, 0.935059f, 0.000156f, 0.879395f, 0.000302f, 0.551758f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, + 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.990723f, + 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.986816f, 0.000000f, 0.984863f, + 0.000000f, 0.981934f, 0.000000f, 0.978516f, 0.000193f, 0.974121f, 0.000303f, 0.966309f, + 0.000277f, 0.955078f, 0.000209f, 0.933594f, 0.000340f, 0.876465f, 0.000677f, 0.549805f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.994141f, + 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.990234f, + 0.000000f, 0.989258f, 0.000000f, 0.987793f, 0.000000f, 0.985840f, 0.000020f, 0.984375f, + 0.000229f, 0.980957f, 0.000481f, 0.977051f, 0.000519f, 0.973145f, 0.000462f, 0.964844f, + 0.000364f, 0.953125f, 0.000518f, 0.931152f, 0.000634f, 0.874023f, 0.001318f, 0.547852f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.995117f, 0.000000f, 0.993652f, + 0.000000f, 0.993164f, 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.990234f, + 0.000000f, 0.988281f, 0.000118f, 0.986816f, 0.000355f, 0.985352f, 0.000631f, 0.983398f, + 0.000804f, 0.980957f, 0.000780f, 0.976074f, 0.000684f, 0.971680f, 0.000575f, 0.963867f, + 0.000708f, 0.951172f, 0.000806f, 0.928223f, 0.001154f, 0.870117f, 0.002291f, 0.545410f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, + 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.993652f, + 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000097f, 0.990723f, 0.000322f, 0.989258f, + 0.000583f, 0.987793f, 0.000854f, 0.986328f, 0.001122f, 0.984863f, 0.001165f, 0.982422f, + 0.001086f, 0.979980f, 0.000950f, 0.975586f, 0.000796f, 0.970215f, 0.000953f, 0.961914f, + 0.001175f, 0.949707f, 0.001426f, 0.926270f, 0.001970f, 0.866211f, 0.003677f, 0.542480f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, + 0.000000f, 0.995117f, 0.000000f, 0.994141f, 0.000003f, 0.993652f, 0.000153f, 0.993652f, + 0.000380f, 0.992676f, 0.000623f, 0.991699f, 0.000893f, 0.989746f, 0.001161f, 0.988770f, + 0.001406f, 0.986816f, 0.001590f, 0.985352f, 0.001534f, 0.983398f, 0.001380f, 0.981445f, + 0.001233f, 0.978516f, 0.001087f, 0.974121f, 0.001286f, 0.968750f, 0.001590f, 0.960449f, + 0.001768f, 0.947754f, 0.002182f, 0.922363f, 0.003139f, 0.861328f, 0.005543f, 0.539551f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000089f, 0.994629f, + 0.000294f, 0.994141f, 0.000531f, 0.993652f, 0.000763f, 0.993652f, 0.001027f, 0.993164f, + 0.001268f, 0.992676f, 0.001505f, 0.990723f, 0.001743f, 0.989258f, 0.001961f, 0.987793f, + 0.002010f, 0.986328f, 0.001871f, 0.984375f, 0.001698f, 0.982422f, 0.001496f, 0.979492f, + 0.001505f, 0.977051f, 0.001706f, 0.972656f, 0.001982f, 0.966309f, 0.002312f, 0.958496f, + 0.002699f, 0.944824f, 0.003412f, 0.918457f, 0.004868f, 0.856934f, 0.007942f, 0.536133f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000077f, 0.996094f, + 0.000279f, 0.995605f, 0.000498f, 0.995117f, 0.000758f, 0.994629f, 0.000991f, 0.994141f, + 0.001227f, 0.993652f, 0.001451f, 0.993164f, 0.001675f, 0.993164f, 0.001869f, 0.992676f, + 0.002094f, 0.991211f, 0.002260f, 0.990234f, 0.002470f, 0.988770f, 0.002378f, 0.987305f, + 0.002199f, 0.985352f, 0.001993f, 0.983398f, 0.001861f, 0.981445f, 0.002094f, 0.979004f, + 0.002241f, 0.975586f, 0.002480f, 0.971680f, 0.002930f, 0.964355f, 0.003344f, 0.955566f, + 0.003979f, 0.941406f, 0.005020f, 0.914551f, 0.007179f, 0.851074f, 0.010880f, 0.533203f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000116f, 0.996582f, + 0.000329f, 0.996582f, 0.000560f, 0.996094f, 0.000815f, 0.995605f, 0.001021f, 0.995117f, + 0.001272f, 0.994629f, 0.001466f, 0.994141f, 0.001686f, 0.993652f, 0.001883f, 0.993652f, + 0.002045f, 0.993164f, 0.002262f, 0.993164f, 0.002420f, 0.991699f, 0.002590f, 0.991211f, + 0.002779f, 0.990723f, 0.002914f, 0.989746f, 0.002844f, 0.987793f, 0.002581f, 0.985840f, + 0.002447f, 0.984375f, 0.002573f, 0.982422f, 0.002857f, 0.979980f, 0.002949f, 0.976562f, + 0.003170f, 0.973145f, 0.003666f, 0.968750f, 0.004238f, 0.962402f, 0.004742f, 0.952148f, + 0.005692f, 0.937012f, 0.007179f, 0.910156f, 0.010223f, 0.844238f, 0.014442f, 0.529297f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000014f, 0.997070f, 0.000203f, 0.996582f, + 0.000439f, 0.996582f, 0.000669f, 0.996582f, 0.000926f, 0.996582f, 0.001131f, 0.996094f, + 0.001360f, 0.995605f, 0.001561f, 0.995117f, 0.001719f, 0.995117f, 0.001944f, 0.994629f, + 0.002104f, 0.994141f, 0.002251f, 0.993652f, 0.002451f, 0.993164f, 0.002594f, 0.993164f, + 0.002712f, 0.992676f, 0.002911f, 0.991699f, 0.003048f, 0.990723f, 0.003147f, 0.990234f, + 0.003334f, 0.989746f, 0.003483f, 0.988281f, 0.003820f, 0.987305f, 0.003553f, 0.984863f, + 0.003677f, 0.983398f, 0.003727f, 0.980469f, 0.003799f, 0.977539f, 0.004093f, 0.975098f, + 0.004559f, 0.971191f, 0.005211f, 0.966309f, 0.005978f, 0.958496f, 0.006699f, 0.948730f, + 0.008041f, 0.932129f, 0.010391f, 0.904297f, 0.014381f, 0.836914f, 0.018860f, 0.524902f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000081f, 0.997070f, 0.000323f, 0.997070f, + 0.000591f, 0.997070f, 0.000807f, 0.996582f, 0.001072f, 0.996582f, 0.001266f, 0.996582f, + 0.001475f, 0.996582f, 0.001679f, 0.996094f, 0.001820f, 0.995605f, 0.002018f, 0.995117f, + 0.002192f, 0.995117f, 0.002312f, 0.994629f, 0.002470f, 0.994141f, 0.002644f, 0.993652f, + 0.002764f, 0.993652f, 0.002850f, 0.993164f, 0.003048f, 0.993164f, 0.003183f, 0.991699f, + 0.003277f, 0.991211f, 0.003395f, 0.990723f, 0.003565f, 0.989746f, 0.003826f, 0.989258f, + 0.004196f, 0.988281f, 0.004684f, 0.986816f, 0.005169f, 0.985840f, 0.004967f, 0.983887f, + 0.004627f, 0.981445f, 0.004875f, 0.978516f, 0.005257f, 0.976074f, 0.005589f, 0.972656f, + 0.006306f, 0.968750f, 0.007496f, 0.963379f, 0.008354f, 0.955566f, 0.009590f, 0.944336f, + 0.011452f, 0.927246f, 0.014496f, 0.897949f, 0.020004f, 0.828613f, 0.024414f, 0.520996f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000200f, 0.997559f, 0.000453f, 0.997070f, + 0.000755f, 0.997070f, 0.000950f, 0.997070f, 0.001227f, 0.997070f, 0.001406f, 0.996582f, + 0.001596f, 0.996582f, 0.001802f, 0.996582f, 0.001935f, 0.996582f, 0.002087f, 0.996094f, + 0.002279f, 0.995605f, 0.002405f, 0.995117f, 0.002489f, 0.994629f, 0.002682f, 0.994629f, + 0.002827f, 0.994141f, 0.002922f, 0.993652f, 0.002987f, 0.993652f, 0.003185f, 0.993164f, + 0.003313f, 0.993164f, 0.003399f, 0.992188f, 0.003456f, 0.991211f, 0.003641f, 0.990723f, + 0.003933f, 0.990234f, 0.004311f, 0.989746f, 0.004692f, 0.988770f, 0.005169f, 0.987793f, + 0.005581f, 0.986816f, 0.005978f, 0.985352f, 0.006283f, 0.984375f, 0.006916f, 0.982910f, + 0.006577f, 0.979492f, 0.006893f, 0.977051f, 0.007221f, 0.973633f, 0.008026f, 0.969727f, + 0.008850f, 0.965332f, 0.010010f, 0.958984f, 0.011612f, 0.952148f, 0.012985f, 0.939453f, + 0.015762f, 0.921875f, 0.019714f, 0.890137f, 0.027252f, 0.819824f, 0.030869f, 0.516113f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000030f, 0.997559f, 0.000321f, 0.997559f, 0.000576f, 0.997559f, + 0.000901f, 0.997559f, 0.001075f, 0.997070f, 0.001365f, 0.997070f, 0.001530f, 0.997070f, + 0.001694f, 0.997070f, 0.001912f, 0.996582f, 0.002039f, 0.996582f, 0.002123f, 0.996582f, + 0.002354f, 0.996582f, 0.002487f, 0.996094f, 0.002571f, 0.995605f, 0.002680f, 0.995117f, + 0.002871f, 0.994629f, 0.002983f, 0.994629f, 0.003054f, 0.994141f, 0.003117f, 0.993652f, + 0.003319f, 0.993652f, 0.003435f, 0.993164f, 0.003510f, 0.992676f, 0.003557f, 0.992188f, + 0.003742f, 0.991699f, 0.004128f, 0.990723f, 0.004517f, 0.990234f, 0.004894f, 0.989746f, + 0.005226f, 0.988770f, 0.005699f, 0.988281f, 0.006088f, 0.986816f, 0.006390f, 0.986328f, + 0.006721f, 0.984863f, 0.007393f, 0.983398f, 0.008125f, 0.981934f, 0.008812f, 0.979980f, + 0.008667f, 0.977539f, 0.008881f, 0.974121f, 0.009567f, 0.970703f, 0.010544f, 0.966797f, + 0.011612f, 0.960938f, 0.013306f, 0.955078f, 0.015594f, 0.946777f, 0.017487f, 0.933594f, + 0.021103f, 0.915039f, 0.026505f, 0.881836f, 0.036133f, 0.810059f, 0.038300f, 0.510742f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000021f, 0.998047f, 0.000372f, 0.998047f, 0.000649f, 0.997559f, + 0.000998f, 0.997559f, 0.001168f, 0.997559f, 0.001455f, 0.997559f, 0.001623f, 0.997070f, + 0.001718f, 0.997070f, 0.001987f, 0.997070f, 0.002121f, 0.997070f, 0.002193f, 0.997070f, + 0.002388f, 0.996582f, 0.002552f, 0.996582f, 0.002640f, 0.996094f, 0.002691f, 0.995605f, + 0.002872f, 0.995117f, 0.003025f, 0.995117f, 0.003109f, 0.994629f, 0.003160f, 0.994629f, + 0.003241f, 0.994141f, 0.003439f, 0.993652f, 0.003544f, 0.993652f, 0.003605f, 0.993164f, + 0.003643f, 0.992676f, 0.003990f, 0.992188f, 0.004463f, 0.991699f, 0.004852f, 0.990723f, + 0.005184f, 0.990234f, 0.005505f, 0.989746f, 0.005848f, 0.988770f, 0.006275f, 0.988281f, + 0.006573f, 0.987305f, 0.006855f, 0.986328f, 0.007393f, 0.985352f, 0.008011f, 0.983887f, + 0.008751f, 0.982910f, 0.009346f, 0.981445f, 0.010017f, 0.979492f, 0.010918f, 0.977539f, + 0.011543f, 0.975098f, 0.011932f, 0.971191f, 0.012405f, 0.967285f, 0.013542f, 0.962402f, + 0.015213f, 0.956543f, 0.017365f, 0.950195f, 0.020126f, 0.941406f, 0.022736f, 0.926758f, + 0.027908f, 0.907227f, 0.034576f, 0.873047f, 0.046539f, 0.798828f, 0.046967f, 0.506836f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000234f, 0.998047f, 0.000661f, 0.998047f, + 0.000992f, 0.998047f, 0.001218f, 0.998047f, 0.001438f, 0.997559f, 0.001673f, 0.997559f, + 0.001766f, 0.997559f, 0.001986f, 0.997070f, 0.002169f, 0.997070f, 0.002247f, 0.997070f, + 0.002300f, 0.997070f, 0.002573f, 0.997070f, 0.002686f, 0.996582f, 0.002741f, 0.996094f, + 0.002773f, 0.996094f, 0.003023f, 0.995605f, 0.003143f, 0.995117f, 0.003204f, 0.994629f, + 0.003239f, 0.994629f, 0.003344f, 0.994141f, 0.003542f, 0.994141f, 0.003633f, 0.993652f, + 0.003704f, 0.993164f, 0.003990f, 0.992676f, 0.004383f, 0.992188f, 0.004871f, 0.991699f, + 0.005257f, 0.991211f, 0.005558f, 0.990723f, 0.005840f, 0.990234f, 0.006039f, 0.989746f, + 0.006508f, 0.988770f, 0.006794f, 0.988281f, 0.007149f, 0.987305f, 0.007702f, 0.986328f, + 0.008194f, 0.985352f, 0.008820f, 0.984375f, 0.009506f, 0.983398f, 0.010025f, 0.981445f, + 0.010864f, 0.980469f, 0.011719f, 0.978516f, 0.012512f, 0.976562f, 0.013802f, 0.974121f, + 0.015038f, 0.971191f, 0.015152f, 0.968262f, 0.016327f, 0.962891f, 0.018005f, 0.958008f, + 0.019684f, 0.951660f, 0.022278f, 0.944336f, 0.026245f, 0.934570f, 0.030212f, 0.919434f, + 0.036438f, 0.898438f, 0.044373f, 0.862305f, 0.058777f, 0.786621f, 0.055878f, 0.500977f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000317f, 0.998535f, + 0.000786f, 0.998535f, 0.001155f, 0.998047f, 0.001323f, 0.998047f, 0.001599f, 0.998047f, + 0.001784f, 0.997559f, 0.001842f, 0.997559f, 0.002129f, 0.997559f, 0.002270f, 0.997559f, + 0.002321f, 0.997070f, 0.002432f, 0.997070f, 0.002687f, 0.997070f, 0.002769f, 0.997070f, + 0.002806f, 0.996094f, 0.002836f, 0.996094f, 0.003128f, 0.995605f, 0.003227f, 0.995605f, + 0.003271f, 0.995117f, 0.003294f, 0.994629f, 0.003408f, 0.994141f, 0.003622f, 0.994141f, + 0.003807f, 0.994141f, 0.004154f, 0.993652f, 0.004520f, 0.993164f, 0.004818f, 0.992676f, + 0.005352f, 0.992188f, 0.005684f, 0.991699f, 0.005978f, 0.991211f, 0.006153f, 0.990723f, + 0.006420f, 0.989746f, 0.006706f, 0.989258f, 0.007057f, 0.988281f, 0.007652f, 0.987793f, + 0.008179f, 0.987305f, 0.008644f, 0.986328f, 0.009148f, 0.984863f, 0.009750f, 0.983887f, + 0.010361f, 0.982910f, 0.011147f, 0.981445f, 0.011955f, 0.980469f, 0.012680f, 0.979004f, + 0.013420f, 0.977051f, 0.014824f, 0.975098f, 0.015915f, 0.972656f, 0.017303f, 0.970215f, + 0.018753f, 0.967285f, 0.019653f, 0.963379f, 0.021011f, 0.958008f, 0.023041f, 0.952637f, + 0.025787f, 0.945801f, 0.028976f, 0.937012f, 0.033325f, 0.926270f, 0.038513f, 0.910645f, + 0.046051f, 0.887695f, 0.057159f, 0.850586f, 0.073120f, 0.773926f, 0.065735f, 0.494873f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, + 0.000167f, 0.999023f, 0.000779f, 0.998535f, 0.001051f, 0.998535f, 0.001363f, 0.998535f, + 0.001513f, 0.998047f, 0.001830f, 0.998047f, 0.001883f, 0.998047f, 0.002144f, 0.997559f, + 0.002321f, 0.997559f, 0.002363f, 0.997559f, 0.002380f, 0.997559f, 0.002743f, 0.997070f, + 0.002819f, 0.997070f, 0.002848f, 0.996582f, 0.002861f, 0.996094f, 0.003185f, 0.995605f, + 0.003281f, 0.995605f, 0.003315f, 0.995117f, 0.003332f, 0.994629f, 0.003397f, 0.994629f, + 0.004017f, 0.994141f, 0.004440f, 0.994141f, 0.004753f, 0.993652f, 0.005085f, 0.993164f, + 0.005299f, 0.992676f, 0.005798f, 0.991699f, 0.006134f, 0.991699f, 0.006298f, 0.991211f, + 0.006577f, 0.990723f, 0.006744f, 0.990234f, 0.006954f, 0.989258f, 0.007759f, 0.988770f, + 0.008354f, 0.987793f, 0.008827f, 0.987305f, 0.009224f, 0.986328f, 0.009727f, 0.985840f, + 0.010063f, 0.984375f, 0.010925f, 0.983887f, 0.011726f, 0.982422f, 0.012543f, 0.981445f, + 0.013191f, 0.979980f, 0.013908f, 0.978516f, 0.014984f, 0.977051f, 0.016083f, 0.975098f, + 0.017380f, 0.972656f, 0.018677f, 0.970703f, 0.020126f, 0.968750f, 0.021744f, 0.965332f, + 0.023682f, 0.961426f, 0.026016f, 0.957520f, 0.027252f, 0.951660f, 0.029556f, 0.945312f, + 0.032654f, 0.937500f, 0.036835f, 0.928223f, 0.042542f, 0.916504f, 0.049011f, 0.899902f, + 0.057770f, 0.875488f, 0.070984f, 0.836426f, 0.089050f, 0.758789f, 0.076111f, 0.489502f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000865f, 0.999023f, + 0.001151f, 0.999023f, 0.001417f, 0.998535f, 0.001698f, 0.998535f, 0.001896f, 0.998535f, + 0.001918f, 0.998047f, 0.002308f, 0.998047f, 0.002382f, 0.998047f, 0.002399f, 0.997559f, + 0.002682f, 0.997559f, 0.002842f, 0.997070f, 0.002871f, 0.996582f, 0.002882f, 0.996094f, + 0.003136f, 0.995605f, 0.003309f, 0.995605f, 0.003344f, 0.995117f, 0.003592f, 0.995117f, + 0.003952f, 0.994629f, 0.004658f, 0.994141f, 0.005035f, 0.994141f, 0.005337f, 0.993652f, + 0.005501f, 0.993164f, 0.005798f, 0.992676f, 0.006088f, 0.991699f, 0.006474f, 0.991699f, + 0.006756f, 0.991211f, 0.006939f, 0.990723f, 0.007332f, 0.990234f, 0.007942f, 0.989258f, + 0.008514f, 0.988281f, 0.009117f, 0.988281f, 0.009514f, 0.987305f, 0.010002f, 0.986328f, + 0.010384f, 0.985840f, 0.011070f, 0.984863f, 0.011597f, 0.983887f, 0.012650f, 0.982422f, + 0.013374f, 0.981445f, 0.014091f, 0.980469f, 0.014923f, 0.979004f, 0.015884f, 0.977539f, + 0.016754f, 0.976074f, 0.018005f, 0.974609f, 0.019348f, 0.972168f, 0.020615f, 0.970215f, + 0.022125f, 0.968262f, 0.023743f, 0.965332f, 0.025604f, 0.962402f, 0.027588f, 0.958984f, + 0.030212f, 0.955078f, 0.033112f, 0.950195f, 0.034882f, 0.944336f, 0.038055f, 0.937012f, + 0.041779f, 0.928711f, 0.047150f, 0.917969f, 0.053711f, 0.904785f, 0.062439f, 0.887207f, + 0.072510f, 0.860840f, 0.087280f, 0.820312f, 0.106995f, 0.743652f, 0.087158f, 0.482666f, + 0.000000f, 1.000000f, 0.000453f, 0.999512f, 0.000958f, 0.999023f, 0.001426f, 0.999023f, + 0.001450f, 0.998535f, 0.001913f, 0.998535f, 0.001932f, 0.998535f, 0.002323f, 0.998047f, + 0.002407f, 0.998047f, 0.002417f, 0.998047f, 0.002739f, 0.997070f, 0.002878f, 0.996582f, + 0.002895f, 0.996582f, 0.002901f, 0.996094f, 0.003342f, 0.995605f, 0.003899f, 0.995117f, + 0.004318f, 0.995117f, 0.004570f, 0.994629f, 0.004921f, 0.994629f, 0.005493f, 0.993652f, + 0.005795f, 0.993164f, 0.006001f, 0.992676f, 0.006092f, 0.992676f, 0.006348f, 0.992188f, + 0.006901f, 0.991211f, 0.007431f, 0.990723f, 0.007965f, 0.990234f, 0.008484f, 0.989258f, + 0.008896f, 0.988770f, 0.009163f, 0.988281f, 0.009872f, 0.987793f, 0.010399f, 0.986816f, + 0.011093f, 0.985840f, 0.011719f, 0.985352f, 0.012199f, 0.984375f, 0.012886f, 0.983398f, + 0.013557f, 0.982422f, 0.014618f, 0.981445f, 0.015480f, 0.979980f, 0.016281f, 0.978516f, + 0.017197f, 0.977539f, 0.018295f, 0.976074f, 0.019333f, 0.975098f, 0.020386f, 0.972656f, + 0.022003f, 0.970703f, 0.023407f, 0.969238f, 0.025024f, 0.966797f, 0.026733f, 0.964355f, + 0.028534f, 0.961426f, 0.030258f, 0.958496f, 0.033142f, 0.954590f, 0.035858f, 0.950684f, + 0.038727f, 0.946289f, 0.042053f, 0.940918f, 0.045135f, 0.934570f, 0.048950f, 0.926270f, + 0.054199f, 0.916504f, 0.060120f, 0.904785f, 0.067932f, 0.890625f, 0.078247f, 0.871582f, + 0.089966f, 0.844238f, 0.106812f, 0.802734f, 0.127441f, 0.726074f, 0.099121f, 0.477051f, + 0.000000f, 1.000000f, 0.000968f, 0.999512f, 0.001446f, 0.999023f, 0.001458f, 0.999023f, + 0.001937f, 0.998535f, 0.001944f, 0.998535f, 0.002409f, 0.998047f, 0.002424f, 0.998047f, + 0.002428f, 0.997070f, 0.002890f, 0.996582f, 0.003092f, 0.996582f, 0.003626f, 0.996094f, + 0.004356f, 0.995605f, 0.004761f, 0.995117f, 0.005108f, 0.995117f, 0.005207f, 0.994629f, + 0.005558f, 0.993652f, 0.006115f, 0.993164f, 0.006248f, 0.992676f, 0.006676f, 0.992188f, + 0.007191f, 0.991699f, 0.007652f, 0.991211f, 0.008629f, 0.990723f, 0.009087f, 0.989746f, + 0.009369f, 0.988770f, 0.009666f, 0.988770f, 0.010246f, 0.987793f, 0.011024f, 0.987305f, + 0.012001f, 0.986328f, 0.012520f, 0.985352f, 0.012955f, 0.984375f, 0.013870f, 0.983398f, + 0.014633f, 0.982422f, 0.015305f, 0.981934f, 0.016144f, 0.980469f, 0.017197f, 0.979004f, + 0.018433f, 0.978027f, 0.019287f, 0.976562f, 0.020370f, 0.975586f, 0.021545f, 0.973633f, + 0.022644f, 0.971680f, 0.023865f, 0.970215f, 0.025742f, 0.968262f, 0.027435f, 0.966309f, + 0.029160f, 0.964355f, 0.030624f, 0.961914f, 0.032593f, 0.958984f, 0.034882f, 0.956055f, + 0.037354f, 0.953125f, 0.040192f, 0.949219f, 0.043121f, 0.945312f, 0.046417f, 0.940430f, + 0.050079f, 0.935059f, 0.054443f, 0.929199f, 0.059357f, 0.922363f, 0.063660f, 0.912598f, + 0.069641f, 0.901855f, 0.077087f, 0.889160f, 0.085999f, 0.873535f, 0.097839f, 0.853516f, + 0.111206f, 0.824707f, 0.129272f, 0.782715f, 0.149658f, 0.708008f, 0.111084f, 0.470459f, + 0.000000f, 1.000000f, 0.000975f, 0.999512f, 0.001461f, 0.999023f, 0.001938f, 0.998535f, + 0.001947f, 0.998535f, 0.002417f, 0.997559f, 0.002432f, 0.997070f, 0.003159f, 0.997070f, + 0.004124f, 0.996094f, 0.004288f, 0.996094f, 0.004723f, 0.995605f, 0.005253f, 0.995117f, + 0.005669f, 0.994141f, 0.005749f, 0.993652f, 0.006195f, 0.993164f, 0.007343f, 0.992676f, + 0.007858f, 0.992188f, 0.008270f, 0.991211f, 0.008804f, 0.990723f, 0.009163f, 0.990234f, + 0.009964f, 0.989258f, 0.010559f, 0.988281f, 0.011612f, 0.987305f, 0.012154f, 0.986816f, + 0.012489f, 0.986328f, 0.013168f, 0.985352f, 0.014534f, 0.983887f, 0.015350f, 0.982910f, + 0.016083f, 0.981934f, 0.016830f, 0.981445f, 0.017746f, 0.979980f, 0.018661f, 0.978516f, + 0.019897f, 0.977539f, 0.021240f, 0.976074f, 0.022491f, 0.975098f, 0.023514f, 0.973145f, + 0.024704f, 0.971680f, 0.025787f, 0.970215f, 0.027557f, 0.968262f, 0.029312f, 0.966797f, + 0.031113f, 0.964355f, 0.032654f, 0.962402f, 0.034637f, 0.959961f, 0.036530f, 0.957520f, + 0.038971f, 0.955078f, 0.041229f, 0.951660f, 0.043732f, 0.948730f, 0.046875f, 0.945312f, + 0.049957f, 0.941406f, 0.053345f, 0.937012f, 0.057037f, 0.932129f, 0.061249f, 0.926758f, + 0.065857f, 0.920898f, 0.070984f, 0.914062f, 0.077271f, 0.905762f, 0.082703f, 0.895508f, + 0.089844f, 0.883789f, 0.098755f, 0.869629f, 0.109436f, 0.853027f, 0.122070f, 0.831543f, + 0.137085f, 0.802246f, 0.156006f, 0.760254f, 0.174561f, 0.688477f, 0.123535f, 0.463135f, + 0.000000f, 1.000000f, 0.000976f, 0.999512f, 0.001463f, 0.999023f, 0.001948f, 0.998047f, + 0.002787f, 0.997559f, 0.003792f, 0.997070f, 0.004143f, 0.996582f, 0.004810f, 0.996094f, + 0.005192f, 0.995117f, 0.005463f, 0.994629f, 0.006657f, 0.993652f, 0.007496f, 0.993164f, + 0.007912f, 0.992188f, 0.008186f, 0.991699f, 0.009392f, 0.990723f, 0.010132f, 0.989746f, + 0.010811f, 0.989258f, 0.011658f, 0.988281f, 0.012596f, 0.987305f, 0.013405f, 0.986328f, + 0.014366f, 0.985352f, 0.014893f, 0.984375f, 0.015961f, 0.983398f, 0.016907f, 0.982422f, + 0.018433f, 0.980957f, 0.019257f, 0.980469f, 0.020157f, 0.978516f, 0.021347f, 0.977051f, + 0.022690f, 0.976074f, 0.023911f, 0.975098f, 0.025558f, 0.973145f, 0.026596f, 0.971680f, + 0.027908f, 0.970215f, 0.029877f, 0.968262f, 0.031494f, 0.966797f, 0.032837f, 0.964844f, + 0.034668f, 0.962891f, 0.036407f, 0.960938f, 0.038788f, 0.958496f, 0.040863f, 0.956055f, + 0.043091f, 0.953613f, 0.045471f, 0.950684f, 0.048035f, 0.948242f, 0.050659f, 0.944824f, + 0.053375f, 0.941895f, 0.056519f, 0.937988f, 0.060364f, 0.934082f, 0.063660f, 0.929688f, + 0.067993f, 0.925293f, 0.072205f, 0.920410f, 0.076782f, 0.914551f, 0.082031f, 0.908203f, + 0.087646f, 0.901367f, 0.094360f, 0.893555f, 0.101440f, 0.884277f, 0.108765f, 0.873535f, + 0.116943f, 0.860352f, 0.126465f, 0.845703f, 0.138306f, 0.827637f, 0.152466f, 0.806152f, + 0.167480f, 0.776367f, 0.185669f, 0.735840f, 0.201782f, 0.667969f, 0.136108f, 0.456543f, + 0.000000f, 1.000000f, 0.000488f, 0.999023f, 0.002407f, 0.998535f, 0.002905f, 0.998047f, + 0.003870f, 0.997070f, 0.004910f, 0.995605f, 0.005802f, 0.995117f, 0.007008f, 0.994141f, + 0.007664f, 0.993164f, 0.008270f, 0.992188f, 0.010094f, 0.991211f, 0.010651f, 0.990234f, + 0.011383f, 0.989258f, 0.013062f, 0.987793f, 0.014275f, 0.986816f, 0.014977f, 0.985352f, + 0.015915f, 0.984863f, 0.017532f, 0.982910f, 0.018890f, 0.981445f, 0.020126f, 0.980469f, + 0.021225f, 0.979492f, 0.021942f, 0.978027f, 0.024231f, 0.976074f, 0.026031f, 0.975098f, + 0.027084f, 0.973145f, 0.028320f, 0.971680f, 0.030090f, 0.970215f, 0.031830f, 0.968750f, + 0.033630f, 0.966797f, 0.035858f, 0.964355f, 0.037415f, 0.962402f, 0.039551f, 0.960938f, + 0.041260f, 0.958496f, 0.043640f, 0.956543f, 0.045654f, 0.954102f, 0.048004f, 0.951660f, + 0.050903f, 0.948730f, 0.053650f, 0.946289f, 0.056335f, 0.943359f, 0.058838f, 0.940430f, + 0.062195f, 0.937500f, 0.065186f, 0.934082f, 0.068542f, 0.930664f, 0.072021f, 0.926758f, + 0.076355f, 0.922363f, 0.080444f, 0.917969f, 0.084717f, 0.913086f, 0.089355f, 0.908203f, + 0.094360f, 0.902832f, 0.099609f, 0.896973f, 0.105469f, 0.890137f, 0.111572f, 0.883301f, + 0.118896f, 0.875000f, 0.126465f, 0.866211f, 0.134644f, 0.856445f, 0.143188f, 0.845215f, + 0.151855f, 0.831055f, 0.162231f, 0.815430f, 0.174438f, 0.797363f, 0.188965f, 0.775391f, + 0.203613f, 0.747070f, 0.219482f, 0.708008f, 0.230469f, 0.645508f, 0.149902f, 0.450684f, + 0.000000f, 1.000000f, 0.000973f, 0.999023f, 0.002571f, 0.998047f, 0.004745f, 0.996582f, + 0.006233f, 0.995117f, 0.008202f, 0.993652f, 0.009140f, 0.992676f, 0.011353f, 0.990723f, + 0.012718f, 0.989746f, 0.014008f, 0.987793f, 0.016052f, 0.986328f, 0.017120f, 0.984863f, + 0.019363f, 0.982910f, 0.020996f, 0.981445f, 0.022644f, 0.979492f, 0.024368f, 0.978027f, + 0.026810f, 0.976074f, 0.027985f, 0.974121f, 0.030487f, 0.972168f, 0.032196f, 0.970215f, + 0.034119f, 0.968262f, 0.036682f, 0.966309f, 0.038818f, 0.963867f, 0.040649f, 0.961914f, + 0.043304f, 0.959473f, 0.045502f, 0.957520f, 0.048218f, 0.955078f, 0.050934f, 0.952637f, + 0.053436f, 0.950195f, 0.055725f, 0.947754f, 0.058746f, 0.944824f, 0.061584f, 0.942383f, + 0.064636f, 0.939453f, 0.067444f, 0.936523f, 0.071411f, 0.933105f, 0.074707f, 0.930176f, + 0.077942f, 0.926758f, 0.081604f, 0.923340f, 0.085205f, 0.919434f, 0.088928f, 0.916016f, + 0.093262f, 0.912109f, 0.097412f, 0.907715f, 0.102417f, 0.903320f, 0.107056f, 0.898438f, + 0.111938f, 0.893555f, 0.117065f, 0.888184f, 0.122314f, 0.882812f, 0.127930f, 0.876953f, + 0.133911f, 0.870605f, 0.140381f, 0.863770f, 0.147095f, 0.856445f, 0.154907f, 0.848145f, + 0.162598f, 0.839844f, 0.170654f, 0.830078f, 0.179565f, 0.819824f, 0.188965f, 0.808594f, + 0.197754f, 0.794434f, 0.207764f, 0.778809f, 0.219604f, 0.760742f, 0.232544f, 0.739746f, + 0.245117f, 0.713379f, 0.257080f, 0.678223f, 0.260498f, 0.622559f, 0.163086f, 0.442139f, + 0.000000f, 1.000000f, 0.002867f, 0.998535f, 0.005180f, 0.997070f, 0.007675f, 0.994629f, + 0.011902f, 0.991699f, 0.014618f, 0.988770f, 0.017593f, 0.986328f, 0.020813f, 0.984375f, + 0.023514f, 0.980957f, 0.026474f, 0.978027f, 0.029739f, 0.975586f, 0.032715f, 0.972656f, + 0.035614f, 0.969727f, 0.038605f, 0.967285f, 0.041840f, 0.964355f, 0.045410f, 0.961426f, + 0.048584f, 0.958008f, 0.051514f, 0.955566f, 0.054749f, 0.952637f, 0.058289f, 0.949707f, + 0.062256f, 0.946289f, 0.065491f, 0.943359f, 0.068909f, 0.939941f, 0.072327f, 0.937012f, + 0.076355f, 0.933594f, 0.079651f, 0.930176f, 0.083862f, 0.927246f, 0.087830f, 0.923340f, + 0.091919f, 0.919922f, 0.095886f, 0.916504f, 0.099731f, 0.912598f, 0.104370f, 0.909180f, + 0.108459f, 0.904785f, 0.112732f, 0.901367f, 0.116943f, 0.897461f, 0.121948f, 0.893066f, + 0.126587f, 0.888672f, 0.131470f, 0.884277f, 0.136230f, 0.879883f, 0.141357f, 0.875488f, + 0.146729f, 0.870117f, 0.152100f, 0.865234f, 0.157471f, 0.859863f, 0.162964f, 0.854492f, + 0.168701f, 0.849121f, 0.174805f, 0.843750f, 0.181152f, 0.837402f, 0.187500f, 0.830566f, + 0.194092f, 0.823730f, 0.201172f, 0.816406f, 0.208252f, 0.808594f, 0.215454f, 0.800781f, + 0.223022f, 0.792480f, 0.230835f, 0.783203f, 0.238892f, 0.772949f, 0.247314f, 0.762207f, + 0.255371f, 0.749023f, 0.264160f, 0.733887f, 0.273438f, 0.717773f, 0.282959f, 0.699219f, + 0.291748f, 0.676758f, 0.297607f, 0.646484f, 0.291016f, 0.598145f, 0.177246f, 0.433838f, + 0.000000f, 1.000000f, 0.007290f, 0.996094f, 0.014267f, 0.991699f, 0.021393f, 0.985840f, + 0.028214f, 0.980957f, 0.036194f, 0.974609f, 0.042999f, 0.968262f, 0.050507f, 0.962402f, + 0.056885f, 0.956543f, 0.062500f, 0.951660f, 0.069885f, 0.945801f, 0.075867f, 0.939941f, + 0.082031f, 0.935059f, 0.087646f, 0.930176f, 0.094727f, 0.924805f, 0.100708f, 0.919434f, + 0.106323f, 0.914551f, 0.111755f, 0.909668f, 0.117554f, 0.904785f, 0.123657f, 0.900391f, + 0.129272f, 0.895508f, 0.135254f, 0.890625f, 0.140625f, 0.886230f, 0.146484f, 0.881348f, + 0.151733f, 0.876953f, 0.156982f, 0.872070f, 0.161987f, 0.868164f, 0.167847f, 0.863281f, + 0.173340f, 0.858887f, 0.179688f, 0.854004f, 0.184937f, 0.849609f, 0.190186f, 0.844727f, + 0.195312f, 0.840332f, 0.200317f, 0.835938f, 0.205444f, 0.831543f, 0.210571f, 0.826660f, + 0.215576f, 0.822266f, 0.221069f, 0.817383f, 0.226685f, 0.812500f, 0.232178f, 0.807617f, + 0.238037f, 0.802246f, 0.243408f, 0.797363f, 0.248657f, 0.791992f, 0.253906f, 0.786621f, + 0.259277f, 0.781250f, 0.264404f, 0.775879f, 0.269775f, 0.770020f, 0.275391f, 0.763672f, + 0.280762f, 0.757812f, 0.286133f, 0.751465f, 0.291504f, 0.745117f, 0.296631f, 0.738281f, + 0.302979f, 0.730469f, 0.309326f, 0.722168f, 0.315186f, 0.713867f, 0.321045f, 0.704590f, + 0.326172f, 0.693848f, 0.330566f, 0.681641f, 0.335449f, 0.668457f, 0.339600f, 0.653320f, + 0.342285f, 0.636230f, 0.340088f, 0.612305f, 0.323486f, 0.573242f, 0.191528f, 0.425049f, + 0.000000f, 1.000000f, 0.049133f, 0.978027f, 0.088074f, 0.951660f, 0.118530f, 0.927734f, + 0.143311f, 0.907227f, 0.162598f, 0.890625f, 0.182251f, 0.874512f, 0.198364f, 0.860352f, + 0.212158f, 0.848145f, 0.226196f, 0.836426f, 0.236938f, 0.826660f, 0.246216f, 0.818359f, + 0.254639f, 0.810547f, 0.263672f, 0.803223f, 0.272705f, 0.795898f, 0.279541f, 0.789551f, + 0.286377f, 0.783691f, 0.292725f, 0.778320f, 0.298584f, 0.773438f, 0.302979f, 0.769043f, + 0.307617f, 0.764648f, 0.311768f, 0.760742f, 0.318848f, 0.755859f, 0.323975f, 0.751953f, + 0.328613f, 0.748047f, 0.332764f, 0.744141f, 0.336670f, 0.740723f, 0.340820f, 0.736816f, + 0.344238f, 0.733887f, 0.347412f, 0.730469f, 0.350342f, 0.727539f, 0.353271f, 0.724609f, + 0.355957f, 0.721680f, 0.358887f, 0.718750f, 0.361084f, 0.715820f, 0.364014f, 0.712891f, + 0.366211f, 0.709961f, 0.368408f, 0.707031f, 0.372070f, 0.704102f, 0.375488f, 0.700684f, + 0.378418f, 0.697266f, 0.381104f, 0.694336f, 0.383301f, 0.690918f, 0.385986f, 0.687500f, + 0.388672f, 0.684082f, 0.390869f, 0.680176f, 0.392822f, 0.676758f, 0.394775f, 0.673340f, + 0.396729f, 0.669434f, 0.398193f, 0.665527f, 0.399658f, 0.661621f, 0.400879f, 0.657227f, + 0.401855f, 0.652832f, 0.402832f, 0.648438f, 0.403320f, 0.643555f, 0.404053f, 0.638184f, + 0.403809f, 0.631836f, 0.402100f, 0.624023f, 0.400146f, 0.615723f, 0.398438f, 0.605957f, + 0.396240f, 0.593262f, 0.386230f, 0.574707f, 0.359863f, 0.543945f, 0.205688f, 0.416504f, + 0.000000f, 1.000000f, 0.369141f, 0.840820f, 0.409668f, 0.779785f, 0.429443f, 0.743652f, + 0.441650f, 0.718750f, 0.449219f, 0.701660f, 0.455078f, 0.688477f, 0.461182f, 0.677246f, + 0.467041f, 0.667480f, 0.470459f, 0.660156f, 0.474609f, 0.653809f, 0.477539f, 0.648438f, + 0.479736f, 0.644043f, 0.483398f, 0.640137f, 0.485352f, 0.636230f, 0.487305f, 0.633301f, + 0.489258f, 0.630371f, 0.491211f, 0.627930f, 0.492432f, 0.625488f, 0.494385f, 0.623535f, + 0.496338f, 0.621094f, 0.498291f, 0.619141f, 0.499268f, 0.617188f, 0.500488f, 0.615723f, + 0.501953f, 0.613770f, 0.502930f, 0.612305f, 0.504395f, 0.610352f, 0.505859f, 0.608398f, + 0.507324f, 0.606934f, 0.509277f, 0.604980f, 0.510254f, 0.603516f, 0.511230f, 0.601562f, + 0.512207f, 0.600098f, 0.514160f, 0.598145f, 0.515137f, 0.596191f, 0.515625f, 0.594238f, + 0.516602f, 0.592285f, 0.517090f, 0.590820f, 0.518555f, 0.588867f, 0.519531f, 0.586426f, + 0.520020f, 0.584473f, 0.520996f, 0.582520f, 0.522461f, 0.579590f, 0.522949f, 0.577148f, + 0.523926f, 0.574707f, 0.524414f, 0.572266f, 0.525879f, 0.569336f, 0.525879f, 0.566406f, + 0.526367f, 0.563477f, 0.527344f, 0.560059f, 0.528320f, 0.556152f, 0.528320f, 0.552734f, + 0.528809f, 0.548340f, 0.530273f, 0.543457f, 0.530762f, 0.538574f, 0.530762f, 0.533203f, + 0.530762f, 0.526855f, 0.529297f, 0.518555f, 0.526855f, 0.509277f, 0.524414f, 0.499512f, + 0.520020f, 0.487549f, 0.511719f, 0.469727f, 0.488525f, 0.440674f, 0.360596f, 0.333252f, + 0.000000f, 1.000000f, 0.381592f, 0.835449f, 0.429199f, 0.770020f, 0.453125f, 0.729492f, + 0.471191f, 0.700684f, 0.483643f, 0.679199f, 0.491699f, 0.663086f, 0.500488f, 0.649414f, + 0.508789f, 0.637207f, 0.515137f, 0.626953f, 0.521973f, 0.618164f, 0.527344f, 0.610352f, + 0.533691f, 0.603027f, 0.537598f, 0.597168f, 0.542969f, 0.591309f, 0.546387f, 0.585938f, + 0.550293f, 0.581543f, 0.554199f, 0.576660f, 0.558594f, 0.572266f, 0.562500f, 0.567871f, + 0.566895f, 0.563965f, 0.569824f, 0.560059f, 0.572266f, 0.556641f, 0.576172f, 0.552734f, + 0.579102f, 0.549316f, 0.583008f, 0.545898f, 0.585938f, 0.541992f, 0.589844f, 0.538574f, + 0.592285f, 0.535156f, 0.595215f, 0.531738f, 0.598145f, 0.528320f, 0.602051f, 0.524414f, + 0.604004f, 0.520996f, 0.607910f, 0.517578f, 0.610352f, 0.513672f, 0.613281f, 0.510254f, + 0.616699f, 0.506348f, 0.619141f, 0.502441f, 0.622070f, 0.498535f, 0.625000f, 0.494629f, + 0.627930f, 0.490479f, 0.631836f, 0.485840f, 0.633789f, 0.481689f, 0.636719f, 0.477051f, + 0.640625f, 0.472168f, 0.643066f, 0.467285f, 0.645508f, 0.462158f, 0.649902f, 0.456787f, + 0.651367f, 0.451416f, 0.655273f, 0.445312f, 0.658203f, 0.439209f, 0.662598f, 0.432129f, + 0.665039f, 0.425049f, 0.668457f, 0.417725f, 0.671387f, 0.409424f, 0.674805f, 0.400879f, + 0.678223f, 0.391113f, 0.680664f, 0.379883f, 0.682129f, 0.366455f, 0.685059f, 0.351562f, + 0.687012f, 0.334473f, 0.685547f, 0.311768f, 0.678711f, 0.278320f, 0.605957f, 0.190186f, + 0.000000f, 1.000000f, 0.394043f, 0.830566f, 0.449463f, 0.758789f, 0.477539f, 0.715332f, + 0.499023f, 0.682129f, 0.514648f, 0.657715f, 0.526855f, 0.638184f, 0.539062f, 0.621582f, + 0.550293f, 0.605957f, 0.558594f, 0.593262f, 0.567871f, 0.582031f, 0.575684f, 0.571777f, + 0.583496f, 0.562500f, 0.590820f, 0.554199f, 0.597168f, 0.546387f, 0.602539f, 0.539062f, + 0.609863f, 0.532227f, 0.616211f, 0.525391f, 0.619629f, 0.519531f, 0.626465f, 0.513184f, + 0.631348f, 0.507324f, 0.636230f, 0.501953f, 0.641602f, 0.496582f, 0.645996f, 0.491455f, + 0.651367f, 0.486084f, 0.655273f, 0.480713f, 0.661133f, 0.475342f, 0.665039f, 0.470459f, + 0.668457f, 0.465576f, 0.673340f, 0.460449f, 0.678223f, 0.455322f, 0.682617f, 0.450439f, + 0.686035f, 0.445068f, 0.690430f, 0.439941f, 0.694824f, 0.434814f, 0.698242f, 0.429688f, + 0.703125f, 0.424316f, 0.707031f, 0.418945f, 0.710449f, 0.413818f, 0.714844f, 0.407959f, + 0.719238f, 0.402344f, 0.722656f, 0.396729f, 0.726562f, 0.390869f, 0.730957f, 0.384766f, + 0.733887f, 0.378662f, 0.738770f, 0.372314f, 0.743164f, 0.365723f, 0.746582f, 0.358887f, + 0.750977f, 0.351562f, 0.753906f, 0.344482f, 0.759766f, 0.336670f, 0.763184f, 0.328613f, + 0.767578f, 0.320312f, 0.771484f, 0.311279f, 0.773926f, 0.302246f, 0.779297f, 0.291992f, + 0.784180f, 0.281250f, 0.789062f, 0.269287f, 0.790527f, 0.254639f, 0.793945f, 0.239136f, + 0.797852f, 0.221680f, 0.799316f, 0.200806f, 0.797852f, 0.170166f, 0.754395f, 0.103760f, + 0.000000f, 1.000000f, 0.409668f, 0.823730f, 0.468018f, 0.749512f, 0.502930f, 0.700195f, + 0.527832f, 0.663574f, 0.546387f, 0.635742f, 0.562012f, 0.612793f, 0.576660f, 0.593262f, + 0.589844f, 0.575684f, 0.602051f, 0.560059f, 0.612305f, 0.546387f, 0.621582f, 0.534180f, + 0.632324f, 0.522461f, 0.640137f, 0.512207f, 0.647949f, 0.502441f, 0.655273f, 0.493652f, + 0.663574f, 0.484863f, 0.670898f, 0.476318f, 0.677246f, 0.468750f, 0.683105f, 0.461426f, + 0.690430f, 0.453857f, 0.695312f, 0.447021f, 0.702148f, 0.439697f, 0.707520f, 0.433105f, + 0.712891f, 0.426514f, 0.719238f, 0.419922f, 0.724121f, 0.413574f, 0.729492f, 0.407471f, + 0.733887f, 0.401367f, 0.738770f, 0.395020f, 0.745117f, 0.388672f, 0.749512f, 0.382568f, + 0.754883f, 0.376465f, 0.758789f, 0.370361f, 0.762695f, 0.364258f, 0.767578f, 0.358398f, + 0.770996f, 0.352295f, 0.776855f, 0.345947f, 0.779785f, 0.339600f, 0.784180f, 0.333252f, + 0.790039f, 0.326904f, 0.791992f, 0.320557f, 0.797363f, 0.313965f, 0.800781f, 0.307373f, + 0.804688f, 0.300537f, 0.809082f, 0.293457f, 0.812988f, 0.286621f, 0.817383f, 0.279297f, + 0.821777f, 0.271729f, 0.824219f, 0.264404f, 0.828613f, 0.256348f, 0.832520f, 0.248291f, + 0.836426f, 0.239868f, 0.839844f, 0.230957f, 0.843750f, 0.221924f, 0.849121f, 0.211670f, + 0.852539f, 0.201416f, 0.856445f, 0.190674f, 0.858398f, 0.177979f, 0.860840f, 0.163818f, + 0.864746f, 0.148438f, 0.868164f, 0.130615f, 0.866211f, 0.106384f, 0.838867f, 0.061279f, + 0.000000f, 1.000000f, 0.422363f, 0.818848f, 0.489502f, 0.738281f, 0.526855f, 0.686035f, + 0.556152f, 0.645508f, 0.579102f, 0.613770f, 0.597168f, 0.587891f, 0.611816f, 0.566406f, + 0.627930f, 0.545898f, 0.642578f, 0.527832f, 0.654297f, 0.512207f, 0.665527f, 0.497803f, + 0.675293f, 0.484619f, 0.685547f, 0.472656f, 0.694336f, 0.461182f, 0.704590f, 0.450439f, + 0.712402f, 0.440186f, 0.719727f, 0.430664f, 0.727051f, 0.421631f, 0.732910f, 0.413086f, + 0.740723f, 0.404297f, 0.747070f, 0.395996f, 0.752441f, 0.388428f, 0.759277f, 0.380371f, + 0.765625f, 0.372803f, 0.771484f, 0.365479f, 0.777832f, 0.358643f, 0.781250f, 0.351562f, + 0.787109f, 0.344482f, 0.791992f, 0.337646f, 0.797363f, 0.330811f, 0.801758f, 0.324219f, + 0.806152f, 0.317383f, 0.811035f, 0.311035f, 0.814453f, 0.304688f, 0.819336f, 0.298096f, + 0.823730f, 0.291504f, 0.827637f, 0.284912f, 0.833008f, 0.278320f, 0.835449f, 0.271973f, + 0.839844f, 0.265381f, 0.843262f, 0.259033f, 0.848145f, 0.252197f, 0.851074f, 0.245605f, + 0.854492f, 0.238892f, 0.857422f, 0.232178f, 0.861816f, 0.225220f, 0.865234f, 0.218140f, + 0.868652f, 0.210815f, 0.873047f, 0.203491f, 0.874512f, 0.196411f, 0.879395f, 0.188599f, + 0.881836f, 0.180908f, 0.885254f, 0.172607f, 0.888672f, 0.164551f, 0.892090f, 0.155640f, + 0.894531f, 0.146973f, 0.898438f, 0.137207f, 0.900879f, 0.127197f, 0.902344f, 0.114807f, + 0.904785f, 0.101868f, 0.906250f, 0.087952f, 0.906250f, 0.069458f, 0.888184f, 0.036011f, + 0.000000f, 1.000000f, 0.438232f, 0.812012f, 0.507324f, 0.728516f, 0.552246f, 0.670898f, + 0.583496f, 0.627441f, 0.609375f, 0.592773f, 0.629395f, 0.564453f, 0.646484f, 0.540039f, + 0.665527f, 0.517090f, 0.679199f, 0.497803f, 0.691895f, 0.479736f, 0.705078f, 0.463867f, + 0.715820f, 0.448975f, 0.726562f, 0.435547f, 0.735352f, 0.422852f, 0.745117f, 0.410889f, + 0.753906f, 0.399658f, 0.761230f, 0.389160f, 0.769043f, 0.379150f, 0.777832f, 0.369141f, + 0.783203f, 0.359863f, 0.790039f, 0.351074f, 0.795898f, 0.342773f, 0.802246f, 0.334229f, + 0.807129f, 0.326416f, 0.812988f, 0.318359f, 0.819336f, 0.310791f, 0.823730f, 0.303467f, + 0.829102f, 0.295898f, 0.833008f, 0.289062f, 0.838379f, 0.281982f, 0.842285f, 0.275146f, + 0.845703f, 0.268555f, 0.850098f, 0.261719f, 0.854004f, 0.255127f, 0.859375f, 0.248535f, + 0.862793f, 0.241821f, 0.865723f, 0.235596f, 0.869141f, 0.229248f, 0.874512f, 0.222778f, + 0.875977f, 0.216553f, 0.879883f, 0.210327f, 0.882324f, 0.204224f, 0.887695f, 0.197388f, + 0.889648f, 0.190918f, 0.891602f, 0.184692f, 0.896484f, 0.178101f, 0.897949f, 0.171753f, + 0.901367f, 0.165283f, 0.903809f, 0.158813f, 0.907227f, 0.152100f, 0.909180f, 0.145386f, + 0.912598f, 0.138184f, 0.915039f, 0.130981f, 0.917480f, 0.123840f, 0.919922f, 0.116577f, + 0.922852f, 0.108826f, 0.925293f, 0.101257f, 0.927246f, 0.092834f, 0.930176f, 0.082581f, + 0.930176f, 0.071960f, 0.931152f, 0.060883f, 0.930664f, 0.047760f, 0.918457f, 0.024490f, + 0.000000f, 1.000000f, 0.449463f, 0.807617f, 0.528809f, 0.717773f, 0.575684f, 0.656738f, + 0.611328f, 0.609863f, 0.638184f, 0.572754f, 0.660645f, 0.541504f, 0.678711f, 0.515137f, + 0.697754f, 0.490723f, 0.712891f, 0.469238f, 0.727539f, 0.449463f, 0.740723f, 0.432129f, + 0.750977f, 0.416504f, 0.761719f, 0.401611f, 0.772461f, 0.387695f, 0.781738f, 0.375000f, + 0.789062f, 0.363281f, 0.797363f, 0.351807f, 0.803711f, 0.341309f, 0.812500f, 0.330811f, + 0.818359f, 0.321045f, 0.823242f, 0.312012f, 0.830566f, 0.303223f, 0.836914f, 0.294434f, + 0.842285f, 0.285889f, 0.846680f, 0.278076f, 0.851562f, 0.270264f, 0.855957f, 0.262939f, + 0.861328f, 0.255371f, 0.864258f, 0.248535f, 0.868652f, 0.241455f, 0.873535f, 0.234497f, + 0.876953f, 0.227905f, 0.881348f, 0.221313f, 0.884766f, 0.214600f, 0.886719f, 0.208618f, + 0.891113f, 0.202271f, 0.894043f, 0.196289f, 0.896484f, 0.190186f, 0.900879f, 0.183960f, + 0.903320f, 0.177979f, 0.906250f, 0.171875f, 0.909180f, 0.165894f, 0.911621f, 0.160278f, + 0.914551f, 0.154297f, 0.915527f, 0.148926f, 0.918945f, 0.142822f, 0.920898f, 0.137207f, + 0.924805f, 0.130981f, 0.926270f, 0.125000f, 0.929688f, 0.119019f, 0.930664f, 0.113159f, + 0.932617f, 0.107483f, 0.934570f, 0.101440f, 0.937500f, 0.095215f, 0.939453f, 0.088989f, + 0.941895f, 0.082092f, 0.942871f, 0.075867f, 0.945312f, 0.069397f, 0.947266f, 0.061920f, + 0.946289f, 0.052948f, 0.948242f, 0.043701f, 0.948242f, 0.034393f, 0.938965f, 0.016373f, + 0.000000f, 1.000000f, 0.463867f, 0.801758f, 0.547852f, 0.708008f, 0.599609f, 0.642578f, + 0.638184f, 0.592773f, 0.665039f, 0.553223f, 0.689941f, 0.519531f, 0.710449f, 0.490967f, + 0.728027f, 0.465820f, 0.744629f, 0.442383f, 0.758301f, 0.422119f, 0.771484f, 0.403564f, + 0.782715f, 0.386719f, 0.792969f, 0.371094f, 0.802734f, 0.356689f, 0.812012f, 0.343506f, + 0.820801f, 0.330811f, 0.828125f, 0.319092f, 0.834473f, 0.308105f, 0.841797f, 0.297607f, + 0.847656f, 0.287598f, 0.853027f, 0.278076f, 0.858398f, 0.269287f, 0.863770f, 0.260254f, + 0.867676f, 0.252197f, 0.873535f, 0.244141f, 0.876465f, 0.236694f, 0.883301f, 0.228882f, + 0.885742f, 0.221680f, 0.890137f, 0.214478f, 0.893066f, 0.207764f, 0.896484f, 0.201172f, + 0.899902f, 0.194946f, 0.903320f, 0.188599f, 0.907715f, 0.182251f, 0.909180f, 0.176392f, + 0.913574f, 0.170166f, 0.916016f, 0.164429f, 0.917969f, 0.158813f, 0.920410f, 0.153076f, + 0.921875f, 0.147827f, 0.924316f, 0.142212f, 0.927734f, 0.136841f, 0.930664f, 0.131226f, + 0.932129f, 0.125977f, 0.934082f, 0.120850f, 0.936523f, 0.115540f, 0.937988f, 0.110474f, + 0.939453f, 0.105469f, 0.942871f, 0.099854f, 0.944336f, 0.094666f, 0.945312f, 0.089844f, + 0.947266f, 0.084778f, 0.949219f, 0.079468f, 0.951172f, 0.074036f, 0.953125f, 0.068726f, + 0.954102f, 0.063660f, 0.955566f, 0.058319f, 0.957520f, 0.052643f, 0.958984f, 0.047333f, + 0.958496f, 0.039642f, 0.958984f, 0.032715f, 0.958496f, 0.024780f, 0.951660f, 0.011436f, + 0.000000f, 1.000000f, 0.478760f, 0.795898f, 0.568359f, 0.697266f, 0.622559f, 0.629395f, + 0.663574f, 0.576172f, 0.692871f, 0.534180f, 0.716309f, 0.499512f, 0.738281f, 0.468994f, + 0.753906f, 0.443359f, 0.772461f, 0.417969f, 0.786621f, 0.396973f, 0.798828f, 0.377686f, + 0.809570f, 0.360107f, 0.819824f, 0.343994f, 0.828613f, 0.329590f, 0.838867f, 0.315186f, + 0.844727f, 0.302734f, 0.853027f, 0.290527f, 0.858398f, 0.279785f, 0.865234f, 0.268799f, + 0.870117f, 0.259033f, 0.876465f, 0.249268f, 0.880859f, 0.240479f, 0.885254f, 0.231812f, + 0.890625f, 0.223511f, 0.895020f, 0.215576f, 0.897461f, 0.208130f, 0.902832f, 0.200439f, + 0.905762f, 0.193604f, 0.908691f, 0.186890f, 0.912598f, 0.180420f, 0.915039f, 0.173950f, + 0.918945f, 0.167480f, 0.920898f, 0.161621f, 0.924316f, 0.155640f, 0.925293f, 0.150146f, + 0.927246f, 0.144897f, 0.930664f, 0.139282f, 0.933594f, 0.133911f, 0.935059f, 0.128662f, + 0.937500f, 0.123474f, 0.938965f, 0.118591f, 0.940430f, 0.114014f, 0.944336f, 0.108765f, + 0.945312f, 0.104004f, 0.946777f, 0.099304f, 0.948730f, 0.094604f, 0.949707f, 0.090149f, + 0.951660f, 0.085510f, 0.953613f, 0.080872f, 0.954590f, 0.076599f, 0.956543f, 0.072083f, + 0.958008f, 0.067444f, 0.958984f, 0.063171f, 0.960938f, 0.058807f, 0.962402f, 0.054291f, + 0.963867f, 0.049805f, 0.964844f, 0.045593f, 0.966797f, 0.040741f, 0.967285f, 0.036530f, + 0.967773f, 0.031097f, 0.966797f, 0.024765f, 0.967285f, 0.018341f, 0.962402f, 0.008820f, + 0.000000f, 1.000000f, 0.492676f, 0.790039f, 0.588379f, 0.687500f, 0.645020f, 0.616211f, + 0.687500f, 0.560547f, 0.718750f, 0.516602f, 0.742188f, 0.480469f, 0.762207f, 0.449219f, + 0.778320f, 0.422119f, 0.796875f, 0.396240f, 0.809570f, 0.374756f, 0.822266f, 0.354492f, + 0.832031f, 0.336914f, 0.843750f, 0.320068f, 0.852051f, 0.304932f, 0.859375f, 0.291016f, + 0.867188f, 0.278076f, 0.872070f, 0.266357f, 0.878906f, 0.254883f, 0.884277f, 0.244263f, + 0.890137f, 0.234375f, 0.894043f, 0.224976f, 0.899902f, 0.215820f, 0.903320f, 0.207397f, + 0.906250f, 0.199463f, 0.911621f, 0.191650f, 0.914062f, 0.184326f, 0.918457f, 0.177124f, + 0.920898f, 0.170288f, 0.924316f, 0.163574f, 0.926270f, 0.157715f, 0.930176f, 0.151367f, + 0.931152f, 0.145752f, 0.934082f, 0.140015f, 0.937500f, 0.134155f, 0.938965f, 0.128906f, + 0.939941f, 0.124146f, 0.942871f, 0.119141f, 0.945312f, 0.113770f, 0.946777f, 0.109009f, + 0.948242f, 0.104431f, 0.949707f, 0.099915f, 0.951172f, 0.095520f, 0.953613f, 0.091064f, + 0.955078f, 0.086731f, 0.956543f, 0.082520f, 0.958496f, 0.078186f, 0.959961f, 0.074097f, + 0.960449f, 0.070374f, 0.962402f, 0.066345f, 0.962891f, 0.062439f, 0.964844f, 0.058472f, + 0.965820f, 0.054626f, 0.967773f, 0.050842f, 0.968262f, 0.047089f, 0.968262f, 0.043762f, + 0.971191f, 0.039612f, 0.972168f, 0.035767f, 0.972168f, 0.032410f, 0.973633f, 0.028854f, + 0.975586f, 0.025055f, 0.973633f, 0.019211f, 0.972656f, 0.014503f, 0.969727f, 0.006020f, + 0.000000f, 1.000000f, 0.505859f, 0.785156f, 0.607422f, 0.677734f, 0.666016f, 0.604004f, + 0.708496f, 0.546387f, 0.739746f, 0.500488f, 0.764648f, 0.463135f, 0.785645f, 0.430664f, + 0.802734f, 0.402344f, 0.818359f, 0.376953f, 0.831543f, 0.354248f, 0.842773f, 0.333984f, + 0.852051f, 0.316162f, 0.861328f, 0.299072f, 0.870117f, 0.283936f, 0.876953f, 0.270264f, + 0.884766f, 0.257080f, 0.890137f, 0.244873f, 0.894531f, 0.234009f, 0.900391f, 0.223267f, + 0.905273f, 0.213379f, 0.910645f, 0.203857f, 0.912598f, 0.195435f, 0.917480f, 0.187012f, + 0.920898f, 0.179199f, 0.924805f, 0.171509f, 0.927734f, 0.164185f, 0.930176f, 0.157349f, + 0.931641f, 0.151367f, 0.936523f, 0.144897f, 0.938965f, 0.138428f, 0.940430f, 0.132812f, + 0.942871f, 0.127319f, 0.944336f, 0.122131f, 0.946289f, 0.117065f, 0.948730f, 0.111877f, + 0.950684f, 0.107056f, 0.952637f, 0.102173f, 0.954590f, 0.097595f, 0.955078f, 0.093506f, + 0.957031f, 0.089172f, 0.958496f, 0.085022f, 0.960449f, 0.080627f, 0.960938f, 0.076782f, + 0.963379f, 0.072754f, 0.963379f, 0.069153f, 0.964844f, 0.065613f, 0.965820f, 0.062195f, + 0.968262f, 0.058228f, 0.969238f, 0.054504f, 0.969727f, 0.051331f, 0.970703f, 0.048309f, + 0.971680f, 0.044830f, 0.973145f, 0.041443f, 0.973633f, 0.038269f, 0.974609f, 0.035187f, + 0.975586f, 0.032166f, 0.977051f, 0.028854f, 0.977051f, 0.026123f, 0.978027f, 0.022934f, + 0.978516f, 0.020386f, 0.979004f, 0.015579f, 0.977051f, 0.010773f, 0.974121f, 0.005226f, + 0.000000f, 1.000000f, 0.520020f, 0.779297f, 0.625488f, 0.668457f, 0.686035f, 0.591797f, + 0.730469f, 0.532227f, 0.761719f, 0.485596f, 0.785645f, 0.447021f, 0.805664f, 0.414062f, + 0.822266f, 0.385010f, 0.836914f, 0.359375f, 0.850586f, 0.335938f, 0.860352f, 0.316162f, + 0.871094f, 0.297363f, 0.878418f, 0.280762f, 0.884766f, 0.266113f, 0.893066f, 0.251465f, + 0.898926f, 0.238647f, 0.903809f, 0.226807f, 0.910156f, 0.215576f, 0.914551f, 0.204956f, + 0.917969f, 0.195435f, 0.921875f, 0.186523f, 0.926270f, 0.177612f, 0.930176f, 0.169312f, + 0.931641f, 0.161865f, 0.934570f, 0.155029f, 0.938477f, 0.147461f, 0.940918f, 0.141113f, + 0.943359f, 0.134766f, 0.945312f, 0.128784f, 0.947754f, 0.122986f, 0.949219f, 0.117615f, + 0.951172f, 0.112488f, 0.953613f, 0.107239f, 0.954590f, 0.102478f, 0.957031f, 0.097656f, + 0.958496f, 0.093018f, 0.959473f, 0.088867f, 0.960938f, 0.084839f, 0.963379f, 0.080444f, + 0.964355f, 0.076538f, 0.964844f, 0.072693f, 0.965820f, 0.069031f, 0.967285f, 0.065613f, + 0.969238f, 0.061798f, 0.969727f, 0.058472f, 0.970215f, 0.055420f, 0.971680f, 0.052094f, + 0.973145f, 0.048706f, 0.973633f, 0.045746f, 0.975098f, 0.042938f, 0.975098f, 0.040100f, + 0.976562f, 0.037048f, 0.977539f, 0.033997f, 0.978027f, 0.031433f, 0.979004f, 0.028717f, + 0.979492f, 0.026321f, 0.979980f, 0.023834f, 0.981934f, 0.020721f, 0.982422f, 0.018433f, + 0.981934f, 0.016449f, 0.983398f, 0.013855f, 0.980957f, 0.008705f, 0.980469f, 0.004063f, + 0.000000f, 1.000000f, 0.535156f, 0.773438f, 0.644043f, 0.659180f, 0.706055f, 0.580078f, + 0.750000f, 0.519531f, 0.780273f, 0.471680f, 0.804199f, 0.432129f, 0.823242f, 0.398682f, + 0.838867f, 0.369629f, 0.852539f, 0.343994f, 0.866211f, 0.320312f, 0.875977f, 0.299805f, + 0.884766f, 0.281494f, 0.893066f, 0.264893f, 0.900391f, 0.249756f, 0.906250f, 0.235596f, + 0.911621f, 0.223022f, 0.916504f, 0.211060f, 0.921875f, 0.199829f, 0.923828f, 0.190063f, + 0.929688f, 0.179932f, 0.932129f, 0.171387f, 0.936523f, 0.162720f, 0.938965f, 0.154785f, + 0.941895f, 0.147339f, 0.944336f, 0.140381f, 0.947266f, 0.133423f, 0.948730f, 0.127197f, + 0.951172f, 0.121277f, 0.953613f, 0.115417f, 0.955078f, 0.110168f, 0.957520f, 0.104614f, + 0.958984f, 0.099731f, 0.959473f, 0.095154f, 0.961426f, 0.090515f, 0.962891f, 0.085938f, + 0.964355f, 0.081665f, 0.965820f, 0.077637f, 0.966309f, 0.073914f, 0.967773f, 0.070068f, + 0.969238f, 0.066284f, 0.970215f, 0.062805f, 0.971191f, 0.059540f, 0.972656f, 0.056152f, + 0.973633f, 0.053009f, 0.974121f, 0.049957f, 0.975586f, 0.046997f, 0.976074f, 0.044128f, + 0.977539f, 0.041229f, 0.978027f, 0.038483f, 0.978516f, 0.036041f, 0.979980f, 0.033295f, + 0.979980f, 0.030838f, 0.980469f, 0.028625f, 0.981934f, 0.026169f, 0.982910f, 0.023605f, + 0.983398f, 0.021332f, 0.983398f, 0.019470f, 0.983887f, 0.017426f, 0.984863f, 0.015488f, + 0.985840f, 0.013283f, 0.986328f, 0.010986f, 0.984375f, 0.006939f, 0.981934f, 0.003538f, + 0.000000f, 1.000000f, 0.548828f, 0.768555f, 0.661621f, 0.650391f, 0.725586f, 0.569336f, + 0.766602f, 0.508301f, 0.797363f, 0.459473f, 0.820801f, 0.418945f, 0.839844f, 0.385010f, + 0.854980f, 0.355957f, 0.867676f, 0.330078f, 0.879883f, 0.306396f, 0.889160f, 0.285889f, + 0.898438f, 0.267334f, 0.904785f, 0.250732f, 0.910645f, 0.235718f, 0.916992f, 0.221680f, + 0.921875f, 0.209106f, 0.926270f, 0.197754f, 0.931152f, 0.186401f, 0.934082f, 0.176514f, + 0.937988f, 0.166992f, 0.941406f, 0.158081f, 0.943848f, 0.150024f, 0.946289f, 0.142334f, + 0.948730f, 0.135132f, 0.951660f, 0.128052f, 0.953125f, 0.121704f, 0.955566f, 0.115723f, + 0.957520f, 0.109985f, 0.959473f, 0.104126f, 0.960938f, 0.099060f, 0.962402f, 0.094055f, + 0.963379f, 0.089600f, 0.966309f, 0.084717f, 0.967285f, 0.080261f, 0.967773f, 0.076294f, + 0.969727f, 0.072327f, 0.969727f, 0.068726f, 0.972168f, 0.064880f, 0.973145f, 0.061188f, + 0.974121f, 0.057922f, 0.974121f, 0.054871f, 0.975098f, 0.051880f, 0.976562f, 0.048798f, + 0.978027f, 0.045563f, 0.978516f, 0.042725f, 0.978516f, 0.040375f, 0.979004f, 0.037994f, + 0.980469f, 0.035339f, 0.980957f, 0.032776f, 0.982422f, 0.030334f, 0.982422f, 0.028046f, + 0.982910f, 0.025955f, 0.983398f, 0.023926f, 0.983887f, 0.021973f, 0.984863f, 0.019989f, + 0.985352f, 0.018112f, 0.985352f, 0.016388f, 0.987305f, 0.013885f, 0.987305f, 0.012360f, + 0.987793f, 0.010902f, 0.988281f, 0.009369f, 0.986816f, 0.006710f, 0.985840f, 0.001877f, + 0.000000f, 1.000000f, 0.562988f, 0.762695f, 0.678223f, 0.642090f, 0.741699f, 0.559570f, + 0.783203f, 0.497314f, 0.812988f, 0.447998f, 0.835449f, 0.407227f, 0.854004f, 0.372803f, + 0.868164f, 0.343262f, 0.880859f, 0.317871f, 0.891602f, 0.293945f, 0.900879f, 0.273682f, + 0.908691f, 0.254883f, 0.914551f, 0.238892f, 0.921875f, 0.223022f, 0.926270f, 0.210083f, + 0.931152f, 0.197144f, 0.934570f, 0.185669f, 0.938477f, 0.175049f, 0.942871f, 0.164917f, + 0.945801f, 0.155640f, 0.947754f, 0.147339f, 0.950684f, 0.139160f, 0.953613f, 0.131592f, + 0.956543f, 0.124329f, 0.957520f, 0.117981f, 0.959473f, 0.111755f, 0.961914f, 0.105652f, + 0.962891f, 0.100098f, 0.964844f, 0.095093f, 0.966797f, 0.089722f, 0.967773f, 0.085022f, + 0.968750f, 0.080566f, 0.970215f, 0.076233f, 0.971680f, 0.072083f, 0.972168f, 0.068298f, + 0.973633f, 0.064453f, 0.974609f, 0.060883f, 0.975586f, 0.057495f, 0.976562f, 0.054291f, + 0.977539f, 0.051178f, 0.978027f, 0.047974f, 0.978516f, 0.045166f, 0.979004f, 0.042542f, + 0.979980f, 0.039948f, 0.980957f, 0.037354f, 0.981934f, 0.034882f, 0.982910f, 0.032227f, + 0.982910f, 0.030167f, 0.983887f, 0.027924f, 0.983887f, 0.026093f, 0.984375f, 0.024246f, + 0.985840f, 0.022125f, 0.986328f, 0.020248f, 0.987305f, 0.018341f, 0.987793f, 0.016449f, + 0.987793f, 0.014763f, 0.988281f, 0.013397f, 0.988281f, 0.012009f, 0.988770f, 0.010773f, + 0.989258f, 0.009399f, 0.989746f, 0.008026f, 0.991699f, 0.005917f, 0.987793f, 0.001071f, + 0.000000f, 1.000000f, 0.575684f, 0.758301f, 0.693359f, 0.634766f, 0.759766f, 0.549316f, + 0.798828f, 0.487305f, 0.828613f, 0.436768f, 0.850098f, 0.395996f, 0.866211f, 0.362061f, + 0.879883f, 0.332275f, 0.892090f, 0.306396f, 0.902344f, 0.283447f, 0.911621f, 0.262207f, + 0.919434f, 0.244019f, 0.923828f, 0.227783f, 0.929199f, 0.212891f, 0.934082f, 0.199341f, + 0.938477f, 0.186768f, 0.942871f, 0.175293f, 0.945801f, 0.165039f, 0.949219f, 0.154907f, + 0.951172f, 0.146240f, 0.955078f, 0.137451f, 0.956543f, 0.129639f, 0.958008f, 0.122681f, + 0.961426f, 0.115417f, 0.962891f, 0.109009f, 0.963867f, 0.103271f, 0.966797f, 0.097107f, + 0.967285f, 0.091858f, 0.968750f, 0.086914f, 0.969727f, 0.082153f, 0.972168f, 0.077209f, + 0.973145f, 0.072998f, 0.973145f, 0.069153f, 0.974609f, 0.065186f, 0.975586f, 0.061493f, + 0.977051f, 0.057739f, 0.978027f, 0.054382f, 0.978516f, 0.051208f, 0.979004f, 0.048309f, + 0.980469f, 0.045410f, 0.980957f, 0.042603f, 0.982422f, 0.039703f, 0.982910f, 0.037048f, + 0.982910f, 0.034851f, 0.983887f, 0.032562f, 0.984375f, 0.030258f, 0.984863f, 0.028229f, + 0.984863f, 0.026443f, 0.985840f, 0.024445f, 0.987305f, 0.022339f, 0.987305f, 0.020264f, + 0.987793f, 0.018524f, 0.987793f, 0.017059f, 0.988281f, 0.015625f, 0.988770f, 0.014076f, + 0.988770f, 0.012947f, 0.989258f, 0.011665f, 0.990234f, 0.010193f, 0.990723f, 0.008965f, + 0.991211f, 0.007645f, 0.992188f, 0.005848f, 0.992188f, 0.005161f, 0.988770f, 0.001506f, + 0.000000f, 1.000000f, 0.589844f, 0.752441f, 0.709961f, 0.626953f, 0.773438f, 0.541016f, + 0.813477f, 0.478271f, 0.841797f, 0.427002f, 0.863281f, 0.385742f, 0.878418f, 0.351562f, + 0.891602f, 0.322266f, 0.900391f, 0.296875f, 0.911621f, 0.273438f, 0.919434f, 0.252686f, + 0.926270f, 0.234741f, 0.931641f, 0.218384f, 0.937500f, 0.203369f, 0.941895f, 0.189941f, + 0.944824f, 0.177979f, 0.948242f, 0.166626f, 0.951172f, 0.156372f, 0.955078f, 0.146362f, + 0.957520f, 0.137817f, 0.959473f, 0.129395f, 0.961914f, 0.121643f, 0.962891f, 0.114868f, + 0.966309f, 0.107666f, 0.967285f, 0.101440f, 0.968262f, 0.095825f, 0.970215f, 0.090271f, + 0.972168f, 0.084656f, 0.973145f, 0.079895f, 0.973633f, 0.075623f, 0.976074f, 0.070984f, + 0.977051f, 0.066589f, 0.977539f, 0.062805f, 0.978027f, 0.059235f, 0.979492f, 0.055542f, + 0.979492f, 0.052399f, 0.979980f, 0.049225f, 0.980957f, 0.046204f, 0.982910f, 0.042938f, + 0.982910f, 0.040192f, 0.982910f, 0.037842f, 0.983398f, 0.035522f, 0.984375f, 0.033234f, + 0.984863f, 0.030853f, 0.985352f, 0.028793f, 0.986328f, 0.026642f, 0.987305f, 0.024460f, + 0.987793f, 0.022522f, 0.988281f, 0.020676f, 0.988281f, 0.019165f, 0.988770f, 0.017807f, + 0.989258f, 0.016266f, 0.989258f, 0.014915f, 0.989746f, 0.013550f, 0.990234f, 0.012337f, + 0.990723f, 0.011070f, 0.991211f, 0.009644f, 0.992188f, 0.008110f, 0.992676f, 0.006832f, + 0.992676f, 0.005985f, 0.993164f, 0.005234f, 0.992676f, 0.004589f, 0.990234f, 0.001586f, + 0.000000f, 1.000000f, 0.604492f, 0.747070f, 0.725586f, 0.618652f, 0.786621f, 0.533203f, + 0.825684f, 0.469482f, 0.853516f, 0.418701f, 0.874512f, 0.376953f, 0.889648f, 0.342773f, + 0.899902f, 0.313477f, 0.910156f, 0.288086f, 0.919434f, 0.265137f, 0.927734f, 0.244629f, + 0.933594f, 0.226318f, 0.939453f, 0.209961f, 0.943359f, 0.195435f, 0.947754f, 0.181885f, + 0.950195f, 0.170044f, 0.953613f, 0.158813f, 0.957031f, 0.148560f, 0.958984f, 0.139282f, + 0.961914f, 0.130371f, 0.964355f, 0.122192f, 0.965820f, 0.114807f, 0.968262f, 0.107727f, + 0.969727f, 0.101196f, 0.970703f, 0.095093f, 0.972656f, 0.089294f, 0.973633f, 0.083923f, + 0.974121f, 0.079163f, 0.976562f, 0.074036f, 0.977539f, 0.069397f, 0.978027f, 0.065369f, + 0.978516f, 0.061584f, 0.979492f, 0.057892f, 0.980957f, 0.054077f, 0.981934f, 0.050568f, + 0.982910f, 0.047394f, 0.982910f, 0.044495f, 0.983887f, 0.041565f, 0.983887f, 0.039093f, + 0.984863f, 0.036469f, 0.985352f, 0.034149f, 0.986328f, 0.031769f, 0.987305f, 0.029266f, + 0.987793f, 0.027008f, 0.987793f, 0.025208f, 0.988770f, 0.023285f, 0.988770f, 0.021530f, + 0.989258f, 0.019943f, 0.989258f, 0.018494f, 0.989258f, 0.017151f, 0.989746f, 0.015549f, + 0.990234f, 0.014198f, 0.990723f, 0.013031f, 0.991699f, 0.011574f, 0.992676f, 0.009941f, + 0.992676f, 0.008720f, 0.993164f, 0.007805f, 0.993164f, 0.006783f, 0.993164f, 0.006134f, + 0.993652f, 0.005295f, 0.993164f, 0.004807f, 0.993652f, 0.004078f, 0.992188f, 0.002140f, + 0.000000f, 1.000000f, 0.615723f, 0.742676f, 0.740234f, 0.611816f, 0.800293f, 0.525879f, + 0.838379f, 0.461670f, 0.865234f, 0.410400f, 0.884277f, 0.368896f, 0.898438f, 0.334229f, + 0.909668f, 0.305176f, 0.918457f, 0.280029f, 0.924805f, 0.258057f, 0.933594f, 0.237061f, + 0.939453f, 0.219116f, 0.944824f, 0.202637f, 0.949219f, 0.188232f, 0.952637f, 0.174927f, + 0.956055f, 0.163086f, 0.958496f, 0.151978f, 0.960938f, 0.142212f, 0.963867f, 0.132446f, + 0.965332f, 0.124207f, 0.968262f, 0.116150f, 0.970215f, 0.108582f, 0.970703f, 0.101929f, + 0.972656f, 0.095459f, 0.973633f, 0.089661f, 0.976074f, 0.083679f, 0.976562f, 0.078613f, + 0.977051f, 0.073792f, 0.978516f, 0.069153f, 0.979004f, 0.064941f, 0.980957f, 0.060699f, + 0.981445f, 0.056763f, 0.982422f, 0.053040f, 0.982910f, 0.049683f, 0.983398f, 0.046600f, + 0.983398f, 0.043884f, 0.984863f, 0.040741f, 0.985352f, 0.038025f, 0.985840f, 0.035522f, + 0.987305f, 0.032745f, 0.987793f, 0.030273f, 0.987793f, 0.028259f, 0.988281f, 0.026230f, + 0.988281f, 0.024521f, 0.989258f, 0.022552f, 0.989258f, 0.020935f, 0.989746f, 0.019379f, + 0.989746f, 0.017990f, 0.990723f, 0.016296f, 0.991211f, 0.014885f, 0.991699f, 0.013512f, + 0.993164f, 0.011826f, 0.993164f, 0.010445f, 0.993164f, 0.009438f, 0.993164f, 0.008598f, + 0.993652f, 0.007557f, 0.993164f, 0.006863f, 0.993652f, 0.006081f, 0.993652f, 0.005436f, + 0.994141f, 0.004818f, 0.994141f, 0.004261f, 0.994629f, 0.003578f, 0.995117f, 0.002644f, + 0.000000f, 1.000000f, 0.629395f, 0.737793f, 0.752930f, 0.605469f, 0.813965f, 0.518555f, + 0.849121f, 0.454590f, 0.875488f, 0.403076f, 0.892578f, 0.362061f, 0.906738f, 0.327393f, + 0.916504f, 0.298340f, 0.924805f, 0.273193f, 0.931152f, 0.251465f, 0.938477f, 0.230835f, + 0.944824f, 0.212524f, 0.949707f, 0.196533f, 0.953613f, 0.182129f, 0.957031f, 0.169067f, + 0.960449f, 0.157104f, 0.962891f, 0.146118f, 0.965332f, 0.136353f, 0.967285f, 0.127075f, + 0.970215f, 0.118469f, 0.971191f, 0.110779f, 0.972656f, 0.103638f, 0.975098f, 0.096741f, + 0.976074f, 0.090332f, 0.976562f, 0.084778f, 0.978516f, 0.079163f, 0.979004f, 0.074158f, + 0.980469f, 0.069519f, 0.981934f, 0.064453f, 0.982422f, 0.060425f, 0.982422f, 0.056763f, + 0.983887f, 0.052856f, 0.983887f, 0.049622f, 0.984375f, 0.046478f, 0.985352f, 0.043304f, + 0.986328f, 0.040039f, 0.987305f, 0.037018f, 0.987305f, 0.034515f, 0.987793f, 0.032166f, + 0.988281f, 0.029816f, 0.988281f, 0.027847f, 0.988770f, 0.025894f, 0.989258f, 0.023972f, + 0.989746f, 0.022125f, 0.989746f, 0.020569f, 0.990234f, 0.018951f, 0.991211f, 0.017181f, + 0.991699f, 0.015602f, 0.992676f, 0.013878f, 0.993164f, 0.012512f, 0.993164f, 0.011253f, + 0.993164f, 0.010269f, 0.993164f, 0.009407f, 0.993652f, 0.008347f, 0.993652f, 0.007614f, + 0.994141f, 0.006866f, 0.994141f, 0.006104f, 0.994141f, 0.005589f, 0.994629f, 0.004826f, + 0.994629f, 0.004421f, 0.994629f, 0.003727f, 0.995117f, 0.003061f, 0.996094f, 0.001978f, + 0.000000f, 1.000000f, 0.642578f, 0.732422f, 0.764648f, 0.600098f, 0.824707f, 0.511719f, + 0.859375f, 0.447510f, 0.884766f, 0.396240f, 0.900879f, 0.355225f, 0.913574f, 0.320801f, + 0.923828f, 0.292236f, 0.932129f, 0.266846f, 0.937988f, 0.244995f, 0.944824f, 0.225098f, + 0.950684f, 0.206787f, 0.954590f, 0.190918f, 0.957520f, 0.176758f, 0.961914f, 0.163330f, + 0.963867f, 0.151855f, 0.966797f, 0.140991f, 0.969238f, 0.131104f, 0.970703f, 0.122192f, + 0.972168f, 0.114014f, 0.974609f, 0.105957f, 0.975586f, 0.098938f, 0.976562f, 0.092407f, + 0.978027f, 0.086365f, 0.979492f, 0.080505f, 0.980957f, 0.074890f, 0.981445f, 0.070007f, + 0.982422f, 0.065308f, 0.982910f, 0.061188f, 0.983398f, 0.057220f, 0.984375f, 0.053375f, + 0.985352f, 0.049652f, 0.986816f, 0.046021f, 0.987305f, 0.042847f, 0.987793f, 0.039642f, + 0.987793f, 0.037048f, 0.988281f, 0.034515f, 0.988770f, 0.032074f, 0.989258f, 0.029770f, + 0.989258f, 0.027756f, 0.989746f, 0.025757f, 0.990723f, 0.023697f, 0.990723f, 0.021866f, + 0.991211f, 0.020111f, 0.992676f, 0.018082f, 0.993164f, 0.016220f, 0.993164f, 0.014832f, + 0.993652f, 0.013557f, 0.993652f, 0.012260f, 0.993164f, 0.011230f, 0.993164f, 0.010330f, + 0.993652f, 0.009224f, 0.993652f, 0.008430f, 0.994141f, 0.007618f, 0.994141f, 0.006821f, + 0.994141f, 0.006241f, 0.994629f, 0.005444f, 0.994629f, 0.004955f, 0.995117f, 0.004230f, + 0.995605f, 0.003597f, 0.996094f, 0.002962f, 0.996582f, 0.002153f, 0.998047f, 0.000076f, + 0.000000f, 1.000000f, 0.656250f, 0.727539f, 0.777832f, 0.593750f, 0.834961f, 0.505859f, + 0.867188f, 0.442139f, 0.892578f, 0.390625f, 0.909180f, 0.349121f, 0.920898f, 0.314941f, + 0.930176f, 0.286133f, 0.937988f, 0.261230f, 0.943848f, 0.239380f, 0.947754f, 0.220459f, + 0.954102f, 0.201904f, 0.958008f, 0.186035f, 0.961426f, 0.171753f, 0.964355f, 0.159058f, + 0.967285f, 0.147217f, 0.969727f, 0.136475f, 0.971680f, 0.127075f, 0.974121f, 0.117554f, + 0.974609f, 0.109863f, 0.976562f, 0.102051f, 0.977539f, 0.095276f, 0.979980f, 0.088318f, + 0.980469f, 0.082275f, 0.981934f, 0.076599f, 0.981934f, 0.071655f, 0.982422f, 0.067078f, + 0.983887f, 0.062256f, 0.984375f, 0.058136f, 0.986816f, 0.053680f, 0.986816f, 0.049805f, + 0.987305f, 0.046387f, 0.987793f, 0.043274f, 0.988281f, 0.040161f, 0.988281f, 0.037445f, + 0.988770f, 0.034882f, 0.989258f, 0.032318f, 0.989746f, 0.029938f, 0.990234f, 0.027786f, + 0.990723f, 0.025589f, 0.991699f, 0.023407f, 0.992676f, 0.021225f, 0.993164f, 0.019241f, + 0.993164f, 0.017578f, 0.993164f, 0.016159f, 0.993164f, 0.014908f, 0.993652f, 0.013474f, + 0.993652f, 0.012375f, 0.993652f, 0.011398f, 0.994141f, 0.010223f, 0.994141f, 0.009369f, + 0.994629f, 0.008430f, 0.994629f, 0.007622f, 0.994629f, 0.006977f, 0.995117f, 0.006115f, + 0.995117f, 0.005562f, 0.995605f, 0.004791f, 0.995605f, 0.004181f, 0.995605f, 0.003626f, + 0.996094f, 0.002935f, 0.997070f, 0.002024f, 0.998535f, 0.000397f, 0.998535f, 0.000006f, + 0.000000f, 1.000000f, 0.666504f, 0.724121f, 0.788574f, 0.588379f, 0.843262f, 0.500977f, + 0.877930f, 0.436035f, 0.899414f, 0.385498f, 0.916504f, 0.343506f, 0.926758f, 0.309814f, + 0.935059f, 0.281006f, 0.942871f, 0.256104f, 0.948242f, 0.234741f, 0.951660f, 0.215820f, + 0.957520f, 0.197632f, 0.961426f, 0.181763f, 0.965820f, 0.167236f, 0.967285f, 0.154785f, + 0.969727f, 0.143188f, 0.972168f, 0.132690f, 0.973633f, 0.123047f, 0.975586f, 0.114258f, + 0.977051f, 0.106201f, 0.979004f, 0.098389f, 0.979980f, 0.091492f, 0.980957f, 0.085144f, + 0.981934f, 0.079346f, 0.982910f, 0.073853f, 0.983887f, 0.068665f, 0.985352f, 0.063660f, + 0.986328f, 0.058899f, 0.986328f, 0.054962f, 0.987305f, 0.050934f, 0.987305f, 0.047577f, + 0.987793f, 0.044281f, 0.988770f, 0.041046f, 0.988770f, 0.038208f, 0.989746f, 0.035400f, + 0.990234f, 0.032684f, 0.990723f, 0.030228f, 0.991211f, 0.027832f, 0.992676f, 0.025070f, + 0.992676f, 0.023010f, 0.992676f, 0.021240f, 0.993164f, 0.019363f, 0.993164f, 0.017838f, + 0.993164f, 0.016464f, 0.993652f, 0.014946f, 0.993652f, 0.013748f, 0.994141f, 0.012566f, + 0.994141f, 0.011406f, 0.994141f, 0.010460f, 0.994629f, 0.009399f, 0.994629f, 0.008545f, + 0.995117f, 0.007713f, 0.995117f, 0.006878f, 0.995605f, 0.006264f, 0.995605f, 0.005421f, + 0.996094f, 0.004692f, 0.996094f, 0.004135f, 0.996582f, 0.003399f, 0.997070f, 0.002676f, + 0.998047f, 0.001649f, 0.999023f, 0.000408f, 0.998535f, 0.000095f, 0.998535f, 0.000002f, + 0.000000f, 1.000000f, 0.678711f, 0.719727f, 0.797852f, 0.583984f, 0.852539f, 0.495850f, + 0.885254f, 0.430664f, 0.905273f, 0.381104f, 0.920898f, 0.339111f, 0.933594f, 0.304688f, + 0.940430f, 0.276123f, 0.947266f, 0.251465f, 0.951660f, 0.230225f, 0.956055f, 0.211060f, + 0.959473f, 0.194458f, 0.964355f, 0.178223f, 0.966797f, 0.164062f, 0.970703f, 0.150879f, + 0.972168f, 0.139648f, 0.974609f, 0.129395f, 0.975586f, 0.119934f, 0.978516f, 0.110535f, + 0.979492f, 0.102722f, 0.980469f, 0.095398f, 0.981934f, 0.088684f, 0.982422f, 0.082458f, + 0.984375f, 0.076416f, 0.985352f, 0.070618f, 0.985840f, 0.065613f, 0.986328f, 0.061005f, + 0.986816f, 0.056763f, 0.987793f, 0.052643f, 0.987793f, 0.049042f, 0.988281f, 0.045593f, + 0.989258f, 0.042145f, 0.989746f, 0.039093f, 0.990723f, 0.036041f, 0.991211f, 0.033112f, + 0.992188f, 0.030197f, 0.992676f, 0.027649f, 0.992676f, 0.025482f, 0.992676f, 0.023560f, + 0.993164f, 0.021576f, 0.993164f, 0.019882f, 0.993164f, 0.018372f, 0.993652f, 0.016724f, + 0.993652f, 0.015396f, 0.994141f, 0.014038f, 0.994141f, 0.012810f, 0.994141f, 0.011765f, + 0.994629f, 0.010559f, 0.994629f, 0.009636f, 0.995117f, 0.008606f, 0.995117f, 0.007786f, + 0.995605f, 0.006866f, 0.995605f, 0.006161f, 0.996094f, 0.005302f, 0.996582f, 0.004539f, + 0.997070f, 0.003866f, 0.997559f, 0.002981f, 0.998535f, 0.002029f, 0.999023f, 0.000865f, + 0.999023f, 0.000441f, 0.999023f, 0.000191f, 0.999023f, 0.000049f, 0.999023f, 0.000001f, + 0.000000f, 1.000000f, 0.690430f, 0.715332f, 0.810547f, 0.578125f, 0.862793f, 0.490479f, + 0.893066f, 0.425781f, 0.912109f, 0.375977f, 0.926758f, 0.334717f, 0.937988f, 0.300537f, + 0.944824f, 0.271973f, 0.950684f, 0.247803f, 0.955566f, 0.226196f, 0.959473f, 0.207275f, + 0.962402f, 0.190918f, 0.966797f, 0.175171f, 0.970703f, 0.160767f, 0.972656f, 0.148071f, + 0.975098f, 0.136597f, 0.977539f, 0.125854f, 0.979004f, 0.116455f, 0.980469f, 0.107910f, + 0.980957f, 0.100342f, 0.982422f, 0.092896f, 0.984863f, 0.085815f, 0.985352f, 0.079346f, + 0.986328f, 0.073547f, 0.986328f, 0.068542f, 0.987305f, 0.063538f, 0.987793f, 0.059021f, + 0.988770f, 0.054810f, 0.988770f, 0.050903f, 0.989258f, 0.047211f, 0.990723f, 0.043518f, + 0.991211f, 0.040039f, 0.992676f, 0.036438f, 0.992676f, 0.033600f, 0.992676f, 0.031097f, + 0.993164f, 0.028549f, 0.993164f, 0.026398f, 0.993652f, 0.024277f, 0.993652f, 0.022354f, + 0.993652f, 0.020660f, 0.994141f, 0.018860f, 0.994141f, 0.017365f, 0.994629f, 0.015823f, + 0.994629f, 0.014488f, 0.995117f, 0.013275f, 0.995117f, 0.011963f, 0.994629f, 0.010948f, + 0.995117f, 0.009758f, 0.995117f, 0.008873f, 0.995605f, 0.007801f, 0.996094f, 0.006859f, + 0.996094f, 0.006077f, 0.996582f, 0.005161f, 0.997070f, 0.004276f, 0.997559f, 0.003401f, + 0.999023f, 0.001995f, 0.999023f, 0.001288f, 0.999023f, 0.000843f, 0.999023f, 0.000522f, + 0.999023f, 0.000289f, 0.999023f, 0.000129f, 0.999023f, 0.000033f, 0.999023f, 0.000001f, + 0.000000f, 1.000000f, 0.701172f, 0.711426f, 0.819824f, 0.573730f, 0.870605f, 0.485840f, + 0.899902f, 0.421143f, 0.918457f, 0.371582f, 0.931641f, 0.330811f, 0.941895f, 0.296631f, + 0.949219f, 0.268311f, 0.955078f, 0.243896f, 0.959961f, 0.222290f, 0.962402f, 0.204102f, + 0.966309f, 0.187256f, 0.967773f, 0.172729f, 0.972168f, 0.158203f, 0.975586f, 0.145142f, + 0.977051f, 0.133789f, 0.978516f, 0.123657f, 0.980469f, 0.114197f, 0.982422f, 0.105774f, + 0.983887f, 0.097412f, 0.984863f, 0.089966f, 0.985840f, 0.083374f, 0.985840f, 0.077515f, + 0.986816f, 0.071838f, 0.987305f, 0.066711f, 0.988281f, 0.061737f, 0.988770f, 0.057281f, + 0.989746f, 0.052856f, 0.990723f, 0.048767f, 0.992188f, 0.044464f, 0.992188f, 0.041077f, + 0.992676f, 0.037842f, 0.992676f, 0.035034f, 0.993164f, 0.032318f, 0.993164f, 0.029831f, + 0.993164f, 0.027634f, 0.993652f, 0.025330f, 0.993652f, 0.023407f, 0.994141f, 0.021408f, + 0.994141f, 0.019714f, 0.994629f, 0.017975f, 0.994629f, 0.016479f, 0.995117f, 0.014969f, + 0.995117f, 0.013657f, 0.995605f, 0.012306f, 0.995605f, 0.011162f, 0.996094f, 0.009933f, + 0.996094f, 0.008965f, 0.996582f, 0.007835f, 0.997070f, 0.006775f, 0.997559f, 0.005753f, + 0.998047f, 0.004738f, 0.999512f, 0.003304f, 0.999512f, 0.002398f, 0.999512f, 0.001793f, + 0.999512f, 0.001323f, 0.999512f, 0.000946f, 0.999512f, 0.000644f, 0.999023f, 0.000407f, + 0.999023f, 0.000228f, 0.999023f, 0.000102f, 0.999023f, 0.000026f, 0.999023f, 0.000000f, + 0.000000f, 1.000000f, 0.710938f, 0.708008f, 0.827148f, 0.570312f, 0.877930f, 0.481689f, + 0.906738f, 0.416992f, 0.923340f, 0.367920f, 0.936035f, 0.327637f, 0.945312f, 0.293701f, + 0.953125f, 0.264893f, 0.958008f, 0.240601f, 0.962402f, 0.219482f, 0.965820f, 0.200684f, + 0.967773f, 0.184570f, 0.970215f, 0.170044f, 0.974121f, 0.155762f, 0.976074f, 0.143188f, + 0.978027f, 0.131836f, 0.979980f, 0.121582f, 0.982910f, 0.111572f, 0.983887f, 0.103027f, + 0.984375f, 0.095459f, 0.985352f, 0.088318f, 0.986328f, 0.081848f, 0.986816f, 0.075867f, + 0.987793f, 0.070190f, 0.989258f, 0.064880f, 0.989746f, 0.059814f, 0.991699f, 0.054657f, + 0.991699f, 0.050476f, 0.992188f, 0.046570f, 0.992188f, 0.043121f, 0.992676f, 0.039795f, + 0.992676f, 0.036835f, 0.993164f, 0.033936f, 0.993164f, 0.031403f, 0.993652f, 0.028870f, + 0.993652f, 0.026672f, 0.994141f, 0.024445f, 0.994141f, 0.022522f, 0.994629f, 0.020538f, + 0.994629f, 0.018875f, 0.995117f, 0.017120f, 0.995117f, 0.015671f, 0.995605f, 0.014099f, + 0.996094f, 0.012665f, 0.996094f, 0.011436f, 0.996582f, 0.010109f, 0.997070f, 0.008842f, + 0.997559f, 0.007633f, 0.998535f, 0.006374f, 0.999512f, 0.004787f, 0.999512f, 0.003801f, + 0.999512f, 0.003057f, 0.999512f, 0.002445f, 0.999512f, 0.001927f, 0.999512f, 0.001488f, + 0.999512f, 0.001117f, 0.999512f, 0.000807f, 0.999512f, 0.000552f, 0.999512f, 0.000350f, + 0.999512f, 0.000195f, 0.999512f, 0.000086f, 0.999512f, 0.000022f, 0.999023f, 0.000000f, + 0.000000f, 1.000000f, 0.723633f, 0.703125f, 0.836426f, 0.565918f, 0.885254f, 0.477539f, + 0.911621f, 0.414062f, 0.928223f, 0.364258f, 0.939453f, 0.324707f, 0.949219f, 0.290283f, + 0.956055f, 0.261719f, 0.960938f, 0.237671f, 0.964844f, 0.216431f, 0.967773f, 0.198242f, + 0.971191f, 0.181396f, 0.972656f, 0.167114f, 0.974121f, 0.154297f, 0.977539f, 0.141602f, + 0.980957f, 0.129395f, 0.982422f, 0.119141f, 0.983398f, 0.109924f, 0.984375f, 0.101562f, + 0.985352f, 0.093933f, 0.986328f, 0.086853f, 0.987793f, 0.080200f, 0.988281f, 0.074097f, + 0.990723f, 0.067688f, 0.991211f, 0.062347f, 0.991211f, 0.057709f, 0.991699f, 0.053284f, + 0.992188f, 0.049255f, 0.992188f, 0.045624f, 0.992676f, 0.042114f, 0.992676f, 0.039001f, + 0.993164f, 0.035919f, 0.993652f, 0.033112f, 0.993652f, 0.030533f, 0.994141f, 0.028030f, + 0.994141f, 0.025833f, 0.994629f, 0.023590f, 0.995117f, 0.021576f, 0.995117f, 0.019699f, + 0.995605f, 0.017838f, 0.996094f, 0.016129f, 0.996094f, 0.014595f, 0.996582f, 0.013008f, + 0.997070f, 0.011490f, 0.998047f, 0.009964f, 0.999023f, 0.008308f, 0.999512f, 0.006680f, + 0.999512f, 0.005608f, 0.999512f, 0.004719f, 0.999512f, 0.003952f, 0.999512f, 0.003284f, + 0.999512f, 0.002697f, 0.999512f, 0.002180f, 0.999512f, 0.001732f, 0.999512f, 0.001344f, + 0.999512f, 0.001011f, 0.999512f, 0.000731f, 0.999512f, 0.000501f, 0.999512f, 0.000316f, + 0.999512f, 0.000176f, 0.999512f, 0.000078f, 0.999512f, 0.000019f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.732422f, 0.700195f, 0.843750f, 0.562500f, 0.891113f, 0.474854f, + 0.915527f, 0.411133f, 0.933105f, 0.360840f, 0.943359f, 0.321533f, 0.953125f, 0.287354f, + 0.959961f, 0.259033f, 0.963867f, 0.234863f, 0.967773f, 0.213867f, 0.971191f, 0.195190f, + 0.972656f, 0.179321f, 0.974121f, 0.165161f, 0.977539f, 0.151367f, 0.978027f, 0.139893f, + 0.980469f, 0.128662f, 0.982422f, 0.118286f, 0.983887f, 0.108887f, 0.984863f, 0.100525f, + 0.986328f, 0.092590f, 0.988281f, 0.085022f, 0.989746f, 0.077881f, 0.990234f, 0.071838f, + 0.990723f, 0.066345f, 0.991211f, 0.061340f, 0.991699f, 0.056702f, 0.991699f, 0.052582f, + 0.992188f, 0.048523f, 0.992676f, 0.044769f, 0.993164f, 0.041321f, 0.993164f, 0.038177f, + 0.993652f, 0.035095f, 0.994141f, 0.032257f, 0.994141f, 0.029739f, 0.994629f, 0.027176f, + 0.995117f, 0.024796f, 0.995605f, 0.022568f, 0.996094f, 0.020493f, 0.996582f, 0.018524f, + 0.997070f, 0.016556f, 0.997559f, 0.014664f, 0.998535f, 0.012726f, 0.999512f, 0.010612f, + 0.999512f, 0.009163f, 0.999512f, 0.007950f, 0.999512f, 0.006893f, 0.999512f, 0.005947f, + 0.999512f, 0.005100f, 0.999512f, 0.004341f, 0.999512f, 0.003664f, 0.999512f, 0.003057f, + 0.999512f, 0.002520f, 0.999512f, 0.002043f, 0.999512f, 0.001624f, 0.999512f, 0.001261f, + 0.999512f, 0.000949f, 0.999512f, 0.000686f, 0.999512f, 0.000469f, 0.999512f, 0.000296f, + 0.999512f, 0.000164f, 0.999512f, 0.000072f, 0.999512f, 0.000018f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.740234f, 0.697754f, 0.851074f, 0.559082f, 0.896973f, 0.471191f, + 0.921387f, 0.407471f, 0.937988f, 0.357666f, 0.947754f, 0.318115f, 0.955078f, 0.285645f, + 0.961426f, 0.256836f, 0.967285f, 0.231934f, 0.970215f, 0.211304f, 0.972656f, 0.193237f, + 0.976074f, 0.176636f, 0.977051f, 0.162231f, 0.978027f, 0.149658f, 0.979004f, 0.138306f, + 0.979980f, 0.128052f, 0.982422f, 0.117981f, 0.984863f, 0.107910f, 0.987793f, 0.098267f, + 0.988770f, 0.090393f, 0.989258f, 0.083374f, 0.989746f, 0.077026f, 0.990234f, 0.071167f, + 0.990723f, 0.065796f, 0.991211f, 0.060822f, 0.991699f, 0.056152f, 0.992188f, 0.051849f, + 0.992676f, 0.047821f, 0.993164f, 0.044037f, 0.993652f, 0.040527f, 0.994141f, 0.037231f, + 0.994629f, 0.034149f, 0.995117f, 0.031250f, 0.995605f, 0.028503f, 0.996094f, 0.025894f, + 0.996582f, 0.023407f, 0.997559f, 0.020950f, 0.998535f, 0.018417f, 0.999512f, 0.015823f, + 0.999512f, 0.013985f, 0.999512f, 0.012398f, 0.999512f, 0.010979f, 0.999512f, 0.009697f, + 0.999512f, 0.008537f, 0.999512f, 0.007484f, 0.999512f, 0.006527f, 0.999512f, 0.005657f, + 0.999512f, 0.004868f, 0.999512f, 0.004150f, 0.999512f, 0.003510f, 0.999512f, 0.002932f, + 0.999512f, 0.002417f, 0.999512f, 0.001961f, 0.999512f, 0.001559f, 0.999512f, 0.001210f, + 0.999512f, 0.000911f, 0.999512f, 0.000658f, 0.999512f, 0.000449f, 0.999512f, 0.000283f, + 0.999512f, 0.000157f, 0.999512f, 0.000069f, 0.999512f, 0.000017f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.751465f, 0.693359f, 0.859863f, 0.555176f, 0.903320f, 0.467529f, + 0.927246f, 0.403809f, 0.939453f, 0.355957f, 0.951660f, 0.314941f, 0.957031f, 0.283203f, + 0.961914f, 0.255859f, 0.968262f, 0.230835f, 0.972656f, 0.209229f, 0.975586f, 0.190430f, + 0.977051f, 0.174683f, 0.978027f, 0.160767f, 0.979492f, 0.148071f, 0.981445f, 0.136230f, + 0.983887f, 0.124878f, 0.983887f, 0.115601f, 0.983887f, 0.107361f, 0.985840f, 0.099121f, + 0.987305f, 0.090942f, 0.988281f, 0.083740f, 0.989258f, 0.077148f, 0.990234f, 0.071106f, + 0.990723f, 0.065613f, 0.991699f, 0.060394f, 0.992188f, 0.055634f, 0.992676f, 0.051239f, + 0.993652f, 0.046967f, 0.994141f, 0.043091f, 0.995117f, 0.039368f, 0.995605f, 0.035858f, + 0.996582f, 0.032440f, 0.998047f, 0.029053f, 0.999512f, 0.025375f, 0.999512f, 0.022705f, + 0.999512f, 0.020432f, 0.999512f, 0.018387f, 0.999512f, 0.016541f, 0.999512f, 0.014847f, + 0.999512f, 0.013298f, 0.999512f, 0.011871f, 0.999512f, 0.010567f, 0.999512f, 0.009369f, + 0.999512f, 0.008263f, 0.999512f, 0.007259f, 0.999512f, 0.006340f, 0.999512f, 0.005501f, + 0.999512f, 0.004734f, 0.999512f, 0.004044f, 0.999512f, 0.003420f, 0.999512f, 0.002857f, + 0.999512f, 0.002356f, 0.999512f, 0.001912f, 0.999512f, 0.001520f, 0.999512f, 0.001180f, + 0.999512f, 0.000887f, 0.999512f, 0.000641f, 0.999512f, 0.000437f, 0.999512f, 0.000275f, + 0.999512f, 0.000152f, 0.999512f, 0.000067f, 0.999512f, 0.000016f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.756836f, 0.691406f, 0.863770f, 0.553711f, 0.907715f, 0.465332f, + 0.929688f, 0.402100f, 0.943848f, 0.353027f, 0.952637f, 0.313721f, 0.960449f, 0.281006f, + 0.968262f, 0.250977f, 0.968262f, 0.229614f, 0.968262f, 0.211304f, 0.976074f, 0.190552f, + 0.983887f, 0.170166f, 0.983887f, 0.156006f, 0.983887f, 0.143921f, 0.983887f, 0.133179f, + 0.983887f, 0.123535f, 0.983887f, 0.114746f, 0.983887f, 0.106750f, 0.983887f, 0.099426f, + 0.983887f, 0.092773f, 0.983887f, 0.086609f, 0.983887f, 0.080994f, 0.983887f, 0.075806f, + 0.987793f, 0.069763f, 0.993652f, 0.060974f, 0.999512f, 0.051910f, 0.999512f, 0.046509f, + 0.999512f, 0.042175f, 0.999512f, 0.038361f, 0.999512f, 0.034943f, 0.999512f, 0.031860f, + 0.999512f, 0.029022f, 0.999512f, 0.026413f, 0.999512f, 0.024017f, 0.999512f, 0.021790f, + 0.999512f, 0.019745f, 0.999512f, 0.017853f, 0.999512f, 0.016113f, 0.999512f, 0.014496f, + 0.999512f, 0.013008f, 0.999512f, 0.011635f, 0.999512f, 0.010361f, 0.999512f, 0.009193f, + 0.999512f, 0.008125f, 0.999512f, 0.007137f, 0.999512f, 0.006237f, 0.999512f, 0.005413f, + 0.999512f, 0.004662f, 0.999512f, 0.003983f, 0.999512f, 0.003368f, 0.999512f, 0.002815f, + 0.999512f, 0.002321f, 0.999512f, 0.001884f, 0.999512f, 0.001498f, 0.999512f, 0.001163f, + 0.999512f, 0.000875f, 0.999512f, 0.000631f, 0.999512f, 0.000431f, 0.999512f, 0.000271f, + 0.999512f, 0.000150f, 0.999512f, 0.000066f, 0.999512f, 0.000016f, 0.999512f, 0.000000f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, + 0.000000f, 0.994629f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, + 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.990723f, + 0.000000f, 0.990234f, 0.000000f, 0.989258f, 0.000000f, 0.987793f, 0.000000f, 0.987305f, + 0.000000f, 0.986328f, 0.000000f, 0.984863f, 0.000000f, 0.981934f, 0.000000f, 0.980957f, + 0.000000f, 0.978516f, 0.000000f, 0.975098f, 0.000000f, 0.971680f, 0.000000f, 0.967285f, + 0.000000f, 0.961426f, 0.000000f, 0.954590f, 0.000000f, 0.944824f, 0.000000f, 0.931641f, + 0.000000f, 0.908203f, 0.000000f, 0.867188f, 0.000000f, 0.773438f, 0.000000f, 0.395264f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996094f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.995117f, + 0.000000f, 0.994629f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, + 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.991211f, + 0.000000f, 0.990234f, 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.986816f, + 0.000000f, 0.985840f, 0.000000f, 0.984375f, 0.000000f, 0.982422f, 0.000000f, 0.980469f, + 0.000000f, 0.978027f, 0.000000f, 0.975098f, 0.000000f, 0.971680f, 0.000000f, 0.967285f, + 0.000000f, 0.961914f, 0.000000f, 0.954590f, 0.000000f, 0.944824f, 0.000000f, 0.930176f, + 0.000000f, 0.908203f, 0.000000f, 0.867188f, 0.000000f, 0.772461f, 0.000000f, 0.395264f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.995117f, + 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, + 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.991211f, + 0.000000f, 0.990234f, 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.986816f, + 0.000000f, 0.985352f, 0.000000f, 0.983887f, 0.000000f, 0.982910f, 0.000000f, 0.979980f, + 0.000000f, 0.978027f, 0.000000f, 0.975098f, 0.000000f, 0.971191f, 0.000000f, 0.966797f, + 0.000000f, 0.961426f, 0.000000f, 0.954102f, 0.000000f, 0.944336f, 0.000000f, 0.929688f, + 0.000000f, 0.907227f, 0.000000f, 0.866699f, 0.000007f, 0.771973f, 0.000007f, 0.395020f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.994629f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993164f, + 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.991211f, 0.000000f, 0.990723f, + 0.000000f, 0.990234f, 0.000000f, 0.989258f, 0.000000f, 0.987793f, 0.000000f, 0.986328f, + 0.000000f, 0.984863f, 0.000000f, 0.983887f, 0.000000f, 0.982422f, 0.000000f, 0.979980f, + 0.000000f, 0.977051f, 0.000000f, 0.974609f, 0.000000f, 0.971191f, 0.000000f, 0.966309f, + 0.000000f, 0.960938f, 0.000000f, 0.953613f, 0.000000f, 0.943848f, 0.000000f, 0.929199f, + 0.000027f, 0.906250f, 0.000030f, 0.865723f, 0.000028f, 0.770508f, 0.000042f, 0.395264f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.995117f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, + 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.991211f, 0.000000f, 0.990723f, + 0.000000f, 0.989746f, 0.000000f, 0.989258f, 0.000000f, 0.987793f, 0.000000f, 0.986328f, + 0.000000f, 0.984863f, 0.000000f, 0.983398f, 0.000000f, 0.981445f, 0.000000f, 0.980469f, + 0.000000f, 0.976562f, 0.000000f, 0.973633f, 0.000000f, 0.970703f, 0.000000f, 0.965820f, + 0.000000f, 0.960449f, 0.000011f, 0.952637f, 0.000085f, 0.942871f, 0.000094f, 0.928223f, + 0.000083f, 0.904785f, 0.000068f, 0.864746f, 0.000085f, 0.769043f, 0.000143f, 0.394531f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, + 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, + 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.991211f, 0.000000f, 0.990234f, + 0.000000f, 0.989258f, 0.000000f, 0.988770f, 0.000000f, 0.987305f, 0.000000f, 0.985840f, + 0.000000f, 0.984863f, 0.000000f, 0.982422f, 0.000000f, 0.980957f, 0.000000f, 0.979004f, + 0.000000f, 0.976562f, 0.000000f, 0.973633f, 0.000036f, 0.969727f, 0.000143f, 0.964844f, + 0.000211f, 0.959473f, 0.000218f, 0.951660f, 0.000199f, 0.940918f, 0.000170f, 0.926758f, + 0.000165f, 0.903320f, 0.000172f, 0.862305f, 0.000219f, 0.767090f, 0.000369f, 0.394043f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.994141f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992188f, + 0.000000f, 0.991699f, 0.000000f, 0.991211f, 0.000000f, 0.990723f, 0.000000f, 0.989746f, + 0.000000f, 0.988770f, 0.000000f, 0.987793f, 0.000000f, 0.987305f, 0.000000f, 0.985840f, + 0.000000f, 0.983887f, 0.000000f, 0.982422f, 0.000035f, 0.980469f, 0.000132f, 0.978027f, + 0.000258f, 0.976074f, 0.000380f, 0.972168f, 0.000413f, 0.968750f, 0.000406f, 0.964355f, + 0.000374f, 0.958008f, 0.000326f, 0.951172f, 0.000273f, 0.939453f, 0.000341f, 0.924805f, + 0.000342f, 0.901855f, 0.000384f, 0.859863f, 0.000487f, 0.764160f, 0.000772f, 0.392578f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992188f, + 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.989746f, 0.000000f, 0.988770f, + 0.000000f, 0.988281f, 0.000006f, 0.987305f, 0.000080f, 0.986328f, 0.000190f, 0.984863f, + 0.000316f, 0.983887f, 0.000461f, 0.981934f, 0.000606f, 0.979004f, 0.000681f, 0.977051f, + 0.000690f, 0.974609f, 0.000648f, 0.971680f, 0.000608f, 0.967285f, 0.000543f, 0.962891f, + 0.000481f, 0.956055f, 0.000492f, 0.949219f, 0.000596f, 0.937988f, 0.000579f, 0.922363f, + 0.000662f, 0.898438f, 0.000751f, 0.856445f, 0.000961f, 0.760254f, 0.001400f, 0.392578f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, + 0.000000f, 0.994141f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992188f, + 0.000005f, 0.991211f, 0.000077f, 0.990234f, 0.000188f, 0.989258f, 0.000316f, 0.988281f, + 0.000443f, 0.987793f, 0.000595f, 0.986328f, 0.000732f, 0.984863f, 0.000886f, 0.984375f, + 0.001008f, 0.982910f, 0.001045f, 0.980957f, 0.001004f, 0.978516f, 0.000961f, 0.976074f, + 0.000883f, 0.973633f, 0.000809f, 0.970215f, 0.000729f, 0.965820f, 0.000723f, 0.960938f, + 0.000833f, 0.955078f, 0.000936f, 0.946777f, 0.000917f, 0.935059f, 0.001021f, 0.920410f, + 0.001133f, 0.895508f, 0.001343f, 0.853027f, 0.001729f, 0.756348f, 0.002285f, 0.390869f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, + 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000017f, 0.994141f, + 0.000104f, 0.994141f, 0.000227f, 0.993652f, 0.000355f, 0.992676f, 0.000498f, 0.991211f, + 0.000638f, 0.990234f, 0.000788f, 0.989746f, 0.000919f, 0.988770f, 0.001076f, 0.988281f, + 0.001208f, 0.986816f, 0.001350f, 0.985352f, 0.001450f, 0.984375f, 0.001418f, 0.983398f, + 0.001376f, 0.981934f, 0.001293f, 0.979980f, 0.001182f, 0.977539f, 0.001104f, 0.974609f, + 0.001014f, 0.972168f, 0.001039f, 0.968750f, 0.001159f, 0.964844f, 0.001252f, 0.958984f, + 0.001333f, 0.953125f, 0.001381f, 0.943848f, 0.001481f, 0.932617f, 0.001649f, 0.916992f, + 0.001859f, 0.891602f, 0.002237f, 0.848633f, 0.002926f, 0.751953f, 0.003462f, 0.389648f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000040f, 0.995605f, 0.000153f, 0.995117f, + 0.000294f, 0.994629f, 0.000424f, 0.994141f, 0.000585f, 0.994141f, 0.000718f, 0.994141f, + 0.000878f, 0.993652f, 0.001019f, 0.993164f, 0.001146f, 0.991699f, 0.001303f, 0.990723f, + 0.001431f, 0.989746f, 0.001550f, 0.989258f, 0.001698f, 0.988281f, 0.001820f, 0.986816f, + 0.001854f, 0.985840f, 0.001832f, 0.984863f, 0.001750f, 0.983398f, 0.001624f, 0.981934f, + 0.001518f, 0.980469f, 0.001418f, 0.978516f, 0.001394f, 0.976562f, 0.001472f, 0.973633f, + 0.001552f, 0.970703f, 0.001670f, 0.966797f, 0.001740f, 0.962402f, 0.001901f, 0.957031f, + 0.001957f, 0.950684f, 0.002113f, 0.941406f, 0.002382f, 0.930176f, 0.002567f, 0.913086f, + 0.002966f, 0.887695f, 0.003582f, 0.843750f, 0.004570f, 0.747559f, 0.004940f, 0.388672f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000081f, 0.996582f, 0.000211f, 0.996094f, 0.000374f, 0.995605f, + 0.000513f, 0.995605f, 0.000685f, 0.995117f, 0.000832f, 0.995117f, 0.000972f, 0.994629f, + 0.001134f, 0.994141f, 0.001264f, 0.994141f, 0.001389f, 0.994141f, 0.001542f, 0.993164f, + 0.001665f, 0.992676f, 0.001765f, 0.992188f, 0.001908f, 0.991211f, 0.002033f, 0.990723f, + 0.002134f, 0.989746f, 0.002230f, 0.988770f, 0.002295f, 0.986816f, 0.002226f, 0.985840f, + 0.002102f, 0.985352f, 0.001965f, 0.983398f, 0.001889f, 0.982422f, 0.001858f, 0.980469f, + 0.001908f, 0.979004f, 0.002033f, 0.977051f, 0.002071f, 0.975098f, 0.002214f, 0.972168f, + 0.002205f, 0.968262f, 0.002514f, 0.964355f, 0.002605f, 0.960449f, 0.002708f, 0.954590f, + 0.003017f, 0.947754f, 0.003201f, 0.937988f, 0.003536f, 0.926758f, 0.003925f, 0.908691f, + 0.004589f, 0.883301f, 0.005409f, 0.838379f, 0.006878f, 0.741699f, 0.006737f, 0.386963f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000099f, 0.997070f, 0.000259f, 0.997070f, 0.000438f, 0.997070f, 0.000601f, 0.997070f, + 0.000766f, 0.996582f, 0.000938f, 0.995605f, 0.001068f, 0.995605f, 0.001227f, 0.995117f, + 0.001379f, 0.995117f, 0.001497f, 0.995117f, 0.001614f, 0.994141f, 0.001767f, 0.994141f, + 0.001886f, 0.994141f, 0.001980f, 0.993164f, 0.002094f, 0.992676f, 0.002230f, 0.992188f, + 0.002335f, 0.991699f, 0.002417f, 0.991211f, 0.002512f, 0.990723f, 0.002642f, 0.990234f, + 0.002687f, 0.988770f, 0.002605f, 0.987305f, 0.002457f, 0.986328f, 0.002497f, 0.985352f, + 0.002485f, 0.983398f, 0.002590f, 0.982422f, 0.002542f, 0.980957f, 0.002718f, 0.979004f, + 0.002718f, 0.977051f, 0.002857f, 0.975098f, 0.002832f, 0.973145f, 0.003160f, 0.970215f, + 0.003370f, 0.965820f, 0.003563f, 0.962402f, 0.003788f, 0.958008f, 0.003960f, 0.951660f, + 0.004429f, 0.944336f, 0.004601f, 0.935059f, 0.005222f, 0.922363f, 0.005749f, 0.904785f, + 0.006695f, 0.877930f, 0.007942f, 0.832031f, 0.009933f, 0.735352f, 0.008850f, 0.385742f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000068f, 0.997559f, + 0.000257f, 0.997559f, 0.000426f, 0.997559f, 0.000647f, 0.997559f, 0.000798f, 0.997070f, + 0.000993f, 0.997070f, 0.001156f, 0.996582f, 0.001273f, 0.996582f, 0.001439f, 0.996094f, + 0.001589f, 0.995605f, 0.001698f, 0.995117f, 0.001786f, 0.995117f, 0.001953f, 0.995117f, + 0.002075f, 0.994629f, 0.002165f, 0.994141f, 0.002235f, 0.994141f, 0.002382f, 0.993164f, + 0.002499f, 0.992676f, 0.002586f, 0.992676f, 0.002653f, 0.992188f, 0.002747f, 0.991211f, + 0.002876f, 0.990723f, 0.002972f, 0.990234f, 0.003042f, 0.989746f, 0.003130f, 0.988770f, + 0.003382f, 0.987793f, 0.003345f, 0.986816f, 0.003380f, 0.985352f, 0.003344f, 0.983887f, + 0.003481f, 0.982422f, 0.003477f, 0.980957f, 0.003448f, 0.979004f, 0.003578f, 0.977051f, + 0.003624f, 0.975098f, 0.003941f, 0.973145f, 0.004395f, 0.971191f, 0.004524f, 0.967773f, + 0.004875f, 0.963867f, 0.004910f, 0.959473f, 0.005322f, 0.954590f, 0.005699f, 0.948242f, + 0.006184f, 0.940430f, 0.006596f, 0.930664f, 0.007393f, 0.916992f, 0.008186f, 0.898926f, + 0.009514f, 0.871582f, 0.011200f, 0.825195f, 0.013855f, 0.728516f, 0.011299f, 0.384277f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000107f, 0.998047f, + 0.000353f, 0.998047f, 0.000538f, 0.998047f, 0.000793f, 0.997559f, 0.000947f, 0.997559f, + 0.001143f, 0.997559f, 0.001317f, 0.997559f, 0.001431f, 0.997070f, 0.001572f, 0.996582f, + 0.001741f, 0.996582f, 0.001854f, 0.996094f, 0.001932f, 0.995605f, 0.002066f, 0.995117f, + 0.002211f, 0.995117f, 0.002310f, 0.995117f, 0.002380f, 0.994629f, 0.002445f, 0.994629f, + 0.002605f, 0.994141f, 0.002712f, 0.993164f, 0.002789f, 0.992676f, 0.002844f, 0.992676f, + 0.002920f, 0.992188f, 0.003061f, 0.991699f, 0.003157f, 0.990723f, 0.003262f, 0.990234f, + 0.003454f, 0.989746f, 0.003700f, 0.988770f, 0.004036f, 0.988281f, 0.004314f, 0.987793f, + 0.004581f, 0.986328f, 0.004810f, 0.985840f, 0.004524f, 0.983887f, 0.004539f, 0.982422f, + 0.004456f, 0.980957f, 0.004501f, 0.979004f, 0.004814f, 0.977051f, 0.004860f, 0.975098f, + 0.005329f, 0.973145f, 0.005432f, 0.970703f, 0.005981f, 0.967773f, 0.006279f, 0.964844f, + 0.006725f, 0.961426f, 0.006977f, 0.956543f, 0.007427f, 0.950684f, 0.007912f, 0.944336f, + 0.008675f, 0.936035f, 0.009331f, 0.925781f, 0.010490f, 0.912109f, 0.011497f, 0.892578f, + 0.013527f, 0.864746f, 0.015991f, 0.818848f, 0.019104f, 0.721191f, 0.014259f, 0.382324f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000003f, 0.998535f, + 0.000276f, 0.998535f, 0.000565f, 0.998047f, 0.000811f, 0.998047f, 0.001026f, 0.998047f, + 0.001139f, 0.998047f, 0.001387f, 0.997559f, 0.001530f, 0.997559f, 0.001613f, 0.997559f, + 0.001790f, 0.997070f, 0.001945f, 0.996582f, 0.002035f, 0.996582f, 0.002094f, 0.996094f, + 0.002249f, 0.996094f, 0.002392f, 0.995605f, 0.002478f, 0.995117f, 0.002535f, 0.995117f, + 0.002573f, 0.994629f, 0.002760f, 0.994629f, 0.002871f, 0.994141f, 0.002941f, 0.993164f, + 0.002987f, 0.992676f, 0.003021f, 0.992676f, 0.003185f, 0.992188f, 0.003370f, 0.991699f, + 0.003599f, 0.991211f, 0.003851f, 0.990234f, 0.004078f, 0.989746f, 0.004379f, 0.989258f, + 0.004696f, 0.988281f, 0.004971f, 0.987793f, 0.005173f, 0.986816f, 0.005405f, 0.985840f, + 0.005592f, 0.984863f, 0.005917f, 0.983887f, 0.006077f, 0.982422f, 0.006153f, 0.980957f, + 0.006176f, 0.979004f, 0.006241f, 0.977051f, 0.006302f, 0.974609f, 0.006836f, 0.972656f, + 0.007092f, 0.970703f, 0.007355f, 0.967773f, 0.007927f, 0.964844f, 0.008453f, 0.961426f, + 0.009369f, 0.958008f, 0.009750f, 0.952637f, 0.010284f, 0.946777f, 0.011345f, 0.939941f, + 0.012329f, 0.931641f, 0.013527f, 0.920410f, 0.014748f, 0.906250f, 0.016464f, 0.886230f, + 0.018951f, 0.857422f, 0.021957f, 0.810059f, 0.025940f, 0.713379f, 0.017838f, 0.380371f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000270f, 0.998535f, 0.000660f, 0.998535f, 0.000873f, 0.998535f, + 0.001148f, 0.998047f, 0.001250f, 0.998047f, 0.001494f, 0.998047f, 0.001652f, 0.998047f, + 0.001724f, 0.997559f, 0.001864f, 0.997559f, 0.002062f, 0.997559f, 0.002151f, 0.996582f, + 0.002199f, 0.996582f, 0.002304f, 0.996094f, 0.002497f, 0.996094f, 0.002590f, 0.995605f, + 0.002642f, 0.995117f, 0.002674f, 0.995117f, 0.002823f, 0.994629f, 0.002970f, 0.994629f, + 0.003046f, 0.994141f, 0.003092f, 0.993652f, 0.003122f, 0.992676f, 0.003353f, 0.992676f, + 0.003710f, 0.992188f, 0.004009f, 0.991699f, 0.004265f, 0.991211f, 0.004498f, 0.990234f, + 0.004688f, 0.989746f, 0.005035f, 0.989258f, 0.005318f, 0.988281f, 0.005550f, 0.987793f, + 0.005772f, 0.986816f, 0.005943f, 0.985840f, 0.006241f, 0.984863f, 0.006775f, 0.984375f, + 0.007229f, 0.982910f, 0.007591f, 0.981934f, 0.008018f, 0.980957f, 0.008026f, 0.979004f, + 0.007790f, 0.976562f, 0.008087f, 0.974121f, 0.008736f, 0.972656f, 0.008942f, 0.970215f, + 0.009209f, 0.967285f, 0.010017f, 0.964844f, 0.010544f, 0.960938f, 0.011604f, 0.957520f, + 0.012337f, 0.953613f, 0.013107f, 0.948242f, 0.013680f, 0.941895f, 0.015160f, 0.934570f, + 0.016724f, 0.925781f, 0.018051f, 0.914062f, 0.019882f, 0.898926f, 0.022644f, 0.878418f, + 0.025635f, 0.848633f, 0.029648f, 0.800781f, 0.034180f, 0.704590f, 0.022018f, 0.378418f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000373f, 0.999023f, + 0.000812f, 0.999023f, 0.001059f, 0.998535f, 0.001294f, 0.998535f, 0.001351f, 0.998535f, + 0.001667f, 0.998047f, 0.001781f, 0.998047f, 0.001822f, 0.998047f, 0.002035f, 0.997559f, + 0.002205f, 0.997559f, 0.002264f, 0.997070f, 0.002293f, 0.996582f, 0.002464f, 0.996094f, + 0.002642f, 0.996094f, 0.002708f, 0.995605f, 0.002741f, 0.995605f, 0.002760f, 0.995117f, + 0.002972f, 0.994629f, 0.003103f, 0.994629f, 0.003208f, 0.994141f, 0.003435f, 0.993164f, + 0.003674f, 0.992676f, 0.004002f, 0.992188f, 0.004398f, 0.992188f, 0.004677f, 0.991699f, + 0.004868f, 0.991211f, 0.005108f, 0.990234f, 0.005276f, 0.989746f, 0.005554f, 0.988770f, + 0.005890f, 0.988281f, 0.006107f, 0.987793f, 0.006401f, 0.986816f, 0.006790f, 0.986328f, + 0.007160f, 0.985352f, 0.007626f, 0.984375f, 0.008057f, 0.982910f, 0.008499f, 0.981934f, + 0.008881f, 0.980957f, 0.009407f, 0.979492f, 0.009865f, 0.978516f, 0.010544f, 0.976074f, + 0.010498f, 0.974121f, 0.010765f, 0.972168f, 0.011108f, 0.969238f, 0.011467f, 0.966797f, + 0.012344f, 0.963867f, 0.013023f, 0.960938f, 0.013771f, 0.957031f, 0.015007f, 0.953125f, + 0.016052f, 0.948242f, 0.017639f, 0.943359f, 0.018082f, 0.936523f, 0.019928f, 0.928223f, + 0.021805f, 0.918457f, 0.023819f, 0.906738f, 0.026581f, 0.891113f, 0.029816f, 0.870117f, + 0.033569f, 0.839355f, 0.038696f, 0.790527f, 0.044037f, 0.695312f, 0.026749f, 0.376465f, + 0.000000f, 1.000000f, 0.000245f, 0.999512f, 0.000803f, 0.999023f, 0.000926f, 0.999023f, + 0.001336f, 0.999023f, 0.001398f, 0.998535f, 0.001638f, 0.998535f, 0.001838f, 0.998535f, + 0.001872f, 0.998047f, 0.001908f, 0.998047f, 0.002268f, 0.997559f, 0.002325f, 0.997070f, + 0.002344f, 0.996582f, 0.002382f, 0.996094f, 0.002712f, 0.996094f, 0.002777f, 0.995605f, + 0.002802f, 0.995605f, 0.002815f, 0.995117f, 0.003098f, 0.994629f, 0.003525f, 0.994141f, + 0.003832f, 0.994141f, 0.004070f, 0.993164f, 0.004311f, 0.993164f, 0.004520f, 0.992188f, + 0.004959f, 0.992188f, 0.005264f, 0.991211f, 0.005451f, 0.990723f, 0.005577f, 0.990234f, + 0.005775f, 0.989746f, 0.006027f, 0.988770f, 0.006561f, 0.988281f, 0.006958f, 0.987305f, + 0.007374f, 0.986328f, 0.007751f, 0.985840f, 0.008026f, 0.985352f, 0.008339f, 0.983887f, + 0.008965f, 0.982910f, 0.009529f, 0.981934f, 0.010063f, 0.980469f, 0.010513f, 0.979492f, + 0.011055f, 0.978027f, 0.011642f, 0.976562f, 0.012451f, 0.974609f, 0.013245f, 0.973633f, + 0.013947f, 0.971191f, 0.014046f, 0.968750f, 0.014503f, 0.965820f, 0.015038f, 0.962891f, + 0.015869f, 0.959473f, 0.016739f, 0.956055f, 0.018143f, 0.952148f, 0.019302f, 0.947754f, + 0.020859f, 0.942871f, 0.022507f, 0.937500f, 0.024368f, 0.930176f, 0.025970f, 0.920898f, + 0.028061f, 0.911133f, 0.031021f, 0.898438f, 0.034332f, 0.881836f, 0.038513f, 0.859375f, + 0.043457f, 0.828613f, 0.049591f, 0.779785f, 0.055145f, 0.685547f, 0.031860f, 0.373779f, + 0.000000f, 1.000000f, 0.000577f, 0.999512f, 0.000956f, 0.999023f, 0.001399f, 0.999023f, + 0.001432f, 0.999023f, 0.001722f, 0.998535f, 0.001894f, 0.998535f, 0.001909f, 0.998535f, + 0.002020f, 0.997559f, 0.002350f, 0.997070f, 0.002375f, 0.996582f, 0.002384f, 0.996582f, + 0.002625f, 0.996094f, 0.002811f, 0.995605f, 0.002958f, 0.995605f, 0.003267f, 0.995117f, + 0.003553f, 0.994629f, 0.004128f, 0.994141f, 0.004436f, 0.993652f, 0.004669f, 0.993164f, + 0.004810f, 0.992676f, 0.005035f, 0.992676f, 0.005444f, 0.991699f, 0.005692f, 0.990723f, + 0.005886f, 0.990234f, 0.006180f, 0.990234f, 0.006512f, 0.989258f, 0.006855f, 0.989258f, + 0.007500f, 0.987793f, 0.007988f, 0.986816f, 0.008286f, 0.986328f, 0.008606f, 0.985352f, + 0.008919f, 0.984863f, 0.009438f, 0.983398f, 0.010124f, 0.982422f, 0.010773f, 0.981445f, + 0.011215f, 0.980469f, 0.011795f, 0.979492f, 0.012459f, 0.978027f, 0.013077f, 0.976074f, + 0.013763f, 0.974609f, 0.014641f, 0.973145f, 0.015617f, 0.971191f, 0.016464f, 0.969238f, + 0.017410f, 0.967285f, 0.018036f, 0.964844f, 0.018204f, 0.961426f, 0.019211f, 0.958496f, + 0.020309f, 0.954590f, 0.021881f, 0.950684f, 0.022934f, 0.946289f, 0.024429f, 0.941406f, + 0.026596f, 0.936035f, 0.028809f, 0.929688f, 0.031281f, 0.922363f, 0.033020f, 0.912598f, + 0.036499f, 0.902344f, 0.039734f, 0.889160f, 0.043915f, 0.871094f, 0.048889f, 0.848633f, + 0.055298f, 0.816895f, 0.061951f, 0.767578f, 0.068115f, 0.675293f, 0.037598f, 0.372070f, + 0.000000f, 1.000000f, 0.000963f, 0.999512f, 0.000969f, 0.999023f, 0.001447f, 0.999023f, + 0.001451f, 0.999023f, 0.001914f, 0.998535f, 0.001927f, 0.998047f, 0.001930f, 0.997559f, + 0.002380f, 0.997070f, 0.002399f, 0.996582f, 0.002466f, 0.996582f, 0.002817f, 0.996094f, + 0.003546f, 0.995605f, 0.003870f, 0.995117f, 0.004055f, 0.994629f, 0.004333f, 0.994141f, + 0.004875f, 0.993652f, 0.005100f, 0.993164f, 0.005310f, 0.992676f, 0.005421f, 0.992188f, + 0.005520f, 0.991699f, 0.006332f, 0.990723f, 0.006786f, 0.990234f, 0.007133f, 0.989746f, + 0.007454f, 0.989258f, 0.007881f, 0.988281f, 0.008163f, 0.987305f, 0.008827f, 0.986328f, + 0.009216f, 0.985840f, 0.009750f, 0.984863f, 0.010353f, 0.983887f, 0.010826f, 0.982910f, + 0.011192f, 0.981934f, 0.011971f, 0.980469f, 0.012756f, 0.979492f, 0.013428f, 0.978516f, + 0.014076f, 0.977051f, 0.014725f, 0.975586f, 0.015457f, 0.974121f, 0.016266f, 0.972656f, + 0.017441f, 0.970703f, 0.018463f, 0.968750f, 0.019501f, 0.966797f, 0.020523f, 0.964844f, + 0.021591f, 0.961914f, 0.022903f, 0.959473f, 0.023834f, 0.956055f, 0.024933f, 0.952148f, + 0.026093f, 0.948242f, 0.027512f, 0.943848f, 0.029205f, 0.939453f, 0.031494f, 0.934082f, + 0.033783f, 0.928223f, 0.036377f, 0.921387f, 0.039734f, 0.913574f, 0.042084f, 0.903320f, + 0.045929f, 0.891602f, 0.050568f, 0.877930f, 0.055298f, 0.859863f, 0.061310f, 0.835938f, + 0.068359f, 0.803223f, 0.076477f, 0.754395f, 0.081848f, 0.663574f, 0.043427f, 0.369141f, + 0.000000f, 1.000000f, 0.000971f, 0.999512f, 0.000973f, 0.999023f, 0.001456f, 0.999023f, + 0.001457f, 0.998535f, 0.001935f, 0.997559f, 0.001939f, 0.997559f, 0.002092f, 0.997070f, + 0.003004f, 0.996582f, 0.003340f, 0.996582f, 0.003593f, 0.996094f, 0.004284f, 0.995117f, + 0.004524f, 0.994629f, 0.004623f, 0.994141f, 0.004879f, 0.993652f, 0.005444f, 0.993164f, + 0.005650f, 0.992676f, 0.006119f, 0.991699f, 0.006615f, 0.991211f, 0.006943f, 0.990723f, + 0.007660f, 0.989746f, 0.008049f, 0.989258f, 0.008415f, 0.988281f, 0.008781f, 0.987793f, + 0.009216f, 0.986816f, 0.009674f, 0.985840f, 0.010689f, 0.984863f, 0.011253f, 0.983887f, + 0.011597f, 0.983398f, 0.012230f, 0.981934f, 0.012833f, 0.980957f, 0.013466f, 0.979980f, + 0.014526f, 0.979004f, 0.015244f, 0.977051f, 0.016022f, 0.976074f, 0.016800f, 0.974609f, + 0.017502f, 0.973145f, 0.018478f, 0.971191f, 0.019547f, 0.969727f, 0.020920f, 0.967285f, + 0.022003f, 0.965820f, 0.022995f, 0.963379f, 0.024261f, 0.960938f, 0.025864f, 0.958496f, + 0.027252f, 0.956055f, 0.028931f, 0.953125f, 0.030823f, 0.949707f, 0.031403f, 0.945312f, + 0.032990f, 0.940918f, 0.034912f, 0.936035f, 0.037384f, 0.930664f, 0.039673f, 0.925293f, + 0.042664f, 0.917969f, 0.046173f, 0.911133f, 0.049896f, 0.902344f, 0.053223f, 0.892090f, + 0.057831f, 0.879883f, 0.063171f, 0.864746f, 0.069031f, 0.846191f, 0.076172f, 0.821777f, + 0.083740f, 0.788574f, 0.092651f, 0.740234f, 0.097351f, 0.652832f, 0.050079f, 0.366699f, + 0.000000f, 1.000000f, 0.000488f, 0.999512f, 0.000975f, 0.999023f, 0.001460f, 0.998535f, + 0.001460f, 0.998047f, 0.002518f, 0.997559f, 0.002815f, 0.997070f, 0.003202f, 0.997070f, + 0.003866f, 0.996094f, 0.004158f, 0.995605f, 0.004234f, 0.994629f, 0.004986f, 0.994141f, + 0.005264f, 0.993652f, 0.005692f, 0.993164f, 0.006222f, 0.992188f, 0.007107f, 0.991699f, + 0.007488f, 0.991211f, 0.007702f, 0.990234f, 0.008072f, 0.989258f, 0.008713f, 0.988770f, + 0.009651f, 0.987793f, 0.010132f, 0.986816f, 0.010620f, 0.985840f, 0.011185f, 0.984863f, + 0.011688f, 0.984375f, 0.012856f, 0.983398f, 0.013496f, 0.981934f, 0.014046f, 0.980469f, + 0.014732f, 0.979492f, 0.015579f, 0.979004f, 0.016418f, 0.977051f, 0.017563f, 0.975586f, + 0.018387f, 0.974609f, 0.019180f, 0.972656f, 0.020233f, 0.971191f, 0.021393f, 0.969727f, + 0.022507f, 0.967773f, 0.023453f, 0.966309f, 0.024918f, 0.963867f, 0.026398f, 0.961914f, + 0.027878f, 0.958984f, 0.029266f, 0.957031f, 0.030899f, 0.954102f, 0.032440f, 0.951172f, + 0.034302f, 0.948730f, 0.036621f, 0.944824f, 0.038757f, 0.941406f, 0.040710f, 0.937012f, + 0.042358f, 0.931641f, 0.044586f, 0.926270f, 0.047211f, 0.920410f, 0.050385f, 0.914062f, + 0.053802f, 0.906738f, 0.058014f, 0.898926f, 0.062286f, 0.889160f, 0.067322f, 0.878906f, + 0.071838f, 0.865234f, 0.078125f, 0.849609f, 0.085205f, 0.830566f, 0.093201f, 0.806152f, + 0.101746f, 0.773438f, 0.111084f, 0.725098f, 0.114075f, 0.639648f, 0.056793f, 0.364014f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000976f, 0.998535f, 0.002205f, 0.998535f, + 0.002550f, 0.998047f, 0.003315f, 0.997070f, 0.003639f, 0.996582f, 0.003796f, 0.996094f, + 0.004322f, 0.995117f, 0.005199f, 0.994629f, 0.005642f, 0.994141f, 0.006428f, 0.993164f, + 0.007088f, 0.992188f, 0.007362f, 0.991699f, 0.008125f, 0.991211f, 0.008850f, 0.989746f, + 0.009590f, 0.988770f, 0.010017f, 0.988281f, 0.010590f, 0.987305f, 0.011436f, 0.985840f, + 0.012314f, 0.984863f, 0.013145f, 0.983887f, 0.013710f, 0.983398f, 0.014374f, 0.981934f, + 0.015480f, 0.980469f, 0.016418f, 0.979492f, 0.017349f, 0.978027f, 0.018265f, 0.976562f, + 0.019119f, 0.975098f, 0.019897f, 0.974121f, 0.021240f, 0.972168f, 0.022629f, 0.970703f, + 0.023834f, 0.968750f, 0.024841f, 0.967285f, 0.025955f, 0.965332f, 0.027298f, 0.963379f, + 0.028702f, 0.961426f, 0.030472f, 0.958984f, 0.032257f, 0.956543f, 0.033752f, 0.954102f, + 0.035583f, 0.951172f, 0.037323f, 0.948730f, 0.039307f, 0.945312f, 0.041382f, 0.942383f, + 0.044037f, 0.938477f, 0.046600f, 0.934570f, 0.049225f, 0.930176f, 0.051971f, 0.925781f, + 0.054230f, 0.920410f, 0.056580f, 0.914551f, 0.060120f, 0.907715f, 0.064270f, 0.900879f, + 0.068237f, 0.892578f, 0.072754f, 0.883789f, 0.077759f, 0.874512f, 0.083923f, 0.863281f, + 0.089172f, 0.848633f, 0.096558f, 0.832520f, 0.104370f, 0.812988f, 0.113342f, 0.788574f, + 0.122498f, 0.756348f, 0.130859f, 0.708984f, 0.131836f, 0.626953f, 0.063965f, 0.361572f, + 0.000000f, 1.000000f, 0.000395f, 0.999512f, 0.001424f, 0.999023f, 0.002377f, 0.998535f, + 0.002939f, 0.997070f, 0.003412f, 0.996582f, 0.004543f, 0.995605f, 0.005405f, 0.995117f, + 0.006119f, 0.994141f, 0.006512f, 0.993164f, 0.007229f, 0.992676f, 0.008499f, 0.991211f, + 0.009064f, 0.990234f, 0.009689f, 0.989258f, 0.010941f, 0.988281f, 0.011620f, 0.987305f, + 0.012344f, 0.985840f, 0.012970f, 0.984863f, 0.014038f, 0.983887f, 0.015350f, 0.982422f, + 0.016159f, 0.980957f, 0.016708f, 0.979980f, 0.017883f, 0.979004f, 0.019211f, 0.977051f, + 0.020493f, 0.975586f, 0.021347f, 0.974121f, 0.022568f, 0.972656f, 0.023804f, 0.971191f, + 0.024948f, 0.969238f, 0.026688f, 0.967773f, 0.028137f, 0.965820f, 0.029465f, 0.963379f, + 0.030838f, 0.961426f, 0.032440f, 0.959961f, 0.033844f, 0.957520f, 0.035675f, 0.955078f, + 0.037903f, 0.952148f, 0.039825f, 0.949707f, 0.041687f, 0.947266f, 0.043823f, 0.943848f, + 0.045959f, 0.940918f, 0.048126f, 0.937988f, 0.050842f, 0.934082f, 0.053833f, 0.930176f, + 0.056641f, 0.925781f, 0.059662f, 0.921875f, 0.062805f, 0.916992f, 0.066223f, 0.912109f, + 0.069458f, 0.906250f, 0.072571f, 0.899414f, 0.076965f, 0.892090f, 0.081360f, 0.884277f, + 0.085938f, 0.875488f, 0.091248f, 0.866211f, 0.097473f, 0.856445f, 0.103882f, 0.844238f, + 0.110474f, 0.829590f, 0.118530f, 0.812988f, 0.126831f, 0.793457f, 0.135620f, 0.768555f, + 0.145020f, 0.736816f, 0.153198f, 0.691406f, 0.151123f, 0.614258f, 0.071289f, 0.359131f, + 0.000000f, 1.000000f, 0.000962f, 0.999512f, 0.001439f, 0.998535f, 0.002554f, 0.997559f, + 0.003811f, 0.997070f, 0.005028f, 0.995117f, 0.006145f, 0.994141f, 0.006886f, 0.993652f, + 0.008606f, 0.992188f, 0.009026f, 0.991211f, 0.009689f, 0.990234f, 0.011497f, 0.988281f, + 0.012352f, 0.987793f, 0.012962f, 0.986328f, 0.014587f, 0.984863f, 0.015854f, 0.983398f, + 0.016708f, 0.981934f, 0.017578f, 0.980469f, 0.019485f, 0.979004f, 0.020477f, 0.977539f, + 0.021667f, 0.976074f, 0.022995f, 0.974121f, 0.024353f, 0.972656f, 0.026062f, 0.970703f, + 0.027344f, 0.969238f, 0.028809f, 0.967285f, 0.030365f, 0.965332f, 0.032043f, 0.963379f, + 0.033508f, 0.960938f, 0.035767f, 0.958984f, 0.037415f, 0.956543f, 0.039124f, 0.954102f, + 0.041016f, 0.951660f, 0.043274f, 0.949219f, 0.045135f, 0.946289f, 0.048004f, 0.943359f, + 0.050171f, 0.940430f, 0.052429f, 0.937500f, 0.054993f, 0.934082f, 0.057465f, 0.930664f, + 0.060394f, 0.927246f, 0.063293f, 0.923340f, 0.066895f, 0.918945f, 0.070129f, 0.914551f, + 0.073547f, 0.910156f, 0.077148f, 0.905273f, 0.080933f, 0.899902f, 0.085022f, 0.894531f, + 0.089539f, 0.888184f, 0.093933f, 0.880371f, 0.098022f, 0.872559f, 0.103088f, 0.864258f, + 0.108459f, 0.855469f, 0.114746f, 0.845703f, 0.121277f, 0.834473f, 0.128906f, 0.821777f, + 0.136108f, 0.807617f, 0.144043f, 0.790527f, 0.153198f, 0.771484f, 0.161133f, 0.747070f, + 0.170654f, 0.716309f, 0.177002f, 0.673340f, 0.171265f, 0.600098f, 0.078857f, 0.355957f, + 0.000000f, 1.000000f, 0.001053f, 0.999023f, 0.002396f, 0.998047f, 0.003359f, 0.997070f, + 0.005081f, 0.996094f, 0.006599f, 0.994141f, 0.008163f, 0.992676f, 0.009956f, 0.991211f, + 0.011086f, 0.989746f, 0.012733f, 0.988281f, 0.013992f, 0.986328f, 0.015976f, 0.984863f, + 0.017044f, 0.982910f, 0.018158f, 0.981934f, 0.020569f, 0.979492f, 0.021790f, 0.978027f, + 0.023392f, 0.976074f, 0.024780f, 0.974121f, 0.026947f, 0.972168f, 0.028748f, 0.969727f, + 0.030258f, 0.968262f, 0.031952f, 0.965820f, 0.034058f, 0.963867f, 0.035858f, 0.961426f, + 0.037933f, 0.958984f, 0.040161f, 0.956543f, 0.041992f, 0.954590f, 0.044159f, 0.951660f, + 0.046661f, 0.949219f, 0.048737f, 0.946777f, 0.051392f, 0.943848f, 0.053741f, 0.940430f, + 0.056427f, 0.937988f, 0.058868f, 0.934570f, 0.062012f, 0.931152f, 0.064697f, 0.927734f, + 0.067566f, 0.924316f, 0.070435f, 0.920898f, 0.073975f, 0.916992f, 0.077271f, 0.913086f, + 0.080750f, 0.908691f, 0.084717f, 0.903809f, 0.088440f, 0.899414f, 0.092346f, 0.894531f, + 0.096375f, 0.889160f, 0.100769f, 0.883789f, 0.105652f, 0.877930f, 0.110413f, 0.871582f, + 0.115967f, 0.864746f, 0.120972f, 0.856934f, 0.125610f, 0.849121f, 0.131226f, 0.839844f, + 0.137085f, 0.830566f, 0.143677f, 0.820312f, 0.150757f, 0.808594f, 0.158813f, 0.795898f, + 0.166870f, 0.781738f, 0.174194f, 0.765137f, 0.182739f, 0.746094f, 0.190308f, 0.723145f, + 0.198608f, 0.693359f, 0.202637f, 0.653320f, 0.191772f, 0.585938f, 0.086670f, 0.351562f, + 0.000000f, 1.000000f, 0.001943f, 0.998535f, 0.003834f, 0.997559f, 0.005642f, 0.996094f, + 0.007874f, 0.994141f, 0.009254f, 0.992676f, 0.012169f, 0.989746f, 0.014473f, 0.987793f, + 0.016052f, 0.985352f, 0.018738f, 0.983398f, 0.020691f, 0.980957f, 0.022552f, 0.979004f, + 0.025436f, 0.976074f, 0.027466f, 0.973633f, 0.029816f, 0.971191f, 0.031769f, 0.969238f, + 0.034424f, 0.966309f, 0.036652f, 0.963867f, 0.039337f, 0.960938f, 0.041473f, 0.958496f, + 0.043732f, 0.956055f, 0.046631f, 0.953125f, 0.049469f, 0.950195f, 0.052277f, 0.947266f, + 0.054626f, 0.944336f, 0.057281f, 0.941406f, 0.059906f, 0.938477f, 0.063171f, 0.935059f, + 0.066528f, 0.931641f, 0.069580f, 0.928223f, 0.072571f, 0.924805f, 0.075806f, 0.921387f, + 0.078918f, 0.917480f, 0.082520f, 0.913574f, 0.085876f, 0.910156f, 0.089905f, 0.905762f, + 0.093689f, 0.901367f, 0.097412f, 0.897461f, 0.101440f, 0.893066f, 0.105408f, 0.888184f, + 0.109924f, 0.883301f, 0.114136f, 0.878418f, 0.118469f, 0.873047f, 0.123413f, 0.867676f, + 0.128418f, 0.861816f, 0.133423f, 0.855469f, 0.138672f, 0.849121f, 0.144531f, 0.842285f, + 0.150024f, 0.835449f, 0.155762f, 0.827637f, 0.160522f, 0.819336f, 0.166260f, 0.810059f, + 0.173096f, 0.799805f, 0.179810f, 0.789551f, 0.187134f, 0.777832f, 0.194458f, 0.765625f, + 0.202515f, 0.752441f, 0.208740f, 0.736328f, 0.215942f, 0.718750f, 0.222900f, 0.696777f, + 0.229248f, 0.668945f, 0.229858f, 0.632324f, 0.213501f, 0.571289f, 0.094788f, 0.347900f, + 0.000000f, 1.000000f, 0.003086f, 0.998047f, 0.007225f, 0.995605f, 0.009949f, 0.993164f, + 0.012535f, 0.991211f, 0.015930f, 0.987793f, 0.018707f, 0.984863f, 0.022659f, 0.981445f, + 0.026367f, 0.977539f, 0.029541f, 0.974609f, 0.033234f, 0.970703f, 0.036530f, 0.967285f, + 0.039795f, 0.964355f, 0.042908f, 0.960938f, 0.046173f, 0.957520f, 0.050262f, 0.953613f, + 0.053436f, 0.950195f, 0.056366f, 0.946777f, 0.060455f, 0.942871f, 0.064270f, 0.939453f, + 0.067749f, 0.935547f, 0.071045f, 0.932129f, 0.074890f, 0.928223f, 0.078186f, 0.924805f, + 0.082153f, 0.920898f, 0.086365f, 0.916992f, 0.090088f, 0.912598f, 0.094238f, 0.908691f, + 0.098083f, 0.904785f, 0.101868f, 0.900879f, 0.105530f, 0.896484f, 0.109924f, 0.892090f, + 0.114990f, 0.887695f, 0.119324f, 0.882812f, 0.123535f, 0.878418f, 0.127808f, 0.873535f, + 0.132202f, 0.869141f, 0.136475f, 0.864258f, 0.140869f, 0.859375f, 0.145874f, 0.854492f, + 0.151123f, 0.848633f, 0.156494f, 0.843262f, 0.161621f, 0.837402f, 0.166748f, 0.831055f, + 0.171875f, 0.825195f, 0.177124f, 0.818848f, 0.182983f, 0.812500f, 0.188477f, 0.805664f, + 0.193970f, 0.798828f, 0.200195f, 0.791016f, 0.205811f, 0.782715f, 0.211670f, 0.772949f, + 0.217163f, 0.763184f, 0.223633f, 0.753418f, 0.229858f, 0.742676f, 0.236572f, 0.731445f, + 0.242920f, 0.719238f, 0.247925f, 0.704590f, 0.254150f, 0.687500f, 0.259033f, 0.667969f, + 0.261230f, 0.643066f, 0.257812f, 0.610840f, 0.235962f, 0.556152f, 0.103333f, 0.343750f, + 0.000000f, 1.000000f, 0.006245f, 0.997070f, 0.011818f, 0.993164f, 0.018555f, 0.987793f, + 0.024384f, 0.982422f, 0.029861f, 0.978027f, 0.035645f, 0.972168f, 0.039703f, 0.968262f, + 0.046875f, 0.961914f, 0.052338f, 0.956543f, 0.058197f, 0.951660f, 0.064209f, 0.945801f, + 0.068970f, 0.940918f, 0.073914f, 0.935547f, 0.079529f, 0.930664f, 0.085510f, 0.925293f, + 0.090149f, 0.920410f, 0.094788f, 0.915527f, 0.100220f, 0.910645f, 0.105225f, 0.905762f, + 0.110718f, 0.900391f, 0.115540f, 0.895508f, 0.120728f, 0.890625f, 0.125732f, 0.885742f, + 0.130249f, 0.881348f, 0.134766f, 0.876953f, 0.140381f, 0.871582f, 0.145874f, 0.866699f, + 0.150757f, 0.861816f, 0.155396f, 0.856934f, 0.160522f, 0.852051f, 0.165161f, 0.847168f, + 0.170166f, 0.842285f, 0.174805f, 0.837402f, 0.179321f, 0.832520f, 0.184692f, 0.827637f, + 0.190063f, 0.822266f, 0.194946f, 0.816895f, 0.200806f, 0.811523f, 0.205566f, 0.806152f, + 0.210449f, 0.800781f, 0.215210f, 0.794922f, 0.219971f, 0.789551f, 0.224731f, 0.784180f, + 0.229370f, 0.778320f, 0.235107f, 0.772461f, 0.240723f, 0.765625f, 0.246094f, 0.758789f, + 0.251465f, 0.751953f, 0.256836f, 0.745117f, 0.261719f, 0.737793f, 0.265381f, 0.729492f, + 0.270020f, 0.720703f, 0.275146f, 0.711914f, 0.279297f, 0.702637f, 0.283691f, 0.692871f, + 0.289062f, 0.681641f, 0.292480f, 0.668457f, 0.295654f, 0.653809f, 0.297363f, 0.637207f, + 0.295654f, 0.616211f, 0.286865f, 0.588867f, 0.256836f, 0.541992f, 0.112183f, 0.339355f, + 0.000000f, 1.000000f, 0.015884f, 0.992676f, 0.029770f, 0.982910f, 0.042358f, 0.972656f, + 0.056458f, 0.961426f, 0.068359f, 0.950684f, 0.078735f, 0.941406f, 0.090088f, 0.931641f, + 0.099548f, 0.922363f, 0.107239f, 0.914551f, 0.119019f, 0.905273f, 0.127930f, 0.896484f, + 0.135010f, 0.889160f, 0.143433f, 0.881836f, 0.152466f, 0.874023f, 0.159546f, 0.866699f, + 0.166870f, 0.860352f, 0.173340f, 0.854004f, 0.179443f, 0.848145f, 0.186035f, 0.841797f, + 0.192749f, 0.835938f, 0.199341f, 0.829590f, 0.205322f, 0.824219f, 0.210938f, 0.818359f, + 0.215820f, 0.813477f, 0.220581f, 0.809082f, 0.225708f, 0.803711f, 0.231567f, 0.798828f, + 0.237183f, 0.793457f, 0.242310f, 0.788086f, 0.247192f, 0.783691f, 0.252441f, 0.778320f, + 0.256592f, 0.773926f, 0.260742f, 0.769043f, 0.264893f, 0.764648f, 0.269287f, 0.760254f, + 0.272949f, 0.755859f, 0.277100f, 0.751465f, 0.281494f, 0.747070f, 0.286133f, 0.741699f, + 0.290527f, 0.736816f, 0.294678f, 0.731934f, 0.298584f, 0.727051f, 0.302490f, 0.722168f, + 0.306396f, 0.717285f, 0.310059f, 0.711914f, 0.313477f, 0.707031f, 0.316895f, 0.702148f, + 0.319824f, 0.696777f, 0.322754f, 0.691406f, 0.325439f, 0.686035f, 0.327393f, 0.680176f, + 0.330811f, 0.671875f, 0.333984f, 0.664062f, 0.336670f, 0.656250f, 0.338623f, 0.648438f, + 0.340576f, 0.639160f, 0.340576f, 0.629395f, 0.340088f, 0.618164f, 0.337402f, 0.604980f, + 0.330811f, 0.589844f, 0.316650f, 0.567871f, 0.280762f, 0.523438f, 0.121033f, 0.335205f, + 0.000000f, 1.000000f, 0.076538f, 0.966309f, 0.127197f, 0.929688f, 0.163330f, 0.899902f, + 0.191895f, 0.874512f, 0.210693f, 0.855469f, 0.232666f, 0.834961f, 0.246704f, 0.820312f, + 0.258301f, 0.808105f, 0.271729f, 0.794922f, 0.281250f, 0.784668f, 0.288330f, 0.776367f, + 0.296387f, 0.767578f, 0.304932f, 0.759277f, 0.313477f, 0.751465f, 0.320312f, 0.744141f, + 0.325195f, 0.738281f, 0.330078f, 0.732910f, 0.333740f, 0.728516f, 0.338135f, 0.723633f, + 0.341064f, 0.719727f, 0.343262f, 0.716309f, 0.349365f, 0.711426f, 0.354248f, 0.706543f, + 0.358154f, 0.702637f, 0.361816f, 0.698730f, 0.364746f, 0.695312f, 0.367188f, 0.691895f, + 0.369141f, 0.688965f, 0.371094f, 0.686035f, 0.373535f, 0.683105f, 0.375244f, 0.680176f, + 0.376953f, 0.677734f, 0.378906f, 0.675293f, 0.380127f, 0.672852f, 0.381104f, 0.670410f, + 0.382324f, 0.667969f, 0.383545f, 0.665527f, 0.386475f, 0.662109f, 0.389160f, 0.659180f, + 0.391113f, 0.656250f, 0.392822f, 0.653320f, 0.394775f, 0.649902f, 0.396484f, 0.646973f, + 0.397705f, 0.643555f, 0.398193f, 0.640625f, 0.399170f, 0.637695f, 0.399902f, 0.634277f, + 0.400635f, 0.631348f, 0.400879f, 0.627930f, 0.401123f, 0.624512f, 0.401123f, 0.620605f, + 0.399414f, 0.615723f, 0.397949f, 0.611328f, 0.396729f, 0.606445f, 0.394531f, 0.602051f, + 0.391846f, 0.596680f, 0.388428f, 0.591309f, 0.383057f, 0.583984f, 0.376953f, 0.574707f, + 0.368408f, 0.560059f, 0.349609f, 0.540039f, 0.305664f, 0.502930f, 0.130005f, 0.332275f, + 0.000000f, 1.000000f, 0.301025f, 0.870605f, 0.355713f, 0.809082f, 0.382324f, 0.770508f, + 0.398438f, 0.743164f, 0.410156f, 0.722168f, 0.418701f, 0.706055f, 0.426514f, 0.692383f, + 0.432861f, 0.681152f, 0.437256f, 0.672363f, 0.440674f, 0.664551f, 0.443848f, 0.658203f, + 0.447266f, 0.652344f, 0.450928f, 0.645996f, 0.453613f, 0.641113f, 0.455811f, 0.636719f, + 0.458008f, 0.632812f, 0.460449f, 0.628906f, 0.462402f, 0.625977f, 0.464355f, 0.622559f, + 0.465332f, 0.619629f, 0.466553f, 0.617188f, 0.468018f, 0.614746f, 0.469727f, 0.612305f, + 0.470703f, 0.610352f, 0.471924f, 0.607910f, 0.472656f, 0.605957f, 0.473877f, 0.604004f, + 0.474609f, 0.602051f, 0.475586f, 0.600098f, 0.476807f, 0.598145f, 0.477539f, 0.596191f, + 0.478516f, 0.594238f, 0.479004f, 0.592285f, 0.479736f, 0.590820f, 0.480469f, 0.588867f, + 0.480957f, 0.586914f, 0.481445f, 0.584961f, 0.481689f, 0.583008f, 0.482666f, 0.581055f, + 0.482910f, 0.579102f, 0.483643f, 0.576660f, 0.484375f, 0.574707f, 0.484375f, 0.572266f, + 0.484619f, 0.569824f, 0.484619f, 0.567871f, 0.485107f, 0.564941f, 0.484863f, 0.562500f, + 0.485107f, 0.559570f, 0.485107f, 0.557129f, 0.485352f, 0.553711f, 0.485596f, 0.550293f, + 0.483643f, 0.545898f, 0.482422f, 0.541016f, 0.480957f, 0.536133f, 0.479248f, 0.531250f, + 0.476318f, 0.525879f, 0.473633f, 0.520020f, 0.468750f, 0.511719f, 0.462891f, 0.502441f, + 0.451904f, 0.490723f, 0.433838f, 0.472900f, 0.395508f, 0.440918f, 0.231323f, 0.295410f, + 0.000000f, 1.000000f, 0.307861f, 0.868164f, 0.365967f, 0.803711f, 0.396973f, 0.761719f, + 0.414551f, 0.732910f, 0.429932f, 0.708984f, 0.440186f, 0.691406f, 0.450928f, 0.674805f, + 0.458252f, 0.662109f, 0.465088f, 0.650879f, 0.471436f, 0.641602f, 0.476807f, 0.632812f, + 0.480469f, 0.625977f, 0.486328f, 0.618164f, 0.490234f, 0.611816f, 0.494873f, 0.605469f, + 0.498535f, 0.600098f, 0.500977f, 0.595215f, 0.504883f, 0.590332f, 0.507812f, 0.585938f, + 0.510742f, 0.582031f, 0.513184f, 0.578613f, 0.516602f, 0.574219f, 0.519043f, 0.570801f, + 0.520996f, 0.567383f, 0.524902f, 0.563477f, 0.527344f, 0.560059f, 0.528809f, 0.557129f, + 0.531250f, 0.553711f, 0.533691f, 0.550293f, 0.536133f, 0.546875f, 0.538086f, 0.543945f, + 0.540527f, 0.541016f, 0.541992f, 0.537598f, 0.543945f, 0.534668f, 0.546387f, 0.531250f, + 0.549316f, 0.528320f, 0.550293f, 0.524902f, 0.553223f, 0.521484f, 0.555176f, 0.518066f, + 0.556152f, 0.514648f, 0.558105f, 0.511230f, 0.561035f, 0.507324f, 0.562500f, 0.503906f, + 0.564453f, 0.500000f, 0.566406f, 0.495850f, 0.567871f, 0.491943f, 0.569824f, 0.487793f, + 0.572266f, 0.483154f, 0.573730f, 0.478271f, 0.575195f, 0.473389f, 0.577637f, 0.468262f, + 0.578613f, 0.462158f, 0.579102f, 0.455322f, 0.580078f, 0.448242f, 0.581543f, 0.440918f, + 0.582031f, 0.432861f, 0.583008f, 0.423828f, 0.582031f, 0.413330f, 0.580566f, 0.400635f, + 0.576172f, 0.385254f, 0.566895f, 0.364746f, 0.542969f, 0.330078f, 0.425049f, 0.213257f, + 0.000000f, 1.000000f, 0.313721f, 0.865723f, 0.377930f, 0.797852f, 0.411865f, 0.752930f, + 0.434570f, 0.720703f, 0.452148f, 0.694336f, 0.464111f, 0.674805f, 0.475342f, 0.656738f, + 0.485352f, 0.642090f, 0.493652f, 0.628906f, 0.501465f, 0.617676f, 0.507812f, 0.607910f, + 0.513672f, 0.599121f, 0.521484f, 0.589844f, 0.526367f, 0.582031f, 0.532227f, 0.574219f, + 0.537598f, 0.567383f, 0.542480f, 0.561035f, 0.547363f, 0.554688f, 0.551270f, 0.549316f, + 0.555664f, 0.543945f, 0.560059f, 0.538574f, 0.564453f, 0.533203f, 0.568848f, 0.527832f, + 0.571289f, 0.523438f, 0.575195f, 0.518555f, 0.578125f, 0.514160f, 0.582031f, 0.509766f, + 0.585938f, 0.505371f, 0.590332f, 0.500488f, 0.593262f, 0.496338f, 0.596191f, 0.491943f, + 0.599609f, 0.487793f, 0.602539f, 0.483398f, 0.606445f, 0.479004f, 0.608887f, 0.474609f, + 0.612793f, 0.469971f, 0.616699f, 0.465576f, 0.619141f, 0.460938f, 0.621582f, 0.456543f, + 0.625977f, 0.451660f, 0.628906f, 0.446777f, 0.631348f, 0.441895f, 0.635254f, 0.436768f, + 0.637695f, 0.431885f, 0.641113f, 0.426514f, 0.645508f, 0.420898f, 0.646484f, 0.415527f, + 0.651855f, 0.409180f, 0.653809f, 0.403320f, 0.657715f, 0.396729f, 0.660645f, 0.390137f, + 0.663574f, 0.383301f, 0.664551f, 0.375000f, 0.667480f, 0.366455f, 0.670898f, 0.356934f, + 0.673340f, 0.347168f, 0.675781f, 0.336670f, 0.678223f, 0.324951f, 0.678711f, 0.310791f, + 0.679688f, 0.294434f, 0.675781f, 0.271973f, 0.661133f, 0.238037f, 0.580566f, 0.145752f, + 0.000000f, 1.000000f, 0.321289f, 0.862793f, 0.390869f, 0.791016f, 0.428467f, 0.743164f, + 0.450928f, 0.709473f, 0.471924f, 0.680664f, 0.486816f, 0.658691f, 0.500977f, 0.638184f, + 0.511230f, 0.622070f, 0.522461f, 0.607422f, 0.531738f, 0.593750f, 0.539062f, 0.582520f, + 0.548340f, 0.571777f, 0.555664f, 0.561523f, 0.562988f, 0.551758f, 0.568848f, 0.542969f, + 0.576660f, 0.534180f, 0.581543f, 0.526855f, 0.588379f, 0.519043f, 0.593750f, 0.512207f, + 0.599121f, 0.505371f, 0.604004f, 0.499268f, 0.609375f, 0.492676f, 0.614746f, 0.486328f, + 0.618652f, 0.480713f, 0.624023f, 0.474854f, 0.627930f, 0.469238f, 0.632812f, 0.463379f, + 0.637695f, 0.457764f, 0.642090f, 0.452393f, 0.646484f, 0.446777f, 0.649902f, 0.441406f, + 0.654297f, 0.436035f, 0.657227f, 0.430908f, 0.663574f, 0.425293f, 0.666504f, 0.419922f, + 0.671387f, 0.414307f, 0.674805f, 0.408936f, 0.678711f, 0.403564f, 0.681641f, 0.397949f, + 0.686523f, 0.392334f, 0.690918f, 0.386475f, 0.693848f, 0.380615f, 0.698730f, 0.374512f, + 0.702148f, 0.368652f, 0.706543f, 0.362305f, 0.709961f, 0.355957f, 0.714355f, 0.349365f, + 0.718262f, 0.342529f, 0.721191f, 0.335693f, 0.726074f, 0.328369f, 0.729004f, 0.321289f, + 0.732910f, 0.313477f, 0.737793f, 0.304688f, 0.739746f, 0.294922f, 0.742676f, 0.285156f, + 0.747559f, 0.274658f, 0.750488f, 0.263672f, 0.753418f, 0.251953f, 0.755371f, 0.237793f, + 0.757324f, 0.221313f, 0.756836f, 0.200439f, 0.749023f, 0.171509f, 0.693359f, 0.097595f, + 0.000000f, 1.000000f, 0.328613f, 0.859863f, 0.403076f, 0.784668f, 0.442627f, 0.734863f, + 0.469971f, 0.697266f, 0.492432f, 0.666992f, 0.509766f, 0.642090f, 0.525391f, 0.620605f, + 0.538574f, 0.601562f, 0.549805f, 0.585449f, 0.561523f, 0.570312f, 0.569824f, 0.557129f, + 0.580078f, 0.544922f, 0.588867f, 0.533203f, 0.597168f, 0.522461f, 0.606934f, 0.511719f, + 0.613281f, 0.501953f, 0.620605f, 0.493164f, 0.626953f, 0.484619f, 0.633301f, 0.476562f, + 0.639160f, 0.468506f, 0.645996f, 0.460693f, 0.651855f, 0.453369f, 0.657227f, 0.446289f, + 0.662109f, 0.439453f, 0.669922f, 0.432373f, 0.673828f, 0.425781f, 0.679688f, 0.419189f, + 0.684082f, 0.412842f, 0.689941f, 0.406250f, 0.693848f, 0.400146f, 0.698242f, 0.394043f, + 0.702637f, 0.387939f, 0.708496f, 0.381348f, 0.713379f, 0.375244f, 0.717285f, 0.368896f, + 0.722168f, 0.363037f, 0.726074f, 0.356934f, 0.730469f, 0.350830f, 0.734375f, 0.344727f, + 0.739258f, 0.338135f, 0.743164f, 0.331787f, 0.747559f, 0.325684f, 0.752441f, 0.318848f, + 0.755371f, 0.312500f, 0.760254f, 0.305908f, 0.764648f, 0.299072f, 0.768555f, 0.291992f, + 0.772461f, 0.284912f, 0.776367f, 0.277832f, 0.780273f, 0.270020f, 0.785156f, 0.262451f, + 0.788574f, 0.254639f, 0.792480f, 0.246216f, 0.795410f, 0.236572f, 0.799805f, 0.226807f, + 0.802734f, 0.216675f, 0.805664f, 0.206177f, 0.809570f, 0.194580f, 0.812988f, 0.182251f, + 0.814941f, 0.166016f, 0.815430f, 0.148193f, 0.809082f, 0.123413f, 0.770508f, 0.067139f, + 0.000000f, 1.000000f, 0.338135f, 0.855469f, 0.415039f, 0.778320f, 0.458496f, 0.725586f, + 0.489014f, 0.685547f, 0.512695f, 0.652832f, 0.533203f, 0.625488f, 0.549805f, 0.602051f, + 0.564941f, 0.581543f, 0.578613f, 0.563477f, 0.589844f, 0.546875f, 0.600098f, 0.532715f, + 0.611816f, 0.518555f, 0.620605f, 0.505859f, 0.630859f, 0.493408f, 0.640137f, 0.481445f, + 0.647949f, 0.470947f, 0.656250f, 0.460449f, 0.664062f, 0.450928f, 0.671387f, 0.441650f, + 0.678223f, 0.432617f, 0.685059f, 0.424072f, 0.691895f, 0.416016f, 0.696289f, 0.408203f, + 0.703125f, 0.400146f, 0.708984f, 0.392822f, 0.715332f, 0.384766f, 0.720703f, 0.377686f, + 0.726074f, 0.370850f, 0.730957f, 0.363770f, 0.736328f, 0.356934f, 0.742188f, 0.350098f, + 0.746582f, 0.343262f, 0.750488f, 0.336670f, 0.757324f, 0.329590f, 0.760254f, 0.323242f, + 0.765137f, 0.316650f, 0.769043f, 0.310303f, 0.773926f, 0.303955f, 0.778320f, 0.297363f, + 0.783691f, 0.290283f, 0.787109f, 0.283936f, 0.791504f, 0.277344f, 0.795898f, 0.270752f, + 0.799805f, 0.263916f, 0.803223f, 0.257324f, 0.808594f, 0.250244f, 0.811523f, 0.243652f, + 0.815918f, 0.236450f, 0.820312f, 0.229126f, 0.823730f, 0.221802f, 0.828613f, 0.214600f, + 0.831543f, 0.206787f, 0.835938f, 0.198730f, 0.838867f, 0.190552f, 0.840820f, 0.181152f, + 0.844727f, 0.171387f, 0.847656f, 0.161499f, 0.850586f, 0.151001f, 0.854980f, 0.139893f, + 0.855957f, 0.126343f, 0.856934f, 0.111694f, 0.852539f, 0.089539f, 0.823730f, 0.046478f, + 0.000000f, 1.000000f, 0.344971f, 0.853027f, 0.427490f, 0.771973f, 0.474121f, 0.716309f, + 0.506836f, 0.673828f, 0.534668f, 0.638184f, 0.555176f, 0.609375f, 0.573730f, 0.584473f, + 0.590820f, 0.561523f, 0.604980f, 0.541992f, 0.618164f, 0.523926f, 0.630371f, 0.507812f, + 0.641602f, 0.492676f, 0.650879f, 0.479492f, 0.662109f, 0.465576f, 0.672852f, 0.452393f, + 0.681152f, 0.440674f, 0.689941f, 0.429443f, 0.698730f, 0.418945f, 0.705078f, 0.408936f, + 0.713379f, 0.399170f, 0.719727f, 0.389893f, 0.726074f, 0.380859f, 0.733398f, 0.372070f, + 0.739258f, 0.364014f, 0.746094f, 0.355469f, 0.751953f, 0.347656f, 0.756348f, 0.339844f, + 0.762695f, 0.332275f, 0.768555f, 0.324951f, 0.772949f, 0.317871f, 0.778809f, 0.310303f, + 0.783691f, 0.303223f, 0.788086f, 0.296387f, 0.791992f, 0.289551f, 0.798340f, 0.282715f, + 0.801270f, 0.276123f, 0.806152f, 0.269531f, 0.811035f, 0.262695f, 0.815430f, 0.255859f, + 0.819824f, 0.249146f, 0.822754f, 0.242798f, 0.827148f, 0.236328f, 0.830566f, 0.229858f, + 0.834473f, 0.223511f, 0.838379f, 0.216797f, 0.843262f, 0.209717f, 0.846680f, 0.203247f, + 0.850098f, 0.196411f, 0.854492f, 0.189453f, 0.855957f, 0.182983f, 0.860840f, 0.175781f, + 0.864746f, 0.168457f, 0.867676f, 0.161377f, 0.871094f, 0.153809f, 0.874023f, 0.145386f, + 0.875977f, 0.136475f, 0.878418f, 0.127563f, 0.881348f, 0.118164f, 0.884766f, 0.108826f, + 0.885742f, 0.097717f, 0.887207f, 0.084412f, 0.884766f, 0.067688f, 0.862793f, 0.033691f, + 0.000000f, 1.000000f, 0.353516f, 0.849121f, 0.440674f, 0.765137f, 0.490723f, 0.707031f, + 0.525879f, 0.661621f, 0.555176f, 0.624023f, 0.577148f, 0.593750f, 0.597656f, 0.566406f, + 0.616211f, 0.541992f, 0.630859f, 0.520996f, 0.645508f, 0.501465f, 0.659668f, 0.483887f, + 0.669922f, 0.468018f, 0.680176f, 0.453369f, 0.692871f, 0.438477f, 0.702148f, 0.424561f, + 0.711426f, 0.412354f, 0.720703f, 0.400146f, 0.729492f, 0.388916f, 0.736816f, 0.378174f, + 0.744141f, 0.367676f, 0.750977f, 0.357910f, 0.758789f, 0.348633f, 0.764648f, 0.339355f, + 0.771484f, 0.330566f, 0.776855f, 0.321777f, 0.783691f, 0.313477f, 0.787598f, 0.305908f, + 0.793945f, 0.297852f, 0.799805f, 0.290039f, 0.804688f, 0.282471f, 0.810059f, 0.275146f, + 0.814453f, 0.268066f, 0.818359f, 0.260986f, 0.823730f, 0.254150f, 0.828125f, 0.247437f, + 0.832520f, 0.240601f, 0.836914f, 0.233765f, 0.839844f, 0.227539f, 0.844238f, 0.220703f, + 0.848633f, 0.214233f, 0.851074f, 0.208130f, 0.854980f, 0.201904f, 0.859375f, 0.195679f, + 0.863770f, 0.188843f, 0.867188f, 0.182495f, 0.869629f, 0.176392f, 0.873535f, 0.170044f, + 0.876465f, 0.163818f, 0.878418f, 0.158081f, 0.883301f, 0.151123f, 0.886230f, 0.144653f, + 0.890137f, 0.137939f, 0.892578f, 0.131470f, 0.895508f, 0.124878f, 0.898438f, 0.118225f, + 0.899414f, 0.109985f, 0.902832f, 0.101685f, 0.904785f, 0.093628f, 0.906250f, 0.085205f, + 0.908691f, 0.076538f, 0.908691f, 0.064941f, 0.907715f, 0.050476f, 0.891602f, 0.025284f, + 0.000000f, 1.000000f, 0.361816f, 0.845703f, 0.453125f, 0.758789f, 0.507324f, 0.697266f, + 0.544434f, 0.649902f, 0.576172f, 0.609863f, 0.600098f, 0.577637f, 0.620605f, 0.548828f, + 0.640625f, 0.522949f, 0.656738f, 0.500000f, 0.671875f, 0.479980f, 0.684570f, 0.461426f, + 0.697266f, 0.444092f, 0.706543f, 0.428955f, 0.719238f, 0.413330f, 0.730957f, 0.398682f, + 0.739258f, 0.385498f, 0.748535f, 0.372803f, 0.756348f, 0.360840f, 0.764160f, 0.349854f, + 0.771973f, 0.338867f, 0.779297f, 0.328613f, 0.786133f, 0.318848f, 0.793457f, 0.309082f, + 0.799805f, 0.300049f, 0.804688f, 0.291748f, 0.810059f, 0.283203f, 0.815918f, 0.274902f, + 0.821777f, 0.267090f, 0.826660f, 0.259033f, 0.830566f, 0.251465f, 0.835449f, 0.244507f, + 0.840332f, 0.237427f, 0.844727f, 0.230347f, 0.849121f, 0.223389f, 0.853027f, 0.216675f, + 0.856934f, 0.209961f, 0.860840f, 0.203613f, 0.864746f, 0.197266f, 0.868652f, 0.190918f, + 0.872070f, 0.184814f, 0.875488f, 0.178955f, 0.878906f, 0.172363f, 0.882324f, 0.166626f, + 0.885742f, 0.160522f, 0.888672f, 0.154785f, 0.890625f, 0.149048f, 0.894043f, 0.143433f, + 0.897461f, 0.137329f, 0.900879f, 0.131348f, 0.903809f, 0.125366f, 0.906738f, 0.119751f, + 0.909180f, 0.113953f, 0.912109f, 0.108276f, 0.913574f, 0.102600f, 0.917969f, 0.096008f, + 0.918457f, 0.089355f, 0.920410f, 0.081970f, 0.920898f, 0.075317f, 0.923828f, 0.068115f, + 0.925781f, 0.060333f, 0.925781f, 0.051239f, 0.924805f, 0.039886f, 0.913086f, 0.018799f, + 0.000000f, 1.000000f, 0.369385f, 0.842773f, 0.466553f, 0.751953f, 0.522949f, 0.687988f, + 0.562500f, 0.638184f, 0.594727f, 0.596680f, 0.621582f, 0.562012f, 0.642578f, 0.532227f, + 0.663086f, 0.504883f, 0.680176f, 0.480713f, 0.694824f, 0.459473f, 0.709961f, 0.439697f, + 0.721191f, 0.422363f, 0.733398f, 0.405273f, 0.744141f, 0.389893f, 0.753906f, 0.375000f, + 0.765137f, 0.360840f, 0.775391f, 0.347168f, 0.783203f, 0.334961f, 0.789062f, 0.323730f, + 0.797363f, 0.312744f, 0.805664f, 0.301758f, 0.811035f, 0.291992f, 0.817871f, 0.282227f, + 0.822754f, 0.273193f, 0.828613f, 0.264648f, 0.834961f, 0.255615f, 0.839844f, 0.247559f, + 0.843750f, 0.239868f, 0.849121f, 0.231812f, 0.853027f, 0.224731f, 0.858398f, 0.217407f, + 0.862793f, 0.210327f, 0.866211f, 0.203491f, 0.871582f, 0.196533f, 0.874512f, 0.190186f, + 0.877441f, 0.184082f, 0.880371f, 0.178101f, 0.885254f, 0.171509f, 0.888184f, 0.165649f, + 0.891602f, 0.159546f, 0.894531f, 0.153931f, 0.897461f, 0.148193f, 0.899902f, 0.142822f, + 0.903320f, 0.137207f, 0.905762f, 0.131836f, 0.908691f, 0.126221f, 0.911133f, 0.121033f, + 0.915039f, 0.115417f, 0.916016f, 0.110413f, 0.919434f, 0.105103f, 0.921387f, 0.100159f, + 0.924805f, 0.094727f, 0.926270f, 0.089539f, 0.929199f, 0.084167f, 0.930664f, 0.078979f, + 0.932617f, 0.074280f, 0.935059f, 0.067139f, 0.935547f, 0.060852f, 0.935547f, 0.054871f, + 0.938477f, 0.048035f, 0.938965f, 0.041412f, 0.937500f, 0.031342f, 0.929199f, 0.014694f, + 0.000000f, 1.000000f, 0.377686f, 0.839844f, 0.479004f, 0.745605f, 0.538574f, 0.678711f, + 0.581543f, 0.626465f, 0.614746f, 0.583008f, 0.641602f, 0.546875f, 0.664551f, 0.515625f, + 0.684570f, 0.487549f, 0.703125f, 0.462158f, 0.717773f, 0.439941f, 0.731445f, 0.419434f, + 0.744629f, 0.400879f, 0.755859f, 0.383789f, 0.766602f, 0.367920f, 0.777832f, 0.352051f, + 0.787109f, 0.337891f, 0.795898f, 0.324219f, 0.803711f, 0.312012f, 0.812500f, 0.299805f, + 0.818848f, 0.288574f, 0.826660f, 0.277588f, 0.832031f, 0.268066f, 0.838379f, 0.258301f, + 0.844238f, 0.249023f, 0.849609f, 0.240234f, 0.855469f, 0.231567f, 0.858887f, 0.223755f, + 0.864258f, 0.215698f, 0.868164f, 0.208374f, 0.873535f, 0.200684f, 0.876465f, 0.193848f, + 0.880859f, 0.187012f, 0.884277f, 0.180298f, 0.887695f, 0.174072f, 0.891113f, 0.167847f, + 0.895020f, 0.161743f, 0.897949f, 0.155640f, 0.902344f, 0.149658f, 0.904785f, 0.144043f, + 0.907227f, 0.138794f, 0.909180f, 0.133545f, 0.913574f, 0.127930f, 0.916016f, 0.122620f, + 0.917480f, 0.117737f, 0.920410f, 0.112427f, 0.921875f, 0.107910f, 0.925293f, 0.103149f, + 0.927734f, 0.098022f, 0.929688f, 0.093140f, 0.932617f, 0.088318f, 0.934570f, 0.083740f, + 0.935059f, 0.079712f, 0.939453f, 0.074524f, 0.940430f, 0.069824f, 0.941895f, 0.065674f, + 0.944336f, 0.061157f, 0.944824f, 0.055939f, 0.946289f, 0.049988f, 0.946777f, 0.044495f, + 0.948242f, 0.039276f, 0.949219f, 0.033264f, 0.947754f, 0.024719f, 0.940918f, 0.010834f, + 0.000000f, 1.000000f, 0.385010f, 0.836914f, 0.491211f, 0.739258f, 0.553711f, 0.669434f, + 0.599121f, 0.614746f, 0.632812f, 0.570312f, 0.660645f, 0.532715f, 0.684570f, 0.500000f, + 0.705078f, 0.470703f, 0.724121f, 0.444336f, 0.740234f, 0.421143f, 0.752930f, 0.400391f, + 0.766113f, 0.381104f, 0.776855f, 0.363525f, 0.788574f, 0.347168f, 0.798828f, 0.331543f, + 0.808594f, 0.316406f, 0.816895f, 0.302979f, 0.824219f, 0.290527f, 0.833496f, 0.278076f, + 0.839355f, 0.266846f, 0.845703f, 0.256348f, 0.850098f, 0.246826f, 0.857910f, 0.236328f, + 0.861816f, 0.227539f, 0.866699f, 0.218994f, 0.871582f, 0.210571f, 0.875977f, 0.202637f, + 0.880859f, 0.194824f, 0.885254f, 0.187256f, 0.888672f, 0.180298f, 0.892090f, 0.173584f, + 0.895508f, 0.167114f, 0.899902f, 0.160645f, 0.903320f, 0.154175f, 0.906250f, 0.148315f, + 0.909180f, 0.142578f, 0.912109f, 0.136963f, 0.914551f, 0.131470f, 0.916992f, 0.126343f, + 0.920410f, 0.120789f, 0.922363f, 0.116028f, 0.924805f, 0.111023f, 0.927246f, 0.106140f, + 0.929199f, 0.101746f, 0.932129f, 0.096924f, 0.935059f, 0.092041f, 0.936035f, 0.087830f, + 0.937500f, 0.083923f, 0.941406f, 0.079102f, 0.942383f, 0.074890f, 0.944336f, 0.070923f, + 0.946289f, 0.066711f, 0.947266f, 0.062805f, 0.949707f, 0.058777f, 0.951172f, 0.054810f, + 0.953125f, 0.050873f, 0.955078f, 0.046661f, 0.955078f, 0.041931f, 0.955566f, 0.036743f, + 0.956055f, 0.031860f, 0.958008f, 0.026825f, 0.955078f, 0.020111f, 0.951172f, 0.008820f, + 0.000000f, 1.000000f, 0.394775f, 0.832520f, 0.503418f, 0.732910f, 0.569336f, 0.660645f, + 0.614746f, 0.604492f, 0.651367f, 0.557617f, 0.681641f, 0.518066f, 0.704102f, 0.484863f, + 0.726074f, 0.454590f, 0.743652f, 0.427734f, 0.759766f, 0.403564f, 0.772949f, 0.382568f, + 0.785156f, 0.362793f, 0.797363f, 0.344727f, 0.806152f, 0.328613f, 0.816406f, 0.312988f, + 0.826172f, 0.297607f, 0.833496f, 0.283936f, 0.840820f, 0.271240f, 0.848633f, 0.259033f, + 0.855957f, 0.247681f, 0.861328f, 0.237427f, 0.868164f, 0.226929f, 0.873535f, 0.217407f, + 0.877441f, 0.208496f, 0.881348f, 0.200317f, 0.887695f, 0.191650f, 0.890625f, 0.183838f, + 0.895020f, 0.176392f, 0.898926f, 0.169312f, 0.902344f, 0.162598f, 0.906738f, 0.155884f, + 0.910156f, 0.149292f, 0.913086f, 0.143066f, 0.915039f, 0.137451f, 0.916992f, 0.132202f, + 0.921387f, 0.126221f, 0.923828f, 0.120789f, 0.927246f, 0.115417f, 0.928711f, 0.110657f, + 0.929688f, 0.106506f, 0.934570f, 0.101257f, 0.936035f, 0.096313f, 0.937500f, 0.092102f, + 0.939453f, 0.088013f, 0.940918f, 0.083862f, 0.942871f, 0.079712f, 0.945801f, 0.075317f, + 0.946777f, 0.071716f, 0.949219f, 0.067688f, 0.950684f, 0.063965f, 0.952148f, 0.060364f, + 0.954590f, 0.056610f, 0.955566f, 0.053101f, 0.956543f, 0.049561f, 0.958984f, 0.046234f, + 0.959473f, 0.042725f, 0.961914f, 0.039185f, 0.961914f, 0.035492f, 0.961914f, 0.030777f, + 0.962402f, 0.026779f, 0.963379f, 0.021698f, 0.963867f, 0.017212f, 0.958496f, 0.006859f, + 0.000000f, 1.000000f, 0.404297f, 0.828613f, 0.517090f, 0.726074f, 0.583984f, 0.652344f, + 0.631348f, 0.593750f, 0.667480f, 0.545898f, 0.698730f, 0.504883f, 0.723145f, 0.470215f, + 0.744141f, 0.439453f, 0.761719f, 0.412109f, 0.777344f, 0.387695f, 0.790527f, 0.365967f, + 0.803711f, 0.345703f, 0.813965f, 0.327637f, 0.824707f, 0.310791f, 0.833008f, 0.295654f, + 0.841797f, 0.280518f, 0.850098f, 0.266357f, 0.858398f, 0.253662f, 0.864746f, 0.241577f, + 0.871582f, 0.230469f, 0.875977f, 0.220215f, 0.881348f, 0.209839f, 0.886230f, 0.200684f, + 0.892090f, 0.191772f, 0.895020f, 0.183472f, 0.900391f, 0.174927f, 0.903809f, 0.167725f, + 0.906250f, 0.160767f, 0.911621f, 0.153564f, 0.914551f, 0.146606f, 0.917480f, 0.140381f, + 0.919922f, 0.134399f, 0.922363f, 0.128784f, 0.927246f, 0.122803f, 0.929199f, 0.117249f, + 0.930664f, 0.112366f, 0.933105f, 0.107544f, 0.935547f, 0.102478f, 0.937988f, 0.097961f, + 0.939453f, 0.093384f, 0.942383f, 0.088806f, 0.944336f, 0.084595f, 0.945312f, 0.080566f, + 0.946777f, 0.076843f, 0.950195f, 0.072693f, 0.951660f, 0.068726f, 0.953125f, 0.065186f, + 0.954102f, 0.061737f, 0.955078f, 0.058441f, 0.957520f, 0.054932f, 0.958496f, 0.051636f, + 0.960938f, 0.048065f, 0.961426f, 0.045227f, 0.962402f, 0.042389f, 0.964844f, 0.039001f, + 0.965820f, 0.035736f, 0.966309f, 0.033325f, 0.968262f, 0.030426f, 0.968750f, 0.025787f, + 0.968262f, 0.022202f, 0.967773f, 0.018677f, 0.969238f, 0.013779f, 0.965332f, 0.005775f, + 0.000000f, 1.000000f, 0.411865f, 0.825684f, 0.530762f, 0.718750f, 0.599121f, 0.643066f, + 0.647949f, 0.583008f, 0.686523f, 0.533691f, 0.716797f, 0.491699f, 0.740234f, 0.456543f, + 0.760742f, 0.425293f, 0.778809f, 0.397461f, 0.794434f, 0.372314f, 0.808105f, 0.350098f, + 0.819336f, 0.330078f, 0.830078f, 0.311768f, 0.839355f, 0.294922f, 0.847656f, 0.279785f, + 0.856934f, 0.264893f, 0.864258f, 0.250732f, 0.871094f, 0.238159f, 0.877930f, 0.226074f, + 0.883789f, 0.214844f, 0.889648f, 0.204590f, 0.893555f, 0.195068f, 0.898926f, 0.185425f, + 0.902832f, 0.176880f, 0.906738f, 0.168579f, 0.911133f, 0.160889f, 0.915039f, 0.153320f, + 0.918457f, 0.146484f, 0.921387f, 0.139404f, 0.922852f, 0.133667f, 0.927734f, 0.126953f, + 0.929688f, 0.121277f, 0.932617f, 0.115906f, 0.934570f, 0.110474f, 0.937012f, 0.105347f, + 0.939941f, 0.100220f, 0.941406f, 0.095764f, 0.944336f, 0.091064f, 0.945801f, 0.086609f, + 0.947266f, 0.082581f, 0.949707f, 0.078308f, 0.951172f, 0.074463f, 0.953125f, 0.070801f, + 0.954590f, 0.066956f, 0.956055f, 0.063293f, 0.957031f, 0.060059f, 0.958008f, 0.057037f, + 0.960938f, 0.053375f, 0.962402f, 0.050232f, 0.963379f, 0.047211f, 0.963867f, 0.044464f, + 0.965332f, 0.041626f, 0.966797f, 0.038666f, 0.967773f, 0.036041f, 0.969727f, 0.033325f, + 0.970703f, 0.030609f, 0.971191f, 0.028290f, 0.972168f, 0.025726f, 0.974121f, 0.022797f, + 0.972656f, 0.018906f, 0.972656f, 0.015373f, 0.973633f, 0.011444f, 0.969727f, 0.004612f, + 0.000000f, 1.000000f, 0.421631f, 0.821777f, 0.542969f, 0.712891f, 0.614746f, 0.634277f, + 0.664062f, 0.573242f, 0.702148f, 0.521973f, 0.732422f, 0.479736f, 0.756348f, 0.443848f, + 0.777832f, 0.411865f, 0.795898f, 0.383301f, 0.810547f, 0.358154f, 0.822754f, 0.335938f, + 0.833984f, 0.315918f, 0.844727f, 0.297119f, 0.852539f, 0.280762f, 0.860840f, 0.265625f, + 0.869629f, 0.250732f, 0.876953f, 0.236938f, 0.883789f, 0.224243f, 0.890137f, 0.211914f, + 0.895508f, 0.201172f, 0.900391f, 0.191040f, 0.905273f, 0.181030f, 0.909180f, 0.172485f, + 0.913086f, 0.163818f, 0.917480f, 0.155640f, 0.920898f, 0.147827f, 0.922852f, 0.141357f, + 0.927246f, 0.134033f, 0.929688f, 0.127563f, 0.932129f, 0.121521f, 0.934570f, 0.115906f, + 0.938965f, 0.109802f, 0.939941f, 0.104736f, 0.942871f, 0.099609f, 0.944336f, 0.094849f, + 0.946777f, 0.090149f, 0.949219f, 0.085388f, 0.950684f, 0.081238f, 0.951660f, 0.077454f, + 0.954590f, 0.073242f, 0.955566f, 0.069519f, 0.957520f, 0.065735f, 0.958496f, 0.062500f, + 0.960938f, 0.058777f, 0.961426f, 0.055817f, 0.962402f, 0.052673f, 0.964355f, 0.049438f, + 0.965332f, 0.046661f, 0.967285f, 0.043732f, 0.967773f, 0.040985f, 0.969238f, 0.038422f, + 0.970703f, 0.035736f, 0.971680f, 0.033020f, 0.971680f, 0.031021f, 0.973145f, 0.028625f, + 0.974609f, 0.026321f, 0.975586f, 0.023727f, 0.976562f, 0.021774f, 0.977539f, 0.019760f, + 0.977051f, 0.016510f, 0.976562f, 0.012489f, 0.976562f, 0.009476f, 0.974121f, 0.003717f, + 0.000000f, 1.000000f, 0.428711f, 0.819336f, 0.556641f, 0.706055f, 0.628906f, 0.625977f, + 0.680176f, 0.562988f, 0.717773f, 0.511230f, 0.748047f, 0.468018f, 0.771973f, 0.431396f, + 0.791016f, 0.399902f, 0.809570f, 0.370605f, 0.824219f, 0.345459f, 0.837402f, 0.322754f, + 0.847168f, 0.302734f, 0.857422f, 0.284180f, 0.864258f, 0.268066f, 0.873535f, 0.251953f, + 0.879883f, 0.238281f, 0.887695f, 0.224243f, 0.894531f, 0.211304f, 0.899902f, 0.200073f, + 0.904785f, 0.188965f, 0.911133f, 0.178345f, 0.913086f, 0.169800f, 0.918945f, 0.160156f, + 0.922363f, 0.151978f, 0.925293f, 0.144409f, 0.929199f, 0.136963f, 0.931641f, 0.129883f, + 0.934570f, 0.123413f, 0.937500f, 0.117065f, 0.939941f, 0.111328f, 0.942383f, 0.105652f, + 0.944824f, 0.100098f, 0.946777f, 0.095215f, 0.948730f, 0.090393f, 0.951660f, 0.085693f, + 0.953125f, 0.081177f, 0.954590f, 0.076904f, 0.955566f, 0.073242f, 0.958008f, 0.069214f, + 0.960449f, 0.065125f, 0.960938f, 0.061737f, 0.961426f, 0.058807f, 0.964355f, 0.055267f, + 0.965820f, 0.051849f, 0.966309f, 0.049011f, 0.967773f, 0.046265f, 0.968262f, 0.043579f, + 0.970215f, 0.040680f, 0.971191f, 0.037964f, 0.972168f, 0.035614f, 0.972656f, 0.033478f, + 0.974121f, 0.031097f, 0.975586f, 0.028687f, 0.976562f, 0.026352f, 0.976562f, 0.024750f, + 0.978027f, 0.022507f, 0.978516f, 0.020660f, 0.979980f, 0.018646f, 0.980957f, 0.016479f, + 0.981445f, 0.014877f, 0.979492f, 0.011246f, 0.979492f, 0.007957f, 0.979004f, 0.003407f, + 0.000000f, 1.000000f, 0.437500f, 0.815918f, 0.569824f, 0.699707f, 0.643066f, 0.617676f, + 0.694824f, 0.553223f, 0.732910f, 0.500977f, 0.762695f, 0.457031f, 0.785645f, 0.420166f, + 0.804688f, 0.388184f, 0.822266f, 0.358887f, 0.837891f, 0.333252f, 0.850098f, 0.310547f, + 0.860352f, 0.290283f, 0.868652f, 0.272217f, 0.876953f, 0.255615f, 0.883789f, 0.240356f, + 0.891113f, 0.226318f, 0.898438f, 0.212769f, 0.903809f, 0.200562f, 0.909668f, 0.188354f, + 0.913574f, 0.178223f, 0.918945f, 0.167847f, 0.922363f, 0.158813f, 0.926758f, 0.150024f, + 0.930176f, 0.141846f, 0.933105f, 0.134277f, 0.936035f, 0.127197f, 0.938965f, 0.120361f, + 0.940918f, 0.114136f, 0.943848f, 0.108093f, 0.947266f, 0.101990f, 0.948730f, 0.096802f, + 0.950684f, 0.091858f, 0.953613f, 0.086609f, 0.954590f, 0.082153f, 0.956543f, 0.077759f, + 0.958008f, 0.073730f, 0.960449f, 0.069458f, 0.961426f, 0.065735f, 0.962402f, 0.062317f, + 0.965332f, 0.058472f, 0.965820f, 0.055237f, 0.966309f, 0.052521f, 0.968262f, 0.049133f, + 0.969727f, 0.046234f, 0.970703f, 0.043335f, 0.971680f, 0.040924f, 0.972168f, 0.038269f, + 0.973145f, 0.035858f, 0.974121f, 0.033569f, 0.975098f, 0.031372f, 0.977051f, 0.028717f, + 0.977539f, 0.026886f, 0.977539f, 0.025299f, 0.979004f, 0.023254f, 0.979980f, 0.021149f, + 0.980957f, 0.019135f, 0.981445f, 0.017670f, 0.982422f, 0.016006f, 0.982422f, 0.014641f, + 0.983398f, 0.013092f, 0.983887f, 0.009377f, 0.982910f, 0.006584f, 0.981445f, 0.003464f, + 0.000000f, 1.000000f, 0.447021f, 0.812012f, 0.582031f, 0.693848f, 0.657227f, 0.609375f, + 0.709473f, 0.543945f, 0.748047f, 0.490967f, 0.777344f, 0.446533f, 0.799316f, 0.409180f, + 0.817871f, 0.377197f, 0.834473f, 0.348145f, 0.849609f, 0.322021f, 0.861816f, 0.299561f, + 0.871094f, 0.279541f, 0.881348f, 0.260986f, 0.888184f, 0.244629f, 0.894043f, 0.229736f, + 0.899902f, 0.215820f, 0.906250f, 0.202881f, 0.912109f, 0.190430f, 0.917969f, 0.178589f, + 0.921875f, 0.168335f, 0.926270f, 0.158447f, 0.929688f, 0.149414f, 0.934082f, 0.140747f, + 0.936523f, 0.133057f, 0.939941f, 0.125366f, 0.942383f, 0.118530f, 0.946289f, 0.111755f, + 0.947754f, 0.105713f, 0.950195f, 0.099854f, 0.952637f, 0.094238f, 0.954102f, 0.089233f, + 0.956543f, 0.084167f, 0.958008f, 0.079529f, 0.960449f, 0.075134f, 0.961426f, 0.070801f, + 0.962402f, 0.067139f, 0.964844f, 0.063049f, 0.965820f, 0.059509f, 0.967285f, 0.056091f, + 0.968262f, 0.053009f, 0.970215f, 0.049683f, 0.971191f, 0.046600f, 0.972168f, 0.043793f, + 0.972656f, 0.041473f, 0.974121f, 0.038757f, 0.975586f, 0.036011f, 0.975586f, 0.033783f, + 0.976562f, 0.031586f, 0.977539f, 0.029465f, 0.978027f, 0.027603f, 0.979004f, 0.025604f, + 0.980469f, 0.023544f, 0.981445f, 0.021545f, 0.981934f, 0.019913f, 0.982422f, 0.018250f, + 0.982910f, 0.016953f, 0.983398f, 0.015610f, 0.984863f, 0.013802f, 0.985840f, 0.012192f, + 0.986328f, 0.010574f, 0.986816f, 0.009506f, 0.984863f, 0.005833f, 0.984375f, 0.002514f, + 0.000000f, 1.000000f, 0.456543f, 0.808105f, 0.593262f, 0.687988f, 0.671387f, 0.601562f, + 0.723633f, 0.535156f, 0.761230f, 0.481201f, 0.789062f, 0.437256f, 0.812012f, 0.399170f, + 0.831055f, 0.366455f, 0.845215f, 0.338623f, 0.860840f, 0.312012f, 0.872559f, 0.289062f, + 0.880859f, 0.269531f, 0.888184f, 0.251221f, 0.896973f, 0.234497f, 0.902344f, 0.220093f, + 0.909180f, 0.205933f, 0.914062f, 0.193726f, 0.919922f, 0.181396f, 0.925293f, 0.169800f, + 0.929199f, 0.159790f, 0.933105f, 0.149780f, 0.937012f, 0.140991f, 0.940918f, 0.132446f, + 0.942871f, 0.124939f, 0.945801f, 0.117615f, 0.948730f, 0.110779f, 0.951660f, 0.104248f, + 0.953125f, 0.098511f, 0.956055f, 0.092773f, 0.957520f, 0.087280f, 0.958496f, 0.082764f, + 0.960938f, 0.077698f, 0.962891f, 0.073120f, 0.963867f, 0.069092f, 0.965820f, 0.064941f, + 0.967285f, 0.061127f, 0.967773f, 0.057831f, 0.969727f, 0.054016f, 0.970703f, 0.050781f, + 0.971680f, 0.047760f, 0.972168f, 0.045135f, 0.974121f, 0.042206f, 0.975586f, 0.039154f, + 0.976074f, 0.036804f, 0.977051f, 0.034576f, 0.978027f, 0.032227f, 0.978516f, 0.030182f, + 0.979492f, 0.028137f, 0.980957f, 0.025925f, 0.981934f, 0.023773f, 0.981934f, 0.022247f, + 0.982422f, 0.020798f, 0.983398f, 0.019073f, 0.983887f, 0.017639f, 0.984375f, 0.016296f, + 0.985840f, 0.014397f, 0.986328f, 0.012909f, 0.986816f, 0.011711f, 0.987793f, 0.010468f, + 0.987305f, 0.009644f, 0.988281f, 0.008430f, 0.986816f, 0.005436f, 0.986328f, 0.001083f, + 0.000000f, 1.000000f, 0.464844f, 0.805176f, 0.605957f, 0.681641f, 0.683594f, 0.594238f, + 0.736328f, 0.526367f, 0.772949f, 0.472656f, 0.802246f, 0.427734f, 0.824219f, 0.389404f, + 0.841797f, 0.356934f, 0.857422f, 0.328613f, 0.869629f, 0.302979f, 0.879395f, 0.280762f, + 0.889648f, 0.260254f, 0.897949f, 0.242188f, 0.905273f, 0.225708f, 0.911133f, 0.211060f, + 0.916504f, 0.197388f, 0.921387f, 0.185181f, 0.926270f, 0.173462f, 0.930176f, 0.162476f, + 0.936035f, 0.151489f, 0.938965f, 0.142334f, 0.943848f, 0.133301f, 0.944824f, 0.125488f, + 0.947754f, 0.118042f, 0.951660f, 0.110413f, 0.952637f, 0.104309f, 0.956055f, 0.097778f, + 0.957520f, 0.091919f, 0.959473f, 0.086731f, 0.961426f, 0.081482f, 0.963379f, 0.076477f, + 0.964844f, 0.071899f, 0.965820f, 0.067871f, 0.967773f, 0.063721f, 0.969727f, 0.059448f, + 0.969727f, 0.056274f, 0.971680f, 0.052887f, 0.972656f, 0.049469f, 0.974121f, 0.046417f, + 0.975098f, 0.043365f, 0.976562f, 0.040466f, 0.976562f, 0.038116f, 0.977539f, 0.035675f, + 0.978516f, 0.033478f, 0.979980f, 0.030914f, 0.980957f, 0.028610f, 0.981445f, 0.026749f, + 0.982422f, 0.024734f, 0.982910f, 0.023010f, 0.982910f, 0.021652f, 0.983887f, 0.019958f, + 0.984375f, 0.018295f, 0.985840f, 0.016586f, 0.986328f, 0.014992f, 0.987305f, 0.013573f, + 0.987305f, 0.012466f, 0.987793f, 0.011497f, 0.988281f, 0.010406f, 0.988770f, 0.009445f, + 0.989258f, 0.008270f, 0.990234f, 0.007000f, 0.991211f, 0.004940f, 0.988281f, 0.001047f, + 0.000000f, 1.000000f, 0.473633f, 0.801758f, 0.616699f, 0.675781f, 0.695801f, 0.586914f, + 0.748535f, 0.518066f, 0.786133f, 0.463867f, 0.812500f, 0.419434f, 0.835449f, 0.380859f, + 0.852051f, 0.348389f, 0.864746f, 0.320557f, 0.877930f, 0.294678f, 0.889648f, 0.271729f, + 0.897949f, 0.251709f, 0.905273f, 0.234009f, 0.912598f, 0.217651f, 0.918945f, 0.202759f, + 0.924316f, 0.189697f, 0.927734f, 0.177490f, 0.931641f, 0.166260f, 0.936523f, 0.155396f, + 0.940918f, 0.144897f, 0.944824f, 0.135742f, 0.947754f, 0.126953f, 0.950684f, 0.118896f, + 0.953613f, 0.111450f, 0.956055f, 0.104492f, 0.958008f, 0.098206f, 0.959961f, 0.092163f, + 0.961914f, 0.086243f, 0.963379f, 0.081238f, 0.965332f, 0.076111f, 0.966797f, 0.071533f, + 0.969238f, 0.066833f, 0.969727f, 0.062805f, 0.970215f, 0.059326f, 0.972168f, 0.055359f, + 0.974609f, 0.051636f, 0.975098f, 0.048370f, 0.976074f, 0.045227f, 0.976562f, 0.042542f, + 0.977539f, 0.039825f, 0.978516f, 0.037170f, 0.980469f, 0.034485f, 0.980957f, 0.031982f, + 0.981934f, 0.029755f, 0.982422f, 0.027771f, 0.982422f, 0.025894f, 0.982910f, 0.024261f, + 0.983887f, 0.022324f, 0.984375f, 0.020706f, 0.985352f, 0.019089f, 0.986816f, 0.016953f, + 0.986816f, 0.015732f, 0.987305f, 0.014519f, 0.987793f, 0.013290f, 0.988281f, 0.012192f, + 0.988281f, 0.011436f, 0.989258f, 0.010147f, 0.989746f, 0.009201f, 0.990723f, 0.007805f, + 0.991699f, 0.006325f, 0.992188f, 0.005371f, 0.992676f, 0.004707f, 0.989746f, 0.001203f, + 0.000000f, 1.000000f, 0.483154f, 0.797852f, 0.629883f, 0.669434f, 0.708984f, 0.579590f, + 0.761230f, 0.510254f, 0.796387f, 0.456299f, 0.823242f, 0.411377f, 0.845215f, 0.372559f, + 0.862305f, 0.339600f, 0.875488f, 0.311768f, 0.886230f, 0.287354f, 0.897949f, 0.263916f, + 0.906738f, 0.244141f, 0.913574f, 0.226318f, 0.919434f, 0.210327f, 0.924805f, 0.195679f, + 0.930176f, 0.182495f, 0.933594f, 0.170654f, 0.937988f, 0.159302f, 0.939941f, 0.149780f, + 0.945312f, 0.139038f, 0.948730f, 0.129883f, 0.952148f, 0.121033f, 0.954590f, 0.113281f, + 0.957031f, 0.106079f, 0.959961f, 0.098999f, 0.961914f, 0.092712f, 0.962891f, 0.087158f, + 0.965820f, 0.081360f, 0.966797f, 0.076233f, 0.968750f, 0.071289f, 0.969238f, 0.067139f, + 0.971191f, 0.062744f, 0.973145f, 0.058472f, 0.974121f, 0.054840f, 0.975586f, 0.051025f, + 0.975586f, 0.048096f, 0.977539f, 0.044922f, 0.978027f, 0.041870f, 0.979980f, 0.038940f, + 0.980957f, 0.036041f, 0.981445f, 0.033600f, 0.981445f, 0.031525f, 0.982910f, 0.029282f, + 0.982910f, 0.027328f, 0.983398f, 0.025513f, 0.984375f, 0.023590f, 0.986328f, 0.021347f, + 0.986816f, 0.019516f, 0.986816f, 0.018127f, 0.987793f, 0.016678f, 0.987793f, 0.015381f, + 0.988281f, 0.014320f, 0.988770f, 0.013016f, 0.989258f, 0.011940f, 0.990234f, 0.010872f, + 0.990723f, 0.009674f, 0.990723f, 0.008629f, 0.992188f, 0.006966f, 0.992188f, 0.006294f, + 0.992676f, 0.005501f, 0.992676f, 0.005138f, 0.993164f, 0.004486f, 0.991699f, 0.001573f, + 0.000000f, 1.000000f, 0.491211f, 0.794922f, 0.641602f, 0.663574f, 0.721191f, 0.572266f, + 0.771973f, 0.503906f, 0.807129f, 0.448730f, 0.835449f, 0.403076f, 0.853027f, 0.365723f, + 0.871582f, 0.332031f, 0.883789f, 0.304199f, 0.894043f, 0.279785f, 0.904785f, 0.257080f, + 0.912109f, 0.237427f, 0.919922f, 0.219360f, 0.925781f, 0.203491f, 0.931152f, 0.189209f, + 0.935059f, 0.176270f, 0.938965f, 0.164307f, 0.943359f, 0.153198f, 0.945312f, 0.143799f, + 0.949219f, 0.134033f, 0.953125f, 0.124817f, 0.956543f, 0.116089f, 0.958984f, 0.108215f, + 0.961426f, 0.101074f, 0.962891f, 0.094666f, 0.965820f, 0.088013f, 0.966797f, 0.082458f, + 0.969238f, 0.076965f, 0.969727f, 0.072205f, 0.972656f, 0.067200f, 0.973633f, 0.062622f, + 0.974609f, 0.058777f, 0.975586f, 0.054871f, 0.976074f, 0.051514f, 0.978027f, 0.047882f, + 0.979492f, 0.044373f, 0.980469f, 0.041199f, 0.980957f, 0.038574f, 0.981445f, 0.035980f, + 0.982422f, 0.033478f, 0.983398f, 0.031204f, 0.983398f, 0.029175f, 0.985352f, 0.026779f, + 0.986328f, 0.024384f, 0.986328f, 0.022659f, 0.987305f, 0.020706f, 0.987305f, 0.019318f, + 0.987793f, 0.017899f, 0.987793f, 0.016479f, 0.988281f, 0.015190f, 0.989258f, 0.013985f, + 0.989258f, 0.012787f, 0.989746f, 0.011673f, 0.991211f, 0.010223f, 0.992188f, 0.008713f, + 0.992188f, 0.007851f, 0.992676f, 0.006889f, 0.992676f, 0.006378f, 0.993164f, 0.005615f, + 0.993652f, 0.005020f, 0.993652f, 0.004612f, 0.993652f, 0.003990f, 0.994629f, 0.002947f, + 0.000000f, 1.000000f, 0.500488f, 0.791504f, 0.651855f, 0.658203f, 0.732422f, 0.566406f, + 0.781738f, 0.497070f, 0.816895f, 0.442139f, 0.843750f, 0.396240f, 0.862305f, 0.358398f, + 0.879395f, 0.325195f, 0.891602f, 0.297363f, 0.902344f, 0.272705f, 0.910645f, 0.250977f, + 0.918945f, 0.230957f, 0.925293f, 0.213379f, 0.932129f, 0.197510f, 0.935547f, 0.183472f, + 0.940430f, 0.170288f, 0.943359f, 0.158813f, 0.947754f, 0.147705f, 0.950195f, 0.138184f, + 0.953125f, 0.128906f, 0.956543f, 0.120117f, 0.958984f, 0.112061f, 0.961914f, 0.104004f, + 0.963867f, 0.096863f, 0.965820f, 0.090332f, 0.967773f, 0.084351f, 0.970703f, 0.078308f, + 0.971191f, 0.073181f, 0.973145f, 0.068115f, 0.974121f, 0.063782f, 0.975098f, 0.059570f, + 0.977539f, 0.055420f, 0.978516f, 0.051300f, 0.979492f, 0.047791f, 0.979980f, 0.044556f, + 0.980469f, 0.041718f, 0.981934f, 0.038635f, 0.982422f, 0.036133f, 0.983887f, 0.033539f, + 0.984375f, 0.030914f, 0.985840f, 0.028259f, 0.986328f, 0.026077f, 0.986816f, 0.024139f, + 0.986816f, 0.022522f, 0.987793f, 0.020676f, 0.987793f, 0.019257f, 0.988281f, 0.017822f, + 0.989258f, 0.016281f, 0.989258f, 0.015053f, 0.990234f, 0.013611f, 0.991211f, 0.012207f, + 0.992188f, 0.010643f, 0.992676f, 0.009323f, 0.992676f, 0.008507f, 0.993164f, 0.007610f, + 0.993164f, 0.006977f, 0.993652f, 0.006245f, 0.993652f, 0.005745f, 0.993652f, 0.005070f, + 0.994141f, 0.004536f, 0.994141f, 0.004101f, 0.995117f, 0.003157f, 0.996094f, 0.001987f, + 0.000000f, 1.000000f, 0.510742f, 0.787109f, 0.663574f, 0.652344f, 0.743652f, 0.560059f, + 0.794922f, 0.489502f, 0.827148f, 0.434570f, 0.852051f, 0.389648f, 0.871094f, 0.351562f, + 0.886719f, 0.318848f, 0.898926f, 0.290771f, 0.908203f, 0.266602f, 0.915039f, 0.245850f, + 0.924316f, 0.225464f, 0.930664f, 0.207764f, 0.937012f, 0.191772f, 0.940430f, 0.178101f, + 0.945312f, 0.164917f, 0.948242f, 0.153442f, 0.952148f, 0.142700f, 0.954590f, 0.133423f, + 0.956543f, 0.124512f, 0.959473f, 0.116028f, 0.961914f, 0.108215f, 0.964844f, 0.100403f, + 0.967773f, 0.093201f, 0.970215f, 0.086243f, 0.971680f, 0.080444f, 0.972656f, 0.075012f, + 0.974121f, 0.069946f, 0.975586f, 0.065063f, 0.978027f, 0.060211f, 0.978516f, 0.056000f, + 0.979004f, 0.052399f, 0.980469f, 0.048584f, 0.980957f, 0.045502f, 0.982422f, 0.042084f, + 0.982910f, 0.039246f, 0.984863f, 0.035950f, 0.985352f, 0.033173f, 0.986328f, 0.030548f, + 0.986328f, 0.028473f, 0.986816f, 0.026428f, 0.987793f, 0.024429f, 0.987793f, 0.022659f, + 0.988770f, 0.020782f, 0.988770f, 0.019257f, 0.988770f, 0.017807f, 0.989746f, 0.016083f, + 0.990723f, 0.014519f, 0.992188f, 0.012581f, 0.992188f, 0.011375f, 0.992676f, 0.010284f, + 0.992676f, 0.009338f, 0.992676f, 0.008629f, 0.993164f, 0.007706f, 0.993164f, 0.007145f, + 0.993652f, 0.006336f, 0.994141f, 0.005703f, 0.994141f, 0.005177f, 0.994629f, 0.004509f, + 0.995117f, 0.003876f, 0.995605f, 0.003214f, 0.996582f, 0.002230f, 0.998047f, 0.000039f, + 0.000000f, 1.000000f, 0.519043f, 0.784180f, 0.675293f, 0.646973f, 0.755371f, 0.553223f, + 0.802734f, 0.483643f, 0.837402f, 0.428223f, 0.860352f, 0.383301f, 0.879395f, 0.345215f, + 0.892090f, 0.313721f, 0.905762f, 0.284912f, 0.914551f, 0.260498f, 0.921875f, 0.239624f, + 0.928711f, 0.220703f, 0.936035f, 0.202759f, 0.941895f, 0.186890f, 0.945312f, 0.172974f, + 0.949707f, 0.160156f, 0.952637f, 0.148682f, 0.955566f, 0.138428f, 0.958496f, 0.128784f, + 0.959961f, 0.120239f, 0.961914f, 0.112183f, 0.965332f, 0.104431f, 0.966797f, 0.097229f, + 0.969238f, 0.090088f, 0.971191f, 0.083740f, 0.973145f, 0.077698f, 0.976074f, 0.071655f, + 0.977051f, 0.066528f, 0.978027f, 0.061951f, 0.979004f, 0.057739f, 0.979980f, 0.053680f, + 0.980957f, 0.050018f, 0.982422f, 0.046143f, 0.983887f, 0.042603f, 0.984863f, 0.039093f, + 0.985352f, 0.036469f, 0.985840f, 0.033661f, 0.986328f, 0.031281f, 0.986816f, 0.028976f, + 0.987305f, 0.026855f, 0.988281f, 0.024704f, 0.988770f, 0.022858f, 0.989746f, 0.020950f, + 0.990234f, 0.019073f, 0.991699f, 0.017212f, 0.992188f, 0.015175f, 0.992188f, 0.013878f, + 0.992676f, 0.012512f, 0.992676f, 0.011513f, 0.993164f, 0.010384f, 0.993164f, 0.009560f, + 0.993652f, 0.008598f, 0.993652f, 0.007912f, 0.994141f, 0.007061f, 0.994141f, 0.006516f, + 0.994629f, 0.005733f, 0.995117f, 0.005028f, 0.995605f, 0.004395f, 0.996094f, 0.003757f, + 0.996094f, 0.002979f, 0.997070f, 0.002041f, 0.998535f, 0.000240f, 0.998535f, 0.000003f, + 0.000000f, 1.000000f, 0.527832f, 0.780762f, 0.684082f, 0.642578f, 0.764160f, 0.547852f, + 0.812500f, 0.477783f, 0.843750f, 0.422852f, 0.868164f, 0.377441f, 0.886230f, 0.339355f, + 0.899902f, 0.307617f, 0.911621f, 0.279541f, 0.920898f, 0.255127f, 0.927734f, 0.234253f, + 0.933105f, 0.215942f, 0.939941f, 0.198242f, 0.945312f, 0.182617f, 0.949219f, 0.168579f, + 0.953125f, 0.156128f, 0.957031f, 0.144409f, 0.958984f, 0.134399f, 0.960938f, 0.125122f, + 0.963867f, 0.116028f, 0.965332f, 0.108154f, 0.966797f, 0.101074f, 0.968750f, 0.094421f, + 0.970703f, 0.087952f, 0.973633f, 0.080750f, 0.975586f, 0.074829f, 0.976562f, 0.069458f, + 0.978027f, 0.064453f, 0.979492f, 0.059937f, 0.980957f, 0.055389f, 0.982910f, 0.050812f, + 0.983398f, 0.046997f, 0.984375f, 0.043518f, 0.984863f, 0.040405f, 0.985352f, 0.037506f, + 0.985840f, 0.034821f, 0.986816f, 0.032104f, 0.987305f, 0.029785f, 0.988281f, 0.027313f, + 0.989258f, 0.025101f, 0.989746f, 0.022873f, 0.991699f, 0.020355f, 0.991699f, 0.018433f, + 0.992188f, 0.016846f, 0.992188f, 0.015388f, 0.992676f, 0.014084f, 0.992676f, 0.012863f, + 0.993164f, 0.011726f, 0.993164f, 0.010712f, 0.993652f, 0.009682f, 0.993652f, 0.008865f, + 0.994141f, 0.007927f, 0.994141f, 0.007278f, 0.994629f, 0.006413f, 0.995117f, 0.005615f, + 0.995605f, 0.004871f, 0.996094f, 0.004139f, 0.996582f, 0.003366f, 0.997070f, 0.002584f, + 0.999023f, 0.000851f, 0.999023f, 0.000255f, 0.999023f, 0.000056f, 0.999023f, 0.000001f, + 0.000000f, 1.000000f, 0.536621f, 0.777344f, 0.695801f, 0.636719f, 0.774414f, 0.542480f, + 0.821289f, 0.471924f, 0.851562f, 0.416992f, 0.875488f, 0.371826f, 0.893066f, 0.334229f, + 0.905762f, 0.302490f, 0.916504f, 0.275146f, 0.926270f, 0.250244f, 0.932617f, 0.229370f, + 0.937500f, 0.211182f, 0.942383f, 0.194824f, 0.948730f, 0.178955f, 0.953613f, 0.164429f, + 0.956055f, 0.152222f, 0.958984f, 0.141113f, 0.962402f, 0.130371f, 0.964355f, 0.121338f, + 0.966309f, 0.112976f, 0.968262f, 0.105103f, 0.970703f, 0.097351f, 0.971680f, 0.090881f, + 0.972656f, 0.084961f, 0.974121f, 0.079407f, 0.976074f, 0.073608f, 0.978516f, 0.067688f, + 0.981445f, 0.061859f, 0.982422f, 0.057129f, 0.982910f, 0.053009f, 0.983887f, 0.049103f, + 0.984375f, 0.045593f, 0.985352f, 0.042145f, 0.986328f, 0.038910f, 0.987305f, 0.035889f, + 0.987793f, 0.033142f, 0.989258f, 0.030258f, 0.991211f, 0.027222f, 0.991211f, 0.024750f, + 0.991699f, 0.022583f, 0.991699f, 0.020828f, 0.992188f, 0.019012f, 0.992676f, 0.017410f, + 0.992676f, 0.015991f, 0.993164f, 0.014557f, 0.993164f, 0.013405f, 0.993652f, 0.012123f, + 0.994141f, 0.010986f, 0.994141f, 0.010017f, 0.994629f, 0.008949f, 0.995117f, 0.007988f, + 0.995117f, 0.007233f, 0.995605f, 0.006310f, 0.996094f, 0.005432f, 0.996582f, 0.004585f, + 0.997070f, 0.003532f, 0.998047f, 0.002377f, 0.999023f, 0.001024f, 0.999023f, 0.000561f, + 0.999023f, 0.000288f, 0.999023f, 0.000121f, 0.999023f, 0.000029f, 0.999023f, 0.000000f, + 0.000000f, 1.000000f, 0.546875f, 0.773438f, 0.705566f, 0.632324f, 0.782227f, 0.537598f, + 0.827637f, 0.467285f, 0.860352f, 0.411377f, 0.882812f, 0.366455f, 0.897949f, 0.329834f, + 0.912109f, 0.297363f, 0.920410f, 0.270752f, 0.929688f, 0.246704f, 0.937500f, 0.224854f, + 0.941895f, 0.207031f, 0.947754f, 0.190063f, 0.950684f, 0.175903f, 0.956055f, 0.161865f, + 0.959961f, 0.148682f, 0.962402f, 0.137695f, 0.965332f, 0.127441f, 0.968750f, 0.117493f, + 0.969727f, 0.109253f, 0.970703f, 0.101868f, 0.972656f, 0.094788f, 0.974121f, 0.088257f, + 0.976074f, 0.081970f, 0.977539f, 0.075928f, 0.978027f, 0.070923f, 0.978516f, 0.066406f, + 0.980957f, 0.061340f, 0.982422f, 0.056458f, 0.983398f, 0.052124f, 0.984375f, 0.048096f, + 0.985840f, 0.044220f, 0.987305f, 0.040497f, 0.989258f, 0.036713f, 0.989746f, 0.033386f, + 0.990234f, 0.030594f, 0.990723f, 0.028076f, 0.991211f, 0.025787f, 0.991699f, 0.023804f, + 0.991699f, 0.021835f, 0.992188f, 0.019974f, 0.992676f, 0.018265f, 0.992676f, 0.016815f, + 0.993164f, 0.015274f, 0.993652f, 0.013832f, 0.994141f, 0.012505f, 0.994629f, 0.011330f, + 0.994629f, 0.010185f, 0.995117f, 0.009026f, 0.995605f, 0.007919f, 0.996094f, 0.006863f, + 0.997070f, 0.005650f, 0.998047f, 0.004478f, 0.999512f, 0.002747f, 0.999512f, 0.001852f, + 0.999512f, 0.001303f, 0.999512f, 0.000901f, 0.999512f, 0.000597f, 0.999512f, 0.000368f, + 0.999512f, 0.000201f, 0.999512f, 0.000087f, 0.999512f, 0.000021f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.555664f, 0.770020f, 0.714844f, 0.627930f, 0.791992f, 0.531738f, + 0.837402f, 0.461670f, 0.868164f, 0.406250f, 0.888184f, 0.362061f, 0.905273f, 0.324219f, + 0.916016f, 0.293457f, 0.927734f, 0.265625f, 0.933594f, 0.242798f, 0.940918f, 0.221802f, + 0.946777f, 0.203003f, 0.952148f, 0.185913f, 0.955078f, 0.171753f, 0.957520f, 0.159058f, + 0.961426f, 0.146851f, 0.965332f, 0.134766f, 0.967773f, 0.124573f, 0.969727f, 0.115417f, + 0.972168f, 0.106750f, 0.975586f, 0.098083f, 0.976074f, 0.091064f, 0.977051f, 0.084839f, + 0.977539f, 0.079163f, 0.978516f, 0.073914f, 0.979004f, 0.069031f, 0.979980f, 0.064392f, + 0.980957f, 0.059998f, 0.982422f, 0.055725f, 0.983887f, 0.051178f, 0.986328f, 0.046539f, + 0.987305f, 0.042542f, 0.988281f, 0.039032f, 0.988770f, 0.035858f, 0.989258f, 0.033020f, + 0.990234f, 0.030258f, 0.990723f, 0.027756f, 0.991211f, 0.025452f, 0.991699f, 0.023285f, + 0.992188f, 0.021271f, 0.992676f, 0.019379f, 0.993164f, 0.017578f, 0.993652f, 0.015900f, + 0.994141f, 0.014305f, 0.995117f, 0.012695f, 0.995605f, 0.011139f, 0.996094f, 0.009712f, + 0.997070f, 0.008133f, 0.999023f, 0.006161f, 0.999512f, 0.004524f, 0.999512f, 0.003595f, + 0.999512f, 0.002872f, 0.999512f, 0.002279f, 0.999512f, 0.001782f, 0.999512f, 0.001365f, + 0.999512f, 0.001016f, 0.999512f, 0.000727f, 0.999512f, 0.000493f, 0.999512f, 0.000308f, + 0.999512f, 0.000170f, 0.999512f, 0.000074f, 0.999512f, 0.000018f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.561523f, 0.768066f, 0.722168f, 0.624512f, 0.799316f, 0.527832f, + 0.844238f, 0.457275f, 0.873047f, 0.402588f, 0.895508f, 0.356934f, 0.910645f, 0.320068f, + 0.921387f, 0.289307f, 0.930176f, 0.262451f, 0.937012f, 0.239136f, 0.944336f, 0.218628f, + 0.952637f, 0.197998f, 0.952637f, 0.183838f, 0.954590f, 0.171387f, 0.962402f, 0.155518f, + 0.968262f, 0.140869f, 0.968262f, 0.130981f, 0.968262f, 0.122559f, 0.968262f, 0.115051f, + 0.968262f, 0.108215f, 0.973633f, 0.099670f, 0.979980f, 0.089417f, 0.983887f, 0.079895f, + 0.983887f, 0.073853f, 0.983887f, 0.068726f, 0.983887f, 0.064148f, 0.983887f, 0.060028f, + 0.983887f, 0.056274f, 0.983887f, 0.052795f, 0.983887f, 0.049622f, 0.983887f, 0.046692f, + 0.983887f, 0.043976f, 0.983887f, 0.041443f, 0.983887f, 0.039124f, 0.983887f, 0.036987f, + 0.983887f, 0.034973f, 0.983887f, 0.033142f, 0.988770f, 0.029465f, 0.995117f, 0.023483f, + 0.999512f, 0.017349f, 0.999512f, 0.014488f, 0.999512f, 0.012405f, 0.999512f, 0.010712f, + 0.999512f, 0.009277f, 0.999512f, 0.008026f, 0.999512f, 0.006931f, 0.999512f, 0.005959f, + 0.999512f, 0.005089f, 0.999512f, 0.004318f, 0.999512f, 0.003630f, 0.999512f, 0.003019f, + 0.999512f, 0.002478f, 0.999512f, 0.002003f, 0.999512f, 0.001587f, 0.999512f, 0.001227f, + 0.999512f, 0.000921f, 0.999512f, 0.000663f, 0.999512f, 0.000452f, 0.999512f, 0.000283f, + 0.999512f, 0.000157f, 0.999512f, 0.000068f, 0.999512f, 0.000017f, 0.999512f, 0.000000f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.994629f, 0.000000f, 0.994629f, 0.000000f, 0.994629f, 0.000000f, 0.993652f, + 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.991211f, 0.000000f, 0.990234f, + 0.000000f, 0.989746f, 0.000000f, 0.988770f, 0.000000f, 0.988281f, 0.000000f, 0.987305f, + 0.000000f, 0.985840f, 0.000000f, 0.984863f, 0.000000f, 0.983398f, 0.000000f, 0.981934f, + 0.000000f, 0.980469f, 0.000000f, 0.978516f, 0.000000f, 0.976074f, 0.000000f, 0.974609f, + 0.000000f, 0.971191f, 0.000000f, 0.968262f, 0.000000f, 0.965332f, 0.000000f, 0.961426f, + 0.000000f, 0.956543f, 0.000000f, 0.951172f, 0.000000f, 0.945801f, 0.000000f, 0.935547f, + 0.000000f, 0.925781f, 0.000000f, 0.914062f, 0.000000f, 0.895508f, 0.000000f, 0.871094f, + 0.000000f, 0.834961f, 0.000000f, 0.773438f, 0.000000f, 0.648926f, 0.000000f, 0.289062f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, + 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.990723f, + 0.000000f, 0.989746f, 0.000000f, 0.989258f, 0.000000f, 0.987793f, 0.000000f, 0.986816f, + 0.000000f, 0.986328f, 0.000000f, 0.984375f, 0.000000f, 0.983398f, 0.000000f, 0.981445f, + 0.000000f, 0.980469f, 0.000000f, 0.978516f, 0.000000f, 0.976562f, 0.000000f, 0.973633f, + 0.000000f, 0.971680f, 0.000000f, 0.968262f, 0.000000f, 0.964844f, 0.000000f, 0.960938f, + 0.000000f, 0.956543f, 0.000000f, 0.950684f, 0.000000f, 0.944336f, 0.000000f, 0.936035f, + 0.000000f, 0.926758f, 0.000000f, 0.913086f, 0.000000f, 0.895508f, 0.000000f, 0.871582f, + 0.000000f, 0.834473f, 0.000000f, 0.773438f, 0.000000f, 0.649414f, 0.000000f, 0.288818f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.993164f, + 0.000000f, 0.992676f, 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.990234f, + 0.000000f, 0.989746f, 0.000000f, 0.988281f, 0.000000f, 0.987793f, 0.000000f, 0.986816f, + 0.000000f, 0.985840f, 0.000000f, 0.984863f, 0.000000f, 0.982910f, 0.000000f, 0.981445f, + 0.000000f, 0.979492f, 0.000000f, 0.978516f, 0.000000f, 0.976074f, 0.000000f, 0.973633f, + 0.000000f, 0.971191f, 0.000000f, 0.968262f, 0.000000f, 0.964844f, 0.000000f, 0.960938f, + 0.000000f, 0.955566f, 0.000000f, 0.951172f, 0.000000f, 0.943359f, 0.000000f, 0.936035f, + 0.000000f, 0.925293f, 0.000000f, 0.912598f, 0.000000f, 0.894531f, 0.000000f, 0.870605f, + 0.000006f, 0.833496f, 0.000010f, 0.772461f, 0.000008f, 0.648438f, 0.000008f, 0.288574f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, + 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, + 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.991699f, 0.000000f, 0.990723f, + 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.987305f, 0.000000f, 0.986816f, + 0.000000f, 0.985352f, 0.000000f, 0.983887f, 0.000000f, 0.983398f, 0.000000f, 0.981445f, + 0.000000f, 0.979980f, 0.000000f, 0.977539f, 0.000000f, 0.975586f, 0.000000f, 0.973633f, + 0.000000f, 0.970215f, 0.000000f, 0.967773f, 0.000000f, 0.963867f, 0.000000f, 0.959961f, + 0.000000f, 0.955566f, 0.000000f, 0.950195f, 0.000000f, 0.943359f, 0.000000f, 0.935059f, + 0.000002f, 0.924316f, 0.000040f, 0.911621f, 0.000050f, 0.894531f, 0.000046f, 0.869629f, + 0.000037f, 0.832520f, 0.000038f, 0.771484f, 0.000034f, 0.647461f, 0.000048f, 0.288574f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, + 0.000000f, 0.994141f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992676f, + 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.990234f, + 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.987305f, 0.000000f, 0.986328f, + 0.000000f, 0.984863f, 0.000000f, 0.983398f, 0.000000f, 0.982422f, 0.000000f, 0.981445f, + 0.000000f, 0.979004f, 0.000000f, 0.977051f, 0.000000f, 0.975098f, 0.000000f, 0.972656f, + 0.000000f, 0.970215f, 0.000000f, 0.966797f, 0.000000f, 0.963867f, 0.000004f, 0.958984f, + 0.000046f, 0.955078f, 0.000106f, 0.948730f, 0.000137f, 0.941895f, 0.000143f, 0.934082f, + 0.000137f, 0.923340f, 0.000123f, 0.910156f, 0.000104f, 0.892090f, 0.000097f, 0.867676f, + 0.000106f, 0.830566f, 0.000104f, 0.770020f, 0.000115f, 0.645996f, 0.000159f, 0.288574f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, + 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, + 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992188f, + 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.990234f, 0.000000f, 0.989746f, + 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.986816f, 0.000000f, 0.985352f, + 0.000000f, 0.984375f, 0.000000f, 0.982910f, 0.000000f, 0.981934f, 0.000000f, 0.980469f, + 0.000000f, 0.979004f, 0.000006f, 0.976562f, 0.000049f, 0.974121f, 0.000107f, 0.972168f, + 0.000173f, 0.969727f, 0.000252f, 0.965820f, 0.000304f, 0.961914f, 0.000314f, 0.958496f, + 0.000311f, 0.953613f, 0.000291f, 0.947754f, 0.000272f, 0.940918f, 0.000242f, 0.932617f, + 0.000210f, 0.922363f, 0.000218f, 0.908203f, 0.000246f, 0.891602f, 0.000224f, 0.865723f, + 0.000236f, 0.828613f, 0.000253f, 0.767090f, 0.000292f, 0.643555f, 0.000375f, 0.287598f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, + 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.991699f, + 0.000000f, 0.990723f, 0.000000f, 0.990234f, 0.000000f, 0.989746f, 0.000000f, 0.989258f, + 0.000000f, 0.988770f, 0.000000f, 0.987793f, 0.000000f, 0.986328f, 0.000035f, 0.985352f, + 0.000091f, 0.983887f, 0.000156f, 0.982422f, 0.000232f, 0.980957f, 0.000312f, 0.979492f, + 0.000395f, 0.978027f, 0.000480f, 0.975586f, 0.000554f, 0.973145f, 0.000570f, 0.970703f, + 0.000570f, 0.968750f, 0.000544f, 0.964844f, 0.000521f, 0.960938f, 0.000485f, 0.957520f, + 0.000441f, 0.952148f, 0.000400f, 0.945801f, 0.000381f, 0.938965f, 0.000429f, 0.930664f, + 0.000463f, 0.919922f, 0.000434f, 0.905762f, 0.000452f, 0.888672f, 0.000465f, 0.862793f, + 0.000487f, 0.825684f, 0.000551f, 0.764648f, 0.000658f, 0.641602f, 0.000727f, 0.287598f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, + 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, + 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.991211f, + 0.000034f, 0.990234f, 0.000091f, 0.989746f, 0.000167f, 0.989746f, 0.000245f, 0.988281f, + 0.000331f, 0.987793f, 0.000414f, 0.986816f, 0.000508f, 0.985840f, 0.000592f, 0.984863f, + 0.000685f, 0.982910f, 0.000777f, 0.981445f, 0.000857f, 0.979980f, 0.000911f, 0.978516f, + 0.000914f, 0.976562f, 0.000883f, 0.975098f, 0.000852f, 0.972656f, 0.000809f, 0.970215f, + 0.000752f, 0.966309f, 0.000697f, 0.963867f, 0.000645f, 0.959961f, 0.000637f, 0.955566f, + 0.000673f, 0.950684f, 0.000732f, 0.943848f, 0.000761f, 0.937012f, 0.000726f, 0.928711f, + 0.000751f, 0.917480f, 0.000775f, 0.903320f, 0.000820f, 0.885254f, 0.000855f, 0.859863f, + 0.000935f, 0.822754f, 0.001027f, 0.761230f, 0.001259f, 0.638672f, 0.001232f, 0.287109f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, + 0.000000f, 0.995605f, 0.000024f, 0.995117f, 0.000093f, 0.994629f, 0.000174f, 0.994141f, + 0.000262f, 0.993164f, 0.000355f, 0.992188f, 0.000454f, 0.991699f, 0.000539f, 0.990723f, + 0.000645f, 0.990234f, 0.000741f, 0.989746f, 0.000824f, 0.988281f, 0.000926f, 0.987793f, + 0.001020f, 0.986816f, 0.001103f, 0.985840f, 0.001187f, 0.984863f, 0.001285f, 0.983887f, + 0.001313f, 0.982422f, 0.001288f, 0.980957f, 0.001254f, 0.979004f, 0.001206f, 0.977051f, + 0.001139f, 0.975586f, 0.001061f, 0.973633f, 0.000997f, 0.972168f, 0.000975f, 0.967773f, + 0.000974f, 0.965332f, 0.001003f, 0.961914f, 0.001057f, 0.958496f, 0.001117f, 0.953125f, + 0.001145f, 0.948730f, 0.001167f, 0.942383f, 0.001165f, 0.934570f, 0.001213f, 0.925781f, + 0.001296f, 0.915039f, 0.001301f, 0.900879f, 0.001404f, 0.882324f, 0.001483f, 0.855957f, + 0.001650f, 0.818848f, 0.001833f, 0.757812f, 0.002214f, 0.635742f, 0.001906f, 0.287109f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000047f, 0.996094f, + 0.000143f, 0.996094f, 0.000244f, 0.995605f, 0.000353f, 0.995605f, 0.000449f, 0.995605f, + 0.000572f, 0.994629f, 0.000674f, 0.994629f, 0.000766f, 0.994141f, 0.000885f, 0.993652f, + 0.000984f, 0.992676f, 0.001068f, 0.991699f, 0.001168f, 0.991211f, 0.001270f, 0.990723f, + 0.001357f, 0.989258f, 0.001431f, 0.988281f, 0.001523f, 0.987793f, 0.001617f, 0.986816f, + 0.001698f, 0.985840f, 0.001721f, 0.984375f, 0.001691f, 0.983398f, 0.001654f, 0.982910f, + 0.001585f, 0.981445f, 0.001496f, 0.979980f, 0.001397f, 0.978027f, 0.001406f, 0.976074f, + 0.001396f, 0.973633f, 0.001430f, 0.972168f, 0.001470f, 0.969238f, 0.001474f, 0.966797f, + 0.001557f, 0.963379f, 0.001629f, 0.959961f, 0.001714f, 0.956055f, 0.001678f, 0.951660f, + 0.001768f, 0.945801f, 0.001828f, 0.939941f, 0.001842f, 0.932129f, 0.001952f, 0.922852f, + 0.002094f, 0.911133f, 0.002110f, 0.896973f, 0.002304f, 0.878418f, 0.002434f, 0.852539f, + 0.002714f, 0.814453f, 0.003059f, 0.752930f, 0.003597f, 0.632324f, 0.002754f, 0.286865f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000027f, 0.997559f, 0.000131f, 0.997559f, 0.000248f, 0.997070f, + 0.000387f, 0.997070f, 0.000514f, 0.996582f, 0.000621f, 0.996094f, 0.000764f, 0.995605f, + 0.000876f, 0.995605f, 0.000966f, 0.995605f, 0.001093f, 0.995605f, 0.001204f, 0.994629f, + 0.001294f, 0.994141f, 0.001368f, 0.993652f, 0.001486f, 0.993164f, 0.001585f, 0.992676f, + 0.001666f, 0.992188f, 0.001733f, 0.991699f, 0.001820f, 0.990723f, 0.001919f, 0.989258f, + 0.001999f, 0.988770f, 0.002064f, 0.987793f, 0.002108f, 0.987305f, 0.002106f, 0.985840f, + 0.002058f, 0.984375f, 0.001984f, 0.983887f, 0.001900f, 0.982422f, 0.001882f, 0.981445f, + 0.001940f, 0.979980f, 0.001935f, 0.978516f, 0.001980f, 0.976562f, 0.002047f, 0.974609f, + 0.001980f, 0.972656f, 0.002090f, 0.969727f, 0.002176f, 0.967285f, 0.002317f, 0.964844f, + 0.002331f, 0.961426f, 0.002422f, 0.957520f, 0.002544f, 0.953613f, 0.002468f, 0.949219f, + 0.002621f, 0.942871f, 0.002783f, 0.937012f, 0.002794f, 0.928711f, 0.002975f, 0.919922f, + 0.003170f, 0.907715f, 0.003275f, 0.893066f, 0.003574f, 0.873535f, 0.003830f, 0.847656f, + 0.004234f, 0.809570f, 0.004757f, 0.747559f, 0.005520f, 0.628418f, 0.003780f, 0.285889f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000102f, 0.998047f, 0.000284f, 0.998047f, 0.000417f, 0.998047f, + 0.000606f, 0.997559f, 0.000735f, 0.997070f, 0.000863f, 0.997070f, 0.001017f, 0.996582f, + 0.001127f, 0.996582f, 0.001209f, 0.996094f, 0.001348f, 0.995605f, 0.001465f, 0.995605f, + 0.001553f, 0.995605f, 0.001619f, 0.995117f, 0.001728f, 0.994141f, 0.001839f, 0.993652f, + 0.001923f, 0.993164f, 0.001987f, 0.993164f, 0.002039f, 0.992676f, 0.002150f, 0.992188f, + 0.002245f, 0.991211f, 0.002316f, 0.990723f, 0.002371f, 0.989746f, 0.002415f, 0.989258f, + 0.002478f, 0.987793f, 0.002478f, 0.987305f, 0.002476f, 0.985352f, 0.002516f, 0.984375f, + 0.002474f, 0.983398f, 0.002546f, 0.982422f, 0.002649f, 0.981445f, 0.002626f, 0.979980f, + 0.002687f, 0.978027f, 0.002762f, 0.976562f, 0.002665f, 0.975098f, 0.002789f, 0.973145f, + 0.003000f, 0.970703f, 0.003017f, 0.968262f, 0.003206f, 0.965332f, 0.003342f, 0.962402f, + 0.003263f, 0.958984f, 0.003431f, 0.955078f, 0.003626f, 0.950684f, 0.003599f, 0.945801f, + 0.003780f, 0.939941f, 0.004051f, 0.933105f, 0.004108f, 0.924805f, 0.004383f, 0.915527f, + 0.004662f, 0.903320f, 0.004910f, 0.888184f, 0.005352f, 0.868164f, 0.005867f, 0.842285f, + 0.006401f, 0.803711f, 0.007095f, 0.742188f, 0.008057f, 0.624023f, 0.004993f, 0.285156f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000081f, 0.998535f, 0.000302f, 0.998535f, 0.000503f, 0.998535f, + 0.000695f, 0.998047f, 0.000876f, 0.998047f, 0.000982f, 0.998047f, 0.001150f, 0.997559f, + 0.001296f, 0.997070f, 0.001388f, 0.996582f, 0.001451f, 0.996582f, 0.001623f, 0.996582f, + 0.001734f, 0.995605f, 0.001808f, 0.995605f, 0.001862f, 0.995605f, 0.001980f, 0.995117f, + 0.002098f, 0.994629f, 0.002176f, 0.994141f, 0.002234f, 0.993652f, 0.002275f, 0.993164f, + 0.002382f, 0.992676f, 0.002489f, 0.992188f, 0.002562f, 0.991699f, 0.002615f, 0.991211f, + 0.002659f, 0.990234f, 0.002787f, 0.989746f, 0.003012f, 0.989258f, 0.003216f, 0.988281f, + 0.003222f, 0.987305f, 0.003229f, 0.985840f, 0.003298f, 0.984375f, 0.003304f, 0.982910f, + 0.003435f, 0.981934f, 0.003376f, 0.980957f, 0.003464f, 0.979492f, 0.003538f, 0.978027f, + 0.003477f, 0.976074f, 0.003742f, 0.975098f, 0.003778f, 0.972656f, 0.003975f, 0.970703f, + 0.004223f, 0.968750f, 0.004154f, 0.965332f, 0.004326f, 0.962891f, 0.004601f, 0.959473f, + 0.004822f, 0.956055f, 0.004776f, 0.952637f, 0.005104f, 0.947754f, 0.005302f, 0.942383f, + 0.005474f, 0.936523f, 0.005756f, 0.928711f, 0.006172f, 0.921387f, 0.006298f, 0.910645f, + 0.006702f, 0.898438f, 0.007130f, 0.882812f, 0.007660f, 0.863281f, 0.008499f, 0.836426f, + 0.009254f, 0.797363f, 0.010170f, 0.736816f, 0.011246f, 0.618652f, 0.006378f, 0.284424f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000264f, 0.999023f, + 0.000602f, 0.999023f, 0.000731f, 0.998535f, 0.001012f, 0.998535f, 0.001136f, 0.998535f, + 0.001204f, 0.998047f, 0.001447f, 0.998047f, 0.001554f, 0.997559f, 0.001611f, 0.997070f, + 0.001727f, 0.996582f, 0.001894f, 0.996582f, 0.001978f, 0.996094f, 0.002029f, 0.996094f, + 0.002062f, 0.995605f, 0.002239f, 0.995117f, 0.002346f, 0.994629f, 0.002407f, 0.994141f, + 0.002447f, 0.993652f, 0.002476f, 0.993652f, 0.002623f, 0.992676f, 0.002729f, 0.992676f, + 0.002857f, 0.991699f, 0.003014f, 0.991211f, 0.003183f, 0.990234f, 0.003355f, 0.989746f, + 0.003656f, 0.989258f, 0.003870f, 0.988281f, 0.004047f, 0.987793f, 0.004227f, 0.987305f, + 0.004368f, 0.986328f, 0.004185f, 0.984375f, 0.004223f, 0.983398f, 0.004368f, 0.981934f, + 0.004330f, 0.980957f, 0.004547f, 0.979004f, 0.004528f, 0.977539f, 0.004745f, 0.976074f, + 0.004795f, 0.974121f, 0.005066f, 0.972168f, 0.005344f, 0.970703f, 0.005402f, 0.968262f, + 0.005703f, 0.966309f, 0.005959f, 0.963379f, 0.006004f, 0.959961f, 0.006271f, 0.956055f, + 0.006565f, 0.952637f, 0.006737f, 0.949219f, 0.007008f, 0.943848f, 0.007416f, 0.938477f, + 0.007626f, 0.931641f, 0.008102f, 0.924805f, 0.008652f, 0.916016f, 0.008797f, 0.905273f, + 0.009682f, 0.893555f, 0.010048f, 0.876953f, 0.010895f, 0.856934f, 0.012062f, 0.830078f, + 0.012970f, 0.790527f, 0.014359f, 0.729980f, 0.015228f, 0.614258f, 0.007942f, 0.284424f, + 0.000000f, 1.000000f, 0.000283f, 0.999512f, 0.000668f, 0.999023f, 0.000844f, 0.999023f, + 0.001106f, 0.999023f, 0.001267f, 0.998535f, 0.001311f, 0.998535f, 0.001565f, 0.998047f, + 0.001694f, 0.997559f, 0.001740f, 0.997559f, 0.001763f, 0.997070f, 0.002033f, 0.996582f, + 0.002125f, 0.996582f, 0.002167f, 0.996094f, 0.002190f, 0.996094f, 0.002348f, 0.995605f, + 0.002499f, 0.994629f, 0.002560f, 0.994141f, 0.002592f, 0.994141f, 0.002647f, 0.993652f, + 0.002880f, 0.993164f, 0.003187f, 0.992676f, 0.003418f, 0.991699f, 0.003588f, 0.991211f, + 0.003782f, 0.990723f, 0.003929f, 0.990234f, 0.004223f, 0.989258f, 0.004486f, 0.988281f, + 0.004658f, 0.987793f, 0.004787f, 0.987305f, 0.004955f, 0.986328f, 0.005135f, 0.985352f, + 0.005482f, 0.984375f, 0.005833f, 0.983398f, 0.005672f, 0.982422f, 0.005924f, 0.980469f, + 0.005871f, 0.978516f, 0.005802f, 0.977051f, 0.006145f, 0.975586f, 0.006302f, 0.973633f, + 0.006660f, 0.971680f, 0.006687f, 0.969727f, 0.007061f, 0.967285f, 0.007484f, 0.965820f, + 0.007687f, 0.962891f, 0.008286f, 0.960449f, 0.008484f, 0.957031f, 0.008606f, 0.952637f, + 0.009003f, 0.949219f, 0.009155f, 0.944824f, 0.009781f, 0.939453f, 0.010323f, 0.933594f, + 0.010620f, 0.926758f, 0.011230f, 0.919434f, 0.011917f, 0.910645f, 0.012451f, 0.899414f, + 0.013443f, 0.886230f, 0.014389f, 0.870605f, 0.015373f, 0.849609f, 0.016815f, 0.822266f, + 0.018066f, 0.782715f, 0.019653f, 0.722656f, 0.020294f, 0.608398f, 0.009796f, 0.283691f, + 0.000000f, 1.000000f, 0.000468f, 0.999512f, 0.000923f, 0.999023f, 0.001113f, 0.999023f, + 0.001366f, 0.999023f, 0.001387f, 0.998535f, 0.001693f, 0.998047f, 0.001807f, 0.997559f, + 0.001831f, 0.997559f, 0.001842f, 0.997070f, 0.002182f, 0.996582f, 0.002247f, 0.996094f, + 0.002270f, 0.996094f, 0.002281f, 0.995605f, 0.002510f, 0.995117f, 0.002722f, 0.994141f, + 0.002935f, 0.994141f, 0.003124f, 0.993652f, 0.003315f, 0.993652f, 0.003624f, 0.992676f, + 0.003979f, 0.992188f, 0.004162f, 0.991211f, 0.004307f, 0.990723f, 0.004482f, 0.990234f, + 0.004616f, 0.989746f, 0.004944f, 0.988770f, 0.005177f, 0.987793f, 0.005447f, 0.987305f, + 0.005699f, 0.986816f, 0.005943f, 0.985352f, 0.006218f, 0.984375f, 0.006699f, 0.983398f, + 0.007027f, 0.982422f, 0.007305f, 0.981445f, 0.007561f, 0.979980f, 0.007656f, 0.978516f, + 0.007450f, 0.977051f, 0.007889f, 0.974609f, 0.008018f, 0.972656f, 0.008438f, 0.971191f, + 0.008598f, 0.968750f, 0.009048f, 0.967285f, 0.009216f, 0.964355f, 0.009689f, 0.962402f, + 0.010208f, 0.958984f, 0.010872f, 0.956543f, 0.011383f, 0.953125f, 0.011360f, 0.948730f, + 0.011871f, 0.944336f, 0.012604f, 0.939941f, 0.013451f, 0.934570f, 0.013954f, 0.928223f, + 0.014702f, 0.921875f, 0.015388f, 0.913574f, 0.016068f, 0.904297f, 0.017151f, 0.893066f, + 0.018478f, 0.879395f, 0.019714f, 0.862793f, 0.021103f, 0.841797f, 0.022858f, 0.813477f, + 0.024536f, 0.773926f, 0.026413f, 0.714844f, 0.026642f, 0.602051f, 0.012016f, 0.282227f, + 0.000000f, 1.000000f, 0.000483f, 0.999512f, 0.000957f, 0.999023f, 0.001391f, 0.999023f, + 0.001421f, 0.999023f, 0.001425f, 0.998535f, 0.001857f, 0.997559f, 0.001879f, 0.997070f, + 0.001884f, 0.997070f, 0.001886f, 0.997070f, 0.002312f, 0.996582f, 0.002407f, 0.996094f, + 0.002625f, 0.995605f, 0.002810f, 0.994629f, 0.003429f, 0.994141f, 0.003607f, 0.994141f, + 0.003820f, 0.993652f, 0.003983f, 0.992676f, 0.004093f, 0.992188f, 0.004627f, 0.991211f, + 0.004807f, 0.990723f, 0.004925f, 0.990723f, 0.005051f, 0.989258f, 0.005360f, 0.988770f, + 0.005894f, 0.987793f, 0.006252f, 0.987305f, 0.006512f, 0.986328f, 0.006821f, 0.985352f, + 0.007072f, 0.984375f, 0.007339f, 0.983398f, 0.007820f, 0.982422f, 0.008232f, 0.981445f, + 0.008728f, 0.979980f, 0.009132f, 0.978516f, 0.009483f, 0.977539f, 0.009834f, 0.976074f, + 0.009956f, 0.974609f, 0.010094f, 0.972168f, 0.010612f, 0.970215f, 0.010773f, 0.967773f, + 0.011314f, 0.965332f, 0.011551f, 0.963379f, 0.012169f, 0.960938f, 0.012779f, 0.958008f, + 0.013603f, 0.955078f, 0.014061f, 0.951660f, 0.014893f, 0.948730f, 0.015343f, 0.944336f, + 0.015854f, 0.939453f, 0.016876f, 0.934570f, 0.017548f, 0.928711f, 0.018661f, 0.922363f, + 0.019592f, 0.915039f, 0.020508f, 0.906738f, 0.021973f, 0.897461f, 0.023499f, 0.885742f, + 0.024612f, 0.871094f, 0.026230f, 0.854492f, 0.028091f, 0.833008f, 0.030380f, 0.804199f, + 0.032776f, 0.765137f, 0.034912f, 0.706543f, 0.034424f, 0.596191f, 0.014549f, 0.281494f, + 0.000000f, 1.000000f, 0.000487f, 0.999512f, 0.000968f, 0.999023f, 0.001431f, 0.998535f, + 0.001442f, 0.998047f, 0.001442f, 0.998047f, 0.001902f, 0.997559f, 0.001909f, 0.997070f, + 0.002071f, 0.997070f, 0.002789f, 0.996094f, 0.003050f, 0.995605f, 0.003273f, 0.995117f, + 0.003405f, 0.994629f, 0.004002f, 0.994629f, 0.004215f, 0.993652f, 0.004314f, 0.993164f, + 0.004517f, 0.992676f, 0.004650f, 0.991699f, 0.005188f, 0.991211f, 0.005501f, 0.990234f, + 0.005878f, 0.989746f, 0.006168f, 0.988770f, 0.006428f, 0.987793f, 0.006653f, 0.987305f, + 0.007305f, 0.986328f, 0.007641f, 0.985352f, 0.007996f, 0.984375f, 0.008316f, 0.983398f, + 0.008682f, 0.982422f, 0.009125f, 0.981445f, 0.009880f, 0.979980f, 0.010239f, 0.979004f, + 0.010757f, 0.977539f, 0.011223f, 0.975586f, 0.011703f, 0.974609f, 0.012230f, 0.973145f, + 0.013145f, 0.971191f, 0.013092f, 0.969238f, 0.013313f, 0.966309f, 0.013916f, 0.964355f, + 0.014297f, 0.961914f, 0.014717f, 0.959473f, 0.015808f, 0.956543f, 0.016357f, 0.953125f, + 0.017151f, 0.950195f, 0.018295f, 0.946777f, 0.019104f, 0.942871f, 0.020248f, 0.938965f, + 0.020508f, 0.933594f, 0.021713f, 0.927734f, 0.022949f, 0.921875f, 0.024399f, 0.915527f, + 0.025558f, 0.907715f, 0.026520f, 0.898926f, 0.028717f, 0.889160f, 0.030579f, 0.876953f, + 0.032135f, 0.861816f, 0.035004f, 0.845215f, 0.037018f, 0.823242f, 0.039978f, 0.794922f, + 0.042419f, 0.755371f, 0.044800f, 0.697266f, 0.043121f, 0.589844f, 0.017395f, 0.280273f, + 0.000000f, 1.000000f, 0.000488f, 0.999512f, 0.000972f, 0.999023f, 0.000971f, 0.998535f, + 0.001451f, 0.998047f, 0.001614f, 0.997559f, 0.002438f, 0.997559f, 0.002659f, 0.996582f, + 0.002949f, 0.996094f, 0.003531f, 0.995605f, 0.003788f, 0.995117f, 0.003937f, 0.994629f, + 0.004017f, 0.994141f, 0.004654f, 0.993164f, 0.004913f, 0.992676f, 0.005222f, 0.991699f, + 0.005497f, 0.991211f, 0.005886f, 0.990723f, 0.006630f, 0.989746f, 0.006908f, 0.988770f, + 0.007088f, 0.988281f, 0.007408f, 0.986816f, 0.007881f, 0.986328f, 0.008659f, 0.985352f, + 0.009048f, 0.983887f, 0.009445f, 0.982910f, 0.009811f, 0.982422f, 0.010262f, 0.980957f, + 0.010788f, 0.979492f, 0.011696f, 0.978516f, 0.012161f, 0.977051f, 0.012642f, 0.975586f, + 0.013237f, 0.974609f, 0.013939f, 0.972656f, 0.014565f, 0.971191f, 0.015205f, 0.969238f, + 0.016235f, 0.967285f, 0.016907f, 0.965332f, 0.017075f, 0.962891f, 0.017609f, 0.959961f, + 0.018082f, 0.957031f, 0.018890f, 0.954590f, 0.019913f, 0.951172f, 0.021042f, 0.947754f, + 0.021851f, 0.944336f, 0.023163f, 0.940430f, 0.024094f, 0.936523f, 0.025558f, 0.932129f, + 0.026855f, 0.926758f, 0.027924f, 0.920410f, 0.029587f, 0.914551f, 0.031021f, 0.907227f, + 0.033051f, 0.899414f, 0.034515f, 0.890137f, 0.036804f, 0.879395f, 0.038910f, 0.866699f, + 0.041595f, 0.852051f, 0.044312f, 0.834473f, 0.047272f, 0.812012f, 0.050568f, 0.783691f, + 0.053680f, 0.745117f, 0.056000f, 0.687988f, 0.053253f, 0.582520f, 0.020523f, 0.279541f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000972f, 0.998535f, 0.001241f, 0.998535f, + 0.002151f, 0.998047f, 0.002401f, 0.997559f, 0.003136f, 0.996582f, 0.003218f, 0.996094f, + 0.003532f, 0.995605f, 0.004105f, 0.995117f, 0.004219f, 0.994141f, 0.004749f, 0.993652f, + 0.005089f, 0.993164f, 0.005863f, 0.992188f, 0.006104f, 0.991211f, 0.006577f, 0.990723f, + 0.006821f, 0.989746f, 0.007076f, 0.989258f, 0.007965f, 0.987793f, 0.008492f, 0.986816f, + 0.008896f, 0.986328f, 0.009338f, 0.984863f, 0.009697f, 0.983887f, 0.010536f, 0.982910f, + 0.011124f, 0.981934f, 0.011749f, 0.980469f, 0.012245f, 0.979492f, 0.012779f, 0.978027f, + 0.013306f, 0.976562f, 0.014290f, 0.975098f, 0.015060f, 0.973145f, 0.015808f, 0.971680f, + 0.016525f, 0.970215f, 0.017227f, 0.968750f, 0.017853f, 0.966797f, 0.019196f, 0.964355f, + 0.020248f, 0.962402f, 0.021164f, 0.959961f, 0.022064f, 0.958008f, 0.022339f, 0.955078f, + 0.023056f, 0.951660f, 0.024124f, 0.948730f, 0.025513f, 0.944824f, 0.026443f, 0.940918f, + 0.027924f, 0.937500f, 0.029053f, 0.933105f, 0.030701f, 0.929199f, 0.032074f, 0.924316f, + 0.034454f, 0.918945f, 0.035583f, 0.912109f, 0.037170f, 0.905762f, 0.039062f, 0.897949f, + 0.041504f, 0.890137f, 0.044312f, 0.880371f, 0.046631f, 0.868652f, 0.049683f, 0.855957f, + 0.052673f, 0.841309f, 0.055847f, 0.822754f, 0.059631f, 0.800293f, 0.063293f, 0.771484f, + 0.066772f, 0.733398f, 0.068726f, 0.677246f, 0.064270f, 0.575684f, 0.023956f, 0.278564f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.001137f, 0.999023f, 0.001858f, 0.998535f, + 0.002251f, 0.998047f, 0.002815f, 0.997070f, 0.003128f, 0.996094f, 0.003851f, 0.995605f, + 0.004227f, 0.994629f, 0.004791f, 0.994141f, 0.005646f, 0.993164f, 0.005867f, 0.992676f, + 0.006126f, 0.991211f, 0.007118f, 0.990723f, 0.007629f, 0.990234f, 0.008102f, 0.988770f, + 0.008438f, 0.987793f, 0.008934f, 0.987305f, 0.009979f, 0.985840f, 0.010483f, 0.984375f, + 0.011017f, 0.983887f, 0.011444f, 0.982910f, 0.012100f, 0.980957f, 0.013298f, 0.979980f, + 0.013916f, 0.978516f, 0.014526f, 0.977051f, 0.014999f, 0.976074f, 0.015808f, 0.974121f, + 0.017197f, 0.972656f, 0.017990f, 0.971191f, 0.018692f, 0.969238f, 0.019516f, 0.967285f, + 0.020493f, 0.965820f, 0.021423f, 0.963867f, 0.022812f, 0.961426f, 0.023941f, 0.958984f, + 0.025085f, 0.956543f, 0.026123f, 0.954590f, 0.027451f, 0.951660f, 0.028641f, 0.949219f, + 0.029221f, 0.945312f, 0.030762f, 0.941406f, 0.031921f, 0.937500f, 0.033142f, 0.933594f, + 0.034912f, 0.929199f, 0.036346f, 0.924805f, 0.038330f, 0.920410f, 0.040619f, 0.914551f, + 0.042999f, 0.909180f, 0.044800f, 0.902832f, 0.046875f, 0.895020f, 0.049530f, 0.887695f, + 0.052032f, 0.878906f, 0.055542f, 0.868652f, 0.057953f, 0.856445f, 0.061829f, 0.843750f, + 0.065002f, 0.828125f, 0.068970f, 0.810059f, 0.073425f, 0.787109f, 0.077759f, 0.758789f, + 0.081726f, 0.721680f, 0.083008f, 0.666016f, 0.075928f, 0.567383f, 0.027557f, 0.277832f, + 0.000000f, 1.000000f, 0.000567f, 0.999512f, 0.000938f, 0.999023f, 0.001864f, 0.998047f, + 0.002388f, 0.997559f, 0.003700f, 0.996582f, 0.004051f, 0.995605f, 0.004917f, 0.994629f, + 0.005440f, 0.994141f, 0.005817f, 0.993164f, 0.006748f, 0.991699f, 0.007397f, 0.991211f, + 0.008080f, 0.990234f, 0.008881f, 0.988770f, 0.009285f, 0.987793f, 0.009972f, 0.987305f, + 0.010849f, 0.985352f, 0.011360f, 0.984375f, 0.012276f, 0.983398f, 0.012993f, 0.981934f, + 0.013771f, 0.980469f, 0.014633f, 0.979492f, 0.015686f, 0.977539f, 0.016388f, 0.976074f, + 0.017349f, 0.974609f, 0.018112f, 0.973145f, 0.019073f, 0.971680f, 0.019943f, 0.969727f, + 0.021378f, 0.967773f, 0.022430f, 0.965820f, 0.023331f, 0.963867f, 0.024429f, 0.961914f, + 0.025589f, 0.959961f, 0.026825f, 0.957520f, 0.028534f, 0.955078f, 0.029800f, 0.952637f, + 0.031235f, 0.949707f, 0.032562f, 0.947266f, 0.034027f, 0.944336f, 0.035767f, 0.941406f, + 0.037903f, 0.937500f, 0.038879f, 0.933105f, 0.040375f, 0.929199f, 0.041870f, 0.924316f, + 0.043610f, 0.920410f, 0.045807f, 0.915527f, 0.047943f, 0.909668f, 0.051025f, 0.903809f, + 0.053436f, 0.897461f, 0.056458f, 0.891602f, 0.058563f, 0.883301f, 0.061310f, 0.875000f, + 0.064819f, 0.865234f, 0.068787f, 0.854980f, 0.071655f, 0.842773f, 0.076111f, 0.829590f, + 0.080139f, 0.813965f, 0.084229f, 0.795898f, 0.089355f, 0.772949f, 0.093872f, 0.744629f, + 0.097778f, 0.708496f, 0.098633f, 0.654785f, 0.088623f, 0.559082f, 0.031372f, 0.277344f, + 0.000000f, 1.000000f, 0.000956f, 0.999512f, 0.001315f, 0.998535f, 0.002008f, 0.998535f, + 0.003145f, 0.997070f, 0.004131f, 0.996094f, 0.004803f, 0.995117f, 0.005970f, 0.993652f, + 0.006893f, 0.992676f, 0.007431f, 0.991699f, 0.008705f, 0.990234f, 0.009399f, 0.988770f, + 0.009949f, 0.988281f, 0.010689f, 0.986816f, 0.012024f, 0.985352f, 0.012749f, 0.984375f, + 0.013504f, 0.982910f, 0.014328f, 0.981445f, 0.015587f, 0.979980f, 0.016495f, 0.978516f, + 0.017456f, 0.976562f, 0.018494f, 0.975098f, 0.019836f, 0.973633f, 0.020660f, 0.971680f, + 0.021729f, 0.970215f, 0.023041f, 0.968262f, 0.023987f, 0.965820f, 0.025314f, 0.964355f, + 0.026886f, 0.961914f, 0.028061f, 0.959473f, 0.029327f, 0.957520f, 0.030899f, 0.955078f, + 0.032257f, 0.952637f, 0.034271f, 0.950195f, 0.035797f, 0.947266f, 0.037323f, 0.944336f, + 0.039032f, 0.941406f, 0.040649f, 0.938477f, 0.042786f, 0.934570f, 0.044800f, 0.931152f, + 0.047302f, 0.927734f, 0.048981f, 0.923340f, 0.050446f, 0.918457f, 0.052338f, 0.914062f, + 0.054993f, 0.908691f, 0.057343f, 0.903320f, 0.060303f, 0.896973f, 0.063416f, 0.891113f, + 0.066162f, 0.884277f, 0.069702f, 0.877441f, 0.072632f, 0.870117f, 0.076050f, 0.860840f, + 0.079773f, 0.850586f, 0.084595f, 0.839844f, 0.088684f, 0.828125f, 0.092834f, 0.813965f, + 0.097168f, 0.798340f, 0.102417f, 0.779297f, 0.107727f, 0.757324f, 0.111877f, 0.729492f, + 0.115051f, 0.694336f, 0.114868f, 0.642090f, 0.102417f, 0.551270f, 0.035492f, 0.275635f, + 0.000000f, 1.000000f, 0.001254f, 0.999023f, 0.002310f, 0.998535f, 0.002735f, 0.997559f, + 0.003590f, 0.996582f, 0.004944f, 0.995117f, 0.005917f, 0.994141f, 0.007446f, 0.992188f, + 0.008385f, 0.991211f, 0.009384f, 0.989746f, 0.010559f, 0.988281f, 0.012100f, 0.986816f, + 0.012695f, 0.985352f, 0.013489f, 0.984375f, 0.015533f, 0.981934f, 0.016342f, 0.980469f, + 0.017181f, 0.979004f, 0.018341f, 0.977539f, 0.019989f, 0.975098f, 0.021271f, 0.973633f, + 0.022461f, 0.971680f, 0.023422f, 0.970215f, 0.025162f, 0.967773f, 0.026550f, 0.965820f, + 0.028046f, 0.963379f, 0.029434f, 0.961426f, 0.030701f, 0.958984f, 0.032684f, 0.956543f, + 0.034027f, 0.954590f, 0.035553f, 0.952148f, 0.037598f, 0.949219f, 0.039246f, 0.946289f, + 0.041046f, 0.943848f, 0.043304f, 0.939941f, 0.045135f, 0.937500f, 0.047028f, 0.934570f, + 0.049347f, 0.930664f, 0.051636f, 0.927246f, 0.053894f, 0.923340f, 0.056763f, 0.919434f, + 0.059143f, 0.915039f, 0.061768f, 0.911133f, 0.063477f, 0.906250f, 0.066162f, 0.900391f, + 0.068909f, 0.894531f, 0.071655f, 0.888672f, 0.075439f, 0.882324f, 0.078613f, 0.875977f, + 0.082336f, 0.869141f, 0.085876f, 0.861816f, 0.090393f, 0.853516f, 0.093445f, 0.843750f, + 0.098389f, 0.833496f, 0.102844f, 0.822266f, 0.107727f, 0.810547f, 0.111816f, 0.796387f, + 0.117432f, 0.781250f, 0.122375f, 0.761719f, 0.127686f, 0.740234f, 0.131958f, 0.713867f, + 0.134033f, 0.679199f, 0.132446f, 0.629395f, 0.116150f, 0.541504f, 0.039612f, 0.273438f, + 0.000000f, 1.000000f, 0.001420f, 0.999023f, 0.002686f, 0.998047f, 0.003748f, 0.997070f, + 0.005245f, 0.995605f, 0.006062f, 0.994141f, 0.008064f, 0.992676f, 0.009239f, 0.990723f, + 0.010887f, 0.989258f, 0.012329f, 0.987305f, 0.014015f, 0.985352f, 0.014992f, 0.983887f, + 0.016495f, 0.981934f, 0.018387f, 0.979492f, 0.019455f, 0.978027f, 0.021225f, 0.976074f, + 0.022354f, 0.974121f, 0.024307f, 0.972168f, 0.026154f, 0.969238f, 0.027573f, 0.967285f, + 0.028946f, 0.965332f, 0.030380f, 0.962891f, 0.032928f, 0.960449f, 0.034576f, 0.957520f, + 0.036285f, 0.955078f, 0.037872f, 0.953125f, 0.039703f, 0.950195f, 0.041748f, 0.947754f, + 0.044281f, 0.944824f, 0.046265f, 0.941406f, 0.048309f, 0.937988f, 0.050415f, 0.935059f, + 0.052521f, 0.932129f, 0.055115f, 0.928711f, 0.057343f, 0.924805f, 0.060333f, 0.920898f, + 0.062927f, 0.916992f, 0.065552f, 0.913086f, 0.068176f, 0.909180f, 0.071533f, 0.904297f, + 0.074402f, 0.899902f, 0.077332f, 0.895508f, 0.081055f, 0.890137f, 0.083618f, 0.884277f, + 0.086792f, 0.877930f, 0.090393f, 0.871582f, 0.093811f, 0.864746f, 0.097351f, 0.857910f, + 0.101562f, 0.851074f, 0.105957f, 0.842285f, 0.110840f, 0.834473f, 0.115051f, 0.824219f, + 0.119568f, 0.813965f, 0.124329f, 0.802734f, 0.129761f, 0.791016f, 0.134155f, 0.776855f, + 0.140015f, 0.761230f, 0.145264f, 0.742676f, 0.149780f, 0.722168f, 0.153320f, 0.696289f, + 0.154541f, 0.663574f, 0.151978f, 0.616211f, 0.131470f, 0.533203f, 0.044464f, 0.272461f, + 0.000000f, 1.000000f, 0.001528f, 0.999023f, 0.003845f, 0.997070f, 0.005600f, 0.995605f, + 0.006886f, 0.994141f, 0.008682f, 0.992676f, 0.010101f, 0.990723f, 0.011734f, 0.988770f, + 0.014336f, 0.986328f, 0.016708f, 0.983398f, 0.018539f, 0.981445f, 0.020187f, 0.979004f, + 0.022797f, 0.976562f, 0.024429f, 0.974121f, 0.025803f, 0.972168f, 0.028259f, 0.969238f, + 0.030441f, 0.967285f, 0.032379f, 0.963867f, 0.034424f, 0.961426f, 0.036316f, 0.958984f, + 0.038300f, 0.956055f, 0.040894f, 0.953125f, 0.043427f, 0.950195f, 0.045441f, 0.947266f, + 0.047516f, 0.944336f, 0.049561f, 0.941406f, 0.052124f, 0.938477f, 0.055328f, 0.934570f, + 0.057892f, 0.931152f, 0.060272f, 0.927734f, 0.062622f, 0.924316f, 0.065247f, 0.920898f, + 0.068298f, 0.916992f, 0.071350f, 0.913086f, 0.074707f, 0.908691f, 0.077576f, 0.904297f, + 0.080627f, 0.899902f, 0.083740f, 0.895996f, 0.087280f, 0.891113f, 0.090576f, 0.886719f, + 0.094360f, 0.881348f, 0.098389f, 0.875977f, 0.102173f, 0.870117f, 0.105530f, 0.864746f, + 0.108582f, 0.857910f, 0.112732f, 0.851074f, 0.116455f, 0.844238f, 0.120972f, 0.836914f, + 0.125732f, 0.828613f, 0.130737f, 0.820801f, 0.135376f, 0.812012f, 0.140625f, 0.802734f, + 0.144897f, 0.791992f, 0.149658f, 0.781250f, 0.154785f, 0.769531f, 0.159668f, 0.755371f, + 0.165405f, 0.739746f, 0.170166f, 0.722168f, 0.174316f, 0.702148f, 0.176758f, 0.678711f, + 0.177368f, 0.646973f, 0.171387f, 0.602051f, 0.146118f, 0.523926f, 0.048859f, 0.270020f, + 0.000000f, 1.000000f, 0.002544f, 0.998535f, 0.004772f, 0.997070f, 0.007710f, 0.994141f, + 0.009491f, 0.992188f, 0.012726f, 0.989258f, 0.014473f, 0.987305f, 0.017151f, 0.983887f, + 0.019028f, 0.981934f, 0.022507f, 0.979004f, 0.025543f, 0.975098f, 0.027527f, 0.972656f, + 0.030655f, 0.969238f, 0.033142f, 0.966309f, 0.036011f, 0.962891f, 0.038300f, 0.959961f, + 0.041534f, 0.956543f, 0.043701f, 0.953613f, 0.046478f, 0.950195f, 0.049713f, 0.946777f, + 0.052704f, 0.943359f, 0.055176f, 0.939941f, 0.057617f, 0.936523f, 0.060699f, 0.933105f, + 0.064087f, 0.929199f, 0.066895f, 0.925293f, 0.070190f, 0.921387f, 0.073608f, 0.917480f, + 0.076477f, 0.913574f, 0.079346f, 0.909668f, 0.082764f, 0.905762f, 0.086243f, 0.901367f, + 0.090454f, 0.896484f, 0.093811f, 0.892090f, 0.097168f, 0.887695f, 0.100525f, 0.883301f, + 0.104004f, 0.878906f, 0.107483f, 0.874023f, 0.112305f, 0.868652f, 0.116699f, 0.862793f, + 0.120728f, 0.857422f, 0.124756f, 0.851562f, 0.128784f, 0.845703f, 0.133057f, 0.840332f, + 0.136841f, 0.833496f, 0.140747f, 0.826660f, 0.145386f, 0.818848f, 0.150269f, 0.811035f, + 0.154785f, 0.802734f, 0.159790f, 0.794922f, 0.164917f, 0.786133f, 0.170166f, 0.777344f, + 0.174194f, 0.767578f, 0.179199f, 0.756348f, 0.184692f, 0.744141f, 0.189453f, 0.730957f, + 0.194214f, 0.716309f, 0.197632f, 0.699707f, 0.200562f, 0.681641f, 0.201538f, 0.658691f, + 0.200317f, 0.628906f, 0.192017f, 0.587402f, 0.162109f, 0.514648f, 0.053925f, 0.268311f, + 0.000000f, 1.000000f, 0.003534f, 0.998047f, 0.007156f, 0.995605f, 0.010788f, 0.992188f, + 0.014999f, 0.988281f, 0.018341f, 0.984863f, 0.022064f, 0.980957f, 0.025620f, 0.977539f, + 0.028030f, 0.974609f, 0.032074f, 0.970215f, 0.035797f, 0.966309f, 0.039429f, 0.962402f, + 0.043579f, 0.958008f, 0.047577f, 0.953613f, 0.051056f, 0.949707f, 0.054382f, 0.945801f, + 0.058167f, 0.941406f, 0.062408f, 0.937012f, 0.065552f, 0.933105f, 0.069153f, 0.929199f, + 0.072632f, 0.924805f, 0.076477f, 0.920410f, 0.080505f, 0.916016f, 0.084473f, 0.911621f, + 0.087891f, 0.907227f, 0.091736f, 0.903320f, 0.095093f, 0.898926f, 0.099365f, 0.894531f, + 0.103699f, 0.889648f, 0.107544f, 0.884766f, 0.111267f, 0.880371f, 0.115479f, 0.875488f, + 0.119690f, 0.870605f, 0.123413f, 0.865723f, 0.127075f, 0.860840f, 0.131592f, 0.855957f, + 0.136230f, 0.850098f, 0.140381f, 0.844727f, 0.145508f, 0.838867f, 0.149658f, 0.833496f, + 0.153809f, 0.828125f, 0.158081f, 0.822266f, 0.162231f, 0.816895f, 0.167114f, 0.810547f, + 0.172607f, 0.803711f, 0.176514f, 0.796387f, 0.180786f, 0.788574f, 0.185547f, 0.781250f, + 0.189819f, 0.773438f, 0.194214f, 0.765625f, 0.198853f, 0.757324f, 0.203735f, 0.749023f, + 0.208740f, 0.738770f, 0.213501f, 0.728027f, 0.217529f, 0.716309f, 0.222168f, 0.705078f, + 0.224854f, 0.690918f, 0.228149f, 0.676758f, 0.228882f, 0.659668f, 0.228638f, 0.637695f, + 0.225342f, 0.610840f, 0.213379f, 0.572754f, 0.178833f, 0.505859f, 0.058899f, 0.265869f, + 0.000000f, 1.000000f, 0.006603f, 0.996582f, 0.011757f, 0.992188f, 0.017883f, 0.987793f, + 0.022705f, 0.982910f, 0.029099f, 0.977051f, 0.033783f, 0.972168f, 0.039734f, 0.966309f, + 0.044830f, 0.961426f, 0.049103f, 0.956543f, 0.054657f, 0.950684f, 0.059479f, 0.945801f, + 0.065430f, 0.939941f, 0.070129f, 0.934570f, 0.076050f, 0.928711f, 0.081177f, 0.922852f, + 0.085632f, 0.917969f, 0.090088f, 0.913086f, 0.095093f, 0.907715f, 0.100403f, 0.902344f, + 0.105591f, 0.896973f, 0.109741f, 0.892090f, 0.113770f, 0.887207f, 0.118225f, 0.882324f, + 0.123718f, 0.876465f, 0.128540f, 0.871094f, 0.133301f, 0.866211f, 0.137939f, 0.860840f, + 0.142090f, 0.855957f, 0.146118f, 0.851562f, 0.150635f, 0.846191f, 0.155273f, 0.840820f, + 0.160767f, 0.834961f, 0.165527f, 0.829590f, 0.169922f, 0.824219f, 0.174072f, 0.819336f, + 0.178223f, 0.813965f, 0.183350f, 0.808594f, 0.187378f, 0.803223f, 0.191406f, 0.797852f, + 0.196655f, 0.791992f, 0.201294f, 0.785645f, 0.206177f, 0.779785f, 0.210938f, 0.773438f, + 0.215698f, 0.767090f, 0.219482f, 0.760742f, 0.222778f, 0.753418f, 0.226440f, 0.746582f, + 0.230103f, 0.739746f, 0.234253f, 0.732422f, 0.239868f, 0.723633f, 0.244019f, 0.715332f, + 0.248169f, 0.706543f, 0.250977f, 0.696777f, 0.253418f, 0.687012f, 0.256592f, 0.676758f, + 0.258057f, 0.664551f, 0.259521f, 0.652344f, 0.259766f, 0.635254f, 0.258057f, 0.615723f, + 0.251465f, 0.591797f, 0.235229f, 0.557129f, 0.194702f, 0.497559f, 0.064148f, 0.263428f, + 0.000000f, 1.000000f, 0.010880f, 0.994629f, 0.020630f, 0.987793f, 0.031250f, 0.979492f, + 0.041138f, 0.970703f, 0.048767f, 0.962891f, 0.059021f, 0.953613f, 0.066284f, 0.946289f, + 0.075073f, 0.937500f, 0.082520f, 0.930176f, 0.089600f, 0.923340f, 0.097046f, 0.915527f, + 0.103821f, 0.908203f, 0.111206f, 0.901367f, 0.117798f, 0.894531f, 0.126099f, 0.886230f, + 0.132202f, 0.879883f, 0.137817f, 0.873535f, 0.143188f, 0.867676f, 0.149536f, 0.861328f, + 0.155640f, 0.854980f, 0.161621f, 0.848633f, 0.166992f, 0.842773f, 0.172119f, 0.837402f, + 0.177490f, 0.831543f, 0.181763f, 0.826660f, 0.187012f, 0.820801f, 0.192993f, 0.814941f, + 0.198242f, 0.809570f, 0.203003f, 0.803711f, 0.207275f, 0.798828f, 0.211792f, 0.793945f, + 0.216309f, 0.788574f, 0.220093f, 0.783691f, 0.223755f, 0.779297f, 0.229370f, 0.773438f, + 0.234009f, 0.768066f, 0.239014f, 0.762207f, 0.243042f, 0.756836f, 0.247192f, 0.751465f, + 0.250977f, 0.746582f, 0.254395f, 0.741211f, 0.257812f, 0.736328f, 0.262207f, 0.730957f, + 0.265381f, 0.725586f, 0.269043f, 0.720215f, 0.272461f, 0.712891f, 0.275635f, 0.706055f, + 0.278564f, 0.699707f, 0.282715f, 0.692383f, 0.285400f, 0.685547f, 0.288086f, 0.678711f, + 0.290771f, 0.671875f, 0.291748f, 0.664062f, 0.292480f, 0.655762f, 0.293701f, 0.646973f, + 0.294189f, 0.635254f, 0.294678f, 0.623047f, 0.292236f, 0.608887f, 0.287354f, 0.592773f, + 0.277344f, 0.572266f, 0.256348f, 0.542969f, 0.210449f, 0.488037f, 0.069641f, 0.261475f, + 0.000000f, 1.000000f, 0.025513f, 0.987793f, 0.045685f, 0.974121f, 0.065308f, 0.958008f, + 0.083191f, 0.942383f, 0.100220f, 0.927246f, 0.112793f, 0.915039f, 0.126465f, 0.902344f, + 0.138916f, 0.890137f, 0.148438f, 0.879883f, 0.160400f, 0.868164f, 0.170044f, 0.858887f, + 0.177612f, 0.850098f, 0.184937f, 0.842285f, 0.194336f, 0.833496f, 0.203857f, 0.824219f, + 0.210571f, 0.816895f, 0.215820f, 0.810547f, 0.222412f, 0.803711f, 0.229126f, 0.796875f, + 0.236084f, 0.790039f, 0.241821f, 0.783691f, 0.247314f, 0.777832f, 0.251709f, 0.771973f, + 0.256592f, 0.766602f, 0.260010f, 0.762207f, 0.263916f, 0.757324f, 0.269531f, 0.752441f, + 0.274414f, 0.746582f, 0.279297f, 0.741211f, 0.283203f, 0.736816f, 0.286621f, 0.731934f, + 0.290527f, 0.727539f, 0.293457f, 0.723145f, 0.296875f, 0.718750f, 0.299561f, 0.714844f, + 0.302002f, 0.710938f, 0.305176f, 0.707031f, 0.308105f, 0.702637f, 0.312012f, 0.697754f, + 0.315430f, 0.693359f, 0.318848f, 0.688477f, 0.321777f, 0.684082f, 0.324219f, 0.679688f, + 0.326660f, 0.674805f, 0.328613f, 0.670410f, 0.330078f, 0.666504f, 0.330811f, 0.661133f, + 0.331543f, 0.656250f, 0.332520f, 0.651367f, 0.333252f, 0.646484f, 0.333496f, 0.641602f, + 0.335938f, 0.634766f, 0.336914f, 0.627441f, 0.336426f, 0.619629f, 0.336426f, 0.611816f, + 0.334229f, 0.603516f, 0.331055f, 0.594238f, 0.325439f, 0.583496f, 0.316406f, 0.570801f, + 0.302979f, 0.553711f, 0.277588f, 0.528809f, 0.228516f, 0.474121f, 0.075195f, 0.259521f, + 0.000000f, 1.000000f, 0.089172f, 0.960449f, 0.145508f, 0.919434f, 0.182373f, 0.887695f, + 0.211060f, 0.859863f, 0.229858f, 0.839844f, 0.251465f, 0.818848f, 0.264648f, 0.802734f, + 0.275879f, 0.789551f, 0.289551f, 0.774902f, 0.298584f, 0.763672f, 0.304932f, 0.754883f, + 0.310791f, 0.747070f, 0.318115f, 0.738770f, 0.325928f, 0.729980f, 0.331055f, 0.723145f, + 0.336670f, 0.716797f, 0.340576f, 0.710938f, 0.344727f, 0.705566f, 0.347412f, 0.700684f, + 0.350342f, 0.696289f, 0.352051f, 0.692871f, 0.357910f, 0.687500f, 0.362305f, 0.682129f, + 0.364990f, 0.678711f, 0.368164f, 0.674316f, 0.370605f, 0.670898f, 0.373047f, 0.667480f, + 0.375000f, 0.664062f, 0.376221f, 0.661133f, 0.377686f, 0.658691f, 0.378174f, 0.656250f, + 0.379883f, 0.653320f, 0.380371f, 0.650879f, 0.381348f, 0.648438f, 0.381592f, 0.646484f, + 0.382568f, 0.644043f, 0.382812f, 0.641602f, 0.385254f, 0.638184f, 0.386963f, 0.635254f, + 0.389160f, 0.631836f, 0.390625f, 0.628906f, 0.391846f, 0.625488f, 0.392578f, 0.622559f, + 0.393311f, 0.619629f, 0.393555f, 0.616699f, 0.393555f, 0.613770f, 0.392578f, 0.610352f, + 0.391602f, 0.606934f, 0.390869f, 0.603027f, 0.389893f, 0.599609f, 0.388184f, 0.596191f, + 0.385986f, 0.592773f, 0.383789f, 0.588867f, 0.379883f, 0.584473f, 0.376221f, 0.579102f, + 0.371826f, 0.574707f, 0.364746f, 0.567871f, 0.355469f, 0.560547f, 0.345215f, 0.549805f, + 0.330566f, 0.533203f, 0.303223f, 0.508301f, 0.248047f, 0.460205f, 0.080750f, 0.259033f, + 0.000000f, 1.000000f, 0.232544f, 0.900391f, 0.298096f, 0.839844f, 0.331299f, 0.799805f, + 0.352295f, 0.770508f, 0.368896f, 0.747070f, 0.380371f, 0.728027f, 0.389404f, 0.713379f, + 0.397217f, 0.700195f, 0.403076f, 0.689453f, 0.407715f, 0.680176f, 0.413574f, 0.670898f, + 0.417480f, 0.663574f, 0.420410f, 0.657227f, 0.423828f, 0.651367f, 0.425537f, 0.646484f, + 0.428223f, 0.641602f, 0.431152f, 0.636719f, 0.434570f, 0.631836f, 0.436523f, 0.627930f, + 0.437500f, 0.624512f, 0.439697f, 0.621094f, 0.441406f, 0.617676f, 0.442383f, 0.614746f, + 0.443848f, 0.612305f, 0.445312f, 0.609375f, 0.446533f, 0.606445f, 0.446777f, 0.604004f, + 0.448486f, 0.601562f, 0.448975f, 0.599609f, 0.448975f, 0.597168f, 0.450439f, 0.595215f, + 0.451172f, 0.592773f, 0.451660f, 0.590820f, 0.452393f, 0.588379f, 0.452393f, 0.586426f, + 0.452881f, 0.584473f, 0.453125f, 0.582520f, 0.453613f, 0.580566f, 0.453857f, 0.578125f, + 0.453613f, 0.576172f, 0.453369f, 0.574219f, 0.454590f, 0.571777f, 0.454102f, 0.569824f, + 0.454102f, 0.567383f, 0.453613f, 0.564941f, 0.452881f, 0.562988f, 0.452881f, 0.560547f, + 0.450928f, 0.556641f, 0.449707f, 0.553223f, 0.448486f, 0.549805f, 0.446533f, 0.546387f, + 0.444580f, 0.542969f, 0.443115f, 0.539551f, 0.439941f, 0.534668f, 0.436279f, 0.529297f, + 0.432617f, 0.523926f, 0.426025f, 0.517090f, 0.418701f, 0.509766f, 0.407959f, 0.499756f, + 0.392334f, 0.485596f, 0.367188f, 0.464844f, 0.314209f, 0.421631f, 0.146484f, 0.244019f, + 0.000000f, 1.000000f, 0.236572f, 0.898438f, 0.304443f, 0.836426f, 0.340576f, 0.794434f, + 0.363770f, 0.763184f, 0.382080f, 0.737793f, 0.394287f, 0.718262f, 0.403809f, 0.702148f, + 0.414551f, 0.687012f, 0.420898f, 0.675293f, 0.428223f, 0.664551f, 0.434082f, 0.654785f, + 0.439453f, 0.645996f, 0.443848f, 0.638672f, 0.448486f, 0.631348f, 0.451904f, 0.625000f, + 0.456055f, 0.619141f, 0.459717f, 0.613281f, 0.463623f, 0.607910f, 0.466797f, 0.602539f, + 0.469971f, 0.597656f, 0.473389f, 0.592773f, 0.475586f, 0.588867f, 0.478027f, 0.584961f, + 0.479980f, 0.581055f, 0.482422f, 0.577637f, 0.484619f, 0.573730f, 0.486572f, 0.570312f, + 0.487793f, 0.567383f, 0.489990f, 0.563965f, 0.490723f, 0.561035f, 0.493652f, 0.558105f, + 0.495605f, 0.554688f, 0.496826f, 0.551270f, 0.497803f, 0.548828f, 0.499023f, 0.545898f, + 0.500977f, 0.542480f, 0.502441f, 0.539551f, 0.503906f, 0.536621f, 0.504883f, 0.533691f, + 0.506836f, 0.530273f, 0.508301f, 0.526855f, 0.509766f, 0.523438f, 0.510254f, 0.520508f, + 0.511719f, 0.517090f, 0.512207f, 0.513672f, 0.514160f, 0.509766f, 0.514648f, 0.506348f, + 0.514648f, 0.501465f, 0.514160f, 0.497070f, 0.514160f, 0.492432f, 0.514648f, 0.487549f, + 0.515137f, 0.482666f, 0.515137f, 0.477295f, 0.515137f, 0.471436f, 0.513184f, 0.464355f, + 0.511230f, 0.456787f, 0.507812f, 0.448730f, 0.503906f, 0.438965f, 0.497803f, 0.426514f, + 0.488037f, 0.411133f, 0.469727f, 0.388428f, 0.429199f, 0.347900f, 0.287354f, 0.201904f, + 0.000000f, 1.000000f, 0.240356f, 0.896973f, 0.311523f, 0.833008f, 0.349609f, 0.789062f, + 0.375732f, 0.755859f, 0.395020f, 0.729004f, 0.409668f, 0.707520f, 0.422119f, 0.689453f, + 0.434082f, 0.672852f, 0.442383f, 0.659668f, 0.449463f, 0.647949f, 0.457520f, 0.636719f, + 0.463379f, 0.626953f, 0.468750f, 0.618164f, 0.474121f, 0.610352f, 0.478760f, 0.603027f, + 0.483643f, 0.595703f, 0.488281f, 0.589355f, 0.492920f, 0.583008f, 0.497314f, 0.576660f, + 0.502441f, 0.570312f, 0.505371f, 0.564941f, 0.509277f, 0.560059f, 0.512695f, 0.554688f, + 0.515137f, 0.550293f, 0.518555f, 0.545898f, 0.521973f, 0.541016f, 0.524414f, 0.537109f, + 0.526855f, 0.532715f, 0.529785f, 0.528320f, 0.532227f, 0.524414f, 0.536133f, 0.520020f, + 0.539062f, 0.516113f, 0.540527f, 0.512207f, 0.542969f, 0.508301f, 0.545898f, 0.504395f, + 0.547852f, 0.500488f, 0.550781f, 0.496338f, 0.554199f, 0.492188f, 0.555176f, 0.488281f, + 0.558105f, 0.484131f, 0.561035f, 0.479736f, 0.562012f, 0.475830f, 0.563965f, 0.471680f, + 0.566895f, 0.467285f, 0.569336f, 0.462402f, 0.571289f, 0.457764f, 0.573730f, 0.453125f, + 0.576172f, 0.447998f, 0.576660f, 0.441650f, 0.577637f, 0.436035f, 0.579590f, 0.429932f, + 0.580566f, 0.423584f, 0.582520f, 0.416748f, 0.584961f, 0.409668f, 0.584473f, 0.401611f, + 0.584473f, 0.392578f, 0.584473f, 0.383057f, 0.583008f, 0.371338f, 0.581055f, 0.358154f, + 0.574219f, 0.341309f, 0.562500f, 0.318604f, 0.534668f, 0.279541f, 0.420898f, 0.158325f, + 0.000000f, 1.000000f, 0.244019f, 0.895508f, 0.317871f, 0.829590f, 0.360596f, 0.782715f, + 0.389648f, 0.747070f, 0.410156f, 0.718750f, 0.425781f, 0.696289f, 0.438477f, 0.677246f, + 0.451660f, 0.659668f, 0.460693f, 0.645020f, 0.469727f, 0.631836f, 0.479980f, 0.619141f, + 0.487061f, 0.607910f, 0.494141f, 0.598145f, 0.499756f, 0.588867f, 0.505371f, 0.580566f, + 0.511719f, 0.572754f, 0.517090f, 0.564941f, 0.522461f, 0.557129f, 0.528320f, 0.549805f, + 0.533203f, 0.542969f, 0.536621f, 0.537109f, 0.541992f, 0.530762f, 0.545898f, 0.524902f, + 0.550781f, 0.519043f, 0.555176f, 0.513672f, 0.559082f, 0.507812f, 0.561523f, 0.502930f, + 0.565918f, 0.498047f, 0.569824f, 0.492920f, 0.573730f, 0.487793f, 0.577148f, 0.482910f, + 0.581055f, 0.477783f, 0.583008f, 0.473145f, 0.587402f, 0.468262f, 0.590332f, 0.463623f, + 0.593750f, 0.458740f, 0.597168f, 0.453613f, 0.601074f, 0.448730f, 0.604004f, 0.443848f, + 0.605957f, 0.439209f, 0.609863f, 0.434082f, 0.613770f, 0.428711f, 0.615723f, 0.423828f, + 0.619629f, 0.418213f, 0.623047f, 0.412842f, 0.625488f, 0.407471f, 0.628906f, 0.401611f, + 0.631836f, 0.395752f, 0.634277f, 0.389160f, 0.635254f, 0.382324f, 0.639160f, 0.375000f, + 0.642090f, 0.367432f, 0.644531f, 0.360107f, 0.646484f, 0.352295f, 0.648926f, 0.343750f, + 0.649902f, 0.333252f, 0.652344f, 0.322998f, 0.652344f, 0.310547f, 0.652344f, 0.296631f, + 0.649414f, 0.280029f, 0.642090f, 0.257324f, 0.621094f, 0.220337f, 0.536621f, 0.121216f, + 0.000000f, 1.000000f, 0.247437f, 0.894043f, 0.325684f, 0.825195f, 0.371338f, 0.776367f, + 0.401855f, 0.739746f, 0.422363f, 0.710449f, 0.441650f, 0.685547f, 0.456543f, 0.664062f, + 0.469971f, 0.645508f, 0.480957f, 0.629395f, 0.490234f, 0.615723f, 0.501953f, 0.601074f, + 0.510254f, 0.589355f, 0.518066f, 0.578125f, 0.525391f, 0.567871f, 0.532227f, 0.558105f, + 0.539551f, 0.548828f, 0.544922f, 0.540527f, 0.551270f, 0.532227f, 0.559570f, 0.523438f, + 0.563965f, 0.515625f, 0.569336f, 0.508789f, 0.575195f, 0.501465f, 0.579590f, 0.495117f, + 0.584961f, 0.488281f, 0.589844f, 0.481934f, 0.594238f, 0.475586f, 0.599121f, 0.469482f, + 0.603027f, 0.463867f, 0.607910f, 0.457764f, 0.612305f, 0.451904f, 0.616699f, 0.446289f, + 0.620605f, 0.440430f, 0.625488f, 0.434570f, 0.628418f, 0.429443f, 0.632324f, 0.423828f, + 0.637695f, 0.417969f, 0.641113f, 0.412354f, 0.644531f, 0.406982f, 0.648926f, 0.401123f, + 0.651367f, 0.395752f, 0.656250f, 0.389893f, 0.660156f, 0.384033f, 0.663574f, 0.378174f, + 0.667969f, 0.372070f, 0.670898f, 0.366211f, 0.675781f, 0.359863f, 0.678711f, 0.353516f, + 0.683105f, 0.347168f, 0.686035f, 0.340576f, 0.688965f, 0.332520f, 0.692383f, 0.324951f, + 0.695312f, 0.316650f, 0.698242f, 0.308594f, 0.701660f, 0.300049f, 0.704590f, 0.291260f, + 0.708008f, 0.281494f, 0.709961f, 0.269775f, 0.711914f, 0.258057f, 0.713867f, 0.244141f, + 0.711914f, 0.227661f, 0.707520f, 0.206665f, 0.694336f, 0.173340f, 0.628906f, 0.092407f, + 0.000000f, 1.000000f, 0.251709f, 0.892090f, 0.334229f, 0.820801f, 0.380615f, 0.770996f, + 0.413330f, 0.731934f, 0.438232f, 0.700195f, 0.457275f, 0.674316f, 0.473389f, 0.651855f, + 0.488770f, 0.631836f, 0.501465f, 0.614258f, 0.511719f, 0.598633f, 0.524414f, 0.583496f, + 0.533203f, 0.569824f, 0.541992f, 0.557617f, 0.551270f, 0.545898f, 0.557617f, 0.535645f, + 0.566895f, 0.525391f, 0.572754f, 0.516113f, 0.580078f, 0.506836f, 0.587891f, 0.497559f, + 0.594238f, 0.488770f, 0.600586f, 0.480713f, 0.605957f, 0.472656f, 0.611816f, 0.465332f, + 0.618652f, 0.457520f, 0.623535f, 0.450684f, 0.628906f, 0.443604f, 0.633789f, 0.436768f, + 0.639160f, 0.430176f, 0.644531f, 0.423584f, 0.649902f, 0.416748f, 0.652344f, 0.410889f, + 0.658691f, 0.404053f, 0.662598f, 0.398193f, 0.666992f, 0.392090f, 0.671875f, 0.385742f, + 0.677246f, 0.379150f, 0.680664f, 0.373291f, 0.685059f, 0.367188f, 0.689453f, 0.361084f, + 0.693359f, 0.354980f, 0.698730f, 0.348633f, 0.703125f, 0.342041f, 0.706543f, 0.335938f, + 0.710449f, 0.329346f, 0.714355f, 0.323242f, 0.718262f, 0.316406f, 0.723145f, 0.309570f, + 0.727051f, 0.302979f, 0.730469f, 0.295898f, 0.734375f, 0.288330f, 0.738770f, 0.279785f, + 0.741699f, 0.271484f, 0.743652f, 0.263428f, 0.748535f, 0.254883f, 0.752441f, 0.245850f, + 0.756836f, 0.236206f, 0.757812f, 0.224976f, 0.761719f, 0.213501f, 0.762207f, 0.200195f, + 0.762695f, 0.185181f, 0.760742f, 0.164429f, 0.749512f, 0.136719f, 0.702148f, 0.069824f, + 0.000000f, 1.000000f, 0.256592f, 0.890137f, 0.341309f, 0.817383f, 0.389893f, 0.765625f, + 0.425049f, 0.724609f, 0.451172f, 0.691406f, 0.473145f, 0.663086f, 0.491211f, 0.638672f, + 0.506836f, 0.617676f, 0.520508f, 0.598633f, 0.533691f, 0.581543f, 0.545410f, 0.565430f, + 0.555664f, 0.550781f, 0.566406f, 0.537598f, 0.575684f, 0.524902f, 0.583496f, 0.513672f, + 0.592773f, 0.502441f, 0.600586f, 0.492188f, 0.606445f, 0.482666f, 0.616699f, 0.471680f, + 0.623535f, 0.462158f, 0.630859f, 0.453369f, 0.637207f, 0.444580f, 0.644043f, 0.436035f, + 0.649414f, 0.428223f, 0.655762f, 0.420166f, 0.661133f, 0.412598f, 0.666016f, 0.405518f, + 0.673340f, 0.397949f, 0.679199f, 0.390381f, 0.683594f, 0.383545f, 0.687500f, 0.376953f, + 0.693848f, 0.369873f, 0.697754f, 0.363281f, 0.702637f, 0.356689f, 0.708984f, 0.349854f, + 0.712891f, 0.343018f, 0.718262f, 0.336426f, 0.721680f, 0.330322f, 0.726562f, 0.323730f, + 0.730469f, 0.317383f, 0.735840f, 0.310303f, 0.740234f, 0.303711f, 0.744629f, 0.297363f, + 0.748047f, 0.290771f, 0.753418f, 0.283936f, 0.757324f, 0.277344f, 0.761719f, 0.270264f, + 0.765625f, 0.263428f, 0.770508f, 0.256104f, 0.773926f, 0.249268f, 0.776855f, 0.240845f, + 0.780762f, 0.232422f, 0.783691f, 0.224487f, 0.787598f, 0.215942f, 0.791992f, 0.207031f, + 0.795410f, 0.197632f, 0.798340f, 0.187744f, 0.800293f, 0.176392f, 0.802734f, 0.164917f, + 0.803223f, 0.149902f, 0.802246f, 0.132690f, 0.793457f, 0.107910f, 0.758301f, 0.053741f, + 0.000000f, 1.000000f, 0.261963f, 0.887695f, 0.349365f, 0.812988f, 0.400391f, 0.759277f, + 0.437256f, 0.716309f, 0.466309f, 0.681641f, 0.488770f, 0.651855f, 0.507812f, 0.626465f, + 0.526367f, 0.603516f, 0.541016f, 0.583008f, 0.554688f, 0.564941f, 0.566895f, 0.547852f, + 0.579590f, 0.531738f, 0.589355f, 0.517578f, 0.599609f, 0.503906f, 0.609863f, 0.491211f, + 0.618164f, 0.479736f, 0.626465f, 0.468262f, 0.634766f, 0.458008f, 0.643555f, 0.446777f, + 0.650391f, 0.436768f, 0.658691f, 0.426758f, 0.666504f, 0.417480f, 0.672852f, 0.408447f, + 0.679199f, 0.399414f, 0.685547f, 0.391357f, 0.692383f, 0.383057f, 0.699219f, 0.375000f, + 0.702637f, 0.367432f, 0.708496f, 0.359619f, 0.715332f, 0.351807f, 0.719238f, 0.344971f, + 0.724609f, 0.337891f, 0.730957f, 0.330566f, 0.735352f, 0.323486f, 0.740723f, 0.316406f, + 0.745605f, 0.309570f, 0.750000f, 0.302979f, 0.754883f, 0.296143f, 0.758789f, 0.289795f, + 0.764648f, 0.282715f, 0.769043f, 0.275635f, 0.772949f, 0.269287f, 0.776367f, 0.262695f, + 0.780762f, 0.256104f, 0.785645f, 0.249512f, 0.790527f, 0.242432f, 0.794434f, 0.235596f, + 0.798340f, 0.228882f, 0.802246f, 0.221924f, 0.808105f, 0.214722f, 0.809570f, 0.207520f, + 0.813477f, 0.199341f, 0.816895f, 0.190918f, 0.820312f, 0.182739f, 0.823242f, 0.174683f, + 0.827148f, 0.165894f, 0.830566f, 0.157104f, 0.832520f, 0.146240f, 0.835449f, 0.135132f, + 0.836426f, 0.122559f, 0.835938f, 0.107117f, 0.829590f, 0.086182f, 0.802734f, 0.041168f, + 0.000000f, 1.000000f, 0.266357f, 0.885742f, 0.358154f, 0.808594f, 0.411377f, 0.752930f, + 0.449951f, 0.708496f, 0.480957f, 0.671875f, 0.504883f, 0.640137f, 0.525879f, 0.613281f, + 0.544434f, 0.589355f, 0.561035f, 0.567383f, 0.575684f, 0.547852f, 0.589355f, 0.530273f, + 0.600098f, 0.513672f, 0.613281f, 0.497559f, 0.624023f, 0.483154f, 0.633789f, 0.469971f, + 0.642578f, 0.457275f, 0.651367f, 0.445312f, 0.660156f, 0.434082f, 0.669922f, 0.422363f, + 0.677246f, 0.411621f, 0.685059f, 0.401611f, 0.693848f, 0.391113f, 0.701172f, 0.381348f, + 0.706055f, 0.372803f, 0.713379f, 0.363770f, 0.719727f, 0.355225f, 0.725586f, 0.346680f, + 0.731934f, 0.338623f, 0.738281f, 0.330322f, 0.743652f, 0.322754f, 0.747559f, 0.315674f, + 0.754883f, 0.307617f, 0.760254f, 0.300293f, 0.764160f, 0.293213f, 0.769531f, 0.285889f, + 0.774902f, 0.279053f, 0.778809f, 0.272217f, 0.783203f, 0.265625f, 0.789062f, 0.258301f, + 0.792969f, 0.251465f, 0.797363f, 0.244995f, 0.801758f, 0.238403f, 0.805664f, 0.231934f, + 0.809082f, 0.225586f, 0.815430f, 0.218506f, 0.818359f, 0.211914f, 0.822266f, 0.205078f, + 0.826660f, 0.198730f, 0.830566f, 0.192139f, 0.834473f, 0.185181f, 0.838379f, 0.178589f, + 0.840332f, 0.171021f, 0.843750f, 0.162842f, 0.847656f, 0.155151f, 0.849609f, 0.147583f, + 0.853516f, 0.139404f, 0.857422f, 0.131104f, 0.859375f, 0.121948f, 0.861328f, 0.111755f, + 0.862305f, 0.100891f, 0.862793f, 0.088318f, 0.858887f, 0.068481f, 0.835449f, 0.032043f, + 0.000000f, 1.000000f, 0.270020f, 0.884766f, 0.364746f, 0.805176f, 0.421631f, 0.746582f, + 0.463379f, 0.700195f, 0.493652f, 0.662598f, 0.520996f, 0.628906f, 0.543945f, 0.600098f, + 0.562012f, 0.575195f, 0.579590f, 0.552246f, 0.594727f, 0.531738f, 0.610840f, 0.512695f, + 0.622559f, 0.495361f, 0.635742f, 0.478516f, 0.646973f, 0.463135f, 0.656738f, 0.449219f, + 0.666992f, 0.435547f, 0.675781f, 0.422852f, 0.685059f, 0.411133f, 0.693848f, 0.399414f, + 0.702148f, 0.387939f, 0.709961f, 0.377197f, 0.718262f, 0.366211f, 0.725586f, 0.356445f, + 0.732422f, 0.346924f, 0.739746f, 0.337646f, 0.746094f, 0.328857f, 0.752441f, 0.319824f, + 0.757324f, 0.311768f, 0.764648f, 0.303467f, 0.769043f, 0.295654f, 0.774902f, 0.287842f, + 0.780273f, 0.280273f, 0.787109f, 0.272461f, 0.789551f, 0.265625f, 0.794922f, 0.258301f, + 0.799805f, 0.251465f, 0.805176f, 0.244385f, 0.809082f, 0.237427f, 0.813965f, 0.230835f, + 0.818359f, 0.223999f, 0.822754f, 0.217407f, 0.825195f, 0.211426f, 0.830078f, 0.204712f, + 0.835449f, 0.197998f, 0.838379f, 0.191650f, 0.842285f, 0.185303f, 0.846680f, 0.178955f, + 0.849121f, 0.172974f, 0.853516f, 0.166748f, 0.857422f, 0.159912f, 0.861328f, 0.153320f, + 0.864746f, 0.147217f, 0.867188f, 0.139404f, 0.868652f, 0.132812f, 0.872070f, 0.125000f, + 0.875000f, 0.117737f, 0.878906f, 0.110168f, 0.881348f, 0.102722f, 0.882324f, 0.093018f, + 0.884766f, 0.083496f, 0.883301f, 0.071716f, 0.882812f, 0.056458f, 0.862793f, 0.025955f, + 0.000000f, 1.000000f, 0.274414f, 0.882812f, 0.373779f, 0.800293f, 0.433594f, 0.739746f, + 0.476318f, 0.691895f, 0.507812f, 0.652832f, 0.537109f, 0.617676f, 0.560547f, 0.587891f, + 0.581055f, 0.561035f, 0.599121f, 0.537109f, 0.614746f, 0.515625f, 0.629883f, 0.495850f, + 0.644043f, 0.477295f, 0.656738f, 0.459717f, 0.668457f, 0.443848f, 0.679199f, 0.428711f, + 0.689941f, 0.414551f, 0.699219f, 0.401611f, 0.708496f, 0.389160f, 0.716309f, 0.377197f, + 0.725586f, 0.365479f, 0.734375f, 0.354004f, 0.741211f, 0.343018f, 0.749023f, 0.332764f, + 0.755371f, 0.323242f, 0.763184f, 0.313232f, 0.770508f, 0.303955f, 0.774902f, 0.295654f, + 0.781738f, 0.286621f, 0.786621f, 0.278809f, 0.793457f, 0.270508f, 0.798340f, 0.262695f, + 0.803223f, 0.255127f, 0.808594f, 0.247559f, 0.813965f, 0.240356f, 0.816895f, 0.233643f, + 0.823242f, 0.226318f, 0.827637f, 0.219482f, 0.831543f, 0.212646f, 0.834961f, 0.206299f, + 0.839844f, 0.199707f, 0.843262f, 0.193359f, 0.847656f, 0.187134f, 0.852051f, 0.180542f, + 0.856934f, 0.174316f, 0.858887f, 0.168335f, 0.863770f, 0.162231f, 0.865234f, 0.156616f, + 0.870117f, 0.150879f, 0.874023f, 0.144043f, 0.877441f, 0.138306f, 0.880371f, 0.132324f, + 0.883789f, 0.126587f, 0.884766f, 0.120605f, 0.888672f, 0.113098f, 0.891113f, 0.106262f, + 0.893066f, 0.099670f, 0.895996f, 0.092957f, 0.897949f, 0.086548f, 0.899414f, 0.077881f, + 0.901367f, 0.069031f, 0.901855f, 0.058929f, 0.898926f, 0.045105f, 0.885742f, 0.021057f, + 0.000000f, 1.000000f, 0.280029f, 0.880371f, 0.381104f, 0.796875f, 0.444336f, 0.733887f, + 0.489014f, 0.684082f, 0.522461f, 0.642578f, 0.551758f, 0.606445f, 0.577148f, 0.575195f, + 0.598145f, 0.547363f, 0.618652f, 0.521973f, 0.634766f, 0.499756f, 0.648926f, 0.479248f, + 0.663086f, 0.460205f, 0.677734f, 0.441406f, 0.689453f, 0.425049f, 0.700195f, 0.409424f, + 0.710449f, 0.394775f, 0.721191f, 0.381104f, 0.729492f, 0.368164f, 0.738770f, 0.355957f, + 0.746582f, 0.344482f, 0.755859f, 0.332275f, 0.764160f, 0.320801f, 0.770508f, 0.310791f, + 0.777832f, 0.300781f, 0.785156f, 0.290771f, 0.791504f, 0.281250f, 0.797363f, 0.272705f, + 0.802246f, 0.264404f, 0.808594f, 0.255859f, 0.813965f, 0.247437f, 0.819336f, 0.239868f, + 0.823730f, 0.232300f, 0.828125f, 0.224976f, 0.833984f, 0.217773f, 0.837402f, 0.210815f, + 0.842773f, 0.203857f, 0.846680f, 0.197144f, 0.851074f, 0.190430f, 0.853516f, 0.184692f, + 0.860352f, 0.177734f, 0.861816f, 0.171997f, 0.867676f, 0.165527f, 0.869141f, 0.159912f, + 0.873535f, 0.153931f, 0.876465f, 0.148315f, 0.880371f, 0.142456f, 0.883301f, 0.136963f, + 0.887207f, 0.131104f, 0.890625f, 0.125366f, 0.893066f, 0.120178f, 0.895996f, 0.114868f, + 0.898438f, 0.109558f, 0.903320f, 0.103455f, 0.903809f, 0.097290f, 0.905762f, 0.091064f, + 0.907715f, 0.085571f, 0.910156f, 0.079102f, 0.914551f, 0.072266f, 0.914551f, 0.066528f, + 0.915039f, 0.058411f, 0.917480f, 0.049927f, 0.914062f, 0.038879f, 0.903320f, 0.016357f, + 0.000000f, 1.000000f, 0.283447f, 0.879395f, 0.390381f, 0.791992f, 0.454834f, 0.727539f, + 0.501465f, 0.675781f, 0.538086f, 0.632324f, 0.568848f, 0.595215f, 0.593750f, 0.562500f, + 0.615234f, 0.534180f, 0.635742f, 0.507812f, 0.653320f, 0.484131f, 0.668457f, 0.462891f, + 0.682617f, 0.443115f, 0.697266f, 0.424072f, 0.708984f, 0.406982f, 0.720215f, 0.390625f, + 0.730957f, 0.375977f, 0.740234f, 0.362061f, 0.749512f, 0.348633f, 0.757812f, 0.336182f, + 0.766113f, 0.324219f, 0.775879f, 0.312012f, 0.783691f, 0.300537f, 0.789551f, 0.290283f, + 0.797852f, 0.279785f, 0.804688f, 0.269775f, 0.810547f, 0.260742f, 0.815430f, 0.252197f, + 0.820801f, 0.243408f, 0.827637f, 0.234741f, 0.832520f, 0.226807f, 0.837402f, 0.219360f, + 0.842773f, 0.211792f, 0.846191f, 0.204712f, 0.852539f, 0.197021f, 0.854980f, 0.190674f, + 0.860840f, 0.183716f, 0.863770f, 0.177368f, 0.867188f, 0.171265f, 0.872559f, 0.164917f, + 0.875488f, 0.158813f, 0.879395f, 0.152710f, 0.881348f, 0.147217f, 0.885742f, 0.141602f, + 0.888672f, 0.136230f, 0.892578f, 0.130371f, 0.895020f, 0.125366f, 0.897949f, 0.119873f, + 0.901367f, 0.114807f, 0.903809f, 0.109680f, 0.906738f, 0.104797f, 0.910156f, 0.099487f, + 0.912109f, 0.094666f, 0.916016f, 0.089294f, 0.916992f, 0.084778f, 0.919434f, 0.078430f, + 0.920410f, 0.072815f, 0.923340f, 0.066650f, 0.923828f, 0.061829f, 0.927734f, 0.055756f, + 0.927734f, 0.048950f, 0.928223f, 0.041290f, 0.926758f, 0.031555f, 0.917969f, 0.013451f, + 0.000000f, 1.000000f, 0.287109f, 0.877930f, 0.398926f, 0.787598f, 0.465332f, 0.721680f, + 0.513672f, 0.667480f, 0.552246f, 0.622559f, 0.583984f, 0.583984f, 0.610352f, 0.550293f, + 0.632812f, 0.520508f, 0.652832f, 0.493896f, 0.670410f, 0.469727f, 0.687012f, 0.446777f, + 0.700684f, 0.427246f, 0.716797f, 0.406982f, 0.728516f, 0.389404f, 0.739258f, 0.373047f, + 0.750000f, 0.357666f, 0.759766f, 0.343262f, 0.768555f, 0.329834f, 0.776367f, 0.317383f, + 0.785156f, 0.305176f, 0.793945f, 0.293213f, 0.801270f, 0.281738f, 0.809082f, 0.270752f, + 0.814941f, 0.260742f, 0.822266f, 0.250732f, 0.827148f, 0.241821f, 0.833984f, 0.232910f, + 0.838867f, 0.224121f, 0.844238f, 0.215698f, 0.848633f, 0.208252f, 0.853516f, 0.200562f, + 0.858398f, 0.193237f, 0.863770f, 0.185913f, 0.867188f, 0.179077f, 0.871094f, 0.172607f, + 0.874512f, 0.166260f, 0.879395f, 0.159790f, 0.882812f, 0.153809f, 0.885742f, 0.147827f, + 0.890625f, 0.141968f, 0.892578f, 0.136475f, 0.895996f, 0.131226f, 0.898926f, 0.125732f, + 0.903320f, 0.120300f, 0.905273f, 0.115295f, 0.907715f, 0.110413f, 0.910156f, 0.105652f, + 0.914062f, 0.100647f, 0.916992f, 0.095520f, 0.918945f, 0.091248f, 0.921875f, 0.086487f, + 0.923340f, 0.082458f, 0.926270f, 0.077637f, 0.929199f, 0.072815f, 0.929688f, 0.068237f, + 0.930664f, 0.063293f, 0.933105f, 0.057434f, 0.934570f, 0.052734f, 0.936035f, 0.047668f, + 0.938477f, 0.041992f, 0.937012f, 0.034790f, 0.937012f, 0.025848f, 0.929688f, 0.011162f, + 0.000000f, 1.000000f, 0.293945f, 0.874512f, 0.406738f, 0.783691f, 0.476562f, 0.714844f, + 0.527832f, 0.659180f, 0.566895f, 0.612793f, 0.598633f, 0.573242f, 0.626953f, 0.538086f, + 0.649414f, 0.507324f, 0.668945f, 0.480469f, 0.688965f, 0.454590f, 0.704590f, 0.431885f, + 0.719727f, 0.410645f, 0.732422f, 0.391602f, 0.745605f, 0.373291f, 0.757812f, 0.355957f, + 0.768066f, 0.340820f, 0.777344f, 0.325928f, 0.786133f, 0.312500f, 0.794434f, 0.299805f, + 0.802246f, 0.287354f, 0.809082f, 0.276123f, 0.817383f, 0.264404f, 0.825684f, 0.253174f, + 0.831055f, 0.243286f, 0.837402f, 0.233398f, 0.843750f, 0.224365f, 0.849609f, 0.215332f, + 0.855469f, 0.206665f, 0.858398f, 0.198975f, 0.862793f, 0.191528f, 0.869629f, 0.183472f, + 0.872070f, 0.176392f, 0.877441f, 0.169312f, 0.880859f, 0.163086f, 0.884277f, 0.156860f, + 0.889160f, 0.150269f, 0.892578f, 0.143921f, 0.895996f, 0.138306f, 0.897461f, 0.133179f, + 0.902832f, 0.127441f, 0.905273f, 0.121887f, 0.908203f, 0.116760f, 0.910645f, 0.111816f, + 0.913574f, 0.107056f, 0.916504f, 0.102173f, 0.919434f, 0.097473f, 0.922363f, 0.092957f, + 0.923828f, 0.088318f, 0.925781f, 0.084412f, 0.930176f, 0.079895f, 0.931641f, 0.075378f, + 0.933105f, 0.071472f, 0.935547f, 0.067566f, 0.938477f, 0.063354f, 0.939941f, 0.059479f, + 0.940918f, 0.054382f, 0.941406f, 0.049774f, 0.943359f, 0.044891f, 0.945312f, 0.040375f, + 0.946777f, 0.035645f, 0.946777f, 0.029800f, 0.946289f, 0.022919f, 0.940430f, 0.009216f, + 0.000000f, 1.000000f, 0.298584f, 0.873047f, 0.415771f, 0.779297f, 0.487549f, 0.708496f, + 0.539551f, 0.651367f, 0.581055f, 0.603027f, 0.613770f, 0.562500f, 0.642090f, 0.526367f, + 0.666016f, 0.494629f, 0.685547f, 0.466797f, 0.705078f, 0.440674f, 0.722168f, 0.416992f, + 0.736816f, 0.395752f, 0.750000f, 0.376465f, 0.762695f, 0.357422f, 0.772949f, 0.340576f, + 0.783203f, 0.324951f, 0.793945f, 0.309814f, 0.802734f, 0.296143f, 0.811035f, 0.283203f, + 0.818359f, 0.270996f, 0.824707f, 0.259766f, 0.833008f, 0.248169f, 0.839844f, 0.237305f, + 0.846680f, 0.226929f, 0.852539f, 0.217529f, 0.857422f, 0.208496f, 0.863281f, 0.199341f, + 0.867676f, 0.191284f, 0.872070f, 0.183594f, 0.876465f, 0.175903f, 0.881836f, 0.168213f, + 0.885254f, 0.161621f, 0.888672f, 0.155151f, 0.893066f, 0.148560f, 0.897461f, 0.141846f, + 0.900391f, 0.136230f, 0.903320f, 0.130371f, 0.906250f, 0.125366f, 0.910156f, 0.119385f, + 0.913086f, 0.114075f, 0.916504f, 0.109070f, 0.917969f, 0.104614f, 0.920898f, 0.100342f, + 0.924805f, 0.094727f, 0.925781f, 0.090393f, 0.927246f, 0.086670f, 0.931152f, 0.082275f, + 0.934082f, 0.077698f, 0.935547f, 0.073975f, 0.937012f, 0.070129f, 0.938965f, 0.066467f, + 0.942383f, 0.062408f, 0.943359f, 0.058899f, 0.946289f, 0.055145f, 0.947754f, 0.051483f, + 0.948730f, 0.048096f, 0.949219f, 0.043121f, 0.950195f, 0.039001f, 0.952637f, 0.034546f, + 0.952637f, 0.030472f, 0.954590f, 0.026276f, 0.953125f, 0.019043f, 0.948730f, 0.007641f, + 0.000000f, 1.000000f, 0.302246f, 0.871582f, 0.424805f, 0.774414f, 0.500488f, 0.701172f, + 0.553711f, 0.643066f, 0.594727f, 0.593750f, 0.628418f, 0.552246f, 0.657227f, 0.515137f, + 0.682129f, 0.482178f, 0.702637f, 0.453613f, 0.720703f, 0.427246f, 0.737305f, 0.403076f, + 0.752441f, 0.381592f, 0.764648f, 0.362061f, 0.777832f, 0.342773f, 0.788574f, 0.325928f, + 0.798828f, 0.309570f, 0.809082f, 0.294434f, 0.817383f, 0.281006f, 0.825684f, 0.267578f, + 0.832520f, 0.255859f, 0.839844f, 0.244385f, 0.846191f, 0.233521f, 0.852539f, 0.222900f, + 0.858887f, 0.212646f, 0.865234f, 0.202515f, 0.870605f, 0.193726f, 0.875000f, 0.185425f, + 0.880371f, 0.177124f, 0.884766f, 0.169312f, 0.888672f, 0.161987f, 0.893555f, 0.154785f, + 0.896484f, 0.148315f, 0.901367f, 0.141602f, 0.904785f, 0.135254f, 0.906738f, 0.129639f, + 0.910156f, 0.124146f, 0.913574f, 0.118347f, 0.916992f, 0.112732f, 0.918457f, 0.107910f, + 0.920898f, 0.103455f, 0.925293f, 0.097900f, 0.926758f, 0.093689f, 0.930664f, 0.089172f, + 0.932129f, 0.084839f, 0.934570f, 0.080688f, 0.936523f, 0.076660f, 0.938965f, 0.072815f, + 0.941406f, 0.068726f, 0.942871f, 0.065186f, 0.944824f, 0.061890f, 0.947266f, 0.058167f, + 0.948730f, 0.054657f, 0.950684f, 0.051483f, 0.952148f, 0.048157f, 0.954102f, 0.045074f, + 0.956055f, 0.041779f, 0.956543f, 0.037933f, 0.957031f, 0.033966f, 0.958008f, 0.029770f, + 0.958984f, 0.026154f, 0.960938f, 0.022034f, 0.958496f, 0.016129f, 0.956055f, 0.006180f, + 0.000000f, 1.000000f, 0.307617f, 0.869629f, 0.433105f, 0.770020f, 0.510254f, 0.695312f, + 0.565918f, 0.634766f, 0.608887f, 0.584473f, 0.642578f, 0.541504f, 0.672363f, 0.503418f, + 0.696777f, 0.470459f, 0.718262f, 0.440674f, 0.736328f, 0.414307f, 0.751953f, 0.390137f, + 0.767578f, 0.367920f, 0.780762f, 0.348389f, 0.793457f, 0.329102f, 0.804199f, 0.311523f, + 0.813477f, 0.295410f, 0.822754f, 0.280762f, 0.831543f, 0.266602f, 0.839355f, 0.253662f, + 0.845703f, 0.242065f, 0.853516f, 0.230103f, 0.859375f, 0.219604f, 0.864746f, 0.209595f, + 0.871582f, 0.198975f, 0.877441f, 0.189331f, 0.881348f, 0.180908f, 0.886719f, 0.172241f, + 0.892090f, 0.164062f, 0.895020f, 0.156982f, 0.899902f, 0.149658f, 0.903809f, 0.142578f, + 0.907227f, 0.135986f, 0.910156f, 0.130005f, 0.913574f, 0.124207f, 0.917969f, 0.117737f, + 0.918945f, 0.112793f, 0.921875f, 0.107849f, 0.925781f, 0.102234f, 0.927734f, 0.097534f, + 0.930176f, 0.092896f, 0.932617f, 0.088623f, 0.935547f, 0.083984f, 0.937500f, 0.079895f, + 0.939941f, 0.075806f, 0.941895f, 0.072021f, 0.944336f, 0.068237f, 0.946777f, 0.064392f, + 0.948242f, 0.061005f, 0.949219f, 0.057953f, 0.952148f, 0.054352f, 0.953125f, 0.051086f, + 0.954590f, 0.048065f, 0.956055f, 0.045380f, 0.958496f, 0.041901f, 0.959473f, 0.039215f, + 0.961426f, 0.036530f, 0.962402f, 0.033875f, 0.963379f, 0.029465f, 0.962891f, 0.026260f, + 0.965332f, 0.022217f, 0.964844f, 0.018738f, 0.966309f, 0.013618f, 0.961914f, 0.006100f, + 0.000000f, 1.000000f, 0.312988f, 0.867188f, 0.442139f, 0.765625f, 0.521973f, 0.688477f, + 0.579102f, 0.626465f, 0.622070f, 0.575195f, 0.656250f, 0.531250f, 0.687012f, 0.492432f, + 0.710449f, 0.459229f, 0.731934f, 0.428711f, 0.751465f, 0.401611f, 0.765625f, 0.377686f, + 0.782227f, 0.354736f, 0.794922f, 0.334961f, 0.805664f, 0.316162f, 0.817383f, 0.298096f, + 0.826172f, 0.282471f, 0.834961f, 0.267578f, 0.843262f, 0.253662f, 0.850098f, 0.240967f, + 0.857910f, 0.228760f, 0.864746f, 0.217285f, 0.869141f, 0.207520f, 0.875488f, 0.197144f, + 0.881836f, 0.186890f, 0.885742f, 0.178101f, 0.892090f, 0.168701f, 0.896973f, 0.160400f, + 0.900391f, 0.152832f, 0.904785f, 0.145508f, 0.909668f, 0.137817f, 0.911621f, 0.131958f, + 0.916992f, 0.125244f, 0.918945f, 0.119263f, 0.922363f, 0.113464f, 0.925293f, 0.108093f, + 0.928223f, 0.102966f, 0.931152f, 0.097778f, 0.933594f, 0.092896f, 0.935547f, 0.088440f, + 0.937988f, 0.084106f, 0.940430f, 0.079651f, 0.941895f, 0.075623f, 0.943848f, 0.071899f, + 0.946777f, 0.067932f, 0.948242f, 0.064331f, 0.949707f, 0.061005f, 0.952637f, 0.057281f, + 0.954102f, 0.054382f, 0.956055f, 0.051056f, 0.957520f, 0.047974f, 0.958496f, 0.045074f, + 0.959961f, 0.042633f, 0.962402f, 0.039520f, 0.963379f, 0.036713f, 0.964844f, 0.034271f, + 0.966309f, 0.031860f, 0.967773f, 0.029099f, 0.969238f, 0.026581f, 0.968262f, 0.022797f, + 0.969238f, 0.019196f, 0.969727f, 0.016022f, 0.969727f, 0.012421f, 0.968262f, 0.004559f, + 0.000000f, 1.000000f, 0.317871f, 0.865234f, 0.450195f, 0.761719f, 0.533203f, 0.682129f, + 0.589844f, 0.619141f, 0.636230f, 0.565918f, 0.671387f, 0.520996f, 0.701172f, 0.481689f, + 0.725098f, 0.447754f, 0.746582f, 0.417236f, 0.764160f, 0.390137f, 0.781250f, 0.365234f, + 0.793945f, 0.342773f, 0.807129f, 0.322510f, 0.817383f, 0.304199f, 0.829590f, 0.286133f, + 0.837891f, 0.270264f, 0.847656f, 0.254883f, 0.855469f, 0.241455f, 0.863281f, 0.228516f, + 0.868652f, 0.217041f, 0.874512f, 0.206055f, 0.880859f, 0.195312f, 0.886230f, 0.185547f, + 0.891113f, 0.176514f, 0.897949f, 0.166382f, 0.900879f, 0.158203f, 0.906738f, 0.149780f, + 0.910156f, 0.142334f, 0.913574f, 0.135254f, 0.917480f, 0.128296f, 0.920898f, 0.121826f, + 0.923828f, 0.115967f, 0.927246f, 0.109680f, 0.928711f, 0.104614f, 0.932617f, 0.098999f, + 0.935059f, 0.094055f, 0.937988f, 0.089172f, 0.939453f, 0.084778f, 0.941406f, 0.080566f, + 0.945801f, 0.075806f, 0.946777f, 0.072083f, 0.947754f, 0.068542f, 0.950195f, 0.064819f, + 0.952637f, 0.060852f, 0.953613f, 0.057831f, 0.955078f, 0.054840f, 0.957520f, 0.051239f, + 0.958984f, 0.048096f, 0.959473f, 0.045776f, 0.962891f, 0.042450f, 0.964355f, 0.039673f, + 0.964844f, 0.037445f, 0.966309f, 0.034851f, 0.967773f, 0.032349f, 0.969238f, 0.029907f, + 0.970215f, 0.027863f, 0.971191f, 0.025635f, 0.973633f, 0.023224f, 0.973633f, 0.020294f, + 0.973145f, 0.016800f, 0.973633f, 0.014168f, 0.974121f, 0.010277f, 0.972168f, 0.004128f, + 0.000000f, 1.000000f, 0.323975f, 0.862793f, 0.459229f, 0.757324f, 0.543945f, 0.675781f, + 0.604004f, 0.610840f, 0.649414f, 0.557129f, 0.683594f, 0.512207f, 0.714355f, 0.471680f, + 0.737305f, 0.437256f, 0.758789f, 0.406250f, 0.777832f, 0.378662f, 0.793945f, 0.353760f, + 0.806641f, 0.331299f, 0.819336f, 0.311035f, 0.831055f, 0.292725f, 0.840820f, 0.274902f, + 0.850586f, 0.258545f, 0.858887f, 0.243774f, 0.866699f, 0.230469f, 0.872559f, 0.217651f, + 0.879395f, 0.205933f, 0.886719f, 0.194336f, 0.888184f, 0.185303f, 0.895996f, 0.174683f, + 0.898926f, 0.166382f, 0.905762f, 0.156982f, 0.909668f, 0.148315f, 0.913574f, 0.140625f, + 0.918457f, 0.132690f, 0.921387f, 0.126099f, 0.925293f, 0.119263f, 0.928223f, 0.113037f, + 0.930664f, 0.107239f, 0.933594f, 0.101562f, 0.937012f, 0.096191f, 0.939453f, 0.091064f, + 0.941895f, 0.086182f, 0.944336f, 0.081787f, 0.946289f, 0.077332f, 0.948242f, 0.073059f, + 0.950684f, 0.069092f, 0.952148f, 0.065308f, 0.953125f, 0.062042f, 0.956055f, 0.058167f, + 0.957031f, 0.055084f, 0.959473f, 0.051697f, 0.960938f, 0.048889f, 0.962891f, 0.045746f, + 0.964355f, 0.042847f, 0.964355f, 0.040771f, 0.966309f, 0.037872f, 0.968750f, 0.035156f, + 0.968750f, 0.033020f, 0.970703f, 0.030548f, 0.971680f, 0.028488f, 0.972656f, 0.026535f, + 0.974609f, 0.024033f, 0.975098f, 0.022125f, 0.976074f, 0.020737f, 0.977539f, 0.018311f, + 0.977539f, 0.014984f, 0.977051f, 0.011566f, 0.976562f, 0.008926f, 0.976562f, 0.003054f, + 0.000000f, 1.000000f, 0.327881f, 0.861328f, 0.469482f, 0.751953f, 0.553711f, 0.669922f, + 0.614746f, 0.603516f, 0.661133f, 0.548340f, 0.696777f, 0.501953f, 0.726562f, 0.461914f, + 0.750488f, 0.427002f, 0.770020f, 0.396240f, 0.790527f, 0.367676f, 0.803711f, 0.343750f, + 0.818848f, 0.320557f, 0.830566f, 0.300293f, 0.840820f, 0.281494f, 0.849121f, 0.265137f, + 0.859863f, 0.248413f, 0.868164f, 0.233643f, 0.875977f, 0.219727f, 0.883301f, 0.207520f, + 0.888672f, 0.195557f, 0.895020f, 0.184814f, 0.899414f, 0.174683f, 0.904297f, 0.165283f, + 0.907227f, 0.156982f, 0.911621f, 0.148438f, 0.916992f, 0.139893f, 0.921387f, 0.131836f, + 0.924805f, 0.124634f, 0.928223f, 0.117859f, 0.932129f, 0.111084f, 0.935547f, 0.105042f, + 0.937988f, 0.099487f, 0.940430f, 0.093994f, 0.943359f, 0.088562f, 0.945312f, 0.084045f, + 0.947754f, 0.079285f, 0.949707f, 0.074890f, 0.952148f, 0.070740f, 0.953125f, 0.067139f, + 0.956543f, 0.062744f, 0.957031f, 0.059448f, 0.958984f, 0.056000f, 0.960449f, 0.052704f, + 0.961914f, 0.049561f, 0.963867f, 0.046539f, 0.965332f, 0.043732f, 0.966309f, 0.041138f, + 0.968262f, 0.038544f, 0.969727f, 0.035736f, 0.970703f, 0.033447f, 0.971191f, 0.031616f, + 0.973633f, 0.029068f, 0.974121f, 0.026810f, 0.975098f, 0.025009f, 0.976562f, 0.022949f, + 0.977539f, 0.021301f, 0.978516f, 0.019516f, 0.979980f, 0.017151f, 0.980957f, 0.015793f, + 0.981934f, 0.014244f, 0.980469f, 0.010727f, 0.980957f, 0.006546f, 0.980469f, 0.003933f, + 0.000000f, 1.000000f, 0.332764f, 0.859375f, 0.478516f, 0.747559f, 0.565918f, 0.663086f, + 0.626465f, 0.596191f, 0.672852f, 0.540039f, 0.708008f, 0.493652f, 0.738770f, 0.452393f, + 0.763672f, 0.416748f, 0.783203f, 0.385986f, 0.800293f, 0.358154f, 0.815430f, 0.333252f, + 0.829590f, 0.310303f, 0.842285f, 0.290039f, 0.852051f, 0.271240f, 0.861816f, 0.254150f, + 0.869629f, 0.239136f, 0.877441f, 0.223877f, 0.885254f, 0.210205f, 0.891113f, 0.197998f, + 0.897461f, 0.186279f, 0.902344f, 0.175903f, 0.907227f, 0.165771f, 0.911621f, 0.156616f, + 0.916016f, 0.147949f, 0.919434f, 0.139893f, 0.923828f, 0.132324f, 0.928223f, 0.124207f, + 0.931152f, 0.117249f, 0.935059f, 0.110474f, 0.937988f, 0.104004f, 0.940430f, 0.098206f, + 0.943848f, 0.092346f, 0.945801f, 0.087219f, 0.947754f, 0.082458f, 0.951172f, 0.077393f, + 0.952148f, 0.073242f, 0.955078f, 0.068909f, 0.957031f, 0.064697f, 0.958008f, 0.061249f, + 0.959961f, 0.057831f, 0.962402f, 0.053864f, 0.963379f, 0.050842f, 0.964844f, 0.047913f, + 0.966309f, 0.044800f, 0.967773f, 0.041931f, 0.968750f, 0.039337f, 0.970703f, 0.036804f, + 0.971191f, 0.034515f, 0.972656f, 0.032318f, 0.974609f, 0.029572f, 0.975098f, 0.027725f, + 0.976074f, 0.025833f, 0.977051f, 0.024002f, 0.978516f, 0.022171f, 0.979492f, 0.020050f, + 0.980469f, 0.018234f, 0.981445f, 0.016830f, 0.981934f, 0.015442f, 0.982910f, 0.014137f, + 0.984375f, 0.012009f, 0.984863f, 0.009422f, 0.982910f, 0.006298f, 0.982422f, 0.003025f, + 0.000000f, 1.000000f, 0.338135f, 0.856934f, 0.487061f, 0.743164f, 0.576660f, 0.656738f, + 0.638184f, 0.588379f, 0.686035f, 0.531738f, 0.720215f, 0.484619f, 0.750488f, 0.443359f, + 0.774414f, 0.407715f, 0.795410f, 0.376709f, 0.812500f, 0.348633f, 0.826660f, 0.323975f, + 0.838867f, 0.301270f, 0.851074f, 0.280273f, 0.861328f, 0.261719f, 0.870605f, 0.245117f, + 0.877930f, 0.229980f, 0.885254f, 0.215576f, 0.892578f, 0.201660f, 0.898926f, 0.189453f, + 0.905273f, 0.177734f, 0.910156f, 0.167358f, 0.914551f, 0.157471f, 0.918457f, 0.148804f, + 0.922852f, 0.139893f, 0.925781f, 0.132446f, 0.930176f, 0.124695f, 0.932129f, 0.118042f, + 0.936523f, 0.110596f, 0.940918f, 0.103638f, 0.943359f, 0.097717f, 0.946289f, 0.091736f, + 0.948242f, 0.086548f, 0.950684f, 0.081299f, 0.953613f, 0.076416f, 0.955566f, 0.071777f, + 0.957031f, 0.067810f, 0.959473f, 0.063477f, 0.960938f, 0.059662f, 0.962402f, 0.056183f, + 0.964355f, 0.052795f, 0.966309f, 0.049347f, 0.967285f, 0.046387f, 0.969238f, 0.043182f, + 0.969727f, 0.040741f, 0.970703f, 0.038177f, 0.972656f, 0.035431f, 0.974121f, 0.032867f, + 0.974609f, 0.030884f, 0.975586f, 0.028732f, 0.976562f, 0.026794f, 0.978516f, 0.024948f, + 0.979980f, 0.022446f, 0.979980f, 0.021027f, 0.981445f, 0.019119f, 0.981934f, 0.017761f, + 0.982910f, 0.016373f, 0.983398f, 0.014824f, 0.985352f, 0.012970f, 0.985840f, 0.011520f, + 0.986328f, 0.010490f, 0.986816f, 0.009224f, 0.986328f, 0.005840f, 0.986328f, 0.001069f, + 0.000000f, 1.000000f, 0.343994f, 0.854492f, 0.495605f, 0.738281f, 0.586914f, 0.650879f, + 0.651367f, 0.580566f, 0.698730f, 0.523438f, 0.734375f, 0.475342f, 0.761230f, 0.434814f, + 0.786133f, 0.398926f, 0.805176f, 0.367188f, 0.823242f, 0.338867f, 0.836914f, 0.314209f, + 0.848633f, 0.292480f, 0.860840f, 0.271484f, 0.870117f, 0.253174f, 0.877930f, 0.236572f, + 0.886719f, 0.221191f, 0.892578f, 0.207642f, 0.900879f, 0.193604f, 0.906738f, 0.181396f, + 0.911621f, 0.170166f, 0.916504f, 0.159668f, 0.920898f, 0.150391f, 0.925293f, 0.141235f, + 0.928711f, 0.133057f, 0.932617f, 0.125244f, 0.934570f, 0.118225f, 0.938477f, 0.111328f, + 0.941406f, 0.104858f, 0.945312f, 0.098022f, 0.948242f, 0.091980f, 0.951172f, 0.086060f, + 0.953125f, 0.080811f, 0.954590f, 0.076233f, 0.958008f, 0.071106f, 0.959961f, 0.066650f, + 0.961914f, 0.062683f, 0.962891f, 0.058899f, 0.965820f, 0.054993f, 0.966797f, 0.051422f, + 0.968262f, 0.048309f, 0.969238f, 0.045349f, 0.970703f, 0.042419f, 0.972656f, 0.039337f, + 0.973633f, 0.036652f, 0.974609f, 0.034241f, 0.975098f, 0.032104f, 0.976562f, 0.029892f, + 0.978027f, 0.027725f, 0.979492f, 0.025360f, 0.979980f, 0.023514f, 0.980957f, 0.021729f, + 0.981934f, 0.020126f, 0.982422f, 0.018860f, 0.983887f, 0.017105f, 0.984375f, 0.015640f, + 0.986328f, 0.013519f, 0.986328f, 0.012535f, 0.986816f, 0.011215f, 0.987305f, 0.010269f, + 0.988281f, 0.009048f, 0.989746f, 0.007778f, 0.990234f, 0.005577f, 0.988281f, 0.001070f, + 0.000000f, 1.000000f, 0.349854f, 0.852539f, 0.504883f, 0.733887f, 0.597656f, 0.645020f, + 0.662109f, 0.573730f, 0.708496f, 0.516113f, 0.745117f, 0.467529f, 0.773438f, 0.426025f, + 0.795898f, 0.390137f, 0.814453f, 0.359131f, 0.832031f, 0.331055f, 0.845703f, 0.305908f, + 0.858398f, 0.283691f, 0.869141f, 0.263916f, 0.878906f, 0.244995f, 0.887695f, 0.228149f, + 0.894531f, 0.213135f, 0.900391f, 0.199707f, 0.906250f, 0.186890f, 0.913086f, 0.174194f, + 0.917969f, 0.163208f, 0.922363f, 0.152832f, 0.927246f, 0.143066f, 0.931641f, 0.134399f, + 0.934570f, 0.126343f, 0.937988f, 0.118835f, 0.940430f, 0.111694f, 0.942871f, 0.105530f, + 0.946289f, 0.098877f, 0.948242f, 0.093445f, 0.951660f, 0.087158f, 0.955078f, 0.081238f, + 0.957520f, 0.075745f, 0.959473f, 0.071350f, 0.961914f, 0.066650f, 0.963379f, 0.062286f, + 0.965332f, 0.058044f, 0.966309f, 0.054749f, 0.968262f, 0.051086f, 0.970215f, 0.047638f, + 0.971191f, 0.044403f, 0.973145f, 0.041199f, 0.973633f, 0.038696f, 0.975098f, 0.036163f, + 0.976074f, 0.033661f, 0.977051f, 0.031342f, 0.979004f, 0.028595f, 0.979492f, 0.026642f, + 0.980957f, 0.024536f, 0.980957f, 0.023056f, 0.981934f, 0.021393f, 0.982910f, 0.019638f, + 0.984375f, 0.017868f, 0.985840f, 0.015839f, 0.986328f, 0.014481f, 0.986816f, 0.013329f, + 0.987305f, 0.012222f, 0.988281f, 0.011002f, 0.988770f, 0.010025f, 0.989258f, 0.008797f, + 0.990723f, 0.007423f, 0.991699f, 0.005798f, 0.992188f, 0.005005f, 0.990234f, 0.001524f, + 0.000000f, 1.000000f, 0.354492f, 0.850586f, 0.512695f, 0.729980f, 0.608887f, 0.638184f, + 0.672852f, 0.566895f, 0.720215f, 0.507812f, 0.755371f, 0.459473f, 0.783203f, 0.417969f, + 0.806152f, 0.381836f, 0.825195f, 0.350586f, 0.841309f, 0.322510f, 0.855469f, 0.297852f, + 0.867188f, 0.275635f, 0.876465f, 0.255859f, 0.886230f, 0.237793f, 0.894043f, 0.221191f, + 0.901367f, 0.206177f, 0.907715f, 0.192261f, 0.913086f, 0.179932f, 0.919434f, 0.167969f, + 0.924316f, 0.156860f, 0.928711f, 0.146484f, 0.933105f, 0.137085f, 0.936523f, 0.128296f, + 0.939453f, 0.120544f, 0.943848f, 0.112793f, 0.945312f, 0.106079f, 0.948242f, 0.099670f, + 0.951172f, 0.093689f, 0.953125f, 0.087952f, 0.954590f, 0.082947f, 0.958008f, 0.077271f, + 0.960938f, 0.071838f, 0.962891f, 0.066895f, 0.964355f, 0.062622f, 0.966797f, 0.058441f, + 0.967773f, 0.054688f, 0.970703f, 0.050415f, 0.971680f, 0.047180f, 0.972656f, 0.044159f, + 0.974609f, 0.041016f, 0.975098f, 0.038391f, 0.978027f, 0.035156f, 0.978027f, 0.032745f, + 0.979492f, 0.030182f, 0.979980f, 0.028275f, 0.980957f, 0.026199f, 0.981445f, 0.024445f, + 0.983398f, 0.022293f, 0.983887f, 0.020523f, 0.985840f, 0.018219f, 0.985840f, 0.016907f, + 0.986816f, 0.015411f, 0.987305f, 0.014198f, 0.987793f, 0.013115f, 0.988281f, 0.011971f, + 0.989258f, 0.010750f, 0.990234f, 0.009499f, 0.992188f, 0.007675f, 0.991699f, 0.006729f, + 0.992188f, 0.005875f, 0.992676f, 0.005150f, 0.993164f, 0.004486f, 0.992676f, 0.002670f, + 0.000000f, 1.000000f, 0.359863f, 0.848633f, 0.523438f, 0.724609f, 0.617676f, 0.632812f, + 0.682617f, 0.560059f, 0.728516f, 0.501465f, 0.765137f, 0.451904f, 0.793457f, 0.410156f, + 0.816406f, 0.374268f, 0.832520f, 0.343506f, 0.849609f, 0.314941f, 0.862305f, 0.291016f, + 0.875000f, 0.268066f, 0.884277f, 0.248413f, 0.892578f, 0.230835f, 0.901367f, 0.214111f, + 0.907227f, 0.199341f, 0.914062f, 0.185547f, 0.918945f, 0.173340f, 0.924316f, 0.161987f, + 0.929688f, 0.151245f, 0.934082f, 0.140747f, 0.937500f, 0.131714f, 0.941895f, 0.122803f, + 0.944824f, 0.114929f, 0.948730f, 0.107605f, 0.950195f, 0.100891f, 0.952148f, 0.094727f, + 0.955078f, 0.088806f, 0.957031f, 0.083252f, 0.958984f, 0.078064f, 0.960938f, 0.073486f, + 0.962891f, 0.068909f, 0.966797f, 0.063354f, 0.967773f, 0.059082f, 0.970215f, 0.054871f, + 0.971680f, 0.051239f, 0.972656f, 0.047607f, 0.975098f, 0.044067f, 0.976562f, 0.040588f, + 0.977539f, 0.037720f, 0.978516f, 0.034973f, 0.979980f, 0.032471f, 0.980469f, 0.030273f, + 0.981934f, 0.027878f, 0.982422f, 0.025864f, 0.984863f, 0.023132f, 0.984863f, 0.021423f, + 0.985840f, 0.019531f, 0.986328f, 0.018112f, 0.986816f, 0.016693f, 0.987305f, 0.015427f, + 0.988281f, 0.013962f, 0.989258f, 0.012756f, 0.989746f, 0.011421f, 0.991699f, 0.009712f, + 0.992188f, 0.008286f, 0.992676f, 0.007282f, 0.992676f, 0.006523f, 0.992676f, 0.005974f, + 0.993164f, 0.005268f, 0.993652f, 0.004604f, 0.994629f, 0.003599f, 0.996094f, 0.002056f, + 0.000000f, 1.000000f, 0.366699f, 0.845703f, 0.532227f, 0.720215f, 0.628418f, 0.626953f, + 0.693848f, 0.553223f, 0.740234f, 0.494141f, 0.774414f, 0.445068f, 0.801758f, 0.403320f, + 0.823242f, 0.367432f, 0.842285f, 0.335449f, 0.857910f, 0.307861f, 0.871094f, 0.283203f, + 0.880859f, 0.261963f, 0.892090f, 0.241577f, 0.899414f, 0.224121f, 0.905762f, 0.208618f, + 0.915039f, 0.192871f, 0.919922f, 0.179443f, 0.925781f, 0.166870f, 0.929688f, 0.156006f, + 0.934082f, 0.145630f, 0.937500f, 0.136353f, 0.942871f, 0.126709f, 0.946289f, 0.117920f, + 0.948730f, 0.110229f, 0.951660f, 0.103088f, 0.955078f, 0.095886f, 0.957520f, 0.089783f, + 0.958984f, 0.084351f, 0.960938f, 0.079041f, 0.963867f, 0.073486f, 0.965332f, 0.069031f, + 0.965820f, 0.065063f, 0.967285f, 0.061066f, 0.970703f, 0.056763f, 0.973145f, 0.052124f, + 0.974609f, 0.047943f, 0.976074f, 0.044434f, 0.977051f, 0.041290f, 0.978516f, 0.038208f, + 0.979492f, 0.035522f, 0.980957f, 0.032837f, 0.983398f, 0.029755f, 0.983887f, 0.027161f, + 0.984863f, 0.025040f, 0.985352f, 0.023071f, 0.986328f, 0.021347f, 0.986328f, 0.019760f, + 0.987305f, 0.018021f, 0.988281f, 0.016464f, 0.988770f, 0.015030f, 0.990234f, 0.013283f, + 0.991211f, 0.011444f, 0.991699f, 0.010017f, 0.992188f, 0.008942f, 0.992188f, 0.008217f, + 0.992676f, 0.007336f, 0.993164f, 0.006538f, 0.993652f, 0.005810f, 0.994141f, 0.005104f, + 0.994629f, 0.004375f, 0.995117f, 0.003656f, 0.996582f, 0.002283f, 0.998535f, 0.000016f, + 0.000000f, 1.000000f, 0.372559f, 0.843262f, 0.540527f, 0.715820f, 0.638672f, 0.621094f, + 0.704590f, 0.546875f, 0.750000f, 0.487305f, 0.785645f, 0.437500f, 0.812988f, 0.395508f, + 0.833496f, 0.359619f, 0.851074f, 0.328613f, 0.864746f, 0.301514f, 0.877930f, 0.276855f, + 0.888184f, 0.255127f, 0.897461f, 0.235962f, 0.906738f, 0.217529f, 0.913086f, 0.202271f, + 0.918945f, 0.187744f, 0.925293f, 0.174316f, 0.931152f, 0.161621f, 0.934570f, 0.150757f, + 0.939453f, 0.140015f, 0.941895f, 0.131226f, 0.945312f, 0.122803f, 0.950195f, 0.113892f, + 0.953125f, 0.106018f, 0.955566f, 0.098877f, 0.958984f, 0.091980f, 0.960938f, 0.085510f, + 0.962891f, 0.080017f, 0.964355f, 0.074890f, 0.966309f, 0.070007f, 0.968750f, 0.065186f, + 0.970215f, 0.060699f, 0.970703f, 0.057068f, 0.971680f, 0.053589f, 0.972656f, 0.050354f, + 0.974609f, 0.047058f, 0.977051f, 0.043060f, 0.979980f, 0.038910f, 0.980957f, 0.035583f, + 0.981934f, 0.032776f, 0.982910f, 0.030228f, 0.983887f, 0.027878f, 0.984863f, 0.025711f, + 0.985840f, 0.023590f, 0.986816f, 0.021484f, 0.987793f, 0.019531f, 0.988770f, 0.017654f, + 0.990723f, 0.015228f, 0.991211f, 0.013527f, 0.991699f, 0.012215f, 0.991699f, 0.011169f, + 0.992188f, 0.010063f, 0.992676f, 0.009056f, 0.993164f, 0.008133f, 0.993652f, 0.007294f, + 0.994141f, 0.006493f, 0.994629f, 0.005669f, 0.995117f, 0.004833f, 0.995605f, 0.004032f, + 0.996582f, 0.002949f, 0.999023f, 0.000812f, 0.999023f, 0.000101f, 0.999023f, 0.000001f, + 0.000000f, 1.000000f, 0.377686f, 0.841309f, 0.549316f, 0.711426f, 0.649902f, 0.615234f, + 0.712891f, 0.541016f, 0.759766f, 0.480469f, 0.793945f, 0.430908f, 0.820801f, 0.388672f, + 0.841797f, 0.353027f, 0.858887f, 0.321777f, 0.872070f, 0.295166f, 0.883789f, 0.270752f, + 0.895020f, 0.249268f, 0.905273f, 0.229370f, 0.910645f, 0.212891f, 0.919434f, 0.196289f, + 0.924316f, 0.182129f, 0.930176f, 0.168823f, 0.933594f, 0.157715f, 0.939941f, 0.145996f, + 0.943848f, 0.135254f, 0.946777f, 0.126099f, 0.950195f, 0.117737f, 0.953613f, 0.109436f, + 0.955566f, 0.102539f, 0.957031f, 0.096375f, 0.961426f, 0.089172f, 0.965820f, 0.081909f, + 0.966797f, 0.076172f, 0.968750f, 0.070923f, 0.969727f, 0.066345f, 0.971680f, 0.061951f, + 0.973145f, 0.057678f, 0.975098f, 0.053467f, 0.976562f, 0.049377f, 0.977051f, 0.046234f, + 0.977539f, 0.043427f, 0.978027f, 0.040863f, 0.979004f, 0.038330f, 0.979492f, 0.036011f, + 0.981934f, 0.032745f, 0.984375f, 0.029495f, 0.985840f, 0.026550f, 0.988770f, 0.023163f, + 0.989258f, 0.020752f, 0.989746f, 0.018799f, 0.990234f, 0.017090f, 0.990723f, 0.015549f, + 0.991211f, 0.014122f, 0.991699f, 0.012810f, 0.992188f, 0.011581f, 0.992676f, 0.010429f, + 0.993652f, 0.009186f, 0.994141f, 0.008095f, 0.994629f, 0.007080f, 0.995605f, 0.006016f, + 0.996094f, 0.004925f, 0.997559f, 0.003551f, 0.999512f, 0.001453f, 0.999512f, 0.000681f, + 0.999512f, 0.000327f, 0.999512f, 0.000131f, 0.999512f, 0.000030f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.381104f, 0.839844f, 0.556152f, 0.708496f, 0.657715f, 0.610352f, + 0.722656f, 0.534668f, 0.766602f, 0.475586f, 0.801270f, 0.425537f, 0.828125f, 0.383057f, + 0.849609f, 0.346680f, 0.865723f, 0.315918f, 0.880371f, 0.288330f, 0.891602f, 0.265137f, + 0.900391f, 0.243896f, 0.909180f, 0.224731f, 0.916992f, 0.207275f, 0.921387f, 0.192505f, + 0.929688f, 0.177612f, 0.937012f, 0.162964f, 0.937012f, 0.153320f, 0.942871f, 0.142700f, + 0.949707f, 0.130981f, 0.952637f, 0.120728f, 0.952637f, 0.113953f, 0.952637f, 0.108093f, + 0.958496f, 0.100281f, 0.964844f, 0.091125f, 0.968262f, 0.082703f, 0.968262f, 0.077515f, + 0.968262f, 0.073181f, 0.968262f, 0.069336f, 0.968262f, 0.065918f, 0.968262f, 0.062805f, + 0.973145f, 0.058167f, 0.979004f, 0.051331f, 0.983887f, 0.044220f, 0.983887f, 0.040466f, + 0.983887f, 0.037598f, 0.983887f, 0.035156f, 0.983887f, 0.033020f, 0.983887f, 0.031143f, + 0.983887f, 0.029434f, 0.983887f, 0.027908f, 0.983887f, 0.026505f, 0.983887f, 0.025238f, + 0.983887f, 0.024078f, 0.983887f, 0.023026f, 0.983887f, 0.022079f, 0.983887f, 0.021210f, + 0.990723f, 0.017212f, 0.999512f, 0.010246f, 0.999512f, 0.006580f, 0.999512f, 0.004841f, + 0.999512f, 0.003675f, 0.999512f, 0.002810f, 0.999512f, 0.002134f, 0.999512f, 0.001597f, + 0.999512f, 0.001167f, 0.999512f, 0.000822f, 0.999512f, 0.000550f, 0.999512f, 0.000340f, + 0.999512f, 0.000185f, 0.999512f, 0.000080f, 0.999512f, 0.000019f, 0.999512f, 0.000000f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, + 0.000000f, 0.992676f, 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.991211f, + 0.000000f, 0.990723f, 0.000000f, 0.989746f, 0.000000f, 0.988281f, 0.000000f, 0.987793f, + 0.000000f, 0.986816f, 0.000000f, 0.985352f, 0.000000f, 0.984375f, 0.000000f, 0.983398f, + 0.000000f, 0.981445f, 0.000000f, 0.979980f, 0.000000f, 0.979004f, 0.000000f, 0.976562f, + 0.000000f, 0.974609f, 0.000000f, 0.972168f, 0.000000f, 0.970215f, 0.000000f, 0.967773f, + 0.000000f, 0.965332f, 0.000000f, 0.960938f, 0.000000f, 0.957520f, 0.000000f, 0.954590f, + 0.000000f, 0.949707f, 0.000000f, 0.944336f, 0.000000f, 0.937988f, 0.000000f, 0.932617f, + 0.000000f, 0.925293f, 0.000000f, 0.916016f, 0.000000f, 0.904785f, 0.000000f, 0.892090f, + 0.000000f, 0.875977f, 0.000000f, 0.855957f, 0.000000f, 0.830566f, 0.000000f, 0.797363f, + 0.000000f, 0.747070f, 0.000000f, 0.670898f, 0.000000f, 0.535645f, 0.000000f, 0.219482f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, + 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.993652f, + 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.991211f, + 0.000000f, 0.990234f, 0.000000f, 0.989258f, 0.000000f, 0.988770f, 0.000000f, 0.987793f, + 0.000000f, 0.986328f, 0.000000f, 0.985352f, 0.000000f, 0.984375f, 0.000000f, 0.982910f, + 0.000000f, 0.981445f, 0.000000f, 0.979980f, 0.000000f, 0.978516f, 0.000000f, 0.976562f, + 0.000000f, 0.974609f, 0.000000f, 0.972168f, 0.000000f, 0.970215f, 0.000000f, 0.967773f, + 0.000000f, 0.964355f, 0.000000f, 0.960938f, 0.000000f, 0.957520f, 0.000000f, 0.954102f, + 0.000000f, 0.949707f, 0.000000f, 0.944336f, 0.000000f, 0.938965f, 0.000000f, 0.932129f, + 0.000000f, 0.924316f, 0.000000f, 0.915039f, 0.000000f, 0.904785f, 0.000000f, 0.892090f, + 0.000000f, 0.875977f, 0.000000f, 0.856445f, 0.000000f, 0.830566f, 0.000000f, 0.796387f, + 0.000000f, 0.747070f, 0.000000f, 0.670898f, 0.000001f, 0.535156f, 0.000001f, 0.218628f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, + 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, + 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992188f, 0.000000f, 0.990723f, + 0.000000f, 0.989746f, 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.987793f, + 0.000000f, 0.986816f, 0.000000f, 0.984863f, 0.000000f, 0.983887f, 0.000000f, 0.982422f, + 0.000000f, 0.980957f, 0.000000f, 0.979980f, 0.000000f, 0.978027f, 0.000000f, 0.976074f, + 0.000000f, 0.974609f, 0.000000f, 0.972168f, 0.000000f, 0.969727f, 0.000000f, 0.966797f, + 0.000000f, 0.963867f, 0.000000f, 0.960938f, 0.000000f, 0.957520f, 0.000000f, 0.953125f, + 0.000000f, 0.949219f, 0.000000f, 0.943848f, 0.000000f, 0.937500f, 0.000000f, 0.931641f, + 0.000000f, 0.924316f, 0.000000f, 0.915039f, 0.000000f, 0.904297f, 0.000000f, 0.891113f, + 0.000000f, 0.875977f, 0.000000f, 0.855957f, 0.000014f, 0.829590f, 0.000017f, 0.795898f, + 0.000014f, 0.746094f, 0.000009f, 0.669922f, 0.000010f, 0.535156f, 0.000010f, 0.218384f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.994629f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, + 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.990234f, + 0.000000f, 0.989746f, 0.000000f, 0.988770f, 0.000000f, 0.988281f, 0.000000f, 0.987305f, + 0.000000f, 0.985840f, 0.000000f, 0.984863f, 0.000000f, 0.983887f, 0.000000f, 0.982422f, + 0.000000f, 0.980957f, 0.000000f, 0.979004f, 0.000000f, 0.978027f, 0.000000f, 0.975586f, + 0.000000f, 0.973633f, 0.000000f, 0.972168f, 0.000000f, 0.969727f, 0.000000f, 0.966309f, + 0.000000f, 0.963379f, 0.000000f, 0.960938f, 0.000000f, 0.956543f, 0.000000f, 0.953125f, + 0.000000f, 0.948242f, 0.000000f, 0.943359f, 0.000000f, 0.937012f, 0.000008f, 0.930664f, + 0.000034f, 0.922852f, 0.000065f, 0.914062f, 0.000075f, 0.902832f, 0.000074f, 0.890625f, + 0.000069f, 0.875000f, 0.000061f, 0.854492f, 0.000051f, 0.828125f, 0.000052f, 0.793945f, + 0.000049f, 0.745605f, 0.000045f, 0.668945f, 0.000046f, 0.534180f, 0.000053f, 0.218262f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.993652f, + 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.991211f, 0.000000f, 0.991211f, + 0.000000f, 0.989258f, 0.000000f, 0.988770f, 0.000000f, 0.987793f, 0.000000f, 0.986816f, + 0.000000f, 0.985352f, 0.000000f, 0.984375f, 0.000000f, 0.983398f, 0.000000f, 0.981934f, + 0.000000f, 0.980957f, 0.000000f, 0.978516f, 0.000000f, 0.976562f, 0.000000f, 0.975098f, + 0.000000f, 0.973145f, 0.000000f, 0.971191f, 0.000000f, 0.968262f, 0.000013f, 0.965820f, + 0.000042f, 0.962891f, 0.000078f, 0.959473f, 0.000117f, 0.956055f, 0.000164f, 0.951660f, + 0.000198f, 0.946777f, 0.000209f, 0.942383f, 0.000209f, 0.937012f, 0.000202f, 0.929199f, + 0.000189f, 0.922363f, 0.000174f, 0.912598f, 0.000156f, 0.901855f, 0.000138f, 0.889160f, + 0.000139f, 0.873047f, 0.000157f, 0.852539f, 0.000139f, 0.826660f, 0.000142f, 0.792480f, + 0.000139f, 0.744141f, 0.000136f, 0.667969f, 0.000144f, 0.532715f, 0.000154f, 0.218384f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, + 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.990723f, 0.000000f, 0.990234f, + 0.000000f, 0.989746f, 0.000000f, 0.988281f, 0.000000f, 0.987305f, 0.000000f, 0.986328f, + 0.000000f, 0.985352f, 0.000000f, 0.983398f, 0.000013f, 0.982422f, 0.000042f, 0.981934f, + 0.000083f, 0.979980f, 0.000126f, 0.978027f, 0.000174f, 0.976074f, 0.000223f, 0.974609f, + 0.000277f, 0.972656f, 0.000325f, 0.970215f, 0.000384f, 0.967285f, 0.000425f, 0.964844f, + 0.000434f, 0.961914f, 0.000435f, 0.958984f, 0.000422f, 0.955078f, 0.000404f, 0.950684f, + 0.000386f, 0.945801f, 0.000355f, 0.940430f, 0.000329f, 0.935059f, 0.000301f, 0.927734f, + 0.000294f, 0.919922f, 0.000316f, 0.911133f, 0.000342f, 0.899414f, 0.000317f, 0.886719f, + 0.000304f, 0.871094f, 0.000316f, 0.850586f, 0.000306f, 0.824219f, 0.000306f, 0.790039f, + 0.000317f, 0.741699f, 0.000325f, 0.665527f, 0.000368f, 0.531738f, 0.000336f, 0.218750f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, 0.000000f, 0.992188f, + 0.000000f, 0.991699f, 0.000009f, 0.991211f, 0.000045f, 0.990234f, 0.000088f, 0.989258f, + 0.000141f, 0.988770f, 0.000193f, 0.988281f, 0.000254f, 0.986816f, 0.000309f, 0.985352f, + 0.000371f, 0.984375f, 0.000433f, 0.983398f, 0.000489f, 0.981934f, 0.000550f, 0.980469f, + 0.000613f, 0.978516f, 0.000669f, 0.977539f, 0.000721f, 0.975586f, 0.000754f, 0.973145f, + 0.000756f, 0.971191f, 0.000737f, 0.969238f, 0.000710f, 0.966309f, 0.000686f, 0.963379f, + 0.000653f, 0.960449f, 0.000606f, 0.957031f, 0.000570f, 0.953125f, 0.000548f, 0.949219f, + 0.000551f, 0.944336f, 0.000556f, 0.938965f, 0.000592f, 0.933105f, 0.000615f, 0.926758f, + 0.000588f, 0.917480f, 0.000569f, 0.908691f, 0.000591f, 0.897949f, 0.000594f, 0.884277f, + 0.000582f, 0.868164f, 0.000609f, 0.848145f, 0.000600f, 0.822266f, 0.000624f, 0.787598f, + 0.000664f, 0.738770f, 0.000690f, 0.664062f, 0.000762f, 0.530273f, 0.000609f, 0.218628f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.996094f, 0.000009f, 0.996094f, 0.000054f, 0.995605f, 0.000109f, 0.994629f, + 0.000180f, 0.993652f, 0.000247f, 0.993164f, 0.000314f, 0.992676f, 0.000393f, 0.992188f, + 0.000460f, 0.990723f, 0.000523f, 0.990234f, 0.000603f, 0.989258f, 0.000671f, 0.988770f, + 0.000731f, 0.988281f, 0.000796f, 0.987305f, 0.000869f, 0.985840f, 0.000931f, 0.984863f, + 0.000986f, 0.983887f, 0.001042f, 0.982422f, 0.001111f, 0.980957f, 0.001141f, 0.979004f, + 0.001129f, 0.977539f, 0.001094f, 0.976562f, 0.001068f, 0.974609f, 0.001030f, 0.971680f, + 0.000982f, 0.970215f, 0.000919f, 0.967285f, 0.000896f, 0.965332f, 0.000896f, 0.961914f, + 0.000907f, 0.958496f, 0.000920f, 0.955566f, 0.000946f, 0.952148f, 0.000954f, 0.946777f, + 0.000996f, 0.942383f, 0.000986f, 0.937012f, 0.000992f, 0.930664f, 0.000962f, 0.923828f, + 0.000999f, 0.915039f, 0.001023f, 0.906250f, 0.001049f, 0.895020f, 0.001014f, 0.880859f, + 0.001073f, 0.864746f, 0.001107f, 0.844727f, 0.001101f, 0.818359f, 0.001165f, 0.784668f, + 0.001243f, 0.735352f, 0.001321f, 0.661133f, 0.001458f, 0.528320f, 0.000982f, 0.218750f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000040f, 0.997559f, + 0.000125f, 0.997070f, 0.000202f, 0.996582f, 0.000307f, 0.996582f, 0.000395f, 0.996094f, + 0.000472f, 0.996094f, 0.000576f, 0.995117f, 0.000659f, 0.994629f, 0.000728f, 0.994141f, + 0.000812f, 0.993652f, 0.000898f, 0.993164f, 0.000970f, 0.992188f, 0.001029f, 0.991211f, + 0.001099f, 0.990723f, 0.001179f, 0.989258f, 0.001245f, 0.988770f, 0.001302f, 0.988281f, + 0.001349f, 0.986816f, 0.001421f, 0.985840f, 0.001489f, 0.984863f, 0.001543f, 0.984375f, + 0.001539f, 0.983398f, 0.001496f, 0.981445f, 0.001463f, 0.979980f, 0.001421f, 0.978027f, + 0.001372f, 0.976562f, 0.001354f, 0.974609f, 0.001354f, 0.972656f, 0.001341f, 0.971191f, + 0.001372f, 0.968262f, 0.001408f, 0.965820f, 0.001438f, 0.962891f, 0.001471f, 0.960938f, + 0.001439f, 0.956543f, 0.001493f, 0.953613f, 0.001564f, 0.949219f, 0.001599f, 0.944824f, + 0.001520f, 0.940430f, 0.001563f, 0.934570f, 0.001614f, 0.928223f, 0.001697f, 0.920898f, + 0.001627f, 0.912598f, 0.001644f, 0.902832f, 0.001767f, 0.892090f, 0.001718f, 0.877930f, + 0.001780f, 0.861328f, 0.001869f, 0.840820f, 0.001884f, 0.814941f, 0.002008f, 0.780273f, + 0.002163f, 0.731934f, 0.002293f, 0.658203f, 0.002483f, 0.526367f, 0.001459f, 0.218140f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000059f, 0.998535f, 0.000189f, 0.998535f, + 0.000311f, 0.998047f, 0.000439f, 0.997559f, 0.000566f, 0.997559f, 0.000655f, 0.997070f, + 0.000767f, 0.996582f, 0.000879f, 0.996582f, 0.000962f, 0.996094f, 0.001024f, 0.995605f, + 0.001130f, 0.995117f, 0.001223f, 0.994629f, 0.001292f, 0.994141f, 0.001348f, 0.993652f, + 0.001412f, 0.993164f, 0.001506f, 0.992676f, 0.001577f, 0.991699f, 0.001634f, 0.990234f, + 0.001678f, 0.989746f, 0.001728f, 0.988770f, 0.001814f, 0.988281f, 0.001879f, 0.986816f, + 0.001928f, 0.985840f, 0.001916f, 0.984863f, 0.001863f, 0.983887f, 0.001880f, 0.982910f, + 0.001885f, 0.981445f, 0.001899f, 0.979980f, 0.001921f, 0.978516f, 0.001940f, 0.977051f, + 0.001894f, 0.974609f, 0.001963f, 0.973145f, 0.002008f, 0.971191f, 0.002060f, 0.969238f, + 0.001989f, 0.967285f, 0.002029f, 0.963867f, 0.002153f, 0.961426f, 0.002289f, 0.958008f, + 0.002226f, 0.955078f, 0.002268f, 0.951172f, 0.002287f, 0.946777f, 0.002346f, 0.942871f, + 0.002325f, 0.937012f, 0.002436f, 0.931641f, 0.002487f, 0.925293f, 0.002548f, 0.917969f, + 0.002508f, 0.909180f, 0.002623f, 0.898926f, 0.002729f, 0.888184f, 0.002832f, 0.874512f, + 0.002817f, 0.857422f, 0.002996f, 0.836426f, 0.003170f, 0.811035f, 0.003237f, 0.775391f, + 0.003504f, 0.727539f, 0.003695f, 0.654297f, 0.003901f, 0.523926f, 0.002045f, 0.217896f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000162f, 0.999023f, + 0.000390f, 0.999023f, 0.000528f, 0.998535f, 0.000705f, 0.998535f, 0.000843f, 0.998047f, + 0.000922f, 0.997559f, 0.001056f, 0.997559f, 0.001181f, 0.997070f, 0.001257f, 0.996582f, + 0.001308f, 0.996582f, 0.001427f, 0.995605f, 0.001532f, 0.995605f, 0.001599f, 0.995117f, + 0.001647f, 0.994141f, 0.001682f, 0.994141f, 0.001808f, 0.993652f, 0.001889f, 0.992676f, + 0.001945f, 0.992676f, 0.001984f, 0.991699f, 0.002012f, 0.991211f, 0.002106f, 0.990234f, + 0.002188f, 0.989258f, 0.002283f, 0.988281f, 0.002369f, 0.986816f, 0.002407f, 0.986328f, + 0.002399f, 0.984375f, 0.002512f, 0.983887f, 0.002523f, 0.982422f, 0.002562f, 0.980957f, + 0.002609f, 0.979980f, 0.002539f, 0.979004f, 0.002550f, 0.977051f, 0.002666f, 0.975098f, + 0.002747f, 0.973633f, 0.002701f, 0.971191f, 0.002817f, 0.969238f, 0.002935f, 0.967285f, + 0.003052f, 0.964844f, 0.003050f, 0.961914f, 0.003138f, 0.958984f, 0.003212f, 0.955566f, + 0.003294f, 0.952637f, 0.003185f, 0.948242f, 0.003323f, 0.944336f, 0.003508f, 0.939453f, + 0.003599f, 0.934570f, 0.003523f, 0.928223f, 0.003628f, 0.921875f, 0.003771f, 0.914062f, + 0.003790f, 0.905273f, 0.003918f, 0.895508f, 0.004101f, 0.883789f, 0.004288f, 0.869629f, + 0.004326f, 0.852051f, 0.004604f, 0.832031f, 0.004807f, 0.805664f, 0.004974f, 0.770508f, + 0.005367f, 0.722656f, 0.005646f, 0.649902f, 0.005753f, 0.521484f, 0.002733f, 0.217651f, + 0.000000f, 1.000000f, 0.000283f, 0.999512f, 0.000583f, 0.999023f, 0.000735f, 0.999023f, + 0.000912f, 0.999023f, 0.001087f, 0.998535f, 0.001146f, 0.998047f, 0.001266f, 0.997559f, + 0.001438f, 0.997070f, 0.001505f, 0.997070f, 0.001540f, 0.997070f, 0.001649f, 0.996094f, + 0.001796f, 0.995605f, 0.001860f, 0.995117f, 0.001897f, 0.995117f, 0.001920f, 0.994629f, + 0.002056f, 0.994141f, 0.002159f, 0.993164f, 0.002211f, 0.992676f, 0.002254f, 0.992188f, + 0.002344f, 0.991211f, 0.002481f, 0.990723f, 0.002724f, 0.989746f, 0.002876f, 0.989258f, + 0.003019f, 0.988281f, 0.003061f, 0.987305f, 0.003113f, 0.985840f, 0.003176f, 0.984863f, + 0.003315f, 0.983887f, 0.003281f, 0.981934f, 0.003330f, 0.980957f, 0.003260f, 0.979980f, + 0.003338f, 0.978027f, 0.003477f, 0.976562f, 0.003523f, 0.975586f, 0.003693f, 0.973145f, + 0.003826f, 0.971680f, 0.003952f, 0.969727f, 0.003883f, 0.966797f, 0.004040f, 0.964355f, + 0.004261f, 0.962402f, 0.004181f, 0.959473f, 0.004276f, 0.956055f, 0.004398f, 0.953125f, + 0.004566f, 0.949219f, 0.004517f, 0.945312f, 0.004738f, 0.940430f, 0.004936f, 0.935547f, + 0.005054f, 0.930664f, 0.005051f, 0.924316f, 0.005234f, 0.917969f, 0.005444f, 0.910156f, + 0.005726f, 0.900879f, 0.005711f, 0.890625f, 0.005913f, 0.878418f, 0.006268f, 0.865234f, + 0.006367f, 0.847168f, 0.006763f, 0.826172f, 0.007072f, 0.799805f, 0.007370f, 0.765137f, + 0.007851f, 0.717285f, 0.008171f, 0.645508f, 0.008095f, 0.519043f, 0.003527f, 0.217285f, + 0.000000f, 1.000000f, 0.000454f, 0.999512f, 0.000876f, 0.999023f, 0.000887f, 0.999023f, + 0.001265f, 0.998535f, 0.001296f, 0.998047f, 0.001307f, 0.998047f, 0.001639f, 0.997070f, + 0.001685f, 0.997070f, 0.001702f, 0.997070f, 0.001711f, 0.996094f, 0.002014f, 0.995605f, + 0.002060f, 0.995117f, 0.002081f, 0.995117f, 0.002098f, 0.994629f, 0.002354f, 0.993652f, + 0.002579f, 0.992676f, 0.002739f, 0.992188f, 0.002876f, 0.991699f, 0.002989f, 0.991211f, + 0.003126f, 0.990234f, 0.003471f, 0.989746f, 0.003611f, 0.988770f, 0.003761f, 0.987793f, + 0.003876f, 0.986816f, 0.003967f, 0.986328f, 0.003990f, 0.985352f, 0.004181f, 0.983398f, + 0.004204f, 0.981934f, 0.004349f, 0.980957f, 0.004303f, 0.979492f, 0.004467f, 0.978027f, + 0.004406f, 0.976562f, 0.004726f, 0.974609f, 0.004894f, 0.973145f, 0.004879f, 0.971191f, + 0.005127f, 0.969238f, 0.005325f, 0.967285f, 0.005226f, 0.964355f, 0.005489f, 0.961914f, + 0.005699f, 0.958984f, 0.005936f, 0.956543f, 0.005852f, 0.953125f, 0.006084f, 0.949707f, + 0.006226f, 0.945801f, 0.006596f, 0.941895f, 0.006546f, 0.937012f, 0.006844f, 0.931641f, + 0.007099f, 0.926270f, 0.006989f, 0.920410f, 0.007378f, 0.913086f, 0.007694f, 0.904785f, + 0.008011f, 0.895996f, 0.008156f, 0.885254f, 0.008377f, 0.873047f, 0.008972f, 0.859375f, + 0.009071f, 0.840820f, 0.009613f, 0.820312f, 0.010048f, 0.793945f, 0.010605f, 0.759277f, + 0.011101f, 0.711426f, 0.011467f, 0.641602f, 0.010971f, 0.515137f, 0.004417f, 0.216675f, + 0.000000f, 1.000000f, 0.000478f, 0.999512f, 0.000937f, 0.999023f, 0.000935f, 0.999023f, + 0.001370f, 0.998047f, 0.001376f, 0.998047f, 0.001375f, 0.997559f, 0.001784f, 0.997070f, + 0.001797f, 0.997070f, 0.001800f, 0.996094f, 0.002129f, 0.995605f, 0.002331f, 0.995117f, + 0.002481f, 0.995117f, 0.002640f, 0.994141f, 0.002777f, 0.993164f, 0.003212f, 0.992676f, + 0.003407f, 0.992188f, 0.003534f, 0.991211f, 0.003628f, 0.990234f, 0.003759f, 0.990234f, + 0.004135f, 0.989258f, 0.004288f, 0.988281f, 0.004436f, 0.986816f, 0.004650f, 0.986328f, + 0.004868f, 0.985840f, 0.005051f, 0.984375f, 0.005493f, 0.983398f, 0.005547f, 0.982422f, + 0.005554f, 0.980469f, 0.005535f, 0.978516f, 0.005722f, 0.977539f, 0.005684f, 0.975586f, + 0.006145f, 0.974121f, 0.006226f, 0.972656f, 0.006470f, 0.970215f, 0.006695f, 0.968750f, + 0.006741f, 0.966309f, 0.007027f, 0.964355f, 0.007431f, 0.961914f, 0.007450f, 0.958984f, + 0.007687f, 0.955566f, 0.007912f, 0.952637f, 0.008232f, 0.949707f, 0.008224f, 0.945801f, + 0.008514f, 0.942383f, 0.008972f, 0.937500f, 0.009079f, 0.932617f, 0.009254f, 0.927246f, + 0.009735f, 0.921875f, 0.009949f, 0.915039f, 0.010292f, 0.907227f, 0.010796f, 0.899414f, + 0.011063f, 0.890137f, 0.011391f, 0.879395f, 0.011749f, 0.867188f, 0.012482f, 0.852539f, + 0.012627f, 0.834473f, 0.013458f, 0.813477f, 0.014153f, 0.787109f, 0.014656f, 0.751953f, + 0.015251f, 0.705566f, 0.015533f, 0.635742f, 0.014473f, 0.512207f, 0.005421f, 0.216675f, + 0.000000f, 1.000000f, 0.000485f, 0.999512f, 0.000958f, 0.999023f, 0.000955f, 0.998535f, + 0.001413f, 0.998047f, 0.001412f, 0.997559f, 0.001410f, 0.997559f, 0.001955f, 0.996582f, + 0.002161f, 0.996094f, 0.002302f, 0.995605f, 0.002899f, 0.995117f, 0.003059f, 0.994629f, + 0.003204f, 0.993652f, 0.003359f, 0.993164f, 0.003462f, 0.992676f, 0.003925f, 0.991699f, + 0.004097f, 0.990723f, 0.004242f, 0.990234f, 0.004421f, 0.989746f, 0.004589f, 0.988770f, + 0.005215f, 0.987305f, 0.005451f, 0.986816f, 0.005676f, 0.985840f, 0.005856f, 0.984375f, + 0.006008f, 0.983398f, 0.006287f, 0.982910f, 0.006908f, 0.981445f, 0.007187f, 0.979980f, + 0.007233f, 0.978516f, 0.007252f, 0.976562f, 0.007294f, 0.975098f, 0.007553f, 0.973633f, + 0.007935f, 0.971191f, 0.008286f, 0.969238f, 0.008316f, 0.967285f, 0.008659f, 0.965332f, + 0.009064f, 0.963379f, 0.009216f, 0.960938f, 0.009903f, 0.958496f, 0.010216f, 0.955566f, + 0.010025f, 0.951660f, 0.010536f, 0.948730f, 0.010933f, 0.945312f, 0.011009f, 0.941406f, + 0.011765f, 0.937500f, 0.012001f, 0.932617f, 0.012581f, 0.927246f, 0.012665f, 0.921875f, + 0.013222f, 0.916016f, 0.013664f, 0.909668f, 0.014168f, 0.901855f, 0.014641f, 0.892578f, + 0.015327f, 0.883789f, 0.015610f, 0.872559f, 0.016205f, 0.859863f, 0.017136f, 0.844727f, + 0.017776f, 0.827148f, 0.018494f, 0.805664f, 0.019348f, 0.779785f, 0.020172f, 0.744629f, + 0.020935f, 0.698242f, 0.020721f, 0.629395f, 0.018860f, 0.508789f, 0.006603f, 0.216309f, + 0.000000f, 1.000000f, 0.000487f, 0.999512f, 0.000967f, 0.999023f, 0.000965f, 0.998535f, + 0.001539f, 0.998047f, 0.001799f, 0.997559f, 0.001986f, 0.997070f, 0.002672f, 0.996094f, + 0.002831f, 0.995605f, 0.002928f, 0.995117f, 0.003559f, 0.994141f, 0.003691f, 0.993652f, + 0.003765f, 0.993164f, 0.003956f, 0.992676f, 0.004223f, 0.991699f, 0.004860f, 0.990234f, + 0.005089f, 0.989746f, 0.005314f, 0.989258f, 0.005600f, 0.987793f, 0.005814f, 0.987305f, + 0.006371f, 0.986328f, 0.006638f, 0.984863f, 0.006969f, 0.983887f, 0.007313f, 0.982910f, + 0.007584f, 0.981445f, 0.008240f, 0.980469f, 0.008545f, 0.979004f, 0.008865f, 0.977539f, + 0.009293f, 0.976074f, 0.009712f, 0.974609f, 0.009514f, 0.972656f, 0.009903f, 0.970703f, + 0.010307f, 0.968262f, 0.010475f, 0.966309f, 0.010971f, 0.963867f, 0.011154f, 0.961914f, + 0.011650f, 0.959473f, 0.012138f, 0.957520f, 0.012650f, 0.953613f, 0.013351f, 0.951172f, + 0.013626f, 0.947754f, 0.013710f, 0.943848f, 0.014153f, 0.940430f, 0.014900f, 0.936523f, + 0.015396f, 0.931641f, 0.016159f, 0.927246f, 0.016464f, 0.921875f, 0.016968f, 0.916016f, + 0.017761f, 0.910156f, 0.018387f, 0.902832f, 0.018799f, 0.895020f, 0.019791f, 0.886230f, + 0.020660f, 0.876465f, 0.021423f, 0.865234f, 0.022202f, 0.852539f, 0.023148f, 0.836914f, + 0.024643f, 0.819336f, 0.025253f, 0.797852f, 0.026154f, 0.771484f, 0.026993f, 0.736816f, + 0.028061f, 0.691406f, 0.027481f, 0.624023f, 0.024109f, 0.504395f, 0.007988f, 0.216431f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000641f, 0.999023f, 0.001480f, 0.998535f, + 0.002151f, 0.997559f, 0.002422f, 0.997070f, 0.002567f, 0.996582f, 0.003101f, 0.995605f, + 0.003361f, 0.995117f, 0.003481f, 0.994629f, 0.003693f, 0.993652f, 0.004490f, 0.992676f, + 0.004822f, 0.991699f, 0.005047f, 0.991211f, 0.005234f, 0.990234f, 0.005955f, 0.989258f, + 0.006237f, 0.988281f, 0.006535f, 0.987305f, 0.006855f, 0.986816f, 0.007160f, 0.985352f, + 0.007912f, 0.983887f, 0.008301f, 0.982910f, 0.008652f, 0.981934f, 0.009003f, 0.980469f, + 0.009377f, 0.979492f, 0.010094f, 0.977539f, 0.010635f, 0.976562f, 0.011108f, 0.974609f, + 0.011559f, 0.973145f, 0.012016f, 0.971680f, 0.012405f, 0.969727f, 0.012703f, 0.967773f, + 0.013062f, 0.964844f, 0.013649f, 0.962891f, 0.013824f, 0.959961f, 0.014381f, 0.958008f, + 0.014755f, 0.955078f, 0.015732f, 0.952148f, 0.016190f, 0.949219f, 0.016968f, 0.946289f, + 0.017807f, 0.942871f, 0.017776f, 0.938965f, 0.018433f, 0.935059f, 0.019348f, 0.930664f, + 0.020157f, 0.925781f, 0.020996f, 0.920898f, 0.021469f, 0.915527f, 0.022171f, 0.909668f, + 0.022995f, 0.902832f, 0.024292f, 0.895508f, 0.025345f, 0.887207f, 0.026260f, 0.878418f, + 0.027206f, 0.868164f, 0.028427f, 0.856934f, 0.029480f, 0.843262f, 0.030853f, 0.828125f, + 0.032440f, 0.810547f, 0.033112f, 0.788086f, 0.034393f, 0.762695f, 0.035583f, 0.728027f, + 0.036316f, 0.682617f, 0.035217f, 0.617188f, 0.030334f, 0.500000f, 0.009575f, 0.216064f, + 0.000000f, 1.000000f, 0.000355f, 0.999512f, 0.001255f, 0.999023f, 0.001830f, 0.998047f, + 0.002186f, 0.997559f, 0.002739f, 0.996582f, 0.002975f, 0.996094f, 0.003380f, 0.995605f, + 0.004112f, 0.994141f, 0.004375f, 0.993652f, 0.004822f, 0.992676f, 0.005524f, 0.991699f, + 0.005753f, 0.990723f, 0.006027f, 0.990234f, 0.006519f, 0.988770f, 0.007431f, 0.987793f, + 0.007736f, 0.986816f, 0.008003f, 0.985840f, 0.008316f, 0.984375f, 0.008934f, 0.983398f, + 0.009850f, 0.981934f, 0.010246f, 0.980469f, 0.010574f, 0.979492f, 0.011040f, 0.978027f, + 0.011658f, 0.976562f, 0.012680f, 0.974609f, 0.013138f, 0.973145f, 0.013611f, 0.971191f, + 0.014229f, 0.969727f, 0.014847f, 0.968262f, 0.015526f, 0.965820f, 0.016571f, 0.963867f, + 0.016586f, 0.960938f, 0.016968f, 0.958496f, 0.017715f, 0.956055f, 0.018051f, 0.953125f, + 0.018951f, 0.950195f, 0.019867f, 0.946777f, 0.020782f, 0.943848f, 0.021393f, 0.939941f, + 0.022385f, 0.937012f, 0.023422f, 0.933594f, 0.023590f, 0.928711f, 0.024963f, 0.923828f, + 0.025940f, 0.918945f, 0.026672f, 0.913574f, 0.028107f, 0.908203f, 0.028854f, 0.901855f, + 0.029846f, 0.895020f, 0.031525f, 0.887207f, 0.032776f, 0.878418f, 0.033539f, 0.869141f, + 0.034943f, 0.858887f, 0.036438f, 0.847656f, 0.038147f, 0.833496f, 0.039795f, 0.818359f, + 0.041443f, 0.800293f, 0.042603f, 0.778320f, 0.044464f, 0.752930f, 0.045349f, 0.718750f, + 0.045929f, 0.674316f, 0.044189f, 0.610352f, 0.037537f, 0.496582f, 0.011375f, 0.216064f, + 0.000000f, 1.000000f, 0.000735f, 0.999512f, 0.000921f, 0.999023f, 0.001794f, 0.998047f, + 0.002518f, 0.997070f, 0.002863f, 0.996582f, 0.003952f, 0.995605f, 0.004242f, 0.994629f, + 0.004845f, 0.993652f, 0.005505f, 0.992676f, 0.005920f, 0.991699f, 0.006683f, 0.990723f, + 0.007084f, 0.989258f, 0.007664f, 0.988281f, 0.008087f, 0.987305f, 0.008934f, 0.985840f, + 0.009399f, 0.984375f, 0.009872f, 0.983887f, 0.010544f, 0.982422f, 0.011024f, 0.980957f, + 0.011963f, 0.979004f, 0.012581f, 0.977539f, 0.013084f, 0.976562f, 0.013832f, 0.974609f, + 0.014404f, 0.973145f, 0.015488f, 0.971191f, 0.016220f, 0.969238f, 0.016861f, 0.967285f, + 0.017471f, 0.965820f, 0.018417f, 0.963379f, 0.019241f, 0.961426f, 0.020401f, 0.958984f, + 0.021332f, 0.956543f, 0.021469f, 0.953613f, 0.021942f, 0.950684f, 0.023056f, 0.947754f, + 0.023697f, 0.944336f, 0.025192f, 0.940430f, 0.025955f, 0.937012f, 0.027100f, 0.933594f, + 0.027939f, 0.930176f, 0.029221f, 0.926270f, 0.030334f, 0.921875f, 0.031616f, 0.916016f, + 0.032837f, 0.911133f, 0.033813f, 0.905273f, 0.035217f, 0.899414f, 0.036774f, 0.893555f, + 0.037659f, 0.885742f, 0.039612f, 0.877441f, 0.041382f, 0.869141f, 0.042450f, 0.859375f, + 0.044891f, 0.849121f, 0.046265f, 0.837402f, 0.048096f, 0.823242f, 0.050262f, 0.807617f, + 0.052155f, 0.789551f, 0.053284f, 0.768066f, 0.055817f, 0.742188f, 0.056824f, 0.708984f, + 0.057190f, 0.665527f, 0.054596f, 0.603516f, 0.045319f, 0.492188f, 0.013229f, 0.215332f, + 0.000000f, 1.000000f, 0.000934f, 0.999023f, 0.001148f, 0.998535f, 0.002024f, 0.998047f, + 0.002687f, 0.997070f, 0.003914f, 0.996094f, 0.004650f, 0.994141f, 0.005211f, 0.994141f, + 0.005894f, 0.992676f, 0.006775f, 0.991211f, 0.007172f, 0.990234f, 0.007748f, 0.989258f, + 0.008934f, 0.987793f, 0.009369f, 0.986328f, 0.009979f, 0.985352f, 0.011055f, 0.983398f, + 0.011513f, 0.982422f, 0.012329f, 0.980957f, 0.013000f, 0.979004f, 0.013741f, 0.978027f, + 0.014748f, 0.976074f, 0.015320f, 0.974609f, 0.016357f, 0.972656f, 0.017105f, 0.970703f, + 0.017838f, 0.968750f, 0.019135f, 0.966797f, 0.019913f, 0.964844f, 0.020676f, 0.962891f, + 0.021820f, 0.960449f, 0.022766f, 0.958008f, 0.024200f, 0.955566f, 0.025208f, 0.953125f, + 0.026184f, 0.950684f, 0.027283f, 0.947754f, 0.027756f, 0.944336f, 0.028671f, 0.940918f, + 0.030365f, 0.937500f, 0.031235f, 0.933594f, 0.032257f, 0.929688f, 0.033600f, 0.925781f, + 0.035065f, 0.922363f, 0.036407f, 0.917480f, 0.038574f, 0.912598f, 0.039642f, 0.907227f, + 0.040833f, 0.901367f, 0.042450f, 0.895508f, 0.044098f, 0.889648f, 0.046112f, 0.882812f, + 0.047974f, 0.875488f, 0.049896f, 0.866699f, 0.051941f, 0.857910f, 0.053986f, 0.848633f, + 0.055481f, 0.837402f, 0.057922f, 0.825195f, 0.060852f, 0.811523f, 0.062683f, 0.795410f, + 0.064941f, 0.777832f, 0.067017f, 0.757324f, 0.068665f, 0.730957f, 0.069763f, 0.698242f, + 0.069580f, 0.656250f, 0.065613f, 0.595215f, 0.053711f, 0.486572f, 0.015366f, 0.214600f, + 0.000000f, 1.000000f, 0.000858f, 0.999512f, 0.001794f, 0.998535f, 0.002520f, 0.997559f, + 0.002977f, 0.996582f, 0.004337f, 0.995117f, 0.005489f, 0.993652f, 0.006302f, 0.992676f, + 0.007290f, 0.991211f, 0.008499f, 0.989746f, 0.008911f, 0.988770f, 0.009445f, 0.987305f, + 0.011124f, 0.985840f, 0.011757f, 0.983887f, 0.012253f, 0.982910f, 0.013069f, 0.980957f, + 0.014503f, 0.979492f, 0.015312f, 0.977051f, 0.016159f, 0.976074f, 0.016953f, 0.974121f, + 0.018097f, 0.972168f, 0.019211f, 0.970215f, 0.020325f, 0.968262f, 0.021149f, 0.965820f, + 0.022156f, 0.964355f, 0.023560f, 0.961426f, 0.024460f, 0.959473f, 0.025833f, 0.957031f, + 0.027039f, 0.954102f, 0.028168f, 0.952148f, 0.029831f, 0.949219f, 0.030991f, 0.946289f, + 0.032227f, 0.943848f, 0.033722f, 0.940430f, 0.035248f, 0.937012f, 0.035980f, 0.933594f, + 0.037506f, 0.929199f, 0.039062f, 0.925293f, 0.040283f, 0.921387f, 0.041504f, 0.916992f, + 0.043640f, 0.912598f, 0.045135f, 0.907715f, 0.047607f, 0.902344f, 0.049683f, 0.897461f, + 0.050781f, 0.891113f, 0.052704f, 0.885254f, 0.054474f, 0.878418f, 0.056885f, 0.871094f, + 0.060059f, 0.863770f, 0.061310f, 0.854492f, 0.063721f, 0.845703f, 0.066345f, 0.836426f, + 0.068298f, 0.824707f, 0.071350f, 0.812988f, 0.074036f, 0.798340f, 0.076355f, 0.782715f, + 0.078796f, 0.765137f, 0.081299f, 0.745117f, 0.083557f, 0.718750f, 0.084473f, 0.687500f, + 0.083252f, 0.646484f, 0.077881f, 0.586914f, 0.063232f, 0.482422f, 0.017685f, 0.213745f, + 0.000000f, 1.000000f, 0.001359f, 0.999023f, 0.002169f, 0.998047f, 0.003540f, 0.996582f, + 0.003876f, 0.996094f, 0.005264f, 0.994141f, 0.006310f, 0.993164f, 0.007359f, 0.991699f, + 0.009186f, 0.989258f, 0.009979f, 0.988281f, 0.011093f, 0.986328f, 0.011971f, 0.984863f, + 0.013268f, 0.982910f, 0.014565f, 0.980957f, 0.015312f, 0.979492f, 0.016327f, 0.978027f, + 0.018097f, 0.975586f, 0.019119f, 0.973633f, 0.020050f, 0.971680f, 0.020950f, 0.970215f, + 0.022568f, 0.967285f, 0.024017f, 0.964844f, 0.025223f, 0.962402f, 0.026306f, 0.960449f, + 0.027466f, 0.958496f, 0.029068f, 0.955566f, 0.030731f, 0.953125f, 0.032196f, 0.950195f, + 0.033478f, 0.947266f, 0.034943f, 0.944336f, 0.036713f, 0.941406f, 0.038208f, 0.938477f, + 0.039795f, 0.935059f, 0.041840f, 0.931152f, 0.043579f, 0.927734f, 0.045319f, 0.924316f, + 0.046722f, 0.919922f, 0.048157f, 0.915527f, 0.049622f, 0.911133f, 0.052094f, 0.906250f, + 0.053894f, 0.900879f, 0.056152f, 0.895996f, 0.058502f, 0.890625f, 0.060913f, 0.885254f, + 0.062988f, 0.879395f, 0.064880f, 0.873047f, 0.067749f, 0.865723f, 0.070068f, 0.857910f, + 0.073242f, 0.850098f, 0.075073f, 0.841309f, 0.078125f, 0.832031f, 0.080688f, 0.822266f, + 0.083252f, 0.810547f, 0.087158f, 0.797852f, 0.089722f, 0.784180f, 0.092163f, 0.768555f, + 0.094910f, 0.751465f, 0.097168f, 0.730957f, 0.099060f, 0.705566f, 0.099915f, 0.675293f, + 0.097839f, 0.635742f, 0.091858f, 0.579102f, 0.073059f, 0.477051f, 0.019882f, 0.212280f, + 0.000000f, 1.000000f, 0.001362f, 0.999023f, 0.002325f, 0.998047f, 0.004128f, 0.996582f, + 0.005375f, 0.995117f, 0.006443f, 0.993652f, 0.007488f, 0.991699f, 0.009224f, 0.989746f, + 0.011116f, 0.987305f, 0.012489f, 0.986328f, 0.013626f, 0.983887f, 0.015244f, 0.981934f, + 0.016678f, 0.979492f, 0.017624f, 0.978027f, 0.019348f, 0.975586f, 0.020630f, 0.973145f, + 0.022202f, 0.971191f, 0.023865f, 0.968262f, 0.024963f, 0.966309f, 0.026428f, 0.964355f, + 0.028244f, 0.961426f, 0.030136f, 0.958496f, 0.031403f, 0.956055f, 0.032806f, 0.953613f, + 0.034119f, 0.950684f, 0.036438f, 0.947754f, 0.038391f, 0.944336f, 0.040070f, 0.941406f, + 0.041656f, 0.938477f, 0.043335f, 0.935547f, 0.045410f, 0.932129f, 0.047516f, 0.928223f, + 0.049835f, 0.924316f, 0.051788f, 0.920898f, 0.053864f, 0.916992f, 0.055847f, 0.913086f, + 0.058380f, 0.908691f, 0.059692f, 0.904297f, 0.062195f, 0.898926f, 0.064331f, 0.893555f, + 0.066833f, 0.888184f, 0.068970f, 0.882812f, 0.072083f, 0.877441f, 0.074402f, 0.871582f, + 0.077332f, 0.865723f, 0.080078f, 0.858398f, 0.082642f, 0.850586f, 0.085205f, 0.842773f, + 0.088684f, 0.834473f, 0.092224f, 0.826660f, 0.094116f, 0.816895f, 0.097839f, 0.806152f, + 0.101135f, 0.795410f, 0.104187f, 0.782227f, 0.107483f, 0.768555f, 0.109863f, 0.753906f, + 0.112488f, 0.737305f, 0.114929f, 0.716309f, 0.116516f, 0.691406f, 0.116882f, 0.663086f, + 0.113464f, 0.625000f, 0.105530f, 0.569336f, 0.083435f, 0.471436f, 0.022491f, 0.211182f, + 0.000000f, 1.000000f, 0.002094f, 0.998535f, 0.003090f, 0.997559f, 0.005455f, 0.995605f, + 0.007267f, 0.993652f, 0.008560f, 0.991699f, 0.009834f, 0.989746f, 0.011719f, 0.987793f, + 0.012741f, 0.986328f, 0.015282f, 0.983398f, 0.017609f, 0.980469f, 0.018875f, 0.978516f, + 0.021103f, 0.975586f, 0.022339f, 0.973145f, 0.024857f, 0.970703f, 0.026581f, 0.967773f, + 0.028137f, 0.964844f, 0.029907f, 0.962402f, 0.031952f, 0.959473f, 0.033630f, 0.956543f, + 0.035675f, 0.953613f, 0.037811f, 0.950684f, 0.039337f, 0.947754f, 0.041168f, 0.944824f, + 0.043427f, 0.941406f, 0.046204f, 0.937988f, 0.048157f, 0.934570f, 0.050018f, 0.931152f, + 0.051910f, 0.927734f, 0.053955f, 0.924316f, 0.057037f, 0.919922f, 0.059662f, 0.916016f, + 0.061920f, 0.912109f, 0.064270f, 0.908203f, 0.066528f, 0.903809f, 0.068848f, 0.899902f, + 0.072144f, 0.895020f, 0.074951f, 0.890137f, 0.077271f, 0.884277f, 0.079651f, 0.878906f, + 0.082031f, 0.873047f, 0.084961f, 0.867676f, 0.087891f, 0.861816f, 0.090881f, 0.855469f, + 0.094727f, 0.848633f, 0.097778f, 0.841797f, 0.100586f, 0.833984f, 0.104187f, 0.826172f, + 0.107117f, 0.817871f, 0.110535f, 0.809570f, 0.113342f, 0.799316f, 0.117310f, 0.789062f, + 0.121033f, 0.777832f, 0.123718f, 0.765137f, 0.126953f, 0.752441f, 0.129517f, 0.737793f, + 0.132568f, 0.720703f, 0.134521f, 0.700684f, 0.134888f, 0.676758f, 0.135010f, 0.649902f, + 0.130249f, 0.614258f, 0.120850f, 0.560059f, 0.094421f, 0.466797f, 0.025146f, 0.210083f, + 0.000000f, 1.000000f, 0.002527f, 0.998535f, 0.004539f, 0.996582f, 0.006218f, 0.994629f, + 0.008965f, 0.992188f, 0.011086f, 0.989746f, 0.013046f, 0.987305f, 0.015526f, 0.984375f, + 0.016754f, 0.982422f, 0.019302f, 0.979492f, 0.022369f, 0.975586f, 0.024353f, 0.973145f, + 0.026764f, 0.970215f, 0.029572f, 0.966797f, 0.031311f, 0.963867f, 0.034027f, 0.960449f, + 0.035706f, 0.958008f, 0.038391f, 0.954102f, 0.040985f, 0.950684f, 0.042938f, 0.947266f, + 0.045349f, 0.943848f, 0.047760f, 0.940918f, 0.050201f, 0.937012f, 0.052917f, 0.933105f, + 0.055176f, 0.929688f, 0.057831f, 0.925781f, 0.060547f, 0.921875f, 0.062744f, 0.918457f, + 0.065796f, 0.914062f, 0.068481f, 0.910156f, 0.071960f, 0.905762f, 0.074524f, 0.900879f, + 0.077148f, 0.896973f, 0.079712f, 0.892578f, 0.082458f, 0.888184f, 0.086426f, 0.882812f, + 0.089478f, 0.877930f, 0.092957f, 0.872559f, 0.095581f, 0.867188f, 0.098267f, 0.861816f, + 0.100952f, 0.855957f, 0.104126f, 0.850098f, 0.107727f, 0.843262f, 0.111694f, 0.836426f, + 0.114990f, 0.829102f, 0.118652f, 0.822754f, 0.121948f, 0.815430f, 0.125000f, 0.807129f, + 0.127930f, 0.798828f, 0.132202f, 0.789551f, 0.136475f, 0.780273f, 0.139404f, 0.769531f, + 0.142944f, 0.758789f, 0.145874f, 0.747070f, 0.149170f, 0.734375f, 0.151611f, 0.720215f, + 0.154175f, 0.703125f, 0.155396f, 0.684082f, 0.156128f, 0.662598f, 0.153809f, 0.636230f, + 0.147827f, 0.602051f, 0.135620f, 0.549805f, 0.105591f, 0.460693f, 0.027939f, 0.209229f, + 0.000000f, 1.000000f, 0.003227f, 0.998047f, 0.006054f, 0.995605f, 0.008911f, 0.993164f, + 0.011330f, 0.990234f, 0.014748f, 0.986816f, 0.017776f, 0.983398f, 0.020035f, 0.980469f, + 0.023392f, 0.977051f, 0.025986f, 0.973633f, 0.028366f, 0.970215f, 0.031219f, 0.966797f, + 0.034973f, 0.962402f, 0.038177f, 0.958496f, 0.040833f, 0.955078f, 0.043762f, 0.951172f, + 0.047180f, 0.946777f, 0.050049f, 0.942871f, 0.052460f, 0.939453f, 0.055725f, 0.935547f, + 0.058777f, 0.931641f, 0.061584f, 0.927246f, 0.065125f, 0.922852f, 0.067749f, 0.918945f, + 0.070801f, 0.915039f, 0.073425f, 0.910645f, 0.077271f, 0.905762f, 0.080688f, 0.901367f, + 0.083679f, 0.896484f, 0.086609f, 0.892578f, 0.090393f, 0.887695f, 0.093262f, 0.883301f, + 0.096252f, 0.878906f, 0.100037f, 0.873535f, 0.103760f, 0.868164f, 0.107483f, 0.862793f, + 0.111206f, 0.857422f, 0.114502f, 0.852539f, 0.117798f, 0.847168f, 0.120667f, 0.841797f, + 0.123901f, 0.834961f, 0.128052f, 0.828125f, 0.131836f, 0.821289f, 0.135498f, 0.814453f, + 0.138794f, 0.807617f, 0.142578f, 0.800781f, 0.145874f, 0.793945f, 0.149536f, 0.786133f, + 0.153931f, 0.776855f, 0.157715f, 0.768066f, 0.161499f, 0.758789f, 0.164062f, 0.748535f, + 0.167480f, 0.737793f, 0.170410f, 0.727539f, 0.172607f, 0.714844f, 0.175659f, 0.700684f, + 0.177246f, 0.684570f, 0.178467f, 0.666992f, 0.177979f, 0.646973f, 0.173706f, 0.622559f, + 0.166504f, 0.588867f, 0.151367f, 0.540039f, 0.117126f, 0.455078f, 0.030991f, 0.207886f, + 0.000000f, 1.000000f, 0.003941f, 0.998047f, 0.007965f, 0.994629f, 0.012810f, 0.990234f, + 0.015900f, 0.987305f, 0.020020f, 0.982422f, 0.023926f, 0.978516f, 0.028427f, 0.974121f, + 0.032104f, 0.969727f, 0.034668f, 0.965820f, 0.039307f, 0.960938f, 0.042694f, 0.956543f, + 0.045502f, 0.952637f, 0.050079f, 0.947754f, 0.054504f, 0.942383f, 0.058533f, 0.937988f, + 0.062378f, 0.933105f, 0.065735f, 0.928711f, 0.069275f, 0.924316f, 0.073608f, 0.918945f, + 0.077271f, 0.914062f, 0.080750f, 0.909668f, 0.083801f, 0.905273f, 0.087280f, 0.900879f, + 0.091797f, 0.895508f, 0.095703f, 0.890137f, 0.099915f, 0.885254f, 0.103210f, 0.880371f, + 0.106445f, 0.875488f, 0.110046f, 0.871094f, 0.114319f, 0.865723f, 0.118469f, 0.860352f, + 0.122131f, 0.854980f, 0.126099f, 0.849609f, 0.129517f, 0.844238f, 0.133911f, 0.838867f, + 0.137329f, 0.833984f, 0.140747f, 0.828613f, 0.145386f, 0.822266f, 0.149292f, 0.816406f, + 0.152588f, 0.809570f, 0.156372f, 0.802734f, 0.160156f, 0.796387f, 0.163330f, 0.790039f, + 0.166992f, 0.783691f, 0.170288f, 0.776855f, 0.175415f, 0.769043f, 0.179443f, 0.760742f, + 0.182251f, 0.752441f, 0.185669f, 0.743652f, 0.189087f, 0.735352f, 0.191528f, 0.726074f, + 0.194702f, 0.716309f, 0.197510f, 0.706055f, 0.199585f, 0.692383f, 0.202026f, 0.679688f, + 0.202515f, 0.665039f, 0.202271f, 0.648926f, 0.199585f, 0.630371f, 0.194946f, 0.608398f, + 0.185913f, 0.574707f, 0.168701f, 0.530273f, 0.128662f, 0.450195f, 0.033966f, 0.206177f, + 0.000000f, 1.000000f, 0.005634f, 0.997070f, 0.011589f, 0.992676f, 0.017899f, 0.987305f, + 0.024048f, 0.981445f, 0.028473f, 0.976562f, 0.034271f, 0.970703f, 0.039368f, 0.964844f, + 0.044189f, 0.959961f, 0.049896f, 0.953613f, 0.054504f, 0.947754f, 0.058929f, 0.942871f, + 0.063904f, 0.937012f, 0.069275f, 0.931152f, 0.074341f, 0.925293f, 0.078308f, 0.920410f, + 0.084534f, 0.913574f, 0.089050f, 0.907715f, 0.093750f, 0.902344f, 0.097900f, 0.896973f, + 0.102356f, 0.892090f, 0.106873f, 0.886230f, 0.111450f, 0.880859f, 0.116272f, 0.875000f, + 0.120483f, 0.869629f, 0.124512f, 0.864258f, 0.128052f, 0.859375f, 0.132446f, 0.854492f, + 0.137207f, 0.848633f, 0.142090f, 0.842773f, 0.145874f, 0.837402f, 0.150513f, 0.831543f, + 0.154053f, 0.826660f, 0.157593f, 0.821777f, 0.161133f, 0.816895f, 0.166504f, 0.810059f, + 0.170898f, 0.804199f, 0.175049f, 0.798340f, 0.179199f, 0.792480f, 0.182861f, 0.786621f, + 0.186401f, 0.781250f, 0.189941f, 0.774902f, 0.192871f, 0.768555f, 0.196533f, 0.761719f, + 0.200439f, 0.754883f, 0.204468f, 0.747559f, 0.208496f, 0.740234f, 0.211670f, 0.733398f, + 0.214600f, 0.725586f, 0.216919f, 0.717773f, 0.219604f, 0.710449f, 0.222168f, 0.702637f, + 0.224731f, 0.691406f, 0.227661f, 0.681152f, 0.228516f, 0.669922f, 0.230103f, 0.658691f, + 0.228516f, 0.645020f, 0.227051f, 0.630859f, 0.222534f, 0.613770f, 0.217285f, 0.590820f, + 0.205688f, 0.561035f, 0.185181f, 0.519531f, 0.140747f, 0.444824f, 0.037323f, 0.205322f, + 0.000000f, 1.000000f, 0.009445f, 0.995117f, 0.018661f, 0.988281f, 0.026978f, 0.980957f, + 0.035095f, 0.973633f, 0.043243f, 0.965820f, 0.050293f, 0.958496f, 0.058136f, 0.950195f, + 0.065308f, 0.942871f, 0.071960f, 0.935547f, 0.079224f, 0.927734f, 0.085815f, 0.920410f, + 0.091431f, 0.914062f, 0.096924f, 0.907715f, 0.104065f, 0.899902f, 0.109802f, 0.893066f, + 0.116577f, 0.886230f, 0.121277f, 0.880371f, 0.127319f, 0.873047f, 0.133301f, 0.866699f, + 0.139160f, 0.859863f, 0.143921f, 0.854492f, 0.148315f, 0.848633f, 0.152588f, 0.843262f, + 0.158691f, 0.836426f, 0.163940f, 0.830566f, 0.168457f, 0.824707f, 0.172852f, 0.818848f, + 0.177490f, 0.813477f, 0.181152f, 0.808105f, 0.185181f, 0.803223f, 0.190063f, 0.797363f, + 0.194824f, 0.791504f, 0.199097f, 0.785645f, 0.203369f, 0.780273f, 0.207764f, 0.774902f, + 0.211182f, 0.769531f, 0.214844f, 0.764160f, 0.218018f, 0.759277f, 0.221069f, 0.754395f, + 0.226440f, 0.748047f, 0.230347f, 0.741699f, 0.232788f, 0.734863f, 0.235962f, 0.728516f, + 0.239014f, 0.722656f, 0.241821f, 0.716309f, 0.244629f, 0.709961f, 0.247559f, 0.704102f, + 0.249634f, 0.697754f, 0.251465f, 0.689941f, 0.254150f, 0.681641f, 0.256592f, 0.673828f, + 0.257812f, 0.664551f, 0.258545f, 0.655273f, 0.259277f, 0.646484f, 0.258057f, 0.635742f, + 0.255615f, 0.625000f, 0.252441f, 0.612793f, 0.248169f, 0.594727f, 0.240601f, 0.573730f, + 0.226685f, 0.547363f, 0.202026f, 0.510254f, 0.152832f, 0.439941f, 0.040558f, 0.203491f, + 0.000000f, 1.000000f, 0.016251f, 0.992188f, 0.029617f, 0.982422f, 0.044098f, 0.970215f, + 0.057495f, 0.958008f, 0.069092f, 0.947266f, 0.080139f, 0.936523f, 0.090027f, 0.926758f, + 0.101013f, 0.915039f, 0.109863f, 0.906250f, 0.117981f, 0.896973f, 0.127808f, 0.886719f, + 0.135620f, 0.878418f, 0.142822f, 0.870117f, 0.149292f, 0.862305f, 0.157104f, 0.854004f, + 0.163696f, 0.846680f, 0.170532f, 0.838867f, 0.175903f, 0.832520f, 0.182251f, 0.825684f, + 0.189575f, 0.817383f, 0.195190f, 0.811035f, 0.200317f, 0.804688f, 0.205322f, 0.798828f, + 0.209839f, 0.793457f, 0.213867f, 0.787598f, 0.218872f, 0.782227f, 0.223877f, 0.775879f, + 0.229126f, 0.770020f, 0.233521f, 0.764160f, 0.237427f, 0.758789f, 0.241333f, 0.753906f, + 0.244385f, 0.749023f, 0.248047f, 0.744629f, 0.250732f, 0.740234f, 0.255127f, 0.734375f, + 0.259766f, 0.728516f, 0.263184f, 0.723145f, 0.266357f, 0.718262f, 0.269531f, 0.713379f, + 0.272949f, 0.708496f, 0.275391f, 0.703613f, 0.277100f, 0.698730f, 0.278564f, 0.693359f, + 0.280029f, 0.688477f, 0.281982f, 0.683105f, 0.285645f, 0.676270f, 0.288086f, 0.669922f, + 0.290039f, 0.664062f, 0.291016f, 0.657227f, 0.291260f, 0.650879f, 0.292236f, 0.644043f, + 0.292480f, 0.637207f, 0.291260f, 0.630371f, 0.289551f, 0.622559f, 0.286621f, 0.614258f, + 0.284668f, 0.602051f, 0.281494f, 0.589355f, 0.274414f, 0.574707f, 0.263184f, 0.556641f, + 0.246582f, 0.534180f, 0.219238f, 0.500488f, 0.164551f, 0.435059f, 0.044220f, 0.202881f, + 0.000000f, 1.000000f, 0.033203f, 0.984375f, 0.058105f, 0.966797f, 0.081970f, 0.947266f, + 0.102905f, 0.928223f, 0.121643f, 0.911133f, 0.136230f, 0.895996f, 0.151611f, 0.880859f, + 0.164185f, 0.867676f, 0.173218f, 0.856934f, 0.186157f, 0.843750f, 0.196167f, 0.833008f, + 0.204224f, 0.823730f, 0.211060f, 0.815430f, 0.221313f, 0.804199f, 0.228027f, 0.796387f, + 0.235229f, 0.788574f, 0.239746f, 0.782227f, 0.245605f, 0.775391f, 0.252197f, 0.768066f, + 0.259277f, 0.760254f, 0.264404f, 0.753418f, 0.268799f, 0.747559f, 0.273438f, 0.741699f, + 0.277100f, 0.736816f, 0.281006f, 0.731934f, 0.283203f, 0.727539f, 0.287109f, 0.722656f, + 0.292725f, 0.716797f, 0.296631f, 0.710938f, 0.299805f, 0.706543f, 0.303223f, 0.702148f, + 0.305664f, 0.697754f, 0.308105f, 0.693848f, 0.310059f, 0.689941f, 0.312256f, 0.686035f, + 0.314209f, 0.682129f, 0.315674f, 0.679199f, 0.317627f, 0.675293f, 0.321289f, 0.669922f, + 0.324219f, 0.665527f, 0.326172f, 0.661133f, 0.328125f, 0.656738f, 0.328613f, 0.651855f, + 0.329346f, 0.647461f, 0.329834f, 0.643066f, 0.330811f, 0.638672f, 0.330811f, 0.634277f, + 0.331055f, 0.630371f, 0.330322f, 0.626465f, 0.328369f, 0.621582f, 0.327637f, 0.616699f, + 0.327393f, 0.609863f, 0.326416f, 0.602051f, 0.324219f, 0.594727f, 0.320312f, 0.585938f, + 0.315674f, 0.577637f, 0.310059f, 0.567383f, 0.300293f, 0.555176f, 0.286621f, 0.540527f, + 0.266113f, 0.520996f, 0.235718f, 0.492432f, 0.179077f, 0.423584f, 0.047668f, 0.202271f, + 0.000000f, 1.000000f, 0.087769f, 0.961426f, 0.142700f, 0.920898f, 0.180664f, 0.887695f, + 0.209106f, 0.859863f, 0.227783f, 0.838867f, 0.248413f, 0.817383f, 0.261963f, 0.801270f, + 0.273926f, 0.786621f, 0.285889f, 0.771973f, 0.295898f, 0.759766f, 0.302002f, 0.750488f, + 0.308350f, 0.741699f, 0.316162f, 0.732422f, 0.324463f, 0.722656f, 0.329346f, 0.714844f, + 0.333984f, 0.708496f, 0.337891f, 0.702637f, 0.340332f, 0.697266f, 0.344238f, 0.692383f, + 0.346436f, 0.687500f, 0.349121f, 0.683105f, 0.353271f, 0.677734f, 0.356689f, 0.672363f, + 0.360840f, 0.667480f, 0.362793f, 0.663574f, 0.364990f, 0.659668f, 0.367188f, 0.655762f, + 0.368896f, 0.652344f, 0.370361f, 0.648926f, 0.371826f, 0.645996f, 0.372314f, 0.643066f, + 0.374023f, 0.640137f, 0.374756f, 0.637207f, 0.375244f, 0.634766f, 0.375000f, 0.632812f, + 0.375488f, 0.630371f, 0.375977f, 0.627930f, 0.377686f, 0.624512f, 0.378662f, 0.621094f, + 0.379883f, 0.618164f, 0.380859f, 0.614746f, 0.381348f, 0.611816f, 0.381104f, 0.608887f, + 0.380127f, 0.605469f, 0.380127f, 0.601562f, 0.378906f, 0.598145f, 0.378418f, 0.595215f, + 0.376709f, 0.591797f, 0.375244f, 0.588867f, 0.372559f, 0.584961f, 0.369873f, 0.580566f, + 0.367188f, 0.577148f, 0.362549f, 0.572266f, 0.357666f, 0.567871f, 0.351562f, 0.562500f, + 0.345459f, 0.557129f, 0.335693f, 0.549316f, 0.323242f, 0.540527f, 0.308594f, 0.527344f, + 0.288574f, 0.507324f, 0.255859f, 0.475830f, 0.193481f, 0.413818f, 0.051056f, 0.202271f, + 0.000000f, 1.000000f, 0.172485f, 0.925293f, 0.241333f, 0.869629f, 0.279541f, 0.829590f, + 0.305664f, 0.798828f, 0.324463f, 0.774414f, 0.339844f, 0.754395f, 0.350586f, 0.737305f, + 0.359619f, 0.723145f, 0.367676f, 0.710449f, 0.374756f, 0.699707f, 0.380371f, 0.689453f, + 0.385742f, 0.680664f, 0.389160f, 0.673340f, 0.394775f, 0.666016f, 0.397705f, 0.659180f, + 0.401367f, 0.653320f, 0.404053f, 0.647949f, 0.405762f, 0.643066f, 0.408691f, 0.638184f, + 0.410889f, 0.634277f, 0.413330f, 0.629395f, 0.414795f, 0.625488f, 0.417480f, 0.621582f, + 0.418457f, 0.618164f, 0.420166f, 0.614746f, 0.420654f, 0.611816f, 0.422852f, 0.608398f, + 0.423584f, 0.605469f, 0.424561f, 0.602539f, 0.425049f, 0.600098f, 0.425293f, 0.597656f, + 0.427002f, 0.595215f, 0.427246f, 0.592285f, 0.427002f, 0.590332f, 0.427246f, 0.587891f, + 0.427979f, 0.585449f, 0.428223f, 0.583496f, 0.427979f, 0.581055f, 0.427979f, 0.579102f, + 0.428467f, 0.576172f, 0.427979f, 0.574219f, 0.427734f, 0.571777f, 0.427002f, 0.569824f, + 0.426025f, 0.566895f, 0.425293f, 0.563477f, 0.424072f, 0.560547f, 0.422363f, 0.557617f, + 0.420898f, 0.554688f, 0.418945f, 0.552246f, 0.417236f, 0.548828f, 0.414062f, 0.544434f, + 0.411133f, 0.540527f, 0.407715f, 0.536133f, 0.403076f, 0.531250f, 0.397949f, 0.525879f, + 0.391602f, 0.519531f, 0.383301f, 0.511719f, 0.372803f, 0.502441f, 0.357910f, 0.490479f, + 0.337646f, 0.473633f, 0.305420f, 0.446533f, 0.244385f, 0.391846f, 0.092896f, 0.199219f, + 0.000000f, 1.000000f, 0.175415f, 0.923828f, 0.244263f, 0.868164f, 0.284668f, 0.826660f, + 0.313232f, 0.794434f, 0.332764f, 0.769043f, 0.348145f, 0.748047f, 0.361816f, 0.729492f, + 0.371582f, 0.714355f, 0.380859f, 0.700684f, 0.388428f, 0.688965f, 0.395508f, 0.677734f, + 0.401855f, 0.667969f, 0.406006f, 0.659668f, 0.411865f, 0.651367f, 0.416260f, 0.644043f, + 0.420410f, 0.637207f, 0.423828f, 0.631348f, 0.427246f, 0.625488f, 0.430420f, 0.620117f, + 0.432861f, 0.615234f, 0.436768f, 0.609863f, 0.439697f, 0.604980f, 0.442139f, 0.600098f, + 0.444336f, 0.595703f, 0.447021f, 0.591797f, 0.448242f, 0.587891f, 0.451172f, 0.583984f, + 0.452637f, 0.580566f, 0.454834f, 0.576660f, 0.456299f, 0.573242f, 0.457520f, 0.570312f, + 0.459717f, 0.566406f, 0.460938f, 0.563477f, 0.461670f, 0.560547f, 0.462891f, 0.557129f, + 0.464111f, 0.554199f, 0.465576f, 0.551270f, 0.466064f, 0.548340f, 0.467041f, 0.544922f, + 0.468506f, 0.541992f, 0.468750f, 0.539062f, 0.469238f, 0.536133f, 0.469727f, 0.532715f, + 0.470459f, 0.529785f, 0.469482f, 0.525391f, 0.469238f, 0.521484f, 0.469238f, 0.517578f, + 0.468750f, 0.513672f, 0.467773f, 0.510254f, 0.467773f, 0.505859f, 0.466797f, 0.500977f, + 0.465088f, 0.495605f, 0.462891f, 0.490479f, 0.460205f, 0.484619f, 0.457031f, 0.477539f, + 0.452637f, 0.469727f, 0.446777f, 0.460693f, 0.440186f, 0.450439f, 0.428711f, 0.437500f, + 0.413330f, 0.419678f, 0.387695f, 0.393311f, 0.335938f, 0.341797f, 0.192627f, 0.175903f, + 0.000000f, 1.000000f, 0.176514f, 0.923828f, 0.248413f, 0.865723f, 0.291016f, 0.823242f, + 0.320068f, 0.789551f, 0.342529f, 0.762695f, 0.357666f, 0.741211f, 0.373047f, 0.721191f, + 0.384521f, 0.704590f, 0.395020f, 0.689941f, 0.403076f, 0.677246f, 0.411377f, 0.665527f, + 0.417969f, 0.654785f, 0.424561f, 0.645020f, 0.431641f, 0.635742f, 0.436279f, 0.627441f, + 0.441895f, 0.619629f, 0.445557f, 0.612793f, 0.449707f, 0.606445f, 0.453369f, 0.600586f, + 0.457031f, 0.594727f, 0.461426f, 0.588867f, 0.464600f, 0.583008f, 0.467529f, 0.578125f, + 0.471436f, 0.572754f, 0.474365f, 0.567871f, 0.476562f, 0.563477f, 0.480225f, 0.559082f, + 0.482178f, 0.554199f, 0.483887f, 0.550293f, 0.487061f, 0.546387f, 0.489258f, 0.542480f, + 0.492188f, 0.538086f, 0.494385f, 0.533691f, 0.495850f, 0.530273f, 0.497314f, 0.526855f, + 0.500000f, 0.522461f, 0.501465f, 0.519043f, 0.503418f, 0.515137f, 0.505371f, 0.511230f, + 0.506836f, 0.507812f, 0.508301f, 0.503906f, 0.509766f, 0.500000f, 0.511719f, 0.496094f, + 0.512695f, 0.492188f, 0.514648f, 0.487305f, 0.514648f, 0.482422f, 0.515625f, 0.477539f, + 0.515625f, 0.472900f, 0.515625f, 0.468262f, 0.518066f, 0.462891f, 0.518066f, 0.457520f, + 0.517090f, 0.450928f, 0.517090f, 0.444580f, 0.516113f, 0.437988f, 0.515137f, 0.429932f, + 0.513184f, 0.421631f, 0.509766f, 0.411865f, 0.504395f, 0.399902f, 0.496826f, 0.385986f, + 0.484863f, 0.367676f, 0.465576f, 0.340820f, 0.424072f, 0.293701f, 0.297119f, 0.152222f, + 0.000000f, 1.000000f, 0.178955f, 0.922852f, 0.252930f, 0.863281f, 0.296875f, 0.819336f, + 0.328125f, 0.784668f, 0.350830f, 0.756836f, 0.369629f, 0.732910f, 0.385986f, 0.711914f, + 0.399170f, 0.694336f, 0.409912f, 0.678711f, 0.418213f, 0.665527f, 0.427734f, 0.652344f, + 0.435791f, 0.640625f, 0.442139f, 0.630859f, 0.448730f, 0.621094f, 0.456299f, 0.611328f, + 0.461670f, 0.603027f, 0.466797f, 0.595215f, 0.470947f, 0.587891f, 0.476562f, 0.581055f, + 0.480713f, 0.574219f, 0.485352f, 0.567871f, 0.490479f, 0.561035f, 0.493896f, 0.555176f, + 0.498047f, 0.549316f, 0.501465f, 0.543945f, 0.504395f, 0.539062f, 0.508789f, 0.533203f, + 0.511719f, 0.528320f, 0.514648f, 0.523438f, 0.518555f, 0.518555f, 0.520996f, 0.513672f, + 0.523926f, 0.509277f, 0.526855f, 0.504395f, 0.529785f, 0.500000f, 0.532227f, 0.495850f, + 0.534668f, 0.491211f, 0.538574f, 0.486328f, 0.540527f, 0.481934f, 0.542969f, 0.477539f, + 0.545898f, 0.473145f, 0.547852f, 0.468506f, 0.549805f, 0.464111f, 0.553223f, 0.458984f, + 0.555176f, 0.454346f, 0.557129f, 0.449463f, 0.558594f, 0.443604f, 0.559570f, 0.437988f, + 0.561523f, 0.432617f, 0.562988f, 0.426514f, 0.566406f, 0.420410f, 0.566406f, 0.414551f, + 0.567871f, 0.407715f, 0.568359f, 0.400146f, 0.568359f, 0.392822f, 0.569336f, 0.384277f, + 0.568848f, 0.374512f, 0.566406f, 0.364014f, 0.563965f, 0.351807f, 0.559082f, 0.337402f, + 0.550781f, 0.319092f, 0.536133f, 0.292480f, 0.504395f, 0.249023f, 0.398926f, 0.127197f, + 0.000000f, 1.000000f, 0.180176f, 0.922363f, 0.257812f, 0.860840f, 0.304443f, 0.815430f, + 0.337402f, 0.778809f, 0.361328f, 0.749512f, 0.380859f, 0.725098f, 0.397217f, 0.703613f, + 0.410645f, 0.685059f, 0.423096f, 0.668457f, 0.433350f, 0.653809f, 0.443359f, 0.640137f, + 0.453857f, 0.626953f, 0.460205f, 0.615723f, 0.468018f, 0.605469f, 0.476074f, 0.595215f, + 0.481934f, 0.585938f, 0.488037f, 0.577148f, 0.493652f, 0.568848f, 0.499756f, 0.561523f, + 0.503906f, 0.553711f, 0.508301f, 0.547363f, 0.515137f, 0.539551f, 0.519531f, 0.532715f, + 0.524902f, 0.525879f, 0.528809f, 0.520020f, 0.533203f, 0.513672f, 0.536621f, 0.507812f, + 0.540527f, 0.501953f, 0.543945f, 0.496826f, 0.547852f, 0.491211f, 0.552734f, 0.485840f, + 0.556152f, 0.480225f, 0.559570f, 0.475098f, 0.562500f, 0.469971f, 0.565430f, 0.465088f, + 0.570801f, 0.459473f, 0.573730f, 0.454102f, 0.576172f, 0.449219f, 0.579590f, 0.443848f, + 0.582520f, 0.438965f, 0.586426f, 0.433350f, 0.588867f, 0.428467f, 0.591797f, 0.423096f, + 0.595703f, 0.417480f, 0.598145f, 0.412109f, 0.600586f, 0.406250f, 0.603027f, 0.399902f, + 0.605469f, 0.393311f, 0.607422f, 0.386963f, 0.610352f, 0.380127f, 0.613281f, 0.373047f, + 0.615723f, 0.366455f, 0.615723f, 0.358154f, 0.617676f, 0.350098f, 0.620117f, 0.340820f, + 0.620117f, 0.330566f, 0.620605f, 0.320068f, 0.619141f, 0.307373f, 0.618164f, 0.292725f, + 0.612305f, 0.273926f, 0.601562f, 0.249756f, 0.576660f, 0.209717f, 0.489502f, 0.105347f, + 0.000000f, 1.000000f, 0.182373f, 0.921387f, 0.262695f, 0.858398f, 0.311768f, 0.810547f, + 0.345947f, 0.773438f, 0.371094f, 0.743164f, 0.391602f, 0.717285f, 0.408936f, 0.695312f, + 0.424561f, 0.674805f, 0.437744f, 0.657715f, 0.448975f, 0.641113f, 0.459717f, 0.626953f, + 0.469482f, 0.613770f, 0.479004f, 0.601074f, 0.487305f, 0.589355f, 0.494873f, 0.578613f, + 0.502441f, 0.568359f, 0.508789f, 0.559082f, 0.516113f, 0.549805f, 0.521484f, 0.541504f, + 0.527344f, 0.533203f, 0.532715f, 0.525879f, 0.538574f, 0.518066f, 0.545898f, 0.509766f, + 0.550293f, 0.502930f, 0.554688f, 0.496094f, 0.561035f, 0.489014f, 0.564453f, 0.482666f, + 0.570312f, 0.476074f, 0.574219f, 0.469727f, 0.578613f, 0.463867f, 0.583496f, 0.457764f, + 0.587402f, 0.451416f, 0.590820f, 0.445801f, 0.595703f, 0.439941f, 0.599121f, 0.434326f, + 0.604004f, 0.428467f, 0.607422f, 0.422607f, 0.611816f, 0.416748f, 0.614746f, 0.411377f, + 0.618652f, 0.405518f, 0.622070f, 0.399902f, 0.626953f, 0.393799f, 0.629883f, 0.387939f, + 0.633789f, 0.382324f, 0.636719f, 0.376221f, 0.641113f, 0.369873f, 0.642090f, 0.363525f, + 0.645508f, 0.356201f, 0.649414f, 0.348877f, 0.651855f, 0.341797f, 0.655273f, 0.334473f, + 0.658203f, 0.327148f, 0.661133f, 0.318848f, 0.662598f, 0.310059f, 0.665039f, 0.300781f, + 0.667480f, 0.290527f, 0.668945f, 0.279541f, 0.668457f, 0.267334f, 0.668457f, 0.252441f, + 0.663574f, 0.234863f, 0.657715f, 0.211548f, 0.638184f, 0.175049f, 0.567871f, 0.086548f, + 0.000000f, 1.000000f, 0.185059f, 0.919922f, 0.267822f, 0.855469f, 0.317627f, 0.807129f, + 0.353760f, 0.769043f, 0.380859f, 0.736816f, 0.404053f, 0.708984f, 0.420654f, 0.686035f, + 0.437500f, 0.665527f, 0.451904f, 0.646484f, 0.465088f, 0.628906f, 0.476074f, 0.613770f, + 0.487305f, 0.599121f, 0.496826f, 0.586426f, 0.505371f, 0.574219f, 0.514648f, 0.562012f, + 0.523438f, 0.550781f, 0.531250f, 0.540527f, 0.536621f, 0.531250f, 0.543945f, 0.521973f, + 0.551758f, 0.512207f, 0.556152f, 0.504883f, 0.563965f, 0.496094f, 0.570312f, 0.487549f, + 0.575684f, 0.479736f, 0.581543f, 0.471924f, 0.587402f, 0.464600f, 0.592285f, 0.457520f, + 0.598145f, 0.450195f, 0.602051f, 0.443604f, 0.607910f, 0.436768f, 0.613770f, 0.429932f, + 0.617676f, 0.423584f, 0.622070f, 0.417236f, 0.626465f, 0.410889f, 0.630859f, 0.404785f, + 0.635254f, 0.398438f, 0.640137f, 0.392090f, 0.645020f, 0.385498f, 0.646973f, 0.380127f, + 0.652832f, 0.373779f, 0.657227f, 0.367432f, 0.661133f, 0.361084f, 0.664551f, 0.354736f, + 0.668945f, 0.348633f, 0.672852f, 0.342041f, 0.676270f, 0.335693f, 0.680176f, 0.328857f, + 0.684570f, 0.321289f, 0.687012f, 0.313721f, 0.690918f, 0.306152f, 0.693848f, 0.298828f, + 0.697266f, 0.291016f, 0.701660f, 0.282959f, 0.704102f, 0.273438f, 0.706055f, 0.264160f, + 0.709473f, 0.254395f, 0.709473f, 0.243408f, 0.712891f, 0.231323f, 0.711914f, 0.217041f, + 0.709961f, 0.200317f, 0.706055f, 0.178955f, 0.690430f, 0.145874f, 0.636719f, 0.071045f, + 0.000000f, 1.000000f, 0.187134f, 0.918945f, 0.273193f, 0.852539f, 0.324707f, 0.803223f, + 0.360840f, 0.764160f, 0.391357f, 0.729980f, 0.414307f, 0.701660f, 0.434814f, 0.676758f, + 0.451172f, 0.654785f, 0.465820f, 0.635254f, 0.481201f, 0.616699f, 0.492920f, 0.600098f, + 0.503906f, 0.584961f, 0.515625f, 0.570801f, 0.524414f, 0.558105f, 0.533203f, 0.545898f, + 0.542969f, 0.533691f, 0.551270f, 0.522461f, 0.559082f, 0.511719f, 0.566895f, 0.501465f, + 0.573730f, 0.492188f, 0.580566f, 0.483398f, 0.587402f, 0.474609f, 0.595215f, 0.465088f, + 0.602051f, 0.456787f, 0.606445f, 0.448730f, 0.613281f, 0.440430f, 0.620117f, 0.432373f, + 0.624512f, 0.425293f, 0.629883f, 0.417725f, 0.635742f, 0.410645f, 0.642090f, 0.403076f, + 0.644531f, 0.396729f, 0.651855f, 0.389404f, 0.655762f, 0.382812f, 0.660645f, 0.376221f, + 0.666016f, 0.369141f, 0.670898f, 0.362549f, 0.674805f, 0.356201f, 0.679199f, 0.349609f, + 0.683594f, 0.343506f, 0.689453f, 0.336182f, 0.692383f, 0.330078f, 0.697754f, 0.323242f, + 0.701172f, 0.316895f, 0.706543f, 0.310059f, 0.709961f, 0.303467f, 0.714355f, 0.296387f, + 0.718262f, 0.289062f, 0.721191f, 0.281250f, 0.724609f, 0.273682f, 0.729004f, 0.265869f, + 0.732910f, 0.258301f, 0.735840f, 0.250244f, 0.739746f, 0.240845f, 0.742676f, 0.231689f, + 0.745605f, 0.222168f, 0.748535f, 0.211792f, 0.750488f, 0.199585f, 0.751953f, 0.186157f, + 0.750488f, 0.171021f, 0.746094f, 0.151123f, 0.734375f, 0.120911f, 0.691406f, 0.058105f, + 0.000000f, 1.000000f, 0.189819f, 0.917969f, 0.275879f, 0.851562f, 0.331055f, 0.799805f, + 0.370117f, 0.758301f, 0.400879f, 0.723633f, 0.426025f, 0.693359f, 0.446533f, 0.667480f, + 0.465332f, 0.644531f, 0.480225f, 0.624023f, 0.496582f, 0.604492f, 0.509766f, 0.586914f, + 0.521973f, 0.570801f, 0.533203f, 0.555664f, 0.542969f, 0.541992f, 0.553223f, 0.528809f, + 0.562988f, 0.516113f, 0.572266f, 0.503906f, 0.580566f, 0.492920f, 0.589355f, 0.481934f, + 0.597168f, 0.471924f, 0.603516f, 0.462646f, 0.611328f, 0.452881f, 0.618652f, 0.443359f, + 0.625977f, 0.434326f, 0.632324f, 0.425537f, 0.638672f, 0.416748f, 0.644531f, 0.408447f, + 0.649902f, 0.400635f, 0.657715f, 0.392334f, 0.662598f, 0.385010f, 0.667969f, 0.377441f, + 0.673340f, 0.369873f, 0.678711f, 0.363037f, 0.684082f, 0.355957f, 0.688965f, 0.348633f, + 0.694336f, 0.341553f, 0.698730f, 0.334717f, 0.704590f, 0.327881f, 0.708496f, 0.321289f, + 0.713867f, 0.314453f, 0.718750f, 0.307373f, 0.722656f, 0.300537f, 0.728027f, 0.293945f, + 0.730469f, 0.287842f, 0.735840f, 0.280518f, 0.741211f, 0.273438f, 0.745117f, 0.266846f, + 0.750000f, 0.259766f, 0.752930f, 0.251709f, 0.756348f, 0.244263f, 0.760742f, 0.236328f, + 0.764160f, 0.228516f, 0.768066f, 0.220459f, 0.770996f, 0.212646f, 0.774902f, 0.202881f, + 0.776855f, 0.193726f, 0.780762f, 0.184082f, 0.782715f, 0.171997f, 0.782227f, 0.160522f, + 0.783691f, 0.146240f, 0.781738f, 0.127808f, 0.773438f, 0.101501f, 0.738281f, 0.046478f, + 0.000000f, 1.000000f, 0.193359f, 0.916016f, 0.280273f, 0.849121f, 0.338867f, 0.795410f, + 0.378906f, 0.752930f, 0.411377f, 0.716309f, 0.437012f, 0.686035f, 0.459473f, 0.658203f, + 0.478760f, 0.634277f, 0.495605f, 0.612305f, 0.511719f, 0.591797f, 0.525879f, 0.573730f, + 0.538574f, 0.557129f, 0.552246f, 0.540527f, 0.562500f, 0.525879f, 0.572754f, 0.512207f, + 0.583008f, 0.499023f, 0.593262f, 0.485840f, 0.601562f, 0.474365f, 0.611328f, 0.462646f, + 0.617676f, 0.452393f, 0.626465f, 0.441895f, 0.633301f, 0.432373f, 0.641113f, 0.422119f, + 0.648926f, 0.412354f, 0.655762f, 0.403076f, 0.663574f, 0.393555f, 0.668945f, 0.385498f, + 0.675781f, 0.376709f, 0.682617f, 0.368652f, 0.687988f, 0.360352f, 0.695312f, 0.352539f, + 0.698730f, 0.345215f, 0.704102f, 0.337646f, 0.711426f, 0.329834f, 0.715332f, 0.322754f, + 0.720215f, 0.315430f, 0.725586f, 0.308350f, 0.730469f, 0.301270f, 0.735352f, 0.294434f, + 0.740723f, 0.287598f, 0.745605f, 0.280273f, 0.750000f, 0.273682f, 0.754883f, 0.266846f, + 0.758301f, 0.260254f, 0.764160f, 0.253174f, 0.768066f, 0.246460f, 0.773438f, 0.239380f, + 0.776855f, 0.232788f, 0.779785f, 0.225586f, 0.784180f, 0.217529f, 0.787598f, 0.209961f, + 0.791504f, 0.202271f, 0.795898f, 0.194336f, 0.799316f, 0.186279f, 0.802734f, 0.178345f, + 0.805176f, 0.168945f, 0.808594f, 0.159424f, 0.811035f, 0.149048f, 0.812012f, 0.137939f, + 0.812988f, 0.124817f, 0.811523f, 0.108582f, 0.805176f, 0.085022f, 0.776855f, 0.038177f, + 0.000000f, 1.000000f, 0.195190f, 0.915527f, 0.286133f, 0.846191f, 0.344727f, 0.791992f, + 0.388428f, 0.746582f, 0.420898f, 0.709961f, 0.447754f, 0.677734f, 0.470703f, 0.649414f, + 0.492676f, 0.623535f, 0.511230f, 0.600586f, 0.526855f, 0.580078f, 0.541992f, 0.560547f, + 0.555176f, 0.542969f, 0.568848f, 0.525391f, 0.581543f, 0.509766f, 0.591797f, 0.495605f, + 0.602051f, 0.482422f, 0.613281f, 0.468262f, 0.622559f, 0.456055f, 0.630859f, 0.443848f, + 0.640137f, 0.432373f, 0.647461f, 0.421875f, 0.655273f, 0.411621f, 0.663574f, 0.401123f, + 0.670898f, 0.391602f, 0.678223f, 0.381348f, 0.686035f, 0.371826f, 0.692383f, 0.362793f, + 0.699707f, 0.354004f, 0.705078f, 0.345703f, 0.711914f, 0.336914f, 0.717773f, 0.329102f, + 0.724121f, 0.321045f, 0.727539f, 0.313721f, 0.734863f, 0.305664f, 0.741211f, 0.298096f, + 0.745117f, 0.290771f, 0.749512f, 0.283691f, 0.755859f, 0.276611f, 0.759277f, 0.269775f, + 0.765137f, 0.262451f, 0.770996f, 0.255371f, 0.774414f, 0.248779f, 0.778809f, 0.242065f, + 0.784668f, 0.235474f, 0.788574f, 0.228271f, 0.793945f, 0.221191f, 0.796875f, 0.215210f, + 0.801270f, 0.208374f, 0.806152f, 0.201416f, 0.809082f, 0.193970f, 0.812012f, 0.186279f, + 0.816406f, 0.178589f, 0.819824f, 0.171387f, 0.822754f, 0.163940f, 0.827148f, 0.156128f, + 0.829590f, 0.147339f, 0.833008f, 0.138184f, 0.834473f, 0.129883f, 0.836426f, 0.118469f, + 0.837891f, 0.106628f, 0.836426f, 0.092163f, 0.831055f, 0.071899f, 0.808105f, 0.031708f, + 0.000000f, 1.000000f, 0.196777f, 0.915039f, 0.291260f, 0.843750f, 0.351074f, 0.787598f, + 0.397217f, 0.741699f, 0.431152f, 0.703125f, 0.458984f, 0.669922f, 0.484375f, 0.639648f, + 0.507324f, 0.612793f, 0.525879f, 0.588867f, 0.541992f, 0.567871f, 0.559082f, 0.546875f, + 0.571289f, 0.529297f, 0.586914f, 0.510742f, 0.598633f, 0.494629f, 0.610840f, 0.479248f, + 0.621094f, 0.465332f, 0.631836f, 0.450928f, 0.642090f, 0.437988f, 0.651367f, 0.425293f, + 0.660645f, 0.413330f, 0.669922f, 0.402344f, 0.676758f, 0.391357f, 0.684082f, 0.381104f, + 0.692383f, 0.371094f, 0.700684f, 0.360596f, 0.708496f, 0.350342f, 0.714355f, 0.341309f, + 0.722168f, 0.332275f, 0.728027f, 0.323486f, 0.732910f, 0.314941f, 0.740234f, 0.306641f, + 0.746094f, 0.298584f, 0.750977f, 0.290771f, 0.757324f, 0.282959f, 0.764160f, 0.275146f, + 0.766602f, 0.268311f, 0.772461f, 0.260742f, 0.778320f, 0.253418f, 0.783203f, 0.246460f, + 0.787598f, 0.239380f, 0.792969f, 0.232422f, 0.796387f, 0.226196f, 0.801270f, 0.219238f, + 0.806641f, 0.212402f, 0.810547f, 0.205811f, 0.814941f, 0.198975f, 0.819336f, 0.192749f, + 0.822266f, 0.186768f, 0.828125f, 0.179321f, 0.831543f, 0.172974f, 0.833984f, 0.165649f, + 0.837402f, 0.158203f, 0.840332f, 0.151489f, 0.845215f, 0.143799f, 0.848633f, 0.136353f, + 0.851074f, 0.129517f, 0.853027f, 0.120483f, 0.856934f, 0.112244f, 0.856445f, 0.102600f, + 0.858887f, 0.091309f, 0.858398f, 0.079041f, 0.854980f, 0.060913f, 0.836426f, 0.027008f, + 0.000000f, 1.000000f, 0.197632f, 0.915039f, 0.295654f, 0.841309f, 0.357666f, 0.784180f, + 0.405273f, 0.735840f, 0.441895f, 0.695801f, 0.471924f, 0.661133f, 0.497803f, 0.630371f, + 0.521973f, 0.602051f, 0.541016f, 0.577148f, 0.558594f, 0.554688f, 0.575684f, 0.533203f, + 0.589355f, 0.514648f, 0.603516f, 0.496582f, 0.617188f, 0.479248f, 0.627930f, 0.463379f, + 0.640137f, 0.448486f, 0.651855f, 0.433838f, 0.662598f, 0.420166f, 0.671875f, 0.406982f, + 0.679688f, 0.395020f, 0.688965f, 0.383301f, 0.696777f, 0.372070f, 0.705566f, 0.361084f, + 0.712402f, 0.351562f, 0.721191f, 0.340820f, 0.728027f, 0.330322f, 0.735840f, 0.321045f, + 0.741699f, 0.311768f, 0.749023f, 0.302490f, 0.754883f, 0.293945f, 0.761230f, 0.285400f, + 0.767578f, 0.277588f, 0.772461f, 0.269287f, 0.777832f, 0.261719f, 0.784668f, 0.253662f, + 0.788086f, 0.246704f, 0.792969f, 0.239746f, 0.798828f, 0.232178f, 0.803223f, 0.225098f, + 0.807617f, 0.218384f, 0.813477f, 0.211548f, 0.816406f, 0.205200f, 0.822266f, 0.198364f, + 0.826172f, 0.191895f, 0.830078f, 0.185303f, 0.833984f, 0.179199f, 0.837402f, 0.172974f, + 0.842285f, 0.166748f, 0.846680f, 0.160034f, 0.850586f, 0.153687f, 0.852539f, 0.147705f, + 0.855957f, 0.140381f, 0.858887f, 0.133667f, 0.863281f, 0.126221f, 0.865723f, 0.119873f, + 0.869141f, 0.113281f, 0.871094f, 0.105591f, 0.874023f, 0.096863f, 0.875977f, 0.088867f, + 0.876953f, 0.079041f, 0.877441f, 0.067261f, 0.875000f, 0.051941f, 0.858887f, 0.023010f, + 0.000000f, 1.000000f, 0.200562f, 0.914062f, 0.301758f, 0.837891f, 0.366699f, 0.778809f, + 0.414307f, 0.730469f, 0.452148f, 0.688965f, 0.483154f, 0.652832f, 0.511719f, 0.620605f, + 0.534180f, 0.592285f, 0.554688f, 0.566406f, 0.574219f, 0.542480f, 0.591309f, 0.520508f, + 0.606445f, 0.500488f, 0.621094f, 0.481689f, 0.634766f, 0.464111f, 0.645996f, 0.447754f, + 0.657715f, 0.432129f, 0.669434f, 0.417480f, 0.679199f, 0.403564f, 0.690430f, 0.389404f, + 0.698730f, 0.377197f, 0.708008f, 0.365234f, 0.716309f, 0.353516f, 0.723145f, 0.342773f, + 0.732422f, 0.332031f, 0.740723f, 0.321777f, 0.748047f, 0.311279f, 0.753906f, 0.301758f, + 0.762207f, 0.291992f, 0.768555f, 0.282715f, 0.773926f, 0.274414f, 0.780273f, 0.265869f, + 0.786133f, 0.257812f, 0.792480f, 0.249268f, 0.796875f, 0.241821f, 0.801758f, 0.234375f, + 0.807129f, 0.226929f, 0.812012f, 0.219849f, 0.817383f, 0.212769f, 0.822754f, 0.205444f, + 0.825684f, 0.199219f, 0.831055f, 0.192627f, 0.834961f, 0.186035f, 0.839355f, 0.179565f, + 0.843750f, 0.173340f, 0.847656f, 0.166992f, 0.851562f, 0.161255f, 0.855469f, 0.154907f, + 0.860352f, 0.148926f, 0.862793f, 0.142822f, 0.867188f, 0.137085f, 0.870117f, 0.131592f, + 0.873535f, 0.124878f, 0.876465f, 0.117676f, 0.877930f, 0.111755f, 0.881348f, 0.105347f, + 0.884766f, 0.098877f, 0.887695f, 0.092346f, 0.889160f, 0.084900f, 0.892090f, 0.076965f, + 0.893066f, 0.068054f, 0.893555f, 0.058258f, 0.888672f, 0.044098f, 0.879395f, 0.018127f, + 0.000000f, 1.000000f, 0.203247f, 0.912598f, 0.306396f, 0.835938f, 0.373047f, 0.775391f, + 0.423096f, 0.724609f, 0.463379f, 0.681641f, 0.495605f, 0.644531f, 0.523438f, 0.611328f, + 0.548340f, 0.581543f, 0.569336f, 0.555176f, 0.589844f, 0.530273f, 0.606445f, 0.507812f, + 0.622559f, 0.487061f, 0.637207f, 0.467529f, 0.651367f, 0.449219f, 0.664062f, 0.432129f, + 0.675293f, 0.416504f, 0.686523f, 0.401611f, 0.698242f, 0.386719f, 0.708008f, 0.372803f, + 0.716797f, 0.360107f, 0.727051f, 0.347168f, 0.734375f, 0.335938f, 0.742676f, 0.324707f, + 0.750488f, 0.313965f, 0.757812f, 0.303955f, 0.765625f, 0.293213f, 0.772461f, 0.283447f, + 0.780762f, 0.273682f, 0.786133f, 0.264648f, 0.791992f, 0.255859f, 0.798340f, 0.247559f, + 0.804688f, 0.239014f, 0.809082f, 0.231079f, 0.814941f, 0.223511f, 0.818848f, 0.216309f, + 0.825684f, 0.208740f, 0.830078f, 0.201538f, 0.833496f, 0.194946f, 0.839355f, 0.187744f, + 0.841309f, 0.181885f, 0.848633f, 0.174927f, 0.851074f, 0.168701f, 0.855957f, 0.162354f, + 0.859375f, 0.156616f, 0.862793f, 0.150757f, 0.867676f, 0.144775f, 0.871094f, 0.139038f, + 0.875000f, 0.133179f, 0.878906f, 0.127563f, 0.880371f, 0.122559f, 0.885254f, 0.116638f, + 0.888184f, 0.111267f, 0.890137f, 0.104492f, 0.892578f, 0.098938f, 0.895508f, 0.092896f, + 0.899902f, 0.086243f, 0.900391f, 0.080933f, 0.902832f, 0.074402f, 0.905273f, 0.066711f, + 0.906250f, 0.059174f, 0.905273f, 0.050293f, 0.905762f, 0.036987f, 0.895996f, 0.014900f, + 0.000000f, 1.000000f, 0.206665f, 0.911133f, 0.309814f, 0.833984f, 0.380127f, 0.770996f, + 0.432861f, 0.718750f, 0.473145f, 0.674805f, 0.506836f, 0.636230f, 0.536621f, 0.602051f, + 0.562012f, 0.571289f, 0.583984f, 0.543457f, 0.603516f, 0.518066f, 0.622070f, 0.495361f, + 0.637695f, 0.473877f, 0.653320f, 0.453613f, 0.666504f, 0.435303f, 0.681152f, 0.417236f, + 0.693848f, 0.400635f, 0.704102f, 0.385498f, 0.714844f, 0.370850f, 0.726562f, 0.356201f, + 0.733887f, 0.343506f, 0.744629f, 0.330322f, 0.751953f, 0.319092f, 0.759766f, 0.307617f, + 0.768555f, 0.296631f, 0.774414f, 0.286621f, 0.782227f, 0.276367f, 0.789062f, 0.266357f, + 0.797363f, 0.256348f, 0.802246f, 0.247437f, 0.808105f, 0.238770f, 0.814453f, 0.230347f, + 0.820801f, 0.221802f, 0.825195f, 0.214233f, 0.830566f, 0.206665f, 0.835449f, 0.199341f, + 0.841797f, 0.191650f, 0.844727f, 0.185059f, 0.848633f, 0.178711f, 0.853516f, 0.171997f, + 0.858887f, 0.165405f, 0.862305f, 0.159180f, 0.867676f, 0.153076f, 0.869629f, 0.147339f, + 0.873535f, 0.141602f, 0.877930f, 0.135742f, 0.881348f, 0.130005f, 0.885742f, 0.124634f, + 0.887695f, 0.119629f, 0.892090f, 0.114075f, 0.894531f, 0.108948f, 0.898438f, 0.103516f, + 0.899902f, 0.098877f, 0.903320f, 0.093567f, 0.905762f, 0.087585f, 0.908691f, 0.081299f, + 0.910156f, 0.076050f, 0.912598f, 0.070740f, 0.914551f, 0.065125f, 0.916504f, 0.057892f, + 0.916504f, 0.052368f, 0.917969f, 0.042908f, 0.916992f, 0.032013f, 0.909180f, 0.013008f, + 0.000000f, 1.000000f, 0.208984f, 0.910156f, 0.316895f, 0.830078f, 0.388916f, 0.766113f, + 0.442871f, 0.712402f, 0.485840f, 0.666992f, 0.520508f, 0.627441f, 0.547363f, 0.593262f, + 0.575195f, 0.561035f, 0.598633f, 0.532227f, 0.619141f, 0.505859f, 0.636719f, 0.482666f, + 0.654297f, 0.460449f, 0.668457f, 0.439941f, 0.684082f, 0.420898f, 0.697266f, 0.402588f, + 0.709961f, 0.385742f, 0.719727f, 0.370361f, 0.730957f, 0.355469f, 0.741211f, 0.341064f, + 0.750488f, 0.327881f, 0.760742f, 0.314697f, 0.767578f, 0.302979f, 0.776855f, 0.291260f, + 0.784180f, 0.280518f, 0.791504f, 0.270264f, 0.795898f, 0.260986f, 0.804688f, 0.250000f, + 0.812988f, 0.240234f, 0.817871f, 0.231323f, 0.823242f, 0.222900f, 0.829590f, 0.214478f, + 0.835938f, 0.205688f, 0.839844f, 0.198608f, 0.845215f, 0.191162f, 0.851074f, 0.183472f, + 0.854980f, 0.176636f, 0.859375f, 0.170044f, 0.863281f, 0.163696f, 0.868164f, 0.156982f, + 0.872070f, 0.150757f, 0.874512f, 0.145264f, 0.879395f, 0.138916f, 0.883301f, 0.133545f, + 0.886719f, 0.127808f, 0.889648f, 0.122498f, 0.893555f, 0.117065f, 0.896484f, 0.112427f, + 0.900879f, 0.106750f, 0.903320f, 0.101929f, 0.906250f, 0.096985f, 0.908691f, 0.092651f, + 0.912598f, 0.087524f, 0.915039f, 0.082886f, 0.917480f, 0.077515f, 0.917969f, 0.072449f, + 0.921875f, 0.067017f, 0.922852f, 0.061737f, 0.924805f, 0.057281f, 0.927734f, 0.051392f, + 0.927246f, 0.044800f, 0.929199f, 0.037720f, 0.928223f, 0.028305f, 0.922363f, 0.011879f, + 0.000000f, 1.000000f, 0.210205f, 0.910156f, 0.322754f, 0.827637f, 0.395996f, 0.761719f, + 0.452148f, 0.707031f, 0.495361f, 0.660156f, 0.531250f, 0.619141f, 0.561523f, 0.583008f, + 0.588867f, 0.550781f, 0.612305f, 0.520996f, 0.632812f, 0.494629f, 0.651855f, 0.469971f, + 0.668457f, 0.447510f, 0.685059f, 0.426270f, 0.698730f, 0.407227f, 0.712891f, 0.388428f, + 0.725586f, 0.371338f, 0.734863f, 0.355957f, 0.745117f, 0.341064f, 0.756348f, 0.326416f, + 0.765625f, 0.312744f, 0.775391f, 0.299805f, 0.783203f, 0.287354f, 0.792969f, 0.275879f, + 0.797852f, 0.265381f, 0.805664f, 0.254883f, 0.812988f, 0.244995f, 0.818359f, 0.235596f, + 0.826172f, 0.225708f, 0.832031f, 0.216553f, 0.838379f, 0.207764f, 0.843262f, 0.199707f, + 0.848633f, 0.191528f, 0.854492f, 0.183960f, 0.857910f, 0.176880f, 0.863770f, 0.169189f, + 0.867188f, 0.162964f, 0.871582f, 0.156372f, 0.876953f, 0.149780f, 0.880371f, 0.143433f, + 0.884766f, 0.137573f, 0.886230f, 0.132568f, 0.892090f, 0.126099f, 0.894531f, 0.120911f, + 0.898438f, 0.115662f, 0.900879f, 0.110901f, 0.904785f, 0.105591f, 0.907715f, 0.100586f, + 0.910645f, 0.096008f, 0.913086f, 0.091370f, 0.916016f, 0.087036f, 0.920410f, 0.082031f, + 0.921875f, 0.077637f, 0.922852f, 0.074280f, 0.928223f, 0.068970f, 0.928223f, 0.064087f, + 0.930176f, 0.059387f, 0.932129f, 0.054382f, 0.934570f, 0.049408f, 0.936035f, 0.044891f, + 0.936523f, 0.038910f, 0.937988f, 0.032257f, 0.936523f, 0.024109f, 0.932129f, 0.010178f, + 0.000000f, 1.000000f, 0.214600f, 0.907715f, 0.327393f, 0.825195f, 0.404297f, 0.757324f, + 0.460693f, 0.701172f, 0.506348f, 0.652832f, 0.543457f, 0.610840f, 0.575195f, 0.573242f, + 0.602051f, 0.540527f, 0.625488f, 0.510742f, 0.646484f, 0.483398f, 0.666016f, 0.458008f, + 0.681152f, 0.435791f, 0.700195f, 0.413086f, 0.713379f, 0.394043f, 0.726562f, 0.375488f, + 0.739746f, 0.357910f, 0.750488f, 0.341797f, 0.762207f, 0.326172f, 0.770996f, 0.312500f, + 0.782227f, 0.298096f, 0.790527f, 0.285400f, 0.797363f, 0.273438f, 0.805176f, 0.261719f, + 0.812988f, 0.250732f, 0.819336f, 0.240723f, 0.826660f, 0.230469f, 0.833496f, 0.221191f, + 0.837891f, 0.212280f, 0.845703f, 0.202759f, 0.851562f, 0.193970f, 0.855957f, 0.186157f, + 0.861816f, 0.178101f, 0.867676f, 0.170410f, 0.869629f, 0.163696f, 0.875977f, 0.156372f, + 0.879395f, 0.150146f, 0.884277f, 0.143433f, 0.888184f, 0.137207f, 0.891113f, 0.131470f, + 0.894531f, 0.125977f, 0.899414f, 0.120056f, 0.902344f, 0.114685f, 0.905762f, 0.109619f, + 0.908203f, 0.105042f, 0.912109f, 0.099854f, 0.915527f, 0.094604f, 0.916504f, 0.090820f, + 0.921387f, 0.086182f, 0.922852f, 0.081482f, 0.925293f, 0.077515f, 0.927734f, 0.073608f, + 0.930176f, 0.069397f, 0.933594f, 0.065125f, 0.935547f, 0.061493f, 0.938477f, 0.057404f, + 0.938965f, 0.052643f, 0.940430f, 0.047821f, 0.941895f, 0.043549f, 0.944824f, 0.038879f, + 0.945801f, 0.034454f, 0.945801f, 0.028198f, 0.945801f, 0.021210f, 0.942383f, 0.007812f, + 0.000000f, 1.000000f, 0.215454f, 0.907715f, 0.333008f, 0.822266f, 0.411133f, 0.752930f, + 0.470459f, 0.694824f, 0.516602f, 0.645508f, 0.554199f, 0.602539f, 0.587891f, 0.563965f, + 0.614746f, 0.530273f, 0.638672f, 0.499756f, 0.660156f, 0.472168f, 0.681152f, 0.446045f, + 0.696777f, 0.423096f, 0.714355f, 0.400635f, 0.728027f, 0.380615f, 0.738770f, 0.363037f, + 0.753418f, 0.344727f, 0.764648f, 0.328125f, 0.776367f, 0.312500f, 0.784180f, 0.298828f, + 0.795410f, 0.284668f, 0.803711f, 0.271729f, 0.812500f, 0.259521f, 0.819336f, 0.248291f, + 0.825684f, 0.237305f, 0.832520f, 0.227051f, 0.839844f, 0.216919f, 0.845215f, 0.208130f, + 0.851074f, 0.199219f, 0.857422f, 0.190063f, 0.863281f, 0.181641f, 0.867676f, 0.173828f, + 0.874512f, 0.165405f, 0.877441f, 0.158447f, 0.881836f, 0.151367f, 0.885742f, 0.144775f, + 0.890625f, 0.137939f, 0.893066f, 0.132446f, 0.897949f, 0.126099f, 0.900879f, 0.120605f, + 0.906250f, 0.114685f, 0.908203f, 0.109619f, 0.910645f, 0.105225f, 0.915527f, 0.099243f, + 0.916504f, 0.095093f, 0.920898f, 0.090454f, 0.924316f, 0.085571f, 0.925781f, 0.081482f, + 0.928223f, 0.077515f, 0.931641f, 0.073120f, 0.933594f, 0.069214f, 0.935547f, 0.065674f, + 0.938965f, 0.061676f, 0.940918f, 0.057983f, 0.942871f, 0.054504f, 0.945801f, 0.050690f, + 0.946777f, 0.047211f, 0.948242f, 0.042480f, 0.949219f, 0.038391f, 0.951172f, 0.034058f, + 0.952148f, 0.029922f, 0.953613f, 0.024521f, 0.953125f, 0.018356f, 0.950195f, 0.006660f, + 0.000000f, 1.000000f, 0.219482f, 0.905762f, 0.338623f, 0.819336f, 0.420166f, 0.748047f, + 0.480713f, 0.688477f, 0.527344f, 0.638184f, 0.567383f, 0.593750f, 0.599121f, 0.555664f, + 0.628418f, 0.520508f, 0.651855f, 0.489502f, 0.673828f, 0.460938f, 0.692871f, 0.434814f, + 0.711426f, 0.410889f, 0.727539f, 0.388672f, 0.741699f, 0.368408f, 0.752930f, 0.350342f, + 0.768066f, 0.331787f, 0.778320f, 0.315674f, 0.789551f, 0.299805f, 0.797363f, 0.285889f, + 0.807129f, 0.272461f, 0.815918f, 0.259277f, 0.824707f, 0.246826f, 0.832031f, 0.235474f, + 0.837891f, 0.224854f, 0.845215f, 0.214111f, 0.852051f, 0.204468f, 0.856934f, 0.195801f, + 0.862305f, 0.186646f, 0.867188f, 0.178833f, 0.873535f, 0.170288f, 0.879395f, 0.161743f, + 0.883301f, 0.154297f, 0.887695f, 0.147339f, 0.892090f, 0.140503f, 0.897461f, 0.133423f, + 0.899414f, 0.127808f, 0.904297f, 0.121887f, 0.907715f, 0.115662f, 0.910156f, 0.110596f, + 0.914062f, 0.105469f, 0.917480f, 0.099854f, 0.919922f, 0.095276f, 0.922852f, 0.090698f, + 0.926270f, 0.085815f, 0.928223f, 0.081787f, 0.931152f, 0.077393f, 0.933105f, 0.073608f, + 0.936035f, 0.069580f, 0.938965f, 0.065552f, 0.939941f, 0.062225f, 0.944336f, 0.058228f, + 0.945801f, 0.054840f, 0.946777f, 0.051666f, 0.950195f, 0.048096f, 0.952148f, 0.044830f, + 0.953125f, 0.042023f, 0.955566f, 0.037872f, 0.956055f, 0.033844f, 0.956543f, 0.030136f, + 0.958984f, 0.025681f, 0.959961f, 0.022354f, 0.958496f, 0.015495f, 0.957520f, 0.006104f, + 0.000000f, 1.000000f, 0.221680f, 0.904785f, 0.343262f, 0.816895f, 0.427979f, 0.743652f, + 0.489014f, 0.683105f, 0.538574f, 0.630859f, 0.578613f, 0.585938f, 0.612793f, 0.545410f, + 0.640137f, 0.510742f, 0.664062f, 0.479004f, 0.687500f, 0.449951f, 0.706055f, 0.424072f, + 0.724609f, 0.399414f, 0.739258f, 0.377441f, 0.754395f, 0.356445f, 0.767090f, 0.337891f, + 0.779785f, 0.320068f, 0.792480f, 0.302979f, 0.801758f, 0.287598f, 0.810547f, 0.273682f, + 0.820312f, 0.259766f, 0.828125f, 0.247681f, 0.836914f, 0.234741f, 0.843262f, 0.223633f, + 0.850586f, 0.212402f, 0.856445f, 0.202637f, 0.861328f, 0.193359f, 0.868164f, 0.183716f, + 0.873047f, 0.175659f, 0.877930f, 0.167480f, 0.882812f, 0.159790f, 0.887695f, 0.151611f, + 0.893555f, 0.144287f, 0.897949f, 0.136841f, 0.900879f, 0.130493f, 0.906250f, 0.123779f, + 0.908691f, 0.117920f, 0.911621f, 0.112488f, 0.916504f, 0.106506f, 0.918457f, 0.101440f, + 0.921875f, 0.096497f, 0.925781f, 0.091125f, 0.927734f, 0.086975f, 0.931152f, 0.082336f, + 0.933594f, 0.077942f, 0.936035f, 0.073975f, 0.937988f, 0.070068f, 0.940430f, 0.066162f, + 0.943359f, 0.062286f, 0.945312f, 0.058868f, 0.947754f, 0.055481f, 0.950195f, 0.051758f, + 0.951172f, 0.048920f, 0.953613f, 0.045898f, 0.956543f, 0.042297f, 0.957031f, 0.039734f, + 0.959961f, 0.036743f, 0.961914f, 0.033630f, 0.962402f, 0.030350f, 0.962891f, 0.026260f, + 0.964355f, 0.022385f, 0.964844f, 0.018661f, 0.965332f, 0.013443f, 0.963379f, 0.005283f, + 0.000000f, 1.000000f, 0.223877f, 0.904297f, 0.349854f, 0.813477f, 0.434814f, 0.739258f, + 0.498047f, 0.677246f, 0.548340f, 0.624023f, 0.588867f, 0.578125f, 0.624023f, 0.537109f, + 0.653320f, 0.500488f, 0.677734f, 0.468506f, 0.699707f, 0.439453f, 0.719238f, 0.412842f, + 0.737305f, 0.388184f, 0.753906f, 0.365723f, 0.767578f, 0.344971f, 0.780273f, 0.326172f, + 0.791016f, 0.308594f, 0.802734f, 0.291992f, 0.812012f, 0.276611f, 0.822754f, 0.261719f, + 0.830566f, 0.248657f, 0.838379f, 0.236084f, 0.846680f, 0.223877f, 0.854492f, 0.212402f, + 0.860352f, 0.201660f, 0.865234f, 0.192017f, 0.874023f, 0.181885f, 0.876953f, 0.173462f, + 0.883789f, 0.164673f, 0.887695f, 0.156860f, 0.891113f, 0.150146f, 0.896973f, 0.141968f, + 0.900391f, 0.135010f, 0.905762f, 0.127808f, 0.909180f, 0.121338f, 0.913574f, 0.114990f, + 0.916992f, 0.109131f, 0.920410f, 0.103577f, 0.923828f, 0.098083f, 0.927246f, 0.093140f, + 0.929688f, 0.088196f, 0.932617f, 0.083618f, 0.935547f, 0.079041f, 0.937988f, 0.074890f, + 0.940430f, 0.070740f, 0.943359f, 0.066895f, 0.945312f, 0.063049f, 0.946777f, 0.059570f, + 0.949219f, 0.056183f, 0.951172f, 0.052826f, 0.953613f, 0.049438f, 0.955566f, 0.046600f, + 0.957520f, 0.043365f, 0.958496f, 0.040771f, 0.961914f, 0.037384f, 0.962891f, 0.034882f, + 0.963867f, 0.032532f, 0.966797f, 0.029526f, 0.968262f, 0.027039f, 0.967773f, 0.023560f, + 0.969238f, 0.019897f, 0.969238f, 0.016190f, 0.970215f, 0.012489f, 0.969238f, 0.004246f, + 0.000000f, 1.000000f, 0.226807f, 0.902832f, 0.354980f, 0.811035f, 0.444092f, 0.734375f, + 0.508301f, 0.670898f, 0.559570f, 0.616699f, 0.599609f, 0.569824f, 0.634766f, 0.528320f, + 0.666016f, 0.491211f, 0.689941f, 0.458740f, 0.711426f, 0.429688f, 0.731934f, 0.402344f, + 0.749512f, 0.377686f, 0.765625f, 0.354736f, 0.779297f, 0.334473f, 0.792480f, 0.314697f, + 0.802734f, 0.297363f, 0.813477f, 0.281250f, 0.823730f, 0.265625f, 0.833496f, 0.250732f, + 0.842285f, 0.237671f, 0.850586f, 0.224976f, 0.855957f, 0.213989f, 0.863770f, 0.202026f, + 0.872070f, 0.191406f, 0.876465f, 0.181274f, 0.883301f, 0.172119f, 0.886719f, 0.163452f, + 0.892090f, 0.155273f, 0.896484f, 0.147339f, 0.900391f, 0.140137f, 0.905273f, 0.132935f, + 0.908203f, 0.126709f, 0.913574f, 0.119446f, 0.917969f, 0.112915f, 0.920898f, 0.107056f, + 0.924805f, 0.101074f, 0.927734f, 0.095703f, 0.931152f, 0.090576f, 0.934570f, 0.085388f, + 0.936523f, 0.080933f, 0.939453f, 0.076599f, 0.942383f, 0.071960f, 0.943848f, 0.068298f, + 0.947266f, 0.064209f, 0.948730f, 0.060516f, 0.950684f, 0.057098f, 0.953613f, 0.053650f, + 0.954590f, 0.050446f, 0.956543f, 0.047424f, 0.958984f, 0.044250f, 0.960938f, 0.041382f, + 0.962891f, 0.038391f, 0.963867f, 0.036011f, 0.965820f, 0.033325f, 0.967773f, 0.030518f, + 0.969238f, 0.028290f, 0.970215f, 0.026047f, 0.972656f, 0.023544f, 0.974121f, 0.020996f, + 0.973145f, 0.017822f, 0.974121f, 0.013947f, 0.975098f, 0.009872f, 0.974121f, 0.003941f, + 0.000000f, 1.000000f, 0.229126f, 0.901855f, 0.361572f, 0.807617f, 0.450928f, 0.729980f, + 0.518555f, 0.665039f, 0.570801f, 0.609375f, 0.612305f, 0.561523f, 0.646973f, 0.519531f, + 0.678223f, 0.481934f, 0.702148f, 0.449219f, 0.724121f, 0.419189f, 0.743652f, 0.392090f, + 0.760254f, 0.367432f, 0.775391f, 0.344727f, 0.790527f, 0.323975f, 0.804688f, 0.303955f, + 0.815430f, 0.286621f, 0.824707f, 0.270508f, 0.835449f, 0.255371f, 0.843262f, 0.241211f, + 0.852051f, 0.227295f, 0.859863f, 0.214844f, 0.865723f, 0.203735f, 0.871582f, 0.193115f, + 0.878906f, 0.182129f, 0.885254f, 0.172241f, 0.890625f, 0.162720f, 0.895996f, 0.154297f, + 0.900391f, 0.146118f, 0.904785f, 0.138550f, 0.909180f, 0.131348f, 0.913574f, 0.124451f, + 0.916016f, 0.118408f, 0.920898f, 0.112122f, 0.923828f, 0.105774f, 0.928223f, 0.099609f, + 0.931641f, 0.093750f, 0.933594f, 0.089050f, 0.937988f, 0.083374f, 0.939941f, 0.078735f, + 0.942383f, 0.074524f, 0.945801f, 0.069702f, 0.946289f, 0.066467f, 0.950195f, 0.061890f, + 0.951660f, 0.058624f, 0.955078f, 0.054688f, 0.956055f, 0.051697f, 0.958008f, 0.048462f, + 0.960449f, 0.045135f, 0.962402f, 0.042114f, 0.963379f, 0.039734f, 0.965820f, 0.036774f, + 0.967285f, 0.033936f, 0.968750f, 0.031799f, 0.970215f, 0.029282f, 0.971680f, 0.027344f, + 0.973633f, 0.024445f, 0.974609f, 0.022675f, 0.975586f, 0.020599f, 0.977539f, 0.018616f, + 0.979492f, 0.015884f, 0.978516f, 0.012421f, 0.978027f, 0.008774f, 0.979492f, 0.003914f, + 0.000000f, 1.000000f, 0.232178f, 0.900879f, 0.367432f, 0.804688f, 0.460205f, 0.725098f, + 0.526855f, 0.659180f, 0.581543f, 0.602051f, 0.623535f, 0.553223f, 0.658203f, 0.511230f, + 0.689453f, 0.472900f, 0.714844f, 0.439209f, 0.736328f, 0.409424f, 0.754883f, 0.382568f, + 0.773926f, 0.356934f, 0.788574f, 0.334473f, 0.800293f, 0.314209f, 0.812500f, 0.294922f, + 0.825684f, 0.276367f, 0.836426f, 0.260010f, 0.844727f, 0.245483f, 0.853027f, 0.231323f, + 0.861328f, 0.218018f, 0.869141f, 0.205444f, 0.875977f, 0.194092f, 0.881348f, 0.183594f, + 0.887207f, 0.173706f, 0.893066f, 0.163940f, 0.898438f, 0.154419f, 0.904297f, 0.145752f, + 0.908203f, 0.137817f, 0.912598f, 0.130493f, 0.916504f, 0.123413f, 0.919434f, 0.116943f, + 0.923340f, 0.110474f, 0.926270f, 0.104736f, 0.929199f, 0.099243f, 0.934082f, 0.093018f, + 0.937500f, 0.087524f, 0.939941f, 0.082397f, 0.943848f, 0.077271f, 0.945312f, 0.072815f, + 0.948242f, 0.068481f, 0.951172f, 0.064148f, 0.953613f, 0.060181f, 0.955566f, 0.056610f, + 0.957031f, 0.053436f, 0.959961f, 0.049469f, 0.961426f, 0.046600f, 0.963379f, 0.043518f, + 0.965332f, 0.040527f, 0.967285f, 0.037750f, 0.967773f, 0.035156f, 0.969238f, 0.033020f, + 0.971191f, 0.030273f, 0.972656f, 0.027939f, 0.974609f, 0.025482f, 0.975586f, 0.023697f, + 0.977051f, 0.021652f, 0.979004f, 0.019363f, 0.979980f, 0.017212f, 0.980957f, 0.015762f, + 0.981934f, 0.014084f, 0.983887f, 0.011299f, 0.982910f, 0.007217f, 0.982422f, 0.003099f, + 0.000000f, 1.000000f, 0.236328f, 0.898926f, 0.373291f, 0.801758f, 0.466797f, 0.721191f, + 0.538086f, 0.652344f, 0.590332f, 0.595703f, 0.634277f, 0.545898f, 0.670410f, 0.502441f, + 0.699707f, 0.464600f, 0.724121f, 0.430908f, 0.747070f, 0.400146f, 0.768066f, 0.372070f, + 0.783203f, 0.347412f, 0.797852f, 0.324951f, 0.812012f, 0.303955f, 0.824219f, 0.284668f, + 0.834473f, 0.267822f, 0.845703f, 0.250977f, 0.854492f, 0.235840f, 0.861328f, 0.222656f, + 0.869141f, 0.209595f, 0.876953f, 0.196899f, 0.885254f, 0.185303f, 0.889648f, 0.175049f, + 0.895020f, 0.165039f, 0.900391f, 0.156128f, 0.905762f, 0.146729f, 0.912109f, 0.137939f, + 0.915039f, 0.130249f, 0.919434f, 0.122803f, 0.922363f, 0.116150f, 0.926758f, 0.109314f, + 0.929199f, 0.103760f, 0.932617f, 0.097595f, 0.936035f, 0.092468f, 0.938477f, 0.087097f, + 0.941406f, 0.082275f, 0.945312f, 0.076782f, 0.948730f, 0.071716f, 0.951172f, 0.067261f, + 0.953125f, 0.063110f, 0.956543f, 0.058868f, 0.958008f, 0.055115f, 0.959961f, 0.051788f, + 0.961914f, 0.048309f, 0.964844f, 0.044891f, 0.966309f, 0.041840f, 0.967285f, 0.039368f, + 0.968750f, 0.036591f, 0.970703f, 0.033936f, 0.972656f, 0.031036f, 0.974609f, 0.028870f, + 0.975098f, 0.026840f, 0.977051f, 0.024567f, 0.978027f, 0.022522f, 0.979980f, 0.020142f, + 0.979980f, 0.018600f, 0.981445f, 0.016800f, 0.982422f, 0.015289f, 0.985352f, 0.013023f, + 0.985840f, 0.011269f, 0.986328f, 0.009911f, 0.985840f, 0.007294f, 0.986816f, 0.001528f, + 0.000000f, 1.000000f, 0.238525f, 0.897949f, 0.378418f, 0.799316f, 0.475342f, 0.716309f, + 0.546875f, 0.646973f, 0.601562f, 0.588379f, 0.644531f, 0.538086f, 0.681152f, 0.494141f, + 0.710938f, 0.455322f, 0.735840f, 0.421387f, 0.757324f, 0.391113f, 0.777832f, 0.363281f, + 0.793945f, 0.338623f, 0.807617f, 0.315918f, 0.821289f, 0.295410f, 0.834473f, 0.275879f, + 0.844238f, 0.258545f, 0.854004f, 0.242676f, 0.863281f, 0.227173f, 0.870605f, 0.213623f, + 0.878418f, 0.200928f, 0.885254f, 0.188843f, 0.891602f, 0.177246f, 0.898438f, 0.166626f, + 0.901855f, 0.157471f, 0.907227f, 0.148193f, 0.912109f, 0.139771f, 0.916992f, 0.131592f, + 0.921387f, 0.123474f, 0.926270f, 0.115784f, 0.929688f, 0.109314f, 0.933594f, 0.102722f, + 0.937012f, 0.096619f, 0.939453f, 0.091309f, 0.942383f, 0.085938f, 0.944824f, 0.080933f, + 0.947266f, 0.076416f, 0.948730f, 0.072327f, 0.953613f, 0.066895f, 0.955078f, 0.062927f, + 0.958008f, 0.058441f, 0.960449f, 0.054565f, 0.963379f, 0.050385f, 0.964355f, 0.047333f, + 0.966309f, 0.044037f, 0.967773f, 0.041168f, 0.970703f, 0.037689f, 0.972168f, 0.035034f, + 0.973633f, 0.032440f, 0.974609f, 0.030289f, 0.976074f, 0.027878f, 0.977539f, 0.025436f, + 0.979004f, 0.023041f, 0.980469f, 0.021194f, 0.980957f, 0.019592f, 0.982422f, 0.017700f, + 0.983887f, 0.015991f, 0.985352f, 0.013802f, 0.986328f, 0.012321f, 0.986816f, 0.011200f, + 0.988281f, 0.009804f, 0.988770f, 0.008263f, 0.991211f, 0.005661f, 0.988770f, 0.001611f, + 0.000000f, 1.000000f, 0.241333f, 0.896973f, 0.385742f, 0.795410f, 0.485596f, 0.710449f, + 0.557617f, 0.640625f, 0.610840f, 0.582031f, 0.654297f, 0.530762f, 0.691895f, 0.486084f, + 0.720703f, 0.447754f, 0.746094f, 0.413330f, 0.767578f, 0.382568f, 0.788086f, 0.354492f, + 0.803223f, 0.329834f, 0.817871f, 0.307373f, 0.830566f, 0.286377f, 0.842285f, 0.267822f, + 0.854004f, 0.249878f, 0.861816f, 0.234131f, 0.870605f, 0.219849f, 0.880371f, 0.205078f, + 0.887207f, 0.192505f, 0.892578f, 0.181152f, 0.898438f, 0.170410f, 0.904297f, 0.159790f, + 0.909668f, 0.149780f, 0.914062f, 0.140991f, 0.919922f, 0.132202f, 0.923340f, 0.124878f, + 0.927246f, 0.117859f, 0.931641f, 0.110107f, 0.935547f, 0.103210f, 0.940430f, 0.096497f, + 0.941895f, 0.090942f, 0.944824f, 0.085388f, 0.948730f, 0.079956f, 0.949707f, 0.075562f, + 0.952148f, 0.070984f, 0.954102f, 0.066833f, 0.957031f, 0.062500f, 0.958496f, 0.058807f, + 0.961914f, 0.054749f, 0.963867f, 0.050842f, 0.967285f, 0.046600f, 0.968750f, 0.043152f, + 0.970215f, 0.040070f, 0.972168f, 0.037079f, 0.973145f, 0.034576f, 0.976074f, 0.031586f, + 0.977539f, 0.028717f, 0.978516f, 0.026489f, 0.979980f, 0.024384f, 0.980469f, 0.022659f, + 0.981934f, 0.020569f, 0.983887f, 0.018402f, 0.985352f, 0.016235f, 0.985840f, 0.014786f, + 0.986816f, 0.013382f, 0.987305f, 0.012222f, 0.988281f, 0.010643f, 0.989746f, 0.009056f, + 0.991699f, 0.006828f, 0.992188f, 0.005764f, 0.992676f, 0.004990f, 0.993652f, 0.003448f, + 0.000000f, 1.000000f, 0.243042f, 0.896484f, 0.391113f, 0.792480f, 0.492676f, 0.706055f, + 0.565918f, 0.635254f, 0.621582f, 0.574707f, 0.666504f, 0.522949f, 0.702148f, 0.478271f, + 0.730469f, 0.439697f, 0.756836f, 0.404541f, 0.778320f, 0.374023f, 0.795410f, 0.346924f, + 0.812500f, 0.321533f, 0.827637f, 0.298340f, 0.840332f, 0.278320f, 0.851562f, 0.259277f, + 0.860840f, 0.242432f, 0.870605f, 0.226318f, 0.878906f, 0.211426f, 0.886230f, 0.198364f, + 0.893066f, 0.185791f, 0.899902f, 0.173584f, 0.905762f, 0.163086f, 0.910645f, 0.152954f, + 0.916504f, 0.143677f, 0.921875f, 0.134033f, 0.925781f, 0.125977f, 0.929688f, 0.118408f, + 0.933594f, 0.111023f, 0.936523f, 0.104736f, 0.939453f, 0.098572f, 0.943848f, 0.091736f, + 0.946777f, 0.085815f, 0.949707f, 0.080322f, 0.953125f, 0.074768f, 0.955566f, 0.070190f, + 0.957031f, 0.065918f, 0.958496f, 0.061981f, 0.961914f, 0.057526f, 0.963379f, 0.053833f, + 0.964844f, 0.050659f, 0.966309f, 0.047791f, 0.968262f, 0.044586f, 0.972168f, 0.040314f, + 0.974121f, 0.036652f, 0.975098f, 0.033936f, 0.976562f, 0.031250f, 0.978027f, 0.028748f, + 0.979980f, 0.026230f, 0.981445f, 0.023804f, 0.983398f, 0.021057f, 0.984375f, 0.019104f, + 0.985352f, 0.017395f, 0.986328f, 0.015854f, 0.986816f, 0.014481f, 0.988281f, 0.012825f, + 0.989746f, 0.011124f, 0.991699f, 0.008858f, 0.992188f, 0.007614f, 0.992676f, 0.006672f, + 0.993164f, 0.005848f, 0.994141f, 0.004837f, 0.995117f, 0.003674f, 0.997070f, 0.001191f, + 0.000000f, 1.000000f, 0.246826f, 0.895020f, 0.397217f, 0.789551f, 0.500000f, 0.701660f, + 0.575195f, 0.628906f, 0.631836f, 0.567871f, 0.675293f, 0.516113f, 0.711914f, 0.470947f, + 0.742188f, 0.431152f, 0.766602f, 0.396729f, 0.787109f, 0.366211f, 0.805664f, 0.338379f, + 0.821289f, 0.313477f, 0.835938f, 0.290527f, 0.847168f, 0.270752f, 0.859375f, 0.251465f, + 0.869141f, 0.234863f, 0.877441f, 0.218872f, 0.885742f, 0.204712f, 0.894531f, 0.190918f, + 0.899902f, 0.178589f, 0.905762f, 0.167358f, 0.912109f, 0.156616f, 0.917480f, 0.146362f, + 0.922852f, 0.136841f, 0.926270f, 0.128784f, 0.931152f, 0.120789f, 0.935059f, 0.112854f, + 0.938965f, 0.105469f, 0.942871f, 0.098572f, 0.945312f, 0.092285f, 0.947754f, 0.086792f, + 0.950195f, 0.081665f, 0.953125f, 0.076660f, 0.957031f, 0.070801f, 0.959961f, 0.065796f, + 0.961426f, 0.061523f, 0.963867f, 0.057251f, 0.967285f, 0.052887f, 0.968262f, 0.049133f, + 0.969238f, 0.046051f, 0.971191f, 0.043121f, 0.972168f, 0.040375f, 0.973633f, 0.037689f, + 0.975586f, 0.034943f, 0.977051f, 0.032074f, 0.979492f, 0.028976f, 0.980957f, 0.026245f, + 0.982422f, 0.023773f, 0.983887f, 0.021606f, 0.985352f, 0.019318f, 0.986816f, 0.017227f, + 0.988281f, 0.015045f, 0.990234f, 0.012520f, 0.991211f, 0.010956f, 0.991699f, 0.009674f, + 0.992188f, 0.008583f, 0.992676f, 0.007614f, 0.993652f, 0.006512f, 0.994141f, 0.005569f, + 0.995117f, 0.004410f, 0.996582f, 0.002855f, 0.999023f, 0.000214f, 0.999023f, 0.000002f, + 0.000000f, 1.000000f, 0.249512f, 0.893555f, 0.403564f, 0.786621f, 0.508301f, 0.697266f, + 0.583496f, 0.624023f, 0.641113f, 0.561523f, 0.685059f, 0.509277f, 0.720215f, 0.464600f, + 0.749512f, 0.424561f, 0.776367f, 0.389160f, 0.796387f, 0.358398f, 0.816895f, 0.330078f, + 0.832031f, 0.305176f, 0.846191f, 0.282959f, 0.854004f, 0.263916f, 0.866211f, 0.244507f, + 0.876953f, 0.227539f, 0.884277f, 0.212402f, 0.893066f, 0.197998f, 0.899902f, 0.184692f, + 0.905273f, 0.172485f, 0.912109f, 0.161255f, 0.920898f, 0.149536f, 0.920898f, 0.141113f, + 0.927246f, 0.132202f, 0.933594f, 0.122498f, 0.937012f, 0.114014f, 0.937012f, 0.108704f, + 0.942383f, 0.101929f, 0.948730f, 0.093689f, 0.952637f, 0.085876f, 0.952637f, 0.081421f, + 0.952637f, 0.077759f, 0.952637f, 0.074646f, 0.960938f, 0.067627f, 0.968262f, 0.059875f, + 0.968262f, 0.055359f, 0.968262f, 0.052246f, 0.968262f, 0.049744f, 0.968262f, 0.047577f, + 0.968262f, 0.045715f, 0.969238f, 0.043945f, 0.977051f, 0.037750f, 0.983887f, 0.030899f, + 0.983887f, 0.027618f, 0.983887f, 0.025513f, 0.983887f, 0.023895f, 0.983887f, 0.022568f, + 0.983887f, 0.021454f, 0.983887f, 0.020508f, 0.983887f, 0.019684f, 0.983887f, 0.018967f, + 0.983887f, 0.018341f, 0.983887f, 0.017807f, 0.991211f, 0.013176f, 0.999512f, 0.005295f, + 0.999512f, 0.002834f, 0.999512f, 0.001688f, 0.999512f, 0.001009f, 0.999512f, 0.000575f, + 0.999512f, 0.000294f, 0.999512f, 0.000121f, 0.999512f, 0.000028f, 0.999512f, 0.000000f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.995117f, 0.000000f, 0.994141f, 0.000000f, 0.993164f, 0.000000f, 0.993164f, + 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.990234f, 0.000000f, 0.989746f, + 0.000000f, 0.988281f, 0.000000f, 0.987793f, 0.000000f, 0.986816f, 0.000000f, 0.985352f, + 0.000000f, 0.983887f, 0.000000f, 0.981934f, 0.000000f, 0.981445f, 0.000000f, 0.979980f, + 0.000000f, 0.977539f, 0.000000f, 0.975586f, 0.000000f, 0.974121f, 0.000000f, 0.971680f, + 0.000000f, 0.970215f, 0.000000f, 0.967285f, 0.000000f, 0.963867f, 0.000000f, 0.962402f, + 0.000000f, 0.958008f, 0.000000f, 0.955566f, 0.000000f, 0.951172f, 0.000000f, 0.947266f, + 0.000000f, 0.942871f, 0.000000f, 0.937988f, 0.000000f, 0.932617f, 0.000000f, 0.926758f, + 0.000000f, 0.919922f, 0.000000f, 0.912109f, 0.000000f, 0.903809f, 0.000000f, 0.894531f, + 0.000000f, 0.882812f, 0.000000f, 0.869629f, 0.000000f, 0.854492f, 0.000000f, 0.836426f, + 0.000000f, 0.815430f, 0.000000f, 0.789551f, 0.000000f, 0.756348f, 0.000000f, 0.714844f, + 0.000000f, 0.657715f, 0.000000f, 0.574707f, 0.000000f, 0.441650f, 0.000000f, 0.173096f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, + 0.000000f, 0.995117f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, + 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.989258f, + 0.000000f, 0.988770f, 0.000000f, 0.987793f, 0.000000f, 0.986328f, 0.000000f, 0.985352f, + 0.000000f, 0.983887f, 0.000000f, 0.982422f, 0.000000f, 0.980957f, 0.000000f, 0.979492f, + 0.000000f, 0.977539f, 0.000000f, 0.975586f, 0.000000f, 0.973633f, 0.000000f, 0.972168f, + 0.000000f, 0.969238f, 0.000000f, 0.967285f, 0.000000f, 0.964355f, 0.000000f, 0.960938f, + 0.000000f, 0.958984f, 0.000000f, 0.954590f, 0.000000f, 0.951660f, 0.000000f, 0.946777f, + 0.000000f, 0.942871f, 0.000000f, 0.937500f, 0.000000f, 0.932617f, 0.000000f, 0.926270f, + 0.000000f, 0.918945f, 0.000000f, 0.911621f, 0.000000f, 0.902832f, 0.000000f, 0.893066f, + 0.000000f, 0.882324f, 0.000000f, 0.869629f, 0.000000f, 0.854492f, 0.000000f, 0.836426f, + 0.000000f, 0.815430f, 0.000000f, 0.789062f, 0.000000f, 0.756348f, 0.000000f, 0.714844f, + 0.000000f, 0.657715f, 0.000002f, 0.574707f, 0.000001f, 0.441162f, 0.000001f, 0.172607f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.995117f, + 0.000000f, 0.994629f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.992676f, + 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.990234f, 0.000000f, 0.989746f, + 0.000000f, 0.988770f, 0.000000f, 0.987305f, 0.000000f, 0.985840f, 0.000000f, 0.984863f, + 0.000000f, 0.983887f, 0.000000f, 0.982422f, 0.000000f, 0.980469f, 0.000000f, 0.979004f, + 0.000000f, 0.977051f, 0.000000f, 0.976074f, 0.000000f, 0.973633f, 0.000000f, 0.971191f, + 0.000000f, 0.969238f, 0.000000f, 0.966797f, 0.000000f, 0.964355f, 0.000000f, 0.960938f, + 0.000000f, 0.957520f, 0.000000f, 0.955078f, 0.000000f, 0.950684f, 0.000000f, 0.946777f, + 0.000000f, 0.941895f, 0.000000f, 0.937500f, 0.000000f, 0.931641f, 0.000000f, 0.925781f, + 0.000000f, 0.918945f, 0.000000f, 0.911133f, 0.000000f, 0.902344f, 0.000000f, 0.893066f, + 0.000000f, 0.881836f, 0.000000f, 0.868652f, 0.000006f, 0.853516f, 0.000021f, 0.835449f, + 0.000025f, 0.814941f, 0.000024f, 0.788086f, 0.000022f, 0.755371f, 0.000017f, 0.713379f, + 0.000017f, 0.656738f, 0.000013f, 0.574219f, 0.000012f, 0.441406f, 0.000011f, 0.172363f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, + 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.989746f, 0.000000f, 0.989258f, + 0.000000f, 0.988281f, 0.000000f, 0.986816f, 0.000000f, 0.985840f, 0.000000f, 0.984375f, + 0.000000f, 0.983398f, 0.000000f, 0.981934f, 0.000000f, 0.980469f, 0.000000f, 0.978516f, + 0.000000f, 0.977051f, 0.000000f, 0.975098f, 0.000000f, 0.973145f, 0.000000f, 0.971191f, + 0.000000f, 0.968262f, 0.000000f, 0.965820f, 0.000000f, 0.963867f, 0.000000f, 0.960449f, + 0.000000f, 0.957031f, 0.000000f, 0.953613f, 0.000000f, 0.950195f, 0.000000f, 0.945801f, + 0.000009f, 0.941406f, 0.000026f, 0.936035f, 0.000048f, 0.931152f, 0.000073f, 0.924316f, + 0.000097f, 0.917480f, 0.000107f, 0.910645f, 0.000108f, 0.901367f, 0.000107f, 0.892090f, + 0.000100f, 0.880371f, 0.000094f, 0.867676f, 0.000084f, 0.852051f, 0.000074f, 0.834473f, + 0.000066f, 0.813965f, 0.000078f, 0.787109f, 0.000069f, 0.754395f, 0.000066f, 0.712402f, + 0.000062f, 0.655762f, 0.000056f, 0.573730f, 0.000055f, 0.440918f, 0.000051f, 0.171875f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, + 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992188f, + 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.989746f, 0.000000f, 0.988770f, + 0.000000f, 0.987793f, 0.000000f, 0.986328f, 0.000000f, 0.985352f, 0.000000f, 0.984375f, + 0.000000f, 0.982910f, 0.000000f, 0.980957f, 0.000000f, 0.979492f, 0.000000f, 0.978516f, + 0.000003f, 0.976074f, 0.000018f, 0.974609f, 0.000040f, 0.972656f, 0.000065f, 0.970215f, + 0.000095f, 0.967773f, 0.000124f, 0.965332f, 0.000157f, 0.962402f, 0.000191f, 0.959961f, + 0.000222f, 0.956055f, 0.000260f, 0.953125f, 0.000280f, 0.948730f, 0.000285f, 0.945312f, + 0.000286f, 0.939941f, 0.000278f, 0.935059f, 0.000265f, 0.929199f, 0.000256f, 0.923828f, + 0.000238f, 0.916504f, 0.000219f, 0.908691f, 0.000203f, 0.899902f, 0.000193f, 0.890625f, + 0.000199f, 0.878906f, 0.000218f, 0.866211f, 0.000208f, 0.851074f, 0.000190f, 0.833008f, + 0.000186f, 0.812012f, 0.000184f, 0.785156f, 0.000179f, 0.752930f, 0.000172f, 0.710938f, + 0.000172f, 0.654297f, 0.000162f, 0.572754f, 0.000171f, 0.439697f, 0.000136f, 0.171265f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995117f, 0.000000f, 0.994141f, + 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, 0.000000f, 0.991699f, + 0.000000f, 0.991211f, 0.000001f, 0.990234f, 0.000020f, 0.989746f, 0.000047f, 0.988281f, + 0.000083f, 0.986816f, 0.000118f, 0.985840f, 0.000156f, 0.984863f, 0.000199f, 0.983398f, + 0.000236f, 0.981934f, 0.000278f, 0.980957f, 0.000322f, 0.979004f, 0.000361f, 0.977051f, + 0.000398f, 0.975586f, 0.000444f, 0.973633f, 0.000485f, 0.971680f, 0.000521f, 0.969238f, + 0.000553f, 0.966797f, 0.000566f, 0.964355f, 0.000563f, 0.961426f, 0.000548f, 0.958496f, + 0.000531f, 0.955566f, 0.000514f, 0.951172f, 0.000490f, 0.947266f, 0.000461f, 0.943359f, + 0.000429f, 0.938965f, 0.000421f, 0.933105f, 0.000422f, 0.928711f, 0.000425f, 0.921875f, + 0.000435f, 0.915039f, 0.000459f, 0.907227f, 0.000445f, 0.897949f, 0.000417f, 0.888672f, + 0.000412f, 0.877441f, 0.000429f, 0.863770f, 0.000413f, 0.848145f, 0.000400f, 0.831055f, + 0.000413f, 0.809570f, 0.000418f, 0.783203f, 0.000386f, 0.750488f, 0.000401f, 0.708984f, + 0.000384f, 0.652832f, 0.000400f, 0.571777f, 0.000402f, 0.438965f, 0.000273f, 0.171997f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000026f, 0.995605f, 0.000076f, 0.995117f, 0.000120f, 0.994141f, + 0.000180f, 0.993652f, 0.000231f, 0.992676f, 0.000284f, 0.991699f, 0.000344f, 0.991211f, + 0.000395f, 0.990723f, 0.000439f, 0.989746f, 0.000499f, 0.988770f, 0.000552f, 0.987793f, + 0.000598f, 0.986328f, 0.000638f, 0.985352f, 0.000692f, 0.983398f, 0.000742f, 0.982422f, + 0.000785f, 0.981445f, 0.000823f, 0.979492f, 0.000862f, 0.978027f, 0.000911f, 0.976074f, + 0.000926f, 0.974121f, 0.000916f, 0.972656f, 0.000890f, 0.970703f, 0.000864f, 0.967773f, + 0.000838f, 0.965332f, 0.000805f, 0.962891f, 0.000776f, 0.959961f, 0.000764f, 0.957031f, + 0.000768f, 0.953613f, 0.000766f, 0.949707f, 0.000777f, 0.945801f, 0.000794f, 0.941406f, + 0.000806f, 0.937012f, 0.000798f, 0.931641f, 0.000804f, 0.925781f, 0.000805f, 0.919434f, + 0.000810f, 0.912598f, 0.000813f, 0.904785f, 0.000785f, 0.895508f, 0.000799f, 0.886230f, + 0.000808f, 0.874512f, 0.000813f, 0.861328f, 0.000775f, 0.846191f, 0.000789f, 0.828125f, + 0.000801f, 0.806641f, 0.000812f, 0.780762f, 0.000786f, 0.747559f, 0.000817f, 0.706055f, + 0.000783f, 0.649902f, 0.000838f, 0.569824f, 0.000832f, 0.438477f, 0.000481f, 0.171509f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000021f, 0.998535f, 0.000090f, 0.998047f, + 0.000177f, 0.997559f, 0.000250f, 0.997070f, 0.000344f, 0.997070f, 0.000415f, 0.996582f, + 0.000479f, 0.995605f, 0.000565f, 0.995117f, 0.000632f, 0.995117f, 0.000685f, 0.994141f, + 0.000743f, 0.993164f, 0.000816f, 0.992188f, 0.000875f, 0.991211f, 0.000922f, 0.990723f, + 0.000961f, 0.989746f, 0.001023f, 0.988770f, 0.001081f, 0.987793f, 0.001128f, 0.987305f, + 0.001166f, 0.985352f, 0.001198f, 0.984375f, 0.001249f, 0.982910f, 0.001302f, 0.981445f, + 0.001317f, 0.979980f, 0.001296f, 0.978516f, 0.001256f, 0.977051f, 0.001225f, 0.975098f, + 0.001225f, 0.972656f, 0.001233f, 0.971191f, 0.001237f, 0.968750f, 0.001248f, 0.966309f, + 0.001211f, 0.963867f, 0.001237f, 0.960938f, 0.001268f, 0.958008f, 0.001292f, 0.955078f, + 0.001320f, 0.951660f, 0.001269f, 0.947754f, 0.001301f, 0.943848f, 0.001354f, 0.938965f, + 0.001381f, 0.935059f, 0.001392f, 0.929688f, 0.001324f, 0.923340f, 0.001329f, 0.916992f, + 0.001383f, 0.909668f, 0.001422f, 0.902344f, 0.001340f, 0.893066f, 0.001359f, 0.882812f, + 0.001376f, 0.871582f, 0.001421f, 0.858398f, 0.001361f, 0.842773f, 0.001387f, 0.824707f, + 0.001410f, 0.803223f, 0.001449f, 0.777344f, 0.001432f, 0.744629f, 0.001457f, 0.703613f, + 0.001539f, 0.647461f, 0.001521f, 0.567871f, 0.001505f, 0.437256f, 0.000751f, 0.171509f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000033f, 0.999023f, 0.000168f, 0.999023f, + 0.000345f, 0.998535f, 0.000432f, 0.998535f, 0.000581f, 0.998047f, 0.000674f, 0.997559f, + 0.000732f, 0.997070f, 0.000844f, 0.996582f, 0.000932f, 0.996582f, 0.000991f, 0.996094f, + 0.001032f, 0.995117f, 0.001120f, 0.995117f, 0.001198f, 0.994629f, 0.001252f, 0.993652f, + 0.001290f, 0.992676f, 0.001320f, 0.991699f, 0.001404f, 0.991211f, 0.001468f, 0.989258f, + 0.001512f, 0.988770f, 0.001544f, 0.988281f, 0.001569f, 0.986816f, 0.001620f, 0.985352f, + 0.001697f, 0.984863f, 0.001737f, 0.983398f, 0.001743f, 0.981934f, 0.001749f, 0.980469f, + 0.001726f, 0.978516f, 0.001767f, 0.977051f, 0.001804f, 0.975098f, 0.001835f, 0.973633f, + 0.001862f, 0.972168f, 0.001804f, 0.969238f, 0.001812f, 0.966797f, 0.001865f, 0.964844f, + 0.001929f, 0.961914f, 0.001898f, 0.959473f, 0.001972f, 0.956055f, 0.002037f, 0.953125f, + 0.002056f, 0.949707f, 0.002104f, 0.945801f, 0.002031f, 0.941406f, 0.002075f, 0.937012f, + 0.002115f, 0.931641f, 0.002157f, 0.926758f, 0.002066f, 0.920410f, 0.002131f, 0.913574f, + 0.002180f, 0.907227f, 0.002230f, 0.898438f, 0.002258f, 0.889648f, 0.002159f, 0.879395f, + 0.002251f, 0.867676f, 0.002285f, 0.854492f, 0.002348f, 0.838867f, 0.002274f, 0.821289f, + 0.002338f, 0.799316f, 0.002428f, 0.773438f, 0.002401f, 0.741699f, 0.002459f, 0.699707f, + 0.002590f, 0.644531f, 0.002565f, 0.564941f, 0.002457f, 0.436035f, 0.001085f, 0.171509f, + 0.000000f, 1.000000f, 0.000326f, 0.999512f, 0.000606f, 0.999023f, 0.000679f, 0.999023f, + 0.000867f, 0.998535f, 0.000974f, 0.998047f, 0.001014f, 0.998047f, 0.001128f, 0.997070f, + 0.001255f, 0.997070f, 0.001306f, 0.996582f, 0.001332f, 0.996094f, 0.001404f, 0.995117f, + 0.001533f, 0.994629f, 0.001585f, 0.994141f, 0.001615f, 0.993164f, 0.001633f, 0.992676f, + 0.001713f, 0.992188f, 0.001810f, 0.991211f, 0.001877f, 0.990234f, 0.001957f, 0.989258f, + 0.002033f, 0.987793f, 0.002115f, 0.986816f, 0.002268f, 0.985840f, 0.002331f, 0.984375f, + 0.002363f, 0.982910f, 0.002380f, 0.981934f, 0.002356f, 0.980957f, 0.002365f, 0.979492f, + 0.002472f, 0.977539f, 0.002438f, 0.975586f, 0.002480f, 0.973633f, 0.002535f, 0.971680f, + 0.002594f, 0.969727f, 0.002539f, 0.967773f, 0.002703f, 0.965332f, 0.002815f, 0.962402f, + 0.002903f, 0.960449f, 0.002934f, 0.957031f, 0.002836f, 0.954102f, 0.002890f, 0.950684f, + 0.002998f, 0.946777f, 0.003069f, 0.942871f, 0.002993f, 0.938477f, 0.003071f, 0.934082f, + 0.003115f, 0.929199f, 0.003164f, 0.923340f, 0.003290f, 0.917480f, 0.003218f, 0.910156f, + 0.003286f, 0.903320f, 0.003365f, 0.895020f, 0.003380f, 0.886230f, 0.003332f, 0.875488f, + 0.003494f, 0.863770f, 0.003576f, 0.850098f, 0.003597f, 0.834961f, 0.003561f, 0.816895f, + 0.003735f, 0.795410f, 0.003809f, 0.769531f, 0.003807f, 0.736816f, 0.003897f, 0.696289f, + 0.004066f, 0.641602f, 0.004017f, 0.562500f, 0.003731f, 0.434814f, 0.001482f, 0.172119f, + 0.000000f, 1.000000f, 0.000448f, 0.999512f, 0.000846f, 0.999023f, 0.000846f, 0.999023f, + 0.001189f, 0.998047f, 0.001211f, 0.998047f, 0.001214f, 0.997559f, 0.001500f, 0.996582f, + 0.001541f, 0.996582f, 0.001554f, 0.995605f, 0.001558f, 0.995117f, 0.001799f, 0.994629f, + 0.001853f, 0.994141f, 0.001926f, 0.993164f, 0.002012f, 0.992676f, 0.002098f, 0.992188f, + 0.002409f, 0.991211f, 0.002525f, 0.990234f, 0.002636f, 0.989258f, 0.002729f, 0.988281f, + 0.002769f, 0.986816f, 0.002920f, 0.985840f, 0.003025f, 0.984375f, 0.003069f, 0.982910f, + 0.003019f, 0.981445f, 0.003075f, 0.980469f, 0.003147f, 0.979004f, 0.003260f, 0.977539f, + 0.003376f, 0.976074f, 0.003471f, 0.973633f, 0.003443f, 0.972168f, 0.003523f, 0.969727f, + 0.003605f, 0.967773f, 0.003799f, 0.965332f, 0.003809f, 0.962891f, 0.003918f, 0.959961f, + 0.003990f, 0.957520f, 0.004040f, 0.954590f, 0.003922f, 0.951172f, 0.004013f, 0.947754f, + 0.004292f, 0.943848f, 0.004372f, 0.939453f, 0.004467f, 0.935547f, 0.004387f, 0.931152f, + 0.004406f, 0.925781f, 0.004528f, 0.919922f, 0.004787f, 0.913574f, 0.004635f, 0.906738f, + 0.004753f, 0.898926f, 0.004871f, 0.891113f, 0.005024f, 0.881348f, 0.004959f, 0.871094f, + 0.005142f, 0.858887f, 0.005264f, 0.845703f, 0.005363f, 0.830078f, 0.005356f, 0.812012f, + 0.005600f, 0.790039f, 0.005707f, 0.763672f, 0.005745f, 0.731934f, 0.005917f, 0.691895f, + 0.006096f, 0.637695f, 0.005943f, 0.560059f, 0.005348f, 0.432861f, 0.001945f, 0.172241f, + 0.000000f, 1.000000f, 0.000475f, 0.999512f, 0.000919f, 0.999023f, 0.000911f, 0.998535f, + 0.001319f, 0.998047f, 0.001321f, 0.997559f, 0.001315f, 0.997070f, 0.001681f, 0.996582f, + 0.001736f, 0.995605f, 0.001840f, 0.995117f, 0.001937f, 0.994629f, 0.002386f, 0.994141f, + 0.002514f, 0.993164f, 0.002598f, 0.992188f, 0.002716f, 0.991699f, 0.002808f, 0.990723f, + 0.003187f, 0.990234f, 0.003286f, 0.989258f, 0.003387f, 0.987793f, 0.003479f, 0.986816f, + 0.003534f, 0.986328f, 0.003813f, 0.984375f, 0.003986f, 0.982910f, 0.004002f, 0.981445f, + 0.004108f, 0.979980f, 0.004066f, 0.978516f, 0.004135f, 0.977539f, 0.004498f, 0.975586f, + 0.004513f, 0.973633f, 0.004650f, 0.971680f, 0.004791f, 0.969727f, 0.004761f, 0.967285f, + 0.004883f, 0.964844f, 0.005177f, 0.962891f, 0.005322f, 0.959961f, 0.005276f, 0.957520f, + 0.005344f, 0.954102f, 0.005501f, 0.951660f, 0.005692f, 0.948242f, 0.005737f, 0.944336f, + 0.005913f, 0.940430f, 0.005962f, 0.935547f, 0.006123f, 0.931641f, 0.006100f, 0.926758f, + 0.006302f, 0.921387f, 0.006462f, 0.916016f, 0.006653f, 0.909180f, 0.006672f, 0.902344f, + 0.006710f, 0.894043f, 0.006927f, 0.885742f, 0.007126f, 0.876953f, 0.007107f, 0.866211f, + 0.007381f, 0.853516f, 0.007553f, 0.839844f, 0.007690f, 0.824707f, 0.007744f, 0.806641f, + 0.008064f, 0.784668f, 0.008255f, 0.759277f, 0.008331f, 0.727051f, 0.008553f, 0.686523f, + 0.008720f, 0.633301f, 0.008400f, 0.557129f, 0.007336f, 0.431152f, 0.002468f, 0.171631f, + 0.000000f, 1.000000f, 0.000484f, 0.999512f, 0.000948f, 0.998535f, 0.000941f, 0.998535f, + 0.001380f, 0.997559f, 0.001490f, 0.997070f, 0.001662f, 0.997070f, 0.002186f, 0.995605f, + 0.002361f, 0.995117f, 0.002472f, 0.994629f, 0.002554f, 0.994141f, 0.003077f, 0.993164f, + 0.003181f, 0.992188f, 0.003248f, 0.991699f, 0.003347f, 0.990723f, 0.003517f, 0.989746f, + 0.004032f, 0.988770f, 0.004196f, 0.987305f, 0.004333f, 0.986816f, 0.004528f, 0.985352f, + 0.004707f, 0.984863f, 0.005169f, 0.983398f, 0.005051f, 0.981445f, 0.005215f, 0.979492f, + 0.005272f, 0.978516f, 0.005455f, 0.976562f, 0.005444f, 0.975098f, 0.005920f, 0.972656f, + 0.006084f, 0.971191f, 0.006104f, 0.968750f, 0.006344f, 0.967285f, 0.006546f, 0.964844f, + 0.006474f, 0.962402f, 0.006859f, 0.959473f, 0.007065f, 0.957031f, 0.007252f, 0.954102f, + 0.007290f, 0.951172f, 0.007435f, 0.948242f, 0.007648f, 0.944336f, 0.007698f, 0.940430f, + 0.007927f, 0.936035f, 0.008286f, 0.932129f, 0.008354f, 0.927246f, 0.008583f, 0.922363f, + 0.008568f, 0.916992f, 0.008904f, 0.910645f, 0.009140f, 0.904297f, 0.009460f, 0.896973f, + 0.009415f, 0.889160f, 0.009567f, 0.880371f, 0.009941f, 0.871582f, 0.010284f, 0.859863f, + 0.010338f, 0.847656f, 0.010643f, 0.834473f, 0.010971f, 0.818848f, 0.011017f, 0.799805f, + 0.011360f, 0.778320f, 0.011566f, 0.752441f, 0.011681f, 0.721680f, 0.012024f, 0.681641f, + 0.012032f, 0.627930f, 0.011436f, 0.553711f, 0.009796f, 0.429932f, 0.003063f, 0.171631f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000536f, 0.999023f, 0.001241f, 0.998535f, + 0.001919f, 0.997559f, 0.002066f, 0.997070f, 0.002249f, 0.996094f, 0.002773f, 0.995117f, + 0.002897f, 0.995117f, 0.003038f, 0.993652f, 0.003145f, 0.993164f, 0.003710f, 0.992188f, + 0.003944f, 0.991211f, 0.004177f, 0.990234f, 0.004353f, 0.989746f, 0.004490f, 0.988281f, + 0.005058f, 0.987305f, 0.005283f, 0.985840f, 0.005486f, 0.984863f, 0.005726f, 0.983887f, + 0.005947f, 0.982422f, 0.006504f, 0.980957f, 0.006786f, 0.979492f, 0.006882f, 0.978027f, + 0.006939f, 0.976074f, 0.006973f, 0.974121f, 0.007202f, 0.972656f, 0.007584f, 0.970215f, + 0.007896f, 0.968262f, 0.008217f, 0.966309f, 0.008278f, 0.964355f, 0.008560f, 0.961914f, + 0.008827f, 0.959961f, 0.009064f, 0.956055f, 0.009338f, 0.953125f, 0.009682f, 0.950195f, + 0.009605f, 0.946777f, 0.009979f, 0.943848f, 0.010170f, 0.940430f, 0.010704f, 0.936035f, + 0.010712f, 0.931641f, 0.011086f, 0.927246f, 0.011314f, 0.922363f, 0.011543f, 0.916992f, + 0.011566f, 0.911621f, 0.012276f, 0.905273f, 0.012535f, 0.898438f, 0.012772f, 0.891113f, + 0.013008f, 0.883301f, 0.013107f, 0.874512f, 0.013748f, 0.864746f, 0.014168f, 0.853516f, + 0.014252f, 0.841309f, 0.014610f, 0.827637f, 0.015007f, 0.812012f, 0.015266f, 0.793457f, + 0.015625f, 0.771484f, 0.016022f, 0.746582f, 0.016068f, 0.715332f, 0.016403f, 0.676270f, + 0.016129f, 0.623047f, 0.015282f, 0.549316f, 0.012604f, 0.427490f, 0.003716f, 0.171753f, + 0.000000f, 1.000000f, 0.000288f, 0.999512f, 0.001102f, 0.998535f, 0.001709f, 0.998047f, + 0.001948f, 0.997559f, 0.002539f, 0.996582f, 0.002581f, 0.995605f, 0.002890f, 0.995117f, + 0.003614f, 0.993652f, 0.003788f, 0.993164f, 0.003986f, 0.992188f, 0.004730f, 0.991211f, + 0.004944f, 0.990234f, 0.005127f, 0.989258f, 0.005333f, 0.988281f, 0.005642f, 0.987305f, + 0.006416f, 0.985352f, 0.006668f, 0.984375f, 0.006882f, 0.982910f, 0.007092f, 0.981934f, + 0.007473f, 0.980469f, 0.008240f, 0.978516f, 0.008575f, 0.977539f, 0.008842f, 0.975586f, + 0.008911f, 0.974121f, 0.009033f, 0.971680f, 0.009590f, 0.969727f, 0.009995f, 0.966797f, + 0.010078f, 0.965332f, 0.010414f, 0.962402f, 0.010857f, 0.960938f, 0.010994f, 0.958008f, + 0.011803f, 0.955566f, 0.012283f, 0.953125f, 0.012177f, 0.948730f, 0.012512f, 0.945801f, + 0.012978f, 0.942871f, 0.013008f, 0.938965f, 0.013618f, 0.935547f, 0.014084f, 0.931152f, + 0.014565f, 0.926270f, 0.014694f, 0.921387f, 0.015221f, 0.916992f, 0.015495f, 0.912109f, + 0.015930f, 0.906250f, 0.016449f, 0.898926f, 0.016724f, 0.892090f, 0.017242f, 0.884766f, + 0.017517f, 0.876465f, 0.017975f, 0.868164f, 0.018616f, 0.857422f, 0.019424f, 0.847168f, + 0.019226f, 0.833496f, 0.019821f, 0.819824f, 0.020325f, 0.804688f, 0.021072f, 0.786133f, + 0.021332f, 0.764160f, 0.021835f, 0.739258f, 0.021790f, 0.708984f, 0.021942f, 0.669434f, + 0.021606f, 0.618652f, 0.020065f, 0.545898f, 0.016052f, 0.425293f, 0.004490f, 0.171631f, + 0.000000f, 1.000000f, 0.000446f, 0.999512f, 0.000862f, 0.999023f, 0.001550f, 0.998047f, + 0.002325f, 0.996582f, 0.003046f, 0.996094f, 0.003458f, 0.995117f, 0.003769f, 0.994141f, + 0.004398f, 0.993164f, 0.004520f, 0.992188f, 0.005066f, 0.991211f, 0.005371f, 0.989746f, + 0.006062f, 0.988770f, 0.006344f, 0.987793f, 0.006741f, 0.986328f, 0.007118f, 0.985352f, + 0.007866f, 0.983398f, 0.008179f, 0.981934f, 0.008545f, 0.980957f, 0.008957f, 0.979492f, + 0.009407f, 0.978027f, 0.010155f, 0.976074f, 0.010597f, 0.974609f, 0.011009f, 0.972656f, + 0.011414f, 0.971191f, 0.011948f, 0.968750f, 0.012283f, 0.966309f, 0.012512f, 0.963379f, + 0.013039f, 0.961426f, 0.013199f, 0.958984f, 0.013664f, 0.956543f, 0.014351f, 0.954102f, + 0.014992f, 0.950684f, 0.015579f, 0.947754f, 0.015945f, 0.944824f, 0.016144f, 0.941406f, + 0.016571f, 0.937500f, 0.017303f, 0.934082f, 0.017868f, 0.929688f, 0.018448f, 0.925293f, + 0.018921f, 0.920898f, 0.019226f, 0.915527f, 0.019669f, 0.910645f, 0.020538f, 0.905762f, + 0.021179f, 0.898926f, 0.021774f, 0.892090f, 0.022369f, 0.885254f, 0.022797f, 0.876953f, + 0.023514f, 0.869629f, 0.023956f, 0.860352f, 0.024673f, 0.849121f, 0.025650f, 0.838867f, + 0.025833f, 0.825684f, 0.026703f, 0.812500f, 0.027405f, 0.797363f, 0.027893f, 0.777832f, + 0.028412f, 0.756348f, 0.028931f, 0.731445f, 0.028992f, 0.701660f, 0.029083f, 0.662598f, + 0.028183f, 0.612305f, 0.025726f, 0.541992f, 0.020248f, 0.422852f, 0.005386f, 0.170776f, + 0.000000f, 1.000000f, 0.000475f, 0.999512f, 0.001075f, 0.998535f, 0.001766f, 0.998047f, + 0.002970f, 0.996582f, 0.003218f, 0.995605f, 0.004227f, 0.994141f, 0.004513f, 0.993164f, + 0.004906f, 0.992188f, 0.005661f, 0.991211f, 0.006229f, 0.989746f, 0.006573f, 0.988770f, + 0.007462f, 0.986816f, 0.007774f, 0.986328f, 0.008362f, 0.984375f, 0.008781f, 0.982910f, + 0.009712f, 0.981445f, 0.010094f, 0.979980f, 0.010437f, 0.978516f, 0.011124f, 0.976562f, + 0.011696f, 0.974609f, 0.012619f, 0.972656f, 0.013031f, 0.971191f, 0.013542f, 0.969238f, + 0.014267f, 0.967285f, 0.014839f, 0.965332f, 0.015839f, 0.962891f, 0.015930f, 0.959961f, + 0.016495f, 0.957520f, 0.016785f, 0.954590f, 0.017273f, 0.952148f, 0.017990f, 0.949219f, + 0.019150f, 0.945801f, 0.019592f, 0.942383f, 0.020325f, 0.939453f, 0.020813f, 0.936035f, + 0.021103f, 0.932129f, 0.021927f, 0.927734f, 0.022690f, 0.923340f, 0.023621f, 0.918945f, + 0.024399f, 0.914062f, 0.024979f, 0.909180f, 0.025269f, 0.903809f, 0.026291f, 0.897949f, + 0.027725f, 0.891602f, 0.027832f, 0.884277f, 0.028778f, 0.876953f, 0.029572f, 0.869141f, + 0.030411f, 0.861328f, 0.031143f, 0.851562f, 0.032379f, 0.840820f, 0.033051f, 0.829590f, + 0.034546f, 0.817871f, 0.034546f, 0.803223f, 0.035492f, 0.787598f, 0.036530f, 0.769043f, + 0.036896f, 0.747559f, 0.037354f, 0.723145f, 0.037445f, 0.693848f, 0.037262f, 0.655273f, + 0.035919f, 0.605957f, 0.032410f, 0.537598f, 0.025040f, 0.420166f, 0.006405f, 0.169922f, + 0.000000f, 1.000000f, 0.000810f, 0.999512f, 0.001663f, 0.998535f, 0.002178f, 0.997070f, + 0.003160f, 0.996094f, 0.003994f, 0.995117f, 0.004765f, 0.993652f, 0.005657f, 0.992188f, + 0.005947f, 0.991211f, 0.007175f, 0.989746f, 0.007793f, 0.987793f, 0.008133f, 0.987305f, + 0.008522f, 0.985352f, 0.009468f, 0.984375f, 0.010422f, 0.981934f, 0.010834f, 0.980957f, + 0.011375f, 0.979004f, 0.012360f, 0.977539f, 0.013077f, 0.975098f, 0.013786f, 0.973145f, + 0.014420f, 0.971191f, 0.015457f, 0.969238f, 0.016006f, 0.967285f, 0.016632f, 0.965332f, + 0.017654f, 0.962891f, 0.018356f, 0.960449f, 0.019516f, 0.958008f, 0.020264f, 0.955566f, + 0.020676f, 0.952637f, 0.021103f, 0.950195f, 0.021927f, 0.946289f, 0.022476f, 0.942871f, + 0.023788f, 0.939941f, 0.024689f, 0.936523f, 0.025269f, 0.932617f, 0.026245f, 0.929688f, + 0.027145f, 0.925293f, 0.027786f, 0.920898f, 0.029022f, 0.916016f, 0.029602f, 0.911133f, + 0.030792f, 0.906738f, 0.031738f, 0.901855f, 0.032379f, 0.895996f, 0.033386f, 0.889160f, + 0.035004f, 0.882812f, 0.035614f, 0.875488f, 0.036652f, 0.868164f, 0.037872f, 0.860352f, + 0.038635f, 0.851562f, 0.039917f, 0.842285f, 0.041046f, 0.831055f, 0.042206f, 0.819824f, + 0.043549f, 0.807617f, 0.043823f, 0.793945f, 0.045197f, 0.777832f, 0.046478f, 0.759277f, + 0.046997f, 0.738770f, 0.047516f, 0.714844f, 0.047272f, 0.685547f, 0.046875f, 0.647949f, + 0.044891f, 0.600098f, 0.040253f, 0.532715f, 0.030396f, 0.418213f, 0.007557f, 0.169556f, + 0.000000f, 1.000000f, 0.001188f, 0.999023f, 0.002018f, 0.998047f, 0.002728f, 0.997070f, + 0.003435f, 0.996094f, 0.004341f, 0.994629f, 0.005997f, 0.992676f, 0.006424f, 0.991699f, + 0.007351f, 0.989746f, 0.008430f, 0.988281f, 0.009476f, 0.986328f, 0.010025f, 0.984863f, + 0.010468f, 0.983398f, 0.012100f, 0.981445f, 0.012764f, 0.979492f, 0.013359f, 0.978027f, + 0.013947f, 0.976074f, 0.015038f, 0.974121f, 0.016205f, 0.971680f, 0.016998f, 0.969238f, + 0.017731f, 0.967773f, 0.018860f, 0.965332f, 0.019608f, 0.962891f, 0.020798f, 0.960938f, + 0.021729f, 0.958008f, 0.022629f, 0.955566f, 0.023453f, 0.953125f, 0.024811f, 0.950195f, + 0.025650f, 0.947266f, 0.026718f, 0.944336f, 0.027481f, 0.940430f, 0.028198f, 0.936523f, + 0.029358f, 0.933105f, 0.030426f, 0.929688f, 0.031189f, 0.925781f, 0.032440f, 0.921875f, + 0.034058f, 0.917480f, 0.035034f, 0.913086f, 0.036224f, 0.907715f, 0.037323f, 0.902832f, + 0.038116f, 0.897461f, 0.039551f, 0.892578f, 0.040955f, 0.886230f, 0.042114f, 0.879883f, + 0.043701f, 0.873047f, 0.045258f, 0.866211f, 0.045715f, 0.858398f, 0.047424f, 0.850586f, + 0.048584f, 0.841797f, 0.050507f, 0.831543f, 0.051636f, 0.820801f, 0.052887f, 0.809570f, + 0.054169f, 0.796875f, 0.054565f, 0.783203f, 0.057098f, 0.767578f, 0.058075f, 0.749512f, + 0.058228f, 0.728516f, 0.058594f, 0.705078f, 0.058472f, 0.676270f, 0.057526f, 0.639648f, + 0.054688f, 0.593262f, 0.048767f, 0.528320f, 0.036438f, 0.414551f, 0.008743f, 0.169189f, + 0.000000f, 1.000000f, 0.001243f, 0.999023f, 0.002176f, 0.998047f, 0.003443f, 0.996582f, + 0.004551f, 0.995117f, 0.005215f, 0.993652f, 0.006969f, 0.992188f, 0.007889f, 0.990234f, + 0.008766f, 0.988770f, 0.010063f, 0.986328f, 0.011078f, 0.984375f, 0.012253f, 0.982910f, + 0.013084f, 0.980957f, 0.014412f, 0.978516f, 0.015640f, 0.976562f, 0.016357f, 0.974609f, + 0.017090f, 0.972656f, 0.018646f, 0.970215f, 0.019958f, 0.967285f, 0.020889f, 0.965332f, + 0.021698f, 0.962891f, 0.022583f, 0.960449f, 0.024109f, 0.958008f, 0.025620f, 0.954590f, + 0.026688f, 0.951660f, 0.027710f, 0.949219f, 0.028763f, 0.946777f, 0.030243f, 0.943359f, + 0.031555f, 0.940430f, 0.033203f, 0.937012f, 0.034119f, 0.933594f, 0.035004f, 0.929199f, + 0.036377f, 0.925293f, 0.037292f, 0.921387f, 0.038788f, 0.917480f, 0.040314f, 0.913086f, + 0.041870f, 0.908203f, 0.043457f, 0.903809f, 0.045105f, 0.898926f, 0.046112f, 0.893555f, + 0.047058f, 0.888184f, 0.049011f, 0.881836f, 0.050690f, 0.875977f, 0.052032f, 0.869629f, + 0.053558f, 0.862305f, 0.055359f, 0.854980f, 0.056946f, 0.848145f, 0.058167f, 0.839355f, + 0.060425f, 0.829590f, 0.062256f, 0.819824f, 0.063782f, 0.809570f, 0.065002f, 0.797852f, + 0.066345f, 0.785645f, 0.068237f, 0.771973f, 0.069458f, 0.755371f, 0.070862f, 0.738281f, + 0.071411f, 0.718262f, 0.071350f, 0.695312f, 0.071289f, 0.666992f, 0.069702f, 0.631348f, + 0.065674f, 0.585938f, 0.058075f, 0.522461f, 0.042969f, 0.412109f, 0.010139f, 0.168335f, + 0.000000f, 1.000000f, 0.001281f, 0.999023f, 0.002378f, 0.998047f, 0.004543f, 0.995605f, + 0.005272f, 0.994629f, 0.006863f, 0.992188f, 0.007767f, 0.990723f, 0.008728f, 0.989258f, + 0.011147f, 0.986328f, 0.011955f, 0.984375f, 0.013680f, 0.981934f, 0.014473f, 0.980469f, + 0.016312f, 0.977539f, 0.017792f, 0.975098f, 0.018646f, 0.972656f, 0.020065f, 0.970703f, + 0.021378f, 0.968262f, 0.022583f, 0.965332f, 0.024460f, 0.962402f, 0.025589f, 0.959961f, + 0.026550f, 0.957520f, 0.028015f, 0.955078f, 0.029785f, 0.951660f, 0.031433f, 0.948242f, + 0.032684f, 0.944824f, 0.033905f, 0.942383f, 0.035126f, 0.939453f, 0.037231f, 0.936035f, + 0.039124f, 0.932129f, 0.040619f, 0.928223f, 0.042084f, 0.924805f, 0.043213f, 0.921387f, + 0.044739f, 0.916992f, 0.046173f, 0.912598f, 0.047668f, 0.907715f, 0.049805f, 0.902832f, + 0.051178f, 0.897949f, 0.053009f, 0.893066f, 0.054901f, 0.888184f, 0.056427f, 0.883301f, + 0.058411f, 0.876953f, 0.060242f, 0.870605f, 0.062134f, 0.864258f, 0.064392f, 0.857422f, + 0.065735f, 0.850586f, 0.067444f, 0.843262f, 0.069702f, 0.835449f, 0.071228f, 0.826172f, + 0.073730f, 0.817383f, 0.075745f, 0.807617f, 0.077148f, 0.796875f, 0.078979f, 0.786133f, + 0.080261f, 0.773438f, 0.082642f, 0.759277f, 0.083801f, 0.743164f, 0.085144f, 0.726562f, + 0.085022f, 0.707031f, 0.085144f, 0.685059f, 0.084473f, 0.656250f, 0.082336f, 0.622070f, + 0.077576f, 0.578613f, 0.068237f, 0.516113f, 0.049774f, 0.409424f, 0.011513f, 0.166992f, + 0.000000f, 1.000000f, 0.001935f, 0.998535f, 0.003147f, 0.997559f, 0.005421f, 0.995117f, + 0.006699f, 0.993652f, 0.008888f, 0.990723f, 0.009850f, 0.989258f, 0.011070f, 0.987305f, + 0.012955f, 0.984375f, 0.015015f, 0.981934f, 0.016357f, 0.979492f, 0.018280f, 0.976562f, + 0.019836f, 0.973633f, 0.021439f, 0.971191f, 0.022964f, 0.968262f, 0.024841f, 0.965820f, + 0.026581f, 0.962891f, 0.027924f, 0.959473f, 0.029587f, 0.956543f, 0.031311f, 0.953613f, + 0.032776f, 0.951172f, 0.034698f, 0.947266f, 0.036194f, 0.943848f, 0.038544f, 0.940430f, + 0.039978f, 0.937500f, 0.041412f, 0.934082f, 0.043518f, 0.930664f, 0.045776f, 0.926270f, + 0.047852f, 0.922363f, 0.049561f, 0.918945f, 0.051270f, 0.915039f, 0.052979f, 0.911133f, + 0.055023f, 0.906738f, 0.057007f, 0.901367f, 0.059021f, 0.895996f, 0.060638f, 0.891113f, + 0.062683f, 0.886230f, 0.064331f, 0.881348f, 0.066833f, 0.876465f, 0.069153f, 0.870605f, + 0.071594f, 0.864258f, 0.073364f, 0.857422f, 0.075134f, 0.851074f, 0.078003f, 0.844727f, + 0.079773f, 0.837891f, 0.081787f, 0.830566f, 0.083984f, 0.821289f, 0.087280f, 0.812988f, + 0.088318f, 0.803223f, 0.091064f, 0.793457f, 0.092896f, 0.783691f, 0.094116f, 0.772461f, + 0.096375f, 0.759766f, 0.098450f, 0.745605f, 0.099182f, 0.729980f, 0.100830f, 0.714355f, + 0.100647f, 0.695312f, 0.100586f, 0.673340f, 0.100037f, 0.645996f, 0.096619f, 0.613281f, + 0.089966f, 0.571289f, 0.078857f, 0.510254f, 0.057251f, 0.405762f, 0.013077f, 0.166992f, + 0.000000f, 1.000000f, 0.001826f, 0.998535f, 0.003975f, 0.997070f, 0.006042f, 0.994629f, + 0.008217f, 0.992188f, 0.010422f, 0.989746f, 0.012428f, 0.987305f, 0.014282f, 0.984375f, + 0.016586f, 0.980957f, 0.017685f, 0.979004f, 0.019562f, 0.976074f, 0.022491f, 0.972168f, + 0.024750f, 0.968750f, 0.026108f, 0.966309f, 0.028549f, 0.962891f, 0.030518f, 0.959473f, + 0.033020f, 0.956055f, 0.034546f, 0.952637f, 0.036438f, 0.949707f, 0.038910f, 0.946289f, + 0.041168f, 0.941895f, 0.042938f, 0.938477f, 0.045044f, 0.935059f, 0.047211f, 0.931641f, + 0.048889f, 0.928223f, 0.051270f, 0.923828f, 0.053650f, 0.919922f, 0.056091f, 0.915527f, + 0.058472f, 0.911133f, 0.060394f, 0.907227f, 0.062347f, 0.903809f, 0.064819f, 0.898926f, + 0.067932f, 0.893555f, 0.069824f, 0.888672f, 0.072083f, 0.883301f, 0.073975f, 0.877930f, + 0.075867f, 0.873047f, 0.078125f, 0.868164f, 0.081421f, 0.861816f, 0.084106f, 0.855957f, + 0.086670f, 0.849609f, 0.088623f, 0.843262f, 0.090515f, 0.836426f, 0.093262f, 0.829590f, + 0.095703f, 0.822754f, 0.098572f, 0.814453f, 0.100952f, 0.805664f, 0.103760f, 0.797363f, + 0.105103f, 0.788086f, 0.108276f, 0.778809f, 0.110046f, 0.769043f, 0.112244f, 0.757324f, + 0.114197f, 0.744629f, 0.115601f, 0.730957f, 0.117188f, 0.716797f, 0.117920f, 0.700684f, + 0.117981f, 0.683594f, 0.117432f, 0.660645f, 0.115784f, 0.634766f, 0.111145f, 0.603516f, + 0.103088f, 0.563965f, 0.090149f, 0.503418f, 0.065125f, 0.402832f, 0.014748f, 0.165771f, + 0.000000f, 1.000000f, 0.002945f, 0.998047f, 0.005276f, 0.995605f, 0.008133f, 0.993164f, + 0.010643f, 0.990234f, 0.013069f, 0.987305f, 0.015381f, 0.984375f, 0.018494f, 0.980469f, + 0.020065f, 0.978027f, 0.022415f, 0.975098f, 0.025131f, 0.970703f, 0.027893f, 0.967285f, + 0.030487f, 0.963379f, 0.032684f, 0.960449f, 0.035889f, 0.956055f, 0.038727f, 0.951660f, + 0.040588f, 0.948242f, 0.042786f, 0.944824f, 0.045593f, 0.940918f, 0.048126f, 0.936523f, + 0.051117f, 0.932129f, 0.053101f, 0.928223f, 0.055481f, 0.924805f, 0.058197f, 0.920898f, + 0.061066f, 0.915527f, 0.063782f, 0.911133f, 0.065979f, 0.907227f, 0.068176f, 0.902832f, + 0.071289f, 0.898438f, 0.073547f, 0.894043f, 0.076721f, 0.888672f, 0.079651f, 0.883789f, + 0.082642f, 0.878906f, 0.085510f, 0.874023f, 0.087585f, 0.869141f, 0.089661f, 0.863770f, + 0.092163f, 0.857910f, 0.094971f, 0.851562f, 0.098633f, 0.845215f, 0.101440f, 0.838867f, + 0.104248f, 0.833496f, 0.106628f, 0.827148f, 0.108704f, 0.820801f, 0.111511f, 0.812988f, + 0.114929f, 0.805176f, 0.117371f, 0.797363f, 0.120239f, 0.789062f, 0.122620f, 0.780762f, + 0.124634f, 0.772461f, 0.126709f, 0.762695f, 0.129395f, 0.752441f, 0.131104f, 0.740723f, + 0.133789f, 0.729004f, 0.134888f, 0.716309f, 0.136353f, 0.702148f, 0.135986f, 0.687012f, + 0.136108f, 0.669434f, 0.134888f, 0.647461f, 0.132324f, 0.623047f, 0.126709f, 0.593750f, + 0.117493f, 0.556641f, 0.102234f, 0.497070f, 0.073120f, 0.399658f, 0.016556f, 0.165283f, + 0.000000f, 1.000000f, 0.003525f, 0.997559f, 0.006729f, 0.995117f, 0.009232f, 0.992188f, + 0.013802f, 0.987793f, 0.016479f, 0.984863f, 0.019440f, 0.980469f, 0.023453f, 0.976074f, + 0.025757f, 0.973145f, 0.029373f, 0.968750f, 0.032471f, 0.964355f, 0.034485f, 0.960938f, + 0.037811f, 0.956543f, 0.041779f, 0.951660f, 0.044952f, 0.947266f, 0.048035f, 0.942871f, + 0.050629f, 0.938965f, 0.053925f, 0.933594f, 0.057800f, 0.928711f, 0.060211f, 0.924805f, + 0.062927f, 0.920410f, 0.065674f, 0.916504f, 0.069397f, 0.911133f, 0.072510f, 0.906250f, + 0.075623f, 0.901367f, 0.078552f, 0.896973f, 0.081055f, 0.892578f, 0.083923f, 0.888184f, + 0.087830f, 0.882324f, 0.091064f, 0.876953f, 0.094238f, 0.872070f, 0.097046f, 0.867188f, + 0.099731f, 0.862305f, 0.103333f, 0.856934f, 0.106018f, 0.852051f, 0.109253f, 0.845703f, + 0.112244f, 0.839355f, 0.115234f, 0.833496f, 0.118225f, 0.827148f, 0.121155f, 0.820801f, + 0.124023f, 0.814941f, 0.126465f, 0.809082f, 0.130249f, 0.801758f, 0.132690f, 0.793945f, + 0.135864f, 0.786133f, 0.139404f, 0.778809f, 0.141724f, 0.770996f, 0.143311f, 0.762695f, + 0.146240f, 0.754883f, 0.148315f, 0.744141f, 0.151367f, 0.734375f, 0.153076f, 0.723633f, + 0.154785f, 0.712402f, 0.155273f, 0.700195f, 0.156006f, 0.687012f, 0.155640f, 0.672363f, + 0.155762f, 0.654785f, 0.153687f, 0.634277f, 0.149902f, 0.611328f, 0.142578f, 0.583008f, + 0.132080f, 0.547363f, 0.114807f, 0.490479f, 0.081726f, 0.396973f, 0.018372f, 0.164429f, + 0.000000f, 1.000000f, 0.004353f, 0.997559f, 0.009270f, 0.993164f, 0.013527f, 0.989258f, + 0.017075f, 0.985352f, 0.021469f, 0.980957f, 0.025726f, 0.975586f, 0.028534f, 0.972168f, + 0.034210f, 0.965820f, 0.037933f, 0.960938f, 0.041351f, 0.956543f, 0.045013f, 0.951660f, + 0.049316f, 0.946289f, 0.052612f, 0.941406f, 0.056610f, 0.936523f, 0.061157f, 0.931152f, + 0.065063f, 0.925293f, 0.068542f, 0.919922f, 0.071716f, 0.915527f, 0.075745f, 0.910645f, + 0.079102f, 0.905273f, 0.083496f, 0.899414f, 0.086914f, 0.894531f, 0.090271f, 0.889160f, + 0.093506f, 0.884766f, 0.096741f, 0.879883f, 0.100525f, 0.874512f, 0.104614f, 0.868652f, + 0.108521f, 0.862793f, 0.111572f, 0.857910f, 0.114868f, 0.852539f, 0.117798f, 0.847656f, + 0.120667f, 0.843262f, 0.125488f, 0.836426f, 0.129395f, 0.830566f, 0.132568f, 0.824707f, + 0.135620f, 0.818848f, 0.137817f, 0.812500f, 0.141602f, 0.806641f, 0.144165f, 0.800781f, + 0.147461f, 0.793945f, 0.151489f, 0.787109f, 0.154297f, 0.780273f, 0.157837f, 0.772949f, + 0.159668f, 0.765625f, 0.162720f, 0.758301f, 0.164673f, 0.751465f, 0.166992f, 0.743652f, + 0.170532f, 0.734375f, 0.172729f, 0.724609f, 0.174561f, 0.714844f, 0.176636f, 0.705078f, + 0.177002f, 0.694336f, 0.177856f, 0.684082f, 0.177002f, 0.671387f, 0.177124f, 0.655762f, + 0.177002f, 0.639648f, 0.172607f, 0.620117f, 0.168457f, 0.599121f, 0.159668f, 0.573730f, + 0.148071f, 0.537598f, 0.127197f, 0.482666f, 0.089905f, 0.394287f, 0.020325f, 0.162964f, + 0.000000f, 1.000000f, 0.005520f, 0.997070f, 0.011871f, 0.991699f, 0.017593f, 0.986328f, + 0.023010f, 0.980957f, 0.028946f, 0.974609f, 0.034088f, 0.969238f, 0.039368f, 0.962891f, + 0.044708f, 0.957031f, 0.049316f, 0.951660f, 0.054657f, 0.945312f, 0.059570f, 0.938477f, + 0.063782f, 0.933105f, 0.067322f, 0.928223f, 0.073242f, 0.921387f, 0.077698f, 0.915527f, + 0.082825f, 0.909180f, 0.086914f, 0.903809f, 0.091370f, 0.897949f, 0.096802f, 0.891113f, + 0.101196f, 0.885254f, 0.104492f, 0.879883f, 0.108582f, 0.874512f, 0.112061f, 0.869629f, + 0.117065f, 0.863281f, 0.121521f, 0.857422f, 0.125244f, 0.851562f, 0.129272f, 0.845703f, + 0.132446f, 0.840820f, 0.136353f, 0.835938f, 0.140015f, 0.830078f, 0.144287f, 0.823730f, + 0.148438f, 0.817871f, 0.152588f, 0.812012f, 0.155762f, 0.806641f, 0.159180f, 0.801270f, + 0.162109f, 0.795898f, 0.164062f, 0.790527f, 0.168701f, 0.782715f, 0.172241f, 0.775879f, + 0.175781f, 0.769531f, 0.178467f, 0.763184f, 0.181274f, 0.757324f, 0.184570f, 0.750977f, + 0.186768f, 0.744141f, 0.188599f, 0.737305f, 0.192139f, 0.729004f, 0.194580f, 0.720703f, + 0.196533f, 0.711914f, 0.198608f, 0.703613f, 0.199463f, 0.694824f, 0.200806f, 0.686035f, + 0.200684f, 0.676758f, 0.201172f, 0.665527f, 0.201538f, 0.652832f, 0.200684f, 0.638672f, + 0.198242f, 0.623535f, 0.193604f, 0.606934f, 0.187256f, 0.587402f, 0.176758f, 0.563477f, + 0.163208f, 0.526367f, 0.140381f, 0.476318f, 0.098877f, 0.390625f, 0.022156f, 0.161621f, + 0.000000f, 1.000000f, 0.008011f, 0.995605f, 0.015991f, 0.989258f, 0.024277f, 0.982422f, + 0.032227f, 0.974609f, 0.039429f, 0.967285f, 0.046875f, 0.958984f, 0.053802f, 0.951660f, + 0.059113f, 0.945312f, 0.067200f, 0.936523f, 0.072510f, 0.930176f, 0.078186f, 0.923340f, + 0.084900f, 0.915039f, 0.091064f, 0.907715f, 0.095947f, 0.901367f, 0.100586f, 0.895508f, + 0.106262f, 0.888184f, 0.112976f, 0.880371f, 0.118164f, 0.874023f, 0.122742f, 0.868164f, + 0.127075f, 0.862305f, 0.132446f, 0.855469f, 0.137329f, 0.848633f, 0.142456f, 0.842285f, + 0.146851f, 0.836426f, 0.150513f, 0.831055f, 0.154663f, 0.825684f, 0.158813f, 0.819824f, + 0.163452f, 0.813477f, 0.168335f, 0.807129f, 0.172119f, 0.801270f, 0.175659f, 0.795898f, + 0.179565f, 0.790527f, 0.182983f, 0.785645f, 0.185669f, 0.780762f, 0.190186f, 0.773926f, + 0.194214f, 0.768066f, 0.197632f, 0.762207f, 0.201050f, 0.755371f, 0.203735f, 0.749023f, + 0.206055f, 0.743652f, 0.208374f, 0.738281f, 0.210815f, 0.732422f, 0.213989f, 0.726074f, + 0.217773f, 0.718750f, 0.219116f, 0.710938f, 0.221558f, 0.703613f, 0.223145f, 0.696777f, + 0.225220f, 0.689453f, 0.226074f, 0.682129f, 0.226685f, 0.674805f, 0.226562f, 0.666992f, + 0.227173f, 0.656250f, 0.227661f, 0.645020f, 0.226318f, 0.633789f, 0.223999f, 0.621094f, + 0.220337f, 0.607910f, 0.213867f, 0.593750f, 0.205811f, 0.575684f, 0.196045f, 0.549316f, + 0.180542f, 0.517090f, 0.153687f, 0.469971f, 0.107910f, 0.387939f, 0.024536f, 0.161499f, + 0.000000f, 1.000000f, 0.013008f, 0.993164f, 0.024948f, 0.984375f, 0.035583f, 0.974609f, + 0.045288f, 0.965820f, 0.056854f, 0.954590f, 0.064941f, 0.945801f, 0.074707f, 0.935547f, + 0.083252f, 0.926270f, 0.090027f, 0.917969f, 0.099426f, 0.907715f, 0.106506f, 0.899414f, + 0.114075f, 0.891113f, 0.119995f, 0.883789f, 0.128662f, 0.874023f, 0.134277f, 0.866699f, + 0.140259f, 0.859863f, 0.144653f, 0.853516f, 0.151978f, 0.845215f, 0.158203f, 0.837402f, + 0.164551f, 0.830078f, 0.169189f, 0.823730f, 0.173584f, 0.817871f, 0.177246f, 0.812500f, + 0.183716f, 0.805176f, 0.188354f, 0.798340f, 0.192871f, 0.792480f, 0.197510f, 0.786133f, + 0.201416f, 0.780762f, 0.204346f, 0.775879f, 0.207886f, 0.770996f, 0.212036f, 0.765137f, + 0.216553f, 0.758789f, 0.220337f, 0.752930f, 0.224487f, 0.747070f, 0.227539f, 0.741699f, + 0.230103f, 0.736816f, 0.233154f, 0.731934f, 0.236206f, 0.727051f, 0.237305f, 0.722168f, + 0.240723f, 0.715332f, 0.243530f, 0.708984f, 0.245972f, 0.702637f, 0.249268f, 0.696777f, + 0.250977f, 0.690430f, 0.251709f, 0.685059f, 0.252686f, 0.678711f, 0.253662f, 0.673340f, + 0.254395f, 0.666992f, 0.254639f, 0.659668f, 0.256104f, 0.650879f, 0.256104f, 0.642090f, + 0.255371f, 0.633789f, 0.253906f, 0.624023f, 0.251465f, 0.615234f, 0.247437f, 0.604492f, + 0.241943f, 0.592773f, 0.233765f, 0.580078f, 0.227051f, 0.560059f, 0.215332f, 0.536621f, + 0.196411f, 0.506836f, 0.167358f, 0.463135f, 0.116577f, 0.385254f, 0.026627f, 0.160400f, + 0.000000f, 1.000000f, 0.020325f, 0.990234f, 0.037689f, 0.977539f, 0.054382f, 0.963379f, + 0.070068f, 0.948730f, 0.082825f, 0.936035f, 0.096680f, 0.922363f, 0.105896f, 0.912109f, + 0.119446f, 0.897949f, 0.129272f, 0.887207f, 0.137817f, 0.877441f, 0.148438f, 0.865723f, + 0.156494f, 0.856445f, 0.163086f, 0.848145f, 0.171021f, 0.839355f, 0.179810f, 0.829102f, + 0.185669f, 0.821777f, 0.192017f, 0.813965f, 0.196533f, 0.807617f, 0.202026f, 0.800781f, + 0.209717f, 0.791992f, 0.216187f, 0.784668f, 0.220459f, 0.777832f, 0.224854f, 0.771973f, + 0.229004f, 0.766113f, 0.233032f, 0.761230f, 0.236694f, 0.755371f, 0.242554f, 0.748535f, + 0.247070f, 0.742188f, 0.250244f, 0.736816f, 0.253418f, 0.731934f, 0.256592f, 0.727051f, + 0.259277f, 0.722168f, 0.261963f, 0.717773f, 0.264160f, 0.713867f, 0.267822f, 0.708496f, + 0.270996f, 0.702637f, 0.274170f, 0.697266f, 0.277344f, 0.691895f, 0.279053f, 0.687500f, + 0.280518f, 0.682129f, 0.281250f, 0.677734f, 0.281982f, 0.672852f, 0.283691f, 0.667969f, + 0.283936f, 0.664062f, 0.285645f, 0.658691f, 0.286377f, 0.651855f, 0.287354f, 0.645508f, + 0.287842f, 0.639160f, 0.288330f, 0.632812f, 0.286865f, 0.625977f, 0.285400f, 0.619141f, + 0.283691f, 0.612793f, 0.280273f, 0.604980f, 0.276367f, 0.597656f, 0.270752f, 0.589355f, + 0.265625f, 0.575684f, 0.258789f, 0.562012f, 0.249146f, 0.544434f, 0.234009f, 0.523926f, + 0.212524f, 0.496826f, 0.180420f, 0.457275f, 0.125854f, 0.384766f, 0.028809f, 0.160034f, + 0.000000f, 1.000000f, 0.036621f, 0.982910f, 0.065308f, 0.962402f, 0.089172f, 0.941895f, + 0.112122f, 0.920898f, 0.131836f, 0.902344f, 0.146484f, 0.887207f, 0.161621f, 0.870605f, + 0.175415f, 0.856445f, 0.184570f, 0.845215f, 0.197998f, 0.830566f, 0.207642f, 0.819336f, + 0.215698f, 0.809570f, 0.222412f, 0.801270f, 0.231323f, 0.790039f, 0.240112f, 0.780762f, + 0.245728f, 0.772461f, 0.250488f, 0.765625f, 0.255615f, 0.758789f, 0.261230f, 0.751953f, + 0.266846f, 0.744141f, 0.272705f, 0.736816f, 0.277832f, 0.730469f, 0.280762f, 0.725098f, + 0.285156f, 0.719238f, 0.287842f, 0.714844f, 0.290039f, 0.710449f, 0.293457f, 0.705078f, + 0.298340f, 0.698730f, 0.301514f, 0.693848f, 0.304199f, 0.688965f, 0.306885f, 0.684570f, + 0.309326f, 0.680176f, 0.311035f, 0.676270f, 0.312988f, 0.672363f, 0.313721f, 0.668945f, + 0.314941f, 0.665527f, 0.316162f, 0.662109f, 0.318115f, 0.658203f, 0.320557f, 0.652832f, + 0.322021f, 0.647949f, 0.322510f, 0.643066f, 0.322998f, 0.638672f, 0.324219f, 0.634277f, + 0.324463f, 0.629883f, 0.324219f, 0.625977f, 0.323730f, 0.622070f, 0.322021f, 0.617676f, + 0.320801f, 0.613770f, 0.319092f, 0.609375f, 0.316162f, 0.604492f, 0.313232f, 0.599609f, + 0.311279f, 0.591309f, 0.309082f, 0.583008f, 0.304443f, 0.574707f, 0.299072f, 0.565430f, + 0.291992f, 0.555664f, 0.283691f, 0.544434f, 0.269775f, 0.529785f, 0.253174f, 0.513184f, + 0.229248f, 0.489746f, 0.194092f, 0.453857f, 0.136475f, 0.373291f, 0.031067f, 0.160278f, + 0.000000f, 1.000000f, 0.077332f, 0.965332f, 0.129028f, 0.927734f, 0.164673f, 0.896973f, + 0.193481f, 0.869141f, 0.213257f, 0.847656f, 0.234131f, 0.825684f, 0.247192f, 0.809082f, + 0.260010f, 0.793457f, 0.272949f, 0.778320f, 0.282471f, 0.766113f, 0.290527f, 0.755371f, + 0.296875f, 0.746094f, 0.303955f, 0.735840f, 0.311768f, 0.726074f, 0.316650f, 0.718262f, + 0.322021f, 0.710938f, 0.326172f, 0.704102f, 0.330078f, 0.697754f, 0.333252f, 0.691895f, + 0.335693f, 0.687012f, 0.338135f, 0.682129f, 0.343262f, 0.675781f, 0.346436f, 0.670410f, + 0.349854f, 0.665039f, 0.352783f, 0.660156f, 0.354980f, 0.655762f, 0.356201f, 0.651855f, + 0.358398f, 0.647949f, 0.359863f, 0.644043f, 0.360840f, 0.640625f, 0.362061f, 0.637695f, + 0.363525f, 0.634766f, 0.363281f, 0.631836f, 0.363525f, 0.629395f, 0.364014f, 0.626465f, + 0.364014f, 0.624023f, 0.363770f, 0.621582f, 0.365479f, 0.618164f, 0.365723f, 0.614258f, + 0.366455f, 0.611328f, 0.365479f, 0.607910f, 0.365234f, 0.604004f, 0.364990f, 0.600586f, + 0.364014f, 0.597168f, 0.363037f, 0.593750f, 0.361816f, 0.590820f, 0.359375f, 0.586914f, + 0.357666f, 0.583008f, 0.354980f, 0.578613f, 0.351807f, 0.574707f, 0.347656f, 0.570312f, + 0.343262f, 0.565918f, 0.337891f, 0.560059f, 0.331543f, 0.554688f, 0.323975f, 0.548340f, + 0.314697f, 0.540527f, 0.303711f, 0.531738f, 0.288330f, 0.520020f, 0.270264f, 0.503906f, + 0.245972f, 0.479248f, 0.209229f, 0.440430f, 0.148438f, 0.366943f, 0.033234f, 0.160889f, + 0.000000f, 1.000000f, 0.124634f, 0.945312f, 0.188721f, 0.896973f, 0.229736f, 0.858887f, + 0.258301f, 0.828125f, 0.279541f, 0.803223f, 0.296387f, 0.782227f, 0.311035f, 0.763672f, + 0.322021f, 0.748047f, 0.332275f, 0.733887f, 0.339844f, 0.722168f, 0.347412f, 0.710938f, + 0.353516f, 0.701172f, 0.358643f, 0.692383f, 0.363770f, 0.683594f, 0.368652f, 0.675781f, + 0.372559f, 0.668945f, 0.376465f, 0.662598f, 0.379883f, 0.656738f, 0.382080f, 0.650879f, + 0.384521f, 0.645996f, 0.386719f, 0.641113f, 0.389160f, 0.636719f, 0.391846f, 0.631836f, + 0.394287f, 0.627441f, 0.395752f, 0.623535f, 0.397217f, 0.619629f, 0.398193f, 0.616211f, + 0.399414f, 0.612793f, 0.401123f, 0.608887f, 0.401611f, 0.605957f, 0.402100f, 0.603516f, + 0.403809f, 0.600098f, 0.403320f, 0.597656f, 0.404053f, 0.594727f, 0.404297f, 0.591797f, + 0.404541f, 0.589355f, 0.404297f, 0.586914f, 0.404297f, 0.584473f, 0.404541f, 0.581543f, + 0.404053f, 0.579102f, 0.403320f, 0.577148f, 0.401855f, 0.573730f, 0.401123f, 0.570312f, + 0.399658f, 0.567383f, 0.398682f, 0.564453f, 0.396729f, 0.561523f, 0.394531f, 0.558594f, + 0.392578f, 0.554688f, 0.390137f, 0.550781f, 0.386963f, 0.547363f, 0.382568f, 0.542969f, + 0.379150f, 0.538574f, 0.373535f, 0.533203f, 0.367676f, 0.526855f, 0.360840f, 0.520508f, + 0.352051f, 0.512695f, 0.341309f, 0.502930f, 0.327881f, 0.491211f, 0.310303f, 0.476807f, + 0.285156f, 0.454590f, 0.249146f, 0.420654f, 0.187378f, 0.354736f, 0.060944f, 0.163208f, + 0.000000f, 1.000000f, 0.125732f, 0.944824f, 0.191284f, 0.895508f, 0.233521f, 0.856445f, + 0.263184f, 0.825195f, 0.285645f, 0.799316f, 0.303711f, 0.777344f, 0.318848f, 0.758301f, + 0.329834f, 0.742676f, 0.341309f, 0.727539f, 0.349609f, 0.714355f, 0.357910f, 0.702637f, + 0.365234f, 0.691895f, 0.370605f, 0.682617f, 0.376709f, 0.673340f, 0.382568f, 0.665039f, + 0.387207f, 0.657227f, 0.390381f, 0.650879f, 0.394775f, 0.643555f, 0.398926f, 0.637207f, + 0.401611f, 0.631836f, 0.405029f, 0.626465f, 0.407227f, 0.621094f, 0.410889f, 0.616211f, + 0.413574f, 0.610840f, 0.415771f, 0.606445f, 0.418457f, 0.601562f, 0.418701f, 0.598145f, + 0.421631f, 0.593750f, 0.423096f, 0.589844f, 0.424561f, 0.585938f, 0.425781f, 0.583008f, + 0.427734f, 0.579102f, 0.428955f, 0.575684f, 0.429688f, 0.572266f, 0.431152f, 0.568848f, + 0.432129f, 0.565918f, 0.432617f, 0.562500f, 0.433105f, 0.559570f, 0.433838f, 0.556152f, + 0.434082f, 0.553223f, 0.434326f, 0.550293f, 0.434326f, 0.546387f, 0.434326f, 0.542480f, + 0.434326f, 0.538574f, 0.433350f, 0.535156f, 0.432861f, 0.531250f, 0.432129f, 0.527832f, + 0.431396f, 0.522949f, 0.429199f, 0.518555f, 0.427002f, 0.514160f, 0.424805f, 0.509277f, + 0.421631f, 0.503906f, 0.418701f, 0.498047f, 0.414551f, 0.491211f, 0.408936f, 0.484375f, + 0.401611f, 0.475586f, 0.393799f, 0.465576f, 0.382324f, 0.453125f, 0.368652f, 0.437988f, + 0.347168f, 0.416260f, 0.315430f, 0.383789f, 0.259033f, 0.322510f, 0.129639f, 0.150024f, + 0.000000f, 1.000000f, 0.126465f, 0.944824f, 0.193848f, 0.894043f, 0.237061f, 0.854492f, + 0.268311f, 0.822266f, 0.291748f, 0.795410f, 0.310303f, 0.772949f, 0.327148f, 0.752441f, + 0.339111f, 0.735352f, 0.350342f, 0.720215f, 0.360107f, 0.706543f, 0.368652f, 0.694336f, + 0.376953f, 0.682617f, 0.384033f, 0.671875f, 0.389893f, 0.663086f, 0.396973f, 0.653320f, + 0.401367f, 0.645508f, 0.405762f, 0.637695f, 0.411133f, 0.629883f, 0.417236f, 0.622559f, + 0.419922f, 0.616211f, 0.424072f, 0.610352f, 0.427734f, 0.604004f, 0.430908f, 0.599121f, + 0.434570f, 0.592773f, 0.437500f, 0.587891f, 0.440186f, 0.582520f, 0.442139f, 0.578125f, + 0.446289f, 0.573242f, 0.447510f, 0.568848f, 0.449219f, 0.564941f, 0.451416f, 0.560547f, + 0.453857f, 0.556641f, 0.454834f, 0.552734f, 0.457275f, 0.548828f, 0.458740f, 0.544922f, + 0.460205f, 0.541016f, 0.461914f, 0.537109f, 0.462891f, 0.533691f, 0.464111f, 0.529785f, + 0.465820f, 0.526367f, 0.466553f, 0.522461f, 0.467285f, 0.519043f, 0.467529f, 0.514160f, + 0.468262f, 0.509277f, 0.468506f, 0.504883f, 0.468506f, 0.500977f, 0.469238f, 0.496826f, + 0.468994f, 0.491699f, 0.468262f, 0.486328f, 0.467041f, 0.481445f, 0.466309f, 0.476318f, + 0.464111f, 0.469727f, 0.462158f, 0.463135f, 0.458740f, 0.455811f, 0.455322f, 0.447754f, + 0.450684f, 0.438721f, 0.444824f, 0.427734f, 0.437012f, 0.415039f, 0.424316f, 0.399414f, + 0.407227f, 0.378174f, 0.381592f, 0.346680f, 0.332275f, 0.290283f, 0.208618f, 0.136841f, + 0.000000f, 1.000000f, 0.127686f, 0.943848f, 0.196655f, 0.892578f, 0.240479f, 0.852539f, + 0.272949f, 0.819336f, 0.297607f, 0.791504f, 0.317627f, 0.767578f, 0.334229f, 0.747070f, + 0.348145f, 0.729004f, 0.360107f, 0.712891f, 0.370605f, 0.698242f, 0.380859f, 0.684570f, + 0.391357f, 0.671875f, 0.398193f, 0.660645f, 0.404297f, 0.650879f, 0.411865f, 0.640625f, + 0.417725f, 0.631836f, 0.422607f, 0.623535f, 0.427979f, 0.615723f, 0.433838f, 0.607910f, + 0.437744f, 0.601074f, 0.441650f, 0.594727f, 0.445557f, 0.588379f, 0.449219f, 0.582520f, + 0.454102f, 0.575684f, 0.458008f, 0.570312f, 0.460938f, 0.564453f, 0.463867f, 0.559570f, + 0.468018f, 0.553711f, 0.471191f, 0.548340f, 0.473877f, 0.543457f, 0.476562f, 0.539062f, + 0.479004f, 0.534180f, 0.481934f, 0.529297f, 0.483887f, 0.524902f, 0.485352f, 0.520996f, + 0.488037f, 0.516602f, 0.490479f, 0.511719f, 0.492432f, 0.507812f, 0.494873f, 0.503418f, + 0.496582f, 0.499268f, 0.498291f, 0.494873f, 0.499512f, 0.490723f, 0.501465f, 0.485596f, + 0.501953f, 0.480469f, 0.502930f, 0.475586f, 0.503906f, 0.470947f, 0.505859f, 0.465576f, + 0.506348f, 0.460449f, 0.506836f, 0.454346f, 0.506836f, 0.448242f, 0.505859f, 0.442627f, + 0.505859f, 0.435547f, 0.505371f, 0.427979f, 0.503906f, 0.420654f, 0.501953f, 0.412109f, + 0.498291f, 0.402100f, 0.494385f, 0.391113f, 0.487549f, 0.377686f, 0.478516f, 0.361084f, + 0.466064f, 0.340576f, 0.442871f, 0.310547f, 0.402588f, 0.258301f, 0.290527f, 0.122314f, + 0.000000f, 1.000000f, 0.127686f, 0.944336f, 0.198120f, 0.892090f, 0.244385f, 0.850098f, + 0.277100f, 0.816895f, 0.303711f, 0.787598f, 0.325195f, 0.762695f, 0.344238f, 0.740234f, + 0.357666f, 0.721680f, 0.371582f, 0.704102f, 0.383057f, 0.688965f, 0.393311f, 0.674805f, + 0.401367f, 0.662598f, 0.410889f, 0.650391f, 0.417725f, 0.639648f, 0.426514f, 0.628906f, + 0.432373f, 0.619629f, 0.438232f, 0.610352f, 0.444580f, 0.602051f, 0.451904f, 0.593262f, + 0.456055f, 0.585449f, 0.461182f, 0.578125f, 0.465576f, 0.571289f, 0.469727f, 0.564941f, + 0.474854f, 0.558105f, 0.479736f, 0.551270f, 0.482666f, 0.545410f, 0.486816f, 0.539551f, + 0.491211f, 0.533691f, 0.494629f, 0.527832f, 0.497559f, 0.522461f, 0.500977f, 0.517090f, + 0.503906f, 0.511719f, 0.507812f, 0.506348f, 0.509766f, 0.501465f, 0.512207f, 0.497314f, + 0.517090f, 0.491699f, 0.519531f, 0.486572f, 0.521973f, 0.481934f, 0.523926f, 0.477051f, + 0.526855f, 0.472168f, 0.529297f, 0.467529f, 0.531738f, 0.462646f, 0.534668f, 0.457275f, + 0.536133f, 0.451416f, 0.537109f, 0.446045f, 0.538574f, 0.440430f, 0.541504f, 0.434814f, + 0.542480f, 0.428955f, 0.543945f, 0.422607f, 0.544922f, 0.416260f, 0.545898f, 0.409424f, + 0.547363f, 0.402588f, 0.546387f, 0.394287f, 0.546387f, 0.385986f, 0.544922f, 0.376709f, + 0.544434f, 0.366699f, 0.541504f, 0.354492f, 0.537109f, 0.341309f, 0.531250f, 0.325684f, + 0.520996f, 0.304932f, 0.503906f, 0.276123f, 0.468750f, 0.228271f, 0.369873f, 0.107666f, + 0.000000f, 1.000000f, 0.128662f, 0.943848f, 0.200928f, 0.890625f, 0.248047f, 0.848145f, + 0.283447f, 0.812500f, 0.311523f, 0.782227f, 0.333252f, 0.756836f, 0.351074f, 0.734375f, + 0.367920f, 0.714355f, 0.382080f, 0.696289f, 0.393555f, 0.680664f, 0.404785f, 0.665527f, + 0.415039f, 0.651855f, 0.425293f, 0.639160f, 0.432861f, 0.627441f, 0.441406f, 0.616211f, + 0.448242f, 0.605957f, 0.455811f, 0.596191f, 0.461426f, 0.587891f, 0.468018f, 0.578613f, + 0.473877f, 0.570312f, 0.480225f, 0.562012f, 0.485352f, 0.554199f, 0.489258f, 0.547363f, + 0.494873f, 0.540527f, 0.500488f, 0.532715f, 0.504883f, 0.525879f, 0.509766f, 0.519531f, + 0.513672f, 0.513184f, 0.518066f, 0.506836f, 0.522461f, 0.500977f, 0.524902f, 0.495361f, + 0.529785f, 0.489258f, 0.533203f, 0.483643f, 0.537598f, 0.477783f, 0.540039f, 0.472656f, + 0.543945f, 0.467041f, 0.546875f, 0.461670f, 0.550781f, 0.456055f, 0.553711f, 0.450928f, + 0.556641f, 0.445557f, 0.560059f, 0.439941f, 0.562988f, 0.434570f, 0.565918f, 0.428955f, + 0.569336f, 0.423096f, 0.569824f, 0.416992f, 0.573242f, 0.410645f, 0.576172f, 0.404297f, + 0.577637f, 0.397949f, 0.580078f, 0.391846f, 0.581543f, 0.384766f, 0.582520f, 0.377441f, + 0.585938f, 0.369385f, 0.585449f, 0.361572f, 0.586914f, 0.352783f, 0.586914f, 0.343506f, + 0.587891f, 0.333008f, 0.585938f, 0.320557f, 0.583984f, 0.307617f, 0.578613f, 0.291504f, + 0.571777f, 0.271729f, 0.557129f, 0.243896f, 0.527832f, 0.199463f, 0.445557f, 0.093689f, + 0.000000f, 1.000000f, 0.129517f, 0.943359f, 0.203003f, 0.889648f, 0.252930f, 0.845215f, + 0.290039f, 0.808105f, 0.318115f, 0.777832f, 0.339844f, 0.751953f, 0.360107f, 0.728516f, + 0.377197f, 0.707520f, 0.392090f, 0.688477f, 0.405518f, 0.671387f, 0.417725f, 0.655762f, + 0.428223f, 0.641602f, 0.437988f, 0.628418f, 0.446533f, 0.616211f, 0.456543f, 0.604004f, + 0.464355f, 0.592773f, 0.472656f, 0.582031f, 0.478271f, 0.573242f, 0.487305f, 0.562988f, + 0.492188f, 0.554199f, 0.499268f, 0.545410f, 0.504883f, 0.537109f, 0.509766f, 0.529785f, + 0.515625f, 0.521973f, 0.521973f, 0.514160f, 0.526367f, 0.506836f, 0.531738f, 0.500000f, + 0.536133f, 0.492676f, 0.542480f, 0.485840f, 0.545898f, 0.479492f, 0.550293f, 0.473145f, + 0.554688f, 0.466797f, 0.558594f, 0.460693f, 0.563477f, 0.454346f, 0.566406f, 0.448730f, + 0.571777f, 0.442383f, 0.574219f, 0.436768f, 0.578613f, 0.430664f, 0.582031f, 0.424805f, + 0.585938f, 0.419189f, 0.590332f, 0.413086f, 0.593262f, 0.406982f, 0.596680f, 0.401367f, + 0.600098f, 0.395264f, 0.602539f, 0.388916f, 0.605469f, 0.381836f, 0.609375f, 0.375000f, + 0.611816f, 0.368408f, 0.614258f, 0.361572f, 0.617188f, 0.354736f, 0.619629f, 0.346436f, + 0.622559f, 0.338379f, 0.624512f, 0.330566f, 0.624512f, 0.321045f, 0.626465f, 0.311768f, + 0.626953f, 0.300537f, 0.626953f, 0.288818f, 0.626465f, 0.275391f, 0.623047f, 0.260254f, + 0.617188f, 0.240234f, 0.606934f, 0.214233f, 0.584473f, 0.173584f, 0.513672f, 0.080017f, + 0.000000f, 1.000000f, 0.130615f, 0.942871f, 0.206787f, 0.887207f, 0.257568f, 0.842285f, + 0.295166f, 0.805176f, 0.323975f, 0.773926f, 0.347656f, 0.746582f, 0.368896f, 0.722168f, + 0.387939f, 0.699707f, 0.403320f, 0.680176f, 0.417236f, 0.662598f, 0.428955f, 0.646484f, + 0.442139f, 0.630859f, 0.452393f, 0.617188f, 0.461670f, 0.603516f, 0.471191f, 0.591309f, + 0.480713f, 0.579590f, 0.488525f, 0.568359f, 0.495361f, 0.558594f, 0.503906f, 0.547852f, + 0.512207f, 0.538086f, 0.518066f, 0.529297f, 0.524414f, 0.520020f, 0.530273f, 0.511719f, + 0.535645f, 0.503906f, 0.541992f, 0.495850f, 0.548340f, 0.488037f, 0.553223f, 0.480225f, + 0.559082f, 0.472412f, 0.564941f, 0.465088f, 0.569336f, 0.458008f, 0.574219f, 0.451660f, + 0.580566f, 0.444092f, 0.583008f, 0.437988f, 0.588867f, 0.431152f, 0.592773f, 0.424805f, + 0.597168f, 0.418701f, 0.602539f, 0.411865f, 0.605469f, 0.405762f, 0.609375f, 0.399658f, + 0.614258f, 0.393311f, 0.618164f, 0.386719f, 0.622559f, 0.380615f, 0.626953f, 0.374268f, + 0.630371f, 0.367920f, 0.633301f, 0.361816f, 0.637695f, 0.353760f, 0.641113f, 0.346924f, + 0.643555f, 0.339844f, 0.647461f, 0.332520f, 0.650879f, 0.325684f, 0.652832f, 0.317627f, + 0.656250f, 0.308838f, 0.658691f, 0.300537f, 0.660156f, 0.291504f, 0.663086f, 0.281738f, + 0.665039f, 0.270996f, 0.666016f, 0.260010f, 0.665527f, 0.246460f, 0.664062f, 0.231323f, + 0.660645f, 0.212646f, 0.651855f, 0.188354f, 0.633301f, 0.151489f, 0.574219f, 0.069397f, + 0.000000f, 1.000000f, 0.132568f, 0.941895f, 0.209839f, 0.885742f, 0.261719f, 0.840332f, + 0.300293f, 0.802246f, 0.330322f, 0.769531f, 0.357178f, 0.740234f, 0.378174f, 0.715332f, + 0.396729f, 0.692871f, 0.414307f, 0.671875f, 0.429688f, 0.653320f, 0.442139f, 0.636230f, + 0.454590f, 0.620605f, 0.466064f, 0.605469f, 0.477295f, 0.591309f, 0.487305f, 0.578613f, + 0.496338f, 0.565918f, 0.505371f, 0.554199f, 0.512695f, 0.543457f, 0.521484f, 0.533203f, + 0.529297f, 0.521973f, 0.536133f, 0.512695f, 0.543457f, 0.503418f, 0.549805f, 0.494385f, + 0.556152f, 0.485840f, 0.562012f, 0.477539f, 0.568848f, 0.468750f, 0.575684f, 0.460449f, + 0.582031f, 0.452393f, 0.586914f, 0.444580f, 0.592773f, 0.437256f, 0.598145f, 0.429932f, + 0.603516f, 0.422363f, 0.609375f, 0.415283f, 0.613770f, 0.408447f, 0.618164f, 0.401611f, + 0.622559f, 0.395020f, 0.627930f, 0.387695f, 0.632812f, 0.381104f, 0.636719f, 0.375000f, + 0.641602f, 0.368164f, 0.646484f, 0.361328f, 0.650391f, 0.354736f, 0.653809f, 0.348633f, + 0.659180f, 0.341553f, 0.663086f, 0.335205f, 0.667480f, 0.327393f, 0.670410f, 0.320312f, + 0.674316f, 0.312744f, 0.677734f, 0.305420f, 0.681152f, 0.297852f, 0.685547f, 0.290283f, + 0.687988f, 0.281494f, 0.690918f, 0.272705f, 0.694824f, 0.264160f, 0.696777f, 0.254150f, + 0.698242f, 0.244019f, 0.699707f, 0.232178f, 0.699707f, 0.219727f, 0.700684f, 0.204956f, + 0.698730f, 0.187744f, 0.692383f, 0.165527f, 0.677734f, 0.130981f, 0.627441f, 0.059204f, + 0.000000f, 1.000000f, 0.133301f, 0.941895f, 0.213013f, 0.883789f, 0.265381f, 0.837891f, + 0.305420f, 0.798828f, 0.337158f, 0.765137f, 0.364990f, 0.734863f, 0.386475f, 0.708984f, + 0.406006f, 0.685547f, 0.424072f, 0.664062f, 0.439941f, 0.644531f, 0.454590f, 0.626465f, + 0.468506f, 0.609375f, 0.479492f, 0.594238f, 0.492188f, 0.579102f, 0.501465f, 0.565918f, + 0.511719f, 0.552734f, 0.522461f, 0.540039f, 0.531738f, 0.528320f, 0.538574f, 0.517578f, + 0.547363f, 0.506348f, 0.554199f, 0.496338f, 0.563477f, 0.485840f, 0.570312f, 0.476807f, + 0.576660f, 0.467529f, 0.583496f, 0.458740f, 0.590332f, 0.449951f, 0.596680f, 0.441406f, + 0.603516f, 0.432373f, 0.608887f, 0.424316f, 0.615723f, 0.416260f, 0.621094f, 0.408691f, + 0.627441f, 0.400879f, 0.632324f, 0.393311f, 0.637695f, 0.386230f, 0.642090f, 0.379150f, + 0.648926f, 0.371338f, 0.652344f, 0.364746f, 0.657715f, 0.357666f, 0.662109f, 0.350830f, + 0.668457f, 0.343750f, 0.672363f, 0.336914f, 0.677246f, 0.330078f, 0.681152f, 0.323486f, + 0.685547f, 0.316650f, 0.690918f, 0.309570f, 0.694824f, 0.302734f, 0.698730f, 0.294678f, + 0.702148f, 0.287109f, 0.705566f, 0.279785f, 0.709961f, 0.271973f, 0.714844f, 0.264404f, + 0.716797f, 0.256348f, 0.721191f, 0.247192f, 0.724121f, 0.238525f, 0.727539f, 0.229248f, + 0.729004f, 0.218506f, 0.731445f, 0.207642f, 0.733887f, 0.196533f, 0.733887f, 0.181641f, + 0.732910f, 0.165039f, 0.727539f, 0.144409f, 0.716797f, 0.114136f, 0.676758f, 0.050964f, + 0.000000f, 1.000000f, 0.134399f, 0.941406f, 0.215210f, 0.882812f, 0.270264f, 0.835449f, + 0.312256f, 0.794434f, 0.344238f, 0.760254f, 0.372803f, 0.729492f, 0.396240f, 0.702637f, + 0.416748f, 0.677734f, 0.435303f, 0.655762f, 0.451660f, 0.635254f, 0.467529f, 0.616211f, + 0.480713f, 0.599121f, 0.493896f, 0.582520f, 0.506348f, 0.566895f, 0.517578f, 0.552734f, + 0.526855f, 0.539551f, 0.537598f, 0.526367f, 0.547852f, 0.513672f, 0.555664f, 0.502441f, + 0.564941f, 0.490723f, 0.573242f, 0.479980f, 0.581543f, 0.469238f, 0.588867f, 0.459229f, + 0.596191f, 0.449707f, 0.603516f, 0.440430f, 0.609863f, 0.431396f, 0.617676f, 0.422363f, + 0.625000f, 0.412842f, 0.631348f, 0.404541f, 0.637207f, 0.395996f, 0.644043f, 0.387695f, + 0.648926f, 0.380127f, 0.655273f, 0.371826f, 0.660156f, 0.364746f, 0.666016f, 0.356934f, + 0.671875f, 0.349365f, 0.677734f, 0.342041f, 0.681152f, 0.334961f, 0.686523f, 0.327881f, + 0.692871f, 0.320801f, 0.697266f, 0.313477f, 0.701660f, 0.306396f, 0.707031f, 0.299805f, + 0.710938f, 0.292725f, 0.716309f, 0.285400f, 0.721191f, 0.278564f, 0.725586f, 0.271240f, + 0.729004f, 0.263428f, 0.732910f, 0.255859f, 0.737305f, 0.247803f, 0.741211f, 0.240356f, + 0.745117f, 0.232300f, 0.748047f, 0.224121f, 0.751953f, 0.214844f, 0.756348f, 0.205933f, + 0.756836f, 0.196167f, 0.760254f, 0.185547f, 0.762207f, 0.174072f, 0.762695f, 0.160645f, + 0.762207f, 0.145752f, 0.759277f, 0.127075f, 0.750977f, 0.098389f, 0.716797f, 0.042633f, + 0.000000f, 1.000000f, 0.136841f, 0.939941f, 0.216919f, 0.882324f, 0.274414f, 0.832520f, + 0.317383f, 0.791016f, 0.353027f, 0.754883f, 0.380127f, 0.724121f, 0.405273f, 0.695801f, + 0.426758f, 0.670410f, 0.447021f, 0.646973f, 0.463867f, 0.625977f, 0.479980f, 0.606445f, + 0.494385f, 0.587891f, 0.507812f, 0.570801f, 0.521973f, 0.554688f, 0.532715f, 0.540039f, + 0.542480f, 0.525879f, 0.554688f, 0.511719f, 0.564453f, 0.499023f, 0.573730f, 0.486816f, + 0.583008f, 0.475098f, 0.591309f, 0.463623f, 0.600098f, 0.452393f, 0.609375f, 0.441650f, + 0.616211f, 0.432129f, 0.624023f, 0.422119f, 0.630371f, 0.412842f, 0.636719f, 0.403809f, + 0.645996f, 0.393799f, 0.651855f, 0.384766f, 0.659180f, 0.375977f, 0.665039f, 0.367920f, + 0.670898f, 0.359131f, 0.677246f, 0.351074f, 0.682617f, 0.343506f, 0.688965f, 0.335693f, + 0.694336f, 0.327881f, 0.700684f, 0.320312f, 0.704102f, 0.313232f, 0.709961f, 0.305908f, + 0.716309f, 0.298340f, 0.720703f, 0.291260f, 0.726074f, 0.283936f, 0.730469f, 0.277344f, + 0.734863f, 0.270264f, 0.740234f, 0.262939f, 0.745117f, 0.255859f, 0.749023f, 0.249268f, + 0.753418f, 0.241333f, 0.757812f, 0.233398f, 0.760742f, 0.225952f, 0.766113f, 0.218140f, + 0.769531f, 0.210449f, 0.773926f, 0.202759f, 0.775391f, 0.193970f, 0.780273f, 0.184814f, + 0.783691f, 0.175537f, 0.785156f, 0.165771f, 0.787598f, 0.154907f, 0.789551f, 0.142700f, + 0.790039f, 0.128906f, 0.788086f, 0.110474f, 0.780273f, 0.086975f, 0.752930f, 0.036133f, + 0.000000f, 1.000000f, 0.138306f, 0.939453f, 0.219360f, 0.881348f, 0.279053f, 0.830078f, + 0.323486f, 0.787598f, 0.359863f, 0.750488f, 0.389893f, 0.717285f, 0.415039f, 0.688965f, + 0.438232f, 0.662109f, 0.457275f, 0.638672f, 0.475098f, 0.616699f, 0.492676f, 0.596191f, + 0.508301f, 0.577148f, 0.522949f, 0.559082f, 0.536133f, 0.542480f, 0.546875f, 0.526855f, + 0.559570f, 0.512207f, 0.569824f, 0.498535f, 0.581543f, 0.484131f, 0.592285f, 0.471436f, + 0.601562f, 0.459229f, 0.609863f, 0.447510f, 0.619629f, 0.435791f, 0.627930f, 0.424805f, + 0.635254f, 0.414795f, 0.642578f, 0.404297f, 0.650879f, 0.394287f, 0.656250f, 0.385498f, + 0.665039f, 0.375244f, 0.672852f, 0.365723f, 0.679199f, 0.357178f, 0.686035f, 0.348145f, + 0.692383f, 0.339355f, 0.698242f, 0.331299f, 0.703613f, 0.323242f, 0.709961f, 0.315430f, + 0.716797f, 0.307129f, 0.721191f, 0.299805f, 0.726074f, 0.292236f, 0.733398f, 0.284668f, + 0.736328f, 0.277588f, 0.742676f, 0.270020f, 0.748047f, 0.262939f, 0.751465f, 0.256348f, + 0.757324f, 0.249023f, 0.763672f, 0.241333f, 0.766113f, 0.235352f, 0.771484f, 0.228027f, + 0.776855f, 0.221191f, 0.778809f, 0.213257f, 0.783691f, 0.205322f, 0.787598f, 0.197876f, + 0.792480f, 0.190186f, 0.796387f, 0.182739f, 0.798828f, 0.174805f, 0.803223f, 0.165405f, + 0.805664f, 0.157227f, 0.809082f, 0.147827f, 0.811035f, 0.137695f, 0.813477f, 0.125977f, + 0.813477f, 0.113586f, 0.812012f, 0.096863f, 0.805664f, 0.073975f, 0.784668f, 0.031372f, + 0.000000f, 1.000000f, 0.138794f, 0.939453f, 0.224365f, 0.878418f, 0.282959f, 0.827637f, + 0.329102f, 0.783691f, 0.366699f, 0.745605f, 0.397461f, 0.712402f, 0.424316f, 0.682129f, + 0.447510f, 0.654785f, 0.470459f, 0.629395f, 0.489014f, 0.606934f, 0.505859f, 0.585938f, + 0.521484f, 0.565918f, 0.536133f, 0.547363f, 0.550293f, 0.530273f, 0.563477f, 0.513672f, + 0.575684f, 0.498535f, 0.585938f, 0.484619f, 0.598145f, 0.469727f, 0.607910f, 0.456787f, + 0.617676f, 0.443848f, 0.626465f, 0.431885f, 0.637207f, 0.419434f, 0.645508f, 0.408203f, + 0.654785f, 0.397461f, 0.660645f, 0.386963f, 0.669434f, 0.376709f, 0.675781f, 0.367432f, + 0.684570f, 0.357422f, 0.691406f, 0.347412f, 0.698730f, 0.338623f, 0.705566f, 0.329346f, + 0.712402f, 0.320312f, 0.718262f, 0.312012f, 0.723633f, 0.303955f, 0.730469f, 0.295654f, + 0.736328f, 0.287842f, 0.742676f, 0.279785f, 0.746094f, 0.272705f, 0.752930f, 0.264893f, + 0.757812f, 0.257812f, 0.763184f, 0.250000f, 0.769043f, 0.243286f, 0.772949f, 0.236450f, + 0.778809f, 0.229004f, 0.783691f, 0.222168f, 0.787598f, 0.215210f, 0.791016f, 0.208862f, + 0.797852f, 0.201538f, 0.801270f, 0.194458f, 0.804199f, 0.186890f, 0.809570f, 0.179443f, + 0.812012f, 0.172485f, 0.816895f, 0.164429f, 0.820801f, 0.156982f, 0.823242f, 0.148804f, + 0.826172f, 0.140747f, 0.829590f, 0.131836f, 0.832031f, 0.121643f, 0.833984f, 0.111877f, + 0.834473f, 0.100220f, 0.833008f, 0.084961f, 0.828613f, 0.065186f, 0.809570f, 0.026352f, + 0.000000f, 1.000000f, 0.140015f, 0.938965f, 0.226318f, 0.877441f, 0.288818f, 0.824219f, + 0.335449f, 0.779785f, 0.373779f, 0.741211f, 0.406006f, 0.706543f, 0.435059f, 0.674805f, + 0.458740f, 0.646973f, 0.481445f, 0.620605f, 0.500000f, 0.597656f, 0.517578f, 0.575684f, + 0.535156f, 0.554688f, 0.550781f, 0.535645f, 0.563965f, 0.518066f, 0.577637f, 0.500977f, + 0.589844f, 0.485352f, 0.602051f, 0.470459f, 0.613770f, 0.455566f, 0.623535f, 0.441895f, + 0.634277f, 0.428467f, 0.643555f, 0.416260f, 0.654297f, 0.403809f, 0.663086f, 0.391846f, + 0.671875f, 0.380615f, 0.681152f, 0.369629f, 0.686523f, 0.359619f, 0.695312f, 0.349854f, + 0.701172f, 0.340088f, 0.710449f, 0.329834f, 0.717773f, 0.320557f, 0.724121f, 0.311523f, + 0.730957f, 0.302246f, 0.737305f, 0.293945f, 0.743164f, 0.285645f, 0.749512f, 0.277100f, + 0.754883f, 0.269287f, 0.761230f, 0.261230f, 0.766113f, 0.254150f, 0.771973f, 0.246216f, + 0.777832f, 0.238770f, 0.782715f, 0.231812f, 0.787109f, 0.224731f, 0.792480f, 0.217773f, + 0.797852f, 0.210693f, 0.801758f, 0.203735f, 0.807617f, 0.197021f, 0.811035f, 0.190674f, + 0.815430f, 0.183716f, 0.820801f, 0.176880f, 0.823730f, 0.170044f, 0.827148f, 0.162720f, + 0.830566f, 0.155273f, 0.834961f, 0.148071f, 0.839355f, 0.141113f, 0.842285f, 0.134399f, + 0.845215f, 0.125366f, 0.848633f, 0.117004f, 0.850098f, 0.108765f, 0.852051f, 0.099304f, + 0.853516f, 0.087769f, 0.853516f, 0.074890f, 0.850098f, 0.056458f, 0.834473f, 0.023911f, + 0.000000f, 1.000000f, 0.141235f, 0.938477f, 0.229614f, 0.875977f, 0.292725f, 0.822266f, + 0.341797f, 0.775879f, 0.381836f, 0.735840f, 0.414062f, 0.700195f, 0.444092f, 0.667969f, + 0.468994f, 0.638672f, 0.492432f, 0.612305f, 0.512207f, 0.587891f, 0.530762f, 0.565430f, + 0.548828f, 0.543945f, 0.563965f, 0.524414f, 0.578613f, 0.505859f, 0.592285f, 0.488525f, + 0.605957f, 0.471924f, 0.618164f, 0.456299f, 0.630371f, 0.441406f, 0.640625f, 0.427002f, + 0.652344f, 0.413086f, 0.662109f, 0.400635f, 0.670410f, 0.388428f, 0.680176f, 0.375977f, + 0.688477f, 0.364990f, 0.697266f, 0.353271f, 0.705566f, 0.342773f, 0.712891f, 0.332764f, + 0.719727f, 0.322998f, 0.728027f, 0.312988f, 0.734863f, 0.303711f, 0.742188f, 0.293945f, + 0.749023f, 0.284912f, 0.755859f, 0.276123f, 0.761230f, 0.267822f, 0.768066f, 0.259277f, + 0.772461f, 0.251709f, 0.779297f, 0.243652f, 0.785156f, 0.236206f, 0.789551f, 0.228882f, + 0.795410f, 0.221191f, 0.799805f, 0.214355f, 0.804688f, 0.207520f, 0.810059f, 0.200317f, + 0.815430f, 0.193604f, 0.819336f, 0.186646f, 0.823242f, 0.180542f, 0.828613f, 0.173828f, + 0.833496f, 0.166992f, 0.837891f, 0.160889f, 0.841309f, 0.154663f, 0.845703f, 0.147705f, + 0.847656f, 0.140381f, 0.852051f, 0.133301f, 0.854980f, 0.126831f, 0.858398f, 0.120117f, + 0.861328f, 0.112610f, 0.864258f, 0.104553f, 0.867676f, 0.096863f, 0.868652f, 0.087402f, + 0.870117f, 0.078186f, 0.869141f, 0.066406f, 0.868652f, 0.049530f, 0.854004f, 0.019684f, + 0.000000f, 1.000000f, 0.141724f, 0.938477f, 0.232910f, 0.874023f, 0.298096f, 0.819336f, + 0.347656f, 0.771973f, 0.388184f, 0.730957f, 0.423340f, 0.694336f, 0.453613f, 0.660645f, + 0.479492f, 0.630859f, 0.503906f, 0.603516f, 0.524902f, 0.578125f, 0.543457f, 0.554688f, + 0.562500f, 0.532715f, 0.577148f, 0.513184f, 0.592773f, 0.493896f, 0.607910f, 0.475586f, + 0.621094f, 0.458496f, 0.633301f, 0.442871f, 0.644043f, 0.427979f, 0.656250f, 0.413086f, + 0.667480f, 0.398682f, 0.677734f, 0.385498f, 0.687988f, 0.373047f, 0.696777f, 0.360596f, + 0.704590f, 0.349121f, 0.714355f, 0.337158f, 0.721680f, 0.326660f, 0.729980f, 0.316406f, + 0.737793f, 0.306152f, 0.743652f, 0.297119f, 0.751953f, 0.287109f, 0.759277f, 0.277588f, + 0.766113f, 0.268311f, 0.770996f, 0.260010f, 0.778809f, 0.250977f, 0.784180f, 0.242920f, + 0.790039f, 0.234985f, 0.794922f, 0.227539f, 0.802734f, 0.219360f, 0.806152f, 0.212280f, + 0.812012f, 0.204956f, 0.816895f, 0.197998f, 0.820801f, 0.191406f, 0.826660f, 0.184082f, + 0.830078f, 0.177979f, 0.835938f, 0.171021f, 0.839844f, 0.164917f, 0.844238f, 0.158569f, + 0.849121f, 0.152100f, 0.853516f, 0.145996f, 0.856445f, 0.140381f, 0.861816f, 0.133911f, + 0.863770f, 0.126953f, 0.866699f, 0.120483f, 0.870605f, 0.114136f, 0.874023f, 0.107361f, + 0.876953f, 0.100830f, 0.878418f, 0.093567f, 0.882324f, 0.085754f, 0.884277f, 0.078369f, + 0.885254f, 0.068787f, 0.887207f, 0.057587f, 0.884277f, 0.043793f, 0.875000f, 0.016937f, + 0.000000f, 1.000000f, 0.143066f, 0.937500f, 0.235352f, 0.872559f, 0.302002f, 0.816895f, + 0.354004f, 0.768066f, 0.395996f, 0.726074f, 0.432373f, 0.687500f, 0.463623f, 0.653809f, + 0.490479f, 0.622559f, 0.514648f, 0.594727f, 0.535645f, 0.569336f, 0.557617f, 0.544434f, + 0.575195f, 0.522461f, 0.591309f, 0.501465f, 0.606445f, 0.481934f, 0.621582f, 0.463379f, + 0.635254f, 0.446289f, 0.647461f, 0.429443f, 0.660156f, 0.413818f, 0.672363f, 0.398682f, + 0.684082f, 0.384033f, 0.693359f, 0.370850f, 0.704102f, 0.357910f, 0.712891f, 0.345703f, + 0.721680f, 0.333984f, 0.729492f, 0.322021f, 0.737305f, 0.311279f, 0.746094f, 0.300537f, + 0.754883f, 0.290283f, 0.760254f, 0.281006f, 0.766602f, 0.271973f, 0.774414f, 0.261963f, + 0.783203f, 0.252197f, 0.788086f, 0.244141f, 0.794434f, 0.235596f, 0.801758f, 0.226685f, + 0.806152f, 0.219482f, 0.811523f, 0.211548f, 0.818359f, 0.203857f, 0.821777f, 0.196899f, + 0.828125f, 0.189697f, 0.832031f, 0.182861f, 0.835938f, 0.176270f, 0.841309f, 0.169434f, + 0.846191f, 0.162964f, 0.850098f, 0.157104f, 0.854980f, 0.150269f, 0.858887f, 0.144409f, + 0.863281f, 0.138428f, 0.866699f, 0.132812f, 0.870605f, 0.126953f, 0.875000f, 0.120972f, + 0.878418f, 0.115234f, 0.879883f, 0.109131f, 0.883789f, 0.102234f, 0.886719f, 0.096008f, + 0.890137f, 0.089905f, 0.894043f, 0.084045f, 0.895996f, 0.076233f, 0.897461f, 0.068970f, + 0.899414f, 0.060028f, 0.899902f, 0.050995f, 0.898438f, 0.037994f, 0.891602f, 0.014374f, + 0.000000f, 1.000000f, 0.145142f, 0.936523f, 0.239258f, 0.870605f, 0.307861f, 0.813477f, + 0.360352f, 0.764160f, 0.404053f, 0.720703f, 0.441650f, 0.681641f, 0.473877f, 0.646484f, + 0.500977f, 0.615234f, 0.526367f, 0.585449f, 0.548828f, 0.559082f, 0.568848f, 0.534668f, + 0.587402f, 0.511719f, 0.604980f, 0.489990f, 0.621582f, 0.469971f, 0.636230f, 0.450684f, + 0.649414f, 0.433594f, 0.662109f, 0.416260f, 0.675293f, 0.400391f, 0.686035f, 0.385498f, + 0.698730f, 0.370361f, 0.708496f, 0.356689f, 0.717773f, 0.343994f, 0.728027f, 0.331299f, + 0.737305f, 0.319092f, 0.746094f, 0.307373f, 0.753906f, 0.296143f, 0.762207f, 0.285400f, + 0.769531f, 0.275146f, 0.776367f, 0.265625f, 0.782715f, 0.256592f, 0.790527f, 0.247070f, + 0.796387f, 0.238159f, 0.803711f, 0.229004f, 0.809082f, 0.220825f, 0.814941f, 0.212280f, + 0.820801f, 0.204590f, 0.825684f, 0.197144f, 0.832031f, 0.189453f, 0.836426f, 0.182373f, + 0.841309f, 0.175903f, 0.846191f, 0.168701f, 0.851074f, 0.162109f, 0.854980f, 0.155762f, + 0.859863f, 0.149414f, 0.863281f, 0.143677f, 0.867676f, 0.137329f, 0.872070f, 0.131592f, + 0.875000f, 0.126221f, 0.881348f, 0.119995f, 0.882812f, 0.114868f, 0.887695f, 0.109253f, + 0.890625f, 0.104370f, 0.894531f, 0.097961f, 0.895996f, 0.091980f, 0.898926f, 0.086060f, + 0.902344f, 0.080261f, 0.905762f, 0.074219f, 0.908203f, 0.067993f, 0.908691f, 0.061157f, + 0.912598f, 0.053375f, 0.913574f, 0.045044f, 0.911133f, 0.033325f, 0.904785f, 0.012718f, + 0.000000f, 1.000000f, 0.146484f, 0.936035f, 0.240601f, 0.870117f, 0.311035f, 0.811523f, + 0.367188f, 0.760254f, 0.412109f, 0.715332f, 0.448975f, 0.675781f, 0.483398f, 0.639160f, + 0.511230f, 0.606934f, 0.537109f, 0.577148f, 0.560059f, 0.549805f, 0.581055f, 0.524414f, + 0.601562f, 0.500488f, 0.619141f, 0.478760f, 0.635254f, 0.458008f, 0.650879f, 0.438232f, + 0.664062f, 0.420654f, 0.677246f, 0.403320f, 0.689453f, 0.387207f, 0.700684f, 0.372070f, + 0.712891f, 0.357422f, 0.722168f, 0.343018f, 0.733398f, 0.329590f, 0.742188f, 0.317139f, + 0.750488f, 0.305420f, 0.760742f, 0.292969f, 0.769531f, 0.281738f, 0.775391f, 0.271729f, + 0.783203f, 0.260742f, 0.791016f, 0.251221f, 0.797852f, 0.241943f, 0.804199f, 0.232910f, + 0.810059f, 0.224365f, 0.817383f, 0.215088f, 0.823242f, 0.206787f, 0.829102f, 0.198486f, + 0.834473f, 0.190796f, 0.840332f, 0.183350f, 0.845703f, 0.175781f, 0.850586f, 0.168945f, + 0.854980f, 0.162476f, 0.860352f, 0.155151f, 0.863770f, 0.149170f, 0.867676f, 0.143433f, + 0.874023f, 0.136719f, 0.875977f, 0.131104f, 0.880859f, 0.125244f, 0.883789f, 0.120178f, + 0.888672f, 0.114197f, 0.892090f, 0.108887f, 0.895996f, 0.103577f, 0.898438f, 0.098999f, + 0.902832f, 0.093079f, 0.905273f, 0.088623f, 0.907715f, 0.083313f, 0.910645f, 0.077087f, + 0.913574f, 0.071411f, 0.915527f, 0.066528f, 0.919922f, 0.059998f, 0.918945f, 0.054810f, + 0.921875f, 0.047058f, 0.922363f, 0.039581f, 0.922852f, 0.028900f, 0.917480f, 0.011467f, + 0.000000f, 1.000000f, 0.146973f, 0.936035f, 0.245117f, 0.867676f, 0.316650f, 0.808594f, + 0.372559f, 0.756348f, 0.419434f, 0.710449f, 0.458740f, 0.669434f, 0.492676f, 0.632324f, + 0.522461f, 0.598633f, 0.549316f, 0.567871f, 0.573242f, 0.539551f, 0.594727f, 0.513672f, + 0.613770f, 0.489990f, 0.631836f, 0.467529f, 0.648438f, 0.446533f, 0.664062f, 0.427002f, + 0.677734f, 0.408447f, 0.690918f, 0.391357f, 0.703125f, 0.374512f, 0.714844f, 0.358887f, + 0.726562f, 0.343994f, 0.737305f, 0.329590f, 0.747070f, 0.316162f, 0.757324f, 0.303467f, + 0.765137f, 0.291748f, 0.774414f, 0.279541f, 0.783203f, 0.268311f, 0.791016f, 0.257568f, + 0.797852f, 0.247192f, 0.804688f, 0.237915f, 0.812500f, 0.227905f, 0.817871f, 0.219360f, + 0.822266f, 0.211304f, 0.831055f, 0.201904f, 0.835938f, 0.193970f, 0.841309f, 0.185913f, + 0.848145f, 0.177734f, 0.852539f, 0.170654f, 0.857422f, 0.163208f, 0.862305f, 0.156738f, + 0.866699f, 0.150024f, 0.872070f, 0.143311f, 0.875488f, 0.137451f, 0.880859f, 0.131226f, + 0.884766f, 0.125244f, 0.887695f, 0.119751f, 0.891113f, 0.114868f, 0.895996f, 0.108765f, + 0.898926f, 0.103760f, 0.902344f, 0.098755f, 0.906250f, 0.093750f, 0.910645f, 0.088501f, + 0.912109f, 0.084106f, 0.916016f, 0.079773f, 0.919434f, 0.074585f, 0.920410f, 0.069763f, + 0.923340f, 0.063965f, 0.926270f, 0.058655f, 0.927734f, 0.053741f, 0.930664f, 0.048218f, + 0.931641f, 0.041534f, 0.933105f, 0.034637f, 0.932129f, 0.025131f, 0.928711f, 0.010117f, + 0.000000f, 1.000000f, 0.148193f, 0.935547f, 0.248779f, 0.865723f, 0.322021f, 0.805176f, + 0.379150f, 0.752441f, 0.427734f, 0.705078f, 0.469238f, 0.662598f, 0.503418f, 0.625000f, + 0.534180f, 0.590820f, 0.561035f, 0.559570f, 0.585449f, 0.530273f, 0.606445f, 0.503906f, + 0.626465f, 0.479492f, 0.644531f, 0.456543f, 0.663574f, 0.434326f, 0.677246f, 0.415039f, + 0.690430f, 0.396484f, 0.704590f, 0.378662f, 0.717285f, 0.362061f, 0.729004f, 0.345947f, + 0.740234f, 0.331299f, 0.750488f, 0.317139f, 0.762207f, 0.302979f, 0.769531f, 0.290527f, + 0.779297f, 0.278320f, 0.788086f, 0.266602f, 0.795898f, 0.255859f, 0.804688f, 0.244385f, + 0.811035f, 0.234375f, 0.817871f, 0.224609f, 0.825195f, 0.214966f, 0.830078f, 0.206543f, + 0.835938f, 0.198242f, 0.842285f, 0.189819f, 0.847656f, 0.181885f, 0.854492f, 0.173584f, + 0.860352f, 0.165649f, 0.864258f, 0.158813f, 0.870117f, 0.151733f, 0.874512f, 0.144653f, + 0.878418f, 0.138550f, 0.882324f, 0.132446f, 0.888184f, 0.126099f, 0.890137f, 0.120605f, + 0.895020f, 0.114868f, 0.897949f, 0.109680f, 0.903320f, 0.104126f, 0.905273f, 0.098938f, + 0.908203f, 0.094788f, 0.913086f, 0.089050f, 0.915527f, 0.084595f, 0.918945f, 0.080139f, + 0.922363f, 0.075439f, 0.924316f, 0.071228f, 0.928223f, 0.066833f, 0.931152f, 0.062439f, + 0.932617f, 0.057434f, 0.935059f, 0.052216f, 0.937012f, 0.047180f, 0.939453f, 0.042236f, + 0.941895f, 0.037201f, 0.941406f, 0.030228f, 0.942383f, 0.022018f, 0.938965f, 0.009247f, + 0.000000f, 1.000000f, 0.149658f, 0.935059f, 0.251465f, 0.864746f, 0.327393f, 0.802246f, + 0.386963f, 0.747559f, 0.437500f, 0.699219f, 0.478027f, 0.656250f, 0.512207f, 0.618164f, + 0.545410f, 0.582031f, 0.572266f, 0.550293f, 0.597168f, 0.520996f, 0.617188f, 0.494629f, + 0.639648f, 0.468750f, 0.657715f, 0.445557f, 0.674805f, 0.423828f, 0.690430f, 0.403564f, + 0.705078f, 0.384521f, 0.718750f, 0.366211f, 0.730469f, 0.350098f, 0.743164f, 0.333496f, + 0.754395f, 0.318604f, 0.763672f, 0.304688f, 0.774902f, 0.290771f, 0.783203f, 0.277832f, + 0.791992f, 0.265625f, 0.800781f, 0.253906f, 0.808105f, 0.243652f, 0.815918f, 0.232300f, + 0.822266f, 0.222534f, 0.831055f, 0.212036f, 0.835938f, 0.203369f, 0.842773f, 0.194458f, + 0.848145f, 0.186035f, 0.853516f, 0.178101f, 0.859863f, 0.170532f, 0.865234f, 0.162476f, + 0.870605f, 0.154785f, 0.875977f, 0.147949f, 0.879883f, 0.140869f, 0.885254f, 0.134033f, + 0.888184f, 0.128540f, 0.895508f, 0.121582f, 0.897461f, 0.115967f, 0.900391f, 0.111206f, + 0.905762f, 0.104736f, 0.908203f, 0.099854f, 0.911621f, 0.095276f, 0.916504f, 0.089600f, + 0.917969f, 0.085327f, 0.921387f, 0.080933f, 0.925293f, 0.075928f, 0.927734f, 0.072021f, + 0.931152f, 0.067566f, 0.933594f, 0.063538f, 0.936035f, 0.059662f, 0.939453f, 0.055511f, + 0.941406f, 0.051605f, 0.942871f, 0.046936f, 0.944824f, 0.041626f, 0.946289f, 0.037415f, + 0.949219f, 0.032440f, 0.949219f, 0.026672f, 0.950684f, 0.019394f, 0.947754f, 0.007217f, + 0.000000f, 1.000000f, 0.151489f, 0.934082f, 0.255127f, 0.862793f, 0.331787f, 0.799805f, + 0.393066f, 0.743652f, 0.444336f, 0.693848f, 0.486328f, 0.649902f, 0.522949f, 0.610352f, + 0.554688f, 0.574707f, 0.584473f, 0.541016f, 0.607422f, 0.512207f, 0.631348f, 0.484131f, + 0.652344f, 0.458496f, 0.670410f, 0.434814f, 0.687012f, 0.413086f, 0.702148f, 0.392578f, + 0.717285f, 0.373291f, 0.730957f, 0.354980f, 0.743164f, 0.338135f, 0.754883f, 0.322266f, + 0.766602f, 0.306641f, 0.775879f, 0.292480f, 0.786621f, 0.279053f, 0.794922f, 0.266357f, + 0.805176f, 0.253418f, 0.812988f, 0.242188f, 0.819336f, 0.231567f, 0.826660f, 0.221069f, + 0.834961f, 0.210693f, 0.841797f, 0.200928f, 0.846680f, 0.192139f, 0.854980f, 0.182617f, + 0.858887f, 0.174805f, 0.865234f, 0.166748f, 0.870117f, 0.159302f, 0.874023f, 0.152222f, + 0.880371f, 0.145142f, 0.886230f, 0.137329f, 0.890137f, 0.131104f, 0.895996f, 0.123962f, + 0.898926f, 0.118225f, 0.903320f, 0.112427f, 0.907227f, 0.106445f, 0.909668f, 0.101562f, + 0.914551f, 0.095886f, 0.916992f, 0.091309f, 0.921387f, 0.086060f, 0.923828f, 0.081604f, + 0.927246f, 0.077209f, 0.930176f, 0.072632f, 0.932617f, 0.068604f, 0.935547f, 0.064636f, + 0.938965f, 0.060486f, 0.941406f, 0.056458f, 0.944336f, 0.052948f, 0.946777f, 0.049133f, + 0.948242f, 0.045837f, 0.952148f, 0.041809f, 0.952637f, 0.037231f, 0.954102f, 0.032837f, + 0.955566f, 0.028427f, 0.957520f, 0.023804f, 0.958008f, 0.016418f, 0.956543f, 0.006493f, + 0.000000f, 1.000000f, 0.151978f, 0.934082f, 0.257812f, 0.861328f, 0.337158f, 0.796387f, + 0.401123f, 0.739258f, 0.452148f, 0.688965f, 0.495850f, 0.643555f, 0.532715f, 0.603027f, + 0.565430f, 0.566406f, 0.593750f, 0.533203f, 0.620605f, 0.502441f, 0.642578f, 0.474609f, + 0.662598f, 0.448975f, 0.682617f, 0.424561f, 0.698730f, 0.402588f, 0.714355f, 0.382080f, + 0.730957f, 0.361572f, 0.743652f, 0.343506f, 0.756348f, 0.326416f, 0.766602f, 0.310547f, + 0.778320f, 0.295166f, 0.788574f, 0.281006f, 0.798828f, 0.267090f, 0.807617f, 0.254883f, + 0.816406f, 0.242554f, 0.824219f, 0.231201f, 0.832031f, 0.219727f, 0.838867f, 0.209717f, + 0.845703f, 0.200073f, 0.852539f, 0.190308f, 0.859375f, 0.180908f, 0.863770f, 0.172607f, + 0.871094f, 0.164185f, 0.875977f, 0.156128f, 0.880371f, 0.149292f, 0.885742f, 0.141846f, + 0.889648f, 0.135376f, 0.895020f, 0.128540f, 0.899902f, 0.121704f, 0.904297f, 0.115173f, + 0.908203f, 0.109375f, 0.912109f, 0.103638f, 0.915039f, 0.098206f, 0.919434f, 0.092773f, + 0.922363f, 0.088074f, 0.926270f, 0.082886f, 0.929688f, 0.078186f, 0.932129f, 0.074097f, + 0.934570f, 0.069885f, 0.937500f, 0.065552f, 0.940918f, 0.061493f, 0.943359f, 0.057678f, + 0.945801f, 0.054138f, 0.948242f, 0.050293f, 0.950195f, 0.047058f, 0.953125f, 0.043488f, + 0.956055f, 0.039917f, 0.957520f, 0.037048f, 0.960938f, 0.033264f, 0.960938f, 0.029175f, + 0.963379f, 0.024429f, 0.963379f, 0.020630f, 0.965332f, 0.014359f, 0.963867f, 0.005737f, + 0.000000f, 1.000000f, 0.154053f, 0.933105f, 0.260986f, 0.859863f, 0.342041f, 0.793457f, + 0.406982f, 0.735352f, 0.460693f, 0.683105f, 0.504395f, 0.637207f, 0.543945f, 0.595703f, + 0.575684f, 0.558594f, 0.604004f, 0.524902f, 0.630859f, 0.493408f, 0.654297f, 0.464600f, + 0.673828f, 0.438965f, 0.695312f, 0.414062f, 0.710938f, 0.392334f, 0.726074f, 0.371094f, + 0.742188f, 0.351074f, 0.755859f, 0.332520f, 0.768555f, 0.315430f, 0.778320f, 0.299805f, + 0.790039f, 0.284180f, 0.801758f, 0.269775f, 0.810059f, 0.256348f, 0.818848f, 0.243652f, + 0.825684f, 0.232422f, 0.835938f, 0.219849f, 0.841797f, 0.209595f, 0.850098f, 0.198853f, + 0.854980f, 0.189819f, 0.862793f, 0.180176f, 0.868652f, 0.171265f, 0.874512f, 0.162476f, + 0.880859f, 0.154297f, 0.884766f, 0.146851f, 0.890137f, 0.139160f, 0.894531f, 0.132446f, + 0.899414f, 0.125610f, 0.902832f, 0.119873f, 0.907227f, 0.113647f, 0.912109f, 0.107483f, + 0.916016f, 0.101196f, 0.919922f, 0.095642f, 0.924316f, 0.090027f, 0.927246f, 0.085022f, + 0.930664f, 0.080200f, 0.934082f, 0.075562f, 0.936523f, 0.071167f, 0.940430f, 0.066650f, + 0.941406f, 0.063049f, 0.944824f, 0.058929f, 0.947266f, 0.055206f, 0.949707f, 0.051575f, + 0.953613f, 0.047729f, 0.954590f, 0.044525f, 0.957031f, 0.041412f, 0.959961f, 0.037964f, + 0.961914f, 0.035004f, 0.963867f, 0.032135f, 0.966309f, 0.028809f, 0.968262f, 0.026031f, + 0.968262f, 0.021774f, 0.969238f, 0.017258f, 0.971191f, 0.012901f, 0.971191f, 0.004601f, + 0.000000f, 1.000000f, 0.154663f, 0.933105f, 0.264160f, 0.857910f, 0.348389f, 0.790039f, + 0.415283f, 0.730469f, 0.468750f, 0.677734f, 0.514648f, 0.630371f, 0.552734f, 0.588867f, + 0.586914f, 0.550293f, 0.615723f, 0.515625f, 0.643066f, 0.484375f, 0.666016f, 0.455566f, + 0.685547f, 0.429443f, 0.705078f, 0.404541f, 0.722656f, 0.381592f, 0.737793f, 0.360840f, + 0.752930f, 0.341064f, 0.766602f, 0.322266f, 0.778809f, 0.305176f, 0.790527f, 0.289062f, + 0.800293f, 0.273926f, 0.810547f, 0.259521f, 0.822266f, 0.245728f, 0.829102f, 0.233521f, + 0.837402f, 0.221436f, 0.844727f, 0.210449f, 0.853516f, 0.199219f, 0.860352f, 0.188843f, + 0.866211f, 0.179321f, 0.871582f, 0.170410f, 0.877441f, 0.161987f, 0.884277f, 0.153442f, + 0.889648f, 0.145142f, 0.894531f, 0.137451f, 0.899902f, 0.130249f, 0.903320f, 0.123535f, + 0.907715f, 0.117004f, 0.911621f, 0.111023f, 0.915039f, 0.105286f, 0.918457f, 0.099854f, + 0.923828f, 0.093994f, 0.926758f, 0.088501f, 0.931152f, 0.082947f, 0.934570f, 0.078064f, + 0.937988f, 0.073120f, 0.939941f, 0.068909f, 0.944824f, 0.064209f, 0.945801f, 0.060516f, + 0.949707f, 0.056488f, 0.951660f, 0.052734f, 0.954590f, 0.049194f, 0.956055f, 0.045837f, + 0.958984f, 0.042358f, 0.961426f, 0.039032f, 0.962402f, 0.036591f, 0.965820f, 0.033020f, + 0.966797f, 0.030685f, 0.969238f, 0.027573f, 0.972656f, 0.024414f, 0.973145f, 0.022232f, + 0.975098f, 0.019608f, 0.976562f, 0.014435f, 0.976074f, 0.010353f, 0.976562f, 0.003431f, + 0.000000f, 1.000000f, 0.156128f, 0.932129f, 0.267578f, 0.856445f, 0.353027f, 0.787109f, + 0.419922f, 0.727051f, 0.476074f, 0.672852f, 0.522949f, 0.624512f, 0.562988f, 0.581055f, + 0.597656f, 0.542480f, 0.627930f, 0.506836f, 0.654297f, 0.475342f, 0.676758f, 0.446045f, + 0.697754f, 0.419434f, 0.716797f, 0.394775f, 0.735352f, 0.371582f, 0.751953f, 0.349609f, + 0.765625f, 0.330078f, 0.778320f, 0.312012f, 0.789551f, 0.295166f, 0.800781f, 0.279053f, + 0.811523f, 0.263916f, 0.822266f, 0.249268f, 0.830078f, 0.236328f, 0.839844f, 0.223511f, + 0.847656f, 0.211548f, 0.855469f, 0.200317f, 0.861816f, 0.190063f, 0.868652f, 0.180176f, + 0.875977f, 0.170044f, 0.881348f, 0.161133f, 0.886230f, 0.152710f, 0.892090f, 0.144653f, + 0.895996f, 0.137451f, 0.902832f, 0.129395f, 0.906250f, 0.122375f, 0.912109f, 0.115112f, + 0.915527f, 0.109192f, 0.920410f, 0.102905f, 0.922852f, 0.097534f, 0.926270f, 0.092102f, + 0.930664f, 0.086914f, 0.932129f, 0.082336f, 0.937500f, 0.076965f, 0.940918f, 0.071777f, + 0.944336f, 0.067139f, 0.947266f, 0.062683f, 0.950195f, 0.058319f, 0.951660f, 0.054840f, + 0.955078f, 0.050842f, 0.958008f, 0.046997f, 0.960449f, 0.043640f, 0.961426f, 0.040894f, + 0.965332f, 0.036987f, 0.966797f, 0.034485f, 0.968262f, 0.031738f, 0.970703f, 0.028824f, + 0.972656f, 0.026047f, 0.974121f, 0.023590f, 0.976074f, 0.021194f, 0.978516f, 0.018341f, + 0.979492f, 0.016159f, 0.981445f, 0.013855f, 0.982422f, 0.008255f, 0.982422f, 0.003952f, + 0.000000f, 1.000000f, 0.157715f, 0.931641f, 0.271729f, 0.854492f, 0.358154f, 0.784668f, + 0.428223f, 0.721680f, 0.485840f, 0.666504f, 0.532227f, 0.617676f, 0.574219f, 0.573242f, + 0.606934f, 0.534668f, 0.637695f, 0.499023f, 0.665039f, 0.466309f, 0.688477f, 0.437012f, + 0.708984f, 0.409912f, 0.728027f, 0.385010f, 0.745605f, 0.361816f, 0.760742f, 0.340820f, + 0.774414f, 0.320801f, 0.788574f, 0.302246f, 0.801270f, 0.284912f, 0.812012f, 0.269043f, + 0.822754f, 0.253662f, 0.831055f, 0.240356f, 0.840820f, 0.226562f, 0.849121f, 0.213989f, + 0.856445f, 0.202759f, 0.864746f, 0.191162f, 0.871094f, 0.180664f, 0.876953f, 0.171143f, + 0.883789f, 0.161865f, 0.890137f, 0.152832f, 0.895020f, 0.144165f, 0.900879f, 0.135986f, + 0.906250f, 0.128418f, 0.908691f, 0.122192f, 0.914062f, 0.115112f, 0.918945f, 0.108215f, + 0.922852f, 0.101807f, 0.927734f, 0.095520f, 0.931641f, 0.090149f, 0.934570f, 0.084656f, + 0.937012f, 0.079956f, 0.939453f, 0.075500f, 0.942871f, 0.070679f, 0.945801f, 0.066650f, + 0.948730f, 0.062134f, 0.953613f, 0.056915f, 0.955078f, 0.053375f, 0.958008f, 0.049438f, + 0.961426f, 0.045441f, 0.962891f, 0.042084f, 0.965332f, 0.038757f, 0.967773f, 0.035767f, + 0.970215f, 0.032501f, 0.972168f, 0.029587f, 0.973633f, 0.027298f, 0.975586f, 0.024780f, + 0.978027f, 0.021866f, 0.979492f, 0.019547f, 0.980957f, 0.017548f, 0.982422f, 0.015434f, + 0.985352f, 0.012390f, 0.986328f, 0.010490f, 0.987793f, 0.008591f, 0.987305f, 0.001606f, + 0.000000f, 1.000000f, 0.158203f, 0.931641f, 0.274902f, 0.852539f, 0.364990f, 0.780762f, + 0.436279f, 0.717285f, 0.493408f, 0.661133f, 0.541504f, 0.611328f, 0.582031f, 0.566895f, + 0.618164f, 0.526855f, 0.648926f, 0.490967f, 0.674805f, 0.458008f, 0.698730f, 0.428223f, + 0.719238f, 0.400879f, 0.737793f, 0.375732f, 0.756348f, 0.352295f, 0.770996f, 0.331055f, + 0.785156f, 0.311523f, 0.799316f, 0.292480f, 0.809570f, 0.275879f, 0.822754f, 0.259277f, + 0.832031f, 0.244995f, 0.842285f, 0.230469f, 0.849121f, 0.217651f, 0.858398f, 0.205200f, + 0.865723f, 0.193604f, 0.872559f, 0.182739f, 0.879883f, 0.172607f, 0.886230f, 0.162476f, + 0.892090f, 0.153198f, 0.896973f, 0.144775f, 0.902832f, 0.136719f, 0.908691f, 0.128662f, + 0.914551f, 0.120911f, 0.917480f, 0.113953f, 0.921387f, 0.107544f, 0.925781f, 0.101135f, + 0.929199f, 0.095764f, 0.933105f, 0.089844f, 0.937012f, 0.083679f, 0.940430f, 0.078430f, + 0.944336f, 0.073486f, 0.946777f, 0.068665f, 0.949707f, 0.064392f, 0.951660f, 0.060516f, + 0.955566f, 0.056305f, 0.957031f, 0.052887f, 0.959473f, 0.049347f, 0.962891f, 0.045135f, + 0.966797f, 0.040771f, 0.968262f, 0.037537f, 0.970215f, 0.034515f, 0.972656f, 0.031403f, + 0.975586f, 0.028259f, 0.977051f, 0.025391f, 0.978027f, 0.023224f, 0.979980f, 0.020966f, + 0.981445f, 0.018677f, 0.984375f, 0.015701f, 0.985352f, 0.013809f, 0.986816f, 0.011986f, + 0.988281f, 0.010277f, 0.990723f, 0.007851f, 0.991699f, 0.005585f, 0.992676f, 0.003571f, + 0.000000f, 1.000000f, 0.161133f, 0.929688f, 0.278809f, 0.850586f, 0.370605f, 0.777344f, + 0.442383f, 0.712891f, 0.501465f, 0.655762f, 0.551758f, 0.604980f, 0.591797f, 0.559570f, + 0.628418f, 0.519043f, 0.658691f, 0.482422f, 0.685059f, 0.449707f, 0.709961f, 0.419189f, + 0.729980f, 0.391846f, 0.749512f, 0.366455f, 0.766113f, 0.343262f, 0.782715f, 0.321777f, + 0.795898f, 0.302002f, 0.810059f, 0.283447f, 0.819824f, 0.267090f, 0.830566f, 0.250732f, + 0.840332f, 0.236206f, 0.851074f, 0.221558f, 0.858398f, 0.209595f, 0.866699f, 0.196655f, + 0.874512f, 0.185181f, 0.880371f, 0.175049f, 0.888184f, 0.164062f, 0.893555f, 0.154907f, + 0.899414f, 0.145752f, 0.904785f, 0.137451f, 0.911133f, 0.128784f, 0.915039f, 0.121338f, + 0.919922f, 0.114441f, 0.923828f, 0.107666f, 0.928223f, 0.101013f, 0.932617f, 0.094666f, + 0.937012f, 0.088318f, 0.939941f, 0.083069f, 0.942871f, 0.078186f, 0.946289f, 0.073181f, + 0.949219f, 0.068359f, 0.952637f, 0.063416f, 0.955566f, 0.059052f, 0.959473f, 0.054321f, + 0.961426f, 0.050507f, 0.963379f, 0.047089f, 0.965332f, 0.043854f, 0.967773f, 0.040588f, + 0.969727f, 0.037262f, 0.970703f, 0.034882f, 0.974121f, 0.031403f, 0.976562f, 0.028198f, + 0.979004f, 0.024948f, 0.981934f, 0.021439f, 0.983398f, 0.019058f, 0.984863f, 0.017044f, + 0.986328f, 0.014915f, 0.987793f, 0.012901f, 0.990234f, 0.010391f, 0.991699f, 0.008072f, + 0.992676f, 0.006798f, 0.993652f, 0.005573f, 0.994629f, 0.004089f, 0.998535f, 0.000090f, + 0.000000f, 1.000000f, 0.161743f, 0.929688f, 0.280762f, 0.849609f, 0.374268f, 0.775391f, + 0.449463f, 0.708984f, 0.509277f, 0.650879f, 0.560547f, 0.598633f, 0.601074f, 0.553223f, + 0.636719f, 0.511719f, 0.667969f, 0.474854f, 0.696289f, 0.440918f, 0.718750f, 0.411377f, + 0.739258f, 0.383545f, 0.758789f, 0.358154f, 0.775879f, 0.335205f, 0.789551f, 0.314209f, + 0.803711f, 0.293945f, 0.817871f, 0.274658f, 0.831055f, 0.257324f, 0.838379f, 0.243164f, + 0.849609f, 0.227295f, 0.859375f, 0.213867f, 0.866699f, 0.200928f, 0.874023f, 0.189331f, + 0.882324f, 0.177490f, 0.889160f, 0.166626f, 0.895508f, 0.156982f, 0.901855f, 0.147339f, + 0.905273f, 0.139038f, 0.912109f, 0.130493f, 0.919434f, 0.121643f, 0.920898f, 0.114746f, + 0.925293f, 0.108765f, 0.931152f, 0.101074f, 0.936523f, 0.093201f, 0.936523f, 0.088928f, + 0.939941f, 0.084900f, 0.946289f, 0.077881f, 0.952637f, 0.070312f, 0.952637f, 0.066406f, + 0.952637f, 0.063599f, 0.952637f, 0.061371f, 0.960938f, 0.055145f, 0.968262f, 0.047913f, + 0.968262f, 0.044189f, 0.968262f, 0.041840f, 0.968262f, 0.040070f, 0.968262f, 0.038635f, + 0.971680f, 0.036346f, 0.979004f, 0.030014f, 0.983887f, 0.023743f, 0.983887f, 0.021423f, + 0.983887f, 0.019958f, 0.983887f, 0.018890f, 0.983887f, 0.018082f, 0.983887f, 0.017456f, + 0.983887f, 0.016953f, 0.987305f, 0.015465f, 0.999512f, 0.005238f, 0.999512f, 0.001760f, + 0.999512f, 0.000720f, 0.999512f, 0.000257f, 0.999512f, 0.000054f, 0.999512f, 0.000001f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996094f, + 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993164f, + 0.000000f, 0.992188f, 0.000000f, 0.990723f, 0.000000f, 0.990234f, 0.000000f, 0.989746f, + 0.000000f, 0.987793f, 0.000000f, 0.985840f, 0.000000f, 0.985352f, 0.000000f, 0.984375f, + 0.000000f, 0.982910f, 0.000000f, 0.979980f, 0.000000f, 0.978516f, 0.000000f, 0.977539f, + 0.000000f, 0.974609f, 0.000000f, 0.972656f, 0.000000f, 0.971191f, 0.000000f, 0.968262f, + 0.000000f, 0.965820f, 0.000000f, 0.963379f, 0.000000f, 0.959961f, 0.000000f, 0.956543f, + 0.000000f, 0.953613f, 0.000000f, 0.949707f, 0.000000f, 0.945801f, 0.000000f, 0.942383f, + 0.000000f, 0.936523f, 0.000000f, 0.932617f, 0.000000f, 0.926270f, 0.000000f, 0.920410f, + 0.000000f, 0.914062f, 0.000000f, 0.907227f, 0.000000f, 0.899902f, 0.000000f, 0.891602f, + 0.000000f, 0.881836f, 0.000000f, 0.871582f, 0.000000f, 0.860352f, 0.000000f, 0.847168f, + 0.000000f, 0.832520f, 0.000000f, 0.816406f, 0.000000f, 0.796875f, 0.000000f, 0.774902f, + 0.000000f, 0.749023f, 0.000000f, 0.717773f, 0.000000f, 0.680664f, 0.000000f, 0.633789f, + 0.000000f, 0.574219f, 0.000000f, 0.492676f, 0.000000f, 0.367188f, 0.000000f, 0.140137f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.992676f, + 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.990234f, 0.000000f, 0.988770f, + 0.000000f, 0.987793f, 0.000000f, 0.986328f, 0.000000f, 0.985352f, 0.000000f, 0.983887f, + 0.000000f, 0.982422f, 0.000000f, 0.980957f, 0.000000f, 0.978516f, 0.000000f, 0.976562f, + 0.000000f, 0.975098f, 0.000000f, 0.973145f, 0.000000f, 0.970703f, 0.000000f, 0.968262f, + 0.000000f, 0.965332f, 0.000000f, 0.962891f, 0.000000f, 0.959961f, 0.000000f, 0.956543f, + 0.000000f, 0.953613f, 0.000000f, 0.949707f, 0.000000f, 0.945801f, 0.000000f, 0.941406f, + 0.000000f, 0.937012f, 0.000000f, 0.931641f, 0.000000f, 0.927246f, 0.000000f, 0.920410f, + 0.000000f, 0.914062f, 0.000000f, 0.907227f, 0.000000f, 0.899902f, 0.000000f, 0.891602f, + 0.000000f, 0.881836f, 0.000000f, 0.871094f, 0.000000f, 0.859375f, 0.000000f, 0.847168f, + 0.000000f, 0.832520f, 0.000000f, 0.815918f, 0.000000f, 0.796387f, 0.000000f, 0.774902f, + 0.000000f, 0.749512f, 0.000000f, 0.718262f, 0.000000f, 0.680176f, 0.000000f, 0.633789f, + 0.000002f, 0.574219f, 0.000002f, 0.492432f, 0.000001f, 0.367920f, 0.000001f, 0.139648f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.995605f, 0.000000f, 0.994629f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, + 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.990234f, 0.000000f, 0.988770f, + 0.000000f, 0.987793f, 0.000000f, 0.986328f, 0.000000f, 0.984863f, 0.000000f, 0.983398f, + 0.000000f, 0.981934f, 0.000000f, 0.980469f, 0.000000f, 0.978516f, 0.000000f, 0.976562f, + 0.000000f, 0.974609f, 0.000000f, 0.972656f, 0.000000f, 0.970703f, 0.000000f, 0.967773f, + 0.000000f, 0.965332f, 0.000000f, 0.962402f, 0.000000f, 0.959473f, 0.000000f, 0.957031f, + 0.000000f, 0.952637f, 0.000000f, 0.949219f, 0.000000f, 0.944824f, 0.000000f, 0.940918f, + 0.000000f, 0.936523f, 0.000000f, 0.931641f, 0.000000f, 0.925781f, 0.000000f, 0.919922f, + 0.000000f, 0.913574f, 0.000000f, 0.906738f, 0.000000f, 0.899414f, 0.000000f, 0.890625f, + 0.000000f, 0.880859f, 0.000004f, 0.870605f, 0.000015f, 0.859375f, 0.000028f, 0.846680f, + 0.000034f, 0.832031f, 0.000036f, 0.814941f, 0.000035f, 0.795898f, 0.000032f, 0.773926f, + 0.000029f, 0.748535f, 0.000024f, 0.717285f, 0.000021f, 0.679688f, 0.000022f, 0.633301f, + 0.000019f, 0.573730f, 0.000018f, 0.492188f, 0.000014f, 0.367432f, 0.000011f, 0.139648f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, + 0.000000f, 0.995117f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, + 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.989258f, 0.000000f, 0.988770f, + 0.000000f, 0.987305f, 0.000000f, 0.985840f, 0.000000f, 0.984375f, 0.000000f, 0.983398f, + 0.000000f, 0.981445f, 0.000000f, 0.979492f, 0.000000f, 0.978516f, 0.000000f, 0.976074f, + 0.000000f, 0.974121f, 0.000000f, 0.972168f, 0.000000f, 0.969727f, 0.000000f, 0.967773f, + 0.000000f, 0.964355f, 0.000000f, 0.961426f, 0.000000f, 0.959473f, 0.000005f, 0.955566f, + 0.000016f, 0.952148f, 0.000031f, 0.948242f, 0.000048f, 0.943848f, 0.000066f, 0.939941f, + 0.000086f, 0.935547f, 0.000106f, 0.930664f, 0.000126f, 0.924805f, 0.000143f, 0.918945f, + 0.000147f, 0.912598f, 0.000148f, 0.905762f, 0.000146f, 0.897949f, 0.000139f, 0.889648f, + 0.000134f, 0.880371f, 0.000125f, 0.869629f, 0.000114f, 0.858398f, 0.000105f, 0.845215f, + 0.000097f, 0.830566f, 0.000101f, 0.813477f, 0.000109f, 0.794922f, 0.000100f, 0.772949f, + 0.000091f, 0.747070f, 0.000092f, 0.716309f, 0.000082f, 0.679199f, 0.000078f, 0.632324f, + 0.000073f, 0.572266f, 0.000067f, 0.491211f, 0.000064f, 0.367188f, 0.000046f, 0.139771f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, + 0.000000f, 0.994629f, 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, + 0.000000f, 0.991211f, 0.000000f, 0.990234f, 0.000000f, 0.989258f, 0.000000f, 0.987793f, + 0.000000f, 0.986816f, 0.000003f, 0.985840f, 0.000017f, 0.984375f, 0.000034f, 0.982422f, + 0.000059f, 0.980469f, 0.000081f, 0.979492f, 0.000108f, 0.977051f, 0.000135f, 0.975586f, + 0.000159f, 0.973633f, 0.000188f, 0.970703f, 0.000216f, 0.968750f, 0.000242f, 0.966309f, + 0.000268f, 0.964355f, 0.000298f, 0.960449f, 0.000324f, 0.957520f, 0.000348f, 0.954590f, + 0.000363f, 0.950684f, 0.000369f, 0.947266f, 0.000365f, 0.942871f, 0.000354f, 0.938965f, + 0.000342f, 0.934082f, 0.000332f, 0.929199f, 0.000316f, 0.923828f, 0.000298f, 0.917969f, + 0.000277f, 0.911133f, 0.000274f, 0.904297f, 0.000273f, 0.896973f, 0.000276f, 0.888184f, + 0.000283f, 0.878418f, 0.000287f, 0.868164f, 0.000278f, 0.856445f, 0.000261f, 0.843262f, + 0.000258f, 0.829102f, 0.000255f, 0.812012f, 0.000248f, 0.792969f, 0.000238f, 0.770996f, + 0.000245f, 0.745605f, 0.000226f, 0.714355f, 0.000214f, 0.677246f, 0.000220f, 0.631348f, + 0.000199f, 0.571777f, 0.000197f, 0.490234f, 0.000181f, 0.367188f, 0.000111f, 0.140015f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000018f, 0.995117f, + 0.000054f, 0.994141f, 0.000086f, 0.993164f, 0.000131f, 0.992676f, 0.000169f, 0.991699f, + 0.000204f, 0.990723f, 0.000250f, 0.989746f, 0.000289f, 0.988281f, 0.000323f, 0.987305f, + 0.000360f, 0.985840f, 0.000401f, 0.984863f, 0.000437f, 0.983398f, 0.000468f, 0.981934f, + 0.000498f, 0.979980f, 0.000537f, 0.978027f, 0.000571f, 0.976562f, 0.000600f, 0.974609f, + 0.000626f, 0.972168f, 0.000655f, 0.969727f, 0.000681f, 0.967773f, 0.000682f, 0.964844f, + 0.000671f, 0.962891f, 0.000651f, 0.959961f, 0.000630f, 0.956543f, 0.000613f, 0.952637f, + 0.000592f, 0.950195f, 0.000583f, 0.945312f, 0.000580f, 0.941406f, 0.000566f, 0.937500f, + 0.000577f, 0.932617f, 0.000588f, 0.927246f, 0.000599f, 0.921875f, 0.000609f, 0.916016f, + 0.000589f, 0.909180f, 0.000587f, 0.901855f, 0.000588f, 0.894531f, 0.000590f, 0.885742f, + 0.000592f, 0.876953f, 0.000561f, 0.866211f, 0.000566f, 0.854004f, 0.000570f, 0.841309f, + 0.000570f, 0.826660f, 0.000523f, 0.809570f, 0.000534f, 0.790527f, 0.000535f, 0.768555f, + 0.000530f, 0.743164f, 0.000490f, 0.712402f, 0.000494f, 0.675781f, 0.000496f, 0.629883f, + 0.000460f, 0.569824f, 0.000465f, 0.489746f, 0.000431f, 0.366455f, 0.000215f, 0.140747f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000034f, 0.998535f, 0.000105f, 0.998047f, 0.000179f, 0.998047f, 0.000242f, 0.997559f, + 0.000321f, 0.996582f, 0.000377f, 0.996582f, 0.000422f, 0.995605f, 0.000494f, 0.994629f, + 0.000547f, 0.993652f, 0.000589f, 0.993164f, 0.000623f, 0.991699f, 0.000685f, 0.990723f, + 0.000732f, 0.990723f, 0.000769f, 0.988770f, 0.000799f, 0.987793f, 0.000833f, 0.986816f, + 0.000883f, 0.984863f, 0.000921f, 0.983887f, 0.000951f, 0.982422f, 0.000976f, 0.980957f, + 0.000995f, 0.979004f, 0.001040f, 0.977051f, 0.001049f, 0.975586f, 0.001035f, 0.973633f, + 0.001019f, 0.971191f, 0.001002f, 0.968750f, 0.000999f, 0.965820f, 0.001013f, 0.963867f, + 0.001028f, 0.960938f, 0.001037f, 0.958496f, 0.001012f, 0.955078f, 0.001016f, 0.951172f, + 0.001028f, 0.947754f, 0.001055f, 0.944336f, 0.001077f, 0.939941f, 0.001045f, 0.935547f, + 0.001066f, 0.930664f, 0.001074f, 0.925293f, 0.001094f, 0.919434f, 0.001105f, 0.913574f, + 0.001054f, 0.906738f, 0.001059f, 0.899902f, 0.001075f, 0.892090f, 0.001079f, 0.883301f, + 0.001099f, 0.873535f, 0.001040f, 0.862793f, 0.001047f, 0.851562f, 0.001040f, 0.838867f, + 0.001055f, 0.823730f, 0.001065f, 0.807617f, 0.001009f, 0.787598f, 0.001009f, 0.766113f, + 0.000999f, 0.741211f, 0.000970f, 0.709961f, 0.000968f, 0.672852f, 0.000961f, 0.628418f, + 0.000938f, 0.568848f, 0.000925f, 0.488281f, 0.000850f, 0.365967f, 0.000363f, 0.140503f, + 0.000000f, 1.000000f, 0.000159f, 0.999512f, 0.000322f, 0.999023f, 0.000437f, 0.999023f, + 0.000506f, 0.998047f, 0.000640f, 0.998047f, 0.000697f, 0.997559f, 0.000728f, 0.996582f, + 0.000842f, 0.996582f, 0.000903f, 0.995605f, 0.000939f, 0.995117f, 0.000962f, 0.994629f, + 0.001044f, 0.993652f, 0.001104f, 0.992188f, 0.001141f, 0.991211f, 0.001163f, 0.990234f, + 0.001180f, 0.989258f, 0.001251f, 0.988281f, 0.001302f, 0.986816f, 0.001332f, 0.985352f, + 0.001365f, 0.984863f, 0.001410f, 0.982422f, 0.001454f, 0.980957f, 0.001515f, 0.979492f, + 0.001533f, 0.977539f, 0.001535f, 0.976562f, 0.001536f, 0.973633f, 0.001531f, 0.972168f, + 0.001554f, 0.969238f, 0.001606f, 0.967285f, 0.001576f, 0.964355f, 0.001588f, 0.961914f, + 0.001604f, 0.958984f, 0.001631f, 0.956543f, 0.001665f, 0.953125f, 0.001682f, 0.949219f, + 0.001745f, 0.945801f, 0.001764f, 0.941406f, 0.001770f, 0.937988f, 0.001768f, 0.933105f, + 0.001692f, 0.928223f, 0.001762f, 0.922852f, 0.001799f, 0.917480f, 0.001817f, 0.911133f, + 0.001830f, 0.904297f, 0.001735f, 0.896973f, 0.001764f, 0.889160f, 0.001809f, 0.880371f, + 0.001825f, 0.870605f, 0.001841f, 0.860352f, 0.001757f, 0.848633f, 0.001757f, 0.835449f, + 0.001792f, 0.820801f, 0.001830f, 0.804199f, 0.001735f, 0.785156f, 0.001721f, 0.763184f, + 0.001768f, 0.737793f, 0.001708f, 0.707031f, 0.001700f, 0.670410f, 0.001710f, 0.625488f, + 0.001684f, 0.566895f, 0.001637f, 0.487061f, 0.001467f, 0.365479f, 0.000550f, 0.140625f, + 0.000000f, 1.000000f, 0.000398f, 0.999512f, 0.000719f, 0.999023f, 0.000721f, 0.998535f, + 0.000972f, 0.998047f, 0.001002f, 0.997559f, 0.001008f, 0.997070f, 0.001189f, 0.996582f, + 0.001245f, 0.995605f, 0.001262f, 0.995117f, 0.001267f, 0.994629f, 0.001390f, 0.993652f, + 0.001467f, 0.992676f, 0.001500f, 0.992188f, 0.001550f, 0.990723f, 0.001600f, 0.989258f, + 0.001768f, 0.988770f, 0.001886f, 0.986816f, 0.001955f, 0.985840f, 0.002018f, 0.984375f, + 0.002026f, 0.982910f, 0.002022f, 0.982422f, 0.002131f, 0.979980f, 0.002163f, 0.978027f, + 0.002172f, 0.976074f, 0.002174f, 0.974121f, 0.002144f, 0.972168f, 0.002174f, 0.970215f, + 0.002327f, 0.967773f, 0.002388f, 0.964844f, 0.002445f, 0.962891f, 0.002411f, 0.959961f, + 0.002460f, 0.957031f, 0.002493f, 0.954102f, 0.002602f, 0.950684f, 0.002548f, 0.947266f, + 0.002590f, 0.942871f, 0.002619f, 0.938965f, 0.002628f, 0.935059f, 0.002674f, 0.930664f, + 0.002651f, 0.924805f, 0.002707f, 0.919922f, 0.002745f, 0.914062f, 0.002783f, 0.907715f, + 0.002790f, 0.900879f, 0.002678f, 0.894043f, 0.002783f, 0.885742f, 0.002857f, 0.876465f, + 0.002838f, 0.867188f, 0.002850f, 0.856445f, 0.002769f, 0.844727f, 0.002859f, 0.832031f, + 0.002855f, 0.816895f, 0.002897f, 0.800293f, 0.002804f, 0.781738f, 0.002853f, 0.760254f, + 0.002888f, 0.733887f, 0.002911f, 0.704590f, 0.002857f, 0.667969f, 0.002806f, 0.623047f, + 0.002777f, 0.564453f, 0.002665f, 0.485840f, 0.002314f, 0.364746f, 0.000779f, 0.141357f, + 0.000000f, 1.000000f, 0.000458f, 0.999512f, 0.000860f, 0.999023f, 0.000844f, 0.998535f, + 0.001191f, 0.998047f, 0.001191f, 0.997070f, 0.001182f, 0.997070f, 0.001469f, 0.996094f, + 0.001523f, 0.995117f, 0.001595f, 0.994629f, 0.001656f, 0.993652f, 0.001976f, 0.992676f, + 0.002085f, 0.991699f, 0.002150f, 0.990723f, 0.002230f, 0.990234f, 0.002295f, 0.988770f, + 0.002563f, 0.987305f, 0.002615f, 0.985840f, 0.002647f, 0.984375f, 0.002672f, 0.982910f, + 0.002666f, 0.981445f, 0.002691f, 0.979980f, 0.002972f, 0.978516f, 0.002972f, 0.976074f, + 0.003031f, 0.974609f, 0.003077f, 0.972168f, 0.003109f, 0.970703f, 0.003077f, 0.968262f, + 0.003345f, 0.965820f, 0.003441f, 0.962891f, 0.003519f, 0.960449f, 0.003437f, 0.957520f, + 0.003479f, 0.954590f, 0.003502f, 0.951172f, 0.003717f, 0.947754f, 0.003807f, 0.944336f, + 0.003733f, 0.940430f, 0.003765f, 0.936035f, 0.003820f, 0.932129f, 0.003891f, 0.927246f, + 0.004089f, 0.922363f, 0.003960f, 0.916016f, 0.004005f, 0.910645f, 0.004082f, 0.904297f, + 0.004158f, 0.897949f, 0.003998f, 0.890137f, 0.004150f, 0.881836f, 0.004223f, 0.872559f, + 0.004307f, 0.863281f, 0.004295f, 0.852539f, 0.004208f, 0.840820f, 0.004330f, 0.827637f, + 0.004326f, 0.812500f, 0.004425f, 0.795898f, 0.004318f, 0.776855f, 0.004375f, 0.755859f, + 0.004440f, 0.729980f, 0.004501f, 0.700195f, 0.004417f, 0.664062f, 0.004387f, 0.620117f, + 0.004280f, 0.562012f, 0.004047f, 0.484131f, 0.003397f, 0.363770f, 0.001074f, 0.141235f, + 0.000000f, 1.000000f, 0.000478f, 0.999512f, 0.000919f, 0.998535f, 0.000904f, 0.998535f, + 0.001349f, 0.997070f, 0.001458f, 0.997070f, 0.001559f, 0.996094f, 0.002010f, 0.995117f, + 0.002132f, 0.994629f, 0.002201f, 0.993652f, 0.002274f, 0.993164f, 0.002676f, 0.991699f, + 0.002764f, 0.990723f, 0.002811f, 0.989746f, 0.002909f, 0.988770f, 0.003040f, 0.987793f, + 0.003410f, 0.985840f, 0.003479f, 0.984375f, 0.003542f, 0.982910f, 0.003590f, 0.981445f, + 0.003674f, 0.979980f, 0.003641f, 0.978516f, 0.003983f, 0.976562f, 0.004086f, 0.974609f, + 0.004101f, 0.972656f, 0.004211f, 0.970215f, 0.004318f, 0.968262f, 0.004429f, 0.966309f, + 0.004593f, 0.963379f, 0.004669f, 0.960449f, 0.004787f, 0.957520f, 0.004868f, 0.955078f, + 0.004803f, 0.951660f, 0.004902f, 0.948730f, 0.005169f, 0.944824f, 0.005283f, 0.940918f, + 0.005405f, 0.937012f, 0.005348f, 0.932617f, 0.005363f, 0.928223f, 0.005447f, 0.923828f, + 0.005737f, 0.918457f, 0.005589f, 0.912598f, 0.005718f, 0.906250f, 0.005817f, 0.900391f, + 0.005882f, 0.893066f, 0.005898f, 0.886230f, 0.005989f, 0.877441f, 0.006130f, 0.868164f, + 0.006207f, 0.858398f, 0.006210f, 0.848145f, 0.006134f, 0.835938f, 0.006302f, 0.822754f, + 0.006485f, 0.807617f, 0.006466f, 0.791016f, 0.006367f, 0.772461f, 0.006432f, 0.751465f, + 0.006565f, 0.725586f, 0.006630f, 0.695801f, 0.006512f, 0.660156f, 0.006451f, 0.616699f, + 0.006264f, 0.559570f, 0.005821f, 0.482666f, 0.004738f, 0.363037f, 0.001392f, 0.140747f, + 0.000000f, 1.000000f, 0.000486f, 0.999512f, 0.001115f, 0.998535f, 0.001320f, 0.998047f, + 0.001421f, 0.997070f, 0.002012f, 0.996094f, 0.002111f, 0.996094f, 0.002163f, 0.994629f, + 0.002686f, 0.993652f, 0.002804f, 0.993164f, 0.002930f, 0.991699f, 0.003035f, 0.991211f, + 0.003607f, 0.989258f, 0.003769f, 0.988770f, 0.003878f, 0.987305f, 0.004002f, 0.986328f, + 0.004433f, 0.984863f, 0.004650f, 0.982910f, 0.004658f, 0.981445f, 0.004810f, 0.979492f, + 0.004826f, 0.978027f, 0.004917f, 0.976074f, 0.005276f, 0.974121f, 0.005463f, 0.972168f, + 0.005630f, 0.970215f, 0.005650f, 0.968262f, 0.005741f, 0.965820f, 0.006119f, 0.963379f, + 0.006325f, 0.960449f, 0.006336f, 0.957520f, 0.006454f, 0.954590f, 0.006588f, 0.951660f, + 0.006676f, 0.948730f, 0.006870f, 0.944824f, 0.007099f, 0.941406f, 0.007175f, 0.937012f, + 0.007301f, 0.933105f, 0.007301f, 0.929199f, 0.007362f, 0.924316f, 0.007454f, 0.919434f, + 0.007896f, 0.914062f, 0.008125f, 0.908203f, 0.007851f, 0.901855f, 0.008072f, 0.895020f, + 0.008247f, 0.888672f, 0.008469f, 0.880859f, 0.008415f, 0.872070f, 0.008560f, 0.863281f, + 0.008682f, 0.853027f, 0.008728f, 0.842285f, 0.008667f, 0.831055f, 0.008972f, 0.817383f, + 0.009171f, 0.802734f, 0.009171f, 0.786133f, 0.009056f, 0.767090f, 0.009224f, 0.746094f, + 0.009338f, 0.720703f, 0.009399f, 0.690918f, 0.009277f, 0.656250f, 0.009209f, 0.613281f, + 0.008881f, 0.556152f, 0.008018f, 0.479980f, 0.006344f, 0.361572f, 0.001750f, 0.140137f, + 0.000000f, 1.000000f, 0.000346f, 0.999512f, 0.001137f, 0.998535f, 0.001666f, 0.997559f, + 0.001896f, 0.997070f, 0.002428f, 0.995605f, 0.002546f, 0.995117f, 0.002865f, 0.994141f, + 0.003471f, 0.992676f, 0.003632f, 0.991699f, 0.003733f, 0.991211f, 0.003986f, 0.989746f, + 0.004597f, 0.988281f, 0.004780f, 0.986816f, 0.004925f, 0.985840f, 0.005161f, 0.984375f, + 0.005806f, 0.982910f, 0.006012f, 0.980957f, 0.006207f, 0.979980f, 0.006275f, 0.977539f, + 0.006344f, 0.976074f, 0.006508f, 0.973633f, 0.007065f, 0.971680f, 0.007107f, 0.969238f, + 0.007320f, 0.967285f, 0.007576f, 0.965332f, 0.007610f, 0.962891f, 0.008110f, 0.959961f, + 0.008354f, 0.957031f, 0.008522f, 0.954102f, 0.008598f, 0.951172f, 0.008766f, 0.948242f, + 0.008957f, 0.945312f, 0.009407f, 0.941406f, 0.009468f, 0.937012f, 0.009689f, 0.933105f, + 0.009804f, 0.928711f, 0.009987f, 0.924316f, 0.010010f, 0.920410f, 0.010437f, 0.914551f, + 0.010651f, 0.908691f, 0.010902f, 0.903320f, 0.010994f, 0.896973f, 0.010918f, 0.890137f, + 0.011215f, 0.883301f, 0.011658f, 0.875488f, 0.011513f, 0.866211f, 0.011780f, 0.856934f, + 0.012001f, 0.847656f, 0.012184f, 0.836914f, 0.012245f, 0.825195f, 0.012466f, 0.811523f, + 0.012611f, 0.796387f, 0.012634f, 0.779785f, 0.012840f, 0.761719f, 0.012894f, 0.740723f, + 0.012962f, 0.715332f, 0.012917f, 0.686035f, 0.012718f, 0.651855f, 0.012573f, 0.608887f, + 0.012062f, 0.553223f, 0.010689f, 0.478271f, 0.008224f, 0.360596f, 0.002150f, 0.138794f, + 0.000000f, 1.000000f, 0.000445f, 0.999512f, 0.000841f, 0.998535f, 0.001440f, 0.997559f, + 0.002459f, 0.996094f, 0.003067f, 0.995117f, 0.003235f, 0.994629f, 0.003654f, 0.993164f, + 0.004238f, 0.991699f, 0.004494f, 0.990723f, 0.004860f, 0.989746f, 0.005138f, 0.988281f, + 0.005749f, 0.986816f, 0.005981f, 0.985352f, 0.006237f, 0.984375f, 0.006649f, 0.982422f, + 0.006897f, 0.980957f, 0.007587f, 0.979004f, 0.007866f, 0.977539f, 0.008148f, 0.975586f, + 0.008362f, 0.974121f, 0.008499f, 0.971191f, 0.009018f, 0.968750f, 0.009354f, 0.966309f, + 0.009430f, 0.963867f, 0.009689f, 0.962402f, 0.010170f, 0.959473f, 0.010666f, 0.956543f, + 0.010933f, 0.953613f, 0.011169f, 0.950195f, 0.011406f, 0.947266f, 0.011528f, 0.944336f, + 0.011856f, 0.940430f, 0.012527f, 0.936523f, 0.012489f, 0.932129f, 0.012817f, 0.928223f, + 0.013138f, 0.924316f, 0.013268f, 0.919434f, 0.013329f, 0.914551f, 0.014114f, 0.909180f, + 0.014297f, 0.902832f, 0.014488f, 0.896973f, 0.014915f, 0.891113f, 0.014633f, 0.883789f, + 0.014999f, 0.876953f, 0.015823f, 0.869141f, 0.015915f, 0.859863f, 0.015991f, 0.851074f, + 0.016205f, 0.840820f, 0.016357f, 0.830566f, 0.016586f, 0.818359f, 0.016861f, 0.804199f, + 0.017090f, 0.789551f, 0.017365f, 0.773926f, 0.017380f, 0.755371f, 0.017532f, 0.733887f, + 0.017487f, 0.708984f, 0.017639f, 0.681152f, 0.017044f, 0.646484f, 0.016693f, 0.604492f, + 0.015839f, 0.549316f, 0.013962f, 0.476074f, 0.010414f, 0.359375f, 0.002602f, 0.138428f, + 0.000000f, 1.000000f, 0.000567f, 0.999512f, 0.001287f, 0.998535f, 0.001986f, 0.997559f, + 0.003025f, 0.996094f, 0.003273f, 0.995117f, 0.003963f, 0.993652f, 0.004589f, 0.992188f, + 0.004883f, 0.991211f, 0.005531f, 0.989746f, 0.006042f, 0.987793f, 0.006466f, 0.986328f, + 0.007206f, 0.984863f, 0.007431f, 0.983398f, 0.007710f, 0.981934f, 0.008362f, 0.979980f, + 0.008751f, 0.978516f, 0.009453f, 0.976074f, 0.009796f, 0.974609f, 0.010170f, 0.973145f, + 0.010765f, 0.970703f, 0.010979f, 0.968262f, 0.011597f, 0.965332f, 0.012001f, 0.963379f, + 0.012146f, 0.960449f, 0.012527f, 0.958496f, 0.012993f, 0.955078f, 0.013840f, 0.952148f, + 0.014061f, 0.949219f, 0.014412f, 0.946289f, 0.014709f, 0.942871f, 0.014755f, 0.938965f, + 0.015503f, 0.935547f, 0.016220f, 0.931641f, 0.016678f, 0.927246f, 0.016678f, 0.922852f, + 0.017090f, 0.918457f, 0.017548f, 0.914062f, 0.017929f, 0.908203f, 0.018402f, 0.902344f, + 0.018784f, 0.896973f, 0.019119f, 0.890625f, 0.019592f, 0.884277f, 0.019775f, 0.877930f, + 0.020081f, 0.870117f, 0.020844f, 0.861816f, 0.021286f, 0.853516f, 0.021210f, 0.843750f, + 0.021576f, 0.833496f, 0.022064f, 0.823730f, 0.022598f, 0.811035f, 0.022675f, 0.796875f, + 0.023010f, 0.782715f, 0.023300f, 0.766602f, 0.023331f, 0.748535f, 0.023422f, 0.727051f, + 0.023621f, 0.702637f, 0.023300f, 0.674805f, 0.022552f, 0.641602f, 0.022049f, 0.599609f, + 0.020660f, 0.545898f, 0.017868f, 0.473389f, 0.013100f, 0.357910f, 0.003113f, 0.138184f, + 0.000000f, 1.000000f, 0.000884f, 0.999023f, 0.001711f, 0.998047f, 0.001951f, 0.997070f, + 0.003389f, 0.995605f, 0.004044f, 0.994141f, 0.004463f, 0.993164f, 0.005726f, 0.991211f, + 0.006020f, 0.989746f, 0.006794f, 0.988770f, 0.007607f, 0.986328f, 0.007980f, 0.984375f, + 0.008392f, 0.983398f, 0.009178f, 0.981445f, 0.009590f, 0.979980f, 0.010414f, 0.977539f, + 0.010872f, 0.975586f, 0.011703f, 0.973633f, 0.012115f, 0.971680f, 0.012619f, 0.969727f, + 0.013443f, 0.967285f, 0.013969f, 0.964844f, 0.014908f, 0.962402f, 0.014900f, 0.959473f, + 0.015396f, 0.957031f, 0.016006f, 0.953613f, 0.016602f, 0.950684f, 0.017349f, 0.947266f, + 0.017944f, 0.944336f, 0.018280f, 0.940918f, 0.018692f, 0.937988f, 0.019394f, 0.934082f, + 0.019684f, 0.929688f, 0.020737f, 0.925293f, 0.021286f, 0.921387f, 0.021835f, 0.916992f, + 0.021912f, 0.912109f, 0.022522f, 0.907715f, 0.023224f, 0.901855f, 0.023865f, 0.895996f, + 0.024429f, 0.889648f, 0.024933f, 0.883789f, 0.025391f, 0.877441f, 0.025742f, 0.871094f, + 0.026443f, 0.862305f, 0.027206f, 0.853516f, 0.027985f, 0.845703f, 0.027512f, 0.835938f, + 0.028564f, 0.826172f, 0.028915f, 0.815430f, 0.029648f, 0.802734f, 0.029831f, 0.789062f, + 0.030258f, 0.774414f, 0.030441f, 0.758789f, 0.030350f, 0.741211f, 0.030777f, 0.719727f, + 0.030792f, 0.695801f, 0.030304f, 0.668457f, 0.029510f, 0.635742f, 0.028397f, 0.593750f, + 0.026428f, 0.541016f, 0.022705f, 0.470947f, 0.016251f, 0.356689f, 0.003714f, 0.137451f, + 0.000000f, 1.000000f, 0.000584f, 0.999512f, 0.002298f, 0.997559f, 0.002819f, 0.997070f, + 0.003706f, 0.995117f, 0.004578f, 0.993652f, 0.005592f, 0.991699f, 0.006565f, 0.990234f, + 0.007416f, 0.988281f, 0.007896f, 0.987305f, 0.009377f, 0.984375f, 0.009865f, 0.982422f, + 0.010300f, 0.981445f, 0.011208f, 0.979492f, 0.011887f, 0.977051f, 0.012871f, 0.974609f, + 0.013397f, 0.972656f, 0.013908f, 0.970703f, 0.014862f, 0.968262f, 0.015945f, 0.965820f, + 0.016617f, 0.962891f, 0.017258f, 0.960449f, 0.018311f, 0.958008f, 0.018890f, 0.955566f, + 0.019394f, 0.952637f, 0.020203f, 0.948730f, 0.020676f, 0.945312f, 0.021805f, 0.942383f, + 0.022247f, 0.938477f, 0.022995f, 0.935547f, 0.023529f, 0.932129f, 0.024750f, 0.927734f, + 0.025192f, 0.923340f, 0.025940f, 0.918457f, 0.026810f, 0.914551f, 0.027481f, 0.910156f, + 0.027878f, 0.905762f, 0.028824f, 0.899902f, 0.029724f, 0.894043f, 0.030685f, 0.888184f, + 0.031128f, 0.882324f, 0.031830f, 0.875977f, 0.032349f, 0.869629f, 0.033325f, 0.861816f, + 0.033875f, 0.854004f, 0.034576f, 0.845215f, 0.035461f, 0.836914f, 0.036560f, 0.828125f, + 0.036255f, 0.817871f, 0.037048f, 0.806152f, 0.038361f, 0.793945f, 0.038666f, 0.780762f, + 0.038910f, 0.766602f, 0.039032f, 0.750977f, 0.039368f, 0.732910f, 0.039459f, 0.711914f, + 0.039429f, 0.688477f, 0.038910f, 0.661621f, 0.037628f, 0.630371f, 0.036163f, 0.588867f, + 0.033325f, 0.537598f, 0.028214f, 0.468262f, 0.019897f, 0.354980f, 0.004387f, 0.137207f, + 0.000000f, 1.000000f, 0.000891f, 0.999023f, 0.002415f, 0.997559f, 0.003820f, 0.996094f, + 0.004219f, 0.994629f, 0.005196f, 0.993164f, 0.006588f, 0.990723f, 0.008102f, 0.988770f, + 0.008575f, 0.986816f, 0.009933f, 0.984863f, 0.010605f, 0.982910f, 0.012047f, 0.980469f, + 0.012604f, 0.978516f, 0.013466f, 0.976562f, 0.014641f, 0.973633f, 0.015793f, 0.971191f, + 0.016373f, 0.968750f, 0.017044f, 0.966797f, 0.018417f, 0.964355f, 0.019623f, 0.960938f, + 0.020416f, 0.958008f, 0.021164f, 0.955566f, 0.021912f, 0.953125f, 0.023056f, 0.950195f, + 0.024231f, 0.946777f, 0.025192f, 0.943359f, 0.025818f, 0.939453f, 0.026382f, 0.936035f, + 0.027679f, 0.932617f, 0.028244f, 0.928711f, 0.029495f, 0.924805f, 0.030594f, 0.920410f, + 0.031647f, 0.916504f, 0.032593f, 0.911621f, 0.033081f, 0.906738f, 0.034149f, 0.902344f, + 0.035248f, 0.897461f, 0.036316f, 0.891602f, 0.037109f, 0.885742f, 0.038513f, 0.879883f, + 0.039307f, 0.873535f, 0.039673f, 0.867188f, 0.040680f, 0.860352f, 0.041687f, 0.852539f, + 0.042542f, 0.844727f, 0.043793f, 0.836426f, 0.044586f, 0.827637f, 0.045471f, 0.818359f, + 0.045532f, 0.808594f, 0.047180f, 0.796875f, 0.048004f, 0.784668f, 0.048340f, 0.771484f, + 0.048523f, 0.757324f, 0.049103f, 0.742188f, 0.049530f, 0.724121f, 0.049683f, 0.703125f, + 0.049164f, 0.680664f, 0.048218f, 0.654297f, 0.046448f, 0.623047f, 0.044464f, 0.582520f, + 0.041016f, 0.532715f, 0.034302f, 0.465332f, 0.024048f, 0.353760f, 0.005123f, 0.136719f, + 0.000000f, 1.000000f, 0.001649f, 0.998535f, 0.002653f, 0.997559f, 0.003967f, 0.995605f, + 0.005466f, 0.993652f, 0.006485f, 0.991699f, 0.007828f, 0.989746f, 0.009010f, 0.987793f, + 0.010452f, 0.985352f, 0.012352f, 0.982422f, 0.013054f, 0.979980f, 0.014214f, 0.978027f, + 0.015335f, 0.975586f, 0.016678f, 0.972656f, 0.017548f, 0.970215f, 0.019211f, 0.967285f, + 0.020004f, 0.964844f, 0.020721f, 0.962891f, 0.022217f, 0.958984f, 0.023972f, 0.956055f, + 0.024918f, 0.953125f, 0.025787f, 0.950195f, 0.026688f, 0.947754f, 0.028519f, 0.943848f, + 0.029663f, 0.940430f, 0.031082f, 0.937012f, 0.031830f, 0.933105f, 0.032562f, 0.929688f, + 0.033691f, 0.925781f, 0.035278f, 0.921387f, 0.036530f, 0.916504f, 0.037811f, 0.912109f, + 0.038727f, 0.908203f, 0.040344f, 0.903809f, 0.041077f, 0.898926f, 0.042023f, 0.893555f, + 0.043884f, 0.888184f, 0.045135f, 0.882324f, 0.045746f, 0.876465f, 0.047089f, 0.870117f, + 0.048584f, 0.864746f, 0.049011f, 0.857910f, 0.050323f, 0.850098f, 0.052094f, 0.842773f, + 0.052979f, 0.834473f, 0.054321f, 0.826172f, 0.054962f, 0.817383f, 0.056122f, 0.808594f, + 0.057281f, 0.798340f, 0.057892f, 0.786133f, 0.058990f, 0.773926f, 0.059723f, 0.761719f, + 0.059998f, 0.747559f, 0.060394f, 0.732910f, 0.060944f, 0.714355f, 0.060608f, 0.694336f, + 0.060394f, 0.672363f, 0.058990f, 0.646973f, 0.056885f, 0.615723f, 0.054199f, 0.576660f, + 0.049194f, 0.527832f, 0.041016f, 0.462158f, 0.028503f, 0.352051f, 0.005947f, 0.136230f, + 0.000000f, 1.000000f, 0.001497f, 0.998535f, 0.003502f, 0.997070f, 0.004753f, 0.995117f, + 0.006893f, 0.992676f, 0.008080f, 0.990234f, 0.009911f, 0.987793f, 0.010658f, 0.985840f, + 0.012436f, 0.983398f, 0.014671f, 0.979980f, 0.015594f, 0.978027f, 0.017273f, 0.975098f, + 0.018555f, 0.972168f, 0.020477f, 0.968750f, 0.021515f, 0.965820f, 0.022858f, 0.963379f, + 0.024246f, 0.960449f, 0.025681f, 0.957031f, 0.027191f, 0.953613f, 0.029160f, 0.950195f, + 0.030243f, 0.947266f, 0.031281f, 0.944336f, 0.032684f, 0.940918f, 0.034790f, 0.936523f, + 0.036102f, 0.933105f, 0.037720f, 0.929199f, 0.038940f, 0.925781f, 0.040161f, 0.922363f, + 0.041534f, 0.917480f, 0.043030f, 0.912598f, 0.044830f, 0.907715f, 0.045929f, 0.903320f, + 0.047363f, 0.898926f, 0.048859f, 0.894531f, 0.050537f, 0.889648f, 0.051971f, 0.883301f, + 0.053345f, 0.877441f, 0.054749f, 0.872070f, 0.056091f, 0.866211f, 0.057312f, 0.859863f, + 0.058716f, 0.854004f, 0.060486f, 0.846680f, 0.061951f, 0.838867f, 0.063354f, 0.831055f, + 0.065125f, 0.823730f, 0.066040f, 0.815430f, 0.067017f, 0.807129f, 0.068054f, 0.796875f, + 0.069946f, 0.786621f, 0.070374f, 0.774902f, 0.072144f, 0.763672f, 0.072388f, 0.750977f, + 0.072632f, 0.737793f, 0.073303f, 0.722168f, 0.073547f, 0.704590f, 0.073547f, 0.685059f, + 0.072021f, 0.663086f, 0.070496f, 0.639160f, 0.068604f, 0.608398f, 0.064697f, 0.570312f, + 0.058472f, 0.523438f, 0.048737f, 0.458496f, 0.033386f, 0.349854f, 0.006901f, 0.135986f, + 0.000000f, 1.000000f, 0.002352f, 0.998047f, 0.004051f, 0.996582f, 0.006329f, 0.994141f, + 0.007641f, 0.992188f, 0.009933f, 0.988770f, 0.011406f, 0.986328f, 0.013268f, 0.983887f, + 0.014984f, 0.980957f, 0.016663f, 0.977539f, 0.019104f, 0.974609f, 0.020081f, 0.971680f, + 0.022980f, 0.967285f, 0.024582f, 0.964355f, 0.026245f, 0.960938f, 0.027771f, 0.958008f, + 0.029709f, 0.954590f, 0.031464f, 0.950684f, 0.033142f, 0.947266f, 0.034454f, 0.943848f, + 0.036621f, 0.939941f, 0.038086f, 0.936523f, 0.039948f, 0.932617f, 0.041840f, 0.928223f, + 0.044128f, 0.924316f, 0.045563f, 0.920410f, 0.046997f, 0.916992f, 0.048950f, 0.912598f, + 0.051483f, 0.907715f, 0.052490f, 0.902832f, 0.054199f, 0.897949f, 0.055817f, 0.893066f, + 0.057068f, 0.888672f, 0.059265f, 0.883789f, 0.061432f, 0.877930f, 0.063354f, 0.872559f, + 0.064636f, 0.866211f, 0.066162f, 0.860352f, 0.067749f, 0.854980f, 0.069641f, 0.849121f, + 0.071167f, 0.841309f, 0.073364f, 0.833984f, 0.074890f, 0.826660f, 0.076477f, 0.819336f, + 0.078064f, 0.811523f, 0.079346f, 0.803711f, 0.080505f, 0.794922f, 0.082031f, 0.784180f, + 0.083984f, 0.773926f, 0.085083f, 0.763672f, 0.085693f, 0.751465f, 0.086121f, 0.739746f, + 0.086609f, 0.726562f, 0.087463f, 0.710449f, 0.087646f, 0.693848f, 0.087036f, 0.675293f, + 0.085266f, 0.654785f, 0.083252f, 0.631348f, 0.080750f, 0.600098f, 0.075928f, 0.563965f, + 0.068420f, 0.518555f, 0.056946f, 0.454102f, 0.038483f, 0.347900f, 0.007858f, 0.135254f, + 0.000000f, 1.000000f, 0.002439f, 0.998535f, 0.004707f, 0.996094f, 0.007305f, 0.993164f, + 0.009239f, 0.990723f, 0.011810f, 0.987305f, 0.014412f, 0.983887f, 0.016037f, 0.981445f, + 0.018570f, 0.977051f, 0.020294f, 0.974121f, 0.022430f, 0.971191f, 0.025345f, 0.966797f, + 0.027817f, 0.962891f, 0.030121f, 0.958984f, 0.031433f, 0.955566f, 0.033508f, 0.952148f, + 0.036346f, 0.947266f, 0.038422f, 0.943359f, 0.040344f, 0.939453f, 0.041809f, 0.936523f, + 0.044434f, 0.932129f, 0.046875f, 0.927246f, 0.049011f, 0.923340f, 0.050720f, 0.919434f, + 0.053223f, 0.915039f, 0.054840f, 0.911133f, 0.057068f, 0.906250f, 0.059387f, 0.901367f, + 0.061646f, 0.896973f, 0.063904f, 0.892090f, 0.065430f, 0.886719f, 0.066895f, 0.882324f, + 0.069092f, 0.876953f, 0.071289f, 0.871094f, 0.074158f, 0.865234f, 0.075867f, 0.859375f, + 0.078308f, 0.854004f, 0.079285f, 0.848145f, 0.080994f, 0.842285f, 0.083862f, 0.835449f, + 0.086243f, 0.828125f, 0.087585f, 0.820801f, 0.089966f, 0.813477f, 0.091187f, 0.806152f, + 0.092896f, 0.798340f, 0.094604f, 0.791016f, 0.096069f, 0.780762f, 0.098022f, 0.770996f, + 0.099365f, 0.760742f, 0.100098f, 0.750977f, 0.101135f, 0.739258f, 0.102356f, 0.729004f, + 0.103210f, 0.714355f, 0.103210f, 0.698730f, 0.102417f, 0.682617f, 0.101868f, 0.664551f, + 0.099792f, 0.645508f, 0.097229f, 0.621094f, 0.093933f, 0.591797f, 0.087463f, 0.556641f, + 0.078369f, 0.513184f, 0.065491f, 0.449707f, 0.044067f, 0.346436f, 0.008972f, 0.134521f, + 0.000000f, 1.000000f, 0.003529f, 0.997559f, 0.005974f, 0.995117f, 0.009094f, 0.991699f, + 0.011642f, 0.988770f, 0.014702f, 0.984863f, 0.017014f, 0.981445f, 0.020248f, 0.977539f, + 0.022858f, 0.973145f, 0.025253f, 0.969727f, 0.027954f, 0.965820f, 0.030640f, 0.960938f, + 0.033264f, 0.957031f, 0.035858f, 0.953125f, 0.038605f, 0.948730f, 0.041321f, 0.943848f, + 0.044556f, 0.939453f, 0.046326f, 0.935547f, 0.048950f, 0.931152f, 0.051178f, 0.927246f, + 0.054169f, 0.921875f, 0.057037f, 0.916992f, 0.059387f, 0.912598f, 0.061249f, 0.908691f, + 0.063049f, 0.904785f, 0.066833f, 0.898926f, 0.069458f, 0.893555f, 0.071594f, 0.889160f, + 0.074036f, 0.884277f, 0.076477f, 0.879395f, 0.078918f, 0.875000f, 0.080994f, 0.869141f, + 0.083435f, 0.862793f, 0.086060f, 0.857422f, 0.088440f, 0.851074f, 0.091003f, 0.845703f, + 0.092834f, 0.840332f, 0.094604f, 0.834961f, 0.097046f, 0.827637f, 0.099915f, 0.820312f, + 0.101990f, 0.812988f, 0.104065f, 0.806152f, 0.105774f, 0.799316f, 0.107361f, 0.792480f, + 0.109558f, 0.784668f, 0.111511f, 0.774902f, 0.113464f, 0.766113f, 0.115112f, 0.756348f, + 0.116272f, 0.747070f, 0.117432f, 0.737305f, 0.117615f, 0.727051f, 0.119019f, 0.714355f, + 0.119812f, 0.700684f, 0.119629f, 0.686035f, 0.119202f, 0.671387f, 0.117493f, 0.654297f, + 0.114807f, 0.635742f, 0.112305f, 0.611816f, 0.107849f, 0.583984f, 0.100586f, 0.549805f, + 0.089844f, 0.508301f, 0.074646f, 0.445312f, 0.049500f, 0.344727f, 0.009995f, 0.133423f, + 0.000000f, 1.000000f, 0.004250f, 0.997070f, 0.007221f, 0.994141f, 0.010933f, 0.990723f, + 0.014549f, 0.986328f, 0.017883f, 0.982422f, 0.020493f, 0.978516f, 0.024826f, 0.973145f, + 0.027710f, 0.969238f, 0.030869f, 0.964844f, 0.034729f, 0.958984f, 0.038239f, 0.954102f, + 0.040649f, 0.950195f, 0.043274f, 0.946289f, 0.047821f, 0.939453f, 0.050964f, 0.934570f, + 0.053497f, 0.930664f, 0.056427f, 0.925781f, 0.059631f, 0.920410f, 0.063293f, 0.915039f, + 0.066406f, 0.910156f, 0.068665f, 0.905762f, 0.071655f, 0.900879f, 0.073975f, 0.895996f, + 0.077148f, 0.890625f, 0.080872f, 0.884766f, 0.083618f, 0.879395f, 0.086304f, 0.875000f, + 0.088501f, 0.870117f, 0.091248f, 0.865723f, 0.094971f, 0.858887f, 0.097839f, 0.853516f, + 0.099976f, 0.847656f, 0.102356f, 0.841797f, 0.105164f, 0.835938f, 0.107422f, 0.830566f, + 0.109802f, 0.824219f, 0.113098f, 0.817871f, 0.115723f, 0.811035f, 0.117920f, 0.803711f, + 0.120361f, 0.797363f, 0.122375f, 0.790527f, 0.123962f, 0.784180f, 0.125977f, 0.776367f, + 0.128540f, 0.767578f, 0.130493f, 0.758789f, 0.132568f, 0.750977f, 0.133667f, 0.741699f, + 0.134888f, 0.732910f, 0.135742f, 0.723633f, 0.136719f, 0.712402f, 0.137451f, 0.699707f, + 0.137817f, 0.687500f, 0.137085f, 0.673340f, 0.136108f, 0.659180f, 0.133911f, 0.643555f, + 0.130981f, 0.624023f, 0.127563f, 0.601074f, 0.121948f, 0.574707f, 0.113342f, 0.542969f, + 0.100891f, 0.503418f, 0.083862f, 0.440430f, 0.055878f, 0.343750f, 0.011185f, 0.132202f, + 0.000000f, 1.000000f, 0.005173f, 0.997070f, 0.009926f, 0.992676f, 0.013885f, 0.988770f, + 0.018921f, 0.983398f, 0.022049f, 0.979004f, 0.026917f, 0.973145f, 0.031281f, 0.967773f, + 0.034454f, 0.963379f, 0.038971f, 0.957520f, 0.043365f, 0.951660f, 0.046631f, 0.946777f, + 0.050751f, 0.941406f, 0.054413f, 0.935547f, 0.057861f, 0.930176f, 0.062195f, 0.924316f, + 0.065369f, 0.919434f, 0.069702f, 0.913086f, 0.073853f, 0.907227f, 0.076843f, 0.901855f, + 0.080200f, 0.896973f, 0.083008f, 0.892090f, 0.086792f, 0.886230f, 0.090820f, 0.879883f, + 0.093872f, 0.874512f, 0.097290f, 0.869141f, 0.100220f, 0.864258f, 0.102966f, 0.859375f, + 0.106567f, 0.853027f, 0.109802f, 0.847168f, 0.113708f, 0.841309f, 0.116699f, 0.835938f, + 0.119202f, 0.830566f, 0.121277f, 0.825195f, 0.123718f, 0.819824f, 0.127686f, 0.812500f, + 0.130615f, 0.805176f, 0.133301f, 0.799316f, 0.135864f, 0.793457f, 0.138306f, 0.787109f, + 0.139893f, 0.780273f, 0.142212f, 0.774414f, 0.145264f, 0.766113f, 0.147217f, 0.758301f, + 0.149414f, 0.750488f, 0.151733f, 0.742188f, 0.152222f, 0.734375f, 0.153931f, 0.726562f, + 0.154297f, 0.718262f, 0.156250f, 0.707520f, 0.157349f, 0.696289f, 0.157104f, 0.684570f, + 0.157593f, 0.673340f, 0.155640f, 0.660645f, 0.154419f, 0.647461f, 0.151489f, 0.631836f, + 0.148682f, 0.611816f, 0.143799f, 0.590332f, 0.137329f, 0.565918f, 0.126709f, 0.535645f, + 0.112793f, 0.496826f, 0.093506f, 0.435303f, 0.062134f, 0.342285f, 0.012444f, 0.131714f, + 0.000000f, 1.000000f, 0.006569f, 0.996094f, 0.012505f, 0.991211f, 0.017624f, 0.985352f, + 0.023590f, 0.979980f, 0.028275f, 0.974121f, 0.033844f, 0.967773f, 0.038513f, 0.961914f, + 0.044373f, 0.955078f, 0.049347f, 0.948242f, 0.053589f, 0.942871f, 0.058655f, 0.936035f, + 0.063782f, 0.929199f, 0.068542f, 0.923340f, 0.071411f, 0.917969f, 0.075806f, 0.912109f, + 0.081299f, 0.904785f, 0.085266f, 0.898438f, 0.089966f, 0.892578f, 0.093567f, 0.887207f, + 0.097473f, 0.881348f, 0.102356f, 0.874512f, 0.106567f, 0.868164f, 0.109802f, 0.862793f, + 0.112976f, 0.857422f, 0.116394f, 0.852051f, 0.120117f, 0.845703f, 0.124756f, 0.838867f, + 0.128052f, 0.833496f, 0.131226f, 0.828125f, 0.135132f, 0.822266f, 0.137695f, 0.817383f, + 0.140503f, 0.812500f, 0.144409f, 0.805176f, 0.147095f, 0.798828f, 0.150757f, 0.791504f, + 0.152954f, 0.785645f, 0.155762f, 0.779785f, 0.157959f, 0.774414f, 0.160645f, 0.769043f, + 0.162842f, 0.761230f, 0.166138f, 0.753418f, 0.168213f, 0.746094f, 0.170532f, 0.739258f, + 0.172363f, 0.732422f, 0.173218f, 0.724609f, 0.174683f, 0.717773f, 0.175659f, 0.709961f, + 0.176758f, 0.699707f, 0.178589f, 0.689941f, 0.178589f, 0.679688f, 0.177856f, 0.669434f, + 0.177124f, 0.658691f, 0.174927f, 0.647949f, 0.172729f, 0.634766f, 0.170776f, 0.617676f, + 0.166870f, 0.600098f, 0.160645f, 0.579590f, 0.152466f, 0.557129f, 0.140869f, 0.529785f, + 0.125854f, 0.489014f, 0.104065f, 0.431885f, 0.068237f, 0.339844f, 0.013725f, 0.130493f, + 0.000000f, 1.000000f, 0.007759f, 0.995605f, 0.015671f, 0.989258f, 0.023575f, 0.981445f, + 0.029465f, 0.975586f, 0.037933f, 0.966797f, 0.043427f, 0.960449f, 0.050018f, 0.952148f, + 0.056335f, 0.944824f, 0.062500f, 0.937988f, 0.068481f, 0.930176f, 0.074158f, 0.922363f, + 0.079895f, 0.915527f, 0.084900f, 0.909668f, 0.090332f, 0.901367f, 0.095703f, 0.894043f, + 0.100891f, 0.887695f, 0.104919f, 0.881836f, 0.109680f, 0.875000f, 0.115845f, 0.866699f, + 0.120544f, 0.860352f, 0.124084f, 0.854492f, 0.128784f, 0.848633f, 0.131958f, 0.843262f, + 0.136841f, 0.835938f, 0.141357f, 0.829590f, 0.145264f, 0.823242f, 0.149414f, 0.817383f, + 0.152466f, 0.812012f, 0.155029f, 0.807129f, 0.159058f, 0.800781f, 0.163452f, 0.794434f, + 0.167358f, 0.788086f, 0.170410f, 0.782227f, 0.172974f, 0.776855f, 0.175781f, 0.770508f, + 0.177979f, 0.765137f, 0.179688f, 0.759766f, 0.183594f, 0.752441f, 0.186890f, 0.745605f, + 0.190186f, 0.739258f, 0.191528f, 0.732422f, 0.193237f, 0.726074f, 0.194580f, 0.719727f, + 0.196289f, 0.713867f, 0.196655f, 0.707031f, 0.199219f, 0.698242f, 0.200073f, 0.689453f, + 0.200806f, 0.681152f, 0.201050f, 0.671875f, 0.200928f, 0.663574f, 0.200195f, 0.654785f, + 0.197754f, 0.644531f, 0.195801f, 0.633789f, 0.193848f, 0.619141f, 0.190430f, 0.604004f, + 0.185303f, 0.587891f, 0.177979f, 0.569824f, 0.168091f, 0.548340f, 0.154663f, 0.521973f, + 0.138916f, 0.481201f, 0.114075f, 0.427246f, 0.075012f, 0.338623f, 0.015144f, 0.130371f, + 0.000000f, 1.000000f, 0.009789f, 0.995117f, 0.020401f, 0.986816f, 0.030792f, 0.977539f, + 0.040192f, 0.967773f, 0.048706f, 0.958984f, 0.057617f, 0.949219f, 0.065247f, 0.940430f, + 0.071655f, 0.932617f, 0.080688f, 0.922363f, 0.088257f, 0.914062f, 0.093506f, 0.906738f, + 0.101685f, 0.897461f, 0.107361f, 0.889648f, 0.114380f, 0.881348f, 0.118652f, 0.874512f, + 0.125122f, 0.866699f, 0.131348f, 0.858398f, 0.136230f, 0.851562f, 0.141479f, 0.844727f, + 0.146362f, 0.838379f, 0.151367f, 0.831055f, 0.156128f, 0.823730f, 0.161987f, 0.816895f, + 0.165771f, 0.811035f, 0.169556f, 0.805176f, 0.172974f, 0.799805f, 0.176514f, 0.793945f, + 0.181519f, 0.786621f, 0.185181f, 0.780273f, 0.189453f, 0.774414f, 0.192749f, 0.768555f, + 0.195923f, 0.763184f, 0.198120f, 0.758789f, 0.200439f, 0.754395f, 0.205200f, 0.747070f, + 0.207642f, 0.740234f, 0.210571f, 0.733887f, 0.212524f, 0.728027f, 0.214844f, 0.722168f, + 0.217285f, 0.716797f, 0.218384f, 0.711426f, 0.218872f, 0.706055f, 0.220215f, 0.699219f, + 0.223633f, 0.691406f, 0.224609f, 0.684082f, 0.225464f, 0.676758f, 0.225952f, 0.669922f, + 0.225098f, 0.662109f, 0.224731f, 0.655273f, 0.223755f, 0.647949f, 0.221069f, 0.639160f, + 0.220337f, 0.627441f, 0.219238f, 0.616211f, 0.215454f, 0.603516f, 0.210205f, 0.590820f, + 0.203491f, 0.576172f, 0.195312f, 0.559570f, 0.183350f, 0.540527f, 0.170532f, 0.511230f, + 0.151855f, 0.473877f, 0.124939f, 0.422363f, 0.081238f, 0.337402f, 0.016525f, 0.129395f, + 0.000000f, 1.000000f, 0.015991f, 0.991211f, 0.029984f, 0.980469f, 0.042206f, 0.969727f, + 0.054382f, 0.958496f, 0.067261f, 0.945801f, 0.076294f, 0.935547f, 0.086426f, 0.923828f, + 0.097046f, 0.913086f, 0.104065f, 0.904297f, 0.114136f, 0.892578f, 0.122681f, 0.883301f, + 0.128784f, 0.875000f, 0.135620f, 0.866211f, 0.143311f, 0.856445f, 0.151489f, 0.847168f, + 0.156494f, 0.839844f, 0.162476f, 0.833008f, 0.167847f, 0.825195f, 0.173706f, 0.816895f, + 0.179810f, 0.809570f, 0.185547f, 0.801758f, 0.189575f, 0.796387f, 0.193604f, 0.790039f, + 0.199219f, 0.782715f, 0.203369f, 0.775879f, 0.208008f, 0.769531f, 0.212158f, 0.763184f, + 0.214844f, 0.757812f, 0.218140f, 0.752930f, 0.220947f, 0.748047f, 0.224243f, 0.742188f, + 0.228516f, 0.735352f, 0.231812f, 0.729492f, 0.234497f, 0.724609f, 0.237915f, 0.719238f, + 0.239868f, 0.714355f, 0.241211f, 0.708984f, 0.242310f, 0.704102f, 0.242920f, 0.700195f, + 0.246338f, 0.692383f, 0.249023f, 0.686523f, 0.250000f, 0.680176f, 0.250977f, 0.674316f, + 0.251953f, 0.667969f, 0.251953f, 0.662598f, 0.251709f, 0.656250f, 0.251221f, 0.650879f, + 0.249878f, 0.645020f, 0.249634f, 0.637207f, 0.248657f, 0.627930f, 0.247070f, 0.618652f, + 0.244629f, 0.609375f, 0.241211f, 0.599609f, 0.235840f, 0.588867f, 0.230469f, 0.578125f, + 0.222046f, 0.565918f, 0.212280f, 0.551270f, 0.202393f, 0.528809f, 0.186279f, 0.500488f, + 0.165771f, 0.466797f, 0.135498f, 0.418213f, 0.088379f, 0.337646f, 0.017944f, 0.129150f, + 0.000000f, 1.000000f, 0.022446f, 0.989258f, 0.041748f, 0.974609f, 0.060333f, 0.958984f, + 0.077515f, 0.942871f, 0.090454f, 0.929199f, 0.105896f, 0.914551f, 0.115723f, 0.902832f, + 0.130127f, 0.887695f, 0.140137f, 0.876465f, 0.147583f, 0.866699f, 0.159058f, 0.853516f, + 0.167236f, 0.843750f, 0.174194f, 0.834961f, 0.182129f, 0.825195f, 0.189453f, 0.815430f, + 0.197632f, 0.806152f, 0.202881f, 0.798828f, 0.208008f, 0.791992f, 0.212891f, 0.784668f, + 0.219360f, 0.776367f, 0.225342f, 0.768555f, 0.230591f, 0.761719f, 0.234497f, 0.755859f, + 0.238281f, 0.749512f, 0.241333f, 0.744141f, 0.244507f, 0.738281f, 0.250244f, 0.731445f, + 0.253662f, 0.725098f, 0.257324f, 0.719238f, 0.259766f, 0.714355f, 0.262451f, 0.709961f, + 0.265137f, 0.705078f, 0.266602f, 0.701172f, 0.268066f, 0.697266f, 0.270752f, 0.691406f, + 0.273926f, 0.685547f, 0.276611f, 0.680176f, 0.277344f, 0.675293f, 0.278320f, 0.669922f, + 0.280029f, 0.665039f, 0.280518f, 0.660645f, 0.280518f, 0.656250f, 0.280273f, 0.651855f, + 0.279541f, 0.647461f, 0.280029f, 0.641602f, 0.280273f, 0.634277f, 0.279785f, 0.627441f, + 0.279297f, 0.621582f, 0.277832f, 0.614258f, 0.275391f, 0.607422f, 0.272705f, 0.600586f, + 0.268555f, 0.593750f, 0.262939f, 0.585449f, 0.256592f, 0.577148f, 0.248901f, 0.567383f, + 0.242676f, 0.552246f, 0.232422f, 0.534668f, 0.220215f, 0.515137f, 0.202515f, 0.491211f, + 0.178955f, 0.459961f, 0.145630f, 0.415039f, 0.094482f, 0.337158f, 0.019440f, 0.129517f, + 0.000000f, 1.000000f, 0.036499f, 0.982422f, 0.064636f, 0.962402f, 0.089783f, 0.941406f, + 0.112305f, 0.920410f, 0.131470f, 0.901367f, 0.147095f, 0.885254f, 0.162354f, 0.868652f, + 0.175903f, 0.854004f, 0.186157f, 0.841797f, 0.197632f, 0.828125f, 0.207886f, 0.815430f, + 0.216431f, 0.805176f, 0.222778f, 0.796387f, 0.231812f, 0.785156f, 0.240356f, 0.774902f, + 0.246094f, 0.767090f, 0.251709f, 0.759277f, 0.255859f, 0.752441f, 0.261963f, 0.744141f, + 0.267090f, 0.736328f, 0.272217f, 0.729492f, 0.276367f, 0.723145f, 0.280273f, 0.716797f, + 0.283203f, 0.711426f, 0.286865f, 0.706055f, 0.288574f, 0.702148f, 0.292480f, 0.696289f, + 0.296143f, 0.689941f, 0.298828f, 0.684570f, 0.301758f, 0.679688f, 0.303711f, 0.674805f, + 0.305664f, 0.670410f, 0.307373f, 0.666504f, 0.308594f, 0.662598f, 0.309326f, 0.659180f, + 0.311035f, 0.655273f, 0.311035f, 0.652344f, 0.311523f, 0.648438f, 0.311523f, 0.643066f, + 0.313477f, 0.637695f, 0.313965f, 0.633301f, 0.314453f, 0.628906f, 0.313965f, 0.624512f, + 0.312744f, 0.619629f, 0.312012f, 0.614746f, 0.310791f, 0.610840f, 0.308105f, 0.605957f, + 0.305664f, 0.601074f, 0.302979f, 0.595703f, 0.299561f, 0.591309f, 0.295410f, 0.585449f, + 0.291504f, 0.576660f, 0.286377f, 0.567383f, 0.281494f, 0.558105f, 0.273682f, 0.547363f, + 0.264160f, 0.535156f, 0.251709f, 0.521484f, 0.237427f, 0.505371f, 0.217651f, 0.484375f, + 0.191772f, 0.456299f, 0.155762f, 0.413818f, 0.103394f, 0.327637f, 0.020920f, 0.129517f, + 0.000000f, 1.000000f, 0.062744f, 0.971680f, 0.109253f, 0.938477f, 0.143555f, 0.908691f, + 0.170654f, 0.883301f, 0.191650f, 0.861328f, 0.211426f, 0.840332f, 0.226929f, 0.822754f, + 0.239746f, 0.807617f, 0.252197f, 0.791992f, 0.261719f, 0.779297f, 0.270996f, 0.767090f, + 0.278320f, 0.757324f, 0.286133f, 0.746094f, 0.293945f, 0.735840f, 0.299561f, 0.727051f, + 0.305908f, 0.718262f, 0.310547f, 0.710938f, 0.314453f, 0.704102f, 0.318848f, 0.697754f, + 0.321777f, 0.691406f, 0.324463f, 0.686035f, 0.328125f, 0.680176f, 0.331543f, 0.673828f, + 0.335449f, 0.668457f, 0.338379f, 0.663086f, 0.340332f, 0.658203f, 0.342285f, 0.653809f, + 0.343506f, 0.649414f, 0.345703f, 0.645020f, 0.346436f, 0.641602f, 0.348877f, 0.637695f, + 0.348389f, 0.634277f, 0.349854f, 0.631348f, 0.349365f, 0.627930f, 0.349854f, 0.625000f, + 0.350098f, 0.622070f, 0.349854f, 0.619141f, 0.349854f, 0.616211f, 0.349365f, 0.612305f, + 0.349365f, 0.607910f, 0.348633f, 0.604492f, 0.347900f, 0.600586f, 0.346924f, 0.597656f, + 0.345459f, 0.593750f, 0.343506f, 0.589355f, 0.342041f, 0.585449f, 0.338623f, 0.581543f, + 0.335938f, 0.577148f, 0.332764f, 0.572754f, 0.328613f, 0.567871f, 0.323242f, 0.562012f, + 0.317139f, 0.556152f, 0.311035f, 0.550293f, 0.303955f, 0.542969f, 0.293945f, 0.534180f, + 0.283203f, 0.524902f, 0.269287f, 0.513672f, 0.252686f, 0.499023f, 0.231812f, 0.478516f, + 0.205200f, 0.448975f, 0.167847f, 0.403320f, 0.111633f, 0.322510f, 0.022476f, 0.130615f, + 0.000000f, 1.000000f, 0.089050f, 0.959961f, 0.144531f, 0.919922f, 0.183838f, 0.885742f, + 0.213135f, 0.856445f, 0.236572f, 0.831543f, 0.255615f, 0.810059f, 0.270996f, 0.791504f, + 0.284180f, 0.774414f, 0.294434f, 0.760254f, 0.304688f, 0.746582f, 0.313232f, 0.734863f, + 0.320801f, 0.723633f, 0.327881f, 0.713379f, 0.333252f, 0.704102f, 0.339355f, 0.695312f, + 0.343506f, 0.687500f, 0.348633f, 0.680176f, 0.353027f, 0.672852f, 0.355469f, 0.666992f, + 0.358887f, 0.660645f, 0.362305f, 0.654785f, 0.365479f, 0.649414f, 0.367188f, 0.644531f, + 0.368652f, 0.640137f, 0.371582f, 0.634766f, 0.374023f, 0.629883f, 0.375244f, 0.625977f, + 0.376709f, 0.622070f, 0.378662f, 0.617676f, 0.378906f, 0.614746f, 0.380127f, 0.610840f, + 0.380859f, 0.607422f, 0.381104f, 0.604492f, 0.381592f, 0.601074f, 0.381592f, 0.598145f, + 0.382324f, 0.595215f, 0.381836f, 0.592285f, 0.381348f, 0.589355f, 0.381104f, 0.586914f, + 0.379883f, 0.583496f, 0.379639f, 0.580078f, 0.377930f, 0.576660f, 0.376221f, 0.573730f, + 0.374756f, 0.570801f, 0.373047f, 0.566406f, 0.370605f, 0.562988f, 0.367920f, 0.559570f, + 0.364258f, 0.555176f, 0.361816f, 0.550781f, 0.356934f, 0.545898f, 0.353027f, 0.541016f, + 0.347168f, 0.535645f, 0.340576f, 0.529297f, 0.333496f, 0.521973f, 0.323975f, 0.513184f, + 0.314209f, 0.503906f, 0.300781f, 0.491943f, 0.285400f, 0.477295f, 0.265137f, 0.458008f, + 0.238403f, 0.431396f, 0.201050f, 0.390625f, 0.141724f, 0.316162f, 0.040771f, 0.134888f, + 0.000000f, 1.000000f, 0.089539f, 0.959961f, 0.146240f, 0.919434f, 0.186401f, 0.884277f, + 0.216553f, 0.854492f, 0.239990f, 0.829590f, 0.259766f, 0.807129f, 0.275879f, 0.787598f, + 0.290527f, 0.770508f, 0.301270f, 0.755371f, 0.311523f, 0.741211f, 0.321045f, 0.728516f, + 0.328857f, 0.717285f, 0.336914f, 0.706055f, 0.343262f, 0.696289f, 0.350586f, 0.687012f, + 0.354736f, 0.678711f, 0.359619f, 0.670898f, 0.364746f, 0.663086f, 0.367920f, 0.656738f, + 0.372070f, 0.649902f, 0.375488f, 0.643555f, 0.378662f, 0.637695f, 0.381836f, 0.631836f, + 0.383789f, 0.627441f, 0.387451f, 0.621582f, 0.390137f, 0.616699f, 0.391602f, 0.611816f, + 0.394287f, 0.607422f, 0.395508f, 0.603027f, 0.396729f, 0.599121f, 0.397949f, 0.595215f, + 0.400391f, 0.590820f, 0.400879f, 0.587402f, 0.402100f, 0.583496f, 0.402588f, 0.580566f, + 0.403564f, 0.576660f, 0.404297f, 0.573242f, 0.404541f, 0.570312f, 0.404785f, 0.566895f, + 0.404785f, 0.563477f, 0.404297f, 0.559082f, 0.403809f, 0.555176f, 0.402832f, 0.551758f, + 0.402100f, 0.548828f, 0.401367f, 0.543945f, 0.399170f, 0.540039f, 0.398193f, 0.535645f, + 0.395264f, 0.531250f, 0.392822f, 0.526367f, 0.389404f, 0.520996f, 0.386230f, 0.515625f, + 0.382080f, 0.509277f, 0.377197f, 0.501953f, 0.371338f, 0.494141f, 0.365234f, 0.485840f, + 0.356201f, 0.475830f, 0.344238f, 0.463379f, 0.331055f, 0.448242f, 0.313477f, 0.429688f, + 0.289795f, 0.403564f, 0.254395f, 0.364502f, 0.199097f, 0.296631f, 0.088806f, 0.127441f, + 0.000000f, 1.000000f, 0.089294f, 0.960449f, 0.147583f, 0.918945f, 0.188965f, 0.882812f, + 0.219849f, 0.853027f, 0.243652f, 0.827148f, 0.264648f, 0.804199f, 0.281006f, 0.784180f, + 0.295654f, 0.766113f, 0.307861f, 0.750000f, 0.319580f, 0.735352f, 0.328857f, 0.722168f, + 0.337891f, 0.710449f, 0.345703f, 0.698730f, 0.353271f, 0.688477f, 0.359863f, 0.678711f, + 0.364746f, 0.670410f, 0.372070f, 0.661133f, 0.376953f, 0.652832f, 0.380859f, 0.645996f, + 0.385254f, 0.638672f, 0.389648f, 0.631836f, 0.393555f, 0.625488f, 0.396729f, 0.619141f, + 0.399170f, 0.613770f, 0.403564f, 0.607910f, 0.407471f, 0.602051f, 0.409424f, 0.597168f, + 0.412598f, 0.591797f, 0.414307f, 0.586914f, 0.417236f, 0.582031f, 0.418945f, 0.577637f, + 0.421387f, 0.573242f, 0.422607f, 0.568848f, 0.424072f, 0.564941f, 0.425293f, 0.561035f, + 0.427246f, 0.556641f, 0.427734f, 0.553223f, 0.428955f, 0.549316f, 0.429443f, 0.545410f, + 0.430420f, 0.541992f, 0.430664f, 0.537109f, 0.430420f, 0.532715f, 0.429932f, 0.528809f, + 0.430420f, 0.524902f, 0.430420f, 0.520508f, 0.429443f, 0.515625f, 0.428711f, 0.510254f, + 0.427246f, 0.506348f, 0.424805f, 0.500488f, 0.423828f, 0.495361f, 0.420654f, 0.488525f, + 0.417480f, 0.482422f, 0.414551f, 0.474854f, 0.409424f, 0.467041f, 0.404053f, 0.457520f, + 0.395996f, 0.446777f, 0.388184f, 0.435547f, 0.376709f, 0.419922f, 0.360840f, 0.401611f, + 0.339844f, 0.375977f, 0.309570f, 0.339355f, 0.257812f, 0.275879f, 0.147339f, 0.119812f, + 0.000000f, 1.000000f, 0.089600f, 0.960449f, 0.147949f, 0.918457f, 0.189697f, 0.882324f, + 0.222778f, 0.851074f, 0.248657f, 0.824219f, 0.269531f, 0.800781f, 0.286621f, 0.780273f, + 0.301025f, 0.761719f, 0.316406f, 0.744629f, 0.327881f, 0.729492f, 0.336670f, 0.715820f, + 0.347168f, 0.703125f, 0.355469f, 0.690918f, 0.363770f, 0.679688f, 0.370850f, 0.669434f, + 0.376709f, 0.660156f, 0.383545f, 0.650879f, 0.390137f, 0.642090f, 0.395264f, 0.633789f, + 0.399902f, 0.626465f, 0.405518f, 0.618652f, 0.408936f, 0.612305f, 0.413330f, 0.605469f, + 0.416992f, 0.599609f, 0.420166f, 0.593750f, 0.424316f, 0.587402f, 0.427734f, 0.581543f, + 0.430176f, 0.576172f, 0.433350f, 0.570801f, 0.436279f, 0.565430f, 0.437988f, 0.561035f, + 0.441162f, 0.555664f, 0.443359f, 0.551270f, 0.444336f, 0.546875f, 0.447510f, 0.542480f, + 0.449219f, 0.537598f, 0.450684f, 0.533691f, 0.452148f, 0.529297f, 0.454346f, 0.524902f, + 0.455566f, 0.520508f, 0.457275f, 0.515625f, 0.457275f, 0.510742f, 0.457520f, 0.506348f, + 0.458740f, 0.501465f, 0.459229f, 0.496826f, 0.459229f, 0.491699f, 0.458252f, 0.486328f, + 0.458496f, 0.480957f, 0.457520f, 0.475098f, 0.457031f, 0.468750f, 0.454834f, 0.462158f, + 0.453369f, 0.455322f, 0.450439f, 0.447266f, 0.447510f, 0.438965f, 0.442871f, 0.429199f, + 0.436523f, 0.418945f, 0.430176f, 0.406494f, 0.420898f, 0.391357f, 0.408203f, 0.372559f, + 0.390381f, 0.348145f, 0.363281f, 0.313232f, 0.317627f, 0.253662f, 0.211304f, 0.111877f, + 0.000000f, 1.000000f, 0.090027f, 0.959961f, 0.149902f, 0.917480f, 0.192383f, 0.880859f, + 0.224854f, 0.849609f, 0.251953f, 0.821777f, 0.273926f, 0.797363f, 0.292236f, 0.775879f, + 0.309326f, 0.756836f, 0.322510f, 0.739258f, 0.336670f, 0.722656f, 0.347412f, 0.708008f, + 0.357178f, 0.694824f, 0.365967f, 0.682617f, 0.375488f, 0.670410f, 0.382324f, 0.660156f, + 0.388916f, 0.650391f, 0.396484f, 0.640625f, 0.402100f, 0.631836f, 0.408936f, 0.622559f, + 0.413086f, 0.615234f, 0.418457f, 0.606934f, 0.423340f, 0.600098f, 0.428711f, 0.592285f, + 0.432861f, 0.585449f, 0.436035f, 0.580078f, 0.441162f, 0.572754f, 0.445068f, 0.566406f, + 0.449463f, 0.560059f, 0.452637f, 0.554199f, 0.455322f, 0.548828f, 0.458252f, 0.543457f, + 0.461182f, 0.538086f, 0.465088f, 0.532715f, 0.467041f, 0.527832f, 0.469238f, 0.522949f, + 0.472412f, 0.518066f, 0.473389f, 0.513672f, 0.476562f, 0.508301f, 0.478271f, 0.503906f, + 0.480713f, 0.499023f, 0.483398f, 0.493896f, 0.483887f, 0.488770f, 0.485352f, 0.483398f, + 0.486084f, 0.478516f, 0.487305f, 0.472900f, 0.488525f, 0.467529f, 0.489746f, 0.461670f, + 0.488770f, 0.455811f, 0.490967f, 0.449463f, 0.488525f, 0.442627f, 0.489258f, 0.436035f, + 0.487549f, 0.428223f, 0.486084f, 0.420654f, 0.485107f, 0.411377f, 0.481934f, 0.401367f, + 0.477295f, 0.390869f, 0.472168f, 0.377686f, 0.464355f, 0.363037f, 0.454590f, 0.344727f, + 0.439209f, 0.320801f, 0.416748f, 0.287354f, 0.375244f, 0.232056f, 0.277344f, 0.102173f, + 0.000000f, 1.000000f, 0.090820f, 0.959473f, 0.151245f, 0.916504f, 0.194946f, 0.879395f, + 0.228638f, 0.847168f, 0.256592f, 0.818848f, 0.278809f, 0.793945f, 0.299316f, 0.770996f, + 0.316895f, 0.750488f, 0.331055f, 0.732910f, 0.344971f, 0.716309f, 0.356201f, 0.701172f, + 0.366211f, 0.687500f, 0.376709f, 0.674316f, 0.384521f, 0.662598f, 0.393066f, 0.651367f, + 0.400879f, 0.640625f, 0.408691f, 0.630371f, 0.415039f, 0.621094f, 0.422119f, 0.611328f, + 0.427490f, 0.603027f, 0.434082f, 0.594238f, 0.440186f, 0.586426f, 0.444336f, 0.578613f, + 0.449219f, 0.571289f, 0.453125f, 0.564941f, 0.458252f, 0.558105f, 0.463135f, 0.551270f, + 0.466797f, 0.544922f, 0.471436f, 0.538086f, 0.475586f, 0.531738f, 0.478760f, 0.525879f, + 0.482666f, 0.520020f, 0.485840f, 0.514160f, 0.488770f, 0.509277f, 0.491211f, 0.503906f, + 0.494385f, 0.498291f, 0.498047f, 0.492920f, 0.500977f, 0.487549f, 0.502930f, 0.482422f, + 0.505859f, 0.477295f, 0.508301f, 0.472168f, 0.509766f, 0.466797f, 0.511719f, 0.460693f, + 0.513672f, 0.455078f, 0.515625f, 0.448975f, 0.517578f, 0.443115f, 0.518555f, 0.437500f, + 0.519043f, 0.430908f, 0.521484f, 0.424072f, 0.521484f, 0.417236f, 0.521973f, 0.409668f, + 0.520996f, 0.402100f, 0.521484f, 0.393555f, 0.520020f, 0.384277f, 0.518066f, 0.374023f, + 0.514648f, 0.363037f, 0.511230f, 0.349609f, 0.506348f, 0.335205f, 0.497803f, 0.317383f, + 0.485596f, 0.294434f, 0.466064f, 0.262695f, 0.430908f, 0.210815f, 0.341797f, 0.092590f, + 0.000000f, 1.000000f, 0.090942f, 0.959473f, 0.152100f, 0.916504f, 0.197632f, 0.877441f, + 0.232910f, 0.844727f, 0.260498f, 0.815918f, 0.285645f, 0.789062f, 0.305664f, 0.766602f, + 0.323486f, 0.746094f, 0.338379f, 0.727539f, 0.352051f, 0.710449f, 0.364502f, 0.694824f, + 0.376221f, 0.680176f, 0.386230f, 0.666504f, 0.396240f, 0.653809f, 0.405518f, 0.641602f, + 0.414062f, 0.629883f, 0.422119f, 0.619629f, 0.428955f, 0.609375f, 0.435547f, 0.600098f, + 0.441406f, 0.590820f, 0.447998f, 0.582031f, 0.454834f, 0.573242f, 0.461182f, 0.564941f, + 0.466309f, 0.557129f, 0.470459f, 0.550293f, 0.476074f, 0.542480f, 0.480225f, 0.535645f, + 0.485352f, 0.528809f, 0.489990f, 0.521973f, 0.495605f, 0.514648f, 0.499023f, 0.508301f, + 0.502441f, 0.502441f, 0.507324f, 0.495850f, 0.510742f, 0.490234f, 0.513184f, 0.484619f, + 0.517090f, 0.478516f, 0.520996f, 0.472656f, 0.524414f, 0.466797f, 0.526855f, 0.461670f, + 0.530762f, 0.455811f, 0.533691f, 0.450195f, 0.536621f, 0.444336f, 0.538574f, 0.438232f, + 0.541016f, 0.431885f, 0.543945f, 0.425537f, 0.545898f, 0.419189f, 0.547363f, 0.413086f, + 0.549316f, 0.406250f, 0.551758f, 0.398682f, 0.553223f, 0.391602f, 0.553711f, 0.384033f, + 0.555176f, 0.375977f, 0.555176f, 0.367432f, 0.555664f, 0.358154f, 0.555176f, 0.347656f, + 0.553223f, 0.336182f, 0.551758f, 0.323486f, 0.547363f, 0.308838f, 0.539551f, 0.290527f, + 0.531250f, 0.268555f, 0.514648f, 0.238770f, 0.484131f, 0.189941f, 0.405762f, 0.083618f, + 0.000000f, 1.000000f, 0.091248f, 0.959473f, 0.154053f, 0.915039f, 0.199951f, 0.876465f, + 0.236572f, 0.841797f, 0.265869f, 0.812012f, 0.290283f, 0.786133f, 0.311035f, 0.762695f, + 0.329102f, 0.741699f, 0.346436f, 0.721680f, 0.359619f, 0.704590f, 0.373779f, 0.687500f, + 0.386475f, 0.671875f, 0.396973f, 0.658203f, 0.406250f, 0.645508f, 0.416016f, 0.632324f, + 0.425049f, 0.620605f, 0.434570f, 0.609375f, 0.442627f, 0.598145f, 0.450439f, 0.587891f, + 0.456299f, 0.578613f, 0.463867f, 0.568848f, 0.471191f, 0.560059f, 0.476318f, 0.551758f, + 0.483398f, 0.542969f, 0.487305f, 0.535156f, 0.494629f, 0.527344f, 0.498291f, 0.520508f, + 0.503906f, 0.512207f, 0.509277f, 0.504883f, 0.515137f, 0.497559f, 0.518555f, 0.490967f, + 0.523438f, 0.484375f, 0.527344f, 0.477783f, 0.532227f, 0.470947f, 0.536133f, 0.465088f, + 0.539551f, 0.458740f, 0.544434f, 0.452148f, 0.547852f, 0.446533f, 0.550781f, 0.440430f, + 0.555176f, 0.434082f, 0.558105f, 0.428223f, 0.561523f, 0.422119f, 0.565918f, 0.415771f, + 0.566895f, 0.409180f, 0.571289f, 0.402100f, 0.573730f, 0.395508f, 0.576172f, 0.389160f, + 0.579102f, 0.382568f, 0.581543f, 0.374268f, 0.583496f, 0.366943f, 0.584961f, 0.359131f, + 0.586426f, 0.350830f, 0.588867f, 0.341797f, 0.588867f, 0.332520f, 0.588867f, 0.321777f, + 0.587891f, 0.310791f, 0.586914f, 0.297607f, 0.584473f, 0.282715f, 0.578613f, 0.265869f, + 0.572266f, 0.244873f, 0.559082f, 0.216064f, 0.533203f, 0.171753f, 0.463867f, 0.074585f, + 0.000000f, 1.000000f, 0.091492f, 0.959473f, 0.155640f, 0.914062f, 0.203247f, 0.874023f, + 0.241089f, 0.839355f, 0.270264f, 0.809082f, 0.295654f, 0.782715f, 0.316895f, 0.758301f, + 0.337402f, 0.735840f, 0.355225f, 0.715332f, 0.369385f, 0.697266f, 0.382324f, 0.680664f, + 0.395264f, 0.664551f, 0.406494f, 0.650391f, 0.417969f, 0.635742f, 0.429443f, 0.622070f, + 0.437256f, 0.610352f, 0.446777f, 0.598145f, 0.455322f, 0.586914f, 0.464600f, 0.576172f, + 0.471680f, 0.565918f, 0.479004f, 0.556152f, 0.485596f, 0.546875f, 0.491943f, 0.537598f, + 0.500000f, 0.528320f, 0.505859f, 0.520020f, 0.511230f, 0.512207f, 0.515625f, 0.504395f, + 0.522461f, 0.496338f, 0.528320f, 0.488281f, 0.534180f, 0.480713f, 0.538574f, 0.473389f, + 0.544922f, 0.466064f, 0.548340f, 0.459229f, 0.553711f, 0.452148f, 0.557129f, 0.445801f, + 0.562988f, 0.438965f, 0.566895f, 0.431885f, 0.570312f, 0.426025f, 0.575195f, 0.419434f, + 0.579102f, 0.412842f, 0.582520f, 0.406738f, 0.587891f, 0.399902f, 0.590820f, 0.393799f, + 0.594727f, 0.386719f, 0.597168f, 0.379883f, 0.600586f, 0.372559f, 0.604492f, 0.365479f, + 0.607910f, 0.358643f, 0.609863f, 0.351074f, 0.612793f, 0.343018f, 0.614746f, 0.334717f, + 0.617676f, 0.326416f, 0.619629f, 0.317139f, 0.620117f, 0.307861f, 0.622070f, 0.297119f, + 0.623047f, 0.286377f, 0.622559f, 0.273193f, 0.621094f, 0.259277f, 0.618164f, 0.243042f, + 0.611816f, 0.222168f, 0.601562f, 0.194824f, 0.579102f, 0.152832f, 0.520508f, 0.066284f, + 0.000000f, 1.000000f, 0.092529f, 0.958984f, 0.156982f, 0.913574f, 0.205566f, 0.873047f, + 0.243896f, 0.837402f, 0.274414f, 0.806641f, 0.301514f, 0.778809f, 0.323975f, 0.753418f, + 0.343750f, 0.730469f, 0.361816f, 0.709961f, 0.378418f, 0.690918f, 0.392578f, 0.673340f, + 0.406006f, 0.656250f, 0.417480f, 0.641602f, 0.428955f, 0.626953f, 0.440674f, 0.612793f, + 0.450684f, 0.599609f, 0.459717f, 0.587402f, 0.469727f, 0.575684f, 0.478271f, 0.564453f, + 0.486084f, 0.553711f, 0.493896f, 0.542969f, 0.500977f, 0.533691f, 0.508301f, 0.523926f, + 0.516602f, 0.513672f, 0.522461f, 0.505371f, 0.528809f, 0.496826f, 0.535156f, 0.488281f, + 0.541016f, 0.480469f, 0.547363f, 0.471680f, 0.553223f, 0.463379f, 0.559082f, 0.455811f, + 0.563477f, 0.448486f, 0.569336f, 0.440918f, 0.574219f, 0.433350f, 0.578613f, 0.426758f, + 0.584473f, 0.419434f, 0.589844f, 0.412109f, 0.592773f, 0.405762f, 0.598633f, 0.398682f, + 0.602051f, 0.392090f, 0.608398f, 0.385010f, 0.611328f, 0.378662f, 0.615723f, 0.371826f, + 0.620117f, 0.365234f, 0.624023f, 0.357666f, 0.626465f, 0.350098f, 0.631348f, 0.342529f, + 0.634766f, 0.335693f, 0.638672f, 0.328125f, 0.640625f, 0.319580f, 0.643555f, 0.311523f, + 0.645996f, 0.303223f, 0.649414f, 0.293457f, 0.651367f, 0.284424f, 0.653320f, 0.273926f, + 0.654297f, 0.262939f, 0.655762f, 0.250244f, 0.654785f, 0.236572f, 0.652344f, 0.220337f, + 0.648438f, 0.201172f, 0.639160f, 0.175293f, 0.622070f, 0.137085f, 0.569336f, 0.059753f, + 0.000000f, 1.000000f, 0.093201f, 0.958496f, 0.159180f, 0.912109f, 0.208008f, 0.871582f, + 0.246216f, 0.835938f, 0.278320f, 0.804199f, 0.306641f, 0.774902f, 0.330811f, 0.748535f, + 0.351074f, 0.726074f, 0.368896f, 0.704590f, 0.386963f, 0.684082f, 0.401611f, 0.666016f, + 0.415283f, 0.648926f, 0.429199f, 0.632324f, 0.441162f, 0.617188f, 0.451660f, 0.603027f, + 0.462891f, 0.589355f, 0.473389f, 0.576172f, 0.482910f, 0.563965f, 0.491455f, 0.552734f, + 0.500977f, 0.541016f, 0.507812f, 0.530273f, 0.517090f, 0.519531f, 0.524414f, 0.509766f, + 0.533203f, 0.499512f, 0.539062f, 0.490479f, 0.546387f, 0.481201f, 0.553223f, 0.472412f, + 0.557617f, 0.464355f, 0.566895f, 0.454834f, 0.572266f, 0.446533f, 0.579102f, 0.438232f, + 0.583496f, 0.430664f, 0.590332f, 0.422607f, 0.595215f, 0.415039f, 0.600098f, 0.407715f, + 0.605957f, 0.400146f, 0.611328f, 0.392578f, 0.616699f, 0.385498f, 0.620605f, 0.378906f, + 0.625488f, 0.371338f, 0.629883f, 0.364502f, 0.635742f, 0.357422f, 0.639160f, 0.350830f, + 0.645508f, 0.343018f, 0.648438f, 0.336426f, 0.652832f, 0.328369f, 0.655273f, 0.320801f, + 0.659668f, 0.313477f, 0.663574f, 0.305664f, 0.668457f, 0.297607f, 0.669922f, 0.289551f, + 0.673828f, 0.280762f, 0.677734f, 0.271729f, 0.680176f, 0.261719f, 0.681641f, 0.251953f, + 0.683105f, 0.240967f, 0.686035f, 0.228760f, 0.686523f, 0.215088f, 0.684570f, 0.200439f, + 0.681152f, 0.180908f, 0.674316f, 0.157593f, 0.660156f, 0.123230f, 0.616211f, 0.052734f, + 0.000000f, 1.000000f, 0.093262f, 0.958496f, 0.161377f, 0.911133f, 0.211060f, 0.869629f, + 0.250244f, 0.833496f, 0.284424f, 0.799805f, 0.312012f, 0.770996f, 0.335938f, 0.744629f, + 0.357910f, 0.720215f, 0.376953f, 0.698242f, 0.395264f, 0.677246f, 0.411621f, 0.658203f, + 0.426270f, 0.640137f, 0.439697f, 0.623535f, 0.453369f, 0.607422f, 0.464844f, 0.593262f, + 0.475098f, 0.579102f, 0.486328f, 0.565430f, 0.497314f, 0.552246f, 0.506348f, 0.540039f, + 0.515625f, 0.528320f, 0.524414f, 0.517090f, 0.533691f, 0.505859f, 0.540039f, 0.496094f, + 0.549805f, 0.484863f, 0.557129f, 0.475098f, 0.562988f, 0.466064f, 0.571777f, 0.456299f, + 0.576660f, 0.447754f, 0.584473f, 0.438721f, 0.591309f, 0.429688f, 0.597656f, 0.420898f, + 0.604004f, 0.412842f, 0.609375f, 0.404785f, 0.615234f, 0.396484f, 0.621094f, 0.388916f, + 0.626465f, 0.381104f, 0.633301f, 0.373535f, 0.637207f, 0.366211f, 0.643066f, 0.358887f, + 0.647949f, 0.351318f, 0.654297f, 0.343750f, 0.657227f, 0.337158f, 0.663086f, 0.329834f, + 0.667480f, 0.322510f, 0.673828f, 0.315186f, 0.675781f, 0.307861f, 0.680176f, 0.299805f, + 0.685059f, 0.292236f, 0.688965f, 0.284424f, 0.693359f, 0.276367f, 0.696289f, 0.268066f, + 0.699707f, 0.259277f, 0.704590f, 0.250244f, 0.706055f, 0.241089f, 0.708984f, 0.231323f, + 0.711914f, 0.220581f, 0.712402f, 0.209106f, 0.713867f, 0.196167f, 0.714355f, 0.181396f, + 0.713379f, 0.163940f, 0.708008f, 0.141846f, 0.696289f, 0.109558f, 0.657715f, 0.046295f, + 0.000000f, 1.000000f, 0.093384f, 0.958496f, 0.162109f, 0.910645f, 0.212891f, 0.868652f, + 0.255371f, 0.830566f, 0.288818f, 0.797363f, 0.318359f, 0.767090f, 0.343262f, 0.739746f, + 0.365479f, 0.714844f, 0.386719f, 0.691406f, 0.403809f, 0.670410f, 0.421875f, 0.650879f, + 0.436279f, 0.632324f, 0.451416f, 0.614258f, 0.464355f, 0.598633f, 0.477051f, 0.583008f, + 0.488770f, 0.567871f, 0.499756f, 0.554199f, 0.511230f, 0.540527f, 0.520996f, 0.527344f, + 0.530273f, 0.515625f, 0.540039f, 0.503418f, 0.548340f, 0.492432f, 0.556641f, 0.481689f, + 0.565918f, 0.470703f, 0.574219f, 0.460449f, 0.580566f, 0.450684f, 0.588379f, 0.440674f, + 0.595215f, 0.431396f, 0.603027f, 0.422607f, 0.609863f, 0.413086f, 0.616211f, 0.404297f, + 0.621582f, 0.395996f, 0.630371f, 0.386475f, 0.636230f, 0.378418f, 0.640625f, 0.370850f, + 0.647949f, 0.362549f, 0.652832f, 0.354736f, 0.659180f, 0.346924f, 0.663086f, 0.340088f, + 0.670898f, 0.331543f, 0.675781f, 0.324219f, 0.680176f, 0.317139f, 0.685059f, 0.310059f, + 0.691406f, 0.302246f, 0.695312f, 0.295166f, 0.699707f, 0.287842f, 0.704102f, 0.279785f, + 0.708496f, 0.271729f, 0.711914f, 0.264160f, 0.717285f, 0.255859f, 0.721191f, 0.248413f, + 0.724609f, 0.239380f, 0.728027f, 0.230347f, 0.732910f, 0.221680f, 0.734863f, 0.211792f, + 0.737305f, 0.201782f, 0.739746f, 0.189697f, 0.740234f, 0.178223f, 0.741699f, 0.164062f, + 0.741211f, 0.147095f, 0.736328f, 0.127441f, 0.728027f, 0.096802f, 0.696777f, 0.040192f, + 0.000000f, 1.000000f, 0.095032f, 0.957520f, 0.163330f, 0.910156f, 0.215698f, 0.867188f, + 0.258789f, 0.828125f, 0.293213f, 0.794434f, 0.323486f, 0.763184f, 0.349365f, 0.735352f, + 0.373779f, 0.708984f, 0.394287f, 0.685547f, 0.414062f, 0.663086f, 0.430420f, 0.643066f, + 0.447510f, 0.623535f, 0.461914f, 0.605957f, 0.475830f, 0.588867f, 0.488770f, 0.572754f, + 0.502441f, 0.557129f, 0.513672f, 0.542969f, 0.524414f, 0.529297f, 0.535645f, 0.515137f, + 0.545898f, 0.502930f, 0.554199f, 0.490723f, 0.564941f, 0.478516f, 0.572754f, 0.467529f, + 0.581055f, 0.457031f, 0.590820f, 0.445312f, 0.598145f, 0.435303f, 0.607422f, 0.424805f, + 0.613281f, 0.415527f, 0.619141f, 0.406494f, 0.628418f, 0.396973f, 0.635254f, 0.387207f, + 0.642090f, 0.378418f, 0.648926f, 0.369385f, 0.655762f, 0.360840f, 0.661133f, 0.352539f, + 0.667969f, 0.344482f, 0.673828f, 0.336182f, 0.678711f, 0.328613f, 0.685059f, 0.320801f, + 0.690918f, 0.312988f, 0.695801f, 0.305420f, 0.701660f, 0.297607f, 0.705566f, 0.291016f, + 0.711426f, 0.283203f, 0.716309f, 0.275635f, 0.723145f, 0.268311f, 0.726562f, 0.260986f, + 0.730469f, 0.252686f, 0.735840f, 0.244385f, 0.739746f, 0.236938f, 0.743164f, 0.229248f, + 0.747559f, 0.220825f, 0.751953f, 0.211792f, 0.755859f, 0.202637f, 0.757324f, 0.194458f, + 0.761230f, 0.183594f, 0.764160f, 0.172974f, 0.766602f, 0.161621f, 0.768066f, 0.148315f, + 0.767578f, 0.132935f, 0.763672f, 0.114380f, 0.756836f, 0.086060f, 0.730469f, 0.035767f, + 0.000000f, 1.000000f, 0.097534f, 0.956055f, 0.164307f, 0.910156f, 0.219727f, 0.865234f, + 0.261963f, 0.826172f, 0.299316f, 0.790527f, 0.329834f, 0.758789f, 0.357178f, 0.729980f, + 0.380127f, 0.704102f, 0.403076f, 0.679199f, 0.422607f, 0.656738f, 0.439697f, 0.635742f, + 0.457764f, 0.615723f, 0.472168f, 0.597168f, 0.487305f, 0.579102f, 0.500977f, 0.562500f, + 0.513184f, 0.546875f, 0.527344f, 0.531738f, 0.537598f, 0.517090f, 0.549316f, 0.503418f, + 0.558594f, 0.490723f, 0.569336f, 0.478027f, 0.578613f, 0.465576f, 0.589355f, 0.453369f, + 0.596680f, 0.442627f, 0.607422f, 0.430664f, 0.614746f, 0.420166f, 0.623535f, 0.409668f, + 0.631836f, 0.399414f, 0.638184f, 0.390137f, 0.645020f, 0.381104f, 0.652832f, 0.370850f, + 0.661621f, 0.361572f, 0.666992f, 0.352783f, 0.674316f, 0.343506f, 0.680664f, 0.335205f, + 0.687012f, 0.326660f, 0.693359f, 0.318359f, 0.698242f, 0.310791f, 0.705078f, 0.302490f, + 0.710938f, 0.294922f, 0.716309f, 0.286865f, 0.721680f, 0.279297f, 0.726074f, 0.272217f, + 0.732910f, 0.264160f, 0.737305f, 0.257324f, 0.742188f, 0.249756f, 0.748047f, 0.242676f, + 0.751953f, 0.234619f, 0.756348f, 0.226562f, 0.761230f, 0.218872f, 0.765137f, 0.211060f, + 0.770020f, 0.203003f, 0.773926f, 0.194336f, 0.775879f, 0.185913f, 0.780762f, 0.176880f, + 0.784180f, 0.166870f, 0.788574f, 0.156982f, 0.788574f, 0.146240f, 0.791016f, 0.133057f, + 0.791992f, 0.119263f, 0.789062f, 0.101868f, 0.782227f, 0.077637f, 0.762695f, 0.031021f, + 0.000000f, 1.000000f, 0.097351f, 0.956543f, 0.166748f, 0.908691f, 0.221558f, 0.863770f, + 0.266113f, 0.823730f, 0.302734f, 0.788086f, 0.335693f, 0.754883f, 0.363037f, 0.725586f, + 0.388916f, 0.697754f, 0.411621f, 0.672363f, 0.432617f, 0.648926f, 0.450684f, 0.627441f, + 0.468506f, 0.606934f, 0.484863f, 0.587402f, 0.499756f, 0.569336f, 0.513184f, 0.552246f, + 0.527344f, 0.535645f, 0.539551f, 0.520508f, 0.551758f, 0.505371f, 0.563965f, 0.490967f, + 0.574707f, 0.477295f, 0.584473f, 0.464600f, 0.594238f, 0.451904f, 0.604492f, 0.439453f, + 0.613770f, 0.427734f, 0.622559f, 0.416748f, 0.631836f, 0.405029f, 0.640625f, 0.394531f, + 0.648438f, 0.384033f, 0.654785f, 0.374512f, 0.663086f, 0.364746f, 0.669922f, 0.355225f, + 0.678223f, 0.345459f, 0.687012f, 0.335938f, 0.692871f, 0.326904f, 0.697754f, 0.318604f, + 0.706055f, 0.309326f, 0.711914f, 0.301270f, 0.717773f, 0.292969f, 0.723633f, 0.285156f, + 0.730469f, 0.277100f, 0.734863f, 0.269531f, 0.741211f, 0.261719f, 0.747070f, 0.254395f, + 0.751465f, 0.246948f, 0.757324f, 0.239258f, 0.761719f, 0.232300f, 0.767578f, 0.225098f, + 0.772461f, 0.217407f, 0.776367f, 0.209839f, 0.781250f, 0.201660f, 0.785156f, 0.194092f, + 0.790039f, 0.186035f, 0.794922f, 0.178467f, 0.797852f, 0.169800f, 0.800781f, 0.161255f, + 0.806152f, 0.152466f, 0.807129f, 0.142822f, 0.810059f, 0.132080f, 0.813477f, 0.120728f, + 0.812500f, 0.107483f, 0.812012f, 0.090820f, 0.807129f, 0.068665f, 0.789551f, 0.027405f, + 0.000000f, 1.000000f, 0.098022f, 0.956543f, 0.168701f, 0.907227f, 0.224121f, 0.862305f, + 0.269531f, 0.821289f, 0.307861f, 0.784668f, 0.340576f, 0.751465f, 0.370850f, 0.720215f, + 0.396973f, 0.691895f, 0.419678f, 0.666504f, 0.440430f, 0.642578f, 0.461670f, 0.619629f, + 0.479492f, 0.598145f, 0.496582f, 0.578125f, 0.511719f, 0.559570f, 0.526367f, 0.541992f, + 0.539551f, 0.525391f, 0.552246f, 0.509277f, 0.566406f, 0.493408f, 0.577637f, 0.479248f, + 0.589355f, 0.464600f, 0.599609f, 0.451416f, 0.608887f, 0.438965f, 0.620117f, 0.425537f, + 0.629395f, 0.413574f, 0.638184f, 0.402344f, 0.648926f, 0.390381f, 0.657715f, 0.379639f, + 0.664062f, 0.369141f, 0.672363f, 0.358643f, 0.681152f, 0.348389f, 0.687988f, 0.339111f, + 0.694824f, 0.330078f, 0.703613f, 0.319824f, 0.709961f, 0.310791f, 0.716797f, 0.301758f, + 0.723145f, 0.293213f, 0.729492f, 0.284668f, 0.735840f, 0.276367f, 0.741211f, 0.268555f, + 0.748535f, 0.260254f, 0.753906f, 0.252686f, 0.759766f, 0.244873f, 0.764160f, 0.237793f, + 0.770996f, 0.229858f, 0.775391f, 0.222656f, 0.780273f, 0.215454f, 0.785645f, 0.208374f, + 0.791016f, 0.200928f, 0.795898f, 0.193848f, 0.799316f, 0.186157f, 0.804199f, 0.178101f, + 0.808594f, 0.170532f, 0.813477f, 0.162842f, 0.816895f, 0.155762f, 0.820312f, 0.146851f, + 0.823730f, 0.138184f, 0.825684f, 0.129028f, 0.830566f, 0.119080f, 0.831055f, 0.108643f, + 0.831543f, 0.096436f, 0.832031f, 0.081421f, 0.829102f, 0.061523f, 0.813477f, 0.023743f, + 0.000000f, 1.000000f, 0.096558f, 0.957520f, 0.170044f, 0.906738f, 0.227783f, 0.859863f, + 0.273926f, 0.818848f, 0.312988f, 0.781250f, 0.347412f, 0.746582f, 0.377441f, 0.715332f, + 0.405029f, 0.686523f, 0.429199f, 0.659668f, 0.450439f, 0.635254f, 0.470215f, 0.611816f, + 0.489990f, 0.589844f, 0.506836f, 0.569336f, 0.522461f, 0.550293f, 0.538086f, 0.531738f, + 0.552246f, 0.514160f, 0.565430f, 0.498047f, 0.578613f, 0.481934f, 0.590332f, 0.467529f, + 0.602539f, 0.452637f, 0.614746f, 0.438477f, 0.623535f, 0.425537f, 0.634766f, 0.412354f, + 0.645020f, 0.399658f, 0.654297f, 0.387939f, 0.663574f, 0.376221f, 0.672363f, 0.365234f, + 0.681152f, 0.354004f, 0.689453f, 0.343506f, 0.698242f, 0.333252f, 0.705566f, 0.323486f, + 0.711426f, 0.314453f, 0.719238f, 0.304688f, 0.727051f, 0.294922f, 0.733398f, 0.286377f, + 0.741211f, 0.277100f, 0.747559f, 0.268311f, 0.753418f, 0.260498f, 0.758789f, 0.252441f, + 0.765625f, 0.244263f, 0.771973f, 0.236206f, 0.775391f, 0.229248f, 0.782227f, 0.221191f, + 0.787598f, 0.214111f, 0.792969f, 0.206543f, 0.797363f, 0.199829f, 0.803223f, 0.192505f, + 0.808105f, 0.185425f, 0.812988f, 0.178467f, 0.817383f, 0.172119f, 0.821289f, 0.163696f, + 0.825684f, 0.156250f, 0.830566f, 0.148804f, 0.833984f, 0.141846f, 0.837891f, 0.133545f, + 0.840820f, 0.125122f, 0.844238f, 0.117432f, 0.847168f, 0.107483f, 0.849609f, 0.097961f, + 0.850586f, 0.086731f, 0.852539f, 0.072998f, 0.849121f, 0.053864f, 0.836426f, 0.021317f, + 0.000000f, 1.000000f, 0.096985f, 0.957520f, 0.172363f, 0.905762f, 0.229614f, 0.859375f, + 0.277832f, 0.816406f, 0.318115f, 0.777832f, 0.353516f, 0.742676f, 0.384766f, 0.709961f, + 0.411865f, 0.680664f, 0.437500f, 0.653320f, 0.460449f, 0.627441f, 0.480957f, 0.603516f, + 0.499268f, 0.581543f, 0.519043f, 0.560059f, 0.535645f, 0.540039f, 0.550781f, 0.521484f, + 0.564941f, 0.503906f, 0.580078f, 0.486572f, 0.592285f, 0.470703f, 0.604492f, 0.455078f, + 0.617676f, 0.439941f, 0.628906f, 0.425537f, 0.640137f, 0.411865f, 0.649902f, 0.399170f, + 0.660156f, 0.385986f, 0.669922f, 0.374023f, 0.679199f, 0.362305f, 0.687988f, 0.351074f, + 0.697754f, 0.339355f, 0.704102f, 0.329102f, 0.713867f, 0.318359f, 0.722168f, 0.308350f, + 0.727539f, 0.299316f, 0.735352f, 0.289795f, 0.743652f, 0.279785f, 0.750977f, 0.270996f, + 0.756836f, 0.261963f, 0.763672f, 0.253174f, 0.770020f, 0.244873f, 0.775391f, 0.237183f, + 0.781738f, 0.228760f, 0.789062f, 0.220947f, 0.791992f, 0.213867f, 0.799316f, 0.206055f, + 0.805664f, 0.198608f, 0.808105f, 0.192139f, 0.813965f, 0.184692f, 0.819824f, 0.177856f, + 0.824219f, 0.170776f, 0.829590f, 0.164062f, 0.833984f, 0.157593f, 0.838379f, 0.150391f, + 0.841797f, 0.143066f, 0.844727f, 0.136108f, 0.850098f, 0.128418f, 0.854004f, 0.121460f, + 0.857422f, 0.113831f, 0.860840f, 0.105225f, 0.863770f, 0.097351f, 0.864746f, 0.088013f, + 0.867188f, 0.077576f, 0.867676f, 0.065186f, 0.868164f, 0.047791f, 0.855957f, 0.018372f, + 0.000000f, 1.000000f, 0.097534f, 0.957031f, 0.172974f, 0.905273f, 0.233032f, 0.856934f, + 0.282471f, 0.813477f, 0.324219f, 0.773926f, 0.360107f, 0.738281f, 0.391846f, 0.705078f, + 0.419678f, 0.674805f, 0.447021f, 0.645996f, 0.469727f, 0.620605f, 0.491455f, 0.595703f, + 0.511719f, 0.572754f, 0.529297f, 0.550781f, 0.545898f, 0.530762f, 0.562500f, 0.511719f, + 0.579102f, 0.492676f, 0.593750f, 0.474854f, 0.605957f, 0.458984f, 0.619629f, 0.442871f, + 0.630859f, 0.427734f, 0.642090f, 0.413330f, 0.655273f, 0.398682f, 0.665527f, 0.385498f, + 0.675293f, 0.372803f, 0.684570f, 0.360596f, 0.694336f, 0.348145f, 0.702637f, 0.337158f, + 0.711914f, 0.325684f, 0.720703f, 0.314453f, 0.729004f, 0.304199f, 0.736328f, 0.293945f, + 0.743652f, 0.284424f, 0.750488f, 0.274902f, 0.758301f, 0.265869f, 0.765625f, 0.256348f, + 0.773438f, 0.247559f, 0.779785f, 0.238403f, 0.785645f, 0.230347f, 0.791504f, 0.222412f, + 0.798340f, 0.213745f, 0.801758f, 0.206909f, 0.809082f, 0.199097f, 0.813965f, 0.192017f, + 0.819336f, 0.184326f, 0.825195f, 0.177612f, 0.830078f, 0.170654f, 0.835449f, 0.163696f, + 0.839844f, 0.157227f, 0.843750f, 0.150879f, 0.849609f, 0.144043f, 0.854492f, 0.137573f, + 0.857422f, 0.131104f, 0.861328f, 0.124023f, 0.865234f, 0.116577f, 0.867676f, 0.109924f, + 0.872070f, 0.103149f, 0.875488f, 0.094849f, 0.877930f, 0.087708f, 0.880371f, 0.078979f, + 0.882812f, 0.069092f, 0.883789f, 0.058105f, 0.881348f, 0.042664f, 0.875000f, 0.016068f, + 0.000000f, 1.000000f, 0.098633f, 0.956543f, 0.175781f, 0.903809f, 0.235596f, 0.855957f, + 0.286865f, 0.811035f, 0.329346f, 0.770996f, 0.366699f, 0.733887f, 0.398682f, 0.700195f, + 0.428955f, 0.668457f, 0.455566f, 0.639648f, 0.479004f, 0.612793f, 0.500977f, 0.587891f, + 0.522949f, 0.563477f, 0.541504f, 0.541504f, 0.558594f, 0.520508f, 0.576172f, 0.500488f, + 0.591309f, 0.481689f, 0.605957f, 0.464355f, 0.619629f, 0.447266f, 0.633301f, 0.430908f, + 0.646973f, 0.415039f, 0.656738f, 0.400635f, 0.669434f, 0.385986f, 0.679199f, 0.372559f, + 0.688965f, 0.359863f, 0.698730f, 0.347412f, 0.708496f, 0.334717f, 0.718262f, 0.322998f, + 0.727539f, 0.311768f, 0.736328f, 0.300781f, 0.743164f, 0.290527f, 0.751953f, 0.279785f, + 0.758789f, 0.270020f, 0.767090f, 0.260742f, 0.771973f, 0.251953f, 0.779297f, 0.242798f, + 0.788574f, 0.233398f, 0.793945f, 0.224854f, 0.800781f, 0.216187f, 0.807129f, 0.208252f, + 0.812012f, 0.200317f, 0.818359f, 0.192749f, 0.824707f, 0.185181f, 0.828613f, 0.178101f, + 0.833984f, 0.171021f, 0.839355f, 0.164185f, 0.844238f, 0.157471f, 0.848633f, 0.150757f, + 0.853027f, 0.144653f, 0.858887f, 0.137939f, 0.863281f, 0.131470f, 0.867676f, 0.125488f, + 0.871582f, 0.119629f, 0.875977f, 0.112793f, 0.878906f, 0.105774f, 0.881348f, 0.099548f, + 0.886719f, 0.092590f, 0.889160f, 0.086121f, 0.891113f, 0.078796f, 0.895508f, 0.069946f, + 0.895508f, 0.062012f, 0.897949f, 0.051208f, 0.896973f, 0.038055f, 0.893066f, 0.013466f, + 0.000000f, 1.000000f, 0.100159f, 0.955566f, 0.176392f, 0.903320f, 0.239258f, 0.853516f, + 0.291016f, 0.808105f, 0.335693f, 0.766602f, 0.372803f, 0.729492f, 0.405762f, 0.694824f, + 0.436035f, 0.662598f, 0.463623f, 0.633301f, 0.489502f, 0.605469f, 0.511230f, 0.579590f, + 0.532715f, 0.555176f, 0.551758f, 0.532715f, 0.571289f, 0.510742f, 0.588379f, 0.490234f, + 0.604004f, 0.471191f, 0.617188f, 0.453369f, 0.632324f, 0.435791f, 0.645020f, 0.419189f, + 0.658691f, 0.403564f, 0.670410f, 0.388184f, 0.682617f, 0.373779f, 0.693359f, 0.359863f, + 0.703125f, 0.346680f, 0.712402f, 0.334229f, 0.724121f, 0.321289f, 0.732910f, 0.309570f, + 0.740234f, 0.298584f, 0.749512f, 0.287598f, 0.758301f, 0.276855f, 0.765625f, 0.266357f, + 0.772949f, 0.256348f, 0.782227f, 0.246582f, 0.787598f, 0.237915f, 0.793945f, 0.229248f, + 0.801758f, 0.220337f, 0.807617f, 0.211670f, 0.813965f, 0.203247f, 0.821289f, 0.194824f, + 0.826660f, 0.187134f, 0.831543f, 0.179810f, 0.838379f, 0.172241f, 0.843262f, 0.165039f, + 0.847656f, 0.158325f, 0.853516f, 0.151489f, 0.857422f, 0.144897f, 0.862305f, 0.138428f, + 0.866699f, 0.132690f, 0.871582f, 0.125977f, 0.876465f, 0.120117f, 0.879395f, 0.114685f, + 0.885254f, 0.107971f, 0.889160f, 0.102600f, 0.891113f, 0.096558f, 0.895020f, 0.089722f, + 0.898926f, 0.083252f, 0.901367f, 0.077332f, 0.905273f, 0.071045f, 0.906738f, 0.062805f, + 0.910645f, 0.054810f, 0.910156f, 0.046295f, 0.911133f, 0.033295f, 0.906250f, 0.012779f, + 0.000000f, 1.000000f, 0.101318f, 0.955078f, 0.177979f, 0.902832f, 0.242188f, 0.852051f, + 0.294434f, 0.806152f, 0.340088f, 0.763672f, 0.378906f, 0.725098f, 0.414307f, 0.689453f, + 0.445557f, 0.656738f, 0.473633f, 0.625977f, 0.498047f, 0.598145f, 0.521484f, 0.571289f, + 0.543945f, 0.545898f, 0.562988f, 0.523438f, 0.583496f, 0.500977f, 0.598633f, 0.480957f, + 0.614746f, 0.461182f, 0.630371f, 0.442383f, 0.645508f, 0.424561f, 0.660156f, 0.407227f, + 0.671875f, 0.391602f, 0.685547f, 0.375732f, 0.696777f, 0.361572f, 0.706543f, 0.347656f, + 0.718262f, 0.333984f, 0.726562f, 0.321289f, 0.737305f, 0.308838f, 0.746094f, 0.296875f, + 0.756348f, 0.285156f, 0.764160f, 0.274170f, 0.770996f, 0.264404f, 0.779785f, 0.253418f, + 0.787598f, 0.243408f, 0.795410f, 0.233765f, 0.802246f, 0.224609f, 0.807129f, 0.216309f, + 0.815430f, 0.207397f, 0.820312f, 0.199341f, 0.826660f, 0.191162f, 0.834961f, 0.182251f, + 0.839844f, 0.174927f, 0.844238f, 0.167480f, 0.851074f, 0.160034f, 0.856445f, 0.152954f, + 0.860352f, 0.146484f, 0.865723f, 0.139771f, 0.870605f, 0.133179f, 0.874023f, 0.127686f, + 0.879883f, 0.121033f, 0.884766f, 0.114929f, 0.887207f, 0.109680f, 0.892578f, 0.103516f, + 0.895996f, 0.098083f, 0.899902f, 0.092773f, 0.904297f, 0.087219f, 0.907715f, 0.080933f, + 0.909180f, 0.075745f, 0.913574f, 0.068542f, 0.915527f, 0.063354f, 0.919434f, 0.056274f, + 0.920410f, 0.049133f, 0.922852f, 0.040192f, 0.923340f, 0.029037f, 0.918945f, 0.010727f, + 0.000000f, 1.000000f, 0.101074f, 0.955566f, 0.181641f, 0.900879f, 0.244019f, 0.850586f, + 0.299316f, 0.803223f, 0.346680f, 0.759766f, 0.386475f, 0.720215f, 0.422119f, 0.683594f, + 0.453125f, 0.650391f, 0.481689f, 0.619141f, 0.508789f, 0.589844f, 0.532227f, 0.562988f, + 0.555176f, 0.537598f, 0.575195f, 0.513672f, 0.594238f, 0.491455f, 0.611816f, 0.470215f, + 0.627930f, 0.450195f, 0.643555f, 0.431396f, 0.659180f, 0.412842f, 0.672363f, 0.396240f, + 0.684570f, 0.379883f, 0.697266f, 0.364258f, 0.708984f, 0.349609f, 0.720703f, 0.335205f, + 0.731934f, 0.321777f, 0.740723f, 0.308838f, 0.750488f, 0.296387f, 0.759277f, 0.284668f, + 0.768555f, 0.272705f, 0.778809f, 0.261230f, 0.785156f, 0.251465f, 0.793457f, 0.241089f, + 0.800293f, 0.231201f, 0.809082f, 0.221191f, 0.814941f, 0.212280f, 0.821289f, 0.203613f, + 0.829102f, 0.194702f, 0.833496f, 0.187134f, 0.839844f, 0.179321f, 0.846680f, 0.170776f, + 0.852051f, 0.163330f, 0.858398f, 0.155518f, 0.862305f, 0.148560f, 0.868164f, 0.141724f, + 0.873047f, 0.135254f, 0.877930f, 0.128418f, 0.881836f, 0.122742f, 0.887207f, 0.116272f, + 0.891602f, 0.110535f, 0.894043f, 0.105164f, 0.900391f, 0.099365f, 0.903809f, 0.093689f, + 0.907227f, 0.089172f, 0.911621f, 0.082947f, 0.915039f, 0.078430f, 0.918457f, 0.073120f, + 0.920898f, 0.067749f, 0.924316f, 0.061584f, 0.926270f, 0.055939f, 0.930664f, 0.049683f, + 0.932129f, 0.043274f, 0.934082f, 0.035919f, 0.934082f, 0.025879f, 0.931152f, 0.010231f, + 0.000000f, 1.000000f, 0.101440f, 0.955078f, 0.181763f, 0.900879f, 0.247925f, 0.848633f, + 0.303467f, 0.800781f, 0.351562f, 0.756348f, 0.393311f, 0.715820f, 0.429199f, 0.678711f, + 0.462646f, 0.644043f, 0.491455f, 0.612305f, 0.518555f, 0.582520f, 0.542969f, 0.554688f, + 0.564941f, 0.529297f, 0.586914f, 0.504395f, 0.605469f, 0.481689f, 0.624023f, 0.459961f, + 0.639648f, 0.439941f, 0.656738f, 0.420410f, 0.671387f, 0.402344f, 0.683594f, 0.385254f, + 0.698242f, 0.368164f, 0.709961f, 0.352783f, 0.721680f, 0.337891f, 0.733887f, 0.323242f, + 0.743652f, 0.310059f, 0.752930f, 0.296875f, 0.763184f, 0.284180f, 0.772461f, 0.272217f, + 0.782715f, 0.260742f, 0.790527f, 0.249634f, 0.797852f, 0.239136f, 0.805664f, 0.228760f, + 0.812012f, 0.219727f, 0.820801f, 0.209717f, 0.826660f, 0.200562f, 0.834961f, 0.191284f, + 0.839844f, 0.183350f, 0.845703f, 0.175293f, 0.852539f, 0.167358f, 0.856934f, 0.160278f, + 0.864746f, 0.152344f, 0.868652f, 0.145020f, 0.874512f, 0.137695f, 0.880371f, 0.131226f, + 0.885254f, 0.124084f, 0.887207f, 0.119202f, 0.894043f, 0.111816f, 0.897461f, 0.106445f, + 0.903809f, 0.100586f, 0.905762f, 0.095093f, 0.909180f, 0.090454f, 0.915039f, 0.084290f, + 0.916992f, 0.079895f, 0.922363f, 0.074341f, 0.924805f, 0.070007f, 0.928711f, 0.064880f, + 0.931641f, 0.060455f, 0.934570f, 0.055267f, 0.937012f, 0.049316f, 0.938965f, 0.043762f, + 0.942383f, 0.038239f, 0.943359f, 0.031235f, 0.945801f, 0.022858f, 0.943359f, 0.008293f, + 0.000000f, 1.000000f, 0.101990f, 0.955078f, 0.184082f, 0.899414f, 0.251709f, 0.846680f, + 0.308105f, 0.797363f, 0.358398f, 0.751953f, 0.399414f, 0.710938f, 0.436523f, 0.673340f, + 0.469238f, 0.638184f, 0.500000f, 0.605469f, 0.527832f, 0.575195f, 0.553223f, 0.546387f, + 0.575684f, 0.520020f, 0.595703f, 0.496094f, 0.617676f, 0.471924f, 0.635254f, 0.450195f, + 0.652832f, 0.429443f, 0.667480f, 0.410400f, 0.682617f, 0.391846f, 0.697754f, 0.373535f, + 0.710938f, 0.356934f, 0.724121f, 0.341064f, 0.734375f, 0.326416f, 0.745605f, 0.312012f, + 0.755859f, 0.298340f, 0.765625f, 0.285400f, 0.776367f, 0.272461f, 0.785645f, 0.260254f, + 0.794922f, 0.249023f, 0.802246f, 0.238403f, 0.811035f, 0.227417f, 0.818359f, 0.217041f, + 0.825195f, 0.207764f, 0.831543f, 0.198608f, 0.839355f, 0.189331f, 0.846191f, 0.180420f, + 0.851562f, 0.172119f, 0.858887f, 0.163818f, 0.863281f, 0.156372f, 0.870117f, 0.149170f, + 0.874512f, 0.141968f, 0.878906f, 0.135742f, 0.886230f, 0.127563f, 0.890137f, 0.121521f, + 0.895996f, 0.114380f, 0.899414f, 0.108704f, 0.904785f, 0.102539f, 0.908203f, 0.097107f, + 0.913086f, 0.091370f, 0.916016f, 0.086487f, 0.920410f, 0.081055f, 0.923828f, 0.076172f, + 0.926758f, 0.071655f, 0.930664f, 0.066711f, 0.933594f, 0.062225f, 0.937500f, 0.057587f, + 0.939941f, 0.053406f, 0.944336f, 0.048767f, 0.946289f, 0.044495f, 0.949219f, 0.038361f, + 0.951660f, 0.032867f, 0.953125f, 0.027573f, 0.953613f, 0.019714f, 0.954102f, 0.007561f, + 0.000000f, 1.000000f, 0.103210f, 0.954102f, 0.184937f, 0.898926f, 0.254639f, 0.844727f, + 0.312012f, 0.794922f, 0.362549f, 0.749023f, 0.405273f, 0.707031f, 0.444092f, 0.667969f, + 0.479248f, 0.631348f, 0.510742f, 0.598145f, 0.537109f, 0.567383f, 0.562988f, 0.538574f, + 0.586426f, 0.511719f, 0.608398f, 0.486328f, 0.627930f, 0.462891f, 0.645508f, 0.440674f, + 0.662598f, 0.419922f, 0.679688f, 0.399658f, 0.694824f, 0.381104f, 0.709961f, 0.363037f, + 0.723633f, 0.345947f, 0.735352f, 0.330566f, 0.745117f, 0.315430f, 0.757812f, 0.300781f, + 0.768066f, 0.287354f, 0.777832f, 0.273926f, 0.788574f, 0.261230f, 0.797852f, 0.249390f, + 0.806152f, 0.237671f, 0.812988f, 0.227539f, 0.822754f, 0.216431f, 0.829102f, 0.206665f, + 0.837402f, 0.196167f, 0.843262f, 0.187866f, 0.850098f, 0.178345f, 0.856934f, 0.170532f, + 0.863281f, 0.161499f, 0.869141f, 0.153809f, 0.875000f, 0.145874f, 0.880371f, 0.138794f, + 0.885254f, 0.131714f, 0.889648f, 0.125488f, 0.895020f, 0.118896f, 0.899414f, 0.112488f, + 0.904785f, 0.105896f, 0.909668f, 0.099670f, 0.914551f, 0.093872f, 0.917969f, 0.088379f, + 0.922363f, 0.083069f, 0.925781f, 0.077759f, 0.929199f, 0.073120f, 0.932617f, 0.068115f, + 0.936523f, 0.063599f, 0.939941f, 0.058990f, 0.943359f, 0.054779f, 0.946777f, 0.050354f, + 0.948730f, 0.046722f, 0.952148f, 0.042236f, 0.955566f, 0.038208f, 0.958984f, 0.034027f, + 0.959473f, 0.028656f, 0.962402f, 0.022903f, 0.964355f, 0.017456f, 0.962891f, 0.006824f, + 0.000000f, 1.000000f, 0.103149f, 0.954590f, 0.187622f, 0.897949f, 0.257568f, 0.843262f, + 0.317871f, 0.791992f, 0.369629f, 0.744629f, 0.412842f, 0.702148f, 0.453125f, 0.661621f, + 0.487061f, 0.625488f, 0.518066f, 0.591797f, 0.546875f, 0.560059f, 0.573730f, 0.530273f, + 0.596191f, 0.503418f, 0.619141f, 0.477051f, 0.639160f, 0.453125f, 0.659180f, 0.430420f, + 0.674805f, 0.409424f, 0.691406f, 0.389404f, 0.706055f, 0.370361f, 0.720703f, 0.352539f, + 0.733887f, 0.335449f, 0.746582f, 0.319580f, 0.756348f, 0.304932f, 0.770020f, 0.289551f, + 0.781738f, 0.275391f, 0.790527f, 0.263428f, 0.799316f, 0.250488f, 0.809082f, 0.238403f, + 0.817383f, 0.227417f, 0.825684f, 0.215942f, 0.833008f, 0.205811f, 0.839844f, 0.196167f, + 0.848145f, 0.186157f, 0.854492f, 0.177002f, 0.861328f, 0.168213f, 0.867676f, 0.159668f, + 0.873047f, 0.152100f, 0.879395f, 0.144165f, 0.885254f, 0.136353f, 0.890137f, 0.129150f, + 0.895996f, 0.122375f, 0.900391f, 0.115967f, 0.904785f, 0.109680f, 0.909180f, 0.103760f, + 0.913574f, 0.097961f, 0.918945f, 0.091736f, 0.922363f, 0.085876f, 0.926758f, 0.080383f, + 0.930664f, 0.075012f, 0.935059f, 0.070068f, 0.938477f, 0.065186f, 0.942383f, 0.060944f, + 0.944824f, 0.056366f, 0.948730f, 0.051880f, 0.951172f, 0.047943f, 0.953613f, 0.044098f, + 0.957520f, 0.040131f, 0.960449f, 0.036285f, 0.962402f, 0.032806f, 0.965820f, 0.028778f, + 0.968750f, 0.025314f, 0.970215f, 0.019409f, 0.971191f, 0.013916f, 0.971680f, 0.004665f, + 0.000000f, 1.000000f, 0.104492f, 0.953613f, 0.189575f, 0.896973f, 0.261230f, 0.840820f, + 0.322021f, 0.789062f, 0.375244f, 0.741211f, 0.421143f, 0.696777f, 0.459717f, 0.656738f, + 0.496582f, 0.618652f, 0.529297f, 0.583984f, 0.558105f, 0.551758f, 0.583008f, 0.522461f, + 0.607422f, 0.494385f, 0.631348f, 0.468262f, 0.650879f, 0.443604f, 0.667969f, 0.421143f, + 0.685547f, 0.399902f, 0.704102f, 0.379639f, 0.719238f, 0.360352f, 0.733398f, 0.342041f, + 0.746094f, 0.325439f, 0.758301f, 0.309082f, 0.769531f, 0.293945f, 0.781250f, 0.279053f, + 0.791016f, 0.265625f, 0.801758f, 0.252197f, 0.811035f, 0.239746f, 0.819336f, 0.228149f, + 0.828125f, 0.216675f, 0.835449f, 0.206299f, 0.844727f, 0.195557f, 0.852051f, 0.185425f, + 0.858398f, 0.176147f, 0.864258f, 0.167725f, 0.871582f, 0.158569f, 0.877930f, 0.149902f, + 0.883301f, 0.142334f, 0.888672f, 0.134766f, 0.893555f, 0.127930f, 0.899414f, 0.120667f, + 0.905273f, 0.113342f, 0.910645f, 0.106750f, 0.914551f, 0.100708f, 0.919434f, 0.094727f, + 0.921875f, 0.089539f, 0.926270f, 0.084106f, 0.930176f, 0.079163f, 0.935059f, 0.073425f, + 0.939941f, 0.067627f, 0.943359f, 0.063049f, 0.946289f, 0.058472f, 0.950195f, 0.053711f, + 0.952637f, 0.049927f, 0.956055f, 0.045410f, 0.958496f, 0.041595f, 0.961426f, 0.038086f, + 0.964844f, 0.033997f, 0.967285f, 0.030716f, 0.970215f, 0.027283f, 0.972656f, 0.023804f, + 0.974609f, 0.020844f, 0.979004f, 0.016663f, 0.978027f, 0.011475f, 0.979980f, 0.004517f, + 0.000000f, 1.000000f, 0.103699f, 0.954590f, 0.191895f, 0.895508f, 0.263916f, 0.839355f, + 0.325439f, 0.786621f, 0.379150f, 0.737793f, 0.427002f, 0.692383f, 0.467773f, 0.650879f, + 0.503418f, 0.612793f, 0.537109f, 0.577637f, 0.566406f, 0.544434f, 0.594238f, 0.514160f, + 0.618164f, 0.485840f, 0.641113f, 0.459229f, 0.661133f, 0.434814f, 0.680664f, 0.411377f, + 0.698242f, 0.389648f, 0.713379f, 0.369629f, 0.729492f, 0.350098f, 0.743164f, 0.332031f, + 0.757324f, 0.314941f, 0.768555f, 0.298828f, 0.780762f, 0.283447f, 0.791992f, 0.269043f, + 0.802734f, 0.255127f, 0.812500f, 0.242188f, 0.820801f, 0.230103f, 0.830566f, 0.217773f, + 0.839355f, 0.206665f, 0.846680f, 0.196045f, 0.854004f, 0.185669f, 0.860840f, 0.176147f, + 0.867676f, 0.167114f, 0.875488f, 0.157715f, 0.879883f, 0.149658f, 0.886719f, 0.141235f, + 0.892578f, 0.133545f, 0.899414f, 0.125488f, 0.902832f, 0.118835f, 0.909668f, 0.111755f, + 0.913086f, 0.105652f, 0.917969f, 0.099609f, 0.923340f, 0.092896f, 0.926758f, 0.087158f, + 0.931641f, 0.081299f, 0.935059f, 0.076233f, 0.938477f, 0.071289f, 0.942383f, 0.066467f, + 0.944336f, 0.062439f, 0.950195f, 0.057098f, 0.954102f, 0.051971f, 0.957520f, 0.047729f, + 0.960938f, 0.043304f, 0.963379f, 0.039429f, 0.966309f, 0.035736f, 0.970215f, 0.031647f, + 0.972168f, 0.028305f, 0.974609f, 0.025269f, 0.977539f, 0.021774f, 0.979492f, 0.018845f, + 0.981445f, 0.016144f, 0.984863f, 0.012421f, 0.986328f, 0.009705f, 0.987793f, 0.002100f, + 0.000000f, 1.000000f, 0.104919f, 0.953613f, 0.193481f, 0.895020f, 0.266113f, 0.837891f, + 0.330811f, 0.783203f, 0.385986f, 0.733398f, 0.433105f, 0.687988f, 0.476074f, 0.645020f, + 0.513184f, 0.606445f, 0.546387f, 0.570312f, 0.576172f, 0.537109f, 0.604492f, 0.505859f, + 0.628906f, 0.477295f, 0.651855f, 0.450439f, 0.672363f, 0.425537f, 0.690918f, 0.401855f, + 0.708984f, 0.380127f, 0.726074f, 0.359375f, 0.741699f, 0.340088f, 0.754883f, 0.322266f, + 0.767090f, 0.305176f, 0.780762f, 0.288574f, 0.791016f, 0.273926f, 0.803711f, 0.258789f, + 0.813477f, 0.245483f, 0.822754f, 0.232300f, 0.831055f, 0.220459f, 0.841309f, 0.208008f, + 0.848633f, 0.197388f, 0.856934f, 0.186523f, 0.864258f, 0.176392f, 0.870117f, 0.167236f, + 0.878418f, 0.157593f, 0.883789f, 0.148926f, 0.890625f, 0.140747f, 0.896973f, 0.132690f, + 0.902344f, 0.124878f, 0.906738f, 0.117554f, 0.911133f, 0.111084f, 0.916504f, 0.104431f, + 0.922363f, 0.097473f, 0.927246f, 0.091187f, 0.931641f, 0.085327f, 0.935059f, 0.080139f, + 0.938965f, 0.074890f, 0.942871f, 0.069336f, 0.946289f, 0.064331f, 0.950684f, 0.059265f, + 0.954102f, 0.054565f, 0.957031f, 0.050537f, 0.959473f, 0.046753f, 0.962891f, 0.042542f, + 0.965332f, 0.039246f, 0.969238f, 0.034851f, 0.973633f, 0.030243f, 0.976074f, 0.026428f, + 0.978516f, 0.023300f, 0.980469f, 0.020340f, 0.984375f, 0.016403f, 0.985840f, 0.014069f, + 0.987793f, 0.011551f, 0.991211f, 0.008347f, 0.992676f, 0.005676f, 0.994141f, 0.003460f, + 0.000000f, 1.000000f, 0.106079f, 0.953125f, 0.194214f, 0.894531f, 0.270264f, 0.836426f, + 0.335205f, 0.781250f, 0.390625f, 0.729980f, 0.439697f, 0.683105f, 0.483398f, 0.639648f, + 0.521484f, 0.600098f, 0.555664f, 0.563477f, 0.586914f, 0.529297f, 0.615234f, 0.498047f, + 0.637695f, 0.469482f, 0.662598f, 0.441650f, 0.682129f, 0.416748f, 0.701660f, 0.393066f, + 0.720703f, 0.370850f, 0.736816f, 0.349854f, 0.752930f, 0.330322f, 0.767578f, 0.312256f, + 0.778809f, 0.295654f, 0.788086f, 0.280029f, 0.802246f, 0.263672f, 0.814941f, 0.249023f, + 0.821289f, 0.236816f, 0.833008f, 0.222778f, 0.842285f, 0.211182f, 0.849609f, 0.199097f, + 0.858398f, 0.188477f, 0.865723f, 0.177612f, 0.873047f, 0.167603f, 0.880371f, 0.158203f, + 0.888184f, 0.148926f, 0.893066f, 0.140869f, 0.898926f, 0.132446f, 0.904785f, 0.124023f, + 0.909668f, 0.117615f, 0.916016f, 0.109924f, 0.920898f, 0.102356f, 0.922852f, 0.097961f, + 0.930176f, 0.090576f, 0.936523f, 0.082825f, 0.936523f, 0.078857f, 0.940430f, 0.074707f, + 0.947754f, 0.067871f, 0.952637f, 0.061066f, 0.952637f, 0.057983f, 0.952637f, 0.055847f, + 0.960938f, 0.049866f, 0.968262f, 0.042328f, 0.968262f, 0.038971f, 0.968262f, 0.037048f, + 0.968262f, 0.035675f, 0.974609f, 0.031281f, 0.983887f, 0.022980f, 0.983887f, 0.019745f, + 0.983887f, 0.018219f, 0.983887f, 0.017288f, 0.983887f, 0.016663f, 0.985840f, 0.015717f, + 0.999512f, 0.003330f, 0.999512f, 0.000731f, 0.999512f, 0.000126f, 0.999512f, 0.000002f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995117f, 0.000000f, 0.994141f, + 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.990723f, 0.000000f, 0.989258f, + 0.000000f, 0.988281f, 0.000000f, 0.987305f, 0.000000f, 0.985352f, 0.000000f, 0.983398f, + 0.000000f, 0.982422f, 0.000000f, 0.979980f, 0.000000f, 0.978027f, 0.000000f, 0.976562f, + 0.000000f, 0.973633f, 0.000000f, 0.971680f, 0.000000f, 0.968750f, 0.000000f, 0.966309f, + 0.000000f, 0.963379f, 0.000000f, 0.960938f, 0.000000f, 0.957031f, 0.000000f, 0.953613f, + 0.000000f, 0.950195f, 0.000000f, 0.946289f, 0.000000f, 0.941895f, 0.000000f, 0.937988f, + 0.000000f, 0.932617f, 0.000000f, 0.927734f, 0.000000f, 0.922363f, 0.000000f, 0.916992f, + 0.000000f, 0.910645f, 0.000000f, 0.904785f, 0.000000f, 0.896484f, 0.000000f, 0.888672f, + 0.000000f, 0.879883f, 0.000000f, 0.870605f, 0.000000f, 0.861328f, 0.000000f, 0.851074f, + 0.000000f, 0.838867f, 0.000000f, 0.825684f, 0.000000f, 0.811523f, 0.000000f, 0.795898f, + 0.000000f, 0.778320f, 0.000000f, 0.758301f, 0.000000f, 0.736328f, 0.000000f, 0.711426f, + 0.000000f, 0.682617f, 0.000000f, 0.648926f, 0.000000f, 0.608887f, 0.000000f, 0.561523f, + 0.000000f, 0.501465f, 0.000000f, 0.423096f, 0.000000f, 0.310791f, 0.000000f, 0.118774f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, + 0.000000f, 0.993652f, 0.000000f, 0.992188f, 0.000000f, 0.990723f, 0.000000f, 0.989746f, + 0.000000f, 0.988281f, 0.000000f, 0.986816f, 0.000000f, 0.985840f, 0.000000f, 0.983887f, + 0.000000f, 0.981445f, 0.000000f, 0.980469f, 0.000000f, 0.978027f, 0.000000f, 0.976074f, + 0.000000f, 0.974121f, 0.000000f, 0.971191f, 0.000000f, 0.969238f, 0.000000f, 0.965820f, + 0.000000f, 0.963867f, 0.000000f, 0.960449f, 0.000000f, 0.957520f, 0.000000f, 0.953613f, + 0.000000f, 0.949707f, 0.000000f, 0.945801f, 0.000000f, 0.941895f, 0.000000f, 0.937988f, + 0.000000f, 0.933105f, 0.000000f, 0.927734f, 0.000000f, 0.922363f, 0.000000f, 0.916504f, + 0.000000f, 0.910645f, 0.000000f, 0.903809f, 0.000000f, 0.895996f, 0.000000f, 0.888672f, + 0.000000f, 0.879883f, 0.000000f, 0.871094f, 0.000000f, 0.861328f, 0.000000f, 0.851074f, + 0.000000f, 0.838867f, 0.000000f, 0.825684f, 0.000000f, 0.811523f, 0.000000f, 0.795898f, + 0.000000f, 0.778320f, 0.000000f, 0.758301f, 0.000000f, 0.736328f, 0.000000f, 0.710938f, + 0.000000f, 0.682617f, 0.000000f, 0.648438f, 0.000003f, 0.608887f, 0.000004f, 0.561523f, + 0.000003f, 0.501953f, 0.000002f, 0.423584f, 0.000002f, 0.311523f, 0.000001f, 0.119202f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, + 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.991211f, 0.000000f, 0.989258f, + 0.000000f, 0.987793f, 0.000000f, 0.986816f, 0.000000f, 0.985352f, 0.000000f, 0.983398f, + 0.000000f, 0.981445f, 0.000000f, 0.979492f, 0.000000f, 0.978027f, 0.000000f, 0.976074f, + 0.000000f, 0.973145f, 0.000000f, 0.971191f, 0.000000f, 0.968262f, 0.000000f, 0.965820f, + 0.000000f, 0.962891f, 0.000000f, 0.959961f, 0.000000f, 0.956543f, 0.000000f, 0.953125f, + 0.000000f, 0.949707f, 0.000000f, 0.945312f, 0.000000f, 0.941406f, 0.000000f, 0.937012f, + 0.000000f, 0.932129f, 0.000000f, 0.926758f, 0.000000f, 0.921387f, 0.000000f, 0.916016f, + 0.000000f, 0.910156f, 0.000000f, 0.902832f, 0.000000f, 0.895508f, 0.000005f, 0.887695f, + 0.000013f, 0.879395f, 0.000022f, 0.870605f, 0.000033f, 0.860840f, 0.000044f, 0.849609f, + 0.000048f, 0.837891f, 0.000049f, 0.824707f, 0.000049f, 0.810547f, 0.000046f, 0.794922f, + 0.000044f, 0.777832f, 0.000040f, 0.757812f, 0.000035f, 0.735352f, 0.000031f, 0.710449f, + 0.000033f, 0.682129f, 0.000032f, 0.647949f, 0.000028f, 0.608398f, 0.000026f, 0.561035f, + 0.000024f, 0.501465f, 0.000020f, 0.422852f, 0.000016f, 0.311279f, 0.000011f, 0.119324f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.996094f, 0.000000f, 0.995117f, 0.000000f, 0.995117f, 0.000000f, 0.993652f, + 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.990234f, 0.000000f, 0.989258f, + 0.000000f, 0.987793f, 0.000000f, 0.985840f, 0.000000f, 0.984863f, 0.000000f, 0.982910f, + 0.000000f, 0.981445f, 0.000000f, 0.979004f, 0.000000f, 0.977051f, 0.000000f, 0.975098f, + 0.000000f, 0.972656f, 0.000002f, 0.970215f, 0.000010f, 0.967773f, 0.000020f, 0.965332f, + 0.000034f, 0.962402f, 0.000047f, 0.959473f, 0.000064f, 0.956055f, 0.000079f, 0.952148f, + 0.000095f, 0.948730f, 0.000112f, 0.944336f, 0.000129f, 0.940918f, 0.000145f, 0.936035f, + 0.000163f, 0.931152f, 0.000180f, 0.926270f, 0.000187f, 0.920410f, 0.000191f, 0.915039f, + 0.000190f, 0.908691f, 0.000185f, 0.902344f, 0.000178f, 0.894531f, 0.000173f, 0.886719f, + 0.000164f, 0.878418f, 0.000154f, 0.869141f, 0.000142f, 0.859375f, 0.000137f, 0.848633f, + 0.000136f, 0.836914f, 0.000138f, 0.823730f, 0.000144f, 0.809570f, 0.000141f, 0.793945f, + 0.000132f, 0.776855f, 0.000121f, 0.756836f, 0.000122f, 0.734375f, 0.000119f, 0.709473f, + 0.000110f, 0.681152f, 0.000106f, 0.646973f, 0.000101f, 0.607422f, 0.000095f, 0.560547f, + 0.000085f, 0.500977f, 0.000079f, 0.422852f, 0.000066f, 0.310791f, 0.000038f, 0.118713f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, + 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.993652f, 0.000001f, 0.993652f, + 0.000014f, 0.992676f, 0.000038f, 0.990723f, 0.000059f, 0.989746f, 0.000087f, 0.988281f, + 0.000112f, 0.987305f, 0.000136f, 0.985352f, 0.000165f, 0.983398f, 0.000191f, 0.982422f, + 0.000213f, 0.980469f, 0.000240f, 0.979004f, 0.000266f, 0.976074f, 0.000289f, 0.974121f, + 0.000310f, 0.972168f, 0.000333f, 0.969727f, 0.000359f, 0.966797f, 0.000381f, 0.964355f, + 0.000400f, 0.960938f, 0.000417f, 0.958008f, 0.000437f, 0.954590f, 0.000443f, 0.951172f, + 0.000439f, 0.947266f, 0.000429f, 0.943359f, 0.000414f, 0.939453f, 0.000404f, 0.935059f, + 0.000389f, 0.929688f, 0.000377f, 0.924805f, 0.000367f, 0.919434f, 0.000362f, 0.913574f, + 0.000366f, 0.907227f, 0.000373f, 0.900879f, 0.000381f, 0.893555f, 0.000372f, 0.885254f, + 0.000376f, 0.876953f, 0.000374f, 0.867676f, 0.000368f, 0.857910f, 0.000369f, 0.846680f, + 0.000346f, 0.834961f, 0.000344f, 0.821777f, 0.000348f, 0.808105f, 0.000345f, 0.791992f, + 0.000345f, 0.774902f, 0.000314f, 0.754883f, 0.000312f, 0.732910f, 0.000311f, 0.708008f, + 0.000304f, 0.679688f, 0.000272f, 0.645996f, 0.000271f, 0.606445f, 0.000267f, 0.559570f, + 0.000230f, 0.500000f, 0.000226f, 0.422119f, 0.000194f, 0.310547f, 0.000089f, 0.118958f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000004f, 0.999023f, + 0.000049f, 0.998047f, 0.000116f, 0.997559f, 0.000161f, 0.997070f, 0.000219f, 0.997070f, + 0.000268f, 0.995605f, 0.000304f, 0.994141f, 0.000349f, 0.994141f, 0.000395f, 0.992676f, + 0.000430f, 0.991699f, 0.000457f, 0.990723f, 0.000491f, 0.988770f, 0.000532f, 0.987793f, + 0.000563f, 0.986328f, 0.000588f, 0.984863f, 0.000607f, 0.982910f, 0.000638f, 0.980957f, + 0.000672f, 0.979492f, 0.000698f, 0.977539f, 0.000718f, 0.975586f, 0.000734f, 0.972656f, + 0.000751f, 0.970703f, 0.000769f, 0.968262f, 0.000764f, 0.965820f, 0.000755f, 0.962891f, + 0.000746f, 0.959961f, 0.000739f, 0.957031f, 0.000741f, 0.953125f, 0.000755f, 0.949707f, + 0.000765f, 0.946289f, 0.000748f, 0.941895f, 0.000752f, 0.937988f, 0.000752f, 0.933105f, + 0.000764f, 0.928711f, 0.000785f, 0.922852f, 0.000763f, 0.916992f, 0.000774f, 0.911621f, + 0.000782f, 0.905762f, 0.000781f, 0.898438f, 0.000790f, 0.891113f, 0.000754f, 0.883789f, + 0.000756f, 0.875000f, 0.000765f, 0.865723f, 0.000762f, 0.855469f, 0.000761f, 0.845215f, + 0.000772f, 0.833496f, 0.000726f, 0.819824f, 0.000721f, 0.806152f, 0.000715f, 0.790039f, + 0.000713f, 0.772949f, 0.000667f, 0.752930f, 0.000661f, 0.730957f, 0.000654f, 0.706543f, + 0.000633f, 0.678223f, 0.000607f, 0.644043f, 0.000587f, 0.604980f, 0.000575f, 0.558105f, + 0.000537f, 0.499512f, 0.000507f, 0.421875f, 0.000431f, 0.310547f, 0.000169f, 0.118103f, + 0.000000f, 1.000000f, 0.000213f, 0.999512f, 0.000377f, 0.999023f, 0.000426f, 0.998535f, + 0.000521f, 0.998047f, 0.000593f, 0.997070f, 0.000622f, 0.997070f, 0.000648f, 0.996094f, + 0.000748f, 0.995117f, 0.000783f, 0.994141f, 0.000803f, 0.993164f, 0.000814f, 0.992188f, + 0.000896f, 0.990723f, 0.000933f, 0.989746f, 0.000953f, 0.988770f, 0.000966f, 0.986816f, + 0.000974f, 0.985840f, 0.001040f, 0.983887f, 0.001085f, 0.982422f, 0.001128f, 0.979980f, + 0.001166f, 0.978516f, 0.001181f, 0.976074f, 0.001194f, 0.974609f, 0.001233f, 0.971680f, + 0.001244f, 0.969727f, 0.001245f, 0.966309f, 0.001249f, 0.964355f, 0.001251f, 0.961914f, + 0.001231f, 0.958008f, 0.001264f, 0.955078f, 0.001286f, 0.951660f, 0.001309f, 0.947754f, + 0.001332f, 0.944336f, 0.001299f, 0.939941f, 0.001328f, 0.935547f, 0.001386f, 0.931152f, + 0.001400f, 0.926270f, 0.001399f, 0.920898f, 0.001336f, 0.915039f, 0.001348f, 0.909180f, + 0.001355f, 0.903320f, 0.001403f, 0.895996f, 0.001408f, 0.888672f, 0.001418f, 0.880371f, + 0.001347f, 0.872070f, 0.001354f, 0.863770f, 0.001344f, 0.853516f, 0.001376f, 0.842285f, + 0.001389f, 0.830078f, 0.001316f, 0.817383f, 0.001289f, 0.803223f, 0.001275f, 0.787598f, + 0.001319f, 0.770020f, 0.001247f, 0.750488f, 0.001211f, 0.728516f, 0.001207f, 0.704102f, + 0.001219f, 0.675781f, 0.001157f, 0.642090f, 0.001116f, 0.603516f, 0.001091f, 0.557129f, + 0.001042f, 0.498291f, 0.000967f, 0.421631f, 0.000803f, 0.309570f, 0.000277f, 0.117859f, + 0.000000f, 1.000000f, 0.000393f, 0.999512f, 0.000695f, 0.999023f, 0.000679f, 0.998535f, + 0.000913f, 0.997559f, 0.000922f, 0.997070f, 0.000916f, 0.996582f, 0.001082f, 0.995605f, + 0.001120f, 0.994629f, 0.001123f, 0.993652f, 0.001124f, 0.992676f, 0.001147f, 0.991211f, + 0.001364f, 0.989746f, 0.001415f, 0.988770f, 0.001466f, 0.987305f, 0.001504f, 0.986328f, + 0.001543f, 0.984863f, 0.001739f, 0.982422f, 0.001755f, 0.980957f, 0.001754f, 0.979004f, + 0.001742f, 0.977051f, 0.001738f, 0.975098f, 0.001844f, 0.972656f, 0.001879f, 0.970215f, + 0.001865f, 0.967773f, 0.001899f, 0.964844f, 0.001923f, 0.962402f, 0.001947f, 0.959473f, + 0.002068f, 0.957031f, 0.002052f, 0.952637f, 0.002098f, 0.949219f, 0.002125f, 0.945801f, + 0.002134f, 0.941895f, 0.002144f, 0.937988f, 0.002151f, 0.933105f, 0.002190f, 0.928711f, + 0.002205f, 0.923828f, 0.002234f, 0.917969f, 0.002247f, 0.912598f, 0.002159f, 0.906738f, + 0.002224f, 0.899902f, 0.002279f, 0.893555f, 0.002281f, 0.885254f, 0.002283f, 0.877930f, + 0.002186f, 0.869141f, 0.002214f, 0.860352f, 0.002239f, 0.850098f, 0.002266f, 0.838867f, + 0.002253f, 0.827148f, 0.002184f, 0.813965f, 0.002188f, 0.800781f, 0.002146f, 0.784668f, + 0.002188f, 0.767090f, 0.002102f, 0.747559f, 0.002113f, 0.726074f, 0.002066f, 0.701172f, + 0.002077f, 0.672852f, 0.001999f, 0.639648f, 0.001946f, 0.601562f, 0.001884f, 0.555176f, + 0.001818f, 0.496582f, 0.001650f, 0.420898f, 0.001338f, 0.309082f, 0.000412f, 0.117065f, + 0.000000f, 1.000000f, 0.000453f, 0.999512f, 0.000836f, 0.998535f, 0.000809f, 0.998535f, + 0.001129f, 0.997070f, 0.001140f, 0.996582f, 0.001184f, 0.995605f, 0.001510f, 0.995117f, + 0.001587f, 0.993652f, 0.001655f, 0.993164f, 0.001698f, 0.992188f, 0.001737f, 0.991211f, + 0.002052f, 0.989258f, 0.002102f, 0.987793f, 0.002134f, 0.986328f, 0.002151f, 0.984863f, + 0.002186f, 0.983398f, 0.002422f, 0.981445f, 0.002457f, 0.979004f, 0.002485f, 0.977539f, + 0.002527f, 0.975586f, 0.002520f, 0.973145f, 0.002733f, 0.971191f, 0.002773f, 0.968262f, + 0.002817f, 0.965820f, 0.002806f, 0.962891f, 0.002872f, 0.960449f, 0.002928f, 0.957031f, + 0.003124f, 0.954102f, 0.003059f, 0.950684f, 0.003065f, 0.946289f, 0.003115f, 0.942871f, + 0.003168f, 0.939453f, 0.003214f, 0.935547f, 0.003252f, 0.930176f, 0.003292f, 0.925293f, + 0.003325f, 0.920410f, 0.003378f, 0.915527f, 0.003378f, 0.909180f, 0.003294f, 0.903809f, + 0.003424f, 0.896973f, 0.003445f, 0.889648f, 0.003454f, 0.882812f, 0.003500f, 0.874023f, + 0.003395f, 0.865723f, 0.003397f, 0.856445f, 0.003529f, 0.846191f, 0.003490f, 0.835449f, + 0.003540f, 0.823242f, 0.003410f, 0.810547f, 0.003418f, 0.796387f, 0.003439f, 0.780762f, + 0.003439f, 0.763184f, 0.003458f, 0.744141f, 0.003349f, 0.722656f, 0.003296f, 0.698242f, + 0.003302f, 0.669922f, 0.003210f, 0.637695f, 0.003138f, 0.599609f, 0.003012f, 0.553711f, + 0.002899f, 0.495117f, 0.002596f, 0.419678f, 0.002045f, 0.309082f, 0.000576f, 0.116577f, + 0.000000f, 1.000000f, 0.000477f, 0.999512f, 0.000981f, 0.998535f, 0.001089f, 0.997559f, + 0.001572f, 0.997070f, 0.001649f, 0.995605f, 0.001740f, 0.995117f, 0.001783f, 0.994141f, + 0.002174f, 0.992676f, 0.002256f, 0.991699f, 0.002323f, 0.990723f, 0.002399f, 0.989746f, + 0.002783f, 0.987793f, 0.002913f, 0.986328f, 0.002974f, 0.984863f, 0.003019f, 0.983398f, + 0.003029f, 0.981445f, 0.003357f, 0.979492f, 0.003387f, 0.977539f, 0.003469f, 0.975586f, + 0.003550f, 0.973145f, 0.003618f, 0.971680f, 0.003819f, 0.968262f, 0.003937f, 0.966309f, + 0.004044f, 0.963379f, 0.004009f, 0.960449f, 0.004063f, 0.957520f, 0.004089f, 0.955078f, + 0.004349f, 0.951172f, 0.004467f, 0.947754f, 0.004406f, 0.943848f, 0.004490f, 0.939941f, + 0.004532f, 0.936035f, 0.004581f, 0.932617f, 0.004776f, 0.927246f, 0.004749f, 0.921875f, + 0.004829f, 0.916992f, 0.004860f, 0.911621f, 0.004929f, 0.906250f, 0.004925f, 0.899902f, + 0.004986f, 0.893066f, 0.005043f, 0.885742f, 0.005135f, 0.878418f, 0.005077f, 0.870117f, + 0.005157f, 0.861816f, 0.005005f, 0.852539f, 0.005207f, 0.842285f, 0.005173f, 0.831055f, + 0.005226f, 0.819336f, 0.005089f, 0.807129f, 0.005100f, 0.792480f, 0.005142f, 0.777344f, + 0.005219f, 0.759277f, 0.005215f, 0.740234f, 0.005085f, 0.718750f, 0.004978f, 0.694824f, + 0.005047f, 0.666992f, 0.004879f, 0.634277f, 0.004753f, 0.596680f, 0.004562f, 0.552246f, + 0.004345f, 0.493164f, 0.003832f, 0.418701f, 0.002930f, 0.308838f, 0.000769f, 0.116272f, + 0.000000f, 1.000000f, 0.000282f, 0.999512f, 0.000995f, 0.998535f, 0.001504f, 0.997559f, + 0.001652f, 0.996582f, 0.002146f, 0.995605f, 0.002218f, 0.994629f, 0.002407f, 0.993164f, + 0.002937f, 0.992188f, 0.003057f, 0.990723f, 0.003138f, 0.989746f, 0.003263f, 0.988281f, + 0.003778f, 0.986328f, 0.003914f, 0.985352f, 0.003979f, 0.983398f, 0.004017f, 0.981934f, + 0.004196f, 0.979980f, 0.004566f, 0.977051f, 0.004677f, 0.975586f, 0.004684f, 0.973633f, + 0.004791f, 0.971191f, 0.004940f, 0.969238f, 0.005283f, 0.966309f, 0.005383f, 0.963379f, + 0.005474f, 0.960449f, 0.005562f, 0.958008f, 0.005547f, 0.954590f, 0.005672f, 0.951660f, + 0.006042f, 0.948242f, 0.006157f, 0.944336f, 0.006275f, 0.940918f, 0.006168f, 0.937012f, + 0.006260f, 0.932617f, 0.006359f, 0.928711f, 0.006763f, 0.923828f, 0.006607f, 0.917969f, + 0.006710f, 0.912598f, 0.006847f, 0.907715f, 0.006886f, 0.901855f, 0.006866f, 0.895996f, + 0.007076f, 0.888672f, 0.007156f, 0.881348f, 0.007236f, 0.874023f, 0.007214f, 0.865723f, + 0.007278f, 0.856934f, 0.007214f, 0.848145f, 0.007423f, 0.837402f, 0.007500f, 0.826660f, + 0.007488f, 0.814453f, 0.007477f, 0.801758f, 0.007385f, 0.788086f, 0.007580f, 0.772461f, + 0.007542f, 0.754883f, 0.007519f, 0.735840f, 0.007351f, 0.714844f, 0.007244f, 0.691406f, + 0.007301f, 0.663086f, 0.007065f, 0.631348f, 0.006859f, 0.593750f, 0.006638f, 0.548828f, + 0.006199f, 0.491943f, 0.005409f, 0.417969f, 0.004044f, 0.307861f, 0.000988f, 0.116150f, + 0.000000f, 1.000000f, 0.000416f, 0.999512f, 0.001246f, 0.998047f, 0.001812f, 0.997070f, + 0.002235f, 0.996094f, 0.002787f, 0.994629f, 0.002903f, 0.993652f, 0.003218f, 0.992188f, + 0.003752f, 0.990723f, 0.003929f, 0.989258f, 0.004066f, 0.988770f, 0.004398f, 0.986816f, + 0.004913f, 0.984863f, 0.005085f, 0.983398f, 0.005280f, 0.981445f, 0.005344f, 0.980469f, + 0.005562f, 0.977539f, 0.006077f, 0.975586f, 0.006165f, 0.973145f, 0.006344f, 0.970703f, + 0.006363f, 0.968750f, 0.006638f, 0.966797f, 0.007126f, 0.963379f, 0.007183f, 0.960449f, + 0.007305f, 0.957520f, 0.007446f, 0.954590f, 0.007561f, 0.952148f, 0.007690f, 0.948242f, + 0.008148f, 0.944336f, 0.008247f, 0.940430f, 0.008415f, 0.937012f, 0.008415f, 0.932617f, + 0.008461f, 0.928711f, 0.008682f, 0.924316f, 0.009125f, 0.918945f, 0.009361f, 0.914551f, + 0.009125f, 0.908203f, 0.009300f, 0.902832f, 0.009430f, 0.897461f, 0.009567f, 0.891113f, + 0.009903f, 0.883789f, 0.009819f, 0.875977f, 0.009933f, 0.868652f, 0.010048f, 0.860840f, + 0.010078f, 0.852539f, 0.010025f, 0.842773f, 0.010269f, 0.832031f, 0.010483f, 0.821289f, + 0.010399f, 0.809570f, 0.010475f, 0.796875f, 0.010269f, 0.783203f, 0.010544f, 0.767090f, + 0.010506f, 0.749512f, 0.010475f, 0.730957f, 0.010284f, 0.709961f, 0.010139f, 0.687012f, + 0.010170f, 0.658691f, 0.010056f, 0.627441f, 0.009567f, 0.590820f, 0.009186f, 0.546387f, + 0.008476f, 0.489502f, 0.007278f, 0.416260f, 0.005318f, 0.307129f, 0.001243f, 0.115601f, + 0.000000f, 1.000000f, 0.000625f, 0.999023f, 0.001251f, 0.998047f, 0.001865f, 0.997070f, + 0.002825f, 0.995605f, 0.003040f, 0.994141f, 0.003670f, 0.993164f, 0.004150f, 0.991211f, + 0.004387f, 0.989746f, 0.004986f, 0.988281f, 0.005157f, 0.987305f, 0.005672f, 0.984863f, + 0.006329f, 0.982910f, 0.006519f, 0.981445f, 0.006733f, 0.979492f, 0.007145f, 0.978027f, + 0.007488f, 0.975586f, 0.007965f, 0.972656f, 0.008080f, 0.970703f, 0.008194f, 0.968262f, + 0.008408f, 0.965820f, 0.008705f, 0.962891f, 0.009369f, 0.960449f, 0.009583f, 0.957031f, + 0.009590f, 0.954102f, 0.009750f, 0.951172f, 0.009995f, 0.948242f, 0.010399f, 0.944336f, + 0.010735f, 0.939941f, 0.011032f, 0.936523f, 0.011139f, 0.932617f, 0.011307f, 0.928711f, + 0.011345f, 0.924316f, 0.011658f, 0.919434f, 0.012161f, 0.914062f, 0.012413f, 0.908691f, + 0.012482f, 0.903809f, 0.012383f, 0.897461f, 0.012657f, 0.892090f, 0.012939f, 0.885254f, + 0.013252f, 0.877930f, 0.013252f, 0.870605f, 0.013458f, 0.863281f, 0.013542f, 0.854980f, + 0.013565f, 0.846680f, 0.013870f, 0.837402f, 0.014122f, 0.826660f, 0.014137f, 0.814941f, + 0.014069f, 0.803711f, 0.014244f, 0.791504f, 0.014053f, 0.777832f, 0.014359f, 0.761230f, + 0.014397f, 0.744629f, 0.014259f, 0.726074f, 0.013985f, 0.705078f, 0.013992f, 0.682129f, + 0.013863f, 0.654297f, 0.013588f, 0.623535f, 0.012993f, 0.587402f, 0.012375f, 0.543457f, + 0.011284f, 0.487305f, 0.009521f, 0.415283f, 0.006786f, 0.306152f, 0.001522f, 0.115051f, + 0.000000f, 1.000000f, 0.000866f, 0.999023f, 0.001698f, 0.998047f, 0.001885f, 0.997070f, + 0.003201f, 0.995117f, 0.003843f, 0.993652f, 0.004532f, 0.992188f, 0.005310f, 0.990234f, + 0.005554f, 0.988281f, 0.006248f, 0.987305f, 0.006554f, 0.985352f, 0.007202f, 0.982910f, + 0.007526f, 0.980957f, 0.008217f, 0.979004f, 0.008461f, 0.977539f, 0.009148f, 0.975098f, + 0.009514f, 0.972656f, 0.010246f, 0.970215f, 0.010414f, 0.967773f, 0.010567f, 0.965332f, + 0.010765f, 0.962402f, 0.011398f, 0.958984f, 0.012177f, 0.956543f, 0.012344f, 0.953613f, + 0.012703f, 0.950684f, 0.012642f, 0.947266f, 0.013260f, 0.943359f, 0.013603f, 0.939453f, + 0.014374f, 0.936035f, 0.014343f, 0.931641f, 0.014671f, 0.927734f, 0.014786f, 0.923828f, + 0.015388f, 0.919434f, 0.015480f, 0.913574f, 0.016022f, 0.908691f, 0.016312f, 0.903320f, + 0.016617f, 0.897949f, 0.016464f, 0.892578f, 0.016663f, 0.886230f, 0.017334f, 0.879395f, + 0.017639f, 0.872070f, 0.017914f, 0.864746f, 0.017868f, 0.856934f, 0.018188f, 0.849121f, + 0.018311f, 0.840332f, 0.018845f, 0.830566f, 0.018753f, 0.819824f, 0.018906f, 0.809082f, + 0.019180f, 0.797852f, 0.019028f, 0.785156f, 0.018890f, 0.770996f, 0.019348f, 0.754883f, + 0.019165f, 0.738281f, 0.019211f, 0.720703f, 0.018875f, 0.700684f, 0.018753f, 0.676758f, + 0.018509f, 0.649414f, 0.017914f, 0.618652f, 0.017090f, 0.583984f, 0.016174f, 0.540039f, + 0.014565f, 0.484863f, 0.012260f, 0.414062f, 0.008507f, 0.305664f, 0.001861f, 0.115173f, + 0.000000f, 1.000000f, 0.000689f, 0.999023f, 0.001837f, 0.997559f, 0.002485f, 0.996582f, + 0.004116f, 0.994141f, 0.004837f, 0.992676f, 0.005306f, 0.991211f, 0.006657f, 0.988770f, + 0.006920f, 0.986816f, 0.007256f, 0.985840f, 0.008247f, 0.983398f, 0.009026f, 0.980469f, + 0.009415f, 0.978516f, 0.010208f, 0.976562f, 0.010506f, 0.975098f, 0.011497f, 0.971680f, + 0.011940f, 0.969238f, 0.012360f, 0.967285f, 0.013184f, 0.964844f, 0.013390f, 0.961914f, + 0.014107f, 0.958496f, 0.014626f, 0.955566f, 0.014908f, 0.952148f, 0.015747f, 0.948730f, + 0.016006f, 0.945801f, 0.016449f, 0.942871f, 0.017059f, 0.938965f, 0.017471f, 0.934570f, + 0.018219f, 0.930664f, 0.018753f, 0.926758f, 0.018753f, 0.922363f, 0.019150f, 0.918457f, + 0.019821f, 0.913086f, 0.020370f, 0.908203f, 0.020813f, 0.902344f, 0.021149f, 0.896973f, + 0.021500f, 0.892090f, 0.021881f, 0.886719f, 0.021973f, 0.879395f, 0.022507f, 0.872559f, + 0.023361f, 0.865723f, 0.023468f, 0.857910f, 0.023575f, 0.850586f, 0.023666f, 0.842285f, + 0.024216f, 0.833496f, 0.024689f, 0.823242f, 0.024750f, 0.812500f, 0.025024f, 0.802246f, + 0.025116f, 0.790527f, 0.024918f, 0.778320f, 0.025497f, 0.764648f, 0.025543f, 0.749023f, + 0.025467f, 0.731934f, 0.025192f, 0.714355f, 0.024734f, 0.694824f, 0.024826f, 0.670898f, + 0.024200f, 0.644043f, 0.023590f, 0.614746f, 0.022217f, 0.580078f, 0.020889f, 0.536133f, + 0.018845f, 0.482910f, 0.015434f, 0.412354f, 0.010551f, 0.304932f, 0.002214f, 0.114929f, + 0.000000f, 1.000000f, 0.000901f, 0.999023f, 0.002457f, 0.997070f, 0.003334f, 0.995605f, + 0.004200f, 0.993652f, 0.005501f, 0.991699f, 0.006760f, 0.989746f, 0.007309f, 0.987793f, + 0.008553f, 0.985352f, 0.008965f, 0.983887f, 0.009796f, 0.981445f, 0.011185f, 0.978516f, + 0.011658f, 0.976074f, 0.012054f, 0.974121f, 0.013275f, 0.971191f, 0.014259f, 0.968262f, + 0.014786f, 0.965820f, 0.015343f, 0.963379f, 0.016205f, 0.960449f, 0.016830f, 0.958008f, + 0.018005f, 0.954590f, 0.018219f, 0.950684f, 0.018814f, 0.947754f, 0.019562f, 0.943848f, + 0.020126f, 0.941406f, 0.020767f, 0.937012f, 0.021805f, 0.933105f, 0.022095f, 0.929199f, + 0.022949f, 0.924316f, 0.023438f, 0.920410f, 0.024078f, 0.916992f, 0.024429f, 0.911621f, + 0.025360f, 0.906250f, 0.025787f, 0.901367f, 0.026672f, 0.895996f, 0.026978f, 0.890137f, + 0.027405f, 0.885254f, 0.027908f, 0.879395f, 0.028702f, 0.872070f, 0.028824f, 0.864746f, + 0.029800f, 0.857910f, 0.030472f, 0.851074f, 0.030029f, 0.842773f, 0.030579f, 0.835449f, + 0.031372f, 0.825195f, 0.031952f, 0.815430f, 0.032257f, 0.805176f, 0.032318f, 0.794434f, + 0.032440f, 0.783691f, 0.032684f, 0.771484f, 0.033081f, 0.756836f, 0.032959f, 0.741211f, + 0.033051f, 0.725586f, 0.032562f, 0.707520f, 0.032104f, 0.688965f, 0.031982f, 0.665039f, + 0.031219f, 0.638672f, 0.030167f, 0.609863f, 0.028336f, 0.576172f, 0.026566f, 0.532715f, + 0.023865f, 0.479980f, 0.019318f, 0.411133f, 0.012985f, 0.303955f, 0.002634f, 0.114685f, + 0.000000f, 1.000000f, 0.001308f, 0.999023f, 0.002726f, 0.997070f, 0.003922f, 0.995117f, + 0.005405f, 0.992676f, 0.006302f, 0.991211f, 0.007633f, 0.988770f, 0.009079f, 0.986328f, + 0.009987f, 0.983887f, 0.010948f, 0.981934f, 0.012169f, 0.978516f, 0.013710f, 0.975586f, + 0.014236f, 0.973145f, 0.014786f, 0.971191f, 0.015945f, 0.968262f, 0.017136f, 0.964844f, + 0.018158f, 0.961914f, 0.018784f, 0.958984f, 0.019379f, 0.956543f, 0.021011f, 0.953125f, + 0.022156f, 0.949219f, 0.022919f, 0.945801f, 0.023376f, 0.942383f, 0.024261f, 0.938965f, + 0.024841f, 0.935547f, 0.026016f, 0.931152f, 0.026947f, 0.926758f, 0.027771f, 0.922852f, + 0.028519f, 0.918457f, 0.029099f, 0.914062f, 0.029800f, 0.909668f, 0.030807f, 0.904297f, + 0.031677f, 0.898926f, 0.032440f, 0.894043f, 0.033325f, 0.888184f, 0.033783f, 0.883301f, + 0.034363f, 0.877441f, 0.035187f, 0.870605f, 0.036224f, 0.863770f, 0.036743f, 0.856934f, + 0.037384f, 0.849609f, 0.037994f, 0.842773f, 0.038391f, 0.835449f, 0.038879f, 0.826172f, + 0.039673f, 0.816406f, 0.040466f, 0.807129f, 0.040619f, 0.796875f, 0.040741f, 0.786133f, + 0.040985f, 0.775879f, 0.041412f, 0.762695f, 0.041656f, 0.748535f, 0.041656f, 0.733398f, + 0.041534f, 0.718262f, 0.041260f, 0.701172f, 0.040710f, 0.681641f, 0.040253f, 0.658203f, + 0.039368f, 0.632812f, 0.037720f, 0.604492f, 0.035461f, 0.571777f, 0.033234f, 0.528320f, + 0.029312f, 0.476807f, 0.023666f, 0.409912f, 0.015686f, 0.302734f, 0.003113f, 0.114014f, + 0.000000f, 1.000000f, 0.001520f, 0.998535f, 0.003132f, 0.996582f, 0.004364f, 0.994629f, + 0.006840f, 0.992188f, 0.007355f, 0.990234f, 0.009117f, 0.987305f, 0.010681f, 0.984375f, + 0.011765f, 0.981934f, 0.013313f, 0.979004f, 0.015030f, 0.975586f, 0.015717f, 0.973145f, + 0.017303f, 0.970215f, 0.018082f, 0.967285f, 0.019623f, 0.963867f, 0.020920f, 0.960449f, + 0.022079f, 0.957031f, 0.022842f, 0.954590f, 0.023926f, 0.951172f, 0.025742f, 0.947266f, + 0.026627f, 0.943848f, 0.027893f, 0.940430f, 0.028748f, 0.937012f, 0.029297f, 0.933594f, + 0.030792f, 0.928711f, 0.031860f, 0.923828f, 0.033203f, 0.919922f, 0.033936f, 0.915527f, + 0.034882f, 0.911621f, 0.035706f, 0.907227f, 0.037140f, 0.901367f, 0.038086f, 0.895996f, + 0.039246f, 0.890625f, 0.039917f, 0.885742f, 0.041199f, 0.880371f, 0.041809f, 0.875000f, + 0.042755f, 0.868652f, 0.043671f, 0.861328f, 0.044861f, 0.854980f, 0.045258f, 0.848145f, + 0.046417f, 0.840820f, 0.046875f, 0.833984f, 0.047974f, 0.826172f, 0.048035f, 0.816406f, + 0.049469f, 0.807617f, 0.050140f, 0.797852f, 0.050690f, 0.788086f, 0.050751f, 0.777832f, + 0.050964f, 0.767090f, 0.051758f, 0.753418f, 0.052185f, 0.740234f, 0.052185f, 0.725586f, + 0.051666f, 0.710449f, 0.050812f, 0.693848f, 0.050995f, 0.673828f, 0.050201f, 0.651367f, + 0.048279f, 0.626465f, 0.046448f, 0.599609f, 0.043793f, 0.566895f, 0.040619f, 0.524414f, + 0.035828f, 0.473877f, 0.028412f, 0.407959f, 0.018784f, 0.301758f, 0.003656f, 0.113647f, + 0.000000f, 1.000000f, 0.001997f, 0.998047f, 0.004101f, 0.996094f, 0.005878f, 0.993652f, + 0.007580f, 0.991211f, 0.009117f, 0.988770f, 0.010918f, 0.985352f, 0.012657f, 0.982422f, + 0.013374f, 0.979980f, 0.016479f, 0.976074f, 0.017838f, 0.972656f, 0.019165f, 0.969727f, + 0.020401f, 0.966797f, 0.022507f, 0.962891f, 0.023956f, 0.958984f, 0.024918f, 0.955566f, + 0.026688f, 0.952148f, 0.027557f, 0.949219f, 0.029297f, 0.944824f, 0.030762f, 0.941406f, + 0.032288f, 0.937500f, 0.033661f, 0.933594f, 0.034668f, 0.930176f, 0.036285f, 0.925781f, + 0.038025f, 0.920898f, 0.038971f, 0.916504f, 0.040222f, 0.912109f, 0.041351f, 0.907715f, + 0.042145f, 0.903809f, 0.044281f, 0.898438f, 0.045654f, 0.892578f, 0.046814f, 0.887207f, + 0.047852f, 0.881836f, 0.048828f, 0.876953f, 0.050201f, 0.871582f, 0.051270f, 0.865234f, + 0.052460f, 0.858398f, 0.054016f, 0.852051f, 0.054779f, 0.845215f, 0.055725f, 0.838379f, + 0.056549f, 0.831543f, 0.057220f, 0.824219f, 0.058624f, 0.815430f, 0.060364f, 0.807129f, + 0.060150f, 0.796875f, 0.061310f, 0.788574f, 0.061615f, 0.778809f, 0.061951f, 0.769043f, + 0.062347f, 0.756836f, 0.063110f, 0.744141f, 0.063477f, 0.730957f, 0.063110f, 0.716797f, + 0.062622f, 0.701660f, 0.062012f, 0.686035f, 0.061523f, 0.665527f, 0.060364f, 0.643555f, + 0.058685f, 0.620605f, 0.055817f, 0.594238f, 0.052704f, 0.561035f, 0.048828f, 0.520020f, + 0.042694f, 0.470703f, 0.034027f, 0.406982f, 0.022079f, 0.300537f, 0.004261f, 0.112915f, + 0.000000f, 1.000000f, 0.002422f, 0.997559f, 0.004318f, 0.996094f, 0.007160f, 0.992676f, + 0.009003f, 0.990234f, 0.011192f, 0.987305f, 0.013687f, 0.983398f, 0.014633f, 0.980469f, + 0.016739f, 0.977051f, 0.018387f, 0.973145f, 0.020813f, 0.969238f, 0.022720f, 0.966309f, + 0.024506f, 0.962402f, 0.026947f, 0.957520f, 0.028625f, 0.954102f, 0.030121f, 0.950684f, + 0.031158f, 0.947266f, 0.033844f, 0.942383f, 0.035553f, 0.937988f, 0.037201f, 0.934082f, + 0.038849f, 0.930176f, 0.040405f, 0.926270f, 0.041931f, 0.922363f, 0.043945f, 0.917480f, + 0.045715f, 0.913086f, 0.047516f, 0.908203f, 0.048615f, 0.903320f, 0.049561f, 0.898926f, + 0.051392f, 0.894043f, 0.053375f, 0.888184f, 0.055237f, 0.882812f, 0.056763f, 0.877441f, + 0.057678f, 0.872070f, 0.058807f, 0.867188f, 0.060486f, 0.861816f, 0.062134f, 0.854980f, + 0.063843f, 0.847656f, 0.064941f, 0.840820f, 0.066040f, 0.834473f, 0.067078f, 0.828125f, + 0.068176f, 0.821777f, 0.069458f, 0.812988f, 0.070801f, 0.804199f, 0.072205f, 0.795898f, + 0.072144f, 0.787109f, 0.073547f, 0.777832f, 0.073853f, 0.768555f, 0.074646f, 0.758789f, + 0.075439f, 0.746094f, 0.075928f, 0.734375f, 0.076172f, 0.721680f, 0.075806f, 0.708496f, + 0.074463f, 0.693848f, 0.074341f, 0.676758f, 0.073669f, 0.657227f, 0.071838f, 0.636230f, + 0.069824f, 0.614258f, 0.066406f, 0.588379f, 0.062683f, 0.554688f, 0.057495f, 0.515137f, + 0.050079f, 0.467773f, 0.039795f, 0.403809f, 0.025620f, 0.299561f, 0.004860f, 0.112427f, + 0.000000f, 1.000000f, 0.002733f, 0.998047f, 0.005219f, 0.995605f, 0.008324f, 0.991699f, + 0.010338f, 0.988770f, 0.013313f, 0.984863f, 0.015511f, 0.981445f, 0.018005f, 0.977539f, + 0.020462f, 0.973145f, 0.022751f, 0.969238f, 0.024414f, 0.965820f, 0.026947f, 0.961914f, + 0.029602f, 0.957031f, 0.032257f, 0.952637f, 0.034058f, 0.948242f, 0.036194f, 0.944336f, + 0.038116f, 0.939941f, 0.040558f, 0.935059f, 0.042877f, 0.930664f, 0.044708f, 0.926270f, + 0.046051f, 0.922852f, 0.048584f, 0.917969f, 0.050842f, 0.912598f, 0.052826f, 0.907715f, + 0.054749f, 0.903320f, 0.056702f, 0.898926f, 0.058563f, 0.894531f, 0.059937f, 0.888672f, + 0.062317f, 0.883301f, 0.063721f, 0.877930f, 0.065857f, 0.872070f, 0.067810f, 0.867188f, + 0.069092f, 0.862305f, 0.070251f, 0.856445f, 0.072754f, 0.849121f, 0.074585f, 0.842773f, + 0.076111f, 0.836426f, 0.077576f, 0.830078f, 0.078674f, 0.823242f, 0.079773f, 0.817383f, + 0.081726f, 0.809082f, 0.083374f, 0.801270f, 0.084534f, 0.792480f, 0.085632f, 0.784180f, + 0.086670f, 0.776367f, 0.086609f, 0.767090f, 0.088013f, 0.758301f, 0.088806f, 0.746582f, + 0.089233f, 0.735352f, 0.089539f, 0.723633f, 0.089966f, 0.711426f, 0.089172f, 0.698730f, + 0.088257f, 0.684570f, 0.088196f, 0.666992f, 0.086670f, 0.648438f, 0.084778f, 0.628906f, + 0.081238f, 0.606934f, 0.077209f, 0.582520f, 0.073242f, 0.548828f, 0.067078f, 0.510742f, + 0.058258f, 0.464844f, 0.046326f, 0.399902f, 0.029572f, 0.299561f, 0.005589f, 0.111450f, + 0.000000f, 1.000000f, 0.003691f, 0.997070f, 0.006359f, 0.994629f, 0.009880f, 0.990723f, + 0.012497f, 0.987305f, 0.016006f, 0.982422f, 0.018814f, 0.978027f, 0.021103f, 0.975098f, + 0.024994f, 0.969238f, 0.027466f, 0.965332f, 0.029770f, 0.960938f, 0.032043f, 0.956543f, + 0.035645f, 0.951172f, 0.038147f, 0.946289f, 0.040985f, 0.941895f, 0.043304f, 0.937500f, + 0.046326f, 0.931641f, 0.048462f, 0.927246f, 0.050964f, 0.922363f, 0.053406f, 0.917969f, + 0.055298f, 0.913086f, 0.057861f, 0.907715f, 0.060944f, 0.902344f, 0.063049f, 0.897461f, + 0.065125f, 0.893066f, 0.066772f, 0.888672f, 0.069946f, 0.882812f, 0.072571f, 0.876953f, + 0.074524f, 0.871582f, 0.076355f, 0.866211f, 0.078247f, 0.860840f, 0.080017f, 0.855469f, + 0.082214f, 0.849609f, 0.084534f, 0.843262f, 0.086243f, 0.836426f, 0.088623f, 0.830078f, + 0.089783f, 0.823730f, 0.091675f, 0.817871f, 0.092468f, 0.812012f, 0.094727f, 0.804199f, + 0.096558f, 0.795410f, 0.098328f, 0.787598f, 0.099365f, 0.780273f, 0.100342f, 0.771973f, + 0.101074f, 0.764648f, 0.101746f, 0.755859f, 0.103333f, 0.745117f, 0.104065f, 0.734375f, + 0.104736f, 0.723633f, 0.104736f, 0.712891f, 0.104431f, 0.701172f, 0.103455f, 0.689453f, + 0.102905f, 0.673828f, 0.102051f, 0.656738f, 0.100220f, 0.639160f, 0.097534f, 0.620605f, + 0.093872f, 0.600098f, 0.089661f, 0.574707f, 0.084412f, 0.542480f, 0.076843f, 0.505859f, + 0.066467f, 0.461426f, 0.053345f, 0.397217f, 0.033508f, 0.298096f, 0.006302f, 0.110352f, + 0.000000f, 1.000000f, 0.004448f, 0.996582f, 0.007580f, 0.993652f, 0.011833f, 0.989258f, + 0.015114f, 0.985352f, 0.019333f, 0.979492f, 0.022400f, 0.975586f, 0.026123f, 0.970215f, + 0.029907f, 0.964844f, 0.032623f, 0.960449f, 0.035736f, 0.955078f, 0.039642f, 0.949219f, + 0.042419f, 0.944824f, 0.045105f, 0.939941f, 0.048584f, 0.935059f, 0.052551f, 0.928711f, + 0.055420f, 0.922852f, 0.058197f, 0.917969f, 0.060883f, 0.913086f, 0.063110f, 0.908203f, + 0.066895f, 0.901855f, 0.069702f, 0.896484f, 0.072144f, 0.891113f, 0.074890f, 0.886230f, + 0.077087f, 0.881836f, 0.080078f, 0.875977f, 0.083496f, 0.869629f, 0.085938f, 0.863770f, + 0.088318f, 0.858887f, 0.090271f, 0.854004f, 0.092224f, 0.848633f, 0.094849f, 0.841797f, + 0.097290f, 0.834961f, 0.099731f, 0.829102f, 0.101746f, 0.822754f, 0.103821f, 0.816895f, + 0.105042f, 0.811035f, 0.106873f, 0.805176f, 0.109436f, 0.797363f, 0.110840f, 0.789062f, + 0.113586f, 0.782227f, 0.114624f, 0.774414f, 0.115479f, 0.767090f, 0.116394f, 0.759766f, + 0.117371f, 0.751953f, 0.119263f, 0.741699f, 0.119995f, 0.731445f, 0.121216f, 0.722168f, + 0.121033f, 0.711914f, 0.120300f, 0.701660f, 0.120117f, 0.690918f, 0.119629f, 0.677246f, + 0.118835f, 0.662109f, 0.117188f, 0.646973f, 0.114441f, 0.630371f, 0.111694f, 0.612793f, + 0.107605f, 0.593750f, 0.102661f, 0.566406f, 0.096191f, 0.536133f, 0.087524f, 0.500977f, + 0.075256f, 0.458740f, 0.060059f, 0.393066f, 0.038086f, 0.298340f, 0.007027f, 0.109375f, + 0.000000f, 1.000000f, 0.005013f, 0.996582f, 0.009384f, 0.992676f, 0.013985f, 0.987793f, + 0.018478f, 0.982422f, 0.023056f, 0.976562f, 0.026917f, 0.972168f, 0.032440f, 0.964844f, + 0.035583f, 0.959473f, 0.038879f, 0.955078f, 0.043518f, 0.948242f, 0.048096f, 0.941895f, + 0.051117f, 0.937012f, 0.054321f, 0.931641f, 0.058868f, 0.924316f, 0.062134f, 0.918945f, + 0.066101f, 0.913086f, 0.069092f, 0.907715f, 0.073059f, 0.901855f, 0.076721f, 0.895020f, + 0.079895f, 0.889160f, 0.083008f, 0.883789f, 0.085876f, 0.878906f, 0.088623f, 0.873535f, + 0.092407f, 0.866699f, 0.095459f, 0.861328f, 0.098083f, 0.855469f, 0.101135f, 0.850098f, + 0.103516f, 0.845215f, 0.106018f, 0.839844f, 0.108887f, 0.833008f, 0.112366f, 0.826172f, + 0.114563f, 0.819824f, 0.116638f, 0.813965f, 0.118652f, 0.808594f, 0.120972f, 0.802734f, + 0.122803f, 0.796387f, 0.125366f, 0.788086f, 0.127686f, 0.781250f, 0.129395f, 0.774414f, + 0.130737f, 0.767578f, 0.132568f, 0.760742f, 0.133667f, 0.753906f, 0.134888f, 0.746094f, + 0.135986f, 0.736328f, 0.137695f, 0.727539f, 0.137817f, 0.718262f, 0.138184f, 0.708984f, + 0.138184f, 0.700195f, 0.137451f, 0.690430f, 0.137451f, 0.678223f, 0.137085f, 0.665039f, + 0.135376f, 0.650879f, 0.133179f, 0.636719f, 0.130615f, 0.622559f, 0.126343f, 0.605469f, + 0.121338f, 0.583496f, 0.116455f, 0.558594f, 0.108276f, 0.529785f, 0.097961f, 0.496826f, + 0.084595f, 0.455811f, 0.067871f, 0.390381f, 0.042236f, 0.295898f, 0.007912f, 0.108582f, + 0.000000f, 1.000000f, 0.006454f, 0.995605f, 0.011932f, 0.990723f, 0.017227f, 0.985840f, + 0.023407f, 0.979004f, 0.028214f, 0.973145f, 0.033173f, 0.966309f, 0.038757f, 0.959473f, + 0.042969f, 0.953613f, 0.048706f, 0.946289f, 0.053802f, 0.939453f, 0.056763f, 0.934082f, + 0.062012f, 0.927246f, 0.067139f, 0.919922f, 0.070740f, 0.913574f, 0.074524f, 0.907715f, + 0.077759f, 0.902832f, 0.083557f, 0.894531f, 0.087952f, 0.887695f, 0.091370f, 0.881836f, + 0.095032f, 0.875977f, 0.097656f, 0.871094f, 0.101685f, 0.864258f, 0.105957f, 0.856934f, + 0.109802f, 0.851074f, 0.112488f, 0.845703f, 0.115112f, 0.840332f, 0.118469f, 0.835449f, + 0.121765f, 0.828613f, 0.125366f, 0.821777f, 0.128052f, 0.815918f, 0.130737f, 0.810059f, + 0.133179f, 0.804199f, 0.135132f, 0.798340f, 0.136841f, 0.793457f, 0.140869f, 0.785645f, + 0.143311f, 0.778809f, 0.145508f, 0.771484f, 0.147095f, 0.765137f, 0.148804f, 0.758789f, + 0.149902f, 0.752441f, 0.151123f, 0.746094f, 0.153320f, 0.737793f, 0.154419f, 0.729004f, + 0.155762f, 0.720703f, 0.156982f, 0.712402f, 0.156982f, 0.704590f, 0.156616f, 0.696289f, + 0.156616f, 0.687988f, 0.155518f, 0.676270f, 0.155762f, 0.664062f, 0.154785f, 0.651855f, + 0.152832f, 0.639648f, 0.150024f, 0.626465f, 0.145752f, 0.612305f, 0.141602f, 0.596680f, + 0.137085f, 0.573730f, 0.129883f, 0.549805f, 0.121460f, 0.523926f, 0.109680f, 0.492676f, + 0.094177f, 0.450928f, 0.075134f, 0.387207f, 0.047089f, 0.296143f, 0.008751f, 0.107971f, + 0.000000f, 1.000000f, 0.007488f, 0.995605f, 0.015404f, 0.988770f, 0.021408f, 0.982422f, + 0.028671f, 0.975098f, 0.035034f, 0.967773f, 0.041779f, 0.959961f, 0.046570f, 0.953125f, + 0.053497f, 0.944824f, 0.059540f, 0.937012f, 0.064270f, 0.930176f, 0.070251f, 0.922852f, + 0.075256f, 0.915039f, 0.080994f, 0.907715f, 0.085083f, 0.901367f, 0.089844f, 0.894531f, + 0.095093f, 0.886230f, 0.099243f, 0.879883f, 0.104248f, 0.873047f, 0.108032f, 0.867188f, + 0.112305f, 0.860840f, 0.117432f, 0.852539f, 0.120911f, 0.846191f, 0.124756f, 0.840332f, + 0.127930f, 0.834473f, 0.131470f, 0.829102f, 0.135254f, 0.822754f, 0.139526f, 0.815430f, + 0.143188f, 0.809082f, 0.146240f, 0.803711f, 0.148682f, 0.798340f, 0.151123f, 0.793457f, + 0.153564f, 0.787598f, 0.156982f, 0.780273f, 0.159912f, 0.772949f, 0.162231f, 0.767090f, + 0.164673f, 0.760742f, 0.166748f, 0.754883f, 0.167725f, 0.749023f, 0.169067f, 0.743164f, + 0.172241f, 0.735840f, 0.173218f, 0.727539f, 0.175537f, 0.720215f, 0.175903f, 0.712891f, + 0.176392f, 0.705078f, 0.176880f, 0.698242f, 0.177002f, 0.690918f, 0.175781f, 0.682617f, + 0.176636f, 0.671387f, 0.176147f, 0.662109f, 0.175415f, 0.650391f, 0.173584f, 0.640137f, + 0.170166f, 0.628906f, 0.166260f, 0.616699f, 0.162354f, 0.603027f, 0.158569f, 0.583984f, + 0.151978f, 0.564453f, 0.144531f, 0.542969f, 0.133789f, 0.517578f, 0.121094f, 0.488525f, + 0.104858f, 0.445068f, 0.083130f, 0.384033f, 0.051697f, 0.294922f, 0.009659f, 0.107117f, + 0.000000f, 1.000000f, 0.009659f, 0.994629f, 0.018875f, 0.986816f, 0.027817f, 0.978516f, + 0.034943f, 0.971191f, 0.044312f, 0.960449f, 0.050873f, 0.952637f, 0.059174f, 0.943359f, + 0.065857f, 0.934570f, 0.072449f, 0.927246f, 0.079468f, 0.917480f, 0.085876f, 0.909180f, + 0.091919f, 0.901367f, 0.096252f, 0.895020f, 0.103882f, 0.885254f, 0.109009f, 0.877441f, + 0.114685f, 0.870117f, 0.118774f, 0.863770f, 0.123291f, 0.856445f, 0.129883f, 0.848145f, + 0.134521f, 0.840820f, 0.139282f, 0.833984f, 0.142700f, 0.828125f, 0.145752f, 0.822754f, + 0.151245f, 0.814453f, 0.155151f, 0.808105f, 0.159180f, 0.801270f, 0.162354f, 0.795898f, + 0.165527f, 0.790039f, 0.168457f, 0.785156f, 0.171387f, 0.778809f, 0.175293f, 0.771973f, + 0.179443f, 0.765625f, 0.181396f, 0.759277f, 0.183594f, 0.753906f, 0.185181f, 0.748047f, + 0.187134f, 0.742676f, 0.188721f, 0.737793f, 0.191772f, 0.729980f, 0.192993f, 0.722656f, + 0.195068f, 0.715820f, 0.196655f, 0.709473f, 0.197388f, 0.702637f, 0.197876f, 0.696777f, + 0.197876f, 0.690430f, 0.197754f, 0.684082f, 0.198486f, 0.673828f, 0.198608f, 0.665039f, + 0.197998f, 0.655762f, 0.197266f, 0.647461f, 0.194458f, 0.637207f, 0.191772f, 0.627930f, + 0.188477f, 0.618164f, 0.184692f, 0.605469f, 0.180420f, 0.589844f, 0.174927f, 0.572754f, + 0.168091f, 0.555176f, 0.158691f, 0.535156f, 0.147095f, 0.512695f, 0.132202f, 0.483887f, + 0.115540f, 0.439209f, 0.091309f, 0.381348f, 0.056702f, 0.294922f, 0.010612f, 0.106750f, + 0.000000f, 1.000000f, 0.011765f, 0.993652f, 0.023361f, 0.984863f, 0.035400f, 0.973633f, + 0.046143f, 0.962402f, 0.055176f, 0.953125f, 0.065430f, 0.941895f, 0.073853f, 0.932129f, + 0.080811f, 0.923828f, 0.090820f, 0.911621f, 0.098145f, 0.902832f, 0.104797f, 0.894531f, + 0.112366f, 0.884766f, 0.119812f, 0.875000f, 0.125488f, 0.867188f, 0.130737f, 0.859863f, + 0.137207f, 0.851074f, 0.143677f, 0.842285f, 0.148926f, 0.834473f, 0.153320f, 0.828125f, + 0.158081f, 0.821289f, 0.162964f, 0.813965f, 0.168945f, 0.805176f, 0.173706f, 0.798340f, + 0.177246f, 0.791992f, 0.181152f, 0.786133f, 0.183960f, 0.780762f, 0.187622f, 0.774902f, + 0.192017f, 0.767578f, 0.196411f, 0.761230f, 0.198853f, 0.754883f, 0.201660f, 0.749512f, + 0.204468f, 0.744629f, 0.206665f, 0.739258f, 0.208130f, 0.734863f, 0.210449f, 0.727539f, + 0.213745f, 0.720703f, 0.215820f, 0.714355f, 0.217651f, 0.708496f, 0.218262f, 0.703125f, + 0.219116f, 0.697266f, 0.220337f, 0.691895f, 0.219604f, 0.686523f, 0.220825f, 0.679199f, + 0.221802f, 0.671875f, 0.222412f, 0.663574f, 0.222168f, 0.656250f, 0.220947f, 0.648438f, + 0.219482f, 0.641113f, 0.217163f, 0.633301f, 0.213623f, 0.625000f, 0.210449f, 0.616699f, + 0.208130f, 0.604004f, 0.204102f, 0.590820f, 0.199097f, 0.577148f, 0.192993f, 0.562988f, + 0.184082f, 0.546875f, 0.173218f, 0.529297f, 0.160400f, 0.508301f, 0.145996f, 0.474609f, + 0.126465f, 0.432861f, 0.099487f, 0.378174f, 0.061523f, 0.294922f, 0.011581f, 0.106689f, + 0.000000f, 1.000000f, 0.017303f, 0.990723f, 0.031982f, 0.979492f, 0.046143f, 0.966797f, + 0.059052f, 0.954590f, 0.071777f, 0.940918f, 0.082031f, 0.929688f, 0.093140f, 0.917480f, + 0.103699f, 0.905762f, 0.111877f, 0.895996f, 0.121826f, 0.883789f, 0.130615f, 0.873047f, + 0.138306f, 0.864258f, 0.144775f, 0.855469f, 0.153809f, 0.844238f, 0.159302f, 0.835938f, + 0.165405f, 0.827637f, 0.170532f, 0.820801f, 0.177490f, 0.811523f, 0.183350f, 0.803223f, + 0.188965f, 0.795410f, 0.192993f, 0.788574f, 0.196899f, 0.782227f, 0.201660f, 0.776367f, + 0.206543f, 0.768066f, 0.210327f, 0.761230f, 0.215332f, 0.753906f, 0.218628f, 0.748535f, + 0.221313f, 0.742676f, 0.223877f, 0.737793f, 0.226807f, 0.732910f, 0.229248f, 0.727051f, + 0.232666f, 0.720703f, 0.236084f, 0.714355f, 0.238770f, 0.708984f, 0.239990f, 0.704102f, + 0.240723f, 0.698730f, 0.242432f, 0.693848f, 0.243164f, 0.688965f, 0.243530f, 0.685059f, + 0.244507f, 0.677734f, 0.246338f, 0.670898f, 0.247803f, 0.664551f, 0.247314f, 0.657715f, + 0.247192f, 0.652832f, 0.246338f, 0.645996f, 0.244751f, 0.640137f, 0.243042f, 0.633789f, + 0.240479f, 0.627930f, 0.238159f, 0.619141f, 0.236694f, 0.609375f, 0.233643f, 0.599121f, + 0.229492f, 0.589355f, 0.223389f, 0.578125f, 0.217163f, 0.566895f, 0.209351f, 0.554199f, + 0.199463f, 0.540527f, 0.187622f, 0.523438f, 0.174927f, 0.496582f, 0.158691f, 0.465576f, + 0.137207f, 0.427979f, 0.108276f, 0.376709f, 0.066467f, 0.295654f, 0.012627f, 0.106445f, + 0.000000f, 1.000000f, 0.022964f, 0.988281f, 0.042114f, 0.974121f, 0.061371f, 0.957520f, + 0.078979f, 0.940918f, 0.093079f, 0.926758f, 0.106934f, 0.911621f, 0.118469f, 0.899414f, + 0.131714f, 0.884766f, 0.142334f, 0.872559f, 0.150879f, 0.861816f, 0.161987f, 0.849121f, + 0.170288f, 0.838379f, 0.177368f, 0.829590f, 0.184692f, 0.819336f, 0.193359f, 0.808594f, + 0.199829f, 0.799805f, 0.205688f, 0.791504f, 0.210205f, 0.784668f, 0.216675f, 0.776367f, + 0.222534f, 0.767578f, 0.227417f, 0.760254f, 0.231567f, 0.753418f, 0.236206f, 0.746582f, + 0.240479f, 0.740234f, 0.242310f, 0.735352f, 0.247314f, 0.729004f, 0.250488f, 0.721680f, + 0.254395f, 0.715332f, 0.257324f, 0.709473f, 0.260010f, 0.704102f, 0.261963f, 0.699707f, + 0.263672f, 0.695312f, 0.264893f, 0.690918f, 0.266602f, 0.687012f, 0.268799f, 0.681641f, + 0.269531f, 0.675293f, 0.271973f, 0.669434f, 0.272705f, 0.664062f, 0.273682f, 0.659180f, + 0.274170f, 0.654785f, 0.273682f, 0.649414f, 0.272949f, 0.644531f, 0.272705f, 0.640625f, + 0.270264f, 0.635742f, 0.269531f, 0.629883f, 0.268555f, 0.622070f, 0.267578f, 0.615234f, + 0.265137f, 0.607910f, 0.261963f, 0.600586f, 0.259277f, 0.593750f, 0.253906f, 0.584961f, + 0.248901f, 0.576660f, 0.242310f, 0.567871f, 0.234375f, 0.557617f, 0.225952f, 0.546387f, + 0.216797f, 0.528320f, 0.205078f, 0.508789f, 0.190674f, 0.486816f, 0.172241f, 0.459229f, + 0.148315f, 0.424561f, 0.116272f, 0.375488f, 0.071289f, 0.296875f, 0.013588f, 0.106506f, + 0.000000f, 1.000000f, 0.032379f, 0.984375f, 0.059143f, 0.964844f, 0.083252f, 0.944824f, + 0.105103f, 0.924316f, 0.124756f, 0.904785f, 0.139648f, 0.889648f, 0.154907f, 0.872559f, + 0.167969f, 0.858398f, 0.178223f, 0.846191f, 0.191162f, 0.831055f, 0.201294f, 0.818848f, + 0.208862f, 0.808594f, 0.216919f, 0.798340f, 0.225098f, 0.787109f, 0.233032f, 0.776855f, + 0.239502f, 0.768066f, 0.244751f, 0.760254f, 0.250000f, 0.752441f, 0.254639f, 0.745117f, + 0.260986f, 0.736328f, 0.265381f, 0.728516f, 0.270264f, 0.721680f, 0.273438f, 0.715332f, + 0.277832f, 0.709473f, 0.280518f, 0.703613f, 0.282471f, 0.699219f, 0.286133f, 0.692871f, + 0.289307f, 0.686523f, 0.291504f, 0.681641f, 0.294678f, 0.675781f, 0.295898f, 0.671387f, + 0.297852f, 0.666992f, 0.299072f, 0.662598f, 0.300293f, 0.658691f, 0.301025f, 0.654785f, + 0.300537f, 0.651855f, 0.300537f, 0.647949f, 0.301025f, 0.643066f, 0.301758f, 0.637207f, + 0.301514f, 0.632324f, 0.302002f, 0.627930f, 0.301025f, 0.622070f, 0.300537f, 0.617188f, + 0.298340f, 0.612305f, 0.297363f, 0.607910f, 0.294434f, 0.602539f, 0.291748f, 0.597168f, + 0.288330f, 0.591797f, 0.283936f, 0.585938f, 0.280029f, 0.580078f, 0.273193f, 0.573242f, + 0.269043f, 0.563965f, 0.262695f, 0.553711f, 0.254883f, 0.541992f, 0.246216f, 0.529785f, + 0.234619f, 0.515625f, 0.221802f, 0.499268f, 0.205200f, 0.479980f, 0.184692f, 0.454834f, + 0.158569f, 0.422363f, 0.124268f, 0.375488f, 0.078003f, 0.288086f, 0.014595f, 0.107117f, + 0.000000f, 1.000000f, 0.049713f, 0.977051f, 0.088806f, 0.949219f, 0.119446f, 0.922852f, + 0.145874f, 0.898438f, 0.166016f, 0.878418f, 0.185425f, 0.857910f, 0.201050f, 0.840820f, + 0.215088f, 0.824707f, 0.228394f, 0.808594f, 0.239136f, 0.794922f, 0.248413f, 0.782715f, + 0.257568f, 0.771484f, 0.264893f, 0.760254f, 0.272705f, 0.750000f, 0.280273f, 0.739258f, + 0.286133f, 0.730469f, 0.291260f, 0.722168f, 0.296387f, 0.714844f, 0.301025f, 0.707031f, + 0.303955f, 0.701172f, 0.308594f, 0.694336f, 0.311768f, 0.687988f, 0.315186f, 0.681152f, + 0.317871f, 0.675781f, 0.321045f, 0.669922f, 0.324707f, 0.664062f, 0.326660f, 0.659180f, + 0.329102f, 0.653809f, 0.329590f, 0.649902f, 0.331055f, 0.645508f, 0.332275f, 0.641602f, + 0.333252f, 0.637695f, 0.333496f, 0.633789f, 0.334229f, 0.630371f, 0.334229f, 0.626953f, + 0.333740f, 0.624023f, 0.334229f, 0.620605f, 0.333252f, 0.616699f, 0.333008f, 0.612305f, + 0.332275f, 0.608398f, 0.330566f, 0.604980f, 0.329590f, 0.600098f, 0.328125f, 0.596191f, + 0.326172f, 0.592285f, 0.323486f, 0.587891f, 0.320312f, 0.583008f, 0.317139f, 0.578125f, + 0.313721f, 0.573242f, 0.309082f, 0.567871f, 0.303955f, 0.561035f, 0.298096f, 0.555176f, + 0.291504f, 0.547852f, 0.283447f, 0.540039f, 0.274170f, 0.530762f, 0.263672f, 0.520508f, + 0.250977f, 0.508301f, 0.236572f, 0.493652f, 0.218506f, 0.475586f, 0.196777f, 0.451660f, + 0.169800f, 0.417969f, 0.134155f, 0.368164f, 0.084351f, 0.283936f, 0.015701f, 0.108337f, + 0.000000f, 1.000000f, 0.062988f, 0.971191f, 0.108582f, 0.938965f, 0.144531f, 0.908691f, + 0.173096f, 0.882324f, 0.196289f, 0.858398f, 0.214600f, 0.837891f, 0.231689f, 0.818848f, + 0.246094f, 0.801758f, 0.259033f, 0.786133f, 0.269775f, 0.771973f, 0.279053f, 0.759277f, + 0.289062f, 0.747070f, 0.296387f, 0.736328f, 0.303467f, 0.725586f, 0.309082f, 0.716797f, + 0.315186f, 0.707520f, 0.320312f, 0.699219f, 0.325195f, 0.691406f, 0.329834f, 0.684082f, + 0.333496f, 0.677246f, 0.336914f, 0.670898f, 0.340332f, 0.664551f, 0.343994f, 0.658203f, + 0.345703f, 0.652832f, 0.348633f, 0.647461f, 0.351074f, 0.642578f, 0.352295f, 0.637695f, + 0.355225f, 0.632812f, 0.355957f, 0.628418f, 0.356445f, 0.624512f, 0.358398f, 0.620117f, + 0.358887f, 0.616211f, 0.359131f, 0.612793f, 0.359863f, 0.609375f, 0.360352f, 0.605469f, + 0.359619f, 0.602539f, 0.359619f, 0.599121f, 0.359619f, 0.595703f, 0.358154f, 0.591797f, + 0.356934f, 0.588379f, 0.355469f, 0.584961f, 0.355469f, 0.581055f, 0.352295f, 0.577148f, + 0.350342f, 0.573730f, 0.347656f, 0.569824f, 0.345459f, 0.565430f, 0.341797f, 0.560547f, + 0.337891f, 0.555664f, 0.333252f, 0.550781f, 0.328125f, 0.544434f, 0.322510f, 0.538574f, + 0.315186f, 0.531250f, 0.308350f, 0.523926f, 0.299805f, 0.514648f, 0.289551f, 0.504883f, + 0.277344f, 0.492676f, 0.262207f, 0.477539f, 0.245728f, 0.459717f, 0.223145f, 0.436035f, + 0.196167f, 0.404785f, 0.160156f, 0.358643f, 0.107544f, 0.280273f, 0.028214f, 0.113586f, + 0.000000f, 1.000000f, 0.062988f, 0.971191f, 0.109253f, 0.938477f, 0.145508f, 0.908203f, + 0.174438f, 0.881348f, 0.198975f, 0.856934f, 0.217773f, 0.835938f, 0.235596f, 0.816406f, + 0.250244f, 0.798828f, 0.263672f, 0.782715f, 0.275146f, 0.768066f, 0.284912f, 0.754883f, + 0.293945f, 0.743164f, 0.303223f, 0.730957f, 0.310791f, 0.720215f, 0.316895f, 0.710449f, + 0.323242f, 0.701172f, 0.328857f, 0.692383f, 0.334473f, 0.684082f, 0.338867f, 0.676758f, + 0.343994f, 0.668457f, 0.347656f, 0.662109f, 0.351074f, 0.655273f, 0.355225f, 0.649414f, + 0.357178f, 0.643066f, 0.360107f, 0.637695f, 0.363281f, 0.632324f, 0.365723f, 0.626465f, + 0.368652f, 0.621094f, 0.370605f, 0.616211f, 0.371582f, 0.611816f, 0.373535f, 0.607422f, + 0.374756f, 0.603027f, 0.375732f, 0.599121f, 0.376465f, 0.595215f, 0.376953f, 0.591309f, + 0.377686f, 0.587891f, 0.377930f, 0.583984f, 0.378418f, 0.580566f, 0.377930f, 0.576172f, + 0.377441f, 0.572266f, 0.376465f, 0.568848f, 0.376465f, 0.564453f, 0.374512f, 0.560059f, + 0.373535f, 0.555664f, 0.371338f, 0.551758f, 0.369385f, 0.546875f, 0.366455f, 0.541992f, + 0.363525f, 0.536621f, 0.359619f, 0.531250f, 0.356201f, 0.525391f, 0.350830f, 0.518555f, + 0.345459f, 0.511230f, 0.339600f, 0.503906f, 0.331055f, 0.494141f, 0.322754f, 0.483398f, + 0.312500f, 0.471924f, 0.299316f, 0.457031f, 0.283936f, 0.439453f, 0.264160f, 0.416504f, + 0.238525f, 0.386230f, 0.204834f, 0.341553f, 0.151611f, 0.267334f, 0.062408f, 0.109009f, + 0.000000f, 1.000000f, 0.062744f, 0.971680f, 0.110352f, 0.937988f, 0.147095f, 0.907227f, + 0.175415f, 0.880859f, 0.201660f, 0.855469f, 0.221558f, 0.833496f, 0.239258f, 0.813965f, + 0.254395f, 0.795898f, 0.267578f, 0.779785f, 0.280273f, 0.764648f, 0.291260f, 0.750488f, + 0.300537f, 0.738281f, 0.308838f, 0.726074f, 0.317383f, 0.714844f, 0.324707f, 0.704102f, + 0.331787f, 0.694336f, 0.337891f, 0.685059f, 0.344238f, 0.676270f, 0.348145f, 0.668945f, + 0.355225f, 0.660156f, 0.358154f, 0.653320f, 0.362549f, 0.646484f, 0.366943f, 0.639160f, + 0.370361f, 0.632812f, 0.373535f, 0.626953f, 0.376709f, 0.621094f, 0.379883f, 0.615234f, + 0.381836f, 0.609863f, 0.385010f, 0.604004f, 0.386963f, 0.599121f, 0.389893f, 0.594238f, + 0.391113f, 0.589844f, 0.392334f, 0.584961f, 0.394043f, 0.580566f, 0.395264f, 0.576172f, + 0.396973f, 0.572266f, 0.396973f, 0.568359f, 0.398438f, 0.563965f, 0.399414f, 0.559570f, + 0.398682f, 0.554688f, 0.398193f, 0.550781f, 0.398926f, 0.545898f, 0.398438f, 0.541992f, + 0.397217f, 0.536621f, 0.396484f, 0.532227f, 0.394531f, 0.527344f, 0.393311f, 0.521973f, + 0.390625f, 0.516602f, 0.388184f, 0.510742f, 0.385254f, 0.503906f, 0.381104f, 0.497070f, + 0.376221f, 0.489746f, 0.370361f, 0.481201f, 0.364746f, 0.472412f, 0.356934f, 0.461426f, + 0.347900f, 0.449219f, 0.335938f, 0.435059f, 0.323486f, 0.417725f, 0.305176f, 0.395752f, + 0.281738f, 0.366211f, 0.250000f, 0.324463f, 0.198730f, 0.255127f, 0.105286f, 0.104431f, + 0.000000f, 1.000000f, 0.062866f, 0.971680f, 0.111023f, 0.937500f, 0.148315f, 0.906738f, + 0.178101f, 0.878906f, 0.203369f, 0.854004f, 0.224976f, 0.831543f, 0.242676f, 0.811523f, + 0.259766f, 0.792480f, 0.272705f, 0.775879f, 0.285645f, 0.760254f, 0.297119f, 0.746094f, + 0.307373f, 0.732910f, 0.316650f, 0.720215f, 0.324951f, 0.708496f, 0.333252f, 0.697754f, + 0.341064f, 0.687500f, 0.346680f, 0.677734f, 0.353516f, 0.668945f, 0.359375f, 0.660156f, + 0.365234f, 0.651367f, 0.368896f, 0.644043f, 0.374268f, 0.636230f, 0.379150f, 0.628906f, + 0.383789f, 0.621582f, 0.386963f, 0.615234f, 0.391113f, 0.608887f, 0.395020f, 0.602539f, + 0.398193f, 0.596680f, 0.401611f, 0.590332f, 0.403809f, 0.585449f, 0.405518f, 0.580566f, + 0.409180f, 0.574707f, 0.410156f, 0.570312f, 0.412354f, 0.565430f, 0.414062f, 0.560547f, + 0.415527f, 0.556152f, 0.416992f, 0.551758f, 0.418213f, 0.547363f, 0.419678f, 0.542969f, + 0.419678f, 0.538086f, 0.420166f, 0.533691f, 0.420898f, 0.528320f, 0.420898f, 0.523926f, + 0.420166f, 0.518555f, 0.419678f, 0.513672f, 0.419434f, 0.508301f, 0.418457f, 0.502441f, + 0.416748f, 0.496826f, 0.415283f, 0.490723f, 0.412842f, 0.483398f, 0.410645f, 0.476074f, + 0.406250f, 0.468750f, 0.401855f, 0.459717f, 0.398682f, 0.450928f, 0.390625f, 0.439453f, + 0.383301f, 0.427490f, 0.373047f, 0.412842f, 0.361816f, 0.395996f, 0.345947f, 0.374268f, + 0.325684f, 0.346436f, 0.296387f, 0.305664f, 0.248291f, 0.240967f, 0.154663f, 0.099915f, + 0.000000f, 1.000000f, 0.063293f, 0.971191f, 0.111023f, 0.937988f, 0.149170f, 0.906250f, + 0.179932f, 0.877930f, 0.205811f, 0.852539f, 0.226929f, 0.830078f, 0.246582f, 0.808594f, + 0.263672f, 0.789551f, 0.277344f, 0.772461f, 0.291748f, 0.755859f, 0.303711f, 0.741211f, + 0.314209f, 0.727539f, 0.324951f, 0.714355f, 0.333252f, 0.702148f, 0.343018f, 0.689941f, + 0.350586f, 0.679199f, 0.358154f, 0.668945f, 0.364014f, 0.660156f, 0.370850f, 0.650391f, + 0.376465f, 0.642090f, 0.381592f, 0.633789f, 0.387451f, 0.625488f, 0.392090f, 0.618164f, + 0.396484f, 0.610840f, 0.400879f, 0.604004f, 0.404297f, 0.597656f, 0.407715f, 0.591309f, + 0.412109f, 0.584961f, 0.416260f, 0.578125f, 0.418701f, 0.572754f, 0.421631f, 0.566895f, + 0.425537f, 0.561035f, 0.426758f, 0.556152f, 0.428955f, 0.550781f, 0.432129f, 0.545410f, + 0.433838f, 0.540527f, 0.436523f, 0.535645f, 0.438232f, 0.530762f, 0.440918f, 0.525391f, + 0.441162f, 0.520996f, 0.442139f, 0.515625f, 0.442139f, 0.510254f, 0.443848f, 0.504883f, + 0.444824f, 0.500000f, 0.444092f, 0.494629f, 0.444824f, 0.488770f, 0.444336f, 0.482666f, + 0.443359f, 0.476562f, 0.442871f, 0.469971f, 0.442383f, 0.462646f, 0.439697f, 0.455322f, + 0.437012f, 0.447021f, 0.433350f, 0.438721f, 0.429199f, 0.428223f, 0.424072f, 0.417725f, + 0.418945f, 0.405518f, 0.410400f, 0.391357f, 0.399658f, 0.373779f, 0.386475f, 0.352539f, + 0.367920f, 0.325684f, 0.341797f, 0.287842f, 0.298340f, 0.226685f, 0.206909f, 0.094177f, + 0.000000f, 1.000000f, 0.063416f, 0.971191f, 0.112122f, 0.937012f, 0.149780f, 0.905762f, + 0.181885f, 0.876953f, 0.208618f, 0.850586f, 0.231323f, 0.827148f, 0.251221f, 0.805664f, + 0.268555f, 0.785645f, 0.283936f, 0.768066f, 0.298340f, 0.750977f, 0.310791f, 0.735352f, + 0.322510f, 0.720703f, 0.332275f, 0.707520f, 0.343018f, 0.694824f, 0.352051f, 0.683105f, + 0.359619f, 0.671875f, 0.367188f, 0.661621f, 0.373535f, 0.651855f, 0.381592f, 0.641602f, + 0.387207f, 0.633301f, 0.393799f, 0.624023f, 0.399170f, 0.615723f, 0.404053f, 0.608398f, + 0.409424f, 0.600098f, 0.414062f, 0.592773f, 0.418213f, 0.585938f, 0.421875f, 0.579102f, + 0.427246f, 0.571777f, 0.431396f, 0.564941f, 0.435547f, 0.558594f, 0.437744f, 0.552734f, + 0.442139f, 0.546875f, 0.445312f, 0.541016f, 0.447754f, 0.535645f, 0.450439f, 0.529785f, + 0.453125f, 0.524414f, 0.455811f, 0.519043f, 0.458252f, 0.514160f, 0.460449f, 0.508789f, + 0.462891f, 0.503418f, 0.463623f, 0.497803f, 0.465332f, 0.492188f, 0.467041f, 0.486572f, + 0.468262f, 0.480957f, 0.468262f, 0.475586f, 0.469727f, 0.469238f, 0.470215f, 0.462891f, + 0.470703f, 0.456055f, 0.469238f, 0.449219f, 0.469727f, 0.442139f, 0.468506f, 0.434326f, + 0.467285f, 0.425781f, 0.463867f, 0.416748f, 0.461426f, 0.406494f, 0.458984f, 0.396240f, + 0.451660f, 0.383057f, 0.446533f, 0.369385f, 0.437256f, 0.352295f, 0.426514f, 0.331543f, + 0.409668f, 0.305420f, 0.386963f, 0.269287f, 0.346924f, 0.211426f, 0.261230f, 0.088196f, + 0.000000f, 1.000000f, 0.064514f, 0.970215f, 0.113281f, 0.936523f, 0.151855f, 0.904785f, + 0.183105f, 0.875977f, 0.210693f, 0.849121f, 0.235352f, 0.824219f, 0.255371f, 0.802246f, + 0.273682f, 0.782227f, 0.290771f, 0.763184f, 0.304443f, 0.746094f, 0.316650f, 0.730469f, + 0.328369f, 0.715820f, 0.340088f, 0.702148f, 0.350586f, 0.688965f, 0.359131f, 0.676758f, + 0.368408f, 0.665039f, 0.376709f, 0.653809f, 0.384033f, 0.643555f, 0.391357f, 0.633789f, + 0.397461f, 0.624512f, 0.405518f, 0.614258f, 0.411377f, 0.605469f, 0.416992f, 0.597168f, + 0.422607f, 0.589355f, 0.427979f, 0.581055f, 0.432373f, 0.573730f, 0.437744f, 0.566406f, + 0.442627f, 0.559570f, 0.446777f, 0.552246f, 0.451416f, 0.545410f, 0.455566f, 0.538574f, + 0.460205f, 0.532227f, 0.462402f, 0.525879f, 0.465576f, 0.520508f, 0.469238f, 0.514160f, + 0.472168f, 0.508301f, 0.475098f, 0.502441f, 0.477783f, 0.497559f, 0.480957f, 0.491455f, + 0.484619f, 0.485596f, 0.486084f, 0.480469f, 0.487549f, 0.474121f, 0.489746f, 0.467773f, + 0.491211f, 0.461670f, 0.493408f, 0.456055f, 0.494141f, 0.449707f, 0.495605f, 0.442383f, + 0.496826f, 0.435791f, 0.496582f, 0.428711f, 0.496826f, 0.421875f, 0.496582f, 0.412842f, + 0.496582f, 0.404297f, 0.495850f, 0.395508f, 0.492676f, 0.385254f, 0.489990f, 0.374023f, + 0.486572f, 0.360840f, 0.481201f, 0.348145f, 0.474365f, 0.330566f, 0.465332f, 0.310791f, + 0.451660f, 0.285645f, 0.430908f, 0.250488f, 0.395752f, 0.196655f, 0.314941f, 0.082642f, + 0.000000f, 1.000000f, 0.064331f, 0.970703f, 0.113464f, 0.936523f, 0.153320f, 0.903809f, + 0.186401f, 0.874023f, 0.213989f, 0.846680f, 0.238770f, 0.821777f, 0.260742f, 0.798340f, + 0.278320f, 0.778809f, 0.295654f, 0.759277f, 0.309082f, 0.742676f, 0.323975f, 0.725586f, + 0.335938f, 0.710449f, 0.346436f, 0.696777f, 0.357666f, 0.683105f, 0.367920f, 0.669922f, + 0.377686f, 0.657227f, 0.386475f, 0.645996f, 0.394531f, 0.634766f, 0.403076f, 0.624512f, + 0.409180f, 0.614746f, 0.416748f, 0.604492f, 0.423096f, 0.595703f, 0.429688f, 0.586426f, + 0.435059f, 0.578613f, 0.442627f, 0.569336f, 0.446777f, 0.561523f, 0.452148f, 0.553711f, + 0.456787f, 0.546875f, 0.462402f, 0.539062f, 0.467773f, 0.531738f, 0.471436f, 0.524902f, + 0.475586f, 0.518066f, 0.481201f, 0.510742f, 0.483643f, 0.504883f, 0.488281f, 0.498535f, + 0.492432f, 0.491943f, 0.494141f, 0.486328f, 0.498047f, 0.480225f, 0.501465f, 0.474121f, + 0.505371f, 0.467773f, 0.508789f, 0.461914f, 0.509277f, 0.456055f, 0.512207f, 0.449463f, + 0.514648f, 0.442627f, 0.517090f, 0.436523f, 0.518555f, 0.430176f, 0.520996f, 0.422607f, + 0.521973f, 0.415771f, 0.522949f, 0.408447f, 0.523926f, 0.400391f, 0.525391f, 0.391846f, + 0.525391f, 0.383545f, 0.524902f, 0.373779f, 0.523926f, 0.363770f, 0.521484f, 0.352295f, + 0.520020f, 0.340332f, 0.515625f, 0.325928f, 0.510742f, 0.309570f, 0.502930f, 0.290039f, + 0.491455f, 0.265381f, 0.473389f, 0.233521f, 0.442383f, 0.181519f, 0.370117f, 0.076660f, + 0.000000f, 1.000000f, 0.064087f, 0.971191f, 0.113586f, 0.936523f, 0.154785f, 0.902832f, + 0.189209f, 0.872070f, 0.218018f, 0.844238f, 0.242920f, 0.818848f, 0.263428f, 0.796387f, + 0.282227f, 0.775391f, 0.299561f, 0.756348f, 0.314941f, 0.737793f, 0.330322f, 0.720703f, + 0.343506f, 0.704590f, 0.355225f, 0.689941f, 0.366943f, 0.675781f, 0.376709f, 0.662598f, + 0.387207f, 0.649902f, 0.395996f, 0.638184f, 0.405273f, 0.625977f, 0.412354f, 0.616211f, + 0.421631f, 0.604492f, 0.429199f, 0.594727f, 0.436035f, 0.584961f, 0.443359f, 0.575684f, + 0.448975f, 0.566895f, 0.456787f, 0.557617f, 0.460938f, 0.549805f, 0.468750f, 0.541016f, + 0.473145f, 0.533203f, 0.477783f, 0.525879f, 0.483887f, 0.518066f, 0.488037f, 0.510254f, + 0.492676f, 0.503418f, 0.497803f, 0.496094f, 0.502930f, 0.488770f, 0.506348f, 0.482666f, + 0.511230f, 0.475830f, 0.514648f, 0.469727f, 0.518555f, 0.462891f, 0.521484f, 0.456787f, + 0.525391f, 0.450439f, 0.529785f, 0.443848f, 0.532715f, 0.437988f, 0.535645f, 0.430664f, + 0.537598f, 0.423828f, 0.540039f, 0.417236f, 0.543457f, 0.410645f, 0.545898f, 0.402832f, + 0.547852f, 0.395752f, 0.550293f, 0.388184f, 0.550781f, 0.380127f, 0.552246f, 0.371826f, + 0.552734f, 0.362305f, 0.553711f, 0.353271f, 0.553711f, 0.342773f, 0.553223f, 0.332031f, + 0.551758f, 0.319336f, 0.548828f, 0.305176f, 0.545898f, 0.289795f, 0.540039f, 0.270020f, + 0.529297f, 0.246948f, 0.513184f, 0.216187f, 0.487549f, 0.167358f, 0.422119f, 0.069885f, + 0.000000f, 1.000000f, 0.063843f, 0.971191f, 0.115173f, 0.935547f, 0.156616f, 0.901855f, + 0.192017f, 0.870117f, 0.220093f, 0.842773f, 0.246338f, 0.816895f, 0.268066f, 0.793457f, + 0.287598f, 0.771973f, 0.305420f, 0.751953f, 0.322510f, 0.732910f, 0.336670f, 0.715820f, + 0.350830f, 0.698730f, 0.364014f, 0.683105f, 0.375000f, 0.668945f, 0.386475f, 0.654785f, + 0.396729f, 0.642578f, 0.407715f, 0.628906f, 0.415771f, 0.617676f, 0.423584f, 0.606445f, + 0.433350f, 0.595215f, 0.439941f, 0.584961f, 0.448975f, 0.574219f, 0.455566f, 0.564453f, + 0.462402f, 0.555176f, 0.469727f, 0.545898f, 0.476318f, 0.537109f, 0.481689f, 0.528809f, + 0.488770f, 0.520020f, 0.493652f, 0.512207f, 0.499512f, 0.504395f, 0.504883f, 0.496338f, + 0.510254f, 0.488525f, 0.515625f, 0.480713f, 0.520996f, 0.473633f, 0.524902f, 0.466797f, + 0.530273f, 0.459473f, 0.534180f, 0.452637f, 0.538086f, 0.446045f, 0.542969f, 0.438965f, + 0.546387f, 0.432861f, 0.550781f, 0.425781f, 0.553711f, 0.419678f, 0.558105f, 0.412598f, + 0.561035f, 0.404785f, 0.564453f, 0.397949f, 0.567383f, 0.390869f, 0.570312f, 0.383789f, + 0.572754f, 0.375732f, 0.575195f, 0.367920f, 0.577148f, 0.360107f, 0.580566f, 0.350830f, + 0.581543f, 0.342773f, 0.582520f, 0.332520f, 0.582520f, 0.322510f, 0.583496f, 0.310791f, + 0.583008f, 0.298828f, 0.580078f, 0.285156f, 0.578613f, 0.269287f, 0.573730f, 0.251221f, + 0.565430f, 0.229004f, 0.554688f, 0.198730f, 0.529785f, 0.154053f, 0.471924f, 0.063538f, + 0.000000f, 1.000000f, 0.063843f, 0.971191f, 0.116028f, 0.935059f, 0.159546f, 0.899902f, + 0.193848f, 0.869141f, 0.223999f, 0.840820f, 0.249268f, 0.814941f, 0.272461f, 0.790527f, + 0.293213f, 0.768066f, 0.312500f, 0.747070f, 0.329590f, 0.727539f, 0.343994f, 0.709961f, + 0.357666f, 0.693848f, 0.371582f, 0.677246f, 0.384766f, 0.662109f, 0.395996f, 0.647461f, + 0.406250f, 0.634277f, 0.417236f, 0.621094f, 0.425293f, 0.609375f, 0.435547f, 0.596680f, + 0.446045f, 0.584961f, 0.453125f, 0.574707f, 0.460938f, 0.563965f, 0.469971f, 0.553223f, + 0.477051f, 0.543457f, 0.483887f, 0.534180f, 0.491699f, 0.524414f, 0.497559f, 0.515625f, + 0.503906f, 0.506836f, 0.509277f, 0.498779f, 0.516113f, 0.490479f, 0.521973f, 0.481934f, + 0.527344f, 0.473877f, 0.533691f, 0.465576f, 0.538574f, 0.458008f, 0.542969f, 0.450684f, + 0.548828f, 0.443359f, 0.553223f, 0.436035f, 0.558105f, 0.429199f, 0.563965f, 0.421631f, + 0.567383f, 0.415039f, 0.571777f, 0.407715f, 0.575195f, 0.401367f, 0.580566f, 0.394043f, + 0.583984f, 0.386475f, 0.587402f, 0.379150f, 0.590820f, 0.371826f, 0.595215f, 0.364258f, + 0.597656f, 0.356445f, 0.599121f, 0.348633f, 0.604492f, 0.340088f, 0.605469f, 0.331299f, + 0.608887f, 0.322021f, 0.608398f, 0.312744f, 0.611816f, 0.302490f, 0.612305f, 0.291260f, + 0.612305f, 0.279297f, 0.611816f, 0.266113f, 0.610352f, 0.250244f, 0.606445f, 0.232788f, + 0.601562f, 0.211060f, 0.590820f, 0.182739f, 0.570312f, 0.140747f, 0.519043f, 0.057953f, + 0.000000f, 1.000000f, 0.064270f, 0.971191f, 0.117493f, 0.934082f, 0.160645f, 0.899414f, + 0.195190f, 0.868164f, 0.227295f, 0.838867f, 0.253174f, 0.812012f, 0.277588f, 0.787109f, + 0.297607f, 0.764648f, 0.317627f, 0.743164f, 0.335449f, 0.723633f, 0.350586f, 0.705078f, + 0.364990f, 0.687500f, 0.379883f, 0.670898f, 0.392090f, 0.655273f, 0.405762f, 0.640137f, + 0.416016f, 0.625977f, 0.426758f, 0.612793f, 0.437500f, 0.600098f, 0.448242f, 0.586914f, + 0.456543f, 0.575684f, 0.465820f, 0.563965f, 0.473877f, 0.553223f, 0.481201f, 0.542969f, + 0.490723f, 0.531738f, 0.497559f, 0.522461f, 0.505371f, 0.512207f, 0.512695f, 0.502441f, + 0.519043f, 0.493896f, 0.525879f, 0.484619f, 0.532715f, 0.476318f, 0.538574f, 0.467529f, + 0.544922f, 0.458984f, 0.551270f, 0.450684f, 0.558105f, 0.442383f, 0.561035f, 0.435059f, + 0.567383f, 0.427246f, 0.572754f, 0.419189f, 0.578125f, 0.412109f, 0.582520f, 0.404785f, + 0.588379f, 0.397217f, 0.592285f, 0.390137f, 0.597168f, 0.383057f, 0.602051f, 0.375488f, + 0.605469f, 0.369141f, 0.610352f, 0.360352f, 0.612793f, 0.353027f, 0.618164f, 0.344971f, + 0.621094f, 0.337402f, 0.625000f, 0.329102f, 0.628418f, 0.320312f, 0.631348f, 0.312256f, + 0.633301f, 0.302490f, 0.637207f, 0.293701f, 0.638672f, 0.282959f, 0.640137f, 0.271973f, + 0.641602f, 0.259766f, 0.641113f, 0.247437f, 0.640137f, 0.231689f, 0.637695f, 0.214966f, + 0.634277f, 0.194214f, 0.625488f, 0.167847f, 0.607422f, 0.128784f, 0.563965f, 0.054199f, + 0.000000f, 1.000000f, 0.064270f, 0.971191f, 0.118652f, 0.933105f, 0.161499f, 0.898926f, + 0.197510f, 0.867188f, 0.228516f, 0.837402f, 0.257324f, 0.809082f, 0.281250f, 0.784180f, + 0.302979f, 0.761230f, 0.322998f, 0.739258f, 0.341797f, 0.718262f, 0.357666f, 0.699707f, + 0.373535f, 0.681152f, 0.387207f, 0.664551f, 0.401855f, 0.647949f, 0.413818f, 0.632812f, + 0.425781f, 0.618164f, 0.437988f, 0.604004f, 0.448242f, 0.590820f, 0.459961f, 0.577637f, + 0.468994f, 0.565430f, 0.479248f, 0.552734f, 0.487549f, 0.541992f, 0.496338f, 0.531250f, + 0.504883f, 0.520020f, 0.511719f, 0.510254f, 0.519531f, 0.500000f, 0.527832f, 0.489746f, + 0.535156f, 0.480469f, 0.541504f, 0.470947f, 0.547852f, 0.462402f, 0.554688f, 0.453613f, + 0.562988f, 0.444092f, 0.568848f, 0.435547f, 0.575195f, 0.427002f, 0.580078f, 0.418945f, + 0.586914f, 0.410889f, 0.590820f, 0.403320f, 0.597168f, 0.395264f, 0.602051f, 0.387939f, + 0.608887f, 0.379883f, 0.613281f, 0.372559f, 0.618164f, 0.365234f, 0.623535f, 0.357422f, + 0.628418f, 0.350342f, 0.632324f, 0.342529f, 0.635254f, 0.334961f, 0.640625f, 0.326416f, + 0.645020f, 0.318604f, 0.648926f, 0.310547f, 0.651367f, 0.302246f, 0.656250f, 0.292725f, + 0.659180f, 0.283936f, 0.661621f, 0.274658f, 0.664551f, 0.263916f, 0.667480f, 0.253418f, + 0.668945f, 0.241577f, 0.669922f, 0.229248f, 0.670410f, 0.214844f, 0.669434f, 0.198364f, + 0.664551f, 0.178589f, 0.658203f, 0.153564f, 0.644043f, 0.117371f, 0.605957f, 0.046814f, + 0.000000f, 1.000000f, 0.065063f, 0.970703f, 0.119690f, 0.932617f, 0.162720f, 0.898438f, + 0.199585f, 0.865723f, 0.232910f, 0.834473f, 0.260254f, 0.807129f, 0.285889f, 0.781250f, + 0.309082f, 0.756836f, 0.328613f, 0.734863f, 0.348145f, 0.713379f, 0.365234f, 0.693848f, + 0.381836f, 0.675293f, 0.396729f, 0.657227f, 0.410645f, 0.641113f, 0.423828f, 0.625000f, + 0.436768f, 0.609863f, 0.448730f, 0.595215f, 0.460938f, 0.581055f, 0.470459f, 0.568359f, + 0.480957f, 0.555176f, 0.490723f, 0.543457f, 0.500977f, 0.531250f, 0.508789f, 0.519531f, + 0.519043f, 0.508301f, 0.526855f, 0.497559f, 0.535156f, 0.487305f, 0.541992f, 0.477295f, + 0.550781f, 0.467041f, 0.558105f, 0.457031f, 0.564453f, 0.448242f, 0.571777f, 0.438721f, + 0.579102f, 0.429688f, 0.585449f, 0.421143f, 0.592285f, 0.411865f, 0.597656f, 0.403320f, + 0.605469f, 0.395020f, 0.610840f, 0.386719f, 0.616211f, 0.378662f, 0.621094f, 0.371094f, + 0.628906f, 0.362549f, 0.632812f, 0.355225f, 0.638184f, 0.347900f, 0.644043f, 0.339844f, + 0.648926f, 0.332275f, 0.654785f, 0.324707f, 0.657715f, 0.316895f, 0.663086f, 0.308350f, + 0.667480f, 0.300293f, 0.671387f, 0.292236f, 0.675293f, 0.283936f, 0.680176f, 0.274658f, + 0.683105f, 0.266113f, 0.686523f, 0.256348f, 0.689941f, 0.246704f, 0.692383f, 0.235474f, + 0.693848f, 0.224609f, 0.696289f, 0.212524f, 0.697266f, 0.198486f, 0.695801f, 0.182617f, + 0.693848f, 0.163330f, 0.689941f, 0.140869f, 0.678711f, 0.106812f, 0.645020f, 0.043213f, + 0.000000f, 1.000000f, 0.065430f, 0.970215f, 0.120850f, 0.932129f, 0.163452f, 0.897949f, + 0.202393f, 0.864258f, 0.236206f, 0.832520f, 0.264893f, 0.804199f, 0.290527f, 0.777832f, + 0.312988f, 0.753418f, 0.334961f, 0.730469f, 0.354248f, 0.708496f, 0.372803f, 0.687988f, + 0.389160f, 0.669434f, 0.404297f, 0.650879f, 0.420166f, 0.633789f, 0.433105f, 0.617676f, + 0.447266f, 0.601562f, 0.459717f, 0.586426f, 0.471191f, 0.572266f, 0.481934f, 0.558594f, + 0.493164f, 0.544922f, 0.503418f, 0.532227f, 0.512695f, 0.520508f, 0.523438f, 0.507812f, + 0.531250f, 0.497070f, 0.542480f, 0.484863f, 0.548340f, 0.475098f, 0.558594f, 0.464111f, + 0.564941f, 0.454102f, 0.574219f, 0.443359f, 0.581543f, 0.433594f, 0.587891f, 0.424805f, + 0.595215f, 0.415283f, 0.603027f, 0.406006f, 0.611328f, 0.396240f, 0.616699f, 0.387939f, + 0.622559f, 0.379150f, 0.629395f, 0.370605f, 0.635254f, 0.362305f, 0.641113f, 0.354248f, + 0.647949f, 0.346191f, 0.652832f, 0.338135f, 0.658691f, 0.330322f, 0.664062f, 0.322754f, + 0.669922f, 0.314453f, 0.674316f, 0.307373f, 0.680176f, 0.299316f, 0.683594f, 0.291016f, + 0.688477f, 0.282471f, 0.693848f, 0.274170f, 0.696777f, 0.266602f, 0.701660f, 0.257568f, + 0.706055f, 0.248047f, 0.710449f, 0.239014f, 0.712891f, 0.229370f, 0.716797f, 0.219116f, + 0.719238f, 0.208374f, 0.720215f, 0.196045f, 0.723145f, 0.182739f, 0.723145f, 0.167969f, + 0.722168f, 0.150391f, 0.718262f, 0.128662f, 0.709961f, 0.096558f, 0.679688f, 0.039581f, + 0.000000f, 1.000000f, 0.066101f, 0.969727f, 0.121155f, 0.932617f, 0.165527f, 0.896973f, + 0.205322f, 0.861816f, 0.238281f, 0.831543f, 0.268311f, 0.801758f, 0.294678f, 0.774902f, + 0.319336f, 0.749512f, 0.341309f, 0.725586f, 0.361572f, 0.703125f, 0.380371f, 0.682617f, + 0.396973f, 0.663086f, 0.413330f, 0.644043f, 0.428467f, 0.626465f, 0.445068f, 0.609375f, + 0.458252f, 0.592773f, 0.470947f, 0.577637f, 0.481201f, 0.563477f, 0.493896f, 0.548340f, + 0.504883f, 0.535156f, 0.516113f, 0.521973f, 0.526855f, 0.509277f, 0.536621f, 0.496826f, + 0.544922f, 0.485107f, 0.554688f, 0.473389f, 0.563965f, 0.461914f, 0.572754f, 0.451172f, + 0.581543f, 0.440430f, 0.590332f, 0.429932f, 0.597168f, 0.419922f, 0.604980f, 0.410156f, + 0.612793f, 0.400391f, 0.619141f, 0.391602f, 0.627930f, 0.381592f, 0.634766f, 0.372314f, + 0.640625f, 0.363770f, 0.647949f, 0.354492f, 0.655273f, 0.345947f, 0.659668f, 0.337891f, + 0.666016f, 0.329590f, 0.672852f, 0.321289f, 0.677734f, 0.313721f, 0.683594f, 0.305664f, + 0.689941f, 0.297363f, 0.694824f, 0.289795f, 0.700195f, 0.282227f, 0.706055f, 0.274414f, + 0.709961f, 0.265625f, 0.714355f, 0.257324f, 0.719727f, 0.249023f, 0.723633f, 0.240845f, + 0.728027f, 0.231323f, 0.731445f, 0.223022f, 0.736328f, 0.212891f, 0.740234f, 0.202759f, + 0.743164f, 0.191772f, 0.746094f, 0.181030f, 0.747070f, 0.168701f, 0.748535f, 0.154297f, + 0.748047f, 0.137207f, 0.745117f, 0.116882f, 0.737305f, 0.087463f, 0.713867f, 0.035583f, + 0.000000f, 1.000000f, 0.066650f, 0.969238f, 0.121887f, 0.932129f, 0.168335f, 0.895020f, + 0.207153f, 0.861328f, 0.241699f, 0.828613f, 0.272217f, 0.798828f, 0.300537f, 0.770996f, + 0.323975f, 0.745605f, 0.348633f, 0.720703f, 0.368652f, 0.698242f, 0.387451f, 0.677246f, + 0.405029f, 0.656738f, 0.422852f, 0.637207f, 0.437256f, 0.619141f, 0.452881f, 0.601562f, + 0.467285f, 0.584961f, 0.480225f, 0.568848f, 0.493652f, 0.553223f, 0.505859f, 0.539062f, + 0.517578f, 0.524414f, 0.528320f, 0.511230f, 0.539062f, 0.498047f, 0.549805f, 0.485352f, + 0.559570f, 0.472900f, 0.570312f, 0.460938f, 0.578125f, 0.449463f, 0.587402f, 0.438232f, + 0.596680f, 0.427002f, 0.604980f, 0.416748f, 0.613281f, 0.405762f, 0.621094f, 0.395996f, + 0.627930f, 0.386230f, 0.636719f, 0.376465f, 0.643555f, 0.367188f, 0.651367f, 0.357422f, + 0.657227f, 0.348633f, 0.665527f, 0.339111f, 0.673340f, 0.330322f, 0.677246f, 0.322266f, + 0.684082f, 0.313721f, 0.691406f, 0.305176f, 0.696777f, 0.297119f, 0.702637f, 0.289062f, + 0.708008f, 0.281006f, 0.714844f, 0.272705f, 0.720215f, 0.265381f, 0.725098f, 0.257568f, + 0.730469f, 0.249390f, 0.735352f, 0.240723f, 0.740234f, 0.232910f, 0.744141f, 0.224365f, + 0.750000f, 0.215576f, 0.753906f, 0.206299f, 0.757324f, 0.197632f, 0.761719f, 0.187622f, + 0.763672f, 0.177734f, 0.767578f, 0.166504f, 0.770020f, 0.154297f, 0.771484f, 0.141113f, + 0.771973f, 0.125244f, 0.770020f, 0.106323f, 0.763672f, 0.078552f, 0.744141f, 0.031311f, + 0.000000f, 1.000000f, 0.068359f, 0.968262f, 0.123169f, 0.931641f, 0.169067f, 0.894531f, + 0.209961f, 0.859375f, 0.243896f, 0.827637f, 0.276855f, 0.795898f, 0.305664f, 0.767578f, + 0.329834f, 0.741211f, 0.353027f, 0.716797f, 0.375488f, 0.692871f, 0.395264f, 0.670898f, + 0.413330f, 0.650391f, 0.430176f, 0.630859f, 0.448486f, 0.611328f, 0.463135f, 0.593262f, + 0.477783f, 0.576660f, 0.491943f, 0.559570f, 0.505859f, 0.543945f, 0.518066f, 0.528809f, + 0.528809f, 0.514648f, 0.540527f, 0.500488f, 0.552246f, 0.487061f, 0.562012f, 0.474365f, + 0.573730f, 0.460938f, 0.582520f, 0.449219f, 0.593262f, 0.436768f, 0.602539f, 0.425293f, + 0.612793f, 0.413818f, 0.618652f, 0.404053f, 0.628906f, 0.392090f, 0.637695f, 0.381592f, + 0.645508f, 0.371582f, 0.653320f, 0.361816f, 0.657715f, 0.353516f, 0.667969f, 0.342529f, + 0.675781f, 0.333252f, 0.682617f, 0.323975f, 0.688965f, 0.315186f, 0.696289f, 0.306152f, + 0.703613f, 0.297607f, 0.709961f, 0.289062f, 0.715332f, 0.281006f, 0.720703f, 0.273193f, + 0.728027f, 0.264648f, 0.732910f, 0.256836f, 0.738770f, 0.249390f, 0.745117f, 0.241089f, + 0.749512f, 0.233643f, 0.754883f, 0.225220f, 0.760254f, 0.216675f, 0.764648f, 0.208252f, + 0.769531f, 0.200195f, 0.773926f, 0.191895f, 0.778320f, 0.182373f, 0.781738f, 0.173096f, + 0.785156f, 0.163330f, 0.788574f, 0.153442f, 0.791016f, 0.141113f, 0.793945f, 0.129028f, + 0.794922f, 0.114624f, 0.793457f, 0.096802f, 0.789062f, 0.071899f, 0.771973f, 0.028336f, + 0.000000f, 1.000000f, 0.068176f, 0.968750f, 0.123291f, 0.931641f, 0.171997f, 0.893066f, + 0.212891f, 0.857422f, 0.247803f, 0.824707f, 0.279541f, 0.793945f, 0.309570f, 0.764648f, + 0.335938f, 0.737305f, 0.360107f, 0.711914f, 0.382568f, 0.687500f, 0.402588f, 0.665527f, + 0.422852f, 0.643555f, 0.439453f, 0.623535f, 0.457275f, 0.604004f, 0.473633f, 0.584961f, + 0.488770f, 0.567871f, 0.503418f, 0.550781f, 0.516602f, 0.534668f, 0.528809f, 0.519043f, + 0.542480f, 0.503418f, 0.554199f, 0.489502f, 0.564941f, 0.476074f, 0.575684f, 0.462402f, + 0.587402f, 0.448975f, 0.597656f, 0.436523f, 0.607422f, 0.424316f, 0.618164f, 0.412109f, + 0.626953f, 0.400635f, 0.635254f, 0.389893f, 0.644531f, 0.378906f, 0.652832f, 0.368164f, + 0.660645f, 0.357910f, 0.669434f, 0.347412f, 0.676758f, 0.338135f, 0.684082f, 0.328613f, + 0.692871f, 0.318359f, 0.698242f, 0.309570f, 0.706543f, 0.299805f, 0.713867f, 0.291016f, + 0.719238f, 0.282715f, 0.726074f, 0.273926f, 0.733398f, 0.265381f, 0.738281f, 0.257812f, + 0.745117f, 0.249390f, 0.751465f, 0.241211f, 0.756836f, 0.233521f, 0.762695f, 0.225708f, + 0.768555f, 0.217651f, 0.772949f, 0.210693f, 0.779297f, 0.201782f, 0.783203f, 0.193604f, + 0.788086f, 0.185181f, 0.792969f, 0.177246f, 0.796875f, 0.168335f, 0.801758f, 0.159302f, + 0.805176f, 0.150635f, 0.808105f, 0.140015f, 0.811035f, 0.129517f, 0.814453f, 0.117981f, + 0.815918f, 0.103760f, 0.814941f, 0.087219f, 0.812500f, 0.064514f, 0.797852f, 0.024719f, + 0.000000f, 1.000000f, 0.067627f, 0.969727f, 0.123962f, 0.930664f, 0.171997f, 0.893066f, + 0.213989f, 0.856934f, 0.251221f, 0.822754f, 0.284668f, 0.791016f, 0.313721f, 0.761230f, + 0.342041f, 0.732910f, 0.365479f, 0.707520f, 0.388672f, 0.682617f, 0.410889f, 0.659180f, + 0.431885f, 0.636719f, 0.448730f, 0.616211f, 0.466553f, 0.596680f, 0.482422f, 0.577637f, + 0.496826f, 0.560059f, 0.512695f, 0.541992f, 0.527344f, 0.524902f, 0.541504f, 0.508789f, + 0.553711f, 0.493896f, 0.566895f, 0.479004f, 0.577637f, 0.465088f, 0.589355f, 0.450684f, + 0.600098f, 0.437988f, 0.611328f, 0.424316f, 0.622559f, 0.411621f, 0.631836f, 0.400146f, + 0.641113f, 0.387939f, 0.650879f, 0.376465f, 0.658691f, 0.365723f, 0.668945f, 0.354248f, + 0.676758f, 0.343994f, 0.685547f, 0.333496f, 0.692871f, 0.323486f, 0.700195f, 0.314209f, + 0.708984f, 0.304199f, 0.715820f, 0.295166f, 0.723145f, 0.285156f, 0.730469f, 0.276123f, + 0.736816f, 0.267822f, 0.743164f, 0.258789f, 0.750488f, 0.250244f, 0.757812f, 0.242310f, + 0.761719f, 0.234375f, 0.769043f, 0.225952f, 0.774414f, 0.218506f, 0.779785f, 0.210938f, + 0.785156f, 0.203003f, 0.791504f, 0.195312f, 0.797363f, 0.187988f, 0.801270f, 0.179565f, + 0.806152f, 0.171509f, 0.811523f, 0.162964f, 0.815918f, 0.155151f, 0.818359f, 0.146973f, + 0.823242f, 0.137207f, 0.828613f, 0.128174f, 0.830078f, 0.117920f, 0.832520f, 0.106873f, + 0.834961f, 0.093811f, 0.835938f, 0.078918f, 0.833984f, 0.058533f, 0.821777f, 0.022888f, + 0.000000f, 1.000000f, 0.067932f, 0.969238f, 0.125488f, 0.929688f, 0.175171f, 0.891113f, + 0.217529f, 0.854492f, 0.254150f, 0.820801f, 0.287109f, 0.788574f, 0.319092f, 0.757812f, + 0.348633f, 0.728516f, 0.372803f, 0.702148f, 0.396729f, 0.676758f, 0.418457f, 0.653320f, + 0.438721f, 0.630371f, 0.458252f, 0.608887f, 0.476562f, 0.588379f, 0.493652f, 0.568848f, + 0.509766f, 0.550293f, 0.524902f, 0.532227f, 0.539551f, 0.515137f, 0.552734f, 0.499023f, + 0.567383f, 0.483154f, 0.579102f, 0.468018f, 0.591797f, 0.453125f, 0.603516f, 0.439453f, + 0.614258f, 0.425537f, 0.625488f, 0.412354f, 0.636230f, 0.399658f, 0.645996f, 0.387451f, + 0.654297f, 0.375977f, 0.665527f, 0.363281f, 0.675293f, 0.352051f, 0.682617f, 0.341553f, + 0.691895f, 0.330566f, 0.701660f, 0.319580f, 0.708496f, 0.309570f, 0.716309f, 0.299805f, + 0.722656f, 0.290527f, 0.731445f, 0.281006f, 0.739258f, 0.271484f, 0.746582f, 0.261719f, + 0.753906f, 0.253174f, 0.759277f, 0.244507f, 0.767090f, 0.235840f, 0.771973f, 0.228027f, + 0.779297f, 0.219482f, 0.784668f, 0.211670f, 0.791504f, 0.203735f, 0.797363f, 0.196411f, + 0.802734f, 0.188354f, 0.808594f, 0.181152f, 0.813477f, 0.173950f, 0.818848f, 0.166138f, + 0.823242f, 0.158447f, 0.828125f, 0.149902f, 0.833496f, 0.141846f, 0.836914f, 0.134766f, + 0.840820f, 0.125366f, 0.844238f, 0.116882f, 0.847656f, 0.107178f, 0.852051f, 0.096863f, + 0.853516f, 0.084900f, 0.854980f, 0.071045f, 0.854004f, 0.052765f, 0.845215f, 0.020370f, + 0.000000f, 1.000000f, 0.068054f, 0.969238f, 0.126465f, 0.929688f, 0.176270f, 0.890625f, + 0.219116f, 0.853516f, 0.257568f, 0.818359f, 0.294189f, 0.784668f, 0.324219f, 0.754395f, + 0.353027f, 0.725098f, 0.378906f, 0.697754f, 0.403564f, 0.671875f, 0.426514f, 0.646973f, + 0.448242f, 0.623535f, 0.466309f, 0.602051f, 0.486572f, 0.581055f, 0.503906f, 0.560547f, + 0.519043f, 0.541992f, 0.535645f, 0.523438f, 0.550781f, 0.505859f, 0.564941f, 0.489258f, + 0.579102f, 0.472900f, 0.592285f, 0.457275f, 0.604980f, 0.442139f, 0.615234f, 0.428467f, + 0.627441f, 0.414062f, 0.638672f, 0.400635f, 0.649414f, 0.387451f, 0.660645f, 0.374512f, + 0.669922f, 0.362793f, 0.680176f, 0.350586f, 0.689941f, 0.338867f, 0.699219f, 0.327881f, + 0.705078f, 0.317627f, 0.715820f, 0.306152f, 0.725098f, 0.295410f, 0.730957f, 0.286377f, + 0.739746f, 0.276123f, 0.746582f, 0.267090f, 0.754883f, 0.257568f, 0.762207f, 0.248291f, + 0.768066f, 0.239502f, 0.777344f, 0.230103f, 0.781250f, 0.222412f, 0.788574f, 0.213745f, + 0.796387f, 0.205322f, 0.800293f, 0.198120f, 0.806641f, 0.190186f, 0.813965f, 0.182251f, + 0.817871f, 0.175049f, 0.823730f, 0.167725f, 0.829590f, 0.160278f, 0.835449f, 0.152832f, + 0.838867f, 0.146484f, 0.844727f, 0.137695f, 0.849121f, 0.129883f, 0.852539f, 0.123169f, + 0.857910f, 0.114807f, 0.861328f, 0.106140f, 0.865234f, 0.096985f, 0.868652f, 0.087036f, + 0.870605f, 0.076904f, 0.871582f, 0.063538f, 0.872070f, 0.046936f, 0.864746f, 0.018570f, + 0.000000f, 1.000000f, 0.068054f, 0.969238f, 0.127197f, 0.929199f, 0.177124f, 0.890137f, + 0.222656f, 0.851562f, 0.262207f, 0.815918f, 0.297119f, 0.782227f, 0.328857f, 0.750977f, + 0.358398f, 0.721191f, 0.386230f, 0.692383f, 0.411377f, 0.666016f, 0.434326f, 0.641113f, + 0.455566f, 0.617676f, 0.476074f, 0.594727f, 0.496094f, 0.572754f, 0.513184f, 0.552734f, + 0.530762f, 0.533203f, 0.547363f, 0.514160f, 0.562988f, 0.496094f, 0.576660f, 0.479248f, + 0.590820f, 0.462402f, 0.604004f, 0.446533f, 0.616211f, 0.431641f, 0.629883f, 0.416504f, + 0.641602f, 0.402344f, 0.652344f, 0.388672f, 0.664062f, 0.375488f, 0.674805f, 0.362305f, + 0.683594f, 0.350098f, 0.693359f, 0.338379f, 0.704102f, 0.326172f, 0.713379f, 0.314697f, + 0.721680f, 0.303711f, 0.729980f, 0.293945f, 0.738770f, 0.282715f, 0.746582f, 0.272705f, + 0.755371f, 0.262695f, 0.761230f, 0.253662f, 0.770020f, 0.244141f, 0.776367f, 0.235596f, + 0.783203f, 0.226196f, 0.791504f, 0.217041f, 0.797852f, 0.208618f, 0.803223f, 0.200684f, + 0.811523f, 0.191772f, 0.816406f, 0.184570f, 0.821777f, 0.176880f, 0.828613f, 0.168945f, + 0.833496f, 0.161865f, 0.839355f, 0.154785f, 0.844727f, 0.147339f, 0.850586f, 0.140381f, + 0.854492f, 0.133911f, 0.860840f, 0.126465f, 0.864258f, 0.118774f, 0.868164f, 0.111755f, + 0.872559f, 0.103699f, 0.876465f, 0.096558f, 0.881348f, 0.087158f, 0.883789f, 0.079224f, + 0.886719f, 0.068542f, 0.888184f, 0.057404f, 0.889648f, 0.041260f, 0.882812f, 0.016769f, + 0.000000f, 1.000000f, 0.068054f, 0.969238f, 0.128052f, 0.928711f, 0.180054f, 0.888184f, + 0.224487f, 0.850586f, 0.264648f, 0.813965f, 0.301758f, 0.779297f, 0.334473f, 0.747070f, + 0.364746f, 0.716797f, 0.391357f, 0.688477f, 0.416992f, 0.661133f, 0.441650f, 0.635254f, + 0.466064f, 0.609863f, 0.485596f, 0.587891f, 0.505371f, 0.565430f, 0.523438f, 0.544434f, + 0.541992f, 0.523926f, 0.557617f, 0.504883f, 0.572754f, 0.486816f, 0.587402f, 0.469482f, + 0.602539f, 0.452393f, 0.614746f, 0.437012f, 0.628906f, 0.420654f, 0.641113f, 0.405762f, + 0.653809f, 0.391113f, 0.665527f, 0.376953f, 0.678223f, 0.363037f, 0.687500f, 0.350586f, + 0.699219f, 0.337402f, 0.708008f, 0.325684f, 0.717285f, 0.313965f, 0.727051f, 0.302490f, + 0.736816f, 0.290771f, 0.743652f, 0.280762f, 0.753906f, 0.270020f, 0.761230f, 0.259766f, + 0.770020f, 0.249878f, 0.776855f, 0.240112f, 0.784668f, 0.230957f, 0.791504f, 0.221924f, + 0.796875f, 0.213867f, 0.806641f, 0.204102f, 0.812988f, 0.195679f, 0.817383f, 0.187988f, + 0.825684f, 0.179199f, 0.831543f, 0.171509f, 0.837402f, 0.164307f, 0.843262f, 0.156250f, + 0.848145f, 0.149536f, 0.853516f, 0.142578f, 0.859863f, 0.135010f, 0.864258f, 0.128784f, + 0.869629f, 0.121704f, 0.875000f, 0.114990f, 0.878906f, 0.109009f, 0.883301f, 0.101196f, + 0.887207f, 0.093689f, 0.892090f, 0.086487f, 0.895508f, 0.079102f, 0.898438f, 0.070251f, + 0.901855f, 0.061432f, 0.905273f, 0.050354f, 0.905762f, 0.036346f, 0.900391f, 0.013496f, + 0.000000f, 1.000000f, 0.068542f, 0.969238f, 0.129272f, 0.928223f, 0.179810f, 0.888672f, + 0.228149f, 0.848145f, 0.269531f, 0.811035f, 0.306152f, 0.776367f, 0.338623f, 0.743652f, + 0.370850f, 0.712402f, 0.399902f, 0.682617f, 0.426514f, 0.654785f, 0.450684f, 0.628418f, + 0.472168f, 0.604004f, 0.494873f, 0.580078f, 0.515625f, 0.557129f, 0.533691f, 0.535645f, + 0.550781f, 0.515625f, 0.568359f, 0.495850f, 0.584473f, 0.477295f, 0.600098f, 0.459473f, + 0.614746f, 0.441895f, 0.628906f, 0.425293f, 0.642578f, 0.409424f, 0.655762f, 0.394043f, + 0.667969f, 0.379395f, 0.679199f, 0.365234f, 0.690430f, 0.352051f, 0.700684f, 0.338379f, + 0.711914f, 0.325684f, 0.721191f, 0.313477f, 0.731445f, 0.301270f, 0.740234f, 0.290283f, + 0.750488f, 0.278809f, 0.759277f, 0.267822f, 0.767090f, 0.257324f, 0.775391f, 0.247681f, + 0.783691f, 0.237305f, 0.791016f, 0.227539f, 0.799316f, 0.218262f, 0.806641f, 0.209106f, + 0.811523f, 0.200928f, 0.818359f, 0.192505f, 0.826172f, 0.183716f, 0.833496f, 0.175293f, + 0.839355f, 0.166870f, 0.845215f, 0.159424f, 0.852051f, 0.151733f, 0.857910f, 0.144165f, + 0.860840f, 0.137939f, 0.867676f, 0.130371f, 0.873047f, 0.123840f, 0.877930f, 0.117249f, + 0.883301f, 0.110352f, 0.887207f, 0.104614f, 0.893555f, 0.097595f, 0.897461f, 0.091553f, + 0.900879f, 0.084900f, 0.904785f, 0.077393f, 0.910645f, 0.069885f, 0.912109f, 0.063721f, + 0.915527f, 0.054260f, 0.918945f, 0.044922f, 0.918945f, 0.032166f, 0.916504f, 0.011772f, + 0.000000f, 1.000000f, 0.069641f, 0.968262f, 0.129395f, 0.928223f, 0.182739f, 0.886719f, + 0.228882f, 0.847656f, 0.272217f, 0.809082f, 0.310547f, 0.773438f, 0.343994f, 0.740234f, + 0.377930f, 0.707031f, 0.405518f, 0.678223f, 0.433105f, 0.649414f, 0.458252f, 0.622559f, + 0.483154f, 0.596680f, 0.504395f, 0.572266f, 0.524414f, 0.549805f, 0.543945f, 0.527344f, + 0.562988f, 0.506348f, 0.580078f, 0.486572f, 0.596680f, 0.467285f, 0.611816f, 0.448975f, + 0.627441f, 0.431396f, 0.641113f, 0.414795f, 0.655762f, 0.398438f, 0.667969f, 0.383301f, + 0.680664f, 0.367920f, 0.693359f, 0.353760f, 0.702637f, 0.340576f, 0.714355f, 0.326904f, + 0.724121f, 0.314209f, 0.735352f, 0.301270f, 0.745605f, 0.289307f, 0.754395f, 0.277832f, + 0.763184f, 0.266602f, 0.770996f, 0.255859f, 0.782227f, 0.244873f, 0.789551f, 0.234863f, + 0.796387f, 0.225464f, 0.805176f, 0.215454f, 0.813477f, 0.206055f, 0.819336f, 0.197021f, + 0.825684f, 0.188354f, 0.833496f, 0.179932f, 0.838867f, 0.172241f, 0.846680f, 0.163696f, + 0.853027f, 0.155518f, 0.857422f, 0.148438f, 0.865723f, 0.139893f, 0.869629f, 0.133545f, + 0.875488f, 0.125977f, 0.881348f, 0.119385f, 0.885742f, 0.113098f, 0.892578f, 0.105774f, + 0.895020f, 0.100403f, 0.900879f, 0.093567f, 0.904785f, 0.088013f, 0.909668f, 0.081787f, + 0.913574f, 0.076172f, 0.917969f, 0.069458f, 0.921875f, 0.062408f, 0.924805f, 0.055573f, + 0.929199f, 0.048553f, 0.931152f, 0.038879f, 0.933105f, 0.028000f, 0.931152f, 0.010727f, + 0.000000f, 1.000000f, 0.070129f, 0.968262f, 0.131348f, 0.926758f, 0.184448f, 0.886230f, + 0.232788f, 0.845215f, 0.277100f, 0.806641f, 0.314941f, 0.770020f, 0.351562f, 0.735840f, + 0.382568f, 0.703613f, 0.413818f, 0.672852f, 0.441650f, 0.643555f, 0.466553f, 0.616211f, + 0.490723f, 0.589844f, 0.514648f, 0.564941f, 0.534668f, 0.541016f, 0.553711f, 0.519531f, + 0.572754f, 0.498291f, 0.591797f, 0.477539f, 0.607422f, 0.458008f, 0.624023f, 0.439453f, + 0.639648f, 0.421387f, 0.653320f, 0.404785f, 0.666992f, 0.388184f, 0.681152f, 0.372070f, + 0.693359f, 0.356934f, 0.705566f, 0.342529f, 0.716309f, 0.328857f, 0.728027f, 0.315186f, + 0.735840f, 0.302979f, 0.747559f, 0.289795f, 0.758301f, 0.277588f, 0.768555f, 0.265869f, + 0.776367f, 0.254639f, 0.785156f, 0.243896f, 0.794434f, 0.233398f, 0.801758f, 0.223267f, + 0.810059f, 0.213135f, 0.816895f, 0.203735f, 0.824707f, 0.194946f, 0.832031f, 0.185547f, + 0.839844f, 0.176758f, 0.846191f, 0.168213f, 0.852051f, 0.160522f, 0.858887f, 0.152344f, + 0.863281f, 0.145508f, 0.871582f, 0.136841f, 0.876953f, 0.129761f, 0.883301f, 0.122131f, + 0.888184f, 0.115479f, 0.893555f, 0.108765f, 0.897949f, 0.102417f, 0.903809f, 0.095947f, + 0.907715f, 0.089905f, 0.912109f, 0.084167f, 0.917480f, 0.078003f, 0.921875f, 0.072632f, + 0.925781f, 0.066895f, 0.930664f, 0.061249f, 0.934570f, 0.055664f, 0.937500f, 0.048309f, + 0.940430f, 0.041870f, 0.943359f, 0.034607f, 0.945312f, 0.024429f, 0.944824f, 0.008392f, + 0.000000f, 1.000000f, 0.068909f, 0.969238f, 0.131470f, 0.927246f, 0.186523f, 0.884766f, + 0.235718f, 0.843262f, 0.278564f, 0.804688f, 0.318604f, 0.767578f, 0.355469f, 0.732422f, + 0.389648f, 0.698730f, 0.419922f, 0.667480f, 0.448975f, 0.637695f, 0.474854f, 0.609375f, + 0.500488f, 0.583008f, 0.521484f, 0.558105f, 0.545410f, 0.533691f, 0.565430f, 0.510742f, + 0.583984f, 0.489014f, 0.601562f, 0.468506f, 0.618652f, 0.448730f, 0.634766f, 0.429932f, + 0.650391f, 0.411377f, 0.665527f, 0.393799f, 0.679688f, 0.377197f, 0.693848f, 0.361328f, + 0.706055f, 0.346191f, 0.716797f, 0.332031f, 0.729004f, 0.317383f, 0.739746f, 0.304199f, + 0.750000f, 0.291260f, 0.761230f, 0.278076f, 0.771484f, 0.266113f, 0.779785f, 0.254639f, + 0.789062f, 0.243408f, 0.797852f, 0.232300f, 0.807129f, 0.221680f, 0.812988f, 0.212402f, + 0.823242f, 0.201660f, 0.829590f, 0.192871f, 0.837891f, 0.182861f, 0.845703f, 0.174561f, + 0.851074f, 0.166138f, 0.859375f, 0.157104f, 0.864258f, 0.149170f, 0.871094f, 0.141357f, + 0.875977f, 0.134155f, 0.882324f, 0.126831f, 0.888672f, 0.119995f, 0.895020f, 0.112488f, + 0.900391f, 0.105408f, 0.905762f, 0.098694f, 0.910156f, 0.092529f, 0.914551f, 0.086304f, + 0.919922f, 0.080200f, 0.924316f, 0.074646f, 0.928223f, 0.069153f, 0.932617f, 0.063721f, + 0.937500f, 0.058228f, 0.940918f, 0.052948f, 0.945312f, 0.047882f, 0.949219f, 0.042603f, + 0.951660f, 0.035553f, 0.955078f, 0.028717f, 0.957031f, 0.020462f, 0.957031f, 0.007118f, + 0.000000f, 1.000000f, 0.070129f, 0.968262f, 0.133423f, 0.925781f, 0.188354f, 0.883789f, + 0.238892f, 0.841797f, 0.282959f, 0.802246f, 0.323730f, 0.764160f, 0.362305f, 0.728027f, + 0.395264f, 0.694336f, 0.426514f, 0.662598f, 0.455811f, 0.632324f, 0.483398f, 0.603027f, + 0.507812f, 0.576172f, 0.533203f, 0.549805f, 0.553223f, 0.525879f, 0.574707f, 0.502930f, + 0.594727f, 0.480225f, 0.613281f, 0.458984f, 0.629883f, 0.438965f, 0.646484f, 0.419922f, + 0.662109f, 0.401611f, 0.678223f, 0.383545f, 0.692383f, 0.366699f, 0.704102f, 0.351074f, + 0.718262f, 0.335693f, 0.728516f, 0.321045f, 0.741699f, 0.306396f, 0.752441f, 0.292725f, + 0.764160f, 0.279541f, 0.772461f, 0.267578f, 0.782715f, 0.254883f, 0.792969f, 0.243408f, + 0.801270f, 0.232300f, 0.811035f, 0.221069f, 0.818359f, 0.211060f, 0.827637f, 0.200684f, + 0.834961f, 0.190918f, 0.842285f, 0.181763f, 0.850098f, 0.172485f, 0.857422f, 0.163452f, + 0.864746f, 0.154907f, 0.869141f, 0.147217f, 0.876953f, 0.139038f, 0.882812f, 0.131348f, + 0.889160f, 0.123474f, 0.895020f, 0.116455f, 0.899414f, 0.109741f, 0.905273f, 0.103210f, + 0.909668f, 0.097107f, 0.916016f, 0.089844f, 0.921387f, 0.083374f, 0.926758f, 0.077271f, + 0.930176f, 0.071411f, 0.935547f, 0.065491f, 0.938965f, 0.060455f, 0.944336f, 0.054901f, + 0.947754f, 0.049988f, 0.951660f, 0.044952f, 0.955078f, 0.040405f, 0.959473f, 0.035278f, + 0.962402f, 0.030823f, 0.965820f, 0.024307f, 0.968262f, 0.016586f, 0.969238f, 0.006050f, + 0.000000f, 1.000000f, 0.070435f, 0.968262f, 0.133301f, 0.926270f, 0.189941f, 0.882812f, + 0.241577f, 0.840332f, 0.286133f, 0.799805f, 0.327881f, 0.761230f, 0.366699f, 0.724609f, + 0.401855f, 0.689941f, 0.433838f, 0.657227f, 0.464355f, 0.625977f, 0.491211f, 0.597168f, + 0.518066f, 0.568848f, 0.541016f, 0.542969f, 0.564453f, 0.517578f, 0.585938f, 0.493896f, + 0.604492f, 0.471680f, 0.624023f, 0.449951f, 0.641113f, 0.429688f, 0.657715f, 0.410156f, + 0.674316f, 0.391357f, 0.688965f, 0.373779f, 0.703613f, 0.356689f, 0.716797f, 0.340576f, + 0.729980f, 0.324707f, 0.740723f, 0.310303f, 0.753906f, 0.295654f, 0.764160f, 0.282227f, + 0.774902f, 0.268799f, 0.786133f, 0.256104f, 0.794922f, 0.244141f, 0.803711f, 0.232910f, + 0.813477f, 0.221191f, 0.822266f, 0.210571f, 0.830566f, 0.200195f, 0.839355f, 0.189697f, + 0.846191f, 0.180420f, 0.854492f, 0.171021f, 0.862305f, 0.161743f, 0.868164f, 0.153564f, + 0.874023f, 0.145386f, 0.882812f, 0.136475f, 0.889160f, 0.128784f, 0.894043f, 0.121399f, + 0.898926f, 0.114563f, 0.905273f, 0.107117f, 0.910645f, 0.100281f, 0.916504f, 0.093262f, + 0.921387f, 0.087036f, 0.926758f, 0.080872f, 0.930176f, 0.075684f, 0.935547f, 0.069397f, + 0.940430f, 0.063232f, 0.945801f, 0.057404f, 0.949707f, 0.052155f, 0.953613f, 0.047241f, + 0.957031f, 0.042328f, 0.961426f, 0.037659f, 0.965332f, 0.032745f, 0.968750f, 0.028534f, + 0.972168f, 0.023834f, 0.976074f, 0.019577f, 0.978516f, 0.013664f, 0.980469f, 0.005028f, + 0.000000f, 1.000000f, 0.070129f, 0.968262f, 0.134644f, 0.925293f, 0.192261f, 0.881348f, + 0.243896f, 0.838379f, 0.290283f, 0.797363f, 0.333740f, 0.757812f, 0.372070f, 0.720703f, + 0.408936f, 0.685059f, 0.441406f, 0.651855f, 0.472412f, 0.620117f, 0.499756f, 0.590332f, + 0.525879f, 0.562012f, 0.550781f, 0.535156f, 0.573730f, 0.509766f, 0.594727f, 0.485840f, + 0.616211f, 0.462646f, 0.633789f, 0.441162f, 0.651855f, 0.420410f, 0.668945f, 0.400635f, + 0.684570f, 0.381836f, 0.700195f, 0.363770f, 0.714844f, 0.346436f, 0.728516f, 0.330078f, + 0.740234f, 0.314697f, 0.753906f, 0.299316f, 0.765625f, 0.285156f, 0.776367f, 0.271484f, + 0.787598f, 0.258057f, 0.796387f, 0.245850f, 0.806641f, 0.233643f, 0.816406f, 0.222046f, + 0.825684f, 0.210693f, 0.833984f, 0.199829f, 0.841797f, 0.190063f, 0.850098f, 0.179565f, + 0.858398f, 0.170288f, 0.865723f, 0.160889f, 0.873535f, 0.151611f, 0.878906f, 0.143677f, + 0.886719f, 0.135132f, 0.892090f, 0.127319f, 0.898926f, 0.119263f, 0.903809f, 0.112488f, + 0.911621f, 0.104736f, 0.916504f, 0.097778f, 0.922363f, 0.090942f, 0.925781f, 0.085022f, + 0.931641f, 0.078979f, 0.936523f, 0.072266f, 0.940918f, 0.066589f, 0.945801f, 0.060669f, + 0.949219f, 0.055847f, 0.953613f, 0.050964f, 0.958496f, 0.045593f, 0.962891f, 0.040070f, + 0.967285f, 0.034668f, 0.970703f, 0.030228f, 0.974609f, 0.025726f, 0.978516f, 0.021210f, + 0.981445f, 0.017456f, 0.985352f, 0.012962f, 0.988281f, 0.009377f, 0.991211f, 0.003784f, + 0.000000f, 1.000000f, 0.071289f, 0.967773f, 0.134644f, 0.925293f, 0.193848f, 0.880371f, + 0.246460f, 0.836914f, 0.293945f, 0.794922f, 0.338379f, 0.754883f, 0.377686f, 0.716797f, + 0.413574f, 0.681152f, 0.447998f, 0.646973f, 0.478027f, 0.614746f, 0.507324f, 0.583984f, + 0.536133f, 0.554688f, 0.558594f, 0.528320f, 0.583984f, 0.501465f, 0.604492f, 0.477783f, + 0.625977f, 0.454346f, 0.645020f, 0.432129f, 0.663086f, 0.411133f, 0.680176f, 0.391113f, + 0.695801f, 0.372314f, 0.710938f, 0.354248f, 0.724609f, 0.337402f, 0.738281f, 0.320312f, + 0.752930f, 0.303955f, 0.766602f, 0.288818f, 0.775879f, 0.275635f, 0.786621f, 0.261475f, + 0.799805f, 0.247559f, 0.807129f, 0.236450f, 0.817871f, 0.223389f, 0.829102f, 0.211426f, + 0.835449f, 0.201050f, 0.846191f, 0.189575f, 0.852051f, 0.180176f, 0.861816f, 0.169678f, + 0.868164f, 0.160645f, 0.876465f, 0.151367f, 0.882812f, 0.142578f, 0.889160f, 0.134155f, + 0.896484f, 0.125977f, 0.904785f, 0.117371f, 0.907715f, 0.111206f, 0.914551f, 0.103333f, + 0.920898f, 0.095520f, 0.924805f, 0.090332f, 0.931641f, 0.082886f, 0.936523f, 0.075745f, + 0.937988f, 0.072388f, 0.946289f, 0.064758f, 0.952637f, 0.057343f, 0.952637f, 0.054260f, + 0.958496f, 0.049530f, 0.968262f, 0.040955f, 0.968262f, 0.036835f, 0.968262f, 0.034943f, + 0.974609f, 0.030457f, 0.983887f, 0.021042f, 0.983887f, 0.018127f, 0.983887f, 0.016891f, + 0.983887f, 0.016220f, 0.999512f, 0.003506f, 0.999512f, 0.000325f, 0.999512f, 0.000003f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997070f, 0.000000f, 0.996094f, + 0.000000f, 0.995605f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, 0.000000f, 0.992188f, + 0.000000f, 0.989746f, 0.000000f, 0.988770f, 0.000000f, 0.987305f, 0.000000f, 0.985352f, + 0.000000f, 0.983887f, 0.000000f, 0.981445f, 0.000000f, 0.979492f, 0.000000f, 0.976562f, + 0.000000f, 0.975098f, 0.000000f, 0.971680f, 0.000000f, 0.969727f, 0.000000f, 0.965820f, + 0.000000f, 0.963379f, 0.000000f, 0.959473f, 0.000000f, 0.957031f, 0.000000f, 0.952637f, + 0.000000f, 0.949219f, 0.000000f, 0.945312f, 0.000000f, 0.939941f, 0.000000f, 0.936035f, + 0.000000f, 0.931152f, 0.000000f, 0.925781f, 0.000000f, 0.920410f, 0.000000f, 0.915527f, + 0.000000f, 0.908691f, 0.000000f, 0.901855f, 0.000000f, 0.895020f, 0.000000f, 0.887695f, + 0.000000f, 0.879883f, 0.000000f, 0.871582f, 0.000000f, 0.862305f, 0.000000f, 0.852539f, + 0.000000f, 0.842285f, 0.000000f, 0.831543f, 0.000000f, 0.819824f, 0.000000f, 0.806152f, + 0.000000f, 0.792480f, 0.000000f, 0.776855f, 0.000000f, 0.761230f, 0.000000f, 0.742676f, + 0.000000f, 0.723145f, 0.000000f, 0.701172f, 0.000000f, 0.676758f, 0.000000f, 0.650391f, + 0.000000f, 0.620117f, 0.000000f, 0.585449f, 0.000000f, 0.544922f, 0.000000f, 0.498535f, + 0.000000f, 0.441650f, 0.000000f, 0.368652f, 0.000000f, 0.267822f, 0.000000f, 0.102722f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996094f, + 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.992676f, 0.000000f, 0.991211f, + 0.000000f, 0.990723f, 0.000000f, 0.988281f, 0.000000f, 0.986816f, 0.000000f, 0.985352f, + 0.000000f, 0.983398f, 0.000000f, 0.981445f, 0.000000f, 0.979004f, 0.000000f, 0.977051f, + 0.000000f, 0.974121f, 0.000000f, 0.972168f, 0.000000f, 0.969238f, 0.000000f, 0.966797f, + 0.000000f, 0.962891f, 0.000000f, 0.959961f, 0.000000f, 0.956543f, 0.000000f, 0.952637f, + 0.000000f, 0.949219f, 0.000000f, 0.944824f, 0.000000f, 0.940430f, 0.000000f, 0.935547f, + 0.000000f, 0.931152f, 0.000000f, 0.925781f, 0.000000f, 0.919922f, 0.000000f, 0.915039f, + 0.000000f, 0.908691f, 0.000000f, 0.901855f, 0.000000f, 0.894531f, 0.000000f, 0.887207f, + 0.000000f, 0.879395f, 0.000000f, 0.871094f, 0.000000f, 0.861816f, 0.000000f, 0.852051f, + 0.000000f, 0.841797f, 0.000000f, 0.831055f, 0.000000f, 0.819336f, 0.000000f, 0.806152f, + 0.000000f, 0.792480f, 0.000000f, 0.776855f, 0.000000f, 0.760742f, 0.000000f, 0.742676f, + 0.000000f, 0.723145f, 0.000000f, 0.701172f, 0.000000f, 0.676758f, 0.000002f, 0.649902f, + 0.000005f, 0.620117f, 0.000005f, 0.584961f, 0.000005f, 0.544922f, 0.000004f, 0.498535f, + 0.000003f, 0.441406f, 0.000003f, 0.367920f, 0.000002f, 0.267578f, 0.000001f, 0.103210f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996094f, + 0.000000f, 0.995117f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, 0.000000f, 0.991211f, + 0.000000f, 0.989746f, 0.000000f, 0.988770f, 0.000000f, 0.986816f, 0.000000f, 0.984863f, + 0.000000f, 0.983398f, 0.000000f, 0.980957f, 0.000000f, 0.979004f, 0.000000f, 0.976074f, + 0.000000f, 0.973633f, 0.000000f, 0.971680f, 0.000000f, 0.968750f, 0.000000f, 0.965820f, + 0.000000f, 0.962891f, 0.000000f, 0.959473f, 0.000000f, 0.955566f, 0.000000f, 0.952148f, + 0.000000f, 0.948242f, 0.000000f, 0.944336f, 0.000000f, 0.940430f, 0.000000f, 0.935059f, + 0.000000f, 0.930176f, 0.000000f, 0.925293f, 0.000000f, 0.919922f, 0.000001f, 0.914062f, + 0.000005f, 0.907715f, 0.000012f, 0.901367f, 0.000019f, 0.894043f, 0.000027f, 0.886719f, + 0.000035f, 0.878906f, 0.000045f, 0.870605f, 0.000054f, 0.861328f, 0.000062f, 0.851562f, + 0.000064f, 0.841309f, 0.000064f, 0.830078f, 0.000064f, 0.818848f, 0.000061f, 0.806152f, + 0.000058f, 0.791504f, 0.000055f, 0.776855f, 0.000050f, 0.759766f, 0.000046f, 0.742188f, + 0.000042f, 0.722656f, 0.000042f, 0.700684f, 0.000046f, 0.676270f, 0.000042f, 0.649414f, + 0.000038f, 0.620117f, 0.000037f, 0.584473f, 0.000032f, 0.544434f, 0.000030f, 0.498047f, + 0.000026f, 0.441162f, 0.000022f, 0.368164f, 0.000019f, 0.267334f, 0.000010f, 0.102539f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.994629f, 0.000000f, 0.993652f, 0.000000f, 0.992188f, 0.000000f, 0.991211f, + 0.000000f, 0.989258f, 0.000000f, 0.987793f, 0.000000f, 0.986328f, 0.000000f, 0.984375f, + 0.000003f, 0.982422f, 0.000012f, 0.980469f, 0.000022f, 0.978516f, 0.000036f, 0.975586f, + 0.000050f, 0.973633f, 0.000063f, 0.970703f, 0.000080f, 0.968262f, 0.000094f, 0.964844f, + 0.000107f, 0.961914f, 0.000124f, 0.958496f, 0.000139f, 0.955078f, 0.000153f, 0.951660f, + 0.000166f, 0.947754f, 0.000183f, 0.943359f, 0.000197f, 0.938965f, 0.000211f, 0.934082f, + 0.000222f, 0.929199f, 0.000230f, 0.924316f, 0.000232f, 0.918945f, 0.000230f, 0.912598f, + 0.000224f, 0.906738f, 0.000216f, 0.899902f, 0.000210f, 0.893066f, 0.000202f, 0.885254f, + 0.000191f, 0.877441f, 0.000182f, 0.869141f, 0.000180f, 0.860352f, 0.000180f, 0.850098f, + 0.000182f, 0.839844f, 0.000184f, 0.829102f, 0.000187f, 0.817871f, 0.000189f, 0.804688f, + 0.000175f, 0.790527f, 0.000168f, 0.775391f, 0.000165f, 0.758789f, 0.000168f, 0.740723f, + 0.000168f, 0.721680f, 0.000150f, 0.699707f, 0.000149f, 0.675293f, 0.000142f, 0.648926f, + 0.000145f, 0.618652f, 0.000124f, 0.583984f, 0.000121f, 0.543945f, 0.000115f, 0.497803f, + 0.000098f, 0.440186f, 0.000092f, 0.367920f, 0.000071f, 0.267090f, 0.000031f, 0.102356f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000001f, 0.998047f, 0.000025f, 0.997559f, 0.000063f, 0.996094f, 0.000091f, 0.995117f, + 0.000127f, 0.994141f, 0.000159f, 0.992676f, 0.000184f, 0.991699f, 0.000213f, 0.990234f, + 0.000244f, 0.988770f, 0.000268f, 0.986816f, 0.000287f, 0.985352f, 0.000311f, 0.983887f, + 0.000338f, 0.981934f, 0.000360f, 0.979492f, 0.000377f, 0.977539f, 0.000392f, 0.975098f, + 0.000415f, 0.972168f, 0.000437f, 0.969727f, 0.000454f, 0.967285f, 0.000469f, 0.963867f, + 0.000481f, 0.960938f, 0.000495f, 0.957520f, 0.000501f, 0.954102f, 0.000497f, 0.950195f, + 0.000487f, 0.946777f, 0.000476f, 0.941895f, 0.000469f, 0.937500f, 0.000468f, 0.933105f, + 0.000470f, 0.927734f, 0.000473f, 0.922852f, 0.000474f, 0.917480f, 0.000476f, 0.911133f, + 0.000478f, 0.905273f, 0.000470f, 0.898438f, 0.000479f, 0.891602f, 0.000485f, 0.883789f, + 0.000486f, 0.876465f, 0.000486f, 0.867676f, 0.000487f, 0.858398f, 0.000466f, 0.849121f, + 0.000467f, 0.838379f, 0.000468f, 0.827637f, 0.000468f, 0.816406f, 0.000463f, 0.803223f, + 0.000435f, 0.788574f, 0.000437f, 0.773926f, 0.000432f, 0.757324f, 0.000427f, 0.739746f, + 0.000419f, 0.720215f, 0.000387f, 0.698242f, 0.000385f, 0.674316f, 0.000373f, 0.647461f, + 0.000362f, 0.617676f, 0.000329f, 0.583008f, 0.000320f, 0.542969f, 0.000300f, 0.497559f, + 0.000266f, 0.440186f, 0.000244f, 0.367920f, 0.000195f, 0.267334f, 0.000071f, 0.102478f, + 0.000000f, 1.000000f, 0.000163f, 0.999512f, 0.000284f, 0.999023f, 0.000322f, 0.998535f, + 0.000390f, 0.997559f, 0.000446f, 0.996582f, 0.000468f, 0.996094f, 0.000480f, 0.995117f, + 0.000559f, 0.993164f, 0.000587f, 0.992676f, 0.000602f, 0.991211f, 0.000611f, 0.989746f, + 0.000666f, 0.988281f, 0.000695f, 0.986328f, 0.000711f, 0.984863f, 0.000721f, 0.982910f, + 0.000727f, 0.980957f, 0.000771f, 0.978516f, 0.000804f, 0.976074f, 0.000835f, 0.973633f, + 0.000859f, 0.971680f, 0.000866f, 0.968750f, 0.000858f, 0.965820f, 0.000897f, 0.962402f, + 0.000907f, 0.959473f, 0.000910f, 0.956055f, 0.000895f, 0.952148f, 0.000893f, 0.949219f, + 0.000887f, 0.944824f, 0.000919f, 0.940918f, 0.000936f, 0.935547f, 0.000953f, 0.931641f, + 0.000932f, 0.926270f, 0.000944f, 0.920898f, 0.000958f, 0.916016f, 0.000992f, 0.909668f, + 0.001000f, 0.903320f, 0.000954f, 0.896484f, 0.000952f, 0.889648f, 0.000958f, 0.882324f, + 0.000962f, 0.874023f, 0.000989f, 0.865723f, 0.000987f, 0.856934f, 0.000939f, 0.846680f, + 0.000939f, 0.836426f, 0.000934f, 0.825684f, 0.000918f, 0.813965f, 0.000944f, 0.800781f, + 0.000895f, 0.786621f, 0.000877f, 0.771973f, 0.000869f, 0.755371f, 0.000849f, 0.738281f, + 0.000871f, 0.718750f, 0.000816f, 0.696289f, 0.000781f, 0.672852f, 0.000767f, 0.646484f, + 0.000762f, 0.616699f, 0.000692f, 0.581543f, 0.000667f, 0.541992f, 0.000639f, 0.496582f, + 0.000575f, 0.439209f, 0.000523f, 0.367188f, 0.000407f, 0.267578f, 0.000128f, 0.101868f, + 0.000000f, 1.000000f, 0.000358f, 0.999512f, 0.000612f, 0.998535f, 0.000588f, 0.998535f, + 0.000780f, 0.997070f, 0.000782f, 0.996582f, 0.000771f, 0.995605f, 0.000897f, 0.994629f, + 0.000930f, 0.993164f, 0.000935f, 0.991211f, 0.000952f, 0.990723f, 0.000975f, 0.988770f, + 0.001143f, 0.987305f, 0.001187f, 0.985352f, 0.001217f, 0.983398f, 0.001245f, 0.981934f, + 0.001275f, 0.979980f, 0.001399f, 0.977051f, 0.001397f, 0.974609f, 0.001397f, 0.972168f, + 0.001394f, 0.969727f, 0.001391f, 0.967773f, 0.001451f, 0.963867f, 0.001482f, 0.960938f, + 0.001512f, 0.958008f, 0.001531f, 0.954102f, 0.001549f, 0.950684f, 0.001515f, 0.946777f, + 0.001597f, 0.943359f, 0.001645f, 0.938477f, 0.001668f, 0.933594f, 0.001675f, 0.929199f, + 0.001617f, 0.924316f, 0.001619f, 0.918945f, 0.001625f, 0.913574f, 0.001703f, 0.907227f, + 0.001728f, 0.900879f, 0.001737f, 0.894043f, 0.001659f, 0.887207f, 0.001665f, 0.879883f, + 0.001655f, 0.872070f, 0.001730f, 0.863281f, 0.001733f, 0.854004f, 0.001653f, 0.843750f, + 0.001659f, 0.833984f, 0.001629f, 0.823242f, 0.001668f, 0.811523f, 0.001670f, 0.798828f, + 0.001593f, 0.784180f, 0.001596f, 0.770020f, 0.001554f, 0.752930f, 0.001526f, 0.735840f, + 0.001560f, 0.716309f, 0.001481f, 0.694824f, 0.001433f, 0.670898f, 0.001390f, 0.644043f, + 0.001403f, 0.614746f, 0.001324f, 0.580566f, 0.001235f, 0.541016f, 0.001184f, 0.496094f, + 0.001082f, 0.438721f, 0.000964f, 0.367188f, 0.000731f, 0.266357f, 0.000206f, 0.101624f, + 0.000000f, 1.000000f, 0.000436f, 0.999512f, 0.000781f, 0.998535f, 0.000744f, 0.997559f, + 0.001057f, 0.996582f, 0.001103f, 0.995605f, 0.001136f, 0.994629f, 0.001171f, 0.994141f, + 0.001474f, 0.992188f, 0.001503f, 0.990723f, 0.001531f, 0.989258f, 0.001568f, 0.987793f, + 0.001811f, 0.985840f, 0.001837f, 0.984375f, 0.001862f, 0.982422f, 0.001885f, 0.980469f, + 0.001904f, 0.978516f, 0.002110f, 0.975586f, 0.002098f, 0.973145f, 0.002125f, 0.970703f, + 0.002155f, 0.967773f, 0.002172f, 0.965332f, 0.002342f, 0.962402f, 0.002340f, 0.958496f, + 0.002382f, 0.955566f, 0.002436f, 0.952148f, 0.002466f, 0.948242f, 0.002483f, 0.944824f, + 0.002539f, 0.940430f, 0.002563f, 0.936035f, 0.002596f, 0.931152f, 0.002623f, 0.926270f, + 0.002653f, 0.921387f, 0.002586f, 0.916504f, 0.002697f, 0.910645f, 0.002726f, 0.904785f, + 0.002726f, 0.897949f, 0.002762f, 0.891113f, 0.002682f, 0.884277f, 0.002682f, 0.876953f, + 0.002764f, 0.869141f, 0.002762f, 0.860352f, 0.002775f, 0.851074f, 0.002785f, 0.841309f, + 0.002693f, 0.831055f, 0.002645f, 0.820312f, 0.002720f, 0.808594f, 0.002716f, 0.794922f, + 0.002718f, 0.781738f, 0.002617f, 0.766602f, 0.002560f, 0.750488f, 0.002514f, 0.733398f, + 0.002567f, 0.713867f, 0.002470f, 0.692383f, 0.002403f, 0.668457f, 0.002317f, 0.642578f, + 0.002331f, 0.612793f, 0.002230f, 0.578613f, 0.002100f, 0.539551f, 0.001986f, 0.495117f, + 0.001828f, 0.437744f, 0.001591f, 0.366455f, 0.001179f, 0.266602f, 0.000311f, 0.100708f, + 0.000000f, 1.000000f, 0.000562f, 0.999023f, 0.001087f, 0.998047f, 0.001167f, 0.997559f, + 0.001545f, 0.996582f, 0.001648f, 0.995117f, 0.001674f, 0.994141f, 0.001679f, 0.993164f, + 0.002090f, 0.991211f, 0.002174f, 0.990234f, 0.002226f, 0.988281f, 0.002283f, 0.986328f, + 0.002634f, 0.984863f, 0.002668f, 0.982422f, 0.002708f, 0.980469f, 0.002739f, 0.979004f, + 0.002733f, 0.976562f, 0.003048f, 0.973633f, 0.003136f, 0.971191f, 0.003130f, 0.968750f, + 0.003168f, 0.965820f, 0.003208f, 0.963379f, 0.003485f, 0.959961f, 0.003578f, 0.956543f, + 0.003546f, 0.952637f, 0.003571f, 0.949707f, 0.003595f, 0.946289f, 0.003649f, 0.942383f, + 0.003769f, 0.937500f, 0.003860f, 0.933105f, 0.003901f, 0.928223f, 0.003929f, 0.923828f, + 0.003929f, 0.918457f, 0.003866f, 0.913086f, 0.004047f, 0.907227f, 0.004105f, 0.900879f, + 0.004093f, 0.895020f, 0.004139f, 0.887695f, 0.004177f, 0.881348f, 0.004047f, 0.873535f, + 0.004208f, 0.865723f, 0.004192f, 0.856445f, 0.004234f, 0.847656f, 0.004219f, 0.837891f, + 0.004108f, 0.827637f, 0.004116f, 0.817383f, 0.004177f, 0.805176f, 0.004166f, 0.791992f, + 0.004154f, 0.777832f, 0.004036f, 0.763184f, 0.003960f, 0.747559f, 0.003979f, 0.729980f, + 0.003979f, 0.710449f, 0.003859f, 0.689453f, 0.003752f, 0.665527f, 0.003664f, 0.640137f, + 0.003653f, 0.610840f, 0.003494f, 0.576660f, 0.003300f, 0.537598f, 0.003094f, 0.493896f, + 0.002893f, 0.437256f, 0.002426f, 0.366211f, 0.001757f, 0.265869f, 0.000430f, 0.100830f, + 0.000000f, 1.000000f, 0.000334f, 0.999512f, 0.001054f, 0.998047f, 0.001493f, 0.997070f, + 0.001719f, 0.995605f, 0.002230f, 0.994141f, 0.002279f, 0.993652f, 0.002474f, 0.991699f, + 0.002930f, 0.990234f, 0.002981f, 0.988770f, 0.003071f, 0.987305f, 0.003239f, 0.985352f, + 0.003639f, 0.982910f, 0.003712f, 0.980957f, 0.003738f, 0.978516f, 0.003807f, 0.977051f, + 0.003975f, 0.975098f, 0.004288f, 0.971680f, 0.004372f, 0.968750f, 0.004478f, 0.966309f, + 0.004475f, 0.963867f, 0.004536f, 0.960938f, 0.004906f, 0.957031f, 0.004997f, 0.953613f, + 0.004993f, 0.950195f, 0.005058f, 0.946289f, 0.005131f, 0.942871f, 0.005177f, 0.939453f, + 0.005489f, 0.934570f, 0.005463f, 0.929688f, 0.005554f, 0.924805f, 0.005608f, 0.919922f, + 0.005676f, 0.915527f, 0.005661f, 0.909668f, 0.005836f, 0.903809f, 0.005894f, 0.896973f, + 0.005974f, 0.890625f, 0.005943f, 0.884277f, 0.005997f, 0.876953f, 0.005852f, 0.869629f, + 0.006119f, 0.861328f, 0.006168f, 0.852539f, 0.006149f, 0.843750f, 0.006111f, 0.833984f, + 0.006023f, 0.823730f, 0.006008f, 0.813477f, 0.006111f, 0.800781f, 0.006161f, 0.787598f, + 0.006119f, 0.774414f, 0.005974f, 0.759766f, 0.005947f, 0.744629f, 0.005978f, 0.726562f, + 0.005928f, 0.707031f, 0.005718f, 0.686035f, 0.005585f, 0.663086f, 0.005436f, 0.637695f, + 0.005413f, 0.607910f, 0.005184f, 0.574707f, 0.004887f, 0.536133f, 0.004562f, 0.492432f, + 0.004215f, 0.435303f, 0.003492f, 0.365723f, 0.002497f, 0.265625f, 0.000574f, 0.100403f, + 0.000000f, 1.000000f, 0.000472f, 0.999023f, 0.001438f, 0.997559f, 0.002029f, 0.996582f, + 0.002350f, 0.994629f, 0.002920f, 0.993652f, 0.003023f, 0.992676f, 0.003340f, 0.990723f, + 0.003897f, 0.988770f, 0.004021f, 0.987305f, 0.004108f, 0.985840f, 0.004410f, 0.983887f, + 0.004959f, 0.981445f, 0.005058f, 0.979004f, 0.005089f, 0.976562f, 0.005119f, 0.974609f, + 0.005417f, 0.972168f, 0.005920f, 0.969727f, 0.005951f, 0.966309f, 0.006046f, 0.963379f, + 0.006165f, 0.960938f, 0.006268f, 0.958008f, 0.006714f, 0.954102f, 0.006840f, 0.950195f, + 0.006977f, 0.947266f, 0.006966f, 0.943359f, 0.006981f, 0.939453f, 0.007202f, 0.935547f, + 0.007645f, 0.930664f, 0.007660f, 0.926270f, 0.007641f, 0.920898f, 0.007767f, 0.916504f, + 0.007809f, 0.911133f, 0.007881f, 0.906250f, 0.008125f, 0.899414f, 0.008232f, 0.893066f, + 0.008293f, 0.886230f, 0.008392f, 0.879883f, 0.008324f, 0.873047f, 0.008263f, 0.865723f, + 0.008553f, 0.856445f, 0.008675f, 0.848145f, 0.008606f, 0.838867f, 0.008652f, 0.829590f, + 0.008492f, 0.819336f, 0.008453f, 0.809082f, 0.008789f, 0.796387f, 0.008720f, 0.783203f, + 0.008652f, 0.770508f, 0.008461f, 0.755859f, 0.008423f, 0.740234f, 0.008492f, 0.722168f, + 0.008423f, 0.703125f, 0.008331f, 0.682617f, 0.008049f, 0.659668f, 0.007721f, 0.635254f, + 0.007732f, 0.605469f, 0.007339f, 0.572266f, 0.006920f, 0.534668f, 0.006493f, 0.490723f, + 0.005875f, 0.434326f, 0.004822f, 0.365234f, 0.003347f, 0.265625f, 0.000737f, 0.099487f, + 0.000000f, 1.000000f, 0.000788f, 0.999023f, 0.001456f, 0.997559f, 0.002056f, 0.996094f, + 0.003193f, 0.994141f, 0.003294f, 0.993164f, 0.003887f, 0.991699f, 0.004456f, 0.989258f, + 0.004616f, 0.987305f, 0.005211f, 0.985840f, 0.005360f, 0.984375f, 0.005871f, 0.981445f, + 0.006081f, 0.979492f, 0.006680f, 0.977051f, 0.006763f, 0.975098f, 0.006824f, 0.972168f, + 0.007336f, 0.969238f, 0.007793f, 0.966309f, 0.007996f, 0.963867f, 0.008034f, 0.960938f, + 0.008163f, 0.958008f, 0.008591f, 0.954590f, 0.008636f, 0.950684f, 0.009171f, 0.947266f, + 0.009262f, 0.943359f, 0.009415f, 0.939453f, 0.009445f, 0.936035f, 0.009689f, 0.931152f, + 0.010193f, 0.926270f, 0.010422f, 0.921875f, 0.010239f, 0.916504f, 0.010422f, 0.911621f, + 0.010582f, 0.907227f, 0.010811f, 0.900879f, 0.011162f, 0.895020f, 0.011177f, 0.888184f, + 0.011299f, 0.881836f, 0.011360f, 0.875000f, 0.011337f, 0.868164f, 0.011528f, 0.860840f, + 0.011803f, 0.852051f, 0.011810f, 0.842773f, 0.011841f, 0.833984f, 0.011818f, 0.824707f, + 0.011780f, 0.814941f, 0.011787f, 0.804199f, 0.012024f, 0.791016f, 0.011925f, 0.778320f, + 0.011841f, 0.765137f, 0.011696f, 0.750488f, 0.011627f, 0.736328f, 0.011749f, 0.718262f, + 0.011559f, 0.698730f, 0.011452f, 0.678711f, 0.011124f, 0.656250f, 0.010750f, 0.632324f, + 0.010605f, 0.602051f, 0.010086f, 0.569336f, 0.009506f, 0.532715f, 0.008842f, 0.488770f, + 0.007866f, 0.433105f, 0.006378f, 0.364014f, 0.004341f, 0.264893f, 0.000914f, 0.099304f, + 0.000000f, 1.000000f, 0.001091f, 0.999023f, 0.002075f, 0.997559f, 0.002211f, 0.996582f, + 0.003613f, 0.994141f, 0.004295f, 0.992188f, 0.004448f, 0.990723f, 0.005737f, 0.987793f, + 0.005981f, 0.985840f, 0.006618f, 0.983887f, 0.006832f, 0.982422f, 0.007587f, 0.979492f, + 0.007866f, 0.977051f, 0.008545f, 0.974609f, 0.008766f, 0.972656f, 0.009003f, 0.969727f, + 0.009537f, 0.966309f, 0.009811f, 0.963379f, 0.010338f, 0.959961f, 0.010597f, 0.957520f, + 0.010696f, 0.954590f, 0.011238f, 0.950195f, 0.011566f, 0.946777f, 0.011963f, 0.942871f, + 0.012199f, 0.938965f, 0.012314f, 0.935547f, 0.012581f, 0.932129f, 0.013023f, 0.926758f, + 0.013382f, 0.921387f, 0.013657f, 0.916992f, 0.013939f, 0.912109f, 0.013710f, 0.906738f, + 0.013931f, 0.901855f, 0.014526f, 0.895996f, 0.014885f, 0.889160f, 0.015030f, 0.882812f, + 0.014931f, 0.876465f, 0.015053f, 0.870117f, 0.015160f, 0.862793f, 0.015488f, 0.854492f, + 0.015686f, 0.846191f, 0.015747f, 0.837402f, 0.015915f, 0.828613f, 0.015762f, 0.818848f, + 0.015778f, 0.809082f, 0.015854f, 0.797852f, 0.016068f, 0.785645f, 0.016037f, 0.772949f, + 0.016052f, 0.760254f, 0.015930f, 0.746582f, 0.015656f, 0.731445f, 0.015717f, 0.712891f, + 0.015579f, 0.694336f, 0.015274f, 0.674316f, 0.014870f, 0.652832f, 0.014488f, 0.627930f, + 0.014114f, 0.598145f, 0.013412f, 0.566406f, 0.012589f, 0.530273f, 0.011642f, 0.486328f, + 0.010262f, 0.431396f, 0.008263f, 0.364258f, 0.005493f, 0.263916f, 0.001109f, 0.098450f, + 0.000000f, 1.000000f, 0.000887f, 0.999023f, 0.002274f, 0.997070f, 0.002935f, 0.995605f, + 0.004227f, 0.993164f, 0.005424f, 0.991211f, 0.005623f, 0.989746f, 0.006866f, 0.986816f, + 0.007545f, 0.984375f, 0.007835f, 0.982422f, 0.008629f, 0.979980f, 0.009605f, 0.976562f, + 0.009987f, 0.974121f, 0.010300f, 0.972168f, 0.011017f, 0.969727f, 0.011658f, 0.966309f, + 0.012405f, 0.963379f, 0.012512f, 0.959961f, 0.013245f, 0.957031f, 0.013420f, 0.953613f, + 0.014008f, 0.950195f, 0.014595f, 0.946289f, 0.014938f, 0.942383f, 0.015572f, 0.938477f, + 0.015671f, 0.934570f, 0.016022f, 0.931152f, 0.016342f, 0.926270f, 0.017090f, 0.921387f, + 0.017593f, 0.916504f, 0.017731f, 0.911133f, 0.018051f, 0.906738f, 0.018311f, 0.902344f, + 0.018265f, 0.895996f, 0.018906f, 0.889648f, 0.019638f, 0.883789f, 0.019684f, 0.876953f, + 0.019699f, 0.870605f, 0.019760f, 0.863770f, 0.019989f, 0.857422f, 0.020355f, 0.848633f, + 0.020813f, 0.839844f, 0.020859f, 0.831055f, 0.020889f, 0.822754f, 0.021042f, 0.813965f, + 0.020935f, 0.803711f, 0.020981f, 0.791992f, 0.021332f, 0.779785f, 0.021301f, 0.767578f, + 0.021164f, 0.754883f, 0.020874f, 0.741211f, 0.020737f, 0.725098f, 0.020935f, 0.708008f, + 0.020584f, 0.689453f, 0.020172f, 0.669922f, 0.019409f, 0.648438f, 0.019043f, 0.623535f, + 0.018585f, 0.594727f, 0.017471f, 0.563477f, 0.016266f, 0.527832f, 0.015045f, 0.483643f, + 0.013084f, 0.430176f, 0.010391f, 0.363281f, 0.006832f, 0.263428f, 0.001331f, 0.098022f, + 0.000000f, 1.000000f, 0.001259f, 0.998535f, 0.003033f, 0.996582f, 0.003775f, 0.995117f, + 0.004944f, 0.992188f, 0.006237f, 0.990234f, 0.007256f, 0.987793f, 0.008118f, 0.984863f, + 0.009392f, 0.981934f, 0.009758f, 0.980469f, 0.010361f, 0.977539f, 0.011642f, 0.974121f, + 0.012421f, 0.971680f, 0.012856f, 0.968750f, 0.013634f, 0.966309f, 0.014641f, 0.962402f, + 0.015503f, 0.958984f, 0.015991f, 0.956055f, 0.016663f, 0.953125f, 0.016922f, 0.949707f, + 0.017654f, 0.945312f, 0.018555f, 0.940918f, 0.018921f, 0.937500f, 0.019653f, 0.933594f, + 0.020020f, 0.929688f, 0.020142f, 0.925781f, 0.021118f, 0.920410f, 0.021744f, 0.915527f, + 0.022202f, 0.910645f, 0.022766f, 0.905762f, 0.023041f, 0.901367f, 0.023315f, 0.895996f, + 0.023865f, 0.889648f, 0.024246f, 0.882812f, 0.025085f, 0.876953f, 0.025406f, 0.870605f, + 0.025391f, 0.864258f, 0.025574f, 0.857910f, 0.026077f, 0.850098f, 0.026520f, 0.841797f, + 0.027039f, 0.833496f, 0.026947f, 0.824707f, 0.027023f, 0.815918f, 0.027145f, 0.807129f, + 0.027176f, 0.796387f, 0.027832f, 0.785645f, 0.027771f, 0.773438f, 0.027725f, 0.761230f, + 0.027512f, 0.748535f, 0.027176f, 0.735840f, 0.027298f, 0.719238f, 0.027191f, 0.702148f, + 0.026810f, 0.684570f, 0.026154f, 0.665039f, 0.025360f, 0.644531f, 0.024689f, 0.619141f, + 0.023865f, 0.590820f, 0.022659f, 0.560547f, 0.020828f, 0.525391f, 0.019165f, 0.481445f, + 0.016571f, 0.427979f, 0.012985f, 0.362305f, 0.008476f, 0.262939f, 0.001597f, 0.097290f, + 0.000000f, 1.000000f, 0.001215f, 0.998535f, 0.002966f, 0.996582f, 0.004471f, 0.994141f, + 0.006348f, 0.991211f, 0.006783f, 0.989258f, 0.008652f, 0.986328f, 0.010139f, 0.982910f, + 0.010628f, 0.980957f, 0.011955f, 0.978027f, 0.012970f, 0.974121f, 0.013916f, 0.971191f, + 0.015312f, 0.967773f, 0.015778f, 0.965332f, 0.016647f, 0.962402f, 0.018127f, 0.958008f, + 0.019104f, 0.954590f, 0.019699f, 0.951660f, 0.020248f, 0.948730f, 0.021149f, 0.944824f, + 0.022171f, 0.939941f, 0.022995f, 0.935547f, 0.023636f, 0.932129f, 0.024063f, 0.928223f, + 0.025055f, 0.924316f, 0.025681f, 0.919434f, 0.026321f, 0.914062f, 0.027374f, 0.909180f, + 0.027756f, 0.904297f, 0.028427f, 0.899414f, 0.028946f, 0.894531f, 0.029587f, 0.888672f, + 0.030380f, 0.882324f, 0.030975f, 0.876465f, 0.031433f, 0.869629f, 0.032043f, 0.863770f, + 0.032440f, 0.857910f, 0.032379f, 0.850586f, 0.033142f, 0.842285f, 0.033813f, 0.833984f, + 0.034424f, 0.825684f, 0.034698f, 0.817871f, 0.034424f, 0.809082f, 0.034393f, 0.800293f, + 0.035187f, 0.789062f, 0.035370f, 0.778320f, 0.035187f, 0.766113f, 0.035187f, 0.754395f, + 0.035034f, 0.742676f, 0.034882f, 0.729004f, 0.034790f, 0.712891f, 0.034607f, 0.695801f, + 0.034119f, 0.678711f, 0.033356f, 0.660156f, 0.032043f, 0.640137f, 0.031403f, 0.614258f, + 0.030273f, 0.586914f, 0.028503f, 0.557129f, 0.026123f, 0.522461f, 0.024094f, 0.478516f, + 0.020691f, 0.426514f, 0.016129f, 0.361816f, 0.010269f, 0.261963f, 0.001909f, 0.096802f, + 0.000000f, 1.000000f, 0.001688f, 0.998535f, 0.003967f, 0.996094f, 0.005096f, 0.993652f, + 0.007088f, 0.990723f, 0.008499f, 0.987793f, 0.009575f, 0.984863f, 0.011612f, 0.981445f, + 0.013092f, 0.978516f, 0.014122f, 0.975586f, 0.016022f, 0.971191f, 0.017105f, 0.967773f, + 0.018188f, 0.964844f, 0.019211f, 0.961914f, 0.020569f, 0.957520f, 0.021713f, 0.953613f, + 0.022903f, 0.950195f, 0.024002f, 0.946777f, 0.024643f, 0.943848f, 0.025986f, 0.938965f, + 0.027405f, 0.934570f, 0.028336f, 0.930176f, 0.029129f, 0.926270f, 0.029633f, 0.922363f, + 0.030853f, 0.918457f, 0.031982f, 0.912598f, 0.032776f, 0.907227f, 0.033752f, 0.901855f, + 0.034393f, 0.897461f, 0.035217f, 0.892578f, 0.035645f, 0.887207f, 0.037079f, 0.880859f, + 0.038025f, 0.874512f, 0.038635f, 0.868164f, 0.039124f, 0.862793f, 0.039490f, 0.855957f, + 0.040222f, 0.850098f, 0.040802f, 0.842285f, 0.041626f, 0.833984f, 0.042206f, 0.826172f, + 0.042755f, 0.817871f, 0.042786f, 0.810059f, 0.042999f, 0.801758f, 0.043488f, 0.791992f, + 0.044128f, 0.781250f, 0.044067f, 0.770020f, 0.044434f, 0.759277f, 0.044220f, 0.747559f, + 0.044037f, 0.736328f, 0.043915f, 0.721680f, 0.043518f, 0.705566f, 0.043243f, 0.689453f, + 0.042297f, 0.672363f, 0.041443f, 0.655273f, 0.040222f, 0.634277f, 0.039429f, 0.608887f, + 0.037537f, 0.582520f, 0.035492f, 0.553711f, 0.032471f, 0.520508f, 0.029556f, 0.475342f, + 0.025238f, 0.425049f, 0.019531f, 0.361572f, 0.012436f, 0.261719f, 0.002287f, 0.096252f, + 0.000000f, 1.000000f, 0.002026f, 0.998535f, 0.004211f, 0.995605f, 0.006321f, 0.992676f, + 0.008430f, 0.989258f, 0.009537f, 0.987305f, 0.012123f, 0.982910f, 0.013802f, 0.979004f, + 0.014915f, 0.976074f, 0.017014f, 0.972168f, 0.019089f, 0.967773f, 0.020798f, 0.964355f, + 0.021545f, 0.960938f, 0.023483f, 0.957031f, 0.025116f, 0.952637f, 0.026413f, 0.948730f, + 0.027725f, 0.944824f, 0.028946f, 0.941406f, 0.030060f, 0.937500f, 0.031647f, 0.932617f, + 0.033417f, 0.927734f, 0.034393f, 0.924316f, 0.035156f, 0.919434f, 0.036041f, 0.915527f, + 0.037323f, 0.910156f, 0.039398f, 0.904785f, 0.040192f, 0.899902f, 0.041321f, 0.895020f, + 0.041809f, 0.889648f, 0.042908f, 0.885254f, 0.044250f, 0.878906f, 0.045258f, 0.872070f, + 0.046509f, 0.866211f, 0.047211f, 0.860352f, 0.047852f, 0.854492f, 0.048523f, 0.848145f, + 0.049225f, 0.840820f, 0.050781f, 0.833496f, 0.050842f, 0.824707f, 0.051666f, 0.817383f, + 0.052246f, 0.810059f, 0.052795f, 0.802246f, 0.052704f, 0.793457f, 0.053589f, 0.782715f, + 0.054291f, 0.772461f, 0.054321f, 0.762207f, 0.054626f, 0.751465f, 0.053680f, 0.740234f, + 0.053711f, 0.728516f, 0.053711f, 0.713379f, 0.053680f, 0.698730f, 0.053070f, 0.683105f, + 0.051941f, 0.666504f, 0.050507f, 0.649414f, 0.049438f, 0.627441f, 0.048187f, 0.603516f, + 0.045776f, 0.577637f, 0.042877f, 0.549805f, 0.039459f, 0.516602f, 0.035889f, 0.472656f, + 0.030350f, 0.422607f, 0.023346f, 0.361084f, 0.014725f, 0.261230f, 0.002661f, 0.095459f, + 0.000000f, 1.000000f, 0.002241f, 0.998047f, 0.004997f, 0.995117f, 0.007359f, 0.991699f, + 0.009644f, 0.988281f, 0.011307f, 0.985352f, 0.014214f, 0.980957f, 0.016434f, 0.976562f, + 0.017715f, 0.973633f, 0.019943f, 0.968750f, 0.021881f, 0.964844f, 0.024170f, 0.960449f, + 0.025940f, 0.957031f, 0.027649f, 0.952148f, 0.030365f, 0.947266f, 0.031433f, 0.943359f, + 0.032806f, 0.939453f, 0.034180f, 0.936035f, 0.036652f, 0.930176f, 0.038208f, 0.925781f, + 0.039703f, 0.921387f, 0.041199f, 0.916992f, 0.042603f, 0.912598f, 0.043945f, 0.907227f, + 0.045563f, 0.901855f, 0.047302f, 0.895996f, 0.048462f, 0.891602f, 0.049683f, 0.886719f, + 0.050537f, 0.882324f, 0.051666f, 0.875977f, 0.053680f, 0.869141f, 0.055054f, 0.863281f, + 0.055908f, 0.856934f, 0.056885f, 0.851074f, 0.057587f, 0.845703f, 0.058746f, 0.838867f, + 0.060211f, 0.831055f, 0.061005f, 0.823242f, 0.062225f, 0.816406f, 0.062103f, 0.808105f, + 0.063232f, 0.801270f, 0.063416f, 0.793457f, 0.064331f, 0.783203f, 0.065002f, 0.773438f, + 0.065308f, 0.763184f, 0.065430f, 0.753418f, 0.065491f, 0.743164f, 0.065002f, 0.732910f, + 0.065308f, 0.719238f, 0.065125f, 0.705566f, 0.064575f, 0.691406f, 0.063660f, 0.675781f, + 0.062469f, 0.660156f, 0.060822f, 0.643555f, 0.059601f, 0.621094f, 0.057831f, 0.598145f, + 0.054871f, 0.573242f, 0.051208f, 0.545898f, 0.047241f, 0.511719f, 0.042572f, 0.469727f, + 0.036285f, 0.421387f, 0.027420f, 0.360107f, 0.017288f, 0.260986f, 0.003103f, 0.094543f, + 0.000000f, 1.000000f, 0.002699f, 0.997559f, 0.006077f, 0.994629f, 0.009171f, 0.990234f, + 0.011162f, 0.986816f, 0.013596f, 0.982910f, 0.016663f, 0.978516f, 0.019119f, 0.974121f, + 0.021225f, 0.970215f, 0.024506f, 0.964844f, 0.026108f, 0.960938f, 0.028091f, 0.957031f, + 0.030945f, 0.951660f, 0.033508f, 0.946289f, 0.035614f, 0.941895f, 0.037628f, 0.937500f, + 0.039154f, 0.933105f, 0.041046f, 0.928223f, 0.044006f, 0.922363f, 0.045685f, 0.917480f, + 0.047302f, 0.913574f, 0.048950f, 0.909180f, 0.051056f, 0.904297f, 0.053192f, 0.898438f, + 0.054688f, 0.893066f, 0.056091f, 0.887695f, 0.057556f, 0.882324f, 0.059143f, 0.877930f, + 0.060638f, 0.872070f, 0.062439f, 0.865723f, 0.064087f, 0.858887f, 0.065552f, 0.853516f, + 0.066956f, 0.848145f, 0.067444f, 0.841797f, 0.068420f, 0.835938f, 0.070801f, 0.827637f, + 0.071838f, 0.820312f, 0.072632f, 0.812988f, 0.073853f, 0.806152f, 0.074402f, 0.799805f, + 0.074829f, 0.791992f, 0.076172f, 0.782715f, 0.076843f, 0.772949f, 0.076965f, 0.763184f, + 0.077759f, 0.754395f, 0.077820f, 0.744629f, 0.077698f, 0.734863f, 0.077454f, 0.723145f, + 0.077576f, 0.709961f, 0.077209f, 0.696777f, 0.076416f, 0.683105f, 0.075439f, 0.668945f, + 0.073669f, 0.654297f, 0.072144f, 0.635254f, 0.070801f, 0.614258f, 0.067993f, 0.592285f, + 0.064514f, 0.568359f, 0.060272f, 0.542480f, 0.055481f, 0.506836f, 0.049927f, 0.466309f, + 0.042175f, 0.419678f, 0.032379f, 0.357422f, 0.019928f, 0.260498f, 0.003540f, 0.093628f, + 0.000000f, 1.000000f, 0.003256f, 0.997559f, 0.006847f, 0.994141f, 0.010422f, 0.989258f, + 0.013496f, 0.985352f, 0.016830f, 0.980469f, 0.019699f, 0.975586f, 0.022263f, 0.971680f, + 0.025574f, 0.966309f, 0.028839f, 0.960449f, 0.031555f, 0.956055f, 0.033203f, 0.952148f, + 0.036865f, 0.945801f, 0.039795f, 0.939941f, 0.042084f, 0.935547f, 0.044250f, 0.931152f, + 0.046997f, 0.925293f, 0.049561f, 0.919434f, 0.051514f, 0.914551f, 0.054230f, 0.909668f, + 0.055603f, 0.905273f, 0.057739f, 0.900391f, 0.060455f, 0.894043f, 0.063110f, 0.888184f, + 0.064941f, 0.883301f, 0.066467f, 0.878418f, 0.067993f, 0.873047f, 0.070129f, 0.866699f, + 0.072388f, 0.860352f, 0.073975f, 0.854492f, 0.075989f, 0.849121f, 0.077209f, 0.842773f, + 0.078308f, 0.837402f, 0.080078f, 0.831543f, 0.081604f, 0.823730f, 0.083374f, 0.816406f, + 0.084717f, 0.809570f, 0.085938f, 0.802734f, 0.086609f, 0.795898f, 0.087463f, 0.789551f, + 0.088318f, 0.780273f, 0.089722f, 0.770996f, 0.090332f, 0.762207f, 0.090820f, 0.753906f, + 0.091003f, 0.744141f, 0.091064f, 0.735840f, 0.090942f, 0.726074f, 0.091064f, 0.712891f, + 0.091064f, 0.700684f, 0.090698f, 0.687988f, 0.089600f, 0.675781f, 0.087585f, 0.661133f, + 0.086060f, 0.646973f, 0.084717f, 0.627441f, 0.082092f, 0.607422f, 0.078857f, 0.585938f, + 0.074951f, 0.563965f, 0.069641f, 0.538574f, 0.064758f, 0.502441f, 0.057800f, 0.463135f, + 0.048431f, 0.417725f, 0.037231f, 0.354248f, 0.022766f, 0.260010f, 0.004044f, 0.092957f, + 0.000000f, 1.000000f, 0.004089f, 0.997070f, 0.007858f, 0.993164f, 0.012085f, 0.988281f, + 0.015350f, 0.984375f, 0.019882f, 0.977539f, 0.023315f, 0.973145f, 0.026230f, 0.968262f, + 0.030502f, 0.961426f, 0.034058f, 0.956055f, 0.036469f, 0.951660f, 0.040192f, 0.945312f, + 0.043549f, 0.939453f, 0.046143f, 0.934082f, 0.049530f, 0.928711f, 0.052307f, 0.923340f, + 0.055603f, 0.916992f, 0.058990f, 0.910645f, 0.061035f, 0.905762f, 0.063416f, 0.900879f, + 0.065857f, 0.895508f, 0.068848f, 0.888672f, 0.071289f, 0.883301f, 0.074219f, 0.877930f, + 0.076172f, 0.872559f, 0.077698f, 0.868164f, 0.080444f, 0.862305f, 0.082703f, 0.854980f, + 0.084900f, 0.848633f, 0.086853f, 0.843262f, 0.088440f, 0.837891f, 0.090454f, 0.832520f, + 0.091736f, 0.825684f, 0.094299f, 0.818359f, 0.096008f, 0.811523f, 0.097412f, 0.804688f, + 0.099121f, 0.797852f, 0.099670f, 0.791504f, 0.100525f, 0.785156f, 0.102234f, 0.776855f, + 0.103638f, 0.768066f, 0.104187f, 0.758789f, 0.105408f, 0.751465f, 0.105469f, 0.743164f, + 0.105408f, 0.734863f, 0.105164f, 0.726074f, 0.106140f, 0.713867f, 0.106079f, 0.702148f, + 0.105347f, 0.690430f, 0.104614f, 0.678711f, 0.102539f, 0.666992f, 0.100891f, 0.654297f, + 0.099426f, 0.637207f, 0.097229f, 0.619141f, 0.094910f, 0.601074f, 0.090759f, 0.580566f, + 0.085449f, 0.559082f, 0.080078f, 0.531738f, 0.074158f, 0.498047f, 0.065735f, 0.460938f, + 0.055634f, 0.416260f, 0.042633f, 0.351807f, 0.025879f, 0.259033f, 0.004566f, 0.092041f, + 0.000000f, 1.000000f, 0.005260f, 0.996582f, 0.009384f, 0.992188f, 0.014206f, 0.986816f, + 0.018677f, 0.981445f, 0.023102f, 0.975098f, 0.027206f, 0.969727f, 0.031616f, 0.962891f, + 0.036011f, 0.957031f, 0.039642f, 0.951172f, 0.043304f, 0.945312f, 0.048096f, 0.937988f, + 0.051025f, 0.932129f, 0.054565f, 0.926758f, 0.057892f, 0.921387f, 0.062286f, 0.914062f, + 0.065186f, 0.907715f, 0.068726f, 0.901855f, 0.071777f, 0.896484f, 0.074036f, 0.890625f, + 0.077881f, 0.883789f, 0.081482f, 0.877441f, 0.083679f, 0.872070f, 0.085815f, 0.867188f, + 0.088684f, 0.861816f, 0.091553f, 0.854980f, 0.094543f, 0.848633f, 0.097473f, 0.842773f, + 0.099365f, 0.836426f, 0.101074f, 0.831055f, 0.102600f, 0.826172f, 0.105530f, 0.818848f, + 0.107971f, 0.812012f, 0.109802f, 0.804688f, 0.111511f, 0.798340f, 0.112732f, 0.792480f, + 0.114319f, 0.786133f, 0.115051f, 0.780273f, 0.116821f, 0.770996f, 0.118408f, 0.763184f, + 0.119385f, 0.755371f, 0.120850f, 0.748047f, 0.120728f, 0.739746f, 0.121338f, 0.733398f, + 0.120667f, 0.724121f, 0.121277f, 0.712891f, 0.122314f, 0.702637f, 0.121582f, 0.691895f, + 0.120728f, 0.681152f, 0.118896f, 0.669922f, 0.117249f, 0.659668f, 0.116089f, 0.644531f, + 0.113770f, 0.627441f, 0.111023f, 0.611328f, 0.107544f, 0.593750f, 0.102783f, 0.575195f, + 0.096802f, 0.554688f, 0.091309f, 0.524902f, 0.083984f, 0.493652f, 0.074524f, 0.457275f, + 0.062195f, 0.414551f, 0.048340f, 0.349854f, 0.029022f, 0.258545f, 0.005138f, 0.091736f, + 0.000000f, 1.000000f, 0.006630f, 0.995605f, 0.012138f, 0.990234f, 0.016922f, 0.984863f, + 0.022842f, 0.978027f, 0.028015f, 0.971191f, 0.031555f, 0.966309f, 0.037872f, 0.958008f, + 0.042908f, 0.951172f, 0.046295f, 0.946289f, 0.051910f, 0.937500f, 0.056549f, 0.930664f, + 0.060028f, 0.924805f, 0.064087f, 0.918457f, 0.068787f, 0.910156f, 0.073181f, 0.903809f, + 0.076599f, 0.897949f, 0.079407f, 0.892578f, 0.084045f, 0.884766f, 0.087769f, 0.877930f, + 0.091492f, 0.871582f, 0.094360f, 0.865723f, 0.097473f, 0.859863f, 0.099976f, 0.854492f, + 0.103882f, 0.847168f, 0.107056f, 0.840820f, 0.110107f, 0.834961f, 0.112244f, 0.829590f, + 0.115173f, 0.824219f, 0.116638f, 0.818359f, 0.119202f, 0.811035f, 0.122314f, 0.804199f, + 0.124573f, 0.797363f, 0.126953f, 0.791992f, 0.127808f, 0.785645f, 0.129150f, 0.780273f, + 0.131226f, 0.772949f, 0.133179f, 0.765137f, 0.135132f, 0.757324f, 0.135742f, 0.750000f, + 0.136353f, 0.743164f, 0.137329f, 0.735840f, 0.137207f, 0.729004f, 0.137939f, 0.720215f, + 0.138672f, 0.710449f, 0.138672f, 0.700684f, 0.138550f, 0.690430f, 0.137695f, 0.681641f, + 0.136108f, 0.671387f, 0.134399f, 0.661621f, 0.133301f, 0.648926f, 0.131348f, 0.633789f, + 0.129028f, 0.619141f, 0.125244f, 0.603516f, 0.120789f, 0.587402f, 0.115417f, 0.569336f, + 0.109741f, 0.546875f, 0.103027f, 0.519531f, 0.094360f, 0.488770f, 0.083557f, 0.454346f, + 0.069702f, 0.413330f, 0.054138f, 0.347656f, 0.032196f, 0.257812f, 0.005753f, 0.091309f, + 0.000000f, 1.000000f, 0.007626f, 0.995117f, 0.014359f, 0.988770f, 0.020340f, 0.983398f, + 0.027176f, 0.975098f, 0.032959f, 0.968262f, 0.038818f, 0.959961f, 0.044983f, 0.952148f, + 0.049652f, 0.945801f, 0.056732f, 0.936523f, 0.062103f, 0.929199f, 0.066406f, 0.922363f, + 0.070862f, 0.915527f, 0.076416f, 0.907227f, 0.081909f, 0.899414f, 0.085571f, 0.893066f, + 0.088562f, 0.887695f, 0.093628f, 0.879395f, 0.098511f, 0.871582f, 0.103333f, 0.864746f, + 0.106262f, 0.858887f, 0.109497f, 0.853516f, 0.113525f, 0.845703f, 0.117676f, 0.838379f, + 0.120483f, 0.832520f, 0.124146f, 0.826172f, 0.126709f, 0.820801f, 0.128662f, 0.815918f, + 0.131958f, 0.809082f, 0.136108f, 0.801758f, 0.137939f, 0.794922f, 0.140015f, 0.789062f, + 0.142700f, 0.783203f, 0.144409f, 0.777832f, 0.145264f, 0.772461f, 0.148071f, 0.764160f, + 0.150757f, 0.756836f, 0.151855f, 0.750000f, 0.153442f, 0.743164f, 0.154175f, 0.736816f, + 0.154297f, 0.730469f, 0.154907f, 0.724609f, 0.156128f, 0.714355f, 0.156616f, 0.705566f, + 0.157471f, 0.697266f, 0.155762f, 0.687988f, 0.155762f, 0.679688f, 0.154419f, 0.671387f, + 0.152588f, 0.662598f, 0.151489f, 0.649902f, 0.149414f, 0.636719f, 0.147339f, 0.623535f, + 0.143921f, 0.610352f, 0.140015f, 0.596680f, 0.134644f, 0.581055f, 0.128296f, 0.562500f, + 0.122559f, 0.539062f, 0.114868f, 0.513184f, 0.104797f, 0.484619f, 0.092407f, 0.452393f, + 0.077332f, 0.410156f, 0.060272f, 0.344971f, 0.035950f, 0.258545f, 0.006393f, 0.090515f, + 0.000000f, 1.000000f, 0.009056f, 0.994629f, 0.016968f, 0.987305f, 0.024200f, 0.979980f, + 0.032990f, 0.971191f, 0.039520f, 0.962891f, 0.046753f, 0.954102f, 0.053284f, 0.946289f, + 0.059784f, 0.937012f, 0.067017f, 0.928223f, 0.072510f, 0.920410f, 0.078369f, 0.912598f, + 0.084839f, 0.903320f, 0.090271f, 0.895996f, 0.094482f, 0.889160f, 0.100464f, 0.880859f, + 0.106018f, 0.872070f, 0.110352f, 0.864746f, 0.114807f, 0.858398f, 0.118713f, 0.852051f, + 0.123413f, 0.844238f, 0.127930f, 0.836426f, 0.132324f, 0.829102f, 0.135986f, 0.822754f, + 0.138672f, 0.817383f, 0.141602f, 0.812012f, 0.145508f, 0.804688f, 0.149292f, 0.797363f, + 0.152344f, 0.791016f, 0.155640f, 0.785156f, 0.157959f, 0.779785f, 0.159424f, 0.774414f, + 0.160645f, 0.769043f, 0.164795f, 0.761230f, 0.166748f, 0.753906f, 0.168457f, 0.747559f, + 0.170410f, 0.741211f, 0.171509f, 0.735352f, 0.172485f, 0.729004f, 0.172607f, 0.723633f, + 0.173828f, 0.715820f, 0.175415f, 0.707031f, 0.176270f, 0.699707f, 0.176147f, 0.691406f, + 0.175659f, 0.684082f, 0.174683f, 0.677246f, 0.173462f, 0.668945f, 0.171875f, 0.660156f, + 0.171143f, 0.648926f, 0.169189f, 0.637207f, 0.166870f, 0.625977f, 0.164062f, 0.614258f, + 0.159790f, 0.602051f, 0.154175f, 0.589355f, 0.148438f, 0.574219f, 0.143188f, 0.552734f, + 0.136230f, 0.531250f, 0.126953f, 0.507812f, 0.115540f, 0.481201f, 0.101746f, 0.450195f, + 0.086182f, 0.404541f, 0.066711f, 0.342529f, 0.039337f, 0.258057f, 0.007034f, 0.090088f, + 0.000000f, 1.000000f, 0.010162f, 0.994141f, 0.020432f, 0.985352f, 0.030762f, 0.975586f, + 0.038666f, 0.967773f, 0.048370f, 0.956055f, 0.056427f, 0.947754f, 0.064941f, 0.936523f, + 0.072571f, 0.927734f, 0.078918f, 0.919434f, 0.086853f, 0.908691f, 0.094116f, 0.899414f, + 0.099731f, 0.891602f, 0.105408f, 0.884277f, 0.112793f, 0.873535f, 0.118591f, 0.865234f, + 0.124329f, 0.857910f, 0.128418f, 0.850586f, 0.133667f, 0.842773f, 0.138550f, 0.834473f, + 0.143799f, 0.826660f, 0.148926f, 0.819824f, 0.151733f, 0.813477f, 0.155151f, 0.808105f, + 0.159912f, 0.799316f, 0.164307f, 0.792480f, 0.167358f, 0.785645f, 0.171021f, 0.779785f, + 0.173218f, 0.774414f, 0.175293f, 0.769531f, 0.178467f, 0.763184f, 0.182129f, 0.755859f, + 0.183960f, 0.749512f, 0.186279f, 0.742676f, 0.188477f, 0.736816f, 0.189697f, 0.731934f, + 0.190552f, 0.726562f, 0.191162f, 0.721191f, 0.193726f, 0.712891f, 0.194824f, 0.705566f, + 0.195435f, 0.698242f, 0.196533f, 0.691895f, 0.196411f, 0.685059f, 0.195557f, 0.678223f, + 0.194458f, 0.672363f, 0.193237f, 0.666016f, 0.192627f, 0.654297f, 0.191772f, 0.644531f, + 0.190063f, 0.635742f, 0.187500f, 0.625488f, 0.184082f, 0.616211f, 0.180298f, 0.605469f, + 0.175049f, 0.594727f, 0.170166f, 0.580566f, 0.164795f, 0.562500f, 0.158325f, 0.544434f, + 0.149292f, 0.524414f, 0.139404f, 0.503418f, 0.126099f, 0.478271f, 0.111084f, 0.447510f, + 0.094971f, 0.399414f, 0.072998f, 0.340576f, 0.042816f, 0.258545f, 0.007729f, 0.089966f, + 0.000000f, 1.000000f, 0.012421f, 0.993652f, 0.025009f, 0.983398f, 0.037354f, 0.971680f, + 0.048065f, 0.960449f, 0.058807f, 0.949707f, 0.069641f, 0.937500f, 0.078369f, 0.927246f, + 0.085449f, 0.918457f, 0.096130f, 0.905273f, 0.103760f, 0.895508f, 0.110352f, 0.887695f, + 0.118469f, 0.876465f, 0.125854f, 0.866699f, 0.132202f, 0.857910f, 0.138184f, 0.850586f, + 0.144043f, 0.840820f, 0.150757f, 0.832031f, 0.155884f, 0.823730f, 0.161011f, 0.816406f, + 0.165039f, 0.810059f, 0.169556f, 0.802734f, 0.175659f, 0.793457f, 0.179565f, 0.786133f, + 0.184204f, 0.779297f, 0.186768f, 0.773926f, 0.189453f, 0.768066f, 0.192261f, 0.762695f, + 0.197144f, 0.754395f, 0.199829f, 0.748047f, 0.203247f, 0.742188f, 0.205322f, 0.736816f, + 0.207397f, 0.731445f, 0.208374f, 0.726562f, 0.210205f, 0.721191f, 0.212036f, 0.713867f, + 0.214478f, 0.707520f, 0.215820f, 0.701172f, 0.217163f, 0.694824f, 0.217041f, 0.688965f, + 0.217285f, 0.683105f, 0.216675f, 0.677734f, 0.216064f, 0.671875f, 0.216431f, 0.665039f, + 0.215942f, 0.656250f, 0.214355f, 0.647949f, 0.214233f, 0.640625f, 0.211914f, 0.631836f, + 0.209229f, 0.624023f, 0.205200f, 0.615234f, 0.200928f, 0.606445f, 0.197144f, 0.597168f, + 0.192627f, 0.582520f, 0.187134f, 0.567871f, 0.180542f, 0.553223f, 0.172729f, 0.537109f, + 0.163452f, 0.520020f, 0.151001f, 0.499268f, 0.137207f, 0.475586f, 0.122070f, 0.438721f, + 0.103760f, 0.395020f, 0.079346f, 0.339355f, 0.046722f, 0.260010f, 0.008469f, 0.090271f, + 0.000000f, 1.000000f, 0.017120f, 0.990723f, 0.032562f, 0.978516f, 0.046265f, 0.965820f, + 0.059692f, 0.953125f, 0.073059f, 0.938965f, 0.083679f, 0.927734f, 0.094666f, 0.915039f, + 0.105530f, 0.902832f, 0.114868f, 0.892090f, 0.124268f, 0.879883f, 0.132935f, 0.869141f, + 0.140137f, 0.859863f, 0.146851f, 0.850586f, 0.155396f, 0.839355f, 0.162842f, 0.829590f, + 0.168945f, 0.821777f, 0.174316f, 0.813965f, 0.180664f, 0.804688f, 0.186035f, 0.795410f, + 0.191772f, 0.787598f, 0.196289f, 0.780273f, 0.199219f, 0.774414f, 0.203857f, 0.767578f, + 0.208252f, 0.759766f, 0.213501f, 0.751953f, 0.216309f, 0.745605f, 0.219971f, 0.739258f, + 0.222778f, 0.733398f, 0.224731f, 0.728516f, 0.226685f, 0.724121f, 0.229614f, 0.717773f, + 0.232178f, 0.711426f, 0.234375f, 0.705078f, 0.236328f, 0.699219f, 0.237305f, 0.693359f, + 0.238159f, 0.688477f, 0.239014f, 0.684082f, 0.238647f, 0.679199f, 0.238525f, 0.674805f, + 0.239624f, 0.667480f, 0.239746f, 0.660156f, 0.240112f, 0.653320f, 0.239502f, 0.646484f, + 0.237793f, 0.640137f, 0.236084f, 0.633301f, 0.234131f, 0.627441f, 0.230347f, 0.620117f, + 0.227051f, 0.613770f, 0.223999f, 0.604492f, 0.220581f, 0.593750f, 0.216064f, 0.582520f, + 0.211304f, 0.571289f, 0.204102f, 0.559082f, 0.196045f, 0.545410f, 0.187378f, 0.530762f, + 0.176147f, 0.514160f, 0.163452f, 0.495605f, 0.150024f, 0.466064f, 0.133667f, 0.432373f, + 0.112976f, 0.392334f, 0.085876f, 0.338867f, 0.050323f, 0.260742f, 0.009201f, 0.090271f, + 0.000000f, 1.000000f, 0.021469f, 0.988770f, 0.040436f, 0.975098f, 0.058228f, 0.959473f, + 0.075134f, 0.942871f, 0.089233f, 0.928711f, 0.104126f, 0.913574f, 0.114685f, 0.901855f, + 0.128662f, 0.885742f, 0.138184f, 0.874023f, 0.146973f, 0.863281f, 0.158691f, 0.849609f, + 0.166992f, 0.839355f, 0.174438f, 0.829590f, 0.181763f, 0.819336f, 0.189941f, 0.808594f, + 0.196533f, 0.798828f, 0.202393f, 0.790527f, 0.207764f, 0.782715f, 0.213257f, 0.774902f, + 0.219727f, 0.765625f, 0.224731f, 0.757324f, 0.229248f, 0.750000f, 0.233032f, 0.743164f, + 0.236694f, 0.737305f, 0.239990f, 0.731445f, 0.243652f, 0.724609f, 0.246704f, 0.717773f, + 0.250732f, 0.711426f, 0.252686f, 0.705566f, 0.255371f, 0.699707f, 0.257080f, 0.694824f, + 0.258789f, 0.689941f, 0.259766f, 0.685547f, 0.260498f, 0.682129f, 0.262207f, 0.675293f, + 0.263428f, 0.668945f, 0.263916f, 0.663574f, 0.264893f, 0.658203f, 0.265137f, 0.652832f, + 0.264404f, 0.647461f, 0.263672f, 0.643066f, 0.262207f, 0.637695f, 0.260742f, 0.632812f, + 0.258301f, 0.627930f, 0.255859f, 0.621582f, 0.254883f, 0.613770f, 0.251953f, 0.605957f, + 0.249023f, 0.597168f, 0.244507f, 0.588867f, 0.239746f, 0.580078f, 0.234863f, 0.570801f, + 0.227783f, 0.561035f, 0.221069f, 0.550293f, 0.211548f, 0.539062f, 0.200928f, 0.525391f, + 0.190674f, 0.505371f, 0.177734f, 0.483398f, 0.163086f, 0.458496f, 0.144531f, 0.428223f, + 0.121338f, 0.389893f, 0.092224f, 0.339111f, 0.053864f, 0.261963f, 0.009865f, 0.090210f, + 0.000000f, 1.000000f, 0.027863f, 0.986328f, 0.051727f, 0.968750f, 0.073486f, 0.950195f, + 0.094482f, 0.931152f, 0.112671f, 0.913086f, 0.127808f, 0.897461f, 0.142578f, 0.880859f, + 0.155762f, 0.867188f, 0.165771f, 0.854492f, 0.178467f, 0.839355f, 0.189209f, 0.826660f, + 0.197021f, 0.816406f, 0.205200f, 0.806152f, 0.213867f, 0.794434f, 0.221924f, 0.783691f, + 0.229370f, 0.773926f, 0.234741f, 0.765137f, 0.239014f, 0.757812f, 0.245483f, 0.749023f, + 0.250977f, 0.740234f, 0.255859f, 0.732422f, 0.261719f, 0.724609f, 0.264160f, 0.718750f, + 0.267578f, 0.712402f, 0.270752f, 0.706543f, 0.273193f, 0.700684f, 0.276855f, 0.694336f, + 0.278809f, 0.688965f, 0.281982f, 0.682129f, 0.284180f, 0.677246f, 0.285645f, 0.671875f, + 0.287109f, 0.666992f, 0.288086f, 0.662598f, 0.288818f, 0.658203f, 0.289795f, 0.654297f, + 0.289551f, 0.649414f, 0.288574f, 0.645508f, 0.288330f, 0.641113f, 0.289551f, 0.635254f, + 0.288574f, 0.629883f, 0.287354f, 0.624512f, 0.286621f, 0.619141f, 0.285400f, 0.613281f, + 0.282471f, 0.607910f, 0.280273f, 0.602539f, 0.277344f, 0.596680f, 0.273926f, 0.590820f, + 0.268799f, 0.583496f, 0.263916f, 0.577637f, 0.257568f, 0.570312f, 0.251465f, 0.562012f, + 0.245728f, 0.551270f, 0.237549f, 0.539551f, 0.228638f, 0.526855f, 0.218628f, 0.512207f, + 0.206299f, 0.495850f, 0.192383f, 0.477051f, 0.175415f, 0.453857f, 0.154907f, 0.425537f, + 0.129883f, 0.389404f, 0.098389f, 0.339600f, 0.059204f, 0.255127f, 0.010590f, 0.091003f, + 0.000000f, 1.000000f, 0.038086f, 0.981934f, 0.070557f, 0.958496f, 0.097351f, 0.936523f, + 0.120850f, 0.914551f, 0.139771f, 0.896484f, 0.159546f, 0.875977f, 0.174927f, 0.859375f, + 0.188965f, 0.842773f, 0.202393f, 0.827637f, 0.213989f, 0.813477f, 0.224365f, 0.800293f, + 0.232910f, 0.789062f, 0.242065f, 0.776855f, 0.250244f, 0.766113f, 0.258301f, 0.755371f, + 0.264893f, 0.745605f, 0.271484f, 0.736328f, 0.276367f, 0.728516f, 0.281738f, 0.720215f, + 0.286133f, 0.712891f, 0.290283f, 0.705566f, 0.293457f, 0.698730f, 0.298340f, 0.691406f, + 0.300781f, 0.685059f, 0.303467f, 0.679199f, 0.306396f, 0.672852f, 0.309814f, 0.666992f, + 0.311523f, 0.661621f, 0.312256f, 0.657227f, 0.314453f, 0.651855f, 0.315674f, 0.647461f, + 0.316162f, 0.643555f, 0.317871f, 0.638672f, 0.317383f, 0.635254f, 0.317627f, 0.631348f, + 0.317627f, 0.627930f, 0.316895f, 0.623535f, 0.315674f, 0.619629f, 0.315918f, 0.614746f, + 0.314209f, 0.610840f, 0.312012f, 0.605957f, 0.310303f, 0.602051f, 0.308350f, 0.596680f, + 0.305664f, 0.592285f, 0.302002f, 0.586914f, 0.298584f, 0.581543f, 0.295166f, 0.575684f, + 0.290039f, 0.569336f, 0.285400f, 0.562988f, 0.279297f, 0.556152f, 0.272705f, 0.547852f, + 0.264648f, 0.539062f, 0.255615f, 0.529297f, 0.244995f, 0.517578f, 0.234375f, 0.505371f, + 0.220093f, 0.490234f, 0.204834f, 0.473145f, 0.186279f, 0.451660f, 0.165039f, 0.423828f, + 0.139038f, 0.386963f, 0.106506f, 0.334961f, 0.063965f, 0.250977f, 0.011330f, 0.091614f, + 0.000000f, 1.000000f, 0.045105f, 0.979004f, 0.081604f, 0.953125f, 0.112366f, 0.928223f, + 0.138062f, 0.904297f, 0.159912f, 0.882812f, 0.179199f, 0.862793f, 0.195801f, 0.844727f, + 0.210449f, 0.828125f, 0.224609f, 0.812012f, 0.236084f, 0.797852f, 0.247192f, 0.784180f, + 0.256104f, 0.771973f, 0.265137f, 0.759766f, 0.273193f, 0.749023f, 0.280273f, 0.738770f, + 0.286621f, 0.729004f, 0.292725f, 0.719727f, 0.298340f, 0.710938f, 0.303711f, 0.702637f, + 0.308350f, 0.694824f, 0.312500f, 0.687500f, 0.316650f, 0.680176f, 0.319336f, 0.674316f, + 0.323242f, 0.667480f, 0.325928f, 0.661621f, 0.328613f, 0.655762f, 0.330322f, 0.650391f, + 0.333008f, 0.644531f, 0.334229f, 0.640137f, 0.336670f, 0.634766f, 0.337158f, 0.630371f, + 0.337646f, 0.626465f, 0.338867f, 0.622070f, 0.338867f, 0.618164f, 0.338623f, 0.614258f, + 0.339355f, 0.610352f, 0.339111f, 0.606445f, 0.337158f, 0.602539f, 0.336914f, 0.598145f, + 0.335449f, 0.594238f, 0.333984f, 0.590332f, 0.331787f, 0.585938f, 0.330322f, 0.582031f, + 0.327148f, 0.576660f, 0.323486f, 0.572266f, 0.320312f, 0.567383f, 0.316406f, 0.561523f, + 0.311768f, 0.555664f, 0.305908f, 0.549316f, 0.300293f, 0.542969f, 0.293457f, 0.534668f, + 0.285645f, 0.526367f, 0.277100f, 0.517090f, 0.267334f, 0.506836f, 0.255615f, 0.493896f, + 0.242676f, 0.478760f, 0.227295f, 0.461426f, 0.209229f, 0.440674f, 0.187744f, 0.413086f, + 0.160889f, 0.377686f, 0.126831f, 0.327637f, 0.081909f, 0.249390f, 0.020020f, 0.096985f, + 0.000000f, 1.000000f, 0.045471f, 0.978516f, 0.081543f, 0.953125f, 0.111755f, 0.928223f, + 0.138550f, 0.904297f, 0.161499f, 0.882324f, 0.180908f, 0.861816f, 0.198364f, 0.843262f, + 0.213135f, 0.826172f, 0.227173f, 0.810059f, 0.240112f, 0.794922f, 0.250488f, 0.781738f, + 0.260010f, 0.768555f, 0.269775f, 0.756348f, 0.278320f, 0.744629f, 0.285400f, 0.734375f, + 0.293457f, 0.723633f, 0.299561f, 0.714355f, 0.305908f, 0.705078f, 0.310791f, 0.697266f, + 0.315918f, 0.688965f, 0.321045f, 0.681152f, 0.325684f, 0.673340f, 0.328125f, 0.666992f, + 0.332275f, 0.660156f, 0.335449f, 0.653809f, 0.339111f, 0.647461f, 0.341064f, 0.642090f, + 0.345215f, 0.635254f, 0.346680f, 0.630371f, 0.348389f, 0.625000f, 0.350098f, 0.620117f, + 0.350586f, 0.615723f, 0.352295f, 0.611328f, 0.353271f, 0.606934f, 0.353271f, 0.602539f, + 0.353760f, 0.598633f, 0.354736f, 0.594238f, 0.353760f, 0.589844f, 0.353027f, 0.585938f, + 0.352783f, 0.581543f, 0.351807f, 0.577148f, 0.349609f, 0.572754f, 0.348877f, 0.567871f, + 0.346191f, 0.562988f, 0.343994f, 0.558105f, 0.340332f, 0.552734f, 0.337402f, 0.546875f, + 0.334229f, 0.541016f, 0.328125f, 0.534668f, 0.324463f, 0.527832f, 0.318848f, 0.519531f, + 0.311523f, 0.510742f, 0.303467f, 0.500977f, 0.294678f, 0.490723f, 0.285400f, 0.478271f, + 0.272705f, 0.463623f, 0.258545f, 0.446533f, 0.241699f, 0.425537f, 0.221436f, 0.399414f, + 0.196045f, 0.365479f, 0.163086f, 0.318359f, 0.116211f, 0.243164f, 0.045105f, 0.094666f, + 0.000000f, 1.000000f, 0.044952f, 0.979004f, 0.081909f, 0.953125f, 0.113342f, 0.927246f, + 0.139648f, 0.903320f, 0.162842f, 0.881348f, 0.181763f, 0.861328f, 0.200806f, 0.841797f, + 0.216553f, 0.823730f, 0.229736f, 0.808105f, 0.242676f, 0.792969f, 0.253906f, 0.778809f, + 0.265381f, 0.765137f, 0.274658f, 0.752441f, 0.283936f, 0.740723f, 0.291748f, 0.729980f, + 0.299561f, 0.719238f, 0.306885f, 0.708984f, 0.312744f, 0.700195f, 0.318115f, 0.691406f, + 0.324219f, 0.682617f, 0.329346f, 0.674316f, 0.333496f, 0.666992f, 0.338135f, 0.659668f, + 0.342041f, 0.652344f, 0.345703f, 0.645508f, 0.349365f, 0.639160f, 0.351807f, 0.633301f, + 0.355713f, 0.626953f, 0.358154f, 0.621094f, 0.360352f, 0.615234f, 0.363525f, 0.609375f, + 0.363770f, 0.604980f, 0.366211f, 0.600098f, 0.367432f, 0.595215f, 0.368652f, 0.590820f, + 0.369141f, 0.586426f, 0.370605f, 0.582031f, 0.370361f, 0.577637f, 0.370117f, 0.572754f, + 0.370117f, 0.567871f, 0.369629f, 0.563477f, 0.368652f, 0.558594f, 0.367676f, 0.553711f, + 0.367188f, 0.548340f, 0.364502f, 0.542969f, 0.362061f, 0.537598f, 0.359863f, 0.531738f, + 0.357178f, 0.524902f, 0.353760f, 0.518066f, 0.348877f, 0.510254f, 0.343994f, 0.502441f, + 0.338135f, 0.493408f, 0.331543f, 0.483887f, 0.323242f, 0.472900f, 0.314697f, 0.460693f, + 0.303467f, 0.446289f, 0.291504f, 0.429443f, 0.275879f, 0.409424f, 0.256592f, 0.383545f, + 0.233032f, 0.351562f, 0.200806f, 0.305908f, 0.154297f, 0.234253f, 0.076416f, 0.092346f, + 0.000000f, 1.000000f, 0.044891f, 0.979004f, 0.082153f, 0.953125f, 0.114136f, 0.926758f, + 0.141357f, 0.902344f, 0.163818f, 0.880371f, 0.185181f, 0.859375f, 0.203003f, 0.839844f, + 0.220337f, 0.821777f, 0.233521f, 0.805176f, 0.246460f, 0.790039f, 0.259277f, 0.774902f, + 0.270752f, 0.761719f, 0.280029f, 0.748535f, 0.289551f, 0.736328f, 0.298096f, 0.725098f, + 0.306885f, 0.713867f, 0.312988f, 0.704102f, 0.319336f, 0.694336f, 0.326172f, 0.684570f, + 0.333008f, 0.675781f, 0.337402f, 0.667480f, 0.342773f, 0.659668f, 0.347168f, 0.651855f, + 0.352295f, 0.644531f, 0.357178f, 0.636719f, 0.361572f, 0.629883f, 0.364014f, 0.623535f, + 0.367676f, 0.617188f, 0.371094f, 0.610352f, 0.374023f, 0.604492f, 0.377441f, 0.598633f, + 0.378418f, 0.593262f, 0.381104f, 0.587891f, 0.382568f, 0.582520f, 0.384521f, 0.577637f, + 0.386230f, 0.572754f, 0.387451f, 0.567871f, 0.387695f, 0.563477f, 0.387695f, 0.558594f, + 0.388184f, 0.553223f, 0.388672f, 0.548340f, 0.388672f, 0.543457f, 0.387451f, 0.538086f, + 0.387207f, 0.532715f, 0.385254f, 0.526855f, 0.384521f, 0.521484f, 0.381592f, 0.515137f, + 0.379639f, 0.508301f, 0.376709f, 0.501953f, 0.372803f, 0.494385f, 0.370361f, 0.486572f, + 0.364746f, 0.477295f, 0.358887f, 0.467773f, 0.351318f, 0.456543f, 0.343750f, 0.444336f, + 0.334229f, 0.430420f, 0.322754f, 0.413086f, 0.309326f, 0.392578f, 0.291016f, 0.368408f, + 0.269531f, 0.336670f, 0.239380f, 0.292969f, 0.194336f, 0.225342f, 0.113770f, 0.089355f, + 0.000000f, 1.000000f, 0.045258f, 0.979004f, 0.082520f, 0.953125f, 0.114197f, 0.927246f, + 0.142090f, 0.902344f, 0.165527f, 0.879395f, 0.186890f, 0.857910f, 0.205933f, 0.838379f, + 0.222778f, 0.820312f, 0.237427f, 0.802734f, 0.250488f, 0.787109f, 0.263428f, 0.771973f, + 0.274414f, 0.757812f, 0.284912f, 0.744629f, 0.296143f, 0.731934f, 0.303467f, 0.720215f, + 0.312500f, 0.708984f, 0.320312f, 0.698242f, 0.327881f, 0.687988f, 0.334717f, 0.678223f, + 0.341553f, 0.668945f, 0.347168f, 0.660156f, 0.352783f, 0.651367f, 0.359131f, 0.642578f, + 0.362793f, 0.635254f, 0.368896f, 0.626953f, 0.372070f, 0.620117f, 0.376221f, 0.613281f, + 0.378906f, 0.606934f, 0.383057f, 0.600098f, 0.387207f, 0.593750f, 0.390381f, 0.587402f, + 0.392822f, 0.581543f, 0.395020f, 0.576172f, 0.397217f, 0.570801f, 0.399414f, 0.565430f, + 0.400635f, 0.560547f, 0.403564f, 0.555176f, 0.404541f, 0.550293f, 0.405762f, 0.545410f, + 0.406738f, 0.539551f, 0.406494f, 0.534180f, 0.406738f, 0.529297f, 0.406494f, 0.523926f, + 0.407715f, 0.517578f, 0.406494f, 0.512207f, 0.406006f, 0.505371f, 0.404541f, 0.499023f, + 0.403564f, 0.492432f, 0.401123f, 0.485107f, 0.398438f, 0.477783f, 0.395508f, 0.468994f, + 0.390625f, 0.459717f, 0.385986f, 0.450439f, 0.380859f, 0.439697f, 0.374023f, 0.427002f, + 0.365234f, 0.413086f, 0.355957f, 0.396484f, 0.343018f, 0.376709f, 0.327637f, 0.352539f, + 0.307373f, 0.322510f, 0.278320f, 0.280762f, 0.236084f, 0.215210f, 0.155151f, 0.085266f, + 0.000000f, 1.000000f, 0.045105f, 0.979004f, 0.082703f, 0.952637f, 0.115356f, 0.926270f, + 0.142578f, 0.901855f, 0.167725f, 0.877930f, 0.188232f, 0.856934f, 0.208618f, 0.836426f, + 0.225220f, 0.817871f, 0.240601f, 0.800293f, 0.254639f, 0.784180f, 0.268311f, 0.768555f, + 0.279785f, 0.753906f, 0.291016f, 0.740234f, 0.301758f, 0.727051f, 0.311768f, 0.714355f, + 0.320068f, 0.702637f, 0.328857f, 0.691406f, 0.336670f, 0.681152f, 0.343994f, 0.670898f, + 0.350098f, 0.661133f, 0.356201f, 0.652344f, 0.362061f, 0.643555f, 0.368652f, 0.634766f, + 0.373291f, 0.626953f, 0.378418f, 0.618652f, 0.383301f, 0.611328f, 0.388184f, 0.604004f, + 0.392090f, 0.597168f, 0.395508f, 0.590332f, 0.399414f, 0.583496f, 0.402832f, 0.576660f, + 0.407227f, 0.570312f, 0.409424f, 0.564453f, 0.412598f, 0.558594f, 0.415039f, 0.553223f, + 0.417725f, 0.547363f, 0.420654f, 0.541504f, 0.421631f, 0.536133f, 0.423584f, 0.531250f, + 0.424805f, 0.525391f, 0.425781f, 0.519531f, 0.426758f, 0.514160f, 0.427246f, 0.508789f, + 0.427490f, 0.501953f, 0.427734f, 0.496338f, 0.427002f, 0.489746f, 0.427490f, 0.483643f, + 0.426025f, 0.476318f, 0.425293f, 0.468750f, 0.423096f, 0.461182f, 0.420410f, 0.452148f, + 0.419434f, 0.443604f, 0.414307f, 0.433105f, 0.408691f, 0.422363f, 0.403564f, 0.409424f, + 0.396240f, 0.395752f, 0.387207f, 0.378662f, 0.377197f, 0.360352f, 0.364014f, 0.337646f, + 0.343506f, 0.307617f, 0.318604f, 0.267090f, 0.277588f, 0.205688f, 0.199707f, 0.082336f, + 0.000000f, 1.000000f, 0.045105f, 0.979004f, 0.083618f, 0.952148f, 0.116028f, 0.925781f, + 0.143921f, 0.900879f, 0.168701f, 0.877930f, 0.191162f, 0.854980f, 0.210693f, 0.834473f, + 0.228516f, 0.815918f, 0.244507f, 0.797363f, 0.259277f, 0.780762f, 0.273682f, 0.764160f, + 0.285889f, 0.749023f, 0.297852f, 0.734863f, 0.308350f, 0.721680f, 0.318359f, 0.708984f, + 0.326904f, 0.697266f, 0.336182f, 0.685547f, 0.343994f, 0.674805f, 0.350586f, 0.665039f, + 0.358398f, 0.654785f, 0.365234f, 0.645020f, 0.371826f, 0.635742f, 0.378418f, 0.626953f, + 0.384277f, 0.618164f, 0.389648f, 0.610352f, 0.395020f, 0.602051f, 0.400879f, 0.593750f, + 0.404053f, 0.586914f, 0.409180f, 0.579590f, 0.414795f, 0.571777f, 0.416992f, 0.565430f, + 0.421387f, 0.558594f, 0.424316f, 0.552246f, 0.427979f, 0.545898f, 0.431152f, 0.540039f, + 0.433105f, 0.534180f, 0.436035f, 0.528320f, 0.439209f, 0.522461f, 0.440918f, 0.517090f, + 0.443115f, 0.511230f, 0.444580f, 0.504883f, 0.446533f, 0.498535f, 0.446777f, 0.493164f, + 0.448975f, 0.486572f, 0.449707f, 0.479980f, 0.449463f, 0.474121f, 0.449219f, 0.467041f, + 0.449951f, 0.459473f, 0.449219f, 0.451904f, 0.447754f, 0.444092f, 0.446045f, 0.435059f, + 0.444092f, 0.425537f, 0.440918f, 0.415039f, 0.437256f, 0.404785f, 0.433350f, 0.392090f, + 0.427002f, 0.378174f, 0.419678f, 0.362549f, 0.409668f, 0.343262f, 0.398438f, 0.320557f, + 0.381104f, 0.292236f, 0.357910f, 0.254395f, 0.320557f, 0.194824f, 0.244629f, 0.078430f, + 0.000000f, 1.000000f, 0.045349f, 0.979004f, 0.083618f, 0.952148f, 0.116882f, 0.925781f, + 0.145386f, 0.899902f, 0.171143f, 0.875977f, 0.194336f, 0.853516f, 0.214111f, 0.832520f, + 0.232422f, 0.812500f, 0.249756f, 0.793457f, 0.263916f, 0.776855f, 0.278320f, 0.760254f, + 0.291260f, 0.745117f, 0.303467f, 0.730957f, 0.313232f, 0.717773f, 0.325439f, 0.704102f, + 0.333984f, 0.692383f, 0.343750f, 0.680176f, 0.351807f, 0.668945f, 0.359131f, 0.658691f, + 0.367188f, 0.647461f, 0.374512f, 0.637695f, 0.382568f, 0.627441f, 0.387939f, 0.618652f, + 0.395752f, 0.608887f, 0.400391f, 0.601074f, 0.406494f, 0.592285f, 0.411865f, 0.584473f, + 0.416748f, 0.576660f, 0.420166f, 0.569824f, 0.427246f, 0.561523f, 0.430420f, 0.554199f, + 0.435791f, 0.546875f, 0.439453f, 0.540039f, 0.442627f, 0.533691f, 0.446777f, 0.527344f, + 0.449951f, 0.520996f, 0.452881f, 0.514648f, 0.455566f, 0.508789f, 0.458984f, 0.502441f, + 0.460938f, 0.497070f, 0.463135f, 0.490479f, 0.466309f, 0.483398f, 0.467285f, 0.477783f, + 0.469238f, 0.471436f, 0.469971f, 0.464355f, 0.471680f, 0.457275f, 0.471436f, 0.450439f, + 0.473389f, 0.443115f, 0.473145f, 0.434814f, 0.472656f, 0.426514f, 0.472168f, 0.417969f, + 0.470459f, 0.408447f, 0.469238f, 0.398438f, 0.466797f, 0.387451f, 0.462646f, 0.375000f, + 0.458496f, 0.360840f, 0.451660f, 0.345459f, 0.443848f, 0.326416f, 0.432129f, 0.305420f, + 0.418701f, 0.276855f, 0.396973f, 0.240356f, 0.362061f, 0.183716f, 0.291260f, 0.074280f, + 0.000000f, 1.000000f, 0.045197f, 0.979004f, 0.083923f, 0.952148f, 0.117310f, 0.925293f, + 0.146118f, 0.899902f, 0.172729f, 0.875000f, 0.196045f, 0.851562f, 0.216919f, 0.830078f, + 0.235474f, 0.810059f, 0.252930f, 0.791504f, 0.268555f, 0.773926f, 0.282227f, 0.757324f, + 0.296631f, 0.741699f, 0.308594f, 0.727051f, 0.319580f, 0.712891f, 0.330078f, 0.699707f, + 0.341064f, 0.686523f, 0.350830f, 0.674316f, 0.359375f, 0.662598f, 0.369385f, 0.650879f, + 0.377441f, 0.639648f, 0.384521f, 0.629395f, 0.391357f, 0.620117f, 0.398682f, 0.610352f, + 0.406006f, 0.600586f, 0.411133f, 0.592285f, 0.417725f, 0.583008f, 0.424561f, 0.574219f, + 0.430664f, 0.565430f, 0.434814f, 0.558105f, 0.439453f, 0.550781f, 0.445312f, 0.542480f, + 0.450439f, 0.535156f, 0.454102f, 0.528320f, 0.458008f, 0.520996f, 0.462646f, 0.514160f, + 0.466797f, 0.507324f, 0.469238f, 0.500977f, 0.473145f, 0.494385f, 0.476807f, 0.488037f, + 0.479492f, 0.481934f, 0.482666f, 0.476074f, 0.484619f, 0.468506f, 0.487549f, 0.461670f, + 0.489990f, 0.455078f, 0.491943f, 0.448486f, 0.493652f, 0.440918f, 0.494873f, 0.434082f, + 0.495850f, 0.425781f, 0.496338f, 0.418213f, 0.497070f, 0.409668f, 0.497314f, 0.400635f, + 0.496826f, 0.390869f, 0.496094f, 0.380615f, 0.492188f, 0.369629f, 0.491455f, 0.357178f, + 0.487793f, 0.343506f, 0.482666f, 0.327881f, 0.476074f, 0.309814f, 0.467529f, 0.288818f, + 0.453857f, 0.262451f, 0.435303f, 0.226807f, 0.404053f, 0.174072f, 0.338623f, 0.069580f, + 0.000000f, 1.000000f, 0.044922f, 0.979004f, 0.084167f, 0.952148f, 0.118835f, 0.923828f, + 0.148438f, 0.897949f, 0.174683f, 0.873047f, 0.198853f, 0.849609f, 0.220459f, 0.828125f, + 0.238281f, 0.808105f, 0.256836f, 0.788574f, 0.272705f, 0.770996f, 0.287598f, 0.753906f, + 0.301270f, 0.737793f, 0.313965f, 0.722656f, 0.326660f, 0.707520f, 0.337646f, 0.693848f, + 0.348389f, 0.680664f, 0.359131f, 0.667480f, 0.368652f, 0.655762f, 0.377441f, 0.644043f, + 0.385986f, 0.632812f, 0.394043f, 0.622070f, 0.401123f, 0.611816f, 0.409912f, 0.601074f, + 0.416504f, 0.591797f, 0.423584f, 0.582031f, 0.429932f, 0.573242f, 0.437012f, 0.563965f, + 0.442627f, 0.555664f, 0.447998f, 0.547363f, 0.453613f, 0.539062f, 0.458984f, 0.531250f, + 0.464355f, 0.522949f, 0.469238f, 0.515625f, 0.474121f, 0.507812f, 0.478271f, 0.500977f, + 0.483154f, 0.493652f, 0.487549f, 0.486816f, 0.491211f, 0.479980f, 0.493408f, 0.474121f, + 0.497559f, 0.467285f, 0.501953f, 0.460449f, 0.504395f, 0.453125f, 0.507324f, 0.446289f, + 0.510254f, 0.439209f, 0.512695f, 0.432129f, 0.514648f, 0.424561f, 0.516602f, 0.417480f, + 0.519043f, 0.409424f, 0.520508f, 0.401367f, 0.521484f, 0.392334f, 0.521973f, 0.384033f, + 0.522461f, 0.373535f, 0.521484f, 0.363525f, 0.520996f, 0.352783f, 0.520020f, 0.340332f, + 0.517090f, 0.326904f, 0.513184f, 0.311279f, 0.507812f, 0.293457f, 0.500488f, 0.273193f, + 0.489746f, 0.247192f, 0.474121f, 0.213501f, 0.446777f, 0.163452f, 0.384521f, 0.065186f, + 0.000000f, 1.000000f, 0.045074f, 0.979004f, 0.084778f, 0.951660f, 0.119507f, 0.923828f, + 0.150513f, 0.896484f, 0.177490f, 0.871582f, 0.201416f, 0.848145f, 0.222900f, 0.826172f, + 0.241821f, 0.805664f, 0.259521f, 0.786621f, 0.276855f, 0.767578f, 0.292725f, 0.750488f, + 0.307617f, 0.733398f, 0.320312f, 0.717773f, 0.333252f, 0.702637f, 0.345215f, 0.688477f, + 0.355469f, 0.674805f, 0.366699f, 0.662109f, 0.377686f, 0.648926f, 0.386719f, 0.637207f, + 0.395508f, 0.625488f, 0.404053f, 0.614258f, 0.412598f, 0.603516f, 0.420654f, 0.592773f, + 0.427246f, 0.583008f, 0.435547f, 0.572754f, 0.442627f, 0.562988f, 0.449219f, 0.554199f, + 0.455811f, 0.544922f, 0.461914f, 0.536133f, 0.467529f, 0.527832f, 0.472656f, 0.519531f, + 0.479492f, 0.511230f, 0.484619f, 0.502930f, 0.489990f, 0.495361f, 0.493896f, 0.488281f, + 0.500488f, 0.479980f, 0.502930f, 0.473389f, 0.508301f, 0.466064f, 0.512695f, 0.458984f, + 0.516113f, 0.451904f, 0.520996f, 0.445068f, 0.524902f, 0.437988f, 0.527832f, 0.430664f, + 0.529785f, 0.423584f, 0.532715f, 0.416260f, 0.536621f, 0.408447f, 0.538574f, 0.400635f, + 0.541504f, 0.392578f, 0.543457f, 0.384277f, 0.544922f, 0.375488f, 0.546387f, 0.366455f, + 0.547852f, 0.356445f, 0.547852f, 0.346924f, 0.547852f, 0.335693f, 0.546387f, 0.322998f, + 0.546387f, 0.309326f, 0.542969f, 0.294922f, 0.539551f, 0.277588f, 0.533203f, 0.257080f, + 0.523926f, 0.233521f, 0.510254f, 0.201050f, 0.485596f, 0.152466f, 0.430420f, 0.061676f, + 0.000000f, 1.000000f, 0.045410f, 0.979004f, 0.085999f, 0.950684f, 0.120483f, 0.923340f, + 0.151611f, 0.895996f, 0.178467f, 0.871094f, 0.203125f, 0.847168f, 0.225220f, 0.824707f, + 0.246094f, 0.803223f, 0.263916f, 0.783691f, 0.281982f, 0.764160f, 0.297363f, 0.746582f, + 0.312256f, 0.729492f, 0.326416f, 0.712891f, 0.338135f, 0.698242f, 0.351807f, 0.683105f, + 0.363281f, 0.668945f, 0.375000f, 0.655273f, 0.385010f, 0.642578f, 0.394287f, 0.630371f, + 0.405029f, 0.617676f, 0.413818f, 0.606445f, 0.422607f, 0.594727f, 0.430664f, 0.583984f, + 0.438232f, 0.573730f, 0.446777f, 0.563477f, 0.453857f, 0.553223f, 0.460938f, 0.543945f, + 0.467773f, 0.534668f, 0.475586f, 0.524902f, 0.480469f, 0.516602f, 0.488037f, 0.507324f, + 0.494385f, 0.498779f, 0.500000f, 0.490723f, 0.504883f, 0.482666f, 0.510254f, 0.474609f, + 0.516113f, 0.466553f, 0.520996f, 0.458984f, 0.524902f, 0.451904f, 0.530273f, 0.444336f, + 0.535156f, 0.436768f, 0.538574f, 0.429688f, 0.543945f, 0.422363f, 0.547852f, 0.415283f, + 0.549805f, 0.407471f, 0.554199f, 0.399902f, 0.558105f, 0.391846f, 0.560547f, 0.384521f, + 0.563477f, 0.375977f, 0.566895f, 0.367432f, 0.569336f, 0.358398f, 0.569824f, 0.349854f, + 0.572754f, 0.339600f, 0.573242f, 0.329834f, 0.575195f, 0.318115f, 0.574707f, 0.306396f, + 0.574707f, 0.292969f, 0.572754f, 0.278564f, 0.569336f, 0.261963f, 0.564453f, 0.241943f, + 0.557617f, 0.218750f, 0.544922f, 0.188232f, 0.523926f, 0.142822f, 0.474609f, 0.057129f, + 0.000000f, 1.000000f, 0.045532f, 0.978516f, 0.085083f, 0.951660f, 0.122375f, 0.921387f, + 0.152954f, 0.895508f, 0.179932f, 0.870117f, 0.205566f, 0.845215f, 0.227783f, 0.822754f, + 0.248169f, 0.801270f, 0.269287f, 0.779785f, 0.286377f, 0.760742f, 0.302490f, 0.742676f, + 0.318359f, 0.725098f, 0.332520f, 0.708496f, 0.346680f, 0.692383f, 0.358643f, 0.677734f, + 0.371338f, 0.662598f, 0.382568f, 0.648926f, 0.393311f, 0.635742f, 0.403564f, 0.622559f, + 0.414551f, 0.609863f, 0.422852f, 0.598633f, 0.432861f, 0.586914f, 0.440918f, 0.575684f, + 0.450928f, 0.563965f, 0.458740f, 0.553711f, 0.467529f, 0.543457f, 0.474609f, 0.533203f, + 0.481689f, 0.523438f, 0.489258f, 0.514160f, 0.494873f, 0.504883f, 0.502441f, 0.495850f, + 0.507324f, 0.487549f, 0.514160f, 0.478516f, 0.521973f, 0.469238f, 0.526367f, 0.461426f, + 0.532227f, 0.453125f, 0.537598f, 0.445068f, 0.542480f, 0.437500f, 0.548828f, 0.429199f, + 0.553223f, 0.421875f, 0.558105f, 0.414551f, 0.562012f, 0.406738f, 0.568359f, 0.399170f, + 0.570801f, 0.391846f, 0.575195f, 0.383789f, 0.579102f, 0.375488f, 0.582520f, 0.367920f, + 0.586426f, 0.359375f, 0.588867f, 0.351074f, 0.591797f, 0.341797f, 0.593262f, 0.333252f, + 0.597656f, 0.322754f, 0.599609f, 0.312500f, 0.600586f, 0.301514f, 0.601074f, 0.289795f, + 0.600586f, 0.276611f, 0.600586f, 0.262207f, 0.599609f, 0.245850f, 0.596191f, 0.226929f, + 0.590820f, 0.204346f, 0.580078f, 0.175659f, 0.561035f, 0.133545f, 0.517090f, 0.051941f, + 0.000000f, 1.000000f, 0.045349f, 0.979004f, 0.085999f, 0.950684f, 0.122986f, 0.921387f, + 0.153931f, 0.895020f, 0.182373f, 0.868652f, 0.206543f, 0.844727f, 0.230835f, 0.820801f, + 0.252930f, 0.798340f, 0.272461f, 0.777832f, 0.290283f, 0.757812f, 0.308105f, 0.738770f, + 0.323730f, 0.720703f, 0.338623f, 0.703613f, 0.352051f, 0.687500f, 0.366699f, 0.671875f, + 0.378418f, 0.656738f, 0.391357f, 0.642090f, 0.403076f, 0.628418f, 0.412842f, 0.615234f, + 0.424072f, 0.602051f, 0.433350f, 0.590332f, 0.443115f, 0.578125f, 0.452393f, 0.566406f, + 0.461670f, 0.555176f, 0.469727f, 0.543945f, 0.478027f, 0.533691f, 0.487061f, 0.522949f, + 0.494873f, 0.512207f, 0.502441f, 0.502930f, 0.509766f, 0.492920f, 0.514648f, 0.484375f, + 0.522949f, 0.474609f, 0.529297f, 0.466064f, 0.537109f, 0.456543f, 0.542480f, 0.447998f, + 0.548340f, 0.439453f, 0.555176f, 0.430908f, 0.560547f, 0.422852f, 0.566406f, 0.414795f, + 0.571289f, 0.406738f, 0.576660f, 0.399170f, 0.581055f, 0.391602f, 0.586914f, 0.383545f, + 0.592285f, 0.375977f, 0.595215f, 0.367920f, 0.600098f, 0.359131f, 0.604004f, 0.351318f, + 0.607910f, 0.343262f, 0.611328f, 0.334229f, 0.615234f, 0.324951f, 0.618652f, 0.315918f, + 0.621582f, 0.305908f, 0.624023f, 0.295898f, 0.625000f, 0.285156f, 0.627441f, 0.273438f, + 0.628418f, 0.260742f, 0.628418f, 0.247070f, 0.627441f, 0.231201f, 0.625000f, 0.212646f, + 0.621094f, 0.191284f, 0.613281f, 0.163086f, 0.596680f, 0.123291f, 0.557617f, 0.049377f, + 0.000000f, 1.000000f, 0.045166f, 0.979004f, 0.087402f, 0.949707f, 0.123779f, 0.921387f, + 0.155640f, 0.893555f, 0.184082f, 0.867676f, 0.210815f, 0.841797f, 0.234497f, 0.818359f, + 0.256348f, 0.796387f, 0.275635f, 0.774902f, 0.295654f, 0.753906f, 0.312744f, 0.735352f, + 0.328857f, 0.716797f, 0.344727f, 0.699219f, 0.359863f, 0.682129f, 0.373291f, 0.666504f, + 0.386230f, 0.651367f, 0.399414f, 0.636230f, 0.410889f, 0.621582f, 0.422119f, 0.607910f, + 0.432861f, 0.594727f, 0.443604f, 0.582031f, 0.455322f, 0.569336f, 0.464844f, 0.557129f, + 0.473389f, 0.545410f, 0.482910f, 0.534180f, 0.491699f, 0.522949f, 0.500000f, 0.512207f, + 0.508301f, 0.501465f, 0.515625f, 0.491943f, 0.523926f, 0.481445f, 0.531250f, 0.471436f, + 0.538086f, 0.462402f, 0.543945f, 0.453125f, 0.552734f, 0.443604f, 0.559082f, 0.434570f, + 0.564453f, 0.425781f, 0.571289f, 0.417236f, 0.578125f, 0.408203f, 0.583008f, 0.400635f, + 0.589355f, 0.391846f, 0.595215f, 0.383789f, 0.600586f, 0.376221f, 0.606445f, 0.367920f, + 0.611816f, 0.359863f, 0.616699f, 0.352539f, 0.620117f, 0.343506f, 0.625000f, 0.334961f, + 0.628418f, 0.326904f, 0.633789f, 0.318359f, 0.637695f, 0.308838f, 0.641602f, 0.299805f, + 0.644531f, 0.289795f, 0.649414f, 0.279297f, 0.650879f, 0.269043f, 0.652832f, 0.257812f, + 0.654297f, 0.245117f, 0.655273f, 0.231323f, 0.655273f, 0.216064f, 0.654297f, 0.198608f, + 0.649414f, 0.178223f, 0.644531f, 0.151367f, 0.631348f, 0.114319f, 0.596680f, 0.045013f, + 0.000000f, 1.000000f, 0.045441f, 0.979004f, 0.087891f, 0.949707f, 0.123840f, 0.921387f, + 0.156616f, 0.893555f, 0.185913f, 0.866211f, 0.212646f, 0.840820f, 0.237183f, 0.816406f, + 0.259277f, 0.793945f, 0.281006f, 0.770996f, 0.299072f, 0.751465f, 0.317383f, 0.731445f, + 0.335449f, 0.711914f, 0.351562f, 0.694336f, 0.366211f, 0.677246f, 0.381592f, 0.660156f, + 0.394287f, 0.644531f, 0.406494f, 0.629883f, 0.420410f, 0.614258f, 0.431885f, 0.600586f, + 0.443604f, 0.586426f, 0.454346f, 0.573730f, 0.465088f, 0.560547f, 0.476074f, 0.548340f, + 0.485352f, 0.536133f, 0.494873f, 0.523926f, 0.502930f, 0.513184f, 0.512207f, 0.501953f, + 0.520996f, 0.490723f, 0.528320f, 0.480713f, 0.538086f, 0.469971f, 0.545410f, 0.459717f, + 0.552734f, 0.450195f, 0.559082f, 0.440674f, 0.567383f, 0.431152f, 0.575195f, 0.421143f, + 0.582520f, 0.411865f, 0.588867f, 0.403076f, 0.595703f, 0.394043f, 0.600586f, 0.385986f, + 0.607422f, 0.376953f, 0.613281f, 0.368652f, 0.619141f, 0.360596f, 0.624512f, 0.352539f, + 0.630371f, 0.344238f, 0.635254f, 0.336426f, 0.640625f, 0.327881f, 0.645996f, 0.318848f, + 0.650391f, 0.310547f, 0.655762f, 0.301758f, 0.659180f, 0.292725f, 0.663574f, 0.283447f, + 0.666992f, 0.274414f, 0.670410f, 0.263672f, 0.673828f, 0.253662f, 0.677246f, 0.242065f, + 0.681152f, 0.229858f, 0.681152f, 0.216797f, 0.682129f, 0.202271f, 0.681641f, 0.185425f, + 0.679199f, 0.165161f, 0.674316f, 0.140747f, 0.663086f, 0.105713f, 0.632812f, 0.041473f, + 0.000000f, 1.000000f, 0.045746f, 0.979004f, 0.088867f, 0.949219f, 0.124817f, 0.920898f, + 0.157837f, 0.892578f, 0.189331f, 0.864258f, 0.215332f, 0.838867f, 0.240723f, 0.814453f, + 0.262939f, 0.791016f, 0.284668f, 0.769043f, 0.305176f, 0.747070f, 0.323242f, 0.727051f, + 0.340576f, 0.708008f, 0.358643f, 0.688965f, 0.372559f, 0.671875f, 0.387939f, 0.654785f, + 0.402588f, 0.638184f, 0.416748f, 0.622559f, 0.429199f, 0.607422f, 0.441895f, 0.592773f, + 0.453125f, 0.578613f, 0.466309f, 0.564453f, 0.475830f, 0.551758f, 0.486084f, 0.539062f, + 0.497070f, 0.526367f, 0.505859f, 0.514648f, 0.516113f, 0.502441f, 0.525879f, 0.490723f, + 0.534668f, 0.479980f, 0.543945f, 0.468750f, 0.550293f, 0.458740f, 0.559570f, 0.447754f, + 0.567383f, 0.437744f, 0.577148f, 0.427002f, 0.582520f, 0.418213f, 0.589844f, 0.408447f, + 0.599121f, 0.398193f, 0.604004f, 0.389648f, 0.613281f, 0.379883f, 0.618164f, 0.371338f, + 0.625000f, 0.362305f, 0.631348f, 0.353760f, 0.637207f, 0.345459f, 0.643555f, 0.336914f, + 0.648926f, 0.328613f, 0.655762f, 0.320557f, 0.661133f, 0.312256f, 0.666504f, 0.303467f, + 0.669922f, 0.294922f, 0.676758f, 0.285889f, 0.681152f, 0.277100f, 0.685547f, 0.267578f, + 0.689453f, 0.258301f, 0.693848f, 0.248413f, 0.697266f, 0.238037f, 0.699707f, 0.227173f, + 0.703613f, 0.215576f, 0.704590f, 0.202881f, 0.707031f, 0.188232f, 0.706543f, 0.172241f, + 0.705566f, 0.153564f, 0.702637f, 0.130493f, 0.694336f, 0.097473f, 0.667969f, 0.037659f, + 0.000000f, 1.000000f, 0.046051f, 0.978516f, 0.089478f, 0.948730f, 0.125610f, 0.920410f, + 0.159546f, 0.891113f, 0.189697f, 0.863770f, 0.217651f, 0.837891f, 0.243774f, 0.812500f, + 0.266846f, 0.788574f, 0.289307f, 0.765625f, 0.310059f, 0.743652f, 0.329102f, 0.723145f, + 0.347168f, 0.703125f, 0.362793f, 0.685059f, 0.381348f, 0.665527f, 0.394775f, 0.648926f, + 0.410156f, 0.632324f, 0.425537f, 0.615723f, 0.437500f, 0.600586f, 0.451904f, 0.584961f, + 0.462402f, 0.570801f, 0.474854f, 0.556641f, 0.486328f, 0.542969f, 0.498047f, 0.529297f, + 0.508301f, 0.516602f, 0.518066f, 0.504395f, 0.529785f, 0.491699f, 0.538086f, 0.480469f, + 0.546875f, 0.468994f, 0.556641f, 0.457275f, 0.566406f, 0.446045f, 0.574707f, 0.435791f, + 0.583008f, 0.425049f, 0.591309f, 0.414551f, 0.599121f, 0.404541f, 0.606445f, 0.395264f, + 0.614746f, 0.385010f, 0.620605f, 0.375977f, 0.629395f, 0.365967f, 0.636230f, 0.356689f, + 0.642090f, 0.348145f, 0.649414f, 0.338867f, 0.656250f, 0.330078f, 0.661133f, 0.322266f, + 0.667480f, 0.313232f, 0.674805f, 0.304688f, 0.681152f, 0.296387f, 0.686035f, 0.288086f, + 0.690918f, 0.279541f, 0.696289f, 0.270020f, 0.702148f, 0.261230f, 0.706543f, 0.252686f, + 0.711426f, 0.243042f, 0.716309f, 0.233032f, 0.719727f, 0.223022f, 0.723633f, 0.213013f, + 0.726074f, 0.200928f, 0.728516f, 0.188721f, 0.730957f, 0.175537f, 0.732422f, 0.159790f, + 0.732910f, 0.142212f, 0.729980f, 0.119690f, 0.723145f, 0.088623f, 0.700684f, 0.034241f, + 0.000000f, 1.000000f, 0.046570f, 0.978027f, 0.089539f, 0.949219f, 0.125732f, 0.920410f, + 0.161377f, 0.890137f, 0.191650f, 0.862793f, 0.220947f, 0.835449f, 0.245361f, 0.810547f, + 0.271240f, 0.785645f, 0.292480f, 0.762695f, 0.315186f, 0.740234f, 0.333984f, 0.719238f, + 0.352539f, 0.699219f, 0.370605f, 0.679199f, 0.386719f, 0.661133f, 0.404053f, 0.642578f, + 0.418945f, 0.625488f, 0.432861f, 0.608887f, 0.447266f, 0.592773f, 0.460693f, 0.577148f, + 0.473389f, 0.562500f, 0.483887f, 0.548340f, 0.497070f, 0.534180f, 0.508301f, 0.520508f, + 0.519043f, 0.507324f, 0.531738f, 0.493896f, 0.541504f, 0.481689f, 0.551758f, 0.469482f, + 0.561035f, 0.457520f, 0.570312f, 0.446289f, 0.580566f, 0.434570f, 0.588867f, 0.423828f, + 0.597168f, 0.412842f, 0.605469f, 0.402344f, 0.614258f, 0.391846f, 0.622070f, 0.381836f, + 0.630371f, 0.371826f, 0.637207f, 0.362305f, 0.645508f, 0.352295f, 0.653320f, 0.342529f, + 0.659668f, 0.333496f, 0.666992f, 0.324463f, 0.673828f, 0.315430f, 0.679199f, 0.307129f, + 0.687012f, 0.297852f, 0.693848f, 0.289062f, 0.699219f, 0.281250f, 0.704590f, 0.272461f, + 0.711914f, 0.264160f, 0.716309f, 0.255371f, 0.722656f, 0.245850f, 0.726074f, 0.237549f, + 0.731934f, 0.228394f, 0.736328f, 0.218262f, 0.741211f, 0.208740f, 0.745117f, 0.197998f, + 0.750000f, 0.187256f, 0.752441f, 0.175171f, 0.755371f, 0.161987f, 0.756348f, 0.148071f, + 0.756836f, 0.131104f, 0.755371f, 0.109680f, 0.749512f, 0.081421f, 0.732422f, 0.030914f, + 0.000000f, 1.000000f, 0.047852f, 0.977051f, 0.089905f, 0.949219f, 0.128540f, 0.918457f, + 0.161499f, 0.890137f, 0.193604f, 0.861328f, 0.222656f, 0.833984f, 0.249634f, 0.808105f, + 0.274902f, 0.783203f, 0.298828f, 0.758789f, 0.318604f, 0.736816f, 0.339844f, 0.714844f, + 0.359131f, 0.694336f, 0.376465f, 0.674316f, 0.394775f, 0.655273f, 0.410645f, 0.636719f, + 0.426270f, 0.619629f, 0.442139f, 0.602051f, 0.456055f, 0.585938f, 0.469971f, 0.569824f, + 0.483887f, 0.554199f, 0.496826f, 0.539062f, 0.508301f, 0.524902f, 0.520020f, 0.510742f, + 0.532715f, 0.497070f, 0.541992f, 0.484375f, 0.553711f, 0.471191f, 0.563477f, 0.458740f, + 0.574707f, 0.446533f, 0.583984f, 0.434570f, 0.593750f, 0.422607f, 0.604492f, 0.411133f, + 0.612793f, 0.400635f, 0.620117f, 0.390137f, 0.629883f, 0.378662f, 0.637695f, 0.368408f, + 0.645020f, 0.358643f, 0.654297f, 0.348389f, 0.661133f, 0.339111f, 0.670410f, 0.328613f, + 0.676758f, 0.319336f, 0.684570f, 0.310059f, 0.691895f, 0.300537f, 0.698242f, 0.291992f, + 0.704102f, 0.283203f, 0.711426f, 0.274170f, 0.718262f, 0.265869f, 0.723633f, 0.257568f, + 0.729980f, 0.249023f, 0.736328f, 0.240723f, 0.741211f, 0.231201f, 0.747070f, 0.222168f, + 0.751953f, 0.213623f, 0.757812f, 0.204468f, 0.760254f, 0.194702f, 0.766113f, 0.184570f, + 0.770996f, 0.173340f, 0.772949f, 0.162354f, 0.777832f, 0.149902f, 0.779785f, 0.136108f, + 0.781250f, 0.120544f, 0.781738f, 0.101074f, 0.777832f, 0.074951f, 0.762207f, 0.028259f, + 0.000000f, 1.000000f, 0.048309f, 0.977051f, 0.089539f, 0.949219f, 0.129517f, 0.917969f, + 0.163574f, 0.889160f, 0.196167f, 0.859863f, 0.225220f, 0.832520f, 0.251953f, 0.806152f, + 0.279053f, 0.780273f, 0.301758f, 0.756348f, 0.323975f, 0.733398f, 0.345215f, 0.711426f, + 0.364746f, 0.689453f, 0.384766f, 0.668945f, 0.401123f, 0.649902f, 0.419922f, 0.630371f, + 0.434570f, 0.612793f, 0.450439f, 0.595215f, 0.466064f, 0.578125f, 0.479736f, 0.561523f, + 0.493408f, 0.545898f, 0.505859f, 0.530762f, 0.519531f, 0.515625f, 0.532227f, 0.501465f, + 0.543945f, 0.487549f, 0.555664f, 0.473633f, 0.567383f, 0.460693f, 0.577148f, 0.447998f, + 0.586426f, 0.435791f, 0.597656f, 0.423096f, 0.606934f, 0.411621f, 0.617676f, 0.399414f, + 0.625488f, 0.388672f, 0.635254f, 0.377197f, 0.645020f, 0.366211f, 0.653809f, 0.355469f, + 0.660645f, 0.345459f, 0.670410f, 0.334961f, 0.676758f, 0.325684f, 0.687500f, 0.314941f, + 0.694336f, 0.305176f, 0.700195f, 0.296143f, 0.709473f, 0.286133f, 0.715332f, 0.277344f, + 0.721680f, 0.268555f, 0.729492f, 0.259766f, 0.735840f, 0.250977f, 0.743164f, 0.242432f, + 0.748047f, 0.234131f, 0.753906f, 0.225952f, 0.761230f, 0.217163f, 0.765137f, 0.208130f, + 0.770996f, 0.199341f, 0.776855f, 0.190063f, 0.781738f, 0.180908f, 0.786621f, 0.170898f, + 0.791992f, 0.160645f, 0.794922f, 0.150146f, 0.798828f, 0.138184f, 0.801758f, 0.125244f, + 0.802246f, 0.110352f, 0.802734f, 0.092957f, 0.802734f, 0.068115f, 0.788086f, 0.025894f, + 0.000000f, 1.000000f, 0.048248f, 0.977539f, 0.089661f, 0.949219f, 0.129028f, 0.918457f, + 0.165649f, 0.887695f, 0.196777f, 0.859375f, 0.229126f, 0.830078f, 0.257080f, 0.803223f, + 0.281494f, 0.777832f, 0.307129f, 0.752441f, 0.330322f, 0.729004f, 0.350830f, 0.706543f, + 0.372559f, 0.684570f, 0.390625f, 0.664062f, 0.409424f, 0.643555f, 0.427002f, 0.624512f, + 0.444336f, 0.605957f, 0.459717f, 0.587891f, 0.475098f, 0.570312f, 0.490234f, 0.553711f, + 0.504395f, 0.537109f, 0.518066f, 0.521484f, 0.531250f, 0.506348f, 0.543457f, 0.492188f, + 0.556152f, 0.477539f, 0.567383f, 0.463867f, 0.579590f, 0.449951f, 0.589844f, 0.437256f, + 0.601562f, 0.424072f, 0.611816f, 0.411621f, 0.621582f, 0.399414f, 0.630859f, 0.387939f, + 0.641602f, 0.375977f, 0.649902f, 0.364502f, 0.659668f, 0.353516f, 0.669922f, 0.342773f, + 0.677246f, 0.332031f, 0.686523f, 0.321289f, 0.694336f, 0.311523f, 0.700684f, 0.302246f, + 0.710938f, 0.291504f, 0.716797f, 0.282227f, 0.725586f, 0.272217f, 0.733398f, 0.262939f, + 0.738770f, 0.254639f, 0.746582f, 0.245239f, 0.752930f, 0.236694f, 0.760254f, 0.228027f, + 0.766602f, 0.219482f, 0.771973f, 0.211426f, 0.779785f, 0.202393f, 0.786133f, 0.194458f, + 0.790039f, 0.185669f, 0.795410f, 0.176270f, 0.800293f, 0.167847f, 0.806641f, 0.158081f, + 0.811035f, 0.147949f, 0.815918f, 0.138184f, 0.818848f, 0.127075f, 0.822266f, 0.114990f, + 0.825684f, 0.101196f, 0.826172f, 0.084473f, 0.824219f, 0.061249f, 0.814941f, 0.023315f, + 0.000000f, 1.000000f, 0.047913f, 0.977539f, 0.091736f, 0.947754f, 0.129639f, 0.918457f, + 0.166504f, 0.887207f, 0.200928f, 0.856934f, 0.230225f, 0.829102f, 0.259277f, 0.801270f, + 0.286621f, 0.774902f, 0.311279f, 0.749512f, 0.333740f, 0.726074f, 0.356201f, 0.702637f, + 0.377930f, 0.680176f, 0.397705f, 0.658691f, 0.416504f, 0.638184f, 0.434326f, 0.618652f, + 0.452881f, 0.598633f, 0.468506f, 0.580566f, 0.484863f, 0.562988f, 0.499023f, 0.545898f, + 0.514160f, 0.529297f, 0.527344f, 0.513184f, 0.541504f, 0.497559f, 0.555664f, 0.482178f, + 0.567383f, 0.467773f, 0.580566f, 0.453369f, 0.592285f, 0.439453f, 0.604492f, 0.426025f, + 0.614746f, 0.413330f, 0.624023f, 0.400635f, 0.635254f, 0.387695f, 0.645508f, 0.375732f, + 0.656250f, 0.363770f, 0.665527f, 0.352295f, 0.674316f, 0.340820f, 0.682617f, 0.330566f, + 0.692383f, 0.319092f, 0.701172f, 0.308594f, 0.710449f, 0.298096f, 0.716797f, 0.288818f, + 0.725098f, 0.278564f, 0.734863f, 0.268066f, 0.741211f, 0.259277f, 0.749512f, 0.249268f, + 0.756348f, 0.240356f, 0.764160f, 0.231201f, 0.770020f, 0.222534f, 0.776855f, 0.213989f, + 0.784180f, 0.205200f, 0.790527f, 0.197021f, 0.796387f, 0.189209f, 0.802246f, 0.180420f, + 0.809570f, 0.172363f, 0.814941f, 0.162964f, 0.818359f, 0.154907f, 0.825195f, 0.145508f, + 0.828613f, 0.136475f, 0.834473f, 0.126465f, 0.839355f, 0.115967f, 0.842285f, 0.104614f, + 0.844727f, 0.091492f, 0.847168f, 0.076538f, 0.847168f, 0.055756f, 0.838379f, 0.021713f, + 0.000000f, 1.000000f, 0.047516f, 0.978027f, 0.091431f, 0.948242f, 0.131836f, 0.916992f, + 0.168091f, 0.886230f, 0.200684f, 0.856934f, 0.234253f, 0.826660f, 0.262207f, 0.799316f, + 0.290771f, 0.771973f, 0.315918f, 0.746582f, 0.339844f, 0.722168f, 0.362061f, 0.698242f, + 0.384521f, 0.675293f, 0.404541f, 0.653320f, 0.424561f, 0.632324f, 0.442627f, 0.612305f, + 0.461670f, 0.592285f, 0.477783f, 0.573242f, 0.494629f, 0.555176f, 0.509766f, 0.537598f, + 0.524902f, 0.520508f, 0.540039f, 0.503906f, 0.553223f, 0.488525f, 0.566406f, 0.473145f, + 0.578613f, 0.458252f, 0.592285f, 0.443359f, 0.604492f, 0.428955f, 0.616699f, 0.415283f, + 0.626465f, 0.402100f, 0.639160f, 0.388672f, 0.649414f, 0.376465f, 0.659668f, 0.364014f, + 0.670410f, 0.351562f, 0.678223f, 0.340332f, 0.689941f, 0.328369f, 0.698730f, 0.317383f, + 0.708496f, 0.306396f, 0.716309f, 0.295898f, 0.725586f, 0.284912f, 0.732910f, 0.274902f, + 0.742676f, 0.264893f, 0.748535f, 0.255859f, 0.757812f, 0.245850f, 0.765625f, 0.235718f, + 0.771973f, 0.227051f, 0.781250f, 0.217163f, 0.787598f, 0.208740f, 0.793457f, 0.200439f, + 0.800293f, 0.191528f, 0.808105f, 0.183105f, 0.813965f, 0.175049f, 0.819824f, 0.166748f, + 0.825684f, 0.159058f, 0.833008f, 0.150391f, 0.836426f, 0.142334f, 0.842773f, 0.133301f, + 0.847168f, 0.124451f, 0.851562f, 0.115479f, 0.856934f, 0.105164f, 0.860840f, 0.094604f, + 0.864258f, 0.082886f, 0.865234f, 0.068848f, 0.868652f, 0.049683f, 0.861328f, 0.018021f, + 0.000000f, 1.000000f, 0.047729f, 0.978027f, 0.091614f, 0.948242f, 0.132446f, 0.916504f, + 0.169434f, 0.885742f, 0.204468f, 0.854492f, 0.235474f, 0.825195f, 0.265869f, 0.796875f, + 0.293701f, 0.769531f, 0.319580f, 0.743164f, 0.344971f, 0.717773f, 0.368408f, 0.693848f, + 0.390137f, 0.670410f, 0.411621f, 0.647949f, 0.432861f, 0.625977f, 0.452148f, 0.605469f, + 0.469238f, 0.585449f, 0.487305f, 0.566406f, 0.503906f, 0.547363f, 0.518555f, 0.529785f, + 0.533203f, 0.512695f, 0.547852f, 0.496094f, 0.563477f, 0.479492f, 0.577148f, 0.463623f, + 0.590820f, 0.448486f, 0.603027f, 0.433350f, 0.616211f, 0.419189f, 0.626953f, 0.405273f, + 0.640625f, 0.390869f, 0.651367f, 0.377930f, 0.663086f, 0.364502f, 0.673828f, 0.352051f, + 0.683594f, 0.340088f, 0.693359f, 0.327881f, 0.703125f, 0.316650f, 0.714355f, 0.304688f, + 0.723145f, 0.293701f, 0.730957f, 0.283203f, 0.740234f, 0.272705f, 0.750000f, 0.261719f, + 0.757324f, 0.252197f, 0.765625f, 0.241943f, 0.772461f, 0.232910f, 0.781250f, 0.223145f, + 0.788086f, 0.213745f, 0.796387f, 0.204346f, 0.803711f, 0.195190f, 0.810059f, 0.187012f, + 0.816895f, 0.178101f, 0.824219f, 0.169800f, 0.831543f, 0.161377f, 0.836426f, 0.153809f, + 0.842285f, 0.145996f, 0.848633f, 0.137939f, 0.855469f, 0.130127f, 0.860840f, 0.121704f, + 0.863770f, 0.113342f, 0.869629f, 0.104309f, 0.873535f, 0.095337f, 0.879395f, 0.084961f, + 0.881836f, 0.074402f, 0.885254f, 0.061340f, 0.886719f, 0.044281f, 0.882324f, 0.017151f, + 0.000000f, 1.000000f, 0.047424f, 0.978027f, 0.092041f, 0.947754f, 0.133057f, 0.916016f, + 0.170532f, 0.884766f, 0.205933f, 0.854004f, 0.238892f, 0.823730f, 0.269043f, 0.794434f, + 0.298340f, 0.766602f, 0.324463f, 0.740234f, 0.349365f, 0.714355f, 0.373779f, 0.689453f, + 0.397217f, 0.665527f, 0.419189f, 0.642090f, 0.438477f, 0.620605f, 0.459229f, 0.599121f, + 0.477295f, 0.578613f, 0.495605f, 0.559082f, 0.512695f, 0.540039f, 0.530273f, 0.521484f, + 0.545898f, 0.503418f, 0.561035f, 0.486572f, 0.575195f, 0.469727f, 0.590332f, 0.453369f, + 0.604004f, 0.437988f, 0.616699f, 0.423096f, 0.628906f, 0.408447f, 0.642090f, 0.393799f, + 0.652832f, 0.380127f, 0.665527f, 0.366455f, 0.676270f, 0.353271f, 0.686523f, 0.341064f, + 0.697266f, 0.328125f, 0.707520f, 0.316162f, 0.718262f, 0.304199f, 0.728516f, 0.292480f, + 0.736816f, 0.281738f, 0.747070f, 0.270264f, 0.754395f, 0.260010f, 0.764160f, 0.249512f, + 0.772461f, 0.239380f, 0.781738f, 0.229126f, 0.788574f, 0.219604f, 0.796387f, 0.210327f, + 0.802734f, 0.201416f, 0.811035f, 0.192017f, 0.819824f, 0.182495f, 0.826172f, 0.174072f, + 0.833984f, 0.165161f, 0.838379f, 0.157349f, 0.847656f, 0.148560f, 0.852051f, 0.141113f, + 0.858887f, 0.133179f, 0.864258f, 0.125366f, 0.871094f, 0.117981f, 0.875977f, 0.110535f, + 0.881348f, 0.102539f, 0.886230f, 0.093567f, 0.891113f, 0.085266f, 0.896484f, 0.076294f, + 0.899902f, 0.066223f, 0.901855f, 0.055237f, 0.906738f, 0.039246f, 0.902344f, 0.014061f, + 0.000000f, 1.000000f, 0.047272f, 0.978027f, 0.093018f, 0.947266f, 0.134399f, 0.915527f, + 0.172729f, 0.883301f, 0.207520f, 0.852539f, 0.241577f, 0.821777f, 0.272949f, 0.792480f, + 0.301270f, 0.764160f, 0.330811f, 0.735840f, 0.356689f, 0.709961f, 0.381592f, 0.684570f, + 0.404053f, 0.660156f, 0.426270f, 0.636719f, 0.447998f, 0.614258f, 0.467773f, 0.592773f, + 0.487549f, 0.571777f, 0.506348f, 0.551270f, 0.523438f, 0.531738f, 0.539551f, 0.513184f, + 0.556152f, 0.495361f, 0.570801f, 0.477783f, 0.585938f, 0.460693f, 0.601562f, 0.443848f, + 0.616211f, 0.427734f, 0.629883f, 0.412598f, 0.641602f, 0.397949f, 0.652832f, 0.383545f, + 0.666016f, 0.369141f, 0.678223f, 0.355225f, 0.690430f, 0.342041f, 0.701660f, 0.328857f, + 0.711914f, 0.316650f, 0.721680f, 0.304443f, 0.731445f, 0.292236f, 0.743164f, 0.280518f, + 0.752441f, 0.269043f, 0.759766f, 0.258789f, 0.770020f, 0.247437f, 0.779297f, 0.236938f, + 0.786621f, 0.227051f, 0.795410f, 0.217041f, 0.803223f, 0.207031f, 0.811523f, 0.197632f, + 0.818359f, 0.188477f, 0.826172f, 0.179688f, 0.834473f, 0.170288f, 0.841309f, 0.161865f, + 0.847656f, 0.153076f, 0.854492f, 0.144653f, 0.861816f, 0.136597f, 0.867188f, 0.128906f, + 0.874512f, 0.120544f, 0.879883f, 0.113647f, 0.885254f, 0.106201f, 0.890137f, 0.099121f, + 0.898926f, 0.090759f, 0.901367f, 0.085083f, 0.906250f, 0.075439f, 0.912109f, 0.066650f, + 0.916992f, 0.058655f, 0.919434f, 0.047668f, 0.922852f, 0.034393f, 0.922363f, 0.013527f, + 0.000000f, 1.000000f, 0.048004f, 0.977539f, 0.093628f, 0.946777f, 0.135254f, 0.915039f, + 0.174438f, 0.882324f, 0.210327f, 0.850586f, 0.244751f, 0.819336f, 0.275635f, 0.790039f, + 0.307129f, 0.760254f, 0.335449f, 0.732422f, 0.361816f, 0.706055f, 0.386719f, 0.680176f, + 0.410400f, 0.655273f, 0.432861f, 0.631836f, 0.455078f, 0.608398f, 0.475586f, 0.586426f, + 0.495605f, 0.564941f, 0.514160f, 0.544434f, 0.532227f, 0.524414f, 0.550781f, 0.504883f, + 0.567871f, 0.486328f, 0.583496f, 0.468750f, 0.598145f, 0.451416f, 0.612793f, 0.434570f, + 0.627441f, 0.418701f, 0.640625f, 0.402832f, 0.654297f, 0.387451f, 0.667480f, 0.372559f, + 0.679199f, 0.358398f, 0.690430f, 0.344727f, 0.703125f, 0.330566f, 0.713867f, 0.317627f, + 0.725586f, 0.305176f, 0.735352f, 0.292480f, 0.745605f, 0.280518f, 0.754883f, 0.268799f, + 0.766602f, 0.257080f, 0.774414f, 0.246582f, 0.782715f, 0.235718f, 0.792969f, 0.225342f, + 0.802246f, 0.214478f, 0.809570f, 0.204956f, 0.817383f, 0.195312f, 0.827148f, 0.185303f, + 0.833496f, 0.176147f, 0.841797f, 0.166870f, 0.848145f, 0.158325f, 0.854980f, 0.150269f, + 0.862305f, 0.141479f, 0.871094f, 0.132690f, 0.875488f, 0.124817f, 0.883789f, 0.116272f, + 0.887695f, 0.109802f, 0.895020f, 0.101440f, 0.901367f, 0.094666f, 0.906250f, 0.087646f, + 0.912109f, 0.080322f, 0.917969f, 0.073486f, 0.923340f, 0.066406f, 0.926270f, 0.058746f, + 0.930664f, 0.050201f, 0.935059f, 0.041504f, 0.938965f, 0.029541f, 0.938965f, 0.010628f, + 0.000000f, 1.000000f, 0.048798f, 0.977051f, 0.092773f, 0.947754f, 0.135986f, 0.914551f, + 0.175415f, 0.881836f, 0.212524f, 0.849121f, 0.247314f, 0.817871f, 0.280029f, 0.787109f, + 0.310059f, 0.758301f, 0.337646f, 0.729980f, 0.365479f, 0.702637f, 0.392090f, 0.675781f, + 0.417480f, 0.650391f, 0.441162f, 0.625977f, 0.461670f, 0.602539f, 0.485107f, 0.579590f, + 0.504883f, 0.557617f, 0.523438f, 0.536621f, 0.541992f, 0.516602f, 0.559082f, 0.497070f, + 0.576172f, 0.478271f, 0.592773f, 0.459961f, 0.609375f, 0.441895f, 0.625000f, 0.424561f, + 0.640137f, 0.408203f, 0.653809f, 0.392334f, 0.666016f, 0.377197f, 0.678711f, 0.362305f, + 0.691406f, 0.347900f, 0.703125f, 0.333496f, 0.716797f, 0.319336f, 0.727051f, 0.306641f, + 0.738770f, 0.293701f, 0.747559f, 0.281494f, 0.759277f, 0.269043f, 0.768555f, 0.257324f, + 0.781250f, 0.245239f, 0.787598f, 0.235229f, 0.797363f, 0.223877f, 0.807617f, 0.212891f, + 0.813965f, 0.203491f, 0.824219f, 0.192871f, 0.833984f, 0.182861f, 0.840332f, 0.173584f, + 0.847168f, 0.164795f, 0.855469f, 0.155518f, 0.863770f, 0.146118f, 0.869141f, 0.138306f, + 0.876465f, 0.130005f, 0.882812f, 0.122070f, 0.890137f, 0.113831f, 0.896484f, 0.105835f, + 0.903809f, 0.097900f, 0.908691f, 0.090881f, 0.914062f, 0.083740f, 0.920898f, 0.076721f, + 0.926270f, 0.069824f, 0.931152f, 0.063232f, 0.937012f, 0.056519f, 0.941895f, 0.049957f, + 0.946289f, 0.042999f, 0.950684f, 0.034088f, 0.955078f, 0.024399f, 0.956055f, 0.008232f, + 0.000000f, 1.000000f, 0.048370f, 0.977539f, 0.094666f, 0.946289f, 0.137939f, 0.913086f, + 0.176147f, 0.881348f, 0.214966f, 0.847656f, 0.251465f, 0.815430f, 0.282959f, 0.785156f, + 0.315186f, 0.754395f, 0.343750f, 0.726074f, 0.372559f, 0.697754f, 0.398926f, 0.670898f, + 0.424072f, 0.645020f, 0.449219f, 0.620117f, 0.470947f, 0.596191f, 0.493164f, 0.572754f, + 0.512695f, 0.550781f, 0.532227f, 0.529785f, 0.552246f, 0.508789f, 0.571289f, 0.488281f, + 0.588379f, 0.468994f, 0.604492f, 0.450684f, 0.621094f, 0.432617f, 0.636230f, 0.415527f, + 0.649902f, 0.398682f, 0.664062f, 0.382568f, 0.678223f, 0.366699f, 0.692383f, 0.351318f, + 0.704102f, 0.337158f, 0.716309f, 0.322754f, 0.728516f, 0.308838f, 0.740234f, 0.295410f, + 0.750977f, 0.282471f, 0.761719f, 0.270020f, 0.772949f, 0.257568f, 0.782715f, 0.245850f, + 0.792969f, 0.234375f, 0.801758f, 0.223389f, 0.811523f, 0.212280f, 0.820312f, 0.201660f, + 0.827637f, 0.191772f, 0.837891f, 0.181396f, 0.846680f, 0.171509f, 0.853027f, 0.162720f, + 0.862305f, 0.152954f, 0.868652f, 0.144287f, 0.875977f, 0.135620f, 0.882812f, 0.127197f, + 0.891113f, 0.118408f, 0.896973f, 0.110596f, 0.902832f, 0.102966f, 0.909180f, 0.095642f, + 0.916504f, 0.087952f, 0.923828f, 0.079956f, 0.928223f, 0.073242f, 0.934570f, 0.066040f, + 0.938965f, 0.059753f, 0.943848f, 0.053253f, 0.949707f, 0.046722f, 0.955078f, 0.040619f, + 0.960449f, 0.034271f, 0.965820f, 0.027802f, 0.969238f, 0.018631f, 0.970215f, 0.006660f, + 0.000000f, 1.000000f, 0.048035f, 0.977539f, 0.095276f, 0.946289f, 0.138306f, 0.913086f, + 0.178833f, 0.879395f, 0.217773f, 0.846191f, 0.253174f, 0.813965f, 0.286865f, 0.782227f, + 0.319092f, 0.751465f, 0.349854f, 0.722168f, 0.377686f, 0.693848f, 0.405029f, 0.666016f, + 0.430908f, 0.640137f, 0.455566f, 0.614746f, 0.478760f, 0.589844f, 0.500488f, 0.566406f, + 0.522949f, 0.543457f, 0.542480f, 0.521484f, 0.561035f, 0.500488f, 0.580078f, 0.480469f, + 0.598145f, 0.460693f, 0.614746f, 0.441895f, 0.630859f, 0.423828f, 0.646484f, 0.406250f, + 0.660156f, 0.389404f, 0.675781f, 0.372559f, 0.690918f, 0.356445f, 0.704102f, 0.341064f, + 0.717285f, 0.326416f, 0.729492f, 0.312012f, 0.741699f, 0.297852f, 0.752930f, 0.284912f, + 0.763672f, 0.271484f, 0.774902f, 0.258789f, 0.785645f, 0.246704f, 0.795898f, 0.234741f, + 0.805664f, 0.223145f, 0.816406f, 0.211548f, 0.823730f, 0.201294f, 0.833984f, 0.190308f, + 0.842773f, 0.179932f, 0.850098f, 0.170654f, 0.858398f, 0.160645f, 0.865723f, 0.151489f, + 0.874512f, 0.142456f, 0.882812f, 0.132935f, 0.888184f, 0.125122f, 0.895996f, 0.116394f, + 0.903809f, 0.108032f, 0.910645f, 0.100220f, 0.916504f, 0.092651f, 0.922852f, 0.084961f, + 0.930176f, 0.076965f, 0.935059f, 0.070496f, 0.940430f, 0.063599f, 0.944824f, 0.057953f, + 0.953125f, 0.049774f, 0.958496f, 0.043243f, 0.963867f, 0.036804f, 0.969238f, 0.030823f, + 0.973145f, 0.025299f, 0.978027f, 0.019104f, 0.982910f, 0.013573f, 0.985352f, 0.004253f, + 0.000000f, 1.000000f, 0.049408f, 0.977051f, 0.094910f, 0.946289f, 0.138184f, 0.913574f, + 0.179688f, 0.879395f, 0.220215f, 0.844727f, 0.255371f, 0.812012f, 0.289551f, 0.780762f, + 0.323242f, 0.749023f, 0.353760f, 0.719238f, 0.382324f, 0.690430f, 0.411377f, 0.661621f, + 0.439209f, 0.634277f, 0.461426f, 0.609375f, 0.487793f, 0.583496f, 0.508301f, 0.560059f, + 0.532227f, 0.536621f, 0.551758f, 0.514160f, 0.570801f, 0.492920f, 0.589844f, 0.472412f, + 0.608398f, 0.452393f, 0.625000f, 0.433105f, 0.641602f, 0.414551f, 0.657715f, 0.396729f, + 0.672852f, 0.379150f, 0.688477f, 0.362305f, 0.703613f, 0.346191f, 0.716309f, 0.331055f, + 0.729004f, 0.316406f, 0.739258f, 0.302246f, 0.753418f, 0.287354f, 0.766602f, 0.273193f, + 0.776367f, 0.261230f, 0.786621f, 0.248291f, 0.799316f, 0.235229f, 0.807617f, 0.224731f, + 0.817871f, 0.212280f, 0.829102f, 0.200684f, 0.835938f, 0.190674f, 0.846680f, 0.179321f, + 0.853516f, 0.170044f, 0.863770f, 0.159302f, 0.871582f, 0.150269f, 0.879883f, 0.140503f, + 0.888184f, 0.131592f, 0.895020f, 0.122803f, 0.902344f, 0.114258f, 0.908691f, 0.106384f, + 0.915527f, 0.098022f, 0.920898f, 0.090515f, 0.929199f, 0.082642f, 0.936523f, 0.074036f, + 0.939941f, 0.069031f, 0.948730f, 0.060455f, 0.952637f, 0.053833f, 0.958496f, 0.048523f, + 0.968262f, 0.038727f, 0.968262f, 0.035004f, 0.974121f, 0.030151f, 0.983887f, 0.019562f, + 0.983887f, 0.017029f, 0.983887f, 0.016098f, 0.999512f, 0.000947f, 0.999512f, 0.000007f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.996582f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.993652f, 0.000000f, 0.992188f, 0.000000f, 0.990234f, 0.000000f, 0.988770f, + 0.000000f, 0.986816f, 0.000000f, 0.984375f, 0.000000f, 0.982422f, 0.000000f, 0.979492f, + 0.000000f, 0.977539f, 0.000000f, 0.974609f, 0.000000f, 0.971680f, 0.000000f, 0.968750f, + 0.000000f, 0.964844f, 0.000000f, 0.961914f, 0.000000f, 0.958496f, 0.000000f, 0.954590f, + 0.000000f, 0.950684f, 0.000000f, 0.946289f, 0.000000f, 0.941406f, 0.000000f, 0.937012f, + 0.000000f, 0.932129f, 0.000000f, 0.927246f, 0.000000f, 0.920898f, 0.000000f, 0.915039f, + 0.000000f, 0.909180f, 0.000000f, 0.902344f, 0.000000f, 0.895996f, 0.000000f, 0.889160f, + 0.000000f, 0.881348f, 0.000000f, 0.873047f, 0.000000f, 0.864746f, 0.000000f, 0.855469f, + 0.000000f, 0.846191f, 0.000000f, 0.836426f, 0.000000f, 0.825684f, 0.000000f, 0.814453f, + 0.000000f, 0.802246f, 0.000000f, 0.789062f, 0.000000f, 0.775879f, 0.000000f, 0.761719f, + 0.000000f, 0.745605f, 0.000000f, 0.729004f, 0.000000f, 0.709961f, 0.000000f, 0.691406f, + 0.000000f, 0.670898f, 0.000000f, 0.646973f, 0.000000f, 0.622070f, 0.000000f, 0.594238f, + 0.000000f, 0.564941f, 0.000000f, 0.529297f, 0.000000f, 0.489746f, 0.000000f, 0.445312f, + 0.000000f, 0.391113f, 0.000000f, 0.323730f, 0.000000f, 0.234131f, 0.000000f, 0.089417f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.996582f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, + 0.000000f, 0.993652f, 0.000000f, 0.991699f, 0.000000f, 0.990234f, 0.000000f, 0.988770f, + 0.000000f, 0.986816f, 0.000000f, 0.984375f, 0.000000f, 0.981934f, 0.000000f, 0.979980f, + 0.000000f, 0.977051f, 0.000000f, 0.974609f, 0.000000f, 0.971680f, 0.000000f, 0.968262f, + 0.000000f, 0.965332f, 0.000000f, 0.961914f, 0.000000f, 0.958008f, 0.000000f, 0.954102f, + 0.000000f, 0.950195f, 0.000000f, 0.946289f, 0.000000f, 0.940918f, 0.000000f, 0.936523f, + 0.000000f, 0.932129f, 0.000000f, 0.926758f, 0.000000f, 0.920898f, 0.000000f, 0.915039f, + 0.000000f, 0.908691f, 0.000000f, 0.902344f, 0.000000f, 0.895996f, 0.000000f, 0.888672f, + 0.000000f, 0.880859f, 0.000000f, 0.872559f, 0.000000f, 0.864258f, 0.000000f, 0.854980f, + 0.000000f, 0.846191f, 0.000000f, 0.836426f, 0.000000f, 0.825195f, 0.000000f, 0.813965f, + 0.000000f, 0.801758f, 0.000000f, 0.789062f, 0.000000f, 0.775879f, 0.000000f, 0.761230f, + 0.000000f, 0.745117f, 0.000000f, 0.728516f, 0.000000f, 0.709961f, 0.000000f, 0.691406f, + 0.000002f, 0.670410f, 0.000005f, 0.646973f, 0.000007f, 0.622070f, 0.000007f, 0.594238f, + 0.000007f, 0.564941f, 0.000006f, 0.529297f, 0.000005f, 0.489990f, 0.000004f, 0.445557f, + 0.000004f, 0.391846f, 0.000003f, 0.324463f, 0.000002f, 0.234131f, 0.000001f, 0.089661f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, + 0.000000f, 0.993164f, 0.000000f, 0.991699f, 0.000000f, 0.989746f, 0.000000f, 0.988281f, + 0.000000f, 0.985840f, 0.000000f, 0.983887f, 0.000000f, 0.981445f, 0.000000f, 0.979492f, + 0.000000f, 0.976562f, 0.000000f, 0.974121f, 0.000000f, 0.971191f, 0.000000f, 0.967773f, + 0.000000f, 0.964844f, 0.000000f, 0.961426f, 0.000000f, 0.957520f, 0.000000f, 0.953613f, + 0.000000f, 0.949707f, 0.000000f, 0.945312f, 0.000000f, 0.940430f, 0.000000f, 0.936035f, + 0.000004f, 0.931641f, 0.000008f, 0.926270f, 0.000015f, 0.920410f, 0.000021f, 0.914551f, + 0.000028f, 0.908203f, 0.000035f, 0.901855f, 0.000043f, 0.895020f, 0.000051f, 0.888184f, + 0.000058f, 0.880371f, 0.000067f, 0.872070f, 0.000075f, 0.863281f, 0.000079f, 0.854492f, + 0.000080f, 0.845215f, 0.000080f, 0.835449f, 0.000079f, 0.825195f, 0.000075f, 0.812988f, + 0.000073f, 0.801270f, 0.000069f, 0.789062f, 0.000065f, 0.774902f, 0.000060f, 0.760742f, + 0.000057f, 0.744629f, 0.000056f, 0.727539f, 0.000057f, 0.710449f, 0.000059f, 0.690918f, + 0.000057f, 0.669922f, 0.000052f, 0.646484f, 0.000048f, 0.621582f, 0.000049f, 0.593750f, + 0.000044f, 0.564453f, 0.000042f, 0.528809f, 0.000038f, 0.489502f, 0.000034f, 0.445312f, + 0.000030f, 0.391113f, 0.000026f, 0.323975f, 0.000019f, 0.233887f, 0.000008f, 0.089050f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.997559f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.994141f, + 0.000000f, 0.992188f, 0.000009f, 0.991211f, 0.000024f, 0.989258f, 0.000037f, 0.987793f, + 0.000054f, 0.985840f, 0.000070f, 0.982910f, 0.000083f, 0.981445f, 0.000101f, 0.979004f, + 0.000117f, 0.976074f, 0.000130f, 0.973633f, 0.000143f, 0.970215f, 0.000160f, 0.967285f, + 0.000174f, 0.963867f, 0.000186f, 0.960938f, 0.000197f, 0.957031f, 0.000211f, 0.953125f, + 0.000225f, 0.949219f, 0.000237f, 0.944336f, 0.000247f, 0.939941f, 0.000256f, 0.935059f, + 0.000266f, 0.930176f, 0.000268f, 0.925293f, 0.000266f, 0.919434f, 0.000260f, 0.913574f, + 0.000252f, 0.907227f, 0.000244f, 0.900879f, 0.000238f, 0.894043f, 0.000236f, 0.887207f, + 0.000232f, 0.879395f, 0.000230f, 0.871094f, 0.000229f, 0.862793f, 0.000233f, 0.854004f, + 0.000238f, 0.844727f, 0.000242f, 0.834473f, 0.000234f, 0.823730f, 0.000230f, 0.812012f, + 0.000226f, 0.799805f, 0.000228f, 0.787598f, 0.000228f, 0.773926f, 0.000227f, 0.759766f, + 0.000212f, 0.743652f, 0.000209f, 0.726562f, 0.000208f, 0.709473f, 0.000208f, 0.690430f, + 0.000202f, 0.668945f, 0.000182f, 0.645508f, 0.000180f, 0.621094f, 0.000175f, 0.593750f, + 0.000169f, 0.563477f, 0.000148f, 0.528809f, 0.000142f, 0.489014f, 0.000134f, 0.445312f, + 0.000112f, 0.390869f, 0.000100f, 0.324219f, 0.000075f, 0.233398f, 0.000025f, 0.088928f, + 0.000000f, 1.000000f, 0.000054f, 0.999512f, 0.000113f, 0.999023f, 0.000167f, 0.998535f, + 0.000189f, 0.997070f, 0.000246f, 0.996094f, 0.000273f, 0.995117f, 0.000290f, 0.993652f, + 0.000325f, 0.992188f, 0.000354f, 0.990234f, 0.000372f, 0.988770f, 0.000384f, 0.986816f, + 0.000405f, 0.984863f, 0.000433f, 0.982422f, 0.000450f, 0.980469f, 0.000462f, 0.977539f, + 0.000470f, 0.975098f, 0.000484f, 0.972168f, 0.000509f, 0.969238f, 0.000523f, 0.965820f, + 0.000534f, 0.962891f, 0.000546f, 0.959473f, 0.000547f, 0.956055f, 0.000560f, 0.951660f, + 0.000568f, 0.947754f, 0.000567f, 0.942871f, 0.000567f, 0.938965f, 0.000565f, 0.934082f, + 0.000562f, 0.928711f, 0.000576f, 0.923828f, 0.000587f, 0.917969f, 0.000571f, 0.911621f, + 0.000574f, 0.905762f, 0.000578f, 0.899414f, 0.000585f, 0.893066f, 0.000604f, 0.885254f, + 0.000618f, 0.877930f, 0.000595f, 0.869629f, 0.000592f, 0.860840f, 0.000587f, 0.852051f, + 0.000584f, 0.843262f, 0.000597f, 0.833008f, 0.000576f, 0.822266f, 0.000570f, 0.810547f, + 0.000566f, 0.798828f, 0.000563f, 0.786133f, 0.000557f, 0.772949f, 0.000562f, 0.758301f, + 0.000527f, 0.742188f, 0.000520f, 0.726074f, 0.000510f, 0.708008f, 0.000502f, 0.688965f, + 0.000501f, 0.667969f, 0.000459f, 0.644531f, 0.000446f, 0.620117f, 0.000430f, 0.592773f, + 0.000426f, 0.562500f, 0.000376f, 0.528320f, 0.000356f, 0.488770f, 0.000336f, 0.444824f, + 0.000289f, 0.390869f, 0.000256f, 0.323975f, 0.000186f, 0.233765f, 0.000055f, 0.088806f, + 0.000000f, 1.000000f, 0.000290f, 0.999512f, 0.000479f, 0.998535f, 0.000458f, 0.997559f, + 0.000594f, 0.997070f, 0.000597f, 0.995605f, 0.000589f, 0.994629f, 0.000578f, 0.993164f, + 0.000700f, 0.991699f, 0.000701f, 0.989746f, 0.000705f, 0.987793f, 0.000717f, 0.986328f, + 0.000832f, 0.983887f, 0.000863f, 0.980957f, 0.000886f, 0.979492f, 0.000904f, 0.976562f, + 0.000924f, 0.973633f, 0.001012f, 0.970703f, 0.001016f, 0.967773f, 0.001011f, 0.964844f, + 0.001012f, 0.961426f, 0.000993f, 0.958008f, 0.000986f, 0.954102f, 0.001061f, 0.950195f, + 0.001078f, 0.945801f, 0.001095f, 0.941895f, 0.001074f, 0.936523f, 0.001083f, 0.932129f, + 0.001089f, 0.927246f, 0.001166f, 0.921387f, 0.001181f, 0.916016f, 0.001144f, 0.910156f, + 0.001142f, 0.903809f, 0.001140f, 0.897461f, 0.001143f, 0.890625f, 0.001197f, 0.883301f, + 0.001204f, 0.875488f, 0.001161f, 0.867188f, 0.001157f, 0.859375f, 0.001145f, 0.850098f, + 0.001142f, 0.841309f, 0.001189f, 0.831055f, 0.001193f, 0.820312f, 0.001132f, 0.808594f, + 0.001108f, 0.796387f, 0.001103f, 0.784668f, 0.001098f, 0.770996f, 0.001127f, 0.756348f, + 0.001060f, 0.740234f, 0.001034f, 0.724121f, 0.001017f, 0.706543f, 0.000998f, 0.687988f, + 0.001012f, 0.666504f, 0.000923f, 0.643066f, 0.000898f, 0.618652f, 0.000873f, 0.591797f, + 0.000868f, 0.561523f, 0.000779f, 0.527344f, 0.000734f, 0.487793f, 0.000689f, 0.444580f, + 0.000599f, 0.389893f, 0.000523f, 0.323730f, 0.000373f, 0.233398f, 0.000099f, 0.089417f, + 0.000000f, 1.000000f, 0.000400f, 0.999023f, 0.000689f, 0.998047f, 0.000645f, 0.997559f, + 0.000905f, 0.996094f, 0.000939f, 0.995117f, 0.000952f, 0.994141f, 0.000978f, 0.992676f, + 0.001211f, 0.990234f, 0.001227f, 0.988770f, 0.001247f, 0.986816f, 0.001269f, 0.985352f, + 0.001455f, 0.982422f, 0.001476f, 0.979980f, 0.001487f, 0.977539f, 0.001502f, 0.975098f, + 0.001516f, 0.973145f, 0.001651f, 0.968750f, 0.001658f, 0.966309f, 0.001681f, 0.962891f, + 0.001699f, 0.959961f, 0.001675f, 0.956055f, 0.001800f, 0.952148f, 0.001839f, 0.948242f, + 0.001871f, 0.943848f, 0.001901f, 0.939453f, 0.001863f, 0.935059f, 0.001866f, 0.929688f, + 0.001955f, 0.925293f, 0.001974f, 0.919434f, 0.001995f, 0.913574f, 0.002020f, 0.908203f, + 0.001972f, 0.901367f, 0.001980f, 0.895020f, 0.001961f, 0.888672f, 0.002048f, 0.880859f, + 0.002071f, 0.873535f, 0.002018f, 0.865234f, 0.002022f, 0.856445f, 0.001982f, 0.847656f, + 0.001980f, 0.838867f, 0.002050f, 0.828125f, 0.002064f, 0.817871f, 0.001986f, 0.806152f, + 0.001945f, 0.794434f, 0.001921f, 0.782227f, 0.001959f, 0.769043f, 0.001961f, 0.753906f, + 0.001888f, 0.738770f, 0.001832f, 0.722168f, 0.001790f, 0.704590f, 0.001757f, 0.686035f, + 0.001786f, 0.664551f, 0.001705f, 0.641602f, 0.001612f, 0.617188f, 0.001554f, 0.590820f, + 0.001547f, 0.560547f, 0.001420f, 0.525879f, 0.001320f, 0.487549f, 0.001236f, 0.444092f, + 0.001087f, 0.389893f, 0.000926f, 0.323975f, 0.000646f, 0.233643f, 0.000157f, 0.088928f, + 0.000000f, 1.000000f, 0.000587f, 0.999023f, 0.001062f, 0.998047f, 0.001081f, 0.997070f, + 0.001424f, 0.995605f, 0.001475f, 0.994141f, 0.001475f, 0.992676f, 0.001491f, 0.991699f, + 0.001861f, 0.989258f, 0.001906f, 0.987305f, 0.001948f, 0.985840f, 0.001966f, 0.983887f, + 0.002239f, 0.980957f, 0.002279f, 0.978516f, 0.002285f, 0.976074f, 0.002308f, 0.973633f, + 0.002323f, 0.971191f, 0.002596f, 0.967773f, 0.002604f, 0.963867f, 0.002636f, 0.960938f, + 0.002666f, 0.958008f, 0.002708f, 0.954102f, 0.002844f, 0.950195f, 0.002907f, 0.945801f, + 0.002932f, 0.941406f, 0.002943f, 0.937012f, 0.002970f, 0.932617f, 0.002930f, 0.928223f, + 0.003109f, 0.922363f, 0.003160f, 0.916992f, 0.003153f, 0.910645f, 0.003172f, 0.904785f, + 0.003120f, 0.898926f, 0.003136f, 0.892578f, 0.003147f, 0.885742f, 0.003265f, 0.877930f, + 0.003284f, 0.870117f, 0.003296f, 0.862305f, 0.003214f, 0.853516f, 0.003225f, 0.845215f, + 0.003166f, 0.835938f, 0.003283f, 0.825195f, 0.003279f, 0.814941f, 0.003195f, 0.803711f, + 0.003191f, 0.791992f, 0.003122f, 0.779785f, 0.003168f, 0.766113f, 0.003157f, 0.751953f, + 0.003057f, 0.736328f, 0.002977f, 0.719727f, 0.002920f, 0.702637f, 0.002855f, 0.684082f, + 0.002897f, 0.662598f, 0.002787f, 0.639648f, 0.002647f, 0.615234f, 0.002542f, 0.588867f, + 0.002527f, 0.559082f, 0.002344f, 0.524902f, 0.002171f, 0.486572f, 0.002010f, 0.443848f, + 0.001811f, 0.389404f, 0.001480f, 0.323242f, 0.001016f, 0.233276f, 0.000229f, 0.088867f, + 0.000000f, 1.000000f, 0.000327f, 0.999023f, 0.001012f, 0.997559f, 0.001468f, 0.996582f, + 0.001693f, 0.995117f, 0.002108f, 0.993164f, 0.002146f, 0.991699f, 0.002295f, 0.990234f, + 0.002686f, 0.988281f, 0.002760f, 0.986328f, 0.002800f, 0.984375f, 0.002920f, 0.982422f, + 0.003242f, 0.979004f, 0.003294f, 0.976562f, 0.003368f, 0.974121f, 0.003374f, 0.971680f, + 0.003489f, 0.968750f, 0.003803f, 0.965332f, 0.003891f, 0.961914f, 0.003895f, 0.958008f, + 0.003929f, 0.955078f, 0.003956f, 0.952148f, 0.004257f, 0.947266f, 0.004269f, 0.943359f, + 0.004345f, 0.938477f, 0.004395f, 0.934570f, 0.004387f, 0.929688f, 0.004433f, 0.924805f, + 0.004612f, 0.918945f, 0.004677f, 0.913574f, 0.004688f, 0.907715f, 0.004730f, 0.901855f, + 0.004765f, 0.895996f, 0.004665f, 0.889648f, 0.004887f, 0.882324f, 0.004883f, 0.874512f, + 0.004932f, 0.867188f, 0.004917f, 0.859375f, 0.004841f, 0.850586f, 0.004833f, 0.841797f, + 0.004807f, 0.832520f, 0.004986f, 0.821777f, 0.004955f, 0.811523f, 0.004833f, 0.800293f, + 0.004814f, 0.789062f, 0.004726f, 0.776855f, 0.004807f, 0.763184f, 0.004787f, 0.748535f, + 0.004654f, 0.732910f, 0.004623f, 0.717285f, 0.004509f, 0.700195f, 0.004387f, 0.681641f, + 0.004436f, 0.660156f, 0.004265f, 0.637695f, 0.004120f, 0.613770f, 0.003937f, 0.587891f, + 0.003866f, 0.557129f, 0.003656f, 0.523438f, 0.003355f, 0.485596f, 0.003040f, 0.442871f, + 0.002743f, 0.388428f, 0.002197f, 0.323486f, 0.001485f, 0.232666f, 0.000321f, 0.089050f, + 0.000000f, 1.000000f, 0.000594f, 0.999023f, 0.001543f, 0.997559f, 0.002008f, 0.996094f, + 0.002377f, 0.994141f, 0.002901f, 0.992188f, 0.002945f, 0.990723f, 0.003237f, 0.988770f, + 0.003736f, 0.986816f, 0.003828f, 0.984863f, 0.003881f, 0.982910f, 0.004097f, 0.979980f, + 0.004555f, 0.977539f, 0.004597f, 0.974609f, 0.004696f, 0.972168f, 0.004784f, 0.969727f, + 0.004951f, 0.966309f, 0.005341f, 0.962402f, 0.005440f, 0.958984f, 0.005455f, 0.956055f, + 0.005497f, 0.952148f, 0.005569f, 0.948730f, 0.005840f, 0.944824f, 0.006130f, 0.939453f, + 0.006111f, 0.935059f, 0.006203f, 0.930664f, 0.006264f, 0.926270f, 0.006260f, 0.921875f, + 0.006573f, 0.916016f, 0.006634f, 0.909668f, 0.006733f, 0.904297f, 0.006706f, 0.897949f, + 0.006767f, 0.892090f, 0.006645f, 0.885742f, 0.007000f, 0.878418f, 0.007069f, 0.870605f, + 0.007053f, 0.862793f, 0.007092f, 0.855469f, 0.007069f, 0.847168f, 0.006927f, 0.838379f, + 0.007217f, 0.829102f, 0.007172f, 0.818359f, 0.007126f, 0.808105f, 0.007095f, 0.797363f, + 0.006981f, 0.785645f, 0.006851f, 0.773438f, 0.007057f, 0.759766f, 0.006981f, 0.745117f, + 0.006924f, 0.729980f, 0.006699f, 0.713867f, 0.006546f, 0.697266f, 0.006569f, 0.678711f, + 0.006435f, 0.657227f, 0.006199f, 0.635254f, 0.005989f, 0.611328f, 0.005718f, 0.586426f, + 0.005638f, 0.555664f, 0.005310f, 0.521973f, 0.004852f, 0.484619f, 0.004410f, 0.442627f, + 0.003910f, 0.387695f, 0.003103f, 0.323486f, 0.002079f, 0.231812f, 0.000437f, 0.088501f, + 0.000000f, 1.000000f, 0.000842f, 0.999023f, 0.001601f, 0.997070f, 0.002188f, 0.995605f, + 0.003227f, 0.993164f, 0.003399f, 0.991699f, 0.003914f, 0.989746f, 0.004398f, 0.987305f, + 0.004604f, 0.985352f, 0.005123f, 0.982910f, 0.005222f, 0.980957f, 0.005692f, 0.978516f, + 0.005787f, 0.975586f, 0.006268f, 0.972168f, 0.006329f, 0.969727f, 0.006454f, 0.967285f, + 0.006855f, 0.963379f, 0.007244f, 0.959473f, 0.007401f, 0.956055f, 0.007504f, 0.952637f, + 0.007519f, 0.949219f, 0.007637f, 0.945312f, 0.007980f, 0.940430f, 0.008423f, 0.936523f, + 0.008354f, 0.931641f, 0.008461f, 0.927246f, 0.008560f, 0.922852f, 0.008690f, 0.917480f, + 0.009163f, 0.911621f, 0.009155f, 0.905762f, 0.009224f, 0.899902f, 0.009323f, 0.894043f, + 0.009277f, 0.888184f, 0.009407f, 0.882324f, 0.009659f, 0.874023f, 0.009796f, 0.866211f, + 0.009727f, 0.858398f, 0.009811f, 0.850586f, 0.009758f, 0.842773f, 0.009644f, 0.834961f, + 0.010002f, 0.824219f, 0.009933f, 0.813965f, 0.009964f, 0.803711f, 0.009933f, 0.792969f, + 0.009727f, 0.781250f, 0.009659f, 0.770020f, 0.009827f, 0.755371f, 0.009743f, 0.741211f, + 0.009651f, 0.726562f, 0.009392f, 0.710938f, 0.009132f, 0.694824f, 0.009201f, 0.675293f, + 0.009056f, 0.654297f, 0.008705f, 0.632812f, 0.008377f, 0.609375f, 0.007980f, 0.583984f, + 0.007843f, 0.553223f, 0.007362f, 0.520020f, 0.006710f, 0.483643f, 0.006084f, 0.441162f, + 0.005352f, 0.386963f, 0.004211f, 0.322510f, 0.002754f, 0.231689f, 0.000555f, 0.088196f, + 0.000000f, 1.000000f, 0.001199f, 0.998535f, 0.001856f, 0.997070f, 0.002905f, 0.995117f, + 0.003901f, 0.992676f, 0.004478f, 0.990723f, 0.005035f, 0.988770f, 0.005505f, 0.985840f, + 0.006081f, 0.983398f, 0.006638f, 0.980957f, 0.006805f, 0.979004f, 0.007263f, 0.976074f, + 0.007786f, 0.972656f, 0.008293f, 0.969727f, 0.008400f, 0.966797f, 0.008461f, 0.964355f, + 0.009155f, 0.959961f, 0.009377f, 0.956543f, 0.009758f, 0.952637f, 0.009972f, 0.949219f, + 0.010078f, 0.945801f, 0.010284f, 0.941406f, 0.010689f, 0.936523f, 0.011162f, 0.932129f, + 0.011368f, 0.927734f, 0.011230f, 0.923340f, 0.011398f, 0.918457f, 0.011879f, 0.913574f, + 0.012062f, 0.907227f, 0.012398f, 0.901367f, 0.012383f, 0.895508f, 0.012451f, 0.889648f, + 0.012566f, 0.883789f, 0.012810f, 0.876953f, 0.013092f, 0.869629f, 0.013123f, 0.861816f, + 0.013290f, 0.854492f, 0.013168f, 0.846191f, 0.013191f, 0.838379f, 0.013115f, 0.829590f, + 0.013580f, 0.819336f, 0.013618f, 0.809570f, 0.013489f, 0.799316f, 0.013374f, 0.788574f, + 0.013107f, 0.777344f, 0.013306f, 0.765137f, 0.013374f, 0.751465f, 0.013237f, 0.737305f, + 0.013016f, 0.722656f, 0.012726f, 0.707520f, 0.012398f, 0.691406f, 0.012527f, 0.671875f, + 0.012276f, 0.650879f, 0.011787f, 0.629883f, 0.011375f, 0.606934f, 0.010841f, 0.581543f, + 0.010605f, 0.551270f, 0.009911f, 0.518066f, 0.009056f, 0.481934f, 0.008156f, 0.439209f, + 0.007133f, 0.385986f, 0.005486f, 0.322266f, 0.003534f, 0.231201f, 0.000685f, 0.087402f, + 0.000000f, 1.000000f, 0.001122f, 0.998535f, 0.002628f, 0.996582f, 0.003237f, 0.994629f, + 0.004601f, 0.991699f, 0.005741f, 0.989258f, 0.005901f, 0.987305f, 0.007145f, 0.983887f, + 0.007790f, 0.980957f, 0.008018f, 0.979004f, 0.008659f, 0.976562f, 0.009377f, 0.973145f, + 0.010048f, 0.969727f, 0.010307f, 0.967285f, 0.010864f, 0.963867f, 0.011108f, 0.960449f, + 0.011986f, 0.956543f, 0.012207f, 0.952637f, 0.012863f, 0.949219f, 0.012848f, 0.945312f, + 0.013107f, 0.941895f, 0.013664f, 0.937012f, 0.014084f, 0.932129f, 0.014572f, 0.927246f, + 0.014801f, 0.922852f, 0.014999f, 0.918945f, 0.014900f, 0.914062f, 0.015617f, 0.907715f, + 0.015976f, 0.902344f, 0.016327f, 0.896484f, 0.016342f, 0.890625f, 0.016373f, 0.884766f, + 0.016434f, 0.878906f, 0.016968f, 0.871094f, 0.017136f, 0.863770f, 0.017426f, 0.856445f, + 0.017410f, 0.849121f, 0.017441f, 0.841309f, 0.017426f, 0.833496f, 0.017822f, 0.824219f, + 0.017883f, 0.813965f, 0.017944f, 0.803711f, 0.017868f, 0.793945f, 0.017822f, 0.783691f, + 0.017654f, 0.772949f, 0.017700f, 0.759766f, 0.017715f, 0.746582f, 0.017563f, 0.732422f, + 0.017349f, 0.718262f, 0.016953f, 0.703613f, 0.016571f, 0.687500f, 0.016663f, 0.667480f, + 0.016159f, 0.647461f, 0.015793f, 0.626465f, 0.015045f, 0.604492f, 0.014397f, 0.578613f, + 0.013908f, 0.548340f, 0.012947f, 0.516113f, 0.011795f, 0.480469f, 0.010681f, 0.437744f, + 0.009186f, 0.385010f, 0.007019f, 0.322510f, 0.004486f, 0.231201f, 0.000840f, 0.086182f, + 0.000000f, 1.000000f, 0.001562f, 0.998535f, 0.003016f, 0.996094f, 0.003725f, 0.994629f, + 0.005463f, 0.990723f, 0.006287f, 0.988770f, 0.007427f, 0.985840f, 0.008575f, 0.982422f, + 0.009804f, 0.979492f, 0.010109f, 0.977051f, 0.010483f, 0.974121f, 0.011909f, 0.969727f, + 0.012657f, 0.966309f, 0.013023f, 0.963867f, 0.013741f, 0.960449f, 0.014297f, 0.956543f, + 0.014893f, 0.952637f, 0.015625f, 0.948730f, 0.015854f, 0.944824f, 0.016586f, 0.941406f, + 0.016937f, 0.937012f, 0.017578f, 0.932129f, 0.018219f, 0.927246f, 0.018372f, 0.922852f, + 0.018921f, 0.917969f, 0.019180f, 0.913574f, 0.019669f, 0.908691f, 0.020218f, 0.902344f, + 0.020538f, 0.896484f, 0.021225f, 0.891113f, 0.021149f, 0.885254f, 0.021286f, 0.879395f, + 0.021515f, 0.872559f, 0.022141f, 0.865234f, 0.022308f, 0.857910f, 0.022522f, 0.850586f, + 0.022629f, 0.843262f, 0.022736f, 0.835938f, 0.022537f, 0.827637f, 0.023331f, 0.817871f, + 0.023315f, 0.808105f, 0.023376f, 0.798340f, 0.023117f, 0.788574f, 0.023041f, 0.778320f, + 0.022858f, 0.768066f, 0.023010f, 0.754395f, 0.023224f, 0.741211f, 0.022888f, 0.727539f, + 0.022522f, 0.713867f, 0.021866f, 0.699219f, 0.021835f, 0.682617f, 0.021667f, 0.663086f, + 0.021057f, 0.643555f, 0.020325f, 0.623535f, 0.019501f, 0.601562f, 0.018707f, 0.575195f, + 0.017914f, 0.545410f, 0.016632f, 0.514160f, 0.015022f, 0.479492f, 0.013664f, 0.435791f, + 0.011627f, 0.384521f, 0.008766f, 0.322266f, 0.005531f, 0.230347f, 0.001017f, 0.085449f, + 0.000000f, 1.000000f, 0.001565f, 0.998535f, 0.003548f, 0.996094f, 0.004803f, 0.993652f, + 0.006626f, 0.989746f, 0.007435f, 0.987793f, 0.008812f, 0.984375f, 0.010437f, 0.979980f, + 0.011238f, 0.977051f, 0.012505f, 0.974121f, 0.013237f, 0.970703f, 0.014847f, 0.966797f, + 0.015343f, 0.963379f, 0.016144f, 0.959961f, 0.016541f, 0.957031f, 0.018036f, 0.952148f, + 0.018906f, 0.948242f, 0.019608f, 0.944336f, 0.019928f, 0.940430f, 0.020584f, 0.936523f, + 0.021576f, 0.931641f, 0.022156f, 0.926758f, 0.022903f, 0.921387f, 0.023300f, 0.917480f, + 0.023849f, 0.913086f, 0.024063f, 0.908203f, 0.025177f, 0.902344f, 0.026001f, 0.896484f, + 0.026001f, 0.890137f, 0.026688f, 0.884766f, 0.027115f, 0.879395f, 0.026993f, 0.873535f, + 0.027878f, 0.866211f, 0.028305f, 0.858887f, 0.028580f, 0.852051f, 0.029007f, 0.844238f, + 0.028885f, 0.836914f, 0.028793f, 0.830078f, 0.029510f, 0.821289f, 0.029755f, 0.811523f, + 0.030136f, 0.802246f, 0.030014f, 0.792480f, 0.029861f, 0.782715f, 0.029663f, 0.772949f, + 0.029831f, 0.762207f, 0.029831f, 0.748535f, 0.029739f, 0.735840f, 0.029343f, 0.722656f, + 0.028915f, 0.709473f, 0.028275f, 0.694824f, 0.028061f, 0.677246f, 0.027786f, 0.658691f, + 0.027008f, 0.639648f, 0.026138f, 0.620117f, 0.024826f, 0.598633f, 0.023987f, 0.571777f, + 0.022766f, 0.542969f, 0.020981f, 0.512207f, 0.019073f, 0.478027f, 0.017105f, 0.434082f, + 0.014404f, 0.382812f, 0.010895f, 0.322510f, 0.006779f, 0.230347f, 0.001223f, 0.084961f, + 0.000000f, 1.000000f, 0.001669f, 0.998535f, 0.003778f, 0.995605f, 0.005211f, 0.992676f, + 0.007935f, 0.988770f, 0.009338f, 0.985840f, 0.010193f, 0.982422f, 0.012466f, 0.978027f, + 0.013901f, 0.974609f, 0.014366f, 0.972168f, 0.016434f, 0.966797f, 0.017426f, 0.963379f, + 0.018829f, 0.959473f, 0.019730f, 0.956055f, 0.020538f, 0.952148f, 0.021805f, 0.947754f, + 0.023224f, 0.943359f, 0.024200f, 0.939453f, 0.024612f, 0.935547f, 0.025192f, 0.931152f, + 0.026642f, 0.925781f, 0.027664f, 0.920898f, 0.028488f, 0.916016f, 0.028809f, 0.911621f, + 0.029770f, 0.907227f, 0.030457f, 0.901367f, 0.031464f, 0.895508f, 0.032318f, 0.889648f, + 0.032562f, 0.884277f, 0.033112f, 0.878418f, 0.033478f, 0.872559f, 0.034363f, 0.866699f, + 0.034698f, 0.858398f, 0.035614f, 0.852051f, 0.035736f, 0.844727f, 0.036346f, 0.837891f, + 0.036469f, 0.831055f, 0.036346f, 0.823242f, 0.037079f, 0.813477f, 0.037598f, 0.804688f, + 0.037933f, 0.795410f, 0.037476f, 0.786133f, 0.037415f, 0.776855f, 0.037231f, 0.767578f, + 0.037598f, 0.754883f, 0.037354f, 0.742188f, 0.037262f, 0.729492f, 0.036743f, 0.717285f, + 0.036316f, 0.704102f, 0.035858f, 0.689941f, 0.035431f, 0.671387f, 0.034821f, 0.653809f, + 0.033936f, 0.635742f, 0.032593f, 0.616211f, 0.030960f, 0.595215f, 0.030136f, 0.568359f, + 0.028427f, 0.539551f, 0.026245f, 0.509766f, 0.023666f, 0.476562f, 0.021240f, 0.431885f, + 0.017776f, 0.381836f, 0.013306f, 0.322021f, 0.008209f, 0.230225f, 0.001459f, 0.084290f, + 0.000000f, 1.000000f, 0.001827f, 0.998535f, 0.005047f, 0.994629f, 0.007000f, 0.991211f, + 0.009064f, 0.987793f, 0.010567f, 0.984375f, 0.012871f, 0.979980f, 0.014038f, 0.976562f, + 0.016022f, 0.972656f, 0.017563f, 0.968750f, 0.019684f, 0.963379f, 0.021286f, 0.959473f, + 0.022369f, 0.955566f, 0.023438f, 0.952148f, 0.025162f, 0.946777f, 0.026611f, 0.942383f, + 0.028183f, 0.937988f, 0.028885f, 0.934082f, 0.029938f, 0.930664f, 0.031235f, 0.925293f, + 0.032684f, 0.919434f, 0.033630f, 0.914551f, 0.034729f, 0.909668f, 0.035248f, 0.905762f, + 0.035797f, 0.900391f, 0.037567f, 0.894043f, 0.038605f, 0.888184f, 0.039307f, 0.882812f, + 0.040070f, 0.876953f, 0.040314f, 0.872070f, 0.041016f, 0.865723f, 0.042450f, 0.858398f, + 0.043365f, 0.851562f, 0.043488f, 0.843750f, 0.044189f, 0.837402f, 0.044525f, 0.830566f, + 0.044647f, 0.824219f, 0.045227f, 0.814941f, 0.045959f, 0.805664f, 0.046387f, 0.796875f, + 0.046204f, 0.788574f, 0.046539f, 0.779785f, 0.046204f, 0.770508f, 0.046387f, 0.759766f, + 0.046570f, 0.747559f, 0.046509f, 0.735840f, 0.046204f, 0.723145f, 0.045837f, 0.711426f, + 0.044891f, 0.699219f, 0.044495f, 0.683594f, 0.043854f, 0.666016f, 0.043121f, 0.648926f, + 0.041809f, 0.631348f, 0.040222f, 0.612793f, 0.038391f, 0.590332f, 0.037079f, 0.564453f, + 0.034943f, 0.537109f, 0.032379f, 0.507812f, 0.028885f, 0.475342f, 0.025864f, 0.429688f, + 0.021500f, 0.380615f, 0.015945f, 0.321777f, 0.009758f, 0.229370f, 0.001731f, 0.083496f, + 0.000000f, 1.000000f, 0.002783f, 0.997559f, 0.005577f, 0.994141f, 0.007812f, 0.990723f, + 0.010483f, 0.986816f, 0.012062f, 0.983398f, 0.014725f, 0.978027f, 0.017319f, 0.973633f, + 0.018478f, 0.969727f, 0.020584f, 0.965332f, 0.023178f, 0.959961f, 0.025238f, 0.955566f, + 0.026505f, 0.951660f, 0.027969f, 0.947266f, 0.030487f, 0.941406f, 0.032104f, 0.936523f, + 0.033356f, 0.932617f, 0.034607f, 0.928223f, 0.036163f, 0.923828f, 0.037964f, 0.917969f, + 0.039307f, 0.913086f, 0.040588f, 0.907715f, 0.041443f, 0.903320f, 0.042419f, 0.898438f, + 0.044098f, 0.892578f, 0.045685f, 0.886230f, 0.046814f, 0.880371f, 0.047333f, 0.875000f, + 0.048370f, 0.869629f, 0.048828f, 0.864258f, 0.050385f, 0.856934f, 0.051239f, 0.849609f, + 0.052368f, 0.843262f, 0.053314f, 0.836426f, 0.053040f, 0.829590f, 0.054077f, 0.823730f, + 0.054504f, 0.814941f, 0.055359f, 0.806641f, 0.055878f, 0.797852f, 0.056152f, 0.789062f, + 0.056152f, 0.781250f, 0.056274f, 0.772461f, 0.056000f, 0.763184f, 0.056763f, 0.751465f, + 0.056610f, 0.740234f, 0.056488f, 0.729004f, 0.056030f, 0.717285f, 0.055145f, 0.705566f, + 0.054169f, 0.692871f, 0.054047f, 0.676758f, 0.053192f, 0.660156f, 0.052032f, 0.643555f, + 0.050323f, 0.626465f, 0.048279f, 0.608398f, 0.046814f, 0.585449f, 0.044647f, 0.560059f, + 0.042236f, 0.533691f, 0.038666f, 0.505371f, 0.034912f, 0.472412f, 0.031082f, 0.427734f, + 0.025772f, 0.380371f, 0.019012f, 0.321777f, 0.011581f, 0.229980f, 0.002018f, 0.082336f, + 0.000000f, 1.000000f, 0.003298f, 0.997070f, 0.006264f, 0.993652f, 0.008881f, 0.989746f, + 0.012100f, 0.985352f, 0.014313f, 0.981445f, 0.017776f, 0.975586f, 0.019714f, 0.971191f, + 0.021927f, 0.967285f, 0.024277f, 0.961426f, 0.027039f, 0.956055f, 0.029388f, 0.951660f, + 0.031143f, 0.947266f, 0.033844f, 0.941406f, 0.035645f, 0.936035f, 0.037964f, 0.930664f, + 0.039337f, 0.926270f, 0.040619f, 0.922363f, 0.043152f, 0.916016f, 0.045349f, 0.910156f, + 0.046814f, 0.905273f, 0.048218f, 0.900879f, 0.049377f, 0.896484f, 0.051117f, 0.889648f, + 0.052612f, 0.883301f, 0.054382f, 0.877930f, 0.055756f, 0.872070f, 0.056580f, 0.867188f, + 0.057404f, 0.861816f, 0.058929f, 0.854980f, 0.060638f, 0.847656f, 0.061646f, 0.841309f, + 0.062225f, 0.834473f, 0.063354f, 0.828125f, 0.063660f, 0.822266f, 0.064331f, 0.814453f, + 0.065979f, 0.806152f, 0.066284f, 0.797363f, 0.066406f, 0.789062f, 0.067322f, 0.781250f, + 0.067139f, 0.773926f, 0.067078f, 0.765625f, 0.067383f, 0.753906f, 0.067688f, 0.743164f, + 0.067749f, 0.732910f, 0.067383f, 0.721680f, 0.066528f, 0.710938f, 0.065735f, 0.699707f, + 0.065247f, 0.685059f, 0.064880f, 0.669922f, 0.063538f, 0.654297f, 0.062073f, 0.638184f, + 0.059814f, 0.622070f, 0.057617f, 0.604492f, 0.056122f, 0.580566f, 0.052917f, 0.555664f, + 0.049835f, 0.530762f, 0.045776f, 0.502930f, 0.041260f, 0.468262f, 0.036835f, 0.425781f, + 0.030258f, 0.379150f, 0.022263f, 0.322021f, 0.013573f, 0.229248f, 0.002316f, 0.081360f, + 0.000000f, 1.000000f, 0.003561f, 0.997070f, 0.007156f, 0.993164f, 0.010612f, 0.988281f, + 0.014122f, 0.983887f, 0.016617f, 0.979004f, 0.020523f, 0.973145f, 0.023422f, 0.968262f, + 0.025726f, 0.963867f, 0.029572f, 0.957031f, 0.031586f, 0.951660f, 0.034027f, 0.947266f, + 0.036560f, 0.941895f, 0.039612f, 0.935059f, 0.042511f, 0.929688f, 0.044067f, 0.924805f, + 0.046448f, 0.920410f, 0.048859f, 0.914062f, 0.050842f, 0.908203f, 0.053650f, 0.902344f, + 0.055206f, 0.897461f, 0.056335f, 0.893066f, 0.058716f, 0.887207f, 0.061005f, 0.880859f, + 0.062408f, 0.874512f, 0.063965f, 0.868652f, 0.065552f, 0.863770f, 0.066467f, 0.858887f, + 0.068359f, 0.852051f, 0.069702f, 0.844727f, 0.071289f, 0.838379f, 0.072754f, 0.832031f, + 0.073669f, 0.825684f, 0.074219f, 0.819336f, 0.075256f, 0.812988f, 0.076050f, 0.804199f, + 0.077515f, 0.795898f, 0.078308f, 0.788574f, 0.078613f, 0.780762f, 0.078796f, 0.772949f, + 0.078918f, 0.766113f, 0.080017f, 0.755859f, 0.080200f, 0.745117f, 0.080139f, 0.734863f, + 0.080078f, 0.724609f, 0.079163f, 0.714355f, 0.078430f, 0.704590f, 0.077454f, 0.691406f, + 0.077209f, 0.677734f, 0.076233f, 0.662598f, 0.074829f, 0.648926f, 0.072632f, 0.632812f, + 0.070129f, 0.617676f, 0.067993f, 0.597656f, 0.065552f, 0.575195f, 0.062286f, 0.551758f, + 0.057983f, 0.526855f, 0.053223f, 0.500977f, 0.048401f, 0.464600f, 0.042664f, 0.423828f, + 0.035034f, 0.377930f, 0.025772f, 0.319092f, 0.015602f, 0.228149f, 0.002670f, 0.080383f, + 0.000000f, 1.000000f, 0.004112f, 0.996582f, 0.008255f, 0.992676f, 0.012413f, 0.986816f, + 0.016052f, 0.982422f, 0.019943f, 0.976074f, 0.023285f, 0.970703f, 0.026810f, 0.965820f, + 0.030579f, 0.958496f, 0.033691f, 0.953125f, 0.037384f, 0.947266f, 0.039032f, 0.942871f, + 0.043030f, 0.935059f, 0.046204f, 0.929199f, 0.049713f, 0.923340f, 0.051880f, 0.918457f, + 0.054718f, 0.912109f, 0.057709f, 0.905273f, 0.059967f, 0.899414f, 0.061676f, 0.894531f, + 0.064148f, 0.889160f, 0.066162f, 0.883789f, 0.068848f, 0.876953f, 0.071350f, 0.871094f, + 0.073486f, 0.865234f, 0.074829f, 0.859863f, 0.075806f, 0.854980f, 0.078308f, 0.848145f, + 0.080627f, 0.841309f, 0.082092f, 0.833984f, 0.083191f, 0.828125f, 0.084839f, 0.822266f, + 0.085815f, 0.816406f, 0.086609f, 0.810059f, 0.088196f, 0.801270f, 0.089783f, 0.793945f, + 0.090210f, 0.786133f, 0.091125f, 0.778809f, 0.091736f, 0.771973f, 0.091553f, 0.764648f, + 0.092224f, 0.754883f, 0.093079f, 0.745117f, 0.093140f, 0.735352f, 0.093201f, 0.726562f, + 0.092651f, 0.716797f, 0.091797f, 0.707520f, 0.091370f, 0.696777f, 0.090515f, 0.682617f, + 0.089661f, 0.669434f, 0.088318f, 0.655762f, 0.086060f, 0.642578f, 0.084045f, 0.627930f, + 0.081116f, 0.611816f, 0.079163f, 0.591797f, 0.075562f, 0.569824f, 0.072144f, 0.548340f, + 0.067139f, 0.524414f, 0.061523f, 0.499268f, 0.056396f, 0.461914f, 0.049164f, 0.421631f, + 0.040161f, 0.376953f, 0.030151f, 0.317139f, 0.017792f, 0.228027f, 0.003069f, 0.079773f, + 0.000000f, 1.000000f, 0.005325f, 0.996094f, 0.009186f, 0.992188f, 0.014565f, 0.985840f, + 0.018402f, 0.980469f, 0.023132f, 0.973633f, 0.027496f, 0.967285f, 0.030396f, 0.962402f, + 0.035278f, 0.954590f, 0.039673f, 0.948242f, 0.042419f, 0.942871f, 0.046692f, 0.935547f, + 0.050446f, 0.928223f, 0.053772f, 0.922363f, 0.056091f, 0.917480f, 0.060211f, 0.910645f, + 0.064026f, 0.902832f, 0.067261f, 0.896484f, 0.070068f, 0.891113f, 0.071838f, 0.885742f, + 0.073975f, 0.880371f, 0.078003f, 0.872559f, 0.080627f, 0.866699f, 0.082458f, 0.860840f, + 0.085022f, 0.855469f, 0.086670f, 0.851074f, 0.088562f, 0.843262f, 0.091431f, 0.835938f, + 0.093506f, 0.830078f, 0.095276f, 0.823730f, 0.096313f, 0.818359f, 0.097229f, 0.812500f, + 0.099304f, 0.806152f, 0.100830f, 0.797363f, 0.102783f, 0.790039f, 0.103333f, 0.782715f, + 0.104858f, 0.776367f, 0.104614f, 0.769043f, 0.105286f, 0.763184f, 0.106323f, 0.753418f, + 0.106995f, 0.744141f, 0.107483f, 0.734863f, 0.107544f, 0.726074f, 0.106689f, 0.717285f, + 0.106262f, 0.708984f, 0.104980f, 0.699707f, 0.105103f, 0.686035f, 0.104309f, 0.673828f, + 0.102844f, 0.661621f, 0.100952f, 0.648926f, 0.098694f, 0.636230f, 0.095947f, 0.623047f, + 0.093689f, 0.604492f, 0.090698f, 0.584961f, 0.086853f, 0.565430f, 0.082336f, 0.544434f, + 0.076477f, 0.521973f, 0.070312f, 0.493408f, 0.064026f, 0.458008f, 0.056061f, 0.419922f, + 0.045807f, 0.376953f, 0.034241f, 0.314941f, 0.020111f, 0.228149f, 0.003462f, 0.079407f, + 0.000000f, 1.000000f, 0.005852f, 0.995605f, 0.010582f, 0.991211f, 0.016800f, 0.984375f, + 0.021683f, 0.978027f, 0.027328f, 0.970703f, 0.031464f, 0.964355f, 0.037018f, 0.957031f, + 0.041718f, 0.949707f, 0.045441f, 0.943359f, 0.049408f, 0.937012f, 0.054260f, 0.928711f, + 0.058807f, 0.921387f, 0.062225f, 0.915527f, 0.065979f, 0.909180f, 0.069702f, 0.901367f, + 0.074585f, 0.894043f, 0.077026f, 0.888184f, 0.080322f, 0.882324f, 0.083740f, 0.875488f, + 0.086914f, 0.868164f, 0.090393f, 0.861816f, 0.092834f, 0.855469f, 0.095032f, 0.850586f, + 0.096741f, 0.845703f, 0.100525f, 0.837891f, 0.103394f, 0.831055f, 0.105347f, 0.824219f, + 0.107239f, 0.818359f, 0.109253f, 0.812988f, 0.110413f, 0.807617f, 0.112305f, 0.800293f, + 0.114746f, 0.791992f, 0.116638f, 0.785645f, 0.117371f, 0.778320f, 0.118530f, 0.772461f, + 0.119019f, 0.766113f, 0.119690f, 0.760254f, 0.120850f, 0.750488f, 0.122131f, 0.741699f, + 0.121765f, 0.733398f, 0.122681f, 0.725098f, 0.122437f, 0.717285f, 0.121521f, 0.709473f, + 0.120728f, 0.700195f, 0.120483f, 0.688477f, 0.120422f, 0.677246f, 0.118835f, 0.666016f, + 0.116638f, 0.653809f, 0.114502f, 0.642578f, 0.111633f, 0.630859f, 0.108765f, 0.614258f, + 0.106445f, 0.596680f, 0.102844f, 0.579102f, 0.098145f, 0.560059f, 0.092346f, 0.540039f, + 0.085815f, 0.519531f, 0.079895f, 0.488037f, 0.072266f, 0.454590f, 0.062988f, 0.418213f, + 0.051239f, 0.376709f, 0.038727f, 0.312744f, 0.022507f, 0.227539f, 0.003885f, 0.078247f, + 0.000000f, 1.000000f, 0.007130f, 0.995117f, 0.013252f, 0.988770f, 0.019928f, 0.982422f, + 0.025421f, 0.974609f, 0.031860f, 0.967773f, 0.036316f, 0.960938f, 0.043030f, 0.951660f, + 0.048309f, 0.944824f, 0.052460f, 0.938477f, 0.058411f, 0.928711f, 0.063599f, 0.921387f, + 0.067261f, 0.914551f, 0.071167f, 0.908203f, 0.076721f, 0.898926f, 0.081360f, 0.891602f, + 0.084412f, 0.885742f, 0.088318f, 0.879395f, 0.092712f, 0.871094f, 0.097046f, 0.863770f, + 0.100891f, 0.856445f, 0.103210f, 0.850586f, 0.105957f, 0.845215f, 0.108948f, 0.839355f, + 0.112183f, 0.831543f, 0.115601f, 0.824707f, 0.118591f, 0.818359f, 0.120361f, 0.812988f, + 0.121704f, 0.807129f, 0.123474f, 0.801758f, 0.126709f, 0.793457f, 0.129028f, 0.786621f, + 0.130737f, 0.779785f, 0.131958f, 0.773438f, 0.133667f, 0.767578f, 0.133911f, 0.761719f, + 0.135132f, 0.754883f, 0.137085f, 0.745605f, 0.137451f, 0.737793f, 0.138062f, 0.729980f, + 0.138794f, 0.723145f, 0.138062f, 0.715332f, 0.137207f, 0.708008f, 0.137085f, 0.699219f, + 0.137329f, 0.688477f, 0.136475f, 0.677734f, 0.135376f, 0.667480f, 0.133179f, 0.657227f, + 0.130859f, 0.646484f, 0.128174f, 0.636230f, 0.125610f, 0.622070f, 0.123047f, 0.605957f, + 0.119141f, 0.589355f, 0.114807f, 0.572754f, 0.109802f, 0.555664f, 0.103394f, 0.537598f, + 0.096680f, 0.512207f, 0.089478f, 0.482910f, 0.080872f, 0.451660f, 0.069946f, 0.416748f, + 0.056976f, 0.376709f, 0.043182f, 0.310059f, 0.025070f, 0.227783f, 0.004345f, 0.077881f, + 0.000000f, 1.000000f, 0.008400f, 0.994629f, 0.015465f, 0.987793f, 0.022263f, 0.980957f, + 0.030548f, 0.971191f, 0.036316f, 0.964355f, 0.043182f, 0.955078f, 0.049866f, 0.946777f, + 0.054840f, 0.939941f, 0.061798f, 0.929688f, 0.067383f, 0.921387f, 0.073120f, 0.914062f, + 0.077820f, 0.906738f, 0.084167f, 0.896973f, 0.088623f, 0.889160f, 0.093201f, 0.882324f, + 0.097534f, 0.875977f, 0.101990f, 0.867188f, 0.106934f, 0.859375f, 0.110901f, 0.852051f, + 0.114319f, 0.845703f, 0.117432f, 0.839844f, 0.121460f, 0.831543f, 0.125000f, 0.824707f, + 0.128906f, 0.817383f, 0.131470f, 0.811523f, 0.134399f, 0.806152f, 0.135864f, 0.801270f, + 0.139160f, 0.793457f, 0.141602f, 0.786133f, 0.144043f, 0.779297f, 0.146240f, 0.773438f, + 0.147827f, 0.767578f, 0.148926f, 0.761719f, 0.149780f, 0.756348f, 0.151733f, 0.747559f, + 0.153198f, 0.740234f, 0.154663f, 0.732910f, 0.154785f, 0.726074f, 0.155029f, 0.719238f, + 0.154785f, 0.712402f, 0.153198f, 0.706543f, 0.154541f, 0.695801f, 0.154541f, 0.686523f, + 0.153931f, 0.676758f, 0.152588f, 0.667480f, 0.150635f, 0.658691f, 0.148682f, 0.649414f, + 0.146240f, 0.640625f, 0.143433f, 0.625977f, 0.140625f, 0.611816f, 0.137695f, 0.598145f, + 0.133423f, 0.583008f, 0.127563f, 0.568359f, 0.121460f, 0.551758f, 0.114868f, 0.532227f, + 0.108032f, 0.505371f, 0.100159f, 0.479248f, 0.089661f, 0.449463f, 0.077454f, 0.416016f, + 0.063354f, 0.373779f, 0.048187f, 0.308594f, 0.027634f, 0.228149f, 0.004814f, 0.077515f, + 0.000000f, 1.000000f, 0.009140f, 0.994629f, 0.018646f, 0.985840f, 0.026642f, 0.977539f, + 0.035187f, 0.968262f, 0.042419f, 0.959473f, 0.051025f, 0.949707f, 0.057281f, 0.941406f, + 0.064514f, 0.931152f, 0.071899f, 0.921875f, 0.077393f, 0.914551f, 0.084167f, 0.904785f, + 0.091309f, 0.895020f, 0.096375f, 0.887207f, 0.101562f, 0.879883f, 0.106445f, 0.871582f, + 0.112427f, 0.862305f, 0.117676f, 0.854004f, 0.121643f, 0.847168f, 0.125244f, 0.840820f, + 0.130371f, 0.833008f, 0.135742f, 0.824219f, 0.138794f, 0.817383f, 0.142456f, 0.810547f, + 0.145020f, 0.804688f, 0.148193f, 0.798828f, 0.150879f, 0.791992f, 0.155029f, 0.784180f, + 0.157837f, 0.777832f, 0.160156f, 0.771973f, 0.162476f, 0.766113f, 0.163574f, 0.760742f, + 0.164673f, 0.755371f, 0.167236f, 0.747559f, 0.168945f, 0.740234f, 0.170776f, 0.732910f, + 0.171753f, 0.726562f, 0.171753f, 0.720703f, 0.172485f, 0.714355f, 0.171997f, 0.708984f, + 0.171997f, 0.700195f, 0.172974f, 0.691406f, 0.172363f, 0.682617f, 0.172241f, 0.674805f, + 0.171387f, 0.666992f, 0.168945f, 0.658691f, 0.166992f, 0.650879f, 0.164185f, 0.641113f, + 0.162109f, 0.627930f, 0.159668f, 0.615234f, 0.156006f, 0.603516f, 0.151978f, 0.590820f, + 0.146606f, 0.577148f, 0.140625f, 0.563477f, 0.134155f, 0.546875f, 0.127563f, 0.523926f, + 0.119690f, 0.500488f, 0.109924f, 0.475830f, 0.098633f, 0.447754f, 0.085083f, 0.415527f, + 0.070312f, 0.367920f, 0.053162f, 0.306885f, 0.030350f, 0.228882f, 0.005295f, 0.077148f, + 0.000000f, 1.000000f, 0.011208f, 0.993652f, 0.021729f, 0.984375f, 0.031860f, 0.974121f, + 0.040680f, 0.965332f, 0.050781f, 0.953613f, 0.058533f, 0.944824f, 0.067810f, 0.933105f, + 0.075439f, 0.923340f, 0.082581f, 0.915039f, 0.090027f, 0.904297f, 0.097961f, 0.894043f, + 0.104736f, 0.885254f, 0.109985f, 0.877930f, 0.116516f, 0.867188f, 0.123535f, 0.857422f, + 0.128906f, 0.849609f, 0.132324f, 0.843262f, 0.138794f, 0.833984f, 0.143677f, 0.825195f, + 0.149048f, 0.817383f, 0.152710f, 0.810547f, 0.157471f, 0.803223f, 0.159790f, 0.797852f, + 0.164307f, 0.789062f, 0.167847f, 0.781738f, 0.171265f, 0.774902f, 0.174316f, 0.769043f, + 0.176636f, 0.763672f, 0.178467f, 0.758789f, 0.180786f, 0.752441f, 0.184082f, 0.744629f, + 0.185425f, 0.737305f, 0.187622f, 0.731445f, 0.189087f, 0.726074f, 0.189453f, 0.719727f, + 0.190186f, 0.714355f, 0.189453f, 0.709473f, 0.191650f, 0.700684f, 0.192261f, 0.692871f, + 0.192383f, 0.685547f, 0.191772f, 0.678223f, 0.191040f, 0.671387f, 0.189575f, 0.664062f, + 0.187622f, 0.657715f, 0.184937f, 0.649902f, 0.183716f, 0.639160f, 0.182007f, 0.628418f, + 0.179199f, 0.617676f, 0.175903f, 0.606934f, 0.171143f, 0.595703f, 0.166504f, 0.583984f, + 0.159912f, 0.571777f, 0.154175f, 0.556641f, 0.147827f, 0.537109f, 0.139893f, 0.517578f, + 0.131226f, 0.496338f, 0.120361f, 0.473145f, 0.107727f, 0.445801f, 0.092651f, 0.413330f, + 0.077454f, 0.364014f, 0.058197f, 0.306152f, 0.032990f, 0.229370f, 0.005756f, 0.076660f, + 0.000000f, 1.000000f, 0.012024f, 0.993652f, 0.024628f, 0.983398f, 0.037384f, 0.971191f, + 0.048859f, 0.958984f, 0.059052f, 0.948730f, 0.069397f, 0.936523f, 0.079529f, 0.925293f, + 0.086853f, 0.916504f, 0.097656f, 0.902832f, 0.105103f, 0.893066f, 0.112366f, 0.884277f, + 0.120667f, 0.872559f, 0.127808f, 0.862793f, 0.134155f, 0.854004f, 0.139648f, 0.845703f, + 0.146362f, 0.835938f, 0.153320f, 0.826660f, 0.158325f, 0.818359f, 0.163330f, 0.810547f, + 0.167114f, 0.803711f, 0.172607f, 0.795410f, 0.176636f, 0.787598f, 0.181519f, 0.779297f, + 0.185181f, 0.772461f, 0.188477f, 0.766113f, 0.191040f, 0.760742f, 0.193726f, 0.754883f, + 0.197266f, 0.747070f, 0.200684f, 0.739746f, 0.202637f, 0.733887f, 0.205200f, 0.728516f, + 0.206421f, 0.723145f, 0.206909f, 0.717773f, 0.207397f, 0.712891f, 0.210083f, 0.705566f, + 0.211060f, 0.697754f, 0.211670f, 0.691895f, 0.212158f, 0.685059f, 0.211914f, 0.679199f, + 0.211304f, 0.672852f, 0.210083f, 0.667480f, 0.208862f, 0.661621f, 0.207153f, 0.652832f, + 0.206909f, 0.644043f, 0.204956f, 0.635254f, 0.202271f, 0.626465f, 0.199707f, 0.617188f, + 0.196411f, 0.608398f, 0.191650f, 0.599121f, 0.186890f, 0.589355f, 0.180664f, 0.578613f, + 0.175415f, 0.562988f, 0.169189f, 0.546875f, 0.162231f, 0.530762f, 0.152710f, 0.512207f, + 0.142578f, 0.492188f, 0.130615f, 0.469971f, 0.116455f, 0.444336f, 0.102051f, 0.405762f, + 0.084717f, 0.361084f, 0.063049f, 0.305908f, 0.035797f, 0.230713f, 0.006294f, 0.076782f, + 0.000000f, 1.000000f, 0.015854f, 0.991211f, 0.030777f, 0.979004f, 0.044312f, 0.966797f, + 0.057495f, 0.954590f, 0.070068f, 0.940918f, 0.081421f, 0.929199f, 0.092346f, 0.916016f, + 0.103149f, 0.903809f, 0.111877f, 0.893555f, 0.121765f, 0.880859f, 0.130371f, 0.869629f, + 0.138428f, 0.859863f, 0.145996f, 0.850098f, 0.153442f, 0.838867f, 0.160767f, 0.829102f, + 0.166992f, 0.819824f, 0.172241f, 0.812500f, 0.178711f, 0.802734f, 0.184448f, 0.793457f, + 0.189697f, 0.785156f, 0.194336f, 0.777832f, 0.198364f, 0.770508f, 0.201416f, 0.765137f, + 0.206665f, 0.756348f, 0.210571f, 0.748535f, 0.214600f, 0.741211f, 0.217041f, 0.734863f, + 0.219604f, 0.729004f, 0.221802f, 0.724121f, 0.224121f, 0.718750f, 0.225586f, 0.712891f, + 0.228760f, 0.706055f, 0.229858f, 0.700195f, 0.230713f, 0.693848f, 0.231689f, 0.688477f, + 0.232788f, 0.683105f, 0.231934f, 0.677734f, 0.231934f, 0.672852f, 0.230957f, 0.667480f, + 0.231323f, 0.659668f, 0.230835f, 0.652344f, 0.229126f, 0.645508f, 0.228516f, 0.638672f, + 0.226074f, 0.630859f, 0.223267f, 0.624023f, 0.219849f, 0.616699f, 0.216431f, 0.609375f, + 0.212036f, 0.601562f, 0.207642f, 0.591309f, 0.202515f, 0.579102f, 0.197998f, 0.566406f, + 0.191040f, 0.553223f, 0.184082f, 0.539062f, 0.175293f, 0.523926f, 0.165527f, 0.507324f, + 0.153687f, 0.489014f, 0.140747f, 0.468018f, 0.127563f, 0.436768f, 0.111816f, 0.401611f, + 0.092285f, 0.359863f, 0.068115f, 0.305908f, 0.038666f, 0.232422f, 0.006775f, 0.076782f, + 0.000000f, 1.000000f, 0.018921f, 0.990234f, 0.035980f, 0.977539f, 0.052704f, 0.962402f, + 0.068909f, 0.946777f, 0.082764f, 0.933105f, 0.095703f, 0.918945f, 0.106995f, 0.906738f, + 0.119934f, 0.891602f, 0.130371f, 0.879883f, 0.139893f, 0.868652f, 0.150513f, 0.854980f, + 0.159058f, 0.844238f, 0.166626f, 0.833984f, 0.174805f, 0.823730f, 0.182739f, 0.812500f, + 0.189453f, 0.802734f, 0.195801f, 0.793457f, 0.201660f, 0.785156f, 0.206787f, 0.777344f, + 0.213379f, 0.767578f, 0.219238f, 0.759277f, 0.222534f, 0.751953f, 0.226685f, 0.744629f, + 0.229858f, 0.738281f, 0.233643f, 0.731934f, 0.236572f, 0.724609f, 0.241211f, 0.716797f, + 0.244019f, 0.710449f, 0.245972f, 0.704102f, 0.248291f, 0.698730f, 0.249756f, 0.693359f, + 0.251465f, 0.688477f, 0.251709f, 0.684082f, 0.251709f, 0.679688f, 0.252441f, 0.673340f, + 0.254395f, 0.666992f, 0.254150f, 0.661621f, 0.253662f, 0.655762f, 0.253418f, 0.649902f, + 0.252930f, 0.644531f, 0.250977f, 0.639160f, 0.248901f, 0.633301f, 0.247192f, 0.627441f, + 0.243896f, 0.621094f, 0.241699f, 0.614258f, 0.238403f, 0.605469f, 0.234863f, 0.596680f, + 0.231201f, 0.587402f, 0.225708f, 0.578125f, 0.220337f, 0.567871f, 0.213867f, 0.557129f, + 0.207275f, 0.546387f, 0.198364f, 0.533203f, 0.188599f, 0.519531f, 0.177856f, 0.504395f, + 0.166748f, 0.482910f, 0.153564f, 0.459229f, 0.138184f, 0.431152f, 0.120300f, 0.398193f, + 0.098999f, 0.358398f, 0.073364f, 0.306885f, 0.040985f, 0.233398f, 0.007290f, 0.077026f, + 0.000000f, 1.000000f, 0.023407f, 0.987793f, 0.043671f, 0.973145f, 0.063416f, 0.956543f, + 0.082153f, 0.938965f, 0.098206f, 0.922852f, 0.112915f, 0.908203f, 0.127319f, 0.892090f, + 0.140137f, 0.877930f, 0.151245f, 0.865723f, 0.162598f, 0.851562f, 0.173706f, 0.838379f, + 0.181763f, 0.827637f, 0.190796f, 0.816406f, 0.199951f, 0.804199f, 0.207886f, 0.793945f, + 0.214478f, 0.784180f, 0.221436f, 0.774902f, 0.227051f, 0.766113f, 0.233032f, 0.757324f, + 0.237671f, 0.748535f, 0.243530f, 0.739746f, 0.248047f, 0.732422f, 0.251953f, 0.725098f, + 0.255371f, 0.718262f, 0.258545f, 0.712402f, 0.262451f, 0.705566f, 0.264648f, 0.699219f, + 0.268066f, 0.691895f, 0.270508f, 0.685547f, 0.271973f, 0.680176f, 0.274414f, 0.674316f, + 0.275391f, 0.669434f, 0.275879f, 0.664551f, 0.277100f, 0.659668f, 0.276855f, 0.654785f, + 0.277100f, 0.650391f, 0.276367f, 0.645996f, 0.275635f, 0.641113f, 0.274902f, 0.634766f, + 0.274170f, 0.628906f, 0.272217f, 0.623047f, 0.270020f, 0.617676f, 0.268555f, 0.611328f, + 0.265381f, 0.605469f, 0.262207f, 0.598633f, 0.258301f, 0.592285f, 0.253662f, 0.584961f, + 0.249146f, 0.577637f, 0.243286f, 0.569336f, 0.236572f, 0.561035f, 0.229370f, 0.551270f, + 0.221802f, 0.539062f, 0.213257f, 0.525391f, 0.203247f, 0.510742f, 0.192139f, 0.494141f, + 0.179688f, 0.475342f, 0.165405f, 0.453613f, 0.148315f, 0.428223f, 0.129028f, 0.396973f, + 0.106262f, 0.358643f, 0.078552f, 0.308350f, 0.045227f, 0.227417f, 0.007805f, 0.077332f, + 0.000000f, 1.000000f, 0.028732f, 0.985840f, 0.054169f, 0.967773f, 0.077515f, 0.948242f, + 0.098267f, 0.929199f, 0.117065f, 0.911621f, 0.134155f, 0.893555f, 0.149414f, 0.877441f, + 0.163452f, 0.861816f, 0.176758f, 0.846680f, 0.189087f, 0.832520f, 0.199585f, 0.819824f, + 0.209351f, 0.807617f, 0.218628f, 0.795410f, 0.227295f, 0.783691f, 0.234985f, 0.773438f, + 0.241943f, 0.763184f, 0.249756f, 0.752930f, 0.254883f, 0.744141f, 0.260742f, 0.735352f, + 0.265381f, 0.727539f, 0.270264f, 0.719238f, 0.275635f, 0.710938f, 0.279297f, 0.703613f, + 0.283691f, 0.696289f, 0.287109f, 0.689453f, 0.288818f, 0.683594f, 0.292969f, 0.676758f, + 0.294189f, 0.670898f, 0.296631f, 0.665039f, 0.298096f, 0.659668f, 0.299805f, 0.654785f, + 0.300049f, 0.649902f, 0.300537f, 0.645996f, 0.301270f, 0.641113f, 0.301270f, 0.637207f, + 0.300049f, 0.632812f, 0.299805f, 0.627930f, 0.299072f, 0.623535f, 0.296875f, 0.618652f, + 0.296387f, 0.613770f, 0.293701f, 0.608887f, 0.291504f, 0.604004f, 0.289307f, 0.598145f, + 0.285156f, 0.592773f, 0.281494f, 0.586426f, 0.278076f, 0.580078f, 0.272461f, 0.573242f, + 0.267090f, 0.565918f, 0.261963f, 0.558594f, 0.253662f, 0.549316f, 0.246704f, 0.540039f, + 0.238037f, 0.529297f, 0.228394f, 0.517090f, 0.218018f, 0.504395f, 0.206421f, 0.489258f, + 0.191406f, 0.471191f, 0.176270f, 0.451416f, 0.157837f, 0.426758f, 0.137573f, 0.396729f, + 0.113403f, 0.357666f, 0.084412f, 0.304443f, 0.049072f, 0.224609f, 0.008316f, 0.078186f, + 0.000000f, 1.000000f, 0.032104f, 0.984863f, 0.060852f, 0.964355f, 0.085754f, 0.943848f, + 0.107727f, 0.923828f, 0.129028f, 0.904297f, 0.147339f, 0.885742f, 0.163208f, 0.868652f, + 0.178467f, 0.852051f, 0.191772f, 0.836914f, 0.204468f, 0.822266f, 0.215332f, 0.808594f, + 0.224976f, 0.796387f, 0.235107f, 0.784180f, 0.244507f, 0.771973f, 0.251953f, 0.761230f, + 0.259766f, 0.750488f, 0.265625f, 0.740723f, 0.271729f, 0.731445f, 0.278809f, 0.722168f, + 0.283691f, 0.713867f, 0.288818f, 0.705566f, 0.292480f, 0.698242f, 0.297119f, 0.690430f, + 0.301025f, 0.683105f, 0.304443f, 0.676270f, 0.307129f, 0.669922f, 0.309326f, 0.664062f, + 0.312500f, 0.657227f, 0.314453f, 0.651855f, 0.315918f, 0.645996f, 0.317627f, 0.641602f, + 0.317871f, 0.636719f, 0.318604f, 0.631836f, 0.319092f, 0.627441f, 0.319824f, 0.623047f, + 0.319336f, 0.619141f, 0.318604f, 0.613770f, 0.317139f, 0.609863f, 0.316406f, 0.605469f, + 0.314453f, 0.600586f, 0.312744f, 0.595703f, 0.310547f, 0.591309f, 0.306885f, 0.585938f, + 0.303711f, 0.580566f, 0.300293f, 0.574707f, 0.295898f, 0.568848f, 0.291748f, 0.562500f, + 0.285889f, 0.555176f, 0.280273f, 0.547363f, 0.272949f, 0.539062f, 0.265869f, 0.530273f, + 0.257080f, 0.520020f, 0.247803f, 0.508301f, 0.237305f, 0.495605f, 0.224976f, 0.480469f, + 0.210938f, 0.463135f, 0.195435f, 0.443115f, 0.177246f, 0.419189f, 0.156250f, 0.388916f, + 0.131104f, 0.351318f, 0.101135f, 0.299805f, 0.063171f, 0.223633f, 0.014900f, 0.084656f, + 0.000000f, 1.000000f, 0.032196f, 0.984863f, 0.061432f, 0.963867f, 0.086670f, 0.943359f, + 0.109070f, 0.923340f, 0.129272f, 0.903809f, 0.147827f, 0.885254f, 0.165161f, 0.867676f, + 0.179688f, 0.851562f, 0.193970f, 0.835449f, 0.206543f, 0.820801f, 0.218628f, 0.806641f, + 0.229248f, 0.793945f, 0.238892f, 0.781250f, 0.247681f, 0.769531f, 0.256104f, 0.757812f, + 0.264160f, 0.747559f, 0.270996f, 0.736816f, 0.278320f, 0.727051f, 0.283691f, 0.718262f, + 0.290283f, 0.708984f, 0.294922f, 0.700684f, 0.299316f, 0.692871f, 0.304443f, 0.684570f, + 0.308350f, 0.677246f, 0.312500f, 0.669922f, 0.315918f, 0.663086f, 0.317871f, 0.657227f, + 0.321045f, 0.650879f, 0.323730f, 0.644531f, 0.326904f, 0.638184f, 0.328125f, 0.633301f, + 0.329346f, 0.627930f, 0.330322f, 0.623047f, 0.330811f, 0.618164f, 0.332031f, 0.613770f, + 0.331787f, 0.609375f, 0.331543f, 0.604492f, 0.331299f, 0.599609f, 0.330322f, 0.595215f, + 0.328613f, 0.590332f, 0.328613f, 0.585449f, 0.326172f, 0.580566f, 0.323486f, 0.575195f, + 0.320801f, 0.569336f, 0.317871f, 0.563477f, 0.313965f, 0.557129f, 0.311279f, 0.550781f, + 0.305420f, 0.543457f, 0.300293f, 0.535645f, 0.294434f, 0.527832f, 0.287354f, 0.518066f, + 0.280518f, 0.508301f, 0.271484f, 0.497070f, 0.261475f, 0.484131f, 0.250244f, 0.469238f, + 0.236816f, 0.452393f, 0.221802f, 0.432861f, 0.205078f, 0.408936f, 0.184937f, 0.380127f, + 0.160278f, 0.343262f, 0.129395f, 0.293701f, 0.089783f, 0.219971f, 0.032715f, 0.083496f, + 0.000000f, 1.000000f, 0.032227f, 0.984375f, 0.060944f, 0.964355f, 0.086853f, 0.943359f, + 0.110291f, 0.922363f, 0.130615f, 0.902832f, 0.149170f, 0.884766f, 0.165649f, 0.867188f, + 0.180908f, 0.850586f, 0.196045f, 0.833984f, 0.208618f, 0.819336f, 0.220825f, 0.804688f, + 0.232300f, 0.791016f, 0.242920f, 0.778320f, 0.251221f, 0.766602f, 0.260498f, 0.754883f, + 0.268311f, 0.743652f, 0.276367f, 0.733398f, 0.283203f, 0.723145f, 0.289307f, 0.713867f, + 0.295654f, 0.704590f, 0.301025f, 0.695801f, 0.306396f, 0.687500f, 0.312012f, 0.679199f, + 0.315674f, 0.671387f, 0.319824f, 0.664062f, 0.324463f, 0.656738f, 0.327637f, 0.649902f, + 0.330566f, 0.643555f, 0.333984f, 0.636719f, 0.337402f, 0.630371f, 0.338379f, 0.625000f, + 0.340576f, 0.619629f, 0.342041f, 0.614258f, 0.343018f, 0.609375f, 0.344727f, 0.604004f, + 0.344727f, 0.599609f, 0.345459f, 0.595215f, 0.344971f, 0.589355f, 0.344727f, 0.584473f, + 0.344482f, 0.580078f, 0.343750f, 0.574219f, 0.341797f, 0.568848f, 0.340332f, 0.563965f, + 0.338135f, 0.558105f, 0.335693f, 0.551758f, 0.333008f, 0.545410f, 0.329346f, 0.538574f, + 0.325195f, 0.531250f, 0.320801f, 0.523438f, 0.315674f, 0.514648f, 0.309326f, 0.505371f, + 0.302734f, 0.495361f, 0.294922f, 0.484131f, 0.286377f, 0.471191f, 0.275879f, 0.456543f, + 0.263672f, 0.439453f, 0.250977f, 0.420410f, 0.233887f, 0.397217f, 0.214600f, 0.368652f, + 0.191040f, 0.332764f, 0.161011f, 0.285889f, 0.120117f, 0.213135f, 0.056519f, 0.080872f, + 0.000000f, 1.000000f, 0.032074f, 0.984863f, 0.060913f, 0.964355f, 0.087158f, 0.943359f, + 0.110718f, 0.922363f, 0.131714f, 0.902344f, 0.150635f, 0.883789f, 0.167603f, 0.865723f, + 0.183350f, 0.849121f, 0.198486f, 0.832520f, 0.211426f, 0.817383f, 0.224121f, 0.802734f, + 0.235474f, 0.789062f, 0.245728f, 0.776367f, 0.255615f, 0.763184f, 0.265381f, 0.751953f, + 0.273193f, 0.740234f, 0.281738f, 0.729492f, 0.288330f, 0.719238f, 0.295898f, 0.708984f, + 0.302246f, 0.699707f, 0.308594f, 0.690430f, 0.314453f, 0.681641f, 0.319092f, 0.673340f, + 0.324219f, 0.665039f, 0.328857f, 0.657227f, 0.333252f, 0.649902f, 0.336426f, 0.643066f, + 0.340332f, 0.635742f, 0.344482f, 0.628906f, 0.346924f, 0.622559f, 0.349609f, 0.616211f, + 0.352051f, 0.610352f, 0.353516f, 0.604980f, 0.355469f, 0.599121f, 0.356689f, 0.594238f, + 0.358643f, 0.588867f, 0.359375f, 0.583984f, 0.359863f, 0.578613f, 0.360352f, 0.572754f, + 0.360107f, 0.567871f, 0.360107f, 0.562012f, 0.359131f, 0.556641f, 0.358398f, 0.550781f, + 0.356934f, 0.544434f, 0.354980f, 0.538086f, 0.352539f, 0.531738f, 0.349365f, 0.524902f, + 0.346680f, 0.518066f, 0.342529f, 0.509277f, 0.337891f, 0.501465f, 0.332764f, 0.491943f, + 0.326660f, 0.481689f, 0.320312f, 0.470703f, 0.311523f, 0.458008f, 0.302734f, 0.444336f, + 0.291748f, 0.427490f, 0.278809f, 0.408936f, 0.263428f, 0.386230f, 0.244507f, 0.358398f, + 0.222168f, 0.324219f, 0.193359f, 0.278076f, 0.152344f, 0.208496f, 0.085327f, 0.079407f, + 0.000000f, 1.000000f, 0.032074f, 0.984863f, 0.061218f, 0.964355f, 0.087158f, 0.943359f, + 0.110657f, 0.922363f, 0.132690f, 0.902344f, 0.151001f, 0.883301f, 0.169067f, 0.864746f, + 0.185425f, 0.847656f, 0.200806f, 0.831055f, 0.213989f, 0.815918f, 0.226440f, 0.800781f, + 0.238525f, 0.786621f, 0.248901f, 0.773438f, 0.260498f, 0.760254f, 0.268555f, 0.748535f, + 0.277588f, 0.736816f, 0.287354f, 0.725098f, 0.294434f, 0.714844f, 0.302246f, 0.704102f, + 0.309814f, 0.694336f, 0.315918f, 0.684570f, 0.321289f, 0.676270f, 0.326904f, 0.666992f, + 0.332764f, 0.658691f, 0.337646f, 0.650391f, 0.341553f, 0.643066f, 0.347168f, 0.634766f, + 0.350586f, 0.627441f, 0.354736f, 0.620605f, 0.358643f, 0.613281f, 0.362061f, 0.606445f, + 0.363525f, 0.601074f, 0.366699f, 0.594238f, 0.369141f, 0.588379f, 0.370117f, 0.583496f, + 0.372559f, 0.577637f, 0.373535f, 0.572754f, 0.375244f, 0.567383f, 0.375000f, 0.561523f, + 0.375488f, 0.555664f, 0.375977f, 0.550781f, 0.375488f, 0.544434f, 0.374756f, 0.538574f, + 0.374512f, 0.532715f, 0.372803f, 0.526367f, 0.371094f, 0.519531f, 0.369385f, 0.512695f, + 0.366455f, 0.504883f, 0.362793f, 0.496582f, 0.358887f, 0.488770f, 0.354492f, 0.479492f, + 0.349854f, 0.468506f, 0.344482f, 0.457764f, 0.337158f, 0.444336f, 0.329346f, 0.430664f, + 0.318848f, 0.414307f, 0.307373f, 0.395752f, 0.292969f, 0.373535f, 0.276123f, 0.347168f, + 0.254639f, 0.313721f, 0.226685f, 0.268799f, 0.186768f, 0.202637f, 0.117493f, 0.077942f, + 0.000000f, 1.000000f, 0.032074f, 0.984863f, 0.061310f, 0.964355f, 0.087585f, 0.942871f, + 0.111755f, 0.921875f, 0.132812f, 0.901855f, 0.153564f, 0.881836f, 0.170166f, 0.863770f, + 0.187378f, 0.846191f, 0.202271f, 0.830078f, 0.217163f, 0.813477f, 0.229492f, 0.798340f, + 0.242065f, 0.784180f, 0.254150f, 0.770020f, 0.264160f, 0.757324f, 0.274414f, 0.744629f, + 0.283936f, 0.732422f, 0.292236f, 0.721191f, 0.301025f, 0.709961f, 0.308594f, 0.699219f, + 0.316406f, 0.688965f, 0.323730f, 0.678711f, 0.329590f, 0.669434f, 0.335449f, 0.660156f, + 0.341797f, 0.651367f, 0.347412f, 0.643066f, 0.351807f, 0.634766f, 0.357178f, 0.626465f, + 0.361084f, 0.619141f, 0.364258f, 0.612793f, 0.368164f, 0.605469f, 0.372559f, 0.598145f, + 0.375732f, 0.591797f, 0.379150f, 0.584961f, 0.381348f, 0.579102f, 0.382568f, 0.573730f, + 0.385498f, 0.567383f, 0.387451f, 0.562012f, 0.389648f, 0.556152f, 0.390381f, 0.550293f, + 0.391113f, 0.544434f, 0.391846f, 0.539062f, 0.392090f, 0.533203f, 0.392334f, 0.526367f, + 0.392090f, 0.520508f, 0.392334f, 0.513184f, 0.390625f, 0.506348f, 0.389404f, 0.499268f, + 0.387695f, 0.491699f, 0.385498f, 0.483643f, 0.382080f, 0.474609f, 0.377930f, 0.465576f, + 0.373779f, 0.455078f, 0.368652f, 0.443848f, 0.362061f, 0.431885f, 0.354736f, 0.417480f, + 0.347168f, 0.401611f, 0.335449f, 0.382568f, 0.323486f, 0.361328f, 0.307373f, 0.335205f, + 0.287109f, 0.303223f, 0.261719f, 0.260498f, 0.222290f, 0.195557f, 0.152588f, 0.075867f, + 0.000000f, 1.000000f, 0.032227f, 0.984863f, 0.062134f, 0.963379f, 0.088196f, 0.942383f, + 0.112488f, 0.921387f, 0.134033f, 0.901367f, 0.154907f, 0.880859f, 0.172363f, 0.862793f, + 0.189575f, 0.845215f, 0.203979f, 0.828125f, 0.218994f, 0.812012f, 0.233765f, 0.795898f, + 0.246338f, 0.781250f, 0.258301f, 0.767090f, 0.268799f, 0.753418f, 0.279053f, 0.740723f, + 0.289551f, 0.727539f, 0.299072f, 0.715820f, 0.307373f, 0.704590f, 0.314941f, 0.693848f, + 0.322510f, 0.683594f, 0.329102f, 0.673828f, 0.337158f, 0.663574f, 0.344238f, 0.653809f, + 0.349609f, 0.645020f, 0.354980f, 0.636230f, 0.360840f, 0.627930f, 0.366211f, 0.619629f, + 0.371094f, 0.611816f, 0.375244f, 0.604492f, 0.379150f, 0.597168f, 0.383545f, 0.589844f, + 0.387451f, 0.582520f, 0.391846f, 0.575684f, 0.394287f, 0.568848f, 0.396240f, 0.562988f, + 0.399658f, 0.556641f, 0.402100f, 0.550293f, 0.404053f, 0.544922f, 0.405762f, 0.539062f, + 0.406982f, 0.532227f, 0.407959f, 0.526367f, 0.409180f, 0.520508f, 0.409912f, 0.513672f, + 0.409912f, 0.507324f, 0.410645f, 0.500977f, 0.409912f, 0.493896f, 0.409180f, 0.486816f, + 0.408203f, 0.478271f, 0.406494f, 0.469727f, 0.403564f, 0.460449f, 0.400391f, 0.451904f, + 0.397217f, 0.440918f, 0.393799f, 0.429688f, 0.387939f, 0.418213f, 0.381592f, 0.404053f, + 0.375000f, 0.388428f, 0.364746f, 0.369873f, 0.353027f, 0.349365f, 0.339355f, 0.323975f, + 0.320801f, 0.292725f, 0.296875f, 0.250977f, 0.258545f, 0.188599f, 0.190674f, 0.073059f, + 0.000000f, 1.000000f, 0.032257f, 0.984863f, 0.062073f, 0.963379f, 0.088806f, 0.942383f, + 0.111633f, 0.921875f, 0.135376f, 0.900391f, 0.154785f, 0.880859f, 0.173706f, 0.862305f, + 0.190796f, 0.843750f, 0.207642f, 0.826172f, 0.222412f, 0.809570f, 0.236816f, 0.793457f, + 0.249512f, 0.778320f, 0.262207f, 0.763184f, 0.273926f, 0.749512f, 0.284912f, 0.736328f, + 0.295410f, 0.723633f, 0.304443f, 0.711914f, 0.313721f, 0.700195f, 0.322021f, 0.688965f, + 0.329346f, 0.678223f, 0.337402f, 0.667969f, 0.345215f, 0.657715f, 0.352051f, 0.647949f, + 0.357666f, 0.638672f, 0.364014f, 0.629883f, 0.371094f, 0.620117f, 0.375000f, 0.612793f, + 0.381592f, 0.604004f, 0.385498f, 0.596191f, 0.391602f, 0.587891f, 0.395996f, 0.580078f, + 0.399902f, 0.572754f, 0.403564f, 0.565430f, 0.407471f, 0.558594f, 0.410400f, 0.552246f, + 0.413330f, 0.545898f, 0.416748f, 0.539551f, 0.418945f, 0.533203f, 0.420654f, 0.527832f, + 0.423096f, 0.520996f, 0.425293f, 0.514160f, 0.427002f, 0.507324f, 0.427490f, 0.500977f, + 0.428467f, 0.494141f, 0.429443f, 0.487793f, 0.429932f, 0.479736f, 0.429199f, 0.472412f, + 0.428223f, 0.465088f, 0.427734f, 0.456299f, 0.427002f, 0.447266f, 0.423828f, 0.437744f, + 0.421631f, 0.427734f, 0.418457f, 0.415771f, 0.414307f, 0.403809f, 0.408447f, 0.390137f, + 0.401855f, 0.374268f, 0.394531f, 0.356934f, 0.383545f, 0.336670f, 0.371338f, 0.311768f, + 0.354248f, 0.281006f, 0.331787f, 0.241089f, 0.296143f, 0.181763f, 0.230469f, 0.069702f, + 0.000000f, 1.000000f, 0.032196f, 0.984863f, 0.061951f, 0.963867f, 0.088989f, 0.942383f, + 0.112976f, 0.920898f, 0.136108f, 0.899414f, 0.156616f, 0.879883f, 0.175293f, 0.860840f, + 0.194214f, 0.841309f, 0.211182f, 0.823242f, 0.226440f, 0.806152f, 0.241089f, 0.790039f, + 0.254150f, 0.774902f, 0.266846f, 0.760254f, 0.278076f, 0.746582f, 0.289307f, 0.732910f, + 0.299805f, 0.720215f, 0.309814f, 0.708008f, 0.319336f, 0.695801f, 0.329102f, 0.684082f, + 0.336670f, 0.672852f, 0.344727f, 0.662109f, 0.352539f, 0.651855f, 0.359619f, 0.641602f, + 0.367432f, 0.631348f, 0.374512f, 0.622070f, 0.380127f, 0.613281f, 0.385742f, 0.604492f, + 0.391113f, 0.595703f, 0.396484f, 0.587402f, 0.401611f, 0.579590f, 0.406006f, 0.571777f, + 0.411865f, 0.563477f, 0.416260f, 0.555664f, 0.420410f, 0.548828f, 0.424072f, 0.541504f, + 0.427490f, 0.534668f, 0.430664f, 0.527832f, 0.434326f, 0.521484f, 0.436768f, 0.515137f, + 0.440674f, 0.508301f, 0.441895f, 0.501953f, 0.443359f, 0.495361f, 0.446289f, 0.488770f, + 0.447754f, 0.480957f, 0.447998f, 0.474365f, 0.449463f, 0.466797f, 0.449951f, 0.458984f, + 0.449951f, 0.451172f, 0.448975f, 0.442383f, 0.448975f, 0.433350f, 0.446777f, 0.423584f, + 0.446045f, 0.413330f, 0.442627f, 0.401855f, 0.440186f, 0.389648f, 0.435303f, 0.376221f, + 0.429443f, 0.360840f, 0.422363f, 0.343262f, 0.414062f, 0.323242f, 0.402100f, 0.299072f, + 0.387207f, 0.270264f, 0.367432f, 0.231201f, 0.334229f, 0.173828f, 0.270752f, 0.066895f, + 0.000000f, 1.000000f, 0.032349f, 0.984375f, 0.061493f, 0.964355f, 0.088989f, 0.942383f, + 0.114197f, 0.920410f, 0.137085f, 0.899414f, 0.157959f, 0.878418f, 0.178711f, 0.858398f, + 0.197266f, 0.839355f, 0.212891f, 0.821777f, 0.229248f, 0.804688f, 0.243896f, 0.788574f, + 0.257812f, 0.772461f, 0.270264f, 0.758301f, 0.281982f, 0.743652f, 0.294189f, 0.729492f, + 0.304932f, 0.716309f, 0.315674f, 0.703613f, 0.324463f, 0.691406f, 0.335938f, 0.678711f, + 0.344238f, 0.667480f, 0.351807f, 0.656738f, 0.359863f, 0.645508f, 0.368164f, 0.634766f, + 0.376465f, 0.624512f, 0.382080f, 0.615723f, 0.389404f, 0.605957f, 0.395508f, 0.596680f, + 0.401367f, 0.587891f, 0.407471f, 0.579102f, 0.414062f, 0.569824f, 0.418457f, 0.562012f, + 0.424561f, 0.553711f, 0.429688f, 0.545898f, 0.433594f, 0.538574f, 0.437744f, 0.530762f, + 0.441895f, 0.523926f, 0.445801f, 0.516602f, 0.450684f, 0.509277f, 0.452881f, 0.502930f, + 0.456543f, 0.496094f, 0.458984f, 0.489502f, 0.460693f, 0.482422f, 0.463135f, 0.475342f, + 0.465576f, 0.468262f, 0.466064f, 0.461182f, 0.468994f, 0.452881f, 0.470215f, 0.444824f, + 0.470703f, 0.437256f, 0.471680f, 0.427979f, 0.471191f, 0.418701f, 0.470215f, 0.409668f, + 0.469482f, 0.398682f, 0.466797f, 0.387695f, 0.465332f, 0.375488f, 0.462646f, 0.362305f, + 0.456543f, 0.346924f, 0.451904f, 0.329590f, 0.443848f, 0.310547f, 0.434570f, 0.287109f, + 0.420654f, 0.258301f, 0.401855f, 0.221558f, 0.372070f, 0.166260f, 0.311035f, 0.064758f, + 0.000000f, 1.000000f, 0.031952f, 0.984863f, 0.061584f, 0.964355f, 0.089539f, 0.941895f, + 0.115112f, 0.919922f, 0.138184f, 0.897949f, 0.160400f, 0.876953f, 0.180542f, 0.856934f, + 0.198242f, 0.838379f, 0.216187f, 0.819824f, 0.230835f, 0.803223f, 0.246094f, 0.786621f, + 0.260498f, 0.770508f, 0.274170f, 0.754883f, 0.286621f, 0.740234f, 0.300049f, 0.725586f, + 0.310791f, 0.711914f, 0.322266f, 0.698242f, 0.331299f, 0.686035f, 0.341797f, 0.673340f, + 0.350342f, 0.662109f, 0.360107f, 0.650391f, 0.367920f, 0.639648f, 0.376953f, 0.628418f, + 0.384033f, 0.618652f, 0.391357f, 0.608398f, 0.399170f, 0.598145f, 0.406982f, 0.588379f, + 0.412598f, 0.579102f, 0.419434f, 0.569824f, 0.424072f, 0.561523f, 0.430176f, 0.552734f, + 0.436035f, 0.544434f, 0.442383f, 0.535645f, 0.446533f, 0.527832f, 0.451904f, 0.519531f, + 0.455078f, 0.512695f, 0.460938f, 0.504883f, 0.465088f, 0.497803f, 0.468262f, 0.490967f, + 0.472900f, 0.483398f, 0.476562f, 0.476562f, 0.478760f, 0.469482f, 0.481445f, 0.462158f, + 0.484375f, 0.454590f, 0.486572f, 0.447021f, 0.488281f, 0.439209f, 0.490723f, 0.431396f, + 0.490967f, 0.423096f, 0.492676f, 0.414062f, 0.494141f, 0.404541f, 0.494141f, 0.395020f, + 0.493408f, 0.384766f, 0.493408f, 0.373779f, 0.489746f, 0.361572f, 0.488770f, 0.348145f, + 0.485107f, 0.332764f, 0.480469f, 0.316162f, 0.472900f, 0.297119f, 0.465332f, 0.274414f, + 0.454102f, 0.246948f, 0.436279f, 0.211060f, 0.408936f, 0.158203f, 0.352051f, 0.061707f, + 0.000000f, 1.000000f, 0.031860f, 0.984863f, 0.062103f, 0.963867f, 0.089905f, 0.941406f, + 0.115967f, 0.918945f, 0.139648f, 0.896973f, 0.162598f, 0.875488f, 0.181763f, 0.855957f, + 0.200928f, 0.836914f, 0.217651f, 0.818848f, 0.234985f, 0.800781f, 0.249878f, 0.784180f, + 0.264648f, 0.767578f, 0.278809f, 0.751953f, 0.292480f, 0.735840f, 0.304443f, 0.721680f, + 0.316895f, 0.707520f, 0.327393f, 0.694336f, 0.338135f, 0.681152f, 0.348145f, 0.668945f, + 0.358154f, 0.656250f, 0.367920f, 0.644531f, 0.377441f, 0.632812f, 0.384766f, 0.622070f, + 0.392822f, 0.611328f, 0.401367f, 0.600586f, 0.409424f, 0.590332f, 0.416748f, 0.580566f, + 0.423584f, 0.570801f, 0.431152f, 0.561035f, 0.437012f, 0.551758f, 0.443359f, 0.542969f, + 0.448486f, 0.534668f, 0.454346f, 0.525879f, 0.461182f, 0.517090f, 0.465332f, 0.509277f, + 0.470703f, 0.500977f, 0.475098f, 0.493408f, 0.479980f, 0.485840f, 0.484375f, 0.478516f, + 0.488281f, 0.470947f, 0.492920f, 0.463623f, 0.496826f, 0.456787f, 0.498779f, 0.448730f, + 0.501953f, 0.440918f, 0.504883f, 0.433594f, 0.507812f, 0.425537f, 0.509766f, 0.417236f, + 0.512207f, 0.408203f, 0.514160f, 0.400146f, 0.514648f, 0.390381f, 0.516602f, 0.380371f, + 0.515625f, 0.370361f, 0.516602f, 0.358643f, 0.515625f, 0.346436f, 0.514160f, 0.333740f, + 0.511719f, 0.319092f, 0.509277f, 0.302490f, 0.502441f, 0.284424f, 0.496094f, 0.262207f, + 0.484619f, 0.235474f, 0.472168f, 0.201050f, 0.446777f, 0.150513f, 0.394043f, 0.058258f, + 0.000000f, 1.000000f, 0.032166f, 0.984863f, 0.061920f, 0.963867f, 0.090759f, 0.940918f, + 0.116943f, 0.917969f, 0.140381f, 0.896484f, 0.162720f, 0.875488f, 0.183472f, 0.854980f, + 0.202637f, 0.835449f, 0.220215f, 0.817383f, 0.237549f, 0.798828f, 0.253418f, 0.781738f, + 0.268311f, 0.764648f, 0.283203f, 0.748047f, 0.296875f, 0.732910f, 0.309326f, 0.718262f, + 0.321289f, 0.704102f, 0.334473f, 0.689453f, 0.344238f, 0.676270f, 0.354736f, 0.663574f, + 0.365967f, 0.650879f, 0.375732f, 0.638672f, 0.384033f, 0.626953f, 0.393311f, 0.615234f, + 0.403076f, 0.603516f, 0.411377f, 0.592773f, 0.419678f, 0.582520f, 0.426025f, 0.572266f, + 0.434570f, 0.562012f, 0.440674f, 0.552734f, 0.449219f, 0.542480f, 0.455566f, 0.533203f, + 0.461670f, 0.524414f, 0.467285f, 0.515625f, 0.475098f, 0.506348f, 0.480225f, 0.498291f, + 0.486084f, 0.489502f, 0.490234f, 0.481689f, 0.495361f, 0.473877f, 0.500000f, 0.465820f, + 0.503906f, 0.458496f, 0.509766f, 0.450439f, 0.513672f, 0.443115f, 0.517578f, 0.435547f, + 0.520996f, 0.427002f, 0.523438f, 0.419434f, 0.527832f, 0.411621f, 0.529785f, 0.402588f, + 0.532715f, 0.394287f, 0.535156f, 0.385254f, 0.537598f, 0.375977f, 0.539551f, 0.365967f, + 0.540527f, 0.355957f, 0.540527f, 0.344482f, 0.541016f, 0.332764f, 0.539551f, 0.319824f, + 0.538086f, 0.305908f, 0.536621f, 0.288818f, 0.532227f, 0.271240f, 0.526855f, 0.249512f, + 0.518555f, 0.223755f, 0.504883f, 0.190186f, 0.482178f, 0.142944f, 0.436279f, 0.055878f, + 0.000000f, 1.000000f, 0.032196f, 0.984863f, 0.062805f, 0.963379f, 0.090637f, 0.940918f, + 0.118896f, 0.916992f, 0.141602f, 0.895996f, 0.165039f, 0.874023f, 0.185791f, 0.854004f, + 0.204712f, 0.834473f, 0.223145f, 0.814941f, 0.240356f, 0.796387f, 0.257080f, 0.778809f, + 0.272461f, 0.761719f, 0.287354f, 0.745117f, 0.300781f, 0.729492f, 0.315430f, 0.714355f, + 0.327148f, 0.699219f, 0.339355f, 0.685059f, 0.351562f, 0.670898f, 0.362061f, 0.658203f, + 0.373047f, 0.645020f, 0.383545f, 0.632324f, 0.393799f, 0.620117f, 0.403809f, 0.607910f, + 0.411133f, 0.597168f, 0.420166f, 0.585938f, 0.429932f, 0.574219f, 0.437012f, 0.563965f, + 0.445312f, 0.553711f, 0.452148f, 0.543457f, 0.459717f, 0.533691f, 0.467529f, 0.523926f, + 0.474365f, 0.514160f, 0.480469f, 0.505371f, 0.487793f, 0.496338f, 0.493896f, 0.487061f, + 0.499268f, 0.478516f, 0.505859f, 0.469482f, 0.511230f, 0.461670f, 0.516602f, 0.453369f, + 0.521484f, 0.445312f, 0.526367f, 0.437500f, 0.531250f, 0.429688f, 0.535156f, 0.422119f, + 0.538574f, 0.414062f, 0.543457f, 0.405273f, 0.547363f, 0.397217f, 0.551270f, 0.388916f, + 0.553223f, 0.379883f, 0.555664f, 0.371338f, 0.559570f, 0.361328f, 0.561523f, 0.351318f, + 0.563477f, 0.341064f, 0.565918f, 0.329834f, 0.565918f, 0.317871f, 0.564941f, 0.305420f, + 0.564941f, 0.291260f, 0.563965f, 0.274902f, 0.560547f, 0.258057f, 0.556152f, 0.237305f, + 0.550293f, 0.213013f, 0.539062f, 0.180786f, 0.519043f, 0.135864f, 0.474854f, 0.052826f, + 0.000000f, 1.000000f, 0.032440f, 0.984375f, 0.063049f, 0.963379f, 0.092773f, 0.939453f, + 0.118774f, 0.916992f, 0.142944f, 0.895508f, 0.166138f, 0.873535f, 0.187744f, 0.852539f, + 0.206665f, 0.833008f, 0.227295f, 0.812500f, 0.243774f, 0.793945f, 0.260254f, 0.776855f, + 0.275879f, 0.759277f, 0.291504f, 0.742188f, 0.307617f, 0.725098f, 0.319580f, 0.710449f, + 0.333984f, 0.694824f, 0.344727f, 0.681152f, 0.358643f, 0.666016f, 0.369629f, 0.652344f, + 0.381836f, 0.639160f, 0.391602f, 0.626465f, 0.401367f, 0.613770f, 0.412109f, 0.601074f, + 0.420654f, 0.589844f, 0.429443f, 0.578613f, 0.438232f, 0.566895f, 0.447510f, 0.555664f, + 0.456055f, 0.544922f, 0.464355f, 0.534180f, 0.471191f, 0.524414f, 0.480713f, 0.513672f, + 0.487061f, 0.504395f, 0.493652f, 0.494873f, 0.500977f, 0.485596f, 0.507324f, 0.476318f, + 0.514160f, 0.466797f, 0.520020f, 0.458008f, 0.525879f, 0.449463f, 0.532715f, 0.440430f, + 0.537109f, 0.432617f, 0.543457f, 0.424072f, 0.548828f, 0.416016f, 0.553223f, 0.408203f, + 0.558594f, 0.400146f, 0.562012f, 0.391602f, 0.565918f, 0.382568f, 0.570801f, 0.374268f, + 0.575195f, 0.365234f, 0.577637f, 0.356445f, 0.581543f, 0.346436f, 0.584473f, 0.337402f, + 0.585938f, 0.326416f, 0.589355f, 0.315674f, 0.589355f, 0.303955f, 0.590820f, 0.291260f, + 0.590820f, 0.277588f, 0.590332f, 0.262207f, 0.589355f, 0.244873f, 0.585938f, 0.224609f, + 0.580078f, 0.201416f, 0.570801f, 0.170776f, 0.554199f, 0.127808f, 0.515137f, 0.048737f, + 0.000000f, 1.000000f, 0.032379f, 0.984375f, 0.063538f, 0.962891f, 0.093689f, 0.938965f, + 0.119202f, 0.916992f, 0.144165f, 0.894531f, 0.166870f, 0.873047f, 0.189453f, 0.851562f, + 0.209839f, 0.830566f, 0.229370f, 0.811035f, 0.247192f, 0.791992f, 0.264404f, 0.773438f, + 0.281006f, 0.755859f, 0.296631f, 0.738281f, 0.312012f, 0.722168f, 0.324707f, 0.706543f, + 0.340576f, 0.690430f, 0.352295f, 0.675293f, 0.364502f, 0.661133f, 0.376221f, 0.646973f, + 0.388428f, 0.633301f, 0.399170f, 0.620117f, 0.409668f, 0.607422f, 0.420654f, 0.594238f, + 0.430176f, 0.582031f, 0.439697f, 0.570312f, 0.448975f, 0.558594f, 0.457764f, 0.547852f, + 0.467529f, 0.535645f, 0.475586f, 0.525391f, 0.484131f, 0.514648f, 0.491699f, 0.504395f, + 0.499756f, 0.494141f, 0.508789f, 0.483643f, 0.514160f, 0.474854f, 0.521973f, 0.464844f, + 0.528320f, 0.455566f, 0.535645f, 0.446045f, 0.542480f, 0.436768f, 0.548340f, 0.428223f, + 0.555176f, 0.419189f, 0.560059f, 0.411133f, 0.565918f, 0.402588f, 0.570801f, 0.394043f, + 0.577148f, 0.385986f, 0.581055f, 0.377930f, 0.586426f, 0.368164f, 0.590820f, 0.359619f, + 0.596191f, 0.350830f, 0.598145f, 0.342041f, 0.603027f, 0.332275f, 0.605957f, 0.322266f, + 0.609375f, 0.312012f, 0.613281f, 0.301514f, 0.614258f, 0.289551f, 0.616211f, 0.277100f, + 0.617676f, 0.264160f, 0.618652f, 0.249512f, 0.616699f, 0.231812f, 0.615234f, 0.212524f, + 0.610352f, 0.189819f, 0.602051f, 0.160278f, 0.589355f, 0.119446f, 0.553223f, 0.046387f, + 0.000000f, 1.000000f, 0.031982f, 0.984863f, 0.063782f, 0.962402f, 0.093689f, 0.939453f, + 0.120239f, 0.916504f, 0.145142f, 0.894043f, 0.169434f, 0.871582f, 0.190674f, 0.850098f, + 0.213013f, 0.829102f, 0.231201f, 0.809570f, 0.249634f, 0.790039f, 0.268555f, 0.770996f, + 0.284668f, 0.753418f, 0.300293f, 0.735840f, 0.316895f, 0.718262f, 0.331055f, 0.702148f, + 0.344482f, 0.686523f, 0.358154f, 0.670898f, 0.372314f, 0.655762f, 0.384033f, 0.641602f, + 0.396484f, 0.627441f, 0.408936f, 0.613281f, 0.419678f, 0.600098f, 0.430176f, 0.587402f, + 0.439453f, 0.575195f, 0.449463f, 0.562500f, 0.459717f, 0.550293f, 0.469971f, 0.538574f, + 0.479004f, 0.527344f, 0.486816f, 0.516113f, 0.496338f, 0.505371f, 0.504395f, 0.494629f, + 0.512695f, 0.483887f, 0.521484f, 0.473389f, 0.528809f, 0.463135f, 0.535645f, 0.453857f, + 0.543457f, 0.444092f, 0.551270f, 0.434326f, 0.558105f, 0.424561f, 0.564453f, 0.415527f, + 0.570801f, 0.406494f, 0.576172f, 0.397705f, 0.582520f, 0.388916f, 0.588867f, 0.380127f, + 0.595703f, 0.371582f, 0.600586f, 0.363281f, 0.606445f, 0.354492f, 0.610352f, 0.345459f, + 0.615723f, 0.336426f, 0.619629f, 0.327637f, 0.623535f, 0.317627f, 0.627930f, 0.307861f, + 0.631348f, 0.297363f, 0.635254f, 0.286865f, 0.638184f, 0.275635f, 0.641113f, 0.263184f, + 0.642578f, 0.249878f, 0.643555f, 0.235352f, 0.643555f, 0.218994f, 0.643066f, 0.200684f, + 0.640137f, 0.178589f, 0.633301f, 0.151367f, 0.621582f, 0.112854f, 0.590332f, 0.044617f, + 0.000000f, 1.000000f, 0.031830f, 0.984863f, 0.065002f, 0.961426f, 0.093323f, 0.939453f, + 0.120544f, 0.916504f, 0.146118f, 0.893555f, 0.170532f, 0.870605f, 0.192017f, 0.849609f, + 0.214478f, 0.827637f, 0.235474f, 0.806641f, 0.253662f, 0.787109f, 0.271240f, 0.768555f, + 0.288574f, 0.750000f, 0.305908f, 0.731934f, 0.321045f, 0.714844f, 0.336182f, 0.698242f, + 0.351318f, 0.681641f, 0.364990f, 0.666016f, 0.378906f, 0.650879f, 0.390625f, 0.635742f, + 0.403076f, 0.621582f, 0.416016f, 0.607422f, 0.427734f, 0.593750f, 0.438477f, 0.580078f, + 0.448975f, 0.567383f, 0.461426f, 0.554199f, 0.470215f, 0.542480f, 0.480713f, 0.530273f, + 0.489502f, 0.518555f, 0.499756f, 0.506348f, 0.508301f, 0.495850f, 0.517578f, 0.484131f, + 0.525879f, 0.473633f, 0.533691f, 0.463135f, 0.542480f, 0.452393f, 0.550293f, 0.442139f, + 0.558105f, 0.432129f, 0.565430f, 0.422607f, 0.573242f, 0.412354f, 0.581543f, 0.402832f, + 0.586914f, 0.393555f, 0.594727f, 0.384033f, 0.599121f, 0.375977f, 0.606934f, 0.366211f, + 0.612793f, 0.357666f, 0.619629f, 0.348633f, 0.625000f, 0.340332f, 0.629395f, 0.331299f, + 0.636230f, 0.321777f, 0.641113f, 0.312500f, 0.645508f, 0.303467f, 0.649902f, 0.293457f, + 0.653809f, 0.283447f, 0.657227f, 0.272705f, 0.661621f, 0.261230f, 0.664062f, 0.249023f, + 0.667969f, 0.236450f, 0.669434f, 0.222290f, 0.670898f, 0.207031f, 0.670410f, 0.188599f, + 0.667969f, 0.167603f, 0.663574f, 0.141479f, 0.653320f, 0.104431f, 0.627441f, 0.040070f, + 0.000000f, 1.000000f, 0.032135f, 0.984863f, 0.065613f, 0.961426f, 0.093323f, 0.939941f, + 0.121582f, 0.916016f, 0.148560f, 0.892090f, 0.172119f, 0.869629f, 0.194824f, 0.847656f, + 0.217041f, 0.826172f, 0.236938f, 0.805664f, 0.256592f, 0.785645f, 0.275635f, 0.765137f, + 0.292969f, 0.746582f, 0.310059f, 0.728516f, 0.326660f, 0.710938f, 0.342285f, 0.693848f, + 0.356445f, 0.677246f, 0.371338f, 0.660645f, 0.385742f, 0.645508f, 0.398438f, 0.630371f, + 0.411621f, 0.615234f, 0.424316f, 0.600586f, 0.436279f, 0.586426f, 0.448242f, 0.573242f, + 0.459961f, 0.560059f, 0.471191f, 0.546387f, 0.480957f, 0.534180f, 0.491211f, 0.521484f, + 0.501953f, 0.508789f, 0.510742f, 0.497559f, 0.520996f, 0.485840f, 0.529785f, 0.474609f, + 0.540039f, 0.463135f, 0.546387f, 0.452637f, 0.556641f, 0.441406f, 0.564941f, 0.430664f, + 0.572266f, 0.420898f, 0.580566f, 0.410400f, 0.589355f, 0.400391f, 0.596191f, 0.390625f, + 0.602539f, 0.380859f, 0.611328f, 0.370850f, 0.617188f, 0.361816f, 0.625977f, 0.352295f, + 0.630371f, 0.343750f, 0.637207f, 0.334717f, 0.643555f, 0.325684f, 0.649902f, 0.316650f, + 0.655762f, 0.307373f, 0.660156f, 0.298096f, 0.666016f, 0.288330f, 0.671387f, 0.279053f, + 0.675781f, 0.268799f, 0.680176f, 0.258301f, 0.685059f, 0.247192f, 0.686523f, 0.235718f, + 0.690918f, 0.223145f, 0.693359f, 0.208984f, 0.694336f, 0.194458f, 0.695801f, 0.176758f, + 0.696777f, 0.157349f, 0.693359f, 0.131958f, 0.684570f, 0.097412f, 0.661133f, 0.037842f, + 0.000000f, 1.000000f, 0.032623f, 0.984375f, 0.064941f, 0.961914f, 0.094177f, 0.938965f, + 0.122559f, 0.915039f, 0.148560f, 0.891602f, 0.172485f, 0.869141f, 0.196777f, 0.846191f, + 0.219849f, 0.824219f, 0.239868f, 0.803711f, 0.260498f, 0.782715f, 0.279541f, 0.762695f, + 0.298340f, 0.743652f, 0.314697f, 0.725098f, 0.330811f, 0.707031f, 0.347900f, 0.689453f, + 0.362061f, 0.672852f, 0.378662f, 0.655762f, 0.392090f, 0.640137f, 0.405762f, 0.624512f, + 0.418457f, 0.609375f, 0.432129f, 0.594727f, 0.445801f, 0.580078f, 0.457520f, 0.565918f, + 0.469971f, 0.551758f, 0.480469f, 0.538574f, 0.491699f, 0.525391f, 0.503418f, 0.512207f, + 0.513672f, 0.500000f, 0.522461f, 0.488281f, 0.532715f, 0.476074f, 0.543457f, 0.464355f, + 0.551758f, 0.452881f, 0.562012f, 0.441406f, 0.569336f, 0.430664f, 0.580078f, 0.419434f, + 0.586426f, 0.409180f, 0.596191f, 0.398193f, 0.603516f, 0.388428f, 0.611816f, 0.377930f, + 0.620605f, 0.367432f, 0.628418f, 0.357910f, 0.634766f, 0.348389f, 0.642090f, 0.339111f, + 0.648926f, 0.329346f, 0.655762f, 0.320312f, 0.662109f, 0.311279f, 0.667969f, 0.302246f, + 0.675293f, 0.293213f, 0.680176f, 0.283936f, 0.686035f, 0.273926f, 0.691895f, 0.264404f, + 0.696289f, 0.254395f, 0.701172f, 0.243896f, 0.708008f, 0.232788f, 0.710938f, 0.221558f, + 0.714355f, 0.209351f, 0.718750f, 0.195801f, 0.721191f, 0.181641f, 0.722168f, 0.165527f, + 0.723633f, 0.146851f, 0.721191f, 0.123413f, 0.714355f, 0.091125f, 0.694336f, 0.035065f, + 0.000000f, 1.000000f, 0.033020f, 0.983887f, 0.065308f, 0.961914f, 0.094727f, 0.938965f, + 0.123535f, 0.914551f, 0.149902f, 0.891602f, 0.175659f, 0.867188f, 0.199585f, 0.844727f, + 0.221313f, 0.823242f, 0.243652f, 0.800781f, 0.262939f, 0.780762f, 0.282959f, 0.760254f, + 0.300293f, 0.741211f, 0.319336f, 0.721680f, 0.337646f, 0.702637f, 0.353271f, 0.685547f, + 0.369141f, 0.667480f, 0.385010f, 0.650879f, 0.400146f, 0.634277f, 0.414551f, 0.618164f, + 0.428955f, 0.602539f, 0.440918f, 0.587891f, 0.454346f, 0.572754f, 0.466797f, 0.558594f, + 0.479248f, 0.544434f, 0.491211f, 0.530273f, 0.502441f, 0.517090f, 0.512695f, 0.504395f, + 0.523926f, 0.491455f, 0.535156f, 0.478516f, 0.544922f, 0.466797f, 0.554199f, 0.454590f, + 0.564941f, 0.442383f, 0.574219f, 0.430908f, 0.584473f, 0.419189f, 0.592773f, 0.408691f, + 0.603027f, 0.396973f, 0.612793f, 0.385742f, 0.620117f, 0.375732f, 0.625488f, 0.366211f, + 0.636719f, 0.354980f, 0.643555f, 0.345215f, 0.651855f, 0.334717f, 0.659668f, 0.324951f, + 0.667969f, 0.315186f, 0.673340f, 0.306152f, 0.679688f, 0.297363f, 0.687500f, 0.287598f, + 0.694824f, 0.278320f, 0.701660f, 0.269287f, 0.707031f, 0.259766f, 0.712402f, 0.249878f, + 0.718750f, 0.240234f, 0.722656f, 0.230103f, 0.728516f, 0.219116f, 0.733398f, 0.207886f, + 0.737793f, 0.196899f, 0.742676f, 0.183472f, 0.744629f, 0.169678f, 0.748047f, 0.154053f, + 0.747559f, 0.136230f, 0.748535f, 0.113220f, 0.744141f, 0.082703f, 0.728027f, 0.031616f, + 0.000000f, 1.000000f, 0.033752f, 0.983398f, 0.065613f, 0.961914f, 0.095276f, 0.938477f, + 0.124146f, 0.914062f, 0.150757f, 0.890625f, 0.176392f, 0.866699f, 0.200439f, 0.844238f, + 0.224243f, 0.821289f, 0.245117f, 0.799805f, 0.267090f, 0.778320f, 0.286621f, 0.758301f, + 0.306641f, 0.737305f, 0.323730f, 0.718262f, 0.342285f, 0.699219f, 0.359375f, 0.681152f, + 0.375977f, 0.663086f, 0.391602f, 0.645996f, 0.407227f, 0.628906f, 0.422119f, 0.612305f, + 0.435547f, 0.596680f, 0.448730f, 0.581543f, 0.462891f, 0.565918f, 0.475830f, 0.551270f, + 0.488037f, 0.536621f, 0.501465f, 0.522461f, 0.513184f, 0.508301f, 0.524902f, 0.495117f, + 0.536621f, 0.481689f, 0.546387f, 0.469482f, 0.557129f, 0.456543f, 0.568359f, 0.443848f, + 0.578613f, 0.431885f, 0.588867f, 0.419922f, 0.599121f, 0.407959f, 0.607422f, 0.396729f, + 0.616699f, 0.385498f, 0.626953f, 0.374268f, 0.634766f, 0.363525f, 0.643066f, 0.352783f, + 0.652344f, 0.342529f, 0.660156f, 0.332031f, 0.668945f, 0.321533f, 0.677246f, 0.311279f, + 0.685059f, 0.301758f, 0.691406f, 0.291992f, 0.699219f, 0.282715f, 0.706543f, 0.272949f, + 0.712891f, 0.263916f, 0.721191f, 0.254395f, 0.726562f, 0.245850f, 0.731934f, 0.235962f, + 0.739258f, 0.225464f, 0.745117f, 0.215942f, 0.750000f, 0.205566f, 0.755859f, 0.194336f, + 0.760254f, 0.183350f, 0.765137f, 0.171387f, 0.769043f, 0.158081f, 0.772461f, 0.142822f, + 0.773438f, 0.125977f, 0.774414f, 0.105103f, 0.771484f, 0.077087f, 0.757812f, 0.028961f, + 0.000000f, 1.000000f, 0.033691f, 0.983398f, 0.065063f, 0.962402f, 0.096558f, 0.937500f, + 0.125366f, 0.913574f, 0.152954f, 0.888672f, 0.177856f, 0.866211f, 0.202881f, 0.842285f, + 0.226318f, 0.819336f, 0.249023f, 0.797363f, 0.270508f, 0.775879f, 0.290771f, 0.754883f, + 0.309814f, 0.734375f, 0.330811f, 0.713867f, 0.347412f, 0.695801f, 0.364746f, 0.676758f, + 0.382324f, 0.658691f, 0.398438f, 0.640625f, 0.413818f, 0.623535f, 0.429688f, 0.606934f, + 0.443848f, 0.590332f, 0.458496f, 0.574219f, 0.472412f, 0.559082f, 0.485596f, 0.543457f, + 0.499023f, 0.528809f, 0.512207f, 0.514160f, 0.522949f, 0.500488f, 0.535156f, 0.486572f, + 0.547363f, 0.472900f, 0.558594f, 0.459473f, 0.570312f, 0.446533f, 0.580566f, 0.433838f, + 0.590820f, 0.421387f, 0.603027f, 0.408936f, 0.611328f, 0.397217f, 0.622559f, 0.385254f, + 0.631348f, 0.373779f, 0.641113f, 0.362549f, 0.650391f, 0.351562f, 0.659668f, 0.340088f, + 0.667480f, 0.329834f, 0.676270f, 0.319336f, 0.684570f, 0.309082f, 0.694824f, 0.297852f, + 0.701660f, 0.288086f, 0.709473f, 0.278320f, 0.717773f, 0.268311f, 0.723633f, 0.259277f, + 0.731445f, 0.249512f, 0.738770f, 0.240234f, 0.746094f, 0.230713f, 0.751953f, 0.222412f, + 0.758789f, 0.211792f, 0.765137f, 0.201660f, 0.772461f, 0.191772f, 0.776855f, 0.181396f, + 0.782227f, 0.170288f, 0.787598f, 0.158203f, 0.791016f, 0.145630f, 0.795410f, 0.131836f, + 0.797852f, 0.116455f, 0.800781f, 0.096130f, 0.798340f, 0.071167f, 0.787109f, 0.025589f, + 0.000000f, 1.000000f, 0.034302f, 0.983398f, 0.065308f, 0.962402f, 0.096863f, 0.937500f, + 0.125610f, 0.913086f, 0.153076f, 0.889160f, 0.179688f, 0.864746f, 0.204712f, 0.841309f, + 0.228760f, 0.817871f, 0.252441f, 0.794922f, 0.273438f, 0.773438f, 0.294922f, 0.751953f, + 0.314697f, 0.731445f, 0.334473f, 0.710938f, 0.354004f, 0.691406f, 0.369873f, 0.672363f, + 0.388184f, 0.653809f, 0.404541f, 0.635742f, 0.421875f, 0.617676f, 0.438965f, 0.600098f, + 0.452637f, 0.583496f, 0.466797f, 0.567383f, 0.481201f, 0.551270f, 0.495361f, 0.536133f, + 0.508301f, 0.520996f, 0.521973f, 0.506348f, 0.535156f, 0.491211f, 0.547852f, 0.477539f, + 0.558594f, 0.463867f, 0.569824f, 0.450195f, 0.582031f, 0.436768f, 0.593262f, 0.423584f, + 0.604492f, 0.410645f, 0.615723f, 0.398193f, 0.626953f, 0.385986f, 0.634277f, 0.374512f, + 0.646484f, 0.362061f, 0.656250f, 0.350586f, 0.665527f, 0.339111f, 0.675781f, 0.328125f, + 0.685059f, 0.316650f, 0.693359f, 0.306152f, 0.701660f, 0.295654f, 0.710449f, 0.285156f, + 0.719238f, 0.274658f, 0.726562f, 0.264648f, 0.734375f, 0.254639f, 0.743164f, 0.244751f, + 0.750977f, 0.234985f, 0.757324f, 0.226074f, 0.764648f, 0.216553f, 0.772949f, 0.206909f, + 0.780762f, 0.197876f, 0.784180f, 0.188477f, 0.791016f, 0.178223f, 0.798340f, 0.167847f, + 0.804688f, 0.157349f, 0.810547f, 0.146118f, 0.814453f, 0.134033f, 0.818848f, 0.120789f, + 0.821289f, 0.106506f, 0.824219f, 0.088257f, 0.825195f, 0.063965f, 0.814941f, 0.023544f, + 0.000000f, 1.000000f, 0.033966f, 0.983887f, 0.066040f, 0.961426f, 0.096497f, 0.937988f, + 0.126831f, 0.912598f, 0.153931f, 0.888672f, 0.181152f, 0.863770f, 0.207153f, 0.839355f, + 0.231567f, 0.815918f, 0.253418f, 0.793945f, 0.277100f, 0.770996f, 0.299072f, 0.749023f, + 0.319336f, 0.728027f, 0.339844f, 0.707031f, 0.358643f, 0.687012f, 0.376221f, 0.667969f, + 0.395020f, 0.648438f, 0.412109f, 0.630371f, 0.427734f, 0.612305f, 0.446289f, 0.594238f, + 0.461914f, 0.577148f, 0.475830f, 0.560547f, 0.490479f, 0.544434f, 0.504883f, 0.528320f, + 0.518555f, 0.512695f, 0.532227f, 0.498047f, 0.544922f, 0.483398f, 0.557617f, 0.468506f, + 0.571289f, 0.453857f, 0.583496f, 0.440186f, 0.595215f, 0.426758f, 0.605957f, 0.413574f, + 0.617676f, 0.400391f, 0.630859f, 0.386963f, 0.638672f, 0.375244f, 0.651367f, 0.362305f, + 0.661133f, 0.350586f, 0.671387f, 0.338867f, 0.681641f, 0.326904f, 0.689453f, 0.315674f, + 0.699707f, 0.304443f, 0.708984f, 0.293213f, 0.719238f, 0.282227f, 0.726074f, 0.272217f, + 0.735352f, 0.261719f, 0.744141f, 0.251221f, 0.753418f, 0.240356f, 0.762207f, 0.230713f, + 0.768066f, 0.221313f, 0.775879f, 0.211792f, 0.782715f, 0.202393f, 0.791504f, 0.192505f, + 0.798340f, 0.183960f, 0.805176f, 0.174316f, 0.811523f, 0.165283f, 0.818359f, 0.154419f, + 0.824219f, 0.144897f, 0.830078f, 0.134155f, 0.834961f, 0.123047f, 0.840332f, 0.110107f, + 0.844238f, 0.096313f, 0.846680f, 0.080017f, 0.848145f, 0.057251f, 0.842285f, 0.023071f, + 0.000000f, 1.000000f, 0.033997f, 0.983887f, 0.066833f, 0.960938f, 0.097168f, 0.937500f, + 0.127563f, 0.912109f, 0.155396f, 0.887695f, 0.183105f, 0.862793f, 0.208984f, 0.838379f, + 0.233887f, 0.814453f, 0.257812f, 0.791016f, 0.280518f, 0.768066f, 0.301758f, 0.746582f, + 0.323975f, 0.724609f, 0.344971f, 0.703613f, 0.364258f, 0.683105f, 0.383301f, 0.663086f, + 0.401611f, 0.644043f, 0.419189f, 0.625000f, 0.436768f, 0.606445f, 0.452393f, 0.588867f, + 0.468750f, 0.570801f, 0.484619f, 0.553711f, 0.500488f, 0.536621f, 0.516113f, 0.520508f, + 0.530273f, 0.504395f, 0.543945f, 0.489258f, 0.557129f, 0.474121f, 0.569824f, 0.459229f, + 0.583008f, 0.444580f, 0.595703f, 0.430420f, 0.607910f, 0.416748f, 0.620117f, 0.402832f, + 0.631836f, 0.389893f, 0.641602f, 0.376953f, 0.653320f, 0.363770f, 0.664551f, 0.351318f, + 0.675293f, 0.338867f, 0.687012f, 0.326416f, 0.695801f, 0.315430f, 0.706055f, 0.303223f, + 0.714355f, 0.292480f, 0.725586f, 0.280762f, 0.734863f, 0.269775f, 0.743164f, 0.259033f, + 0.751953f, 0.248657f, 0.761230f, 0.238159f, 0.770508f, 0.227783f, 0.778809f, 0.217407f, + 0.786621f, 0.207520f, 0.795410f, 0.197510f, 0.802246f, 0.188232f, 0.809082f, 0.178833f, + 0.816895f, 0.169800f, 0.823730f, 0.160522f, 0.830078f, 0.151611f, 0.839355f, 0.141724f, + 0.842773f, 0.132080f, 0.850586f, 0.121460f, 0.855469f, 0.111450f, 0.861328f, 0.099548f, + 0.866211f, 0.086487f, 0.869141f, 0.072083f, 0.872070f, 0.051971f, 0.868164f, 0.019196f, + 0.000000f, 1.000000f, 0.034058f, 0.983887f, 0.067078f, 0.960938f, 0.098328f, 0.936523f, + 0.128906f, 0.911133f, 0.156494f, 0.886719f, 0.184204f, 0.861816f, 0.211792f, 0.836914f, + 0.236084f, 0.812988f, 0.261719f, 0.788574f, 0.284424f, 0.765625f, 0.306152f, 0.743652f, + 0.328613f, 0.721191f, 0.349609f, 0.699707f, 0.369141f, 0.679199f, 0.389893f, 0.658203f, + 0.408447f, 0.638672f, 0.426514f, 0.619141f, 0.442871f, 0.600586f, 0.461182f, 0.582031f, + 0.478027f, 0.563965f, 0.495361f, 0.546387f, 0.509766f, 0.529297f, 0.523926f, 0.513184f, + 0.539551f, 0.496826f, 0.554199f, 0.480957f, 0.567383f, 0.465576f, 0.580566f, 0.450439f, + 0.595215f, 0.435059f, 0.608398f, 0.420898f, 0.619629f, 0.406982f, 0.631836f, 0.393066f, + 0.644531f, 0.378906f, 0.656738f, 0.365967f, 0.666992f, 0.353027f, 0.679199f, 0.340088f, + 0.690430f, 0.327148f, 0.699707f, 0.315430f, 0.711426f, 0.302979f, 0.721191f, 0.291504f, + 0.730957f, 0.279541f, 0.741211f, 0.268066f, 0.750000f, 0.257324f, 0.760254f, 0.246216f, + 0.768066f, 0.235474f, 0.778320f, 0.224731f, 0.785645f, 0.214966f, 0.795898f, 0.204224f, + 0.802734f, 0.194336f, 0.812500f, 0.184082f, 0.818848f, 0.174683f, 0.827637f, 0.164795f, + 0.835449f, 0.155762f, 0.842285f, 0.146606f, 0.849609f, 0.137817f, 0.856934f, 0.128662f, + 0.863281f, 0.119934f, 0.869629f, 0.109497f, 0.875977f, 0.099609f, 0.881836f, 0.089417f, + 0.887695f, 0.076904f, 0.891602f, 0.063049f, 0.895508f, 0.044708f, 0.893555f, 0.016769f, + 0.000000f, 1.000000f, 0.033264f, 0.984375f, 0.066284f, 0.961914f, 0.098633f, 0.936523f, + 0.128906f, 0.911621f, 0.158203f, 0.886230f, 0.186279f, 0.860352f, 0.213501f, 0.835449f, + 0.239624f, 0.811035f, 0.263672f, 0.787109f, 0.288086f, 0.763184f, 0.310303f, 0.740723f, + 0.333252f, 0.717773f, 0.355469f, 0.695801f, 0.375000f, 0.674805f, 0.395020f, 0.654297f, + 0.414062f, 0.634277f, 0.432861f, 0.613770f, 0.450439f, 0.595215f, 0.469238f, 0.575684f, + 0.485840f, 0.557617f, 0.502930f, 0.540039f, 0.519043f, 0.522461f, 0.533691f, 0.505371f, + 0.549316f, 0.488770f, 0.563477f, 0.472656f, 0.578125f, 0.456787f, 0.592285f, 0.441162f, + 0.606445f, 0.425781f, 0.620117f, 0.410889f, 0.633301f, 0.396729f, 0.644043f, 0.382812f, + 0.656250f, 0.368896f, 0.669434f, 0.354980f, 0.683105f, 0.341309f, 0.692383f, 0.329102f, + 0.703125f, 0.316162f, 0.715820f, 0.303467f, 0.725098f, 0.291504f, 0.737305f, 0.279053f, + 0.746582f, 0.267578f, 0.754883f, 0.256592f, 0.766113f, 0.244629f, 0.775391f, 0.233643f, + 0.785645f, 0.222778f, 0.794434f, 0.212036f, 0.803223f, 0.201294f, 0.812500f, 0.191040f, + 0.819824f, 0.181519f, 0.829590f, 0.171143f, 0.837402f, 0.161377f, 0.845215f, 0.151367f, + 0.852539f, 0.142212f, 0.861816f, 0.132690f, 0.867188f, 0.124573f, 0.874512f, 0.115173f, + 0.881836f, 0.106506f, 0.888672f, 0.097778f, 0.895508f, 0.087830f, 0.902344f, 0.077271f, + 0.908203f, 0.067383f, 0.913086f, 0.054840f, 0.916504f, 0.039185f, 0.916504f, 0.014191f, + 0.000000f, 1.000000f, 0.033478f, 0.984375f, 0.066833f, 0.961426f, 0.098694f, 0.936523f, + 0.130005f, 0.910645f, 0.159424f, 0.885254f, 0.187866f, 0.859375f, 0.215088f, 0.834473f, + 0.241333f, 0.809082f, 0.266602f, 0.785156f, 0.290771f, 0.761230f, 0.314941f, 0.737305f, + 0.336670f, 0.715332f, 0.359375f, 0.692383f, 0.380859f, 0.670410f, 0.400146f, 0.649902f, + 0.422119f, 0.628418f, 0.440674f, 0.608398f, 0.459717f, 0.588867f, 0.477783f, 0.569336f, + 0.494629f, 0.550781f, 0.511719f, 0.532227f, 0.526855f, 0.515137f, 0.542480f, 0.498047f, + 0.559082f, 0.480957f, 0.574219f, 0.464111f, 0.589355f, 0.447754f, 0.603027f, 0.432129f, + 0.618164f, 0.416504f, 0.632812f, 0.401123f, 0.644043f, 0.386963f, 0.657715f, 0.372314f, + 0.670898f, 0.358154f, 0.682617f, 0.344727f, 0.695312f, 0.330566f, 0.707520f, 0.317383f, + 0.719238f, 0.304688f, 0.729004f, 0.291992f, 0.740234f, 0.279541f, 0.751465f, 0.267090f, + 0.761230f, 0.255371f, 0.771973f, 0.243774f, 0.782227f, 0.232300f, 0.790527f, 0.221436f, + 0.801758f, 0.209717f, 0.810547f, 0.199585f, 0.818359f, 0.189087f, 0.828125f, 0.178467f, + 0.836426f, 0.168091f, 0.846191f, 0.158203f, 0.852539f, 0.149292f, 0.861816f, 0.138794f, + 0.871094f, 0.128784f, 0.876465f, 0.120483f, 0.885254f, 0.110779f, 0.894043f, 0.101440f, + 0.899902f, 0.093384f, 0.907715f, 0.084656f, 0.914551f, 0.076172f, 0.920898f, 0.067810f, + 0.926758f, 0.057373f, 0.933105f, 0.046234f, 0.937012f, 0.032898f, 0.937988f, 0.011459f, + 0.000000f, 1.000000f, 0.033630f, 0.983887f, 0.067444f, 0.960938f, 0.098999f, 0.936523f, + 0.129883f, 0.910645f, 0.160889f, 0.883789f, 0.189819f, 0.858398f, 0.217163f, 0.833008f, + 0.244019f, 0.807617f, 0.270752f, 0.782227f, 0.296143f, 0.757812f, 0.319092f, 0.734375f, + 0.342529f, 0.710938f, 0.364014f, 0.688477f, 0.385986f, 0.666504f, 0.407959f, 0.644531f, + 0.427246f, 0.624023f, 0.447754f, 0.603027f, 0.466553f, 0.583008f, 0.484375f, 0.563477f, + 0.501465f, 0.544922f, 0.520508f, 0.525879f, 0.539062f, 0.506836f, 0.555664f, 0.489258f, + 0.571289f, 0.471924f, 0.586426f, 0.455078f, 0.601562f, 0.438477f, 0.616699f, 0.422363f, + 0.631348f, 0.406738f, 0.645996f, 0.391357f, 0.657715f, 0.376953f, 0.668945f, 0.362793f, + 0.683105f, 0.347900f, 0.695801f, 0.333496f, 0.709473f, 0.319336f, 0.721680f, 0.306152f, + 0.732422f, 0.293945f, 0.741699f, 0.281006f, 0.754395f, 0.267578f, 0.766113f, 0.255371f, + 0.776855f, 0.243774f, 0.785645f, 0.232300f, 0.796875f, 0.220093f, 0.806641f, 0.208984f, + 0.816406f, 0.197876f, 0.825684f, 0.187134f, 0.835449f, 0.176392f, 0.845215f, 0.165771f, + 0.853027f, 0.155762f, 0.862305f, 0.145752f, 0.871094f, 0.135498f, 0.879395f, 0.125732f, + 0.886230f, 0.116943f, 0.894531f, 0.107727f, 0.903320f, 0.098267f, 0.911133f, 0.088867f, + 0.917969f, 0.080261f, 0.924805f, 0.071716f, 0.931641f, 0.063538f, 0.938477f, 0.055145f, + 0.945312f, 0.046967f, 0.951172f, 0.038208f, 0.956055f, 0.026398f, 0.960449f, 0.009575f, + 0.000000f, 1.000000f, 0.034332f, 0.983887f, 0.066467f, 0.961914f, 0.099854f, 0.936035f, + 0.131104f, 0.910156f, 0.162109f, 0.883301f, 0.191162f, 0.857422f, 0.219360f, 0.831543f, + 0.247070f, 0.805664f, 0.273926f, 0.780273f, 0.298828f, 0.755371f, 0.322754f, 0.731934f, + 0.347168f, 0.708008f, 0.370850f, 0.684082f, 0.392822f, 0.661621f, 0.413330f, 0.640137f, + 0.435303f, 0.618652f, 0.455078f, 0.597656f, 0.473877f, 0.577148f, 0.493896f, 0.556641f, + 0.512207f, 0.537109f, 0.530762f, 0.518066f, 0.548340f, 0.499512f, 0.564453f, 0.481689f, + 0.581055f, 0.464111f, 0.597168f, 0.446777f, 0.611816f, 0.430176f, 0.626465f, 0.413574f, + 0.642090f, 0.397461f, 0.655762f, 0.382080f, 0.670410f, 0.366699f, 0.682617f, 0.351807f, + 0.697266f, 0.337158f, 0.710449f, 0.322754f, 0.722656f, 0.309082f, 0.733398f, 0.295654f, + 0.746582f, 0.282227f, 0.758301f, 0.269043f, 0.769531f, 0.256104f, 0.780273f, 0.244141f, + 0.791016f, 0.231934f, 0.801758f, 0.219849f, 0.811035f, 0.208374f, 0.821777f, 0.197021f, + 0.831055f, 0.186035f, 0.842285f, 0.174561f, 0.850586f, 0.164062f, 0.860840f, 0.153442f, + 0.868652f, 0.143311f, 0.877441f, 0.133545f, 0.886719f, 0.123291f, 0.894531f, 0.113953f, + 0.901367f, 0.105103f, 0.911621f, 0.095093f, 0.919434f, 0.085938f, 0.926270f, 0.077271f, + 0.934570f, 0.068787f, 0.941895f, 0.059631f, 0.949219f, 0.051025f, 0.956055f, 0.042542f, + 0.963867f, 0.034424f, 0.969727f, 0.027069f, 0.976074f, 0.018982f, 0.980469f, 0.005779f, + 0.000000f, 1.000000f, 0.034424f, 0.983887f, 0.066284f, 0.961914f, 0.100586f, 0.935547f, + 0.132080f, 0.909668f, 0.162842f, 0.882812f, 0.192383f, 0.856445f, 0.221924f, 0.829590f, + 0.250000f, 0.803223f, 0.276611f, 0.778320f, 0.301758f, 0.753418f, 0.328613f, 0.728027f, + 0.350342f, 0.705078f, 0.375977f, 0.680176f, 0.397461f, 0.658203f, 0.421631f, 0.634766f, + 0.441650f, 0.613281f, 0.461182f, 0.592285f, 0.483643f, 0.570801f, 0.502441f, 0.550293f, + 0.520996f, 0.530273f, 0.538574f, 0.511230f, 0.556152f, 0.492676f, 0.574219f, 0.474121f, + 0.591797f, 0.455811f, 0.607422f, 0.438232f, 0.623535f, 0.421143f, 0.639648f, 0.404297f, + 0.655273f, 0.387939f, 0.668457f, 0.372314f, 0.682129f, 0.356934f, 0.695801f, 0.341797f, + 0.708496f, 0.327393f, 0.721680f, 0.312500f, 0.735840f, 0.297852f, 0.750000f, 0.284180f, + 0.759766f, 0.271729f, 0.770020f, 0.258301f, 0.784180f, 0.244629f, 0.796875f, 0.232422f, + 0.803223f, 0.220947f, 0.816406f, 0.208008f, 0.828613f, 0.196289f, 0.835449f, 0.185547f, + 0.847656f, 0.173462f, 0.856445f, 0.163574f, 0.865723f, 0.152222f, 0.876465f, 0.141602f, + 0.883789f, 0.131714f, 0.894043f, 0.121216f, 0.902344f, 0.111694f, 0.910645f, 0.101868f, + 0.920410f, 0.091797f, 0.927246f, 0.083313f, 0.936523f, 0.073181f, 0.942383f, 0.065674f, + 0.952637f, 0.055176f, 0.957031f, 0.049164f, 0.968262f, 0.037628f, 0.968262f, 0.033844f, + 0.983887f, 0.020599f, 0.983887f, 0.016708f, 0.996582f, 0.005913f, 0.999512f, 0.000015f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.998047f, + 0.000000f, 0.997070f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, 0.000000f, 0.993164f, + 0.000000f, 0.990723f, 0.000000f, 0.989258f, 0.000000f, 0.986816f, 0.000000f, 0.984375f, + 0.000000f, 0.982422f, 0.000000f, 0.979492f, 0.000000f, 0.975586f, 0.000000f, 0.973633f, + 0.000000f, 0.970215f, 0.000000f, 0.966309f, 0.000000f, 0.961914f, 0.000000f, 0.958984f, + 0.000000f, 0.954590f, 0.000000f, 0.950195f, 0.000000f, 0.945312f, 0.000000f, 0.940430f, + 0.000000f, 0.935547f, 0.000000f, 0.930176f, 0.000000f, 0.924805f, 0.000000f, 0.918945f, + 0.000000f, 0.912598f, 0.000000f, 0.906250f, 0.000000f, 0.899414f, 0.000000f, 0.892090f, + 0.000000f, 0.884766f, 0.000000f, 0.876953f, 0.000000f, 0.869141f, 0.000000f, 0.860840f, + 0.000000f, 0.851562f, 0.000000f, 0.841797f, 0.000000f, 0.832031f, 0.000000f, 0.821777f, + 0.000000f, 0.811523f, 0.000000f, 0.799805f, 0.000000f, 0.787598f, 0.000000f, 0.774902f, + 0.000000f, 0.761230f, 0.000000f, 0.747070f, 0.000000f, 0.732910f, 0.000000f, 0.717773f, + 0.000000f, 0.700195f, 0.000000f, 0.682617f, 0.000000f, 0.663086f, 0.000000f, 0.643066f, + 0.000000f, 0.622070f, 0.000000f, 0.597656f, 0.000000f, 0.572266f, 0.000000f, 0.544922f, + 0.000000f, 0.515625f, 0.000000f, 0.480957f, 0.000000f, 0.444092f, 0.000000f, 0.401367f, + 0.000000f, 0.351074f, 0.000000f, 0.289551f, 0.000000f, 0.207397f, 0.000000f, 0.080261f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.997070f, 0.000000f, 0.996094f, 0.000000f, 0.994629f, 0.000000f, 0.992676f, + 0.000000f, 0.991211f, 0.000000f, 0.988770f, 0.000000f, 0.986816f, 0.000000f, 0.984375f, + 0.000000f, 0.981934f, 0.000000f, 0.979492f, 0.000000f, 0.976074f, 0.000000f, 0.973145f, + 0.000000f, 0.969727f, 0.000000f, 0.966309f, 0.000000f, 0.961914f, 0.000000f, 0.958496f, + 0.000000f, 0.954590f, 0.000000f, 0.949707f, 0.000000f, 0.945312f, 0.000000f, 0.940430f, + 0.000000f, 0.935059f, 0.000000f, 0.929688f, 0.000000f, 0.924316f, 0.000000f, 0.918457f, + 0.000000f, 0.912598f, 0.000000f, 0.906250f, 0.000000f, 0.899414f, 0.000000f, 0.892090f, + 0.000000f, 0.884277f, 0.000000f, 0.876953f, 0.000000f, 0.869141f, 0.000000f, 0.860352f, + 0.000000f, 0.851562f, 0.000000f, 0.841797f, 0.000000f, 0.832031f, 0.000000f, 0.821777f, + 0.000000f, 0.811035f, 0.000000f, 0.799805f, 0.000000f, 0.787598f, 0.000000f, 0.774902f, + 0.000000f, 0.761230f, 0.000000f, 0.747070f, 0.000000f, 0.732910f, 0.000000f, 0.717285f, + 0.000001f, 0.699707f, 0.000004f, 0.682617f, 0.000007f, 0.662598f, 0.000009f, 0.643066f, + 0.000009f, 0.622070f, 0.000009f, 0.597656f, 0.000009f, 0.572266f, 0.000008f, 0.544922f, + 0.000007f, 0.516113f, 0.000006f, 0.481689f, 0.000006f, 0.443604f, 0.000005f, 0.402100f, + 0.000004f, 0.351562f, 0.000003f, 0.289062f, 0.000002f, 0.207764f, 0.000001f, 0.079895f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998047f, + 0.000000f, 0.996582f, 0.000000f, 0.995605f, 0.000000f, 0.994141f, 0.000000f, 0.992676f, + 0.000000f, 0.990723f, 0.000000f, 0.988770f, 0.000000f, 0.986328f, 0.000000f, 0.984375f, + 0.000000f, 0.981445f, 0.000000f, 0.979004f, 0.000000f, 0.975586f, 0.000000f, 0.972168f, + 0.000000f, 0.969238f, 0.000000f, 0.965820f, 0.000000f, 0.961914f, 0.000000f, 0.958008f, + 0.000002f, 0.953613f, 0.000007f, 0.949707f, 0.000012f, 0.944824f, 0.000018f, 0.939941f, + 0.000024f, 0.934570f, 0.000031f, 0.929199f, 0.000038f, 0.923340f, 0.000044f, 0.917480f, + 0.000052f, 0.911621f, 0.000059f, 0.905762f, 0.000066f, 0.898438f, 0.000072f, 0.891602f, + 0.000080f, 0.883789f, 0.000087f, 0.875977f, 0.000093f, 0.868164f, 0.000095f, 0.859863f, + 0.000096f, 0.850586f, 0.000096f, 0.841309f, 0.000093f, 0.831543f, 0.000090f, 0.821289f, + 0.000087f, 0.810059f, 0.000084f, 0.799316f, 0.000079f, 0.787109f, 0.000073f, 0.773926f, + 0.000072f, 0.760742f, 0.000072f, 0.747070f, 0.000073f, 0.732422f, 0.000073f, 0.716309f, + 0.000074f, 0.699707f, 0.000072f, 0.681641f, 0.000067f, 0.663086f, 0.000064f, 0.643066f, + 0.000062f, 0.621582f, 0.000062f, 0.597168f, 0.000057f, 0.571777f, 0.000056f, 0.544434f, + 0.000053f, 0.515625f, 0.000048f, 0.481445f, 0.000044f, 0.443359f, 0.000042f, 0.401855f, + 0.000034f, 0.350830f, 0.000030f, 0.288818f, 0.000019f, 0.207642f, 0.000006f, 0.079651f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000003f, 0.998047f, + 0.000020f, 0.997070f, 0.000045f, 0.995605f, 0.000063f, 0.994141f, 0.000085f, 0.992188f, + 0.000104f, 0.990234f, 0.000119f, 0.988281f, 0.000136f, 0.985840f, 0.000154f, 0.983398f, + 0.000168f, 0.980957f, 0.000179f, 0.978027f, 0.000192f, 0.975098f, 0.000208f, 0.971680f, + 0.000221f, 0.968262f, 0.000231f, 0.964844f, 0.000239f, 0.960938f, 0.000250f, 0.957031f, + 0.000263f, 0.953125f, 0.000273f, 0.948242f, 0.000282f, 0.944336f, 0.000288f, 0.938965f, + 0.000292f, 0.934082f, 0.000296f, 0.928223f, 0.000294f, 0.922852f, 0.000290f, 0.916992f, + 0.000287f, 0.911133f, 0.000285f, 0.904785f, 0.000280f, 0.897461f, 0.000284f, 0.890137f, + 0.000287f, 0.882812f, 0.000288f, 0.875000f, 0.000289f, 0.867188f, 0.000290f, 0.858398f, + 0.000281f, 0.849609f, 0.000287f, 0.839844f, 0.000291f, 0.830566f, 0.000292f, 0.820312f, + 0.000292f, 0.809570f, 0.000291f, 0.797852f, 0.000276f, 0.786133f, 0.000277f, 0.773438f, + 0.000278f, 0.759766f, 0.000278f, 0.746094f, 0.000274f, 0.731445f, 0.000252f, 0.715820f, + 0.000254f, 0.698730f, 0.000252f, 0.681152f, 0.000248f, 0.662109f, 0.000243f, 0.642578f, + 0.000218f, 0.621094f, 0.000218f, 0.597168f, 0.000210f, 0.571289f, 0.000203f, 0.544434f, + 0.000191f, 0.515137f, 0.000172f, 0.480957f, 0.000160f, 0.443115f, 0.000149f, 0.401611f, + 0.000123f, 0.350830f, 0.000106f, 0.288818f, 0.000073f, 0.207642f, 0.000020f, 0.079895f, + 0.000000f, 1.000000f, 0.000185f, 0.999512f, 0.000298f, 0.998535f, 0.000294f, 0.997559f, + 0.000370f, 0.996094f, 0.000383f, 0.994629f, 0.000383f, 0.993164f, 0.000381f, 0.991699f, + 0.000452f, 0.989258f, 0.000458f, 0.987305f, 0.000459f, 0.984863f, 0.000458f, 0.982910f, + 0.000511f, 0.979492f, 0.000525f, 0.976562f, 0.000539f, 0.974121f, 0.000551f, 0.970703f, + 0.000565f, 0.967285f, 0.000621f, 0.963867f, 0.000637f, 0.959961f, 0.000641f, 0.955566f, + 0.000637f, 0.951660f, 0.000631f, 0.947266f, 0.000626f, 0.942871f, 0.000665f, 0.937500f, + 0.000668f, 0.932129f, 0.000652f, 0.926758f, 0.000655f, 0.920898f, 0.000660f, 0.915527f, + 0.000666f, 0.909668f, 0.000706f, 0.902832f, 0.000720f, 0.895996f, 0.000705f, 0.888672f, + 0.000704f, 0.881348f, 0.000700f, 0.874023f, 0.000696f, 0.865723f, 0.000721f, 0.857422f, + 0.000701f, 0.848145f, 0.000705f, 0.838867f, 0.000701f, 0.829102f, 0.000694f, 0.818848f, + 0.000688f, 0.808594f, 0.000710f, 0.796875f, 0.000680f, 0.784668f, 0.000670f, 0.771973f, + 0.000663f, 0.758789f, 0.000656f, 0.745117f, 0.000648f, 0.730469f, 0.000666f, 0.714844f, + 0.000614f, 0.697754f, 0.000600f, 0.680176f, 0.000590f, 0.661133f, 0.000580f, 0.641602f, + 0.000583f, 0.620117f, 0.000522f, 0.596191f, 0.000506f, 0.570801f, 0.000488f, 0.544434f, + 0.000480f, 0.514648f, 0.000417f, 0.480713f, 0.000394f, 0.443115f, 0.000362f, 0.401855f, + 0.000302f, 0.350830f, 0.000257f, 0.289062f, 0.000174f, 0.206909f, 0.000042f, 0.080078f, + 0.000000f, 1.000000f, 0.000337f, 0.999023f, 0.000554f, 0.998047f, 0.000512f, 0.997070f, + 0.000679f, 0.995605f, 0.000685f, 0.994141f, 0.000697f, 0.992188f, 0.000701f, 0.990723f, + 0.000876f, 0.988281f, 0.000892f, 0.986328f, 0.000899f, 0.984375f, 0.000913f, 0.981934f, + 0.001050f, 0.978516f, 0.001065f, 0.976074f, 0.001062f, 0.972656f, 0.001066f, 0.969727f, + 0.001066f, 0.965820f, 0.001171f, 0.962402f, 0.001182f, 0.958008f, 0.001184f, 0.954102f, + 0.001179f, 0.949707f, 0.001186f, 0.945801f, 0.001189f, 0.941406f, 0.001287f, 0.936035f, + 0.001306f, 0.930664f, 0.001294f, 0.925293f, 0.001304f, 0.919434f, 0.001305f, 0.914062f, + 0.001305f, 0.908203f, 0.001375f, 0.900879f, 0.001380f, 0.894043f, 0.001350f, 0.886719f, + 0.001364f, 0.879395f, 0.001354f, 0.872070f, 0.001351f, 0.864258f, 0.001410f, 0.854980f, + 0.001416f, 0.846191f, 0.001375f, 0.836426f, 0.001357f, 0.826660f, 0.001353f, 0.816895f, + 0.001342f, 0.807129f, 0.001385f, 0.795410f, 0.001338f, 0.782715f, 0.001338f, 0.770020f, + 0.001292f, 0.757324f, 0.001280f, 0.743164f, 0.001266f, 0.729492f, 0.001297f, 0.713379f, + 0.001238f, 0.696289f, 0.001184f, 0.678711f, 0.001159f, 0.660156f, 0.001134f, 0.640625f, + 0.001145f, 0.618652f, 0.001055f, 0.595215f, 0.001001f, 0.570312f, 0.000966f, 0.543457f, + 0.000953f, 0.514160f, 0.000840f, 0.479980f, 0.000782f, 0.442383f, 0.000719f, 0.401611f, + 0.000603f, 0.350098f, 0.000506f, 0.289307f, 0.000332f, 0.207275f, 0.000074f, 0.079468f, + 0.000000f, 1.000000f, 0.000518f, 0.999023f, 0.000906f, 0.997559f, 0.000903f, 0.996582f, + 0.001175f, 0.994629f, 0.001205f, 0.993652f, 0.001199f, 0.991699f, 0.001201f, 0.989746f, + 0.001484f, 0.987305f, 0.001515f, 0.984863f, 0.001541f, 0.982422f, 0.001551f, 0.980469f, + 0.001749f, 0.977051f, 0.001771f, 0.974121f, 0.001785f, 0.971191f, 0.001799f, 0.967773f, + 0.001780f, 0.964355f, 0.001976f, 0.959961f, 0.002014f, 0.956543f, 0.002035f, 0.952148f, + 0.002056f, 0.948242f, 0.002037f, 0.943848f, 0.002047f, 0.939453f, 0.002216f, 0.933594f, + 0.002234f, 0.928223f, 0.002243f, 0.922852f, 0.002201f, 0.916992f, 0.002226f, 0.911621f, + 0.002224f, 0.905762f, 0.002361f, 0.898926f, 0.002377f, 0.891602f, 0.002323f, 0.884766f, + 0.002340f, 0.877441f, 0.002316f, 0.869629f, 0.002314f, 0.862305f, 0.002420f, 0.853027f, + 0.002436f, 0.844238f, 0.002373f, 0.834473f, 0.002373f, 0.825195f, 0.002335f, 0.814941f, + 0.002304f, 0.804688f, 0.002392f, 0.793457f, 0.002390f, 0.780762f, 0.002316f, 0.768555f, + 0.002264f, 0.755371f, 0.002218f, 0.742188f, 0.002239f, 0.728027f, 0.002245f, 0.711426f, + 0.002165f, 0.694824f, 0.002094f, 0.677246f, 0.002018f, 0.659180f, 0.001966f, 0.639648f, + 0.001995f, 0.617676f, 0.001859f, 0.594238f, 0.001762f, 0.568848f, 0.001684f, 0.542480f, + 0.001666f, 0.513184f, 0.001490f, 0.478760f, 0.001363f, 0.441895f, 0.001249f, 0.401367f, + 0.001061f, 0.350342f, 0.000866f, 0.289062f, 0.000556f, 0.206787f, 0.000117f, 0.078979f, + 0.000000f, 1.000000f, 0.000760f, 0.999023f, 0.001332f, 0.997070f, 0.001328f, 0.996094f, + 0.001492f, 0.994141f, 0.001834f, 0.992676f, 0.001856f, 0.990723f, 0.001965f, 0.988770f, + 0.002293f, 0.985840f, 0.002340f, 0.983887f, 0.002354f, 0.981445f, 0.002365f, 0.979004f, + 0.002703f, 0.975098f, 0.002726f, 0.972168f, 0.002771f, 0.968750f, 0.002802f, 0.965820f, + 0.002825f, 0.962402f, 0.003088f, 0.958008f, 0.003153f, 0.954102f, 0.003189f, 0.949707f, + 0.003204f, 0.945801f, 0.003216f, 0.941406f, 0.003246f, 0.936523f, 0.003475f, 0.931152f, + 0.003502f, 0.925781f, 0.003517f, 0.920410f, 0.003540f, 0.915039f, 0.003492f, 0.909668f, + 0.003565f, 0.902832f, 0.003706f, 0.895996f, 0.003731f, 0.889160f, 0.003752f, 0.881836f, + 0.003683f, 0.874512f, 0.003696f, 0.867676f, 0.003693f, 0.859375f, 0.003820f, 0.850098f, + 0.003847f, 0.841309f, 0.003754f, 0.832031f, 0.003759f, 0.822266f, 0.003698f, 0.812988f, + 0.003683f, 0.802246f, 0.003784f, 0.790527f, 0.003775f, 0.778320f, 0.003683f, 0.766113f, + 0.003603f, 0.752930f, 0.003542f, 0.739746f, 0.003592f, 0.725586f, 0.003561f, 0.709473f, + 0.003452f, 0.692871f, 0.003357f, 0.675293f, 0.003233f, 0.657227f, 0.003132f, 0.638672f, + 0.003176f, 0.615723f, 0.002989f, 0.592773f, 0.002840f, 0.568359f, 0.002689f, 0.541992f, + 0.002653f, 0.511719f, 0.002439f, 0.478760f, 0.002193f, 0.441895f, 0.001974f, 0.401123f, + 0.001719f, 0.349121f, 0.001345f, 0.288574f, 0.000865f, 0.206299f, 0.000174f, 0.078552f, + 0.000000f, 1.000000f, 0.000584f, 0.999023f, 0.001467f, 0.997070f, 0.001897f, 0.995605f, + 0.002226f, 0.993652f, 0.002655f, 0.991699f, 0.002668f, 0.989746f, 0.002922f, 0.987305f, + 0.003340f, 0.984375f, 0.003370f, 0.981934f, 0.003416f, 0.979980f, 0.003435f, 0.977539f, + 0.003956f, 0.973145f, 0.004028f, 0.970215f, 0.004055f, 0.966797f, 0.004105f, 0.963379f, + 0.004257f, 0.960449f, 0.004597f, 0.955566f, 0.004604f, 0.951172f, 0.004665f, 0.947266f, + 0.004723f, 0.943359f, 0.004742f, 0.938965f, 0.004845f, 0.933594f, 0.005104f, 0.927734f, + 0.005180f, 0.922852f, 0.005192f, 0.916992f, 0.005230f, 0.912109f, 0.005150f, 0.906250f, + 0.005314f, 0.899902f, 0.005489f, 0.892578f, 0.005543f, 0.885742f, 0.005539f, 0.878906f, + 0.005474f, 0.872070f, 0.005474f, 0.864258f, 0.005520f, 0.855957f, 0.005726f, 0.847168f, + 0.005707f, 0.838379f, 0.005699f, 0.829102f, 0.005589f, 0.819336f, 0.005505f, 0.810059f, + 0.005581f, 0.799316f, 0.005684f, 0.787109f, 0.005650f, 0.775879f, 0.005516f, 0.763184f, + 0.005386f, 0.750488f, 0.005295f, 0.737305f, 0.005390f, 0.722656f, 0.005352f, 0.706543f, + 0.005177f, 0.690430f, 0.005039f, 0.673340f, 0.004902f, 0.655762f, 0.004784f, 0.636719f, + 0.004765f, 0.613770f, 0.004570f, 0.590820f, 0.004318f, 0.566895f, 0.004059f, 0.541016f, + 0.003971f, 0.510742f, 0.003651f, 0.477295f, 0.003283f, 0.441162f, 0.002920f, 0.401123f, + 0.002542f, 0.348877f, 0.001953f, 0.289062f, 0.001245f, 0.206177f, 0.000248f, 0.078003f, + 0.000000f, 1.000000f, 0.000916f, 0.998535f, 0.002106f, 0.996582f, 0.002583f, 0.995117f, + 0.003138f, 0.992676f, 0.003239f, 0.990723f, 0.003679f, 0.988281f, 0.003891f, 0.985840f, + 0.004288f, 0.982910f, 0.004719f, 0.979980f, 0.004738f, 0.977539f, 0.004902f, 0.974609f, + 0.005215f, 0.970703f, 0.005634f, 0.967285f, 0.005722f, 0.964355f, 0.005714f, 0.960938f, + 0.006035f, 0.957031f, 0.006458f, 0.952637f, 0.006542f, 0.948242f, 0.006550f, 0.943848f, + 0.006618f, 0.940430f, 0.006676f, 0.936035f, 0.006981f, 0.930176f, 0.007221f, 0.924316f, + 0.007290f, 0.918945f, 0.007370f, 0.914062f, 0.007359f, 0.908691f, 0.007412f, 0.903320f, + 0.007557f, 0.895996f, 0.007835f, 0.889160f, 0.007828f, 0.882324f, 0.007881f, 0.875488f, + 0.007858f, 0.868652f, 0.007793f, 0.861328f, 0.007980f, 0.852539f, 0.008125f, 0.843262f, + 0.008156f, 0.834473f, 0.008118f, 0.825684f, 0.007973f, 0.816406f, 0.007935f, 0.806641f, + 0.007988f, 0.795898f, 0.008095f, 0.784180f, 0.008041f, 0.772461f, 0.007866f, 0.760254f, + 0.007805f, 0.748047f, 0.007648f, 0.734863f, 0.007763f, 0.719727f, 0.007629f, 0.704102f, + 0.007427f, 0.687988f, 0.007202f, 0.670898f, 0.007019f, 0.653809f, 0.006924f, 0.634277f, + 0.006840f, 0.611816f, 0.006519f, 0.588867f, 0.006172f, 0.565430f, 0.005829f, 0.540039f, + 0.005642f, 0.509277f, 0.005196f, 0.476074f, 0.004684f, 0.440674f, 0.004120f, 0.400391f, + 0.003605f, 0.348145f, 0.002705f, 0.289062f, 0.001725f, 0.205566f, 0.000326f, 0.077332f, + 0.000000f, 1.000000f, 0.001302f, 0.998535f, 0.001939f, 0.996582f, 0.002926f, 0.994629f, + 0.003897f, 0.991211f, 0.004383f, 0.988770f, 0.004898f, 0.986816f, 0.005314f, 0.983887f, + 0.005802f, 0.980957f, 0.006329f, 0.978516f, 0.006432f, 0.976074f, 0.006756f, 0.972168f, + 0.007172f, 0.968262f, 0.007656f, 0.964844f, 0.007710f, 0.961426f, 0.007797f, 0.958496f, + 0.008072f, 0.953613f, 0.008446f, 0.949219f, 0.008881f, 0.944824f, 0.009026f, 0.940918f, + 0.008965f, 0.936523f, 0.009109f, 0.932129f, 0.009590f, 0.926270f, 0.009941f, 0.920898f, + 0.009941f, 0.915527f, 0.010002f, 0.910156f, 0.010109f, 0.905273f, 0.010208f, 0.899414f, + 0.010445f, 0.892090f, 0.010719f, 0.884766f, 0.010773f, 0.877930f, 0.010765f, 0.871582f, + 0.010803f, 0.864746f, 0.010658f, 0.857422f, 0.010979f, 0.848145f, 0.011276f, 0.839355f, + 0.011192f, 0.830566f, 0.011116f, 0.821777f, 0.010918f, 0.812500f, 0.010918f, 0.803223f, + 0.011047f, 0.791992f, 0.011230f, 0.780762f, 0.011131f, 0.769043f, 0.010994f, 0.757324f, + 0.010757f, 0.744629f, 0.010490f, 0.732422f, 0.010696f, 0.716309f, 0.010574f, 0.700684f, + 0.010399f, 0.685059f, 0.010048f, 0.668457f, 0.009720f, 0.651855f, 0.009651f, 0.631348f, + 0.009384f, 0.609375f, 0.008987f, 0.587402f, 0.008461f, 0.563965f, 0.007965f, 0.539062f, + 0.007744f, 0.507812f, 0.007160f, 0.474854f, 0.006374f, 0.439697f, 0.005653f, 0.399414f, + 0.004845f, 0.348389f, 0.003616f, 0.288818f, 0.002266f, 0.205444f, 0.000417f, 0.076965f, + 0.000000f, 1.000000f, 0.001271f, 0.998535f, 0.002785f, 0.996094f, 0.003345f, 0.994141f, + 0.004704f, 0.990234f, 0.005741f, 0.987793f, 0.005882f, 0.985840f, 0.007034f, 0.981445f, + 0.007622f, 0.978516f, 0.007812f, 0.976074f, 0.008369f, 0.973145f, 0.009026f, 0.969238f, + 0.009521f, 0.965332f, 0.009666f, 0.961914f, 0.010216f, 0.958496f, 0.010292f, 0.955078f, + 0.010887f, 0.950195f, 0.011253f, 0.945312f, 0.011703f, 0.940918f, 0.011879f, 0.937012f, + 0.012062f, 0.933594f, 0.012314f, 0.927734f, 0.012794f, 0.921875f, 0.013214f, 0.916504f, + 0.013321f, 0.911621f, 0.013275f, 0.905762f, 0.013367f, 0.900879f, 0.013672f, 0.894043f, + 0.014053f, 0.887207f, 0.014336f, 0.880371f, 0.014351f, 0.873535f, 0.014389f, 0.867188f, + 0.014389f, 0.860840f, 0.014565f, 0.852539f, 0.014717f, 0.843262f, 0.015007f, 0.834961f, + 0.014885f, 0.826172f, 0.014946f, 0.817871f, 0.014816f, 0.809082f, 0.014755f, 0.798828f, + 0.014931f, 0.787598f, 0.014984f, 0.775879f, 0.014824f, 0.764648f, 0.014648f, 0.753418f, + 0.014351f, 0.741699f, 0.014252f, 0.728516f, 0.014442f, 0.712891f, 0.014107f, 0.697754f, + 0.013870f, 0.682129f, 0.013451f, 0.666016f, 0.012978f, 0.649414f, 0.012909f, 0.628418f, + 0.012581f, 0.607422f, 0.012024f, 0.585449f, 0.011368f, 0.562500f, 0.010658f, 0.537598f, + 0.010315f, 0.506348f, 0.009468f, 0.473877f, 0.008453f, 0.439209f, 0.007465f, 0.397949f, + 0.006321f, 0.346924f, 0.004692f, 0.289307f, 0.002895f, 0.205200f, 0.000525f, 0.077087f, + 0.000000f, 1.000000f, 0.001298f, 0.998535f, 0.002880f, 0.995605f, 0.003941f, 0.993652f, + 0.005333f, 0.989746f, 0.006458f, 0.986816f, 0.007507f, 0.984375f, 0.008331f, 0.979980f, + 0.009392f, 0.976074f, 0.010002f, 0.973145f, 0.010216f, 0.970703f, 0.011642f, 0.965820f, + 0.012321f, 0.961914f, 0.012520f, 0.958496f, 0.013039f, 0.955078f, 0.013443f, 0.951172f, + 0.014153f, 0.945801f, 0.014717f, 0.941406f, 0.014832f, 0.937012f, 0.015358f, 0.933105f, + 0.015556f, 0.929199f, 0.016205f, 0.922852f, 0.016617f, 0.916992f, 0.016907f, 0.912109f, + 0.017319f, 0.906738f, 0.017288f, 0.901367f, 0.017395f, 0.896484f, 0.018051f, 0.889160f, + 0.018356f, 0.881836f, 0.018784f, 0.875488f, 0.018707f, 0.869141f, 0.018784f, 0.862305f, + 0.018646f, 0.855957f, 0.019257f, 0.847168f, 0.019287f, 0.838379f, 0.019608f, 0.830078f, + 0.019562f, 0.821777f, 0.019424f, 0.812988f, 0.019257f, 0.804688f, 0.019501f, 0.793945f, + 0.019638f, 0.783203f, 0.019638f, 0.771973f, 0.019455f, 0.760742f, 0.019241f, 0.749512f, + 0.018829f, 0.738281f, 0.018860f, 0.724121f, 0.018814f, 0.708984f, 0.018555f, 0.694336f, + 0.018188f, 0.679199f, 0.017502f, 0.663086f, 0.016983f, 0.646484f, 0.016953f, 0.625488f, + 0.016357f, 0.604492f, 0.015564f, 0.583496f, 0.014771f, 0.561035f, 0.013977f, 0.535156f, + 0.013329f, 0.504395f, 0.012230f, 0.472900f, 0.010811f, 0.438477f, 0.009567f, 0.396729f, + 0.008011f, 0.346436f, 0.005909f, 0.289307f, 0.003656f, 0.205444f, 0.000666f, 0.076050f, + 0.000000f, 1.000000f, 0.001846f, 0.998047f, 0.003963f, 0.994629f, 0.005146f, 0.992676f, + 0.007011f, 0.988281f, 0.007751f, 0.985352f, 0.008919f, 0.982422f, 0.010635f, 0.977539f, + 0.011368f, 0.974609f, 0.012535f, 0.970703f, 0.012993f, 0.967285f, 0.014397f, 0.962402f, + 0.015129f, 0.958496f, 0.015839f, 0.954590f, 0.016174f, 0.951660f, 0.017059f, 0.946289f, + 0.018036f, 0.941406f, 0.018646f, 0.937012f, 0.018951f, 0.933105f, 0.019424f, 0.928223f, + 0.020035f, 0.923828f, 0.020828f, 0.917480f, 0.021347f, 0.912109f, 0.021484f, 0.906738f, + 0.022110f, 0.901367f, 0.022217f, 0.896973f, 0.022507f, 0.890137f, 0.023163f, 0.883301f, + 0.023697f, 0.876953f, 0.024002f, 0.870117f, 0.024048f, 0.863770f, 0.024078f, 0.857422f, + 0.024353f, 0.850098f, 0.024689f, 0.841309f, 0.025238f, 0.833496f, 0.025223f, 0.824707f, + 0.025223f, 0.816406f, 0.024948f, 0.808105f, 0.024918f, 0.799805f, 0.025223f, 0.788574f, + 0.025162f, 0.777832f, 0.025391f, 0.767090f, 0.025040f, 0.756348f, 0.024734f, 0.745605f, + 0.024139f, 0.733887f, 0.024445f, 0.718750f, 0.024231f, 0.704590f, 0.023773f, 0.690430f, + 0.023224f, 0.675781f, 0.022522f, 0.660156f, 0.021912f, 0.642578f, 0.021744f, 0.622070f, + 0.021027f, 0.602051f, 0.019913f, 0.581543f, 0.018753f, 0.559082f, 0.017868f, 0.532227f, + 0.016953f, 0.502441f, 0.015442f, 0.471191f, 0.013618f, 0.437256f, 0.012192f, 0.395752f, + 0.010048f, 0.345947f, 0.007343f, 0.289062f, 0.004478f, 0.204834f, 0.000809f, 0.075439f, + 0.000000f, 1.000000f, 0.002016f, 0.998047f, 0.004318f, 0.994629f, 0.005547f, 0.992188f, + 0.008095f, 0.987305f, 0.009377f, 0.983887f, 0.010376f, 0.980469f, 0.012512f, 0.975586f, + 0.014168f, 0.971680f, 0.015022f, 0.968262f, 0.016296f, 0.963379f, 0.017456f, 0.958496f, + 0.018723f, 0.954590f, 0.019531f, 0.950684f, 0.019943f, 0.947754f, 0.021530f, 0.941895f, + 0.022537f, 0.936523f, 0.022919f, 0.932129f, 0.023560f, 0.928223f, 0.024002f, 0.924316f, + 0.025040f, 0.917480f, 0.026154f, 0.912109f, 0.026779f, 0.906738f, 0.027023f, 0.901367f, + 0.027573f, 0.896484f, 0.027817f, 0.891113f, 0.028946f, 0.884277f, 0.029190f, 0.876953f, + 0.029846f, 0.870605f, 0.030014f, 0.864746f, 0.030365f, 0.858398f, 0.030334f, 0.852051f, + 0.031067f, 0.843262f, 0.031464f, 0.834961f, 0.031677f, 0.827148f, 0.031830f, 0.819336f, + 0.031860f, 0.811523f, 0.031647f, 0.803223f, 0.031982f, 0.793457f, 0.032227f, 0.783203f, + 0.032043f, 0.771973f, 0.032104f, 0.762207f, 0.031616f, 0.751465f, 0.031311f, 0.741211f, + 0.031281f, 0.728516f, 0.031097f, 0.714355f, 0.030777f, 0.700195f, 0.030090f, 0.686523f, + 0.029510f, 0.672363f, 0.028305f, 0.657227f, 0.028168f, 0.638672f, 0.027420f, 0.618652f, + 0.026443f, 0.599121f, 0.025192f, 0.579102f, 0.023529f, 0.557129f, 0.022720f, 0.529785f, + 0.021179f, 0.500000f, 0.019348f, 0.470215f, 0.017075f, 0.436768f, 0.015137f, 0.393799f, + 0.012459f, 0.345215f, 0.008987f, 0.289062f, 0.005451f, 0.205078f, 0.000969f, 0.074890f, + 0.000000f, 1.000000f, 0.002222f, 0.998047f, 0.004772f, 0.994141f, 0.006283f, 0.991211f, + 0.008919f, 0.986328f, 0.011200f, 0.982422f, 0.013168f, 0.977539f, 0.014603f, 0.973633f, + 0.016479f, 0.969238f, 0.017822f, 0.965332f, 0.020096f, 0.959473f, 0.021118f, 0.954590f, + 0.022385f, 0.950684f, 0.023361f, 0.946777f, 0.024658f, 0.941895f, 0.025955f, 0.936523f, + 0.027344f, 0.931641f, 0.028122f, 0.927246f, 0.028870f, 0.922852f, 0.029419f, 0.917969f, + 0.031189f, 0.911621f, 0.032013f, 0.906250f, 0.032623f, 0.900391f, 0.033417f, 0.895508f, + 0.033508f, 0.890625f, 0.034821f, 0.884277f, 0.035767f, 0.877441f, 0.036621f, 0.871094f, + 0.036682f, 0.864258f, 0.037292f, 0.858887f, 0.037537f, 0.852539f, 0.038025f, 0.845215f, + 0.038727f, 0.836426f, 0.039093f, 0.828613f, 0.039276f, 0.821289f, 0.039673f, 0.813477f, + 0.039276f, 0.805664f, 0.039612f, 0.797852f, 0.039886f, 0.786621f, 0.040039f, 0.776367f, + 0.039948f, 0.767090f, 0.039886f, 0.756836f, 0.039551f, 0.747070f, 0.038940f, 0.736816f, + 0.039001f, 0.722656f, 0.038727f, 0.708984f, 0.038300f, 0.695312f, 0.037445f, 0.682129f, + 0.036530f, 0.668457f, 0.035614f, 0.653809f, 0.034912f, 0.634277f, 0.034241f, 0.615234f, + 0.032776f, 0.596191f, 0.031311f, 0.576660f, 0.029327f, 0.555176f, 0.028137f, 0.526855f, + 0.026276f, 0.498779f, 0.023758f, 0.468994f, 0.020996f, 0.437012f, 0.018600f, 0.392334f, + 0.015228f, 0.345215f, 0.010918f, 0.289307f, 0.006634f, 0.204834f, 0.001159f, 0.074524f, + 0.000000f, 1.000000f, 0.002541f, 0.997559f, 0.005898f, 0.993652f, 0.008385f, 0.989258f, + 0.010857f, 0.984863f, 0.012863f, 0.981445f, 0.015221f, 0.975586f, 0.017654f, 0.970703f, + 0.018692f, 0.966797f, 0.020630f, 0.962402f, 0.023270f, 0.956055f, 0.025604f, 0.950684f, + 0.026642f, 0.946289f, 0.027634f, 0.942871f, 0.030014f, 0.936523f, 0.031433f, 0.930664f, + 0.032532f, 0.926270f, 0.033997f, 0.921387f, 0.034821f, 0.917969f, 0.036072f, 0.911133f, + 0.037476f, 0.905273f, 0.038757f, 0.899414f, 0.039642f, 0.894531f, 0.040314f, 0.889160f, + 0.040955f, 0.884277f, 0.042450f, 0.876953f, 0.043488f, 0.870117f, 0.044250f, 0.863770f, + 0.045105f, 0.858398f, 0.044952f, 0.852051f, 0.045837f, 0.846191f, 0.046600f, 0.837402f, + 0.047058f, 0.829102f, 0.047760f, 0.822266f, 0.048065f, 0.814453f, 0.048187f, 0.807129f, + 0.048004f, 0.800293f, 0.048401f, 0.789551f, 0.048950f, 0.780273f, 0.049316f, 0.770508f, + 0.049103f, 0.761230f, 0.048615f, 0.751465f, 0.047943f, 0.741699f, 0.047791f, 0.729492f, + 0.047577f, 0.716309f, 0.047333f, 0.703613f, 0.046906f, 0.690918f, 0.045654f, 0.678223f, + 0.044434f, 0.664551f, 0.043915f, 0.647949f, 0.042816f, 0.629883f, 0.041626f, 0.611328f, + 0.039948f, 0.593262f, 0.037872f, 0.574219f, 0.035919f, 0.551270f, 0.034271f, 0.523926f, + 0.031830f, 0.496094f, 0.028732f, 0.467529f, 0.025284f, 0.436035f, 0.022461f, 0.390869f, + 0.018234f, 0.343994f, 0.013084f, 0.290039f, 0.007851f, 0.203613f, 0.001363f, 0.073547f, + 0.000000f, 1.000000f, 0.003119f, 0.997070f, 0.006718f, 0.993164f, 0.009628f, 0.988281f, + 0.012733f, 0.983398f, 0.014343f, 0.979980f, 0.017624f, 0.973633f, 0.020187f, 0.968262f, + 0.022675f, 0.963867f, 0.024384f, 0.958008f, 0.027664f, 0.951660f, 0.029388f, 0.947266f, + 0.031342f, 0.942383f, 0.032898f, 0.937012f, 0.035187f, 0.930664f, 0.037292f, 0.925293f, + 0.038818f, 0.920410f, 0.039948f, 0.916016f, 0.041504f, 0.910645f, 0.043610f, 0.903809f, + 0.044739f, 0.897949f, 0.045929f, 0.893066f, 0.047241f, 0.887695f, 0.048340f, 0.883301f, + 0.049377f, 0.875488f, 0.050659f, 0.869141f, 0.052094f, 0.862793f, 0.052856f, 0.856445f, + 0.053619f, 0.851074f, 0.053925f, 0.845703f, 0.054901f, 0.836914f, 0.056519f, 0.829590f, + 0.056824f, 0.821777f, 0.057007f, 0.814453f, 0.057678f, 0.808105f, 0.057404f, 0.800781f, + 0.058014f, 0.791504f, 0.058533f, 0.782227f, 0.058807f, 0.772949f, 0.058990f, 0.763672f, + 0.058624f, 0.754883f, 0.057983f, 0.745605f, 0.057739f, 0.735840f, 0.057831f, 0.722656f, + 0.057770f, 0.710449f, 0.057159f, 0.698730f, 0.056122f, 0.686035f, 0.054626f, 0.673828f, + 0.053436f, 0.660645f, 0.052734f, 0.642578f, 0.051666f, 0.625000f, 0.049957f, 0.607910f, + 0.047760f, 0.589844f, 0.045410f, 0.571777f, 0.043457f, 0.547363f, 0.040985f, 0.520996f, + 0.038025f, 0.494385f, 0.034271f, 0.466309f, 0.030258f, 0.433594f, 0.026794f, 0.389648f, + 0.021698f, 0.343750f, 0.015495f, 0.290771f, 0.009254f, 0.203125f, 0.001593f, 0.072693f, + 0.000000f, 1.000000f, 0.003414f, 0.996582f, 0.007236f, 0.992676f, 0.011124f, 0.986816f, + 0.014381f, 0.982422f, 0.016602f, 0.978027f, 0.020721f, 0.970703f, 0.023529f, 0.965332f, + 0.025726f, 0.960938f, 0.029190f, 0.953613f, 0.031433f, 0.948242f, 0.034515f, 0.942871f, + 0.036224f, 0.937988f, 0.039001f, 0.931152f, 0.041901f, 0.924316f, 0.043274f, 0.919434f, + 0.045441f, 0.914551f, 0.046600f, 0.910156f, 0.049103f, 0.902832f, 0.051208f, 0.896484f, + 0.053223f, 0.891113f, 0.054291f, 0.886230f, 0.055664f, 0.880859f, 0.057007f, 0.874023f, + 0.059204f, 0.867188f, 0.059906f, 0.860840f, 0.061798f, 0.854980f, 0.062378f, 0.849121f, + 0.062744f, 0.844238f, 0.064148f, 0.836426f, 0.065430f, 0.828613f, 0.066528f, 0.820801f, + 0.067505f, 0.814453f, 0.067444f, 0.807617f, 0.067749f, 0.800781f, 0.068176f, 0.793457f, + 0.069336f, 0.783691f, 0.069641f, 0.774414f, 0.069702f, 0.765625f, 0.069397f, 0.757324f, + 0.068970f, 0.748535f, 0.068665f, 0.740234f, 0.068909f, 0.727539f, 0.068787f, 0.715820f, + 0.068176f, 0.704102f, 0.067139f, 0.692871f, 0.065979f, 0.681152f, 0.064636f, 0.669434f, + 0.063660f, 0.653809f, 0.062683f, 0.637207f, 0.060883f, 0.620605f, 0.058838f, 0.604004f, + 0.056274f, 0.586914f, 0.053406f, 0.568848f, 0.051361f, 0.542969f, 0.048340f, 0.517578f, + 0.044708f, 0.492676f, 0.040283f, 0.465576f, 0.035980f, 0.430664f, 0.031464f, 0.388184f, + 0.025360f, 0.343262f, 0.017883f, 0.291260f, 0.010696f, 0.202881f, 0.001856f, 0.072144f, + 0.000000f, 1.000000f, 0.004360f, 0.996094f, 0.008430f, 0.992188f, 0.012947f, 0.985840f, + 0.016388f, 0.980957f, 0.019348f, 0.975098f, 0.024017f, 0.968262f, 0.026917f, 0.962891f, + 0.030121f, 0.957520f, 0.033203f, 0.949707f, 0.037048f, 0.943359f, 0.038940f, 0.938477f, + 0.041809f, 0.932617f, 0.045410f, 0.924805f, 0.048187f, 0.918945f, 0.050842f, 0.913086f, + 0.052185f, 0.908691f, 0.055511f, 0.901367f, 0.057404f, 0.894531f, 0.059570f, 0.889160f, + 0.061798f, 0.883301f, 0.063049f, 0.878906f, 0.064697f, 0.872559f, 0.067261f, 0.864746f, + 0.069092f, 0.858398f, 0.070435f, 0.853027f, 0.071594f, 0.847168f, 0.072632f, 0.841797f, + 0.073975f, 0.834961f, 0.075623f, 0.826660f, 0.077026f, 0.819824f, 0.078003f, 0.812988f, + 0.078308f, 0.806152f, 0.079163f, 0.800293f, 0.079041f, 0.792480f, 0.080139f, 0.783691f, + 0.081482f, 0.774902f, 0.081421f, 0.766602f, 0.081299f, 0.757812f, 0.080811f, 0.750488f, + 0.080811f, 0.742676f, 0.080994f, 0.731445f, 0.080811f, 0.719727f, 0.080688f, 0.708984f, + 0.079712f, 0.698242f, 0.078308f, 0.687012f, 0.076965f, 0.676758f, 0.075623f, 0.663086f, + 0.074646f, 0.646973f, 0.072754f, 0.631836f, 0.070862f, 0.616211f, 0.068481f, 0.600586f, + 0.065247f, 0.584473f, 0.062561f, 0.562500f, 0.059814f, 0.539551f, 0.056091f, 0.515625f, + 0.051666f, 0.490479f, 0.046753f, 0.464355f, 0.041748f, 0.427490f, 0.036346f, 0.386719f, + 0.029175f, 0.343262f, 0.021042f, 0.288818f, 0.012299f, 0.203003f, 0.002108f, 0.070984f, + 0.000000f, 1.000000f, 0.004745f, 0.996094f, 0.009407f, 0.991699f, 0.014153f, 0.984863f, + 0.018326f, 0.979492f, 0.022720f, 0.972168f, 0.027298f, 0.965820f, 0.030807f, 0.959961f, + 0.034576f, 0.952637f, 0.038940f, 0.945801f, 0.041931f, 0.939453f, 0.044830f, 0.934570f, + 0.048767f, 0.925781f, 0.052521f, 0.918945f, 0.055420f, 0.912598f, 0.057861f, 0.907227f, + 0.061035f, 0.900391f, 0.063660f, 0.893066f, 0.066895f, 0.886719f, 0.069153f, 0.880859f, + 0.070557f, 0.875977f, 0.073242f, 0.870117f, 0.075867f, 0.862793f, 0.078064f, 0.855957f, + 0.079712f, 0.849609f, 0.081238f, 0.844238f, 0.082458f, 0.839355f, 0.084229f, 0.832520f, + 0.086426f, 0.824219f, 0.087891f, 0.817383f, 0.088806f, 0.810547f, 0.089722f, 0.804688f, + 0.090271f, 0.798340f, 0.091003f, 0.791504f, 0.093018f, 0.782715f, 0.092896f, 0.773926f, + 0.093750f, 0.766602f, 0.094116f, 0.758789f, 0.094238f, 0.751465f, 0.093262f, 0.743652f, + 0.093445f, 0.733398f, 0.093872f, 0.722656f, 0.093567f, 0.712402f, 0.092651f, 0.702148f, + 0.091553f, 0.692383f, 0.090027f, 0.681641f, 0.088440f, 0.670898f, 0.087402f, 0.655273f, + 0.086304f, 0.641113f, 0.084229f, 0.626465f, 0.081421f, 0.612305f, 0.078552f, 0.596680f, + 0.075012f, 0.580566f, 0.072510f, 0.558105f, 0.068970f, 0.535645f, 0.064514f, 0.512695f, + 0.059235f, 0.489014f, 0.053314f, 0.463867f, 0.048309f, 0.424561f, 0.041534f, 0.385254f, + 0.033173f, 0.343018f, 0.024246f, 0.286133f, 0.014030f, 0.202759f, 0.002388f, 0.070007f, + 0.000000f, 1.000000f, 0.005783f, 0.995605f, 0.010551f, 0.990723f, 0.016327f, 0.983398f, + 0.021011f, 0.978027f, 0.026352f, 0.969727f, 0.031097f, 0.962891f, 0.034790f, 0.957520f, + 0.040161f, 0.948242f, 0.044769f, 0.940918f, 0.047974f, 0.935547f, 0.052094f, 0.927246f, + 0.056610f, 0.919434f, 0.060028f, 0.912598f, 0.063110f, 0.906738f, 0.066467f, 0.900391f, + 0.070557f, 0.891602f, 0.073975f, 0.884766f, 0.076782f, 0.878906f, 0.079102f, 0.873047f, + 0.081482f, 0.866699f, 0.084717f, 0.859375f, 0.087708f, 0.852539f, 0.089233f, 0.846680f, + 0.091370f, 0.841309f, 0.092957f, 0.835938f, 0.094849f, 0.828613f, 0.097229f, 0.821289f, + 0.099365f, 0.813965f, 0.100464f, 0.808105f, 0.101807f, 0.801758f, 0.102173f, 0.795898f, + 0.103821f, 0.789062f, 0.105042f, 0.780273f, 0.106018f, 0.772461f, 0.106995f, 0.765625f, + 0.106750f, 0.757812f, 0.107361f, 0.750488f, 0.106995f, 0.744141f, 0.107239f, 0.733887f, + 0.107605f, 0.723633f, 0.107544f, 0.714355f, 0.106873f, 0.704590f, 0.105347f, 0.695312f, + 0.103943f, 0.686035f, 0.102478f, 0.675781f, 0.102295f, 0.662598f, 0.100342f, 0.647949f, + 0.098328f, 0.635742f, 0.095703f, 0.621582f, 0.092529f, 0.607910f, 0.089111f, 0.593750f, + 0.086121f, 0.573730f, 0.082764f, 0.553223f, 0.078003f, 0.531738f, 0.073059f, 0.510742f, + 0.067383f, 0.488525f, 0.061157f, 0.458496f, 0.054871f, 0.421875f, 0.047150f, 0.384766f, + 0.037567f, 0.343750f, 0.027527f, 0.283203f, 0.015640f, 0.202515f, 0.002684f, 0.069092f, + 0.000000f, 1.000000f, 0.006943f, 0.995117f, 0.011772f, 0.989746f, 0.018341f, 0.982422f, + 0.023682f, 0.975098f, 0.030090f, 0.967285f, 0.034973f, 0.960449f, 0.040741f, 0.951660f, + 0.045776f, 0.943848f, 0.050415f, 0.937012f, 0.055145f, 0.929199f, 0.059967f, 0.920898f, + 0.064270f, 0.913574f, 0.068359f, 0.906738f, 0.071777f, 0.899902f, 0.076660f, 0.891113f, + 0.079834f, 0.883789f, 0.084229f, 0.876953f, 0.087097f, 0.870605f, 0.090149f, 0.863770f, + 0.093933f, 0.855957f, 0.096619f, 0.849121f, 0.099792f, 0.843262f, 0.101624f, 0.837402f, + 0.103638f, 0.832520f, 0.106689f, 0.824219f, 0.109009f, 0.816406f, 0.110779f, 0.810059f, + 0.112732f, 0.804199f, 0.114075f, 0.798340f, 0.115295f, 0.792969f, 0.116638f, 0.785156f, + 0.118103f, 0.777344f, 0.120239f, 0.769531f, 0.120483f, 0.762695f, 0.121033f, 0.755859f, + 0.120789f, 0.750000f, 0.121094f, 0.743164f, 0.121887f, 0.732910f, 0.121826f, 0.723633f, + 0.121704f, 0.714355f, 0.120911f, 0.706055f, 0.120544f, 0.697754f, 0.118774f, 0.688965f, + 0.117371f, 0.679199f, 0.116821f, 0.666992f, 0.115173f, 0.654297f, 0.113037f, 0.641602f, + 0.110596f, 0.629395f, 0.107971f, 0.617188f, 0.104004f, 0.604492f, 0.100769f, 0.586426f, + 0.097229f, 0.567383f, 0.093262f, 0.548828f, 0.087952f, 0.529297f, 0.082031f, 0.508789f, + 0.075012f, 0.486572f, 0.069092f, 0.453857f, 0.061462f, 0.419922f, 0.053040f, 0.384766f, + 0.042084f, 0.344482f, 0.031250f, 0.281006f, 0.017685f, 0.203247f, 0.002993f, 0.068542f, + 0.000000f, 1.000000f, 0.007553f, 0.994629f, 0.013931f, 0.988281f, 0.020828f, 0.980957f, + 0.028076f, 0.972656f, 0.033905f, 0.964844f, 0.039520f, 0.957520f, 0.046295f, 0.947266f, + 0.051849f, 0.939453f, 0.056702f, 0.932617f, 0.063232f, 0.922363f, 0.068420f, 0.914551f, + 0.072693f, 0.907227f, 0.077637f, 0.899414f, 0.082764f, 0.890625f, 0.087341f, 0.882812f, + 0.091309f, 0.875488f, 0.094238f, 0.869141f, 0.099609f, 0.860840f, 0.102783f, 0.853027f, + 0.106628f, 0.845703f, 0.109863f, 0.838867f, 0.112000f, 0.833984f, 0.114929f, 0.827637f, + 0.118225f, 0.818848f, 0.121094f, 0.812012f, 0.123657f, 0.805664f, 0.125610f, 0.799805f, + 0.126465f, 0.794922f, 0.128418f, 0.788574f, 0.130615f, 0.780762f, 0.132568f, 0.772949f, + 0.133667f, 0.766113f, 0.134766f, 0.759277f, 0.135254f, 0.753418f, 0.135254f, 0.747559f, + 0.136230f, 0.739746f, 0.136963f, 0.730469f, 0.137939f, 0.722168f, 0.137207f, 0.713867f, + 0.136475f, 0.706055f, 0.135498f, 0.698242f, 0.134521f, 0.690918f, 0.133179f, 0.680664f, + 0.132324f, 0.668945f, 0.131104f, 0.657715f, 0.128784f, 0.646484f, 0.126709f, 0.635742f, + 0.123413f, 0.624023f, 0.119751f, 0.612793f, 0.116821f, 0.597168f, 0.113403f, 0.579590f, + 0.109070f, 0.562988f, 0.103882f, 0.544922f, 0.098328f, 0.526367f, 0.091003f, 0.506348f, + 0.084290f, 0.480469f, 0.077454f, 0.450439f, 0.069031f, 0.418945f, 0.058624f, 0.383789f, + 0.046387f, 0.343994f, 0.034790f, 0.279297f, 0.019684f, 0.203613f, 0.003374f, 0.068787f, + 0.000000f, 1.000000f, 0.008575f, 0.994141f, 0.016556f, 0.986816f, 0.023254f, 0.979980f, + 0.031891f, 0.969238f, 0.038269f, 0.962402f, 0.045532f, 0.952148f, 0.052307f, 0.943359f, + 0.058289f, 0.935547f, 0.065796f, 0.924805f, 0.072205f, 0.916016f, 0.076782f, 0.908691f, + 0.081970f, 0.900391f, 0.088379f, 0.890137f, 0.093567f, 0.881836f, 0.097717f, 0.875000f, + 0.102112f, 0.868164f, 0.107178f, 0.858398f, 0.111755f, 0.850098f, 0.116394f, 0.842773f, + 0.120056f, 0.835938f, 0.122803f, 0.830078f, 0.126709f, 0.821289f, 0.129883f, 0.813965f, + 0.133301f, 0.807129f, 0.136353f, 0.800781f, 0.137573f, 0.795898f, 0.140137f, 0.790039f, + 0.142334f, 0.782227f, 0.145020f, 0.774902f, 0.147095f, 0.767578f, 0.148682f, 0.761719f, + 0.149536f, 0.755371f, 0.149902f, 0.750488f, 0.150391f, 0.744141f, 0.152344f, 0.734863f, + 0.152832f, 0.727051f, 0.153687f, 0.719727f, 0.153076f, 0.711914f, 0.153076f, 0.705566f, + 0.152100f, 0.698242f, 0.150269f, 0.690918f, 0.150269f, 0.680176f, 0.149414f, 0.669922f, + 0.148071f, 0.660156f, 0.145874f, 0.649902f, 0.143188f, 0.639648f, 0.140259f, 0.629883f, + 0.136353f, 0.619141f, 0.133423f, 0.604980f, 0.130371f, 0.590332f, 0.126343f, 0.574219f, + 0.121277f, 0.558105f, 0.114929f, 0.541504f, 0.108276f, 0.523926f, 0.101257f, 0.503906f, + 0.094116f, 0.475586f, 0.085876f, 0.447998f, 0.075989f, 0.417725f, 0.064819f, 0.383789f, + 0.051666f, 0.341553f, 0.038544f, 0.277588f, 0.021500f, 0.203857f, 0.003771f, 0.068604f, + 0.000000f, 1.000000f, 0.009750f, 0.994141f, 0.018921f, 0.985352f, 0.026566f, 0.977051f, + 0.036346f, 0.967285f, 0.043640f, 0.958008f, 0.052460f, 0.947266f, 0.058868f, 0.939453f, + 0.067261f, 0.928223f, 0.074036f, 0.918457f, 0.080383f, 0.910645f, 0.086243f, 0.901367f, + 0.093628f, 0.891113f, 0.099304f, 0.881836f, 0.105225f, 0.874023f, 0.110413f, 0.865723f, + 0.115784f, 0.855957f, 0.121155f, 0.847656f, 0.125610f, 0.840332f, 0.129272f, 0.833496f, + 0.133667f, 0.825684f, 0.138550f, 0.816406f, 0.142700f, 0.808594f, 0.146118f, 0.801758f, + 0.148438f, 0.796387f, 0.151001f, 0.790527f, 0.154297f, 0.782715f, 0.156860f, 0.775391f, + 0.160156f, 0.768555f, 0.161621f, 0.762695f, 0.163086f, 0.756348f, 0.164429f, 0.750977f, + 0.165283f, 0.746094f, 0.166992f, 0.737305f, 0.168823f, 0.729980f, 0.169434f, 0.722656f, + 0.170166f, 0.715820f, 0.169800f, 0.709473f, 0.169312f, 0.703125f, 0.168091f, 0.696777f, + 0.168335f, 0.687988f, 0.167603f, 0.678711f, 0.167236f, 0.669434f, 0.165405f, 0.660645f, + 0.162842f, 0.651855f, 0.160034f, 0.643066f, 0.157349f, 0.634766f, 0.154419f, 0.624512f, + 0.151611f, 0.609863f, 0.147705f, 0.596191f, 0.143555f, 0.582520f, 0.138672f, 0.568359f, + 0.132812f, 0.553711f, 0.125977f, 0.538574f, 0.118958f, 0.521484f, 0.112061f, 0.497070f, + 0.104309f, 0.472412f, 0.094727f, 0.446045f, 0.083557f, 0.416748f, 0.070740f, 0.383301f, + 0.057739f, 0.336914f, 0.042694f, 0.277588f, 0.023712f, 0.205078f, 0.004120f, 0.067993f, + 0.000000f, 1.000000f, 0.010826f, 0.993652f, 0.021271f, 0.984375f, 0.031647f, 0.973633f, + 0.040100f, 0.965332f, 0.050293f, 0.953125f, 0.058868f, 0.943848f, 0.067932f, 0.932617f, + 0.075684f, 0.922363f, 0.083252f, 0.913086f, 0.091064f, 0.901855f, 0.099304f, 0.891602f, + 0.105530f, 0.882812f, 0.110718f, 0.875000f, 0.118652f, 0.863770f, 0.125244f, 0.854004f, + 0.130005f, 0.846191f, 0.135132f, 0.838379f, 0.140015f, 0.829590f, 0.145264f, 0.820312f, + 0.150391f, 0.812012f, 0.154541f, 0.804688f, 0.157837f, 0.798340f, 0.161255f, 0.791992f, + 0.165771f, 0.782715f, 0.168823f, 0.775391f, 0.172363f, 0.768066f, 0.174683f, 0.762207f, + 0.175903f, 0.757324f, 0.178711f, 0.751465f, 0.180420f, 0.745117f, 0.182495f, 0.737305f, + 0.184326f, 0.729980f, 0.185547f, 0.724121f, 0.186401f, 0.717773f, 0.186890f, 0.711914f, + 0.186768f, 0.706055f, 0.185913f, 0.700684f, 0.186401f, 0.691895f, 0.186279f, 0.683105f, + 0.186035f, 0.675781f, 0.184814f, 0.667969f, 0.182739f, 0.660645f, 0.180786f, 0.652832f, + 0.178101f, 0.645020f, 0.175293f, 0.636719f, 0.173462f, 0.625000f, 0.170166f, 0.612793f, + 0.166382f, 0.601074f, 0.162476f, 0.589355f, 0.156860f, 0.577148f, 0.151245f, 0.564453f, + 0.144653f, 0.550781f, 0.138184f, 0.534668f, 0.131104f, 0.514160f, 0.123291f, 0.492676f, + 0.113892f, 0.468994f, 0.102905f, 0.443604f, 0.091064f, 0.415771f, 0.077271f, 0.382812f, + 0.063293f, 0.333496f, 0.046753f, 0.277100f, 0.025787f, 0.206421f, 0.004452f, 0.067383f, + 0.000000f, 1.000000f, 0.011368f, 0.993652f, 0.023193f, 0.983887f, 0.035919f, 0.972168f, + 0.046143f, 0.960938f, 0.056976f, 0.949707f, 0.067261f, 0.937988f, 0.076233f, 0.927246f, + 0.084839f, 0.916992f, 0.095093f, 0.904297f, 0.103088f, 0.894043f, 0.110657f, 0.884766f, + 0.118469f, 0.873047f, 0.125732f, 0.862793f, 0.132935f, 0.853027f, 0.138794f, 0.845215f, + 0.145142f, 0.834961f, 0.150879f, 0.825684f, 0.157104f, 0.816406f, 0.162476f, 0.808105f, + 0.166138f, 0.801758f, 0.171021f, 0.792969f, 0.175293f, 0.784180f, 0.180542f, 0.775879f, + 0.183838f, 0.769043f, 0.186523f, 0.762695f, 0.189087f, 0.756836f, 0.192261f, 0.750488f, + 0.194702f, 0.742676f, 0.197998f, 0.735840f, 0.199829f, 0.729492f, 0.201050f, 0.723633f, + 0.202393f, 0.717773f, 0.203613f, 0.712402f, 0.203613f, 0.707520f, 0.204468f, 0.700195f, + 0.205811f, 0.692871f, 0.205322f, 0.686035f, 0.204834f, 0.679199f, 0.204712f, 0.672363f, + 0.202515f, 0.665527f, 0.201538f, 0.659180f, 0.198608f, 0.652344f, 0.197144f, 0.643555f, + 0.195679f, 0.634277f, 0.192993f, 0.624512f, 0.189453f, 0.614746f, 0.185669f, 0.604492f, + 0.181152f, 0.594727f, 0.176636f, 0.584473f, 0.170532f, 0.573242f, 0.164185f, 0.561523f, + 0.158203f, 0.543945f, 0.151245f, 0.526367f, 0.142700f, 0.507324f, 0.133911f, 0.487793f, + 0.123474f, 0.466064f, 0.111938f, 0.442139f, 0.098450f, 0.415283f, 0.084839f, 0.376221f, + 0.069519f, 0.331543f, 0.050629f, 0.277100f, 0.027802f, 0.207153f, 0.004837f, 0.067444f, + 0.000000f, 1.000000f, 0.013916f, 0.991699f, 0.027954f, 0.980469f, 0.040405f, 0.969238f, + 0.052277f, 0.957520f, 0.065369f, 0.943848f, 0.075928f, 0.932617f, 0.086914f, 0.919922f, + 0.096985f, 0.908203f, 0.106384f, 0.897461f, 0.116028f, 0.885254f, 0.124451f, 0.873535f, + 0.132935f, 0.863281f, 0.140259f, 0.853516f, 0.148193f, 0.842285f, 0.155884f, 0.832031f, + 0.162476f, 0.822754f, 0.166626f, 0.814941f, 0.173828f, 0.804688f, 0.180176f, 0.795410f, + 0.185669f, 0.786133f, 0.189453f, 0.778809f, 0.194336f, 0.770996f, 0.197144f, 0.764648f, + 0.201538f, 0.755859f, 0.206787f, 0.748047f, 0.209473f, 0.740723f, 0.212524f, 0.733887f, + 0.214844f, 0.728027f, 0.216309f, 0.722656f, 0.218262f, 0.717285f, 0.219971f, 0.710938f, + 0.221069f, 0.704102f, 0.223511f, 0.697266f, 0.223999f, 0.691406f, 0.224121f, 0.685547f, + 0.224121f, 0.679688f, 0.223877f, 0.674316f, 0.222412f, 0.668457f, 0.221191f, 0.663086f, + 0.220825f, 0.655273f, 0.219727f, 0.646973f, 0.217407f, 0.640137f, 0.215820f, 0.632324f, + 0.212769f, 0.624512f, 0.209473f, 0.616211f, 0.205200f, 0.607910f, 0.201294f, 0.599121f, + 0.195679f, 0.589844f, 0.190186f, 0.578125f, 0.185669f, 0.564941f, 0.179443f, 0.550781f, + 0.172119f, 0.536133f, 0.163696f, 0.520508f, 0.155396f, 0.503418f, 0.144409f, 0.484619f, + 0.133179f, 0.464355f, 0.120605f, 0.442139f, 0.107605f, 0.409424f, 0.092712f, 0.372803f, + 0.075195f, 0.330322f, 0.054901f, 0.278076f, 0.029694f, 0.208252f, 0.005230f, 0.067566f, + 0.000000f, 1.000000f, 0.016098f, 0.991699f, 0.031250f, 0.979492f, 0.046326f, 0.966797f, + 0.060455f, 0.952637f, 0.073181f, 0.939453f, 0.086975f, 0.925293f, 0.096802f, 0.914551f, + 0.109863f, 0.899414f, 0.120483f, 0.887695f, 0.129639f, 0.875977f, 0.139648f, 0.863281f, + 0.148682f, 0.851562f, 0.157471f, 0.841309f, 0.164429f, 0.831055f, 0.171875f, 0.820312f, + 0.179565f, 0.810059f, 0.186646f, 0.800781f, 0.192627f, 0.791504f, 0.197876f, 0.782715f, + 0.203613f, 0.772949f, 0.209839f, 0.763672f, 0.213379f, 0.755859f, 0.218750f, 0.748047f, + 0.221802f, 0.741211f, 0.224976f, 0.734863f, 0.229248f, 0.727051f, 0.231812f, 0.719727f, + 0.234985f, 0.712891f, 0.237549f, 0.706055f, 0.238770f, 0.700684f, 0.240723f, 0.694824f, + 0.242310f, 0.689941f, 0.242310f, 0.685547f, 0.242310f, 0.680176f, 0.243408f, 0.673828f, + 0.242920f, 0.667969f, 0.242676f, 0.661133f, 0.242188f, 0.654785f, 0.241577f, 0.648438f, + 0.239868f, 0.642090f, 0.237793f, 0.635742f, 0.235352f, 0.629395f, 0.232300f, 0.622559f, + 0.229004f, 0.615723f, 0.225586f, 0.607910f, 0.221680f, 0.598145f, 0.217407f, 0.588867f, + 0.212280f, 0.578125f, 0.206787f, 0.567383f, 0.201050f, 0.556152f, 0.193604f, 0.544434f, + 0.185669f, 0.530762f, 0.176270f, 0.516113f, 0.166992f, 0.500977f, 0.155273f, 0.483398f, + 0.144165f, 0.460449f, 0.131104f, 0.434814f, 0.116577f, 0.405273f, 0.099976f, 0.371094f, + 0.080994f, 0.330566f, 0.058533f, 0.279053f, 0.031921f, 0.210205f, 0.005592f, 0.067871f, + 0.000000f, 1.000000f, 0.018982f, 0.990234f, 0.036041f, 0.977539f, 0.053192f, 0.962891f, + 0.069458f, 0.947754f, 0.084351f, 0.932129f, 0.097961f, 0.918945f, 0.111328f, 0.904297f, + 0.123291f, 0.890625f, 0.135498f, 0.877930f, 0.146240f, 0.864258f, 0.156860f, 0.851562f, + 0.166138f, 0.840332f, 0.174927f, 0.829102f, 0.183105f, 0.817383f, 0.191650f, 0.806641f, + 0.199341f, 0.795898f, 0.206055f, 0.787109f, 0.212524f, 0.777344f, 0.218750f, 0.768066f, + 0.224609f, 0.758789f, 0.229980f, 0.749512f, 0.235107f, 0.741211f, 0.238892f, 0.733398f, + 0.243286f, 0.725098f, 0.246582f, 0.718750f, 0.249023f, 0.712402f, 0.252930f, 0.704590f, + 0.255615f, 0.697266f, 0.258545f, 0.690918f, 0.260010f, 0.684570f, 0.261475f, 0.679199f, + 0.262939f, 0.673340f, 0.263672f, 0.668457f, 0.264404f, 0.663086f, 0.263184f, 0.658203f, + 0.262695f, 0.653320f, 0.262939f, 0.647949f, 0.261719f, 0.642090f, 0.260010f, 0.636230f, + 0.259033f, 0.629883f, 0.256836f, 0.623535f, 0.253906f, 0.616699f, 0.251709f, 0.610840f, + 0.248047f, 0.603027f, 0.244263f, 0.595703f, 0.239258f, 0.588379f, 0.234497f, 0.580078f, + 0.228760f, 0.570801f, 0.221802f, 0.561035f, 0.214844f, 0.550781f, 0.206787f, 0.540039f, + 0.198364f, 0.525879f, 0.190063f, 0.510742f, 0.179443f, 0.494385f, 0.167969f, 0.476318f, + 0.155396f, 0.455322f, 0.141113f, 0.430664f, 0.125122f, 0.403076f, 0.106934f, 0.369873f, + 0.086731f, 0.331055f, 0.062683f, 0.281006f, 0.035004f, 0.205078f, 0.005989f, 0.068420f, + 0.000000f, 1.000000f, 0.022034f, 0.988770f, 0.041840f, 0.974609f, 0.061157f, 0.958008f, + 0.079163f, 0.941895f, 0.096313f, 0.925293f, 0.111877f, 0.909668f, 0.126099f, 0.895020f, + 0.139404f, 0.880371f, 0.152100f, 0.866211f, 0.163940f, 0.852051f, 0.175537f, 0.839355f, + 0.185669f, 0.827148f, 0.195190f, 0.814941f, 0.203491f, 0.803223f, 0.212524f, 0.791504f, + 0.220337f, 0.780762f, 0.226685f, 0.770996f, 0.234497f, 0.760742f, 0.241089f, 0.751465f, + 0.246460f, 0.742188f, 0.251953f, 0.733398f, 0.256836f, 0.725098f, 0.260254f, 0.717285f, + 0.265137f, 0.708984f, 0.269531f, 0.701172f, 0.272705f, 0.694336f, 0.274414f, 0.687988f, + 0.277588f, 0.681152f, 0.279541f, 0.674805f, 0.281494f, 0.668945f, 0.283203f, 0.663086f, + 0.283447f, 0.658203f, 0.284180f, 0.653320f, 0.284424f, 0.648926f, 0.284668f, 0.643555f, + 0.283936f, 0.638184f, 0.283203f, 0.633789f, 0.281982f, 0.627930f, 0.280029f, 0.623535f, + 0.278564f, 0.617188f, 0.276123f, 0.611816f, 0.272949f, 0.606445f, 0.269287f, 0.600098f, + 0.265137f, 0.592773f, 0.260986f, 0.586426f, 0.256592f, 0.578613f, 0.250977f, 0.570801f, + 0.244629f, 0.562012f, 0.238159f, 0.552734f, 0.230957f, 0.541992f, 0.222046f, 0.531250f, + 0.213623f, 0.518555f, 0.203369f, 0.504883f, 0.191772f, 0.489502f, 0.179565f, 0.472412f, + 0.165649f, 0.452148f, 0.151245f, 0.429932f, 0.133789f, 0.402832f, 0.114746f, 0.371094f, + 0.092896f, 0.331055f, 0.067444f, 0.278320f, 0.037933f, 0.202637f, 0.006348f, 0.068604f, + 0.000000f, 1.000000f, 0.023560f, 0.988281f, 0.045685f, 0.972656f, 0.066162f, 0.955566f, + 0.085266f, 0.938477f, 0.102783f, 0.922363f, 0.119019f, 0.905762f, 0.134399f, 0.890137f, + 0.149048f, 0.874512f, 0.162354f, 0.859863f, 0.174438f, 0.846191f, 0.186646f, 0.832031f, + 0.196655f, 0.819336f, 0.206299f, 0.807129f, 0.216187f, 0.794922f, 0.224243f, 0.783691f, + 0.232910f, 0.772461f, 0.239502f, 0.762207f, 0.247314f, 0.751953f, 0.254395f, 0.742188f, + 0.259521f, 0.732910f, 0.265381f, 0.723633f, 0.270020f, 0.715332f, 0.275635f, 0.707031f, + 0.280273f, 0.698730f, 0.282715f, 0.691895f, 0.286621f, 0.684082f, 0.289795f, 0.677246f, + 0.291748f, 0.670898f, 0.295410f, 0.664062f, 0.296631f, 0.658203f, 0.297607f, 0.652832f, + 0.298828f, 0.647461f, 0.300781f, 0.641602f, 0.300293f, 0.637207f, 0.301270f, 0.632324f, + 0.300049f, 0.626953f, 0.299072f, 0.622559f, 0.298828f, 0.617188f, 0.296631f, 0.612305f, + 0.294189f, 0.607422f, 0.292236f, 0.601562f, 0.289307f, 0.595703f, 0.285889f, 0.589844f, + 0.282959f, 0.583984f, 0.277588f, 0.577148f, 0.273438f, 0.569824f, 0.267578f, 0.562500f, + 0.261475f, 0.553711f, 0.255371f, 0.544922f, 0.246948f, 0.534180f, 0.239136f, 0.524414f, + 0.230591f, 0.511719f, 0.220581f, 0.498779f, 0.208496f, 0.483154f, 0.196411f, 0.466797f, + 0.182251f, 0.446777f, 0.167236f, 0.424316f, 0.149780f, 0.397461f, 0.130005f, 0.365723f, + 0.107483f, 0.326416f, 0.080872f, 0.274902f, 0.048859f, 0.201416f, 0.011032f, 0.073975f, + 0.000000f, 1.000000f, 0.023407f, 0.988281f, 0.045624f, 0.972656f, 0.066101f, 0.955566f, + 0.085083f, 0.938477f, 0.102844f, 0.921875f, 0.119690f, 0.905273f, 0.135620f, 0.889160f, + 0.149658f, 0.874023f, 0.163940f, 0.858887f, 0.175537f, 0.845215f, 0.187622f, 0.831055f, + 0.199097f, 0.817871f, 0.209229f, 0.805176f, 0.218628f, 0.792969f, 0.227783f, 0.781250f, + 0.236084f, 0.770508f, 0.244141f, 0.759277f, 0.250977f, 0.749023f, 0.258057f, 0.739258f, + 0.265137f, 0.729492f, 0.270508f, 0.720215f, 0.276123f, 0.711426f, 0.281494f, 0.702637f, + 0.284668f, 0.695312f, 0.289795f, 0.686523f, 0.293945f, 0.679199f, 0.297363f, 0.671875f, + 0.300049f, 0.665039f, 0.303711f, 0.658203f, 0.304688f, 0.652344f, 0.307373f, 0.645996f, + 0.309082f, 0.640137f, 0.309570f, 0.635254f, 0.310547f, 0.629883f, 0.311523f, 0.624512f, + 0.311523f, 0.619629f, 0.310303f, 0.614258f, 0.310303f, 0.609375f, 0.308594f, 0.604004f, + 0.307617f, 0.598633f, 0.305908f, 0.592773f, 0.303467f, 0.587402f, 0.300293f, 0.581543f, + 0.297852f, 0.574707f, 0.292969f, 0.567871f, 0.289062f, 0.561035f, 0.284180f, 0.553223f, + 0.278809f, 0.544922f, 0.272705f, 0.535645f, 0.266113f, 0.525879f, 0.258545f, 0.515137f, + 0.250488f, 0.502930f, 0.240967f, 0.489746f, 0.230347f, 0.475342f, 0.218384f, 0.458496f, + 0.205322f, 0.439209f, 0.190063f, 0.416992f, 0.173706f, 0.391602f, 0.153809f, 0.359863f, + 0.131592f, 0.322021f, 0.104431f, 0.271729f, 0.070129f, 0.199585f, 0.024445f, 0.074219f, + 0.000000f, 1.000000f, 0.022964f, 0.988770f, 0.045502f, 0.973145f, 0.066467f, 0.955566f, + 0.085938f, 0.937988f, 0.103394f, 0.921875f, 0.120728f, 0.904785f, 0.136108f, 0.889160f, + 0.150391f, 0.873535f, 0.164429f, 0.858398f, 0.177856f, 0.843750f, 0.189941f, 0.830078f, + 0.200317f, 0.816895f, 0.211548f, 0.803711f, 0.221313f, 0.791504f, 0.231323f, 0.779297f, + 0.239014f, 0.768066f, 0.247314f, 0.756836f, 0.255859f, 0.746094f, 0.261963f, 0.736328f, + 0.269531f, 0.726074f, 0.275635f, 0.716797f, 0.281494f, 0.707520f, 0.286377f, 0.698730f, + 0.291504f, 0.690430f, 0.296631f, 0.682129f, 0.301270f, 0.674316f, 0.305176f, 0.666504f, + 0.308350f, 0.659180f, 0.311035f, 0.653320f, 0.313965f, 0.645996f, 0.316406f, 0.639648f, + 0.318359f, 0.633301f, 0.319336f, 0.627930f, 0.321289f, 0.622070f, 0.321777f, 0.616699f, + 0.322754f, 0.611816f, 0.322510f, 0.606445f, 0.322510f, 0.601074f, 0.322266f, 0.595703f, + 0.320312f, 0.589844f, 0.319580f, 0.583984f, 0.317383f, 0.578125f, 0.314697f, 0.572266f, + 0.312500f, 0.565918f, 0.309814f, 0.559082f, 0.306152f, 0.551270f, 0.301758f, 0.543457f, + 0.297119f, 0.535156f, 0.291504f, 0.525879f, 0.285400f, 0.516113f, 0.277588f, 0.505371f, + 0.270508f, 0.493652f, 0.261719f, 0.480469f, 0.251709f, 0.466064f, 0.241089f, 0.449463f, + 0.228027f, 0.430420f, 0.214600f, 0.408936f, 0.197876f, 0.383545f, 0.179321f, 0.353027f, + 0.156616f, 0.315186f, 0.130371f, 0.266357f, 0.094299f, 0.195435f, 0.042755f, 0.071960f, + 0.000000f, 1.000000f, 0.023224f, 0.988770f, 0.045227f, 0.973145f, 0.066589f, 0.955566f, + 0.085999f, 0.938477f, 0.104614f, 0.921387f, 0.121094f, 0.904785f, 0.137451f, 0.888184f, + 0.151855f, 0.872559f, 0.166870f, 0.857422f, 0.179199f, 0.842773f, 0.191284f, 0.829102f, + 0.203735f, 0.814941f, 0.214600f, 0.801758f, 0.224731f, 0.789062f, 0.233154f, 0.777344f, + 0.243164f, 0.765137f, 0.251221f, 0.753906f, 0.259277f, 0.743652f, 0.267822f, 0.732422f, + 0.273682f, 0.722656f, 0.281006f, 0.712891f, 0.287109f, 0.703613f, 0.292480f, 0.694336f, + 0.298340f, 0.685547f, 0.303955f, 0.677246f, 0.307861f, 0.669434f, 0.312500f, 0.661133f, + 0.315430f, 0.653809f, 0.318359f, 0.646973f, 0.322266f, 0.639648f, 0.325195f, 0.632812f, + 0.327881f, 0.626465f, 0.329346f, 0.620605f, 0.331787f, 0.614258f, 0.332764f, 0.608887f, + 0.334473f, 0.603516f, 0.334473f, 0.598145f, 0.333984f, 0.592285f, 0.334961f, 0.586426f, + 0.333984f, 0.580566f, 0.333252f, 0.575195f, 0.332275f, 0.568359f, 0.330811f, 0.562500f, + 0.328125f, 0.555664f, 0.325684f, 0.548828f, 0.322754f, 0.540527f, 0.319336f, 0.533203f, + 0.314941f, 0.524414f, 0.310547f, 0.515137f, 0.305176f, 0.505371f, 0.299072f, 0.494629f, + 0.291992f, 0.482666f, 0.284424f, 0.469971f, 0.275146f, 0.455322f, 0.264404f, 0.439209f, + 0.252930f, 0.420654f, 0.239380f, 0.399414f, 0.224243f, 0.375000f, 0.206055f, 0.345215f, + 0.183228f, 0.308838f, 0.157104f, 0.261719f, 0.120361f, 0.193237f, 0.064697f, 0.072388f, + 0.000000f, 1.000000f, 0.023453f, 0.988281f, 0.045319f, 0.973145f, 0.066528f, 0.955566f, + 0.086365f, 0.937988f, 0.105164f, 0.920898f, 0.121643f, 0.904297f, 0.138306f, 0.887695f, + 0.153076f, 0.872070f, 0.167725f, 0.856934f, 0.180786f, 0.841797f, 0.193237f, 0.827637f, + 0.205078f, 0.813477f, 0.216064f, 0.800293f, 0.226562f, 0.787598f, 0.237915f, 0.774902f, + 0.246704f, 0.763184f, 0.256348f, 0.750977f, 0.262939f, 0.740234f, 0.271729f, 0.729492f, + 0.279541f, 0.719238f, 0.285645f, 0.709473f, 0.291748f, 0.699707f, 0.299316f, 0.689941f, + 0.304932f, 0.680664f, 0.309814f, 0.672363f, 0.315430f, 0.663574f, 0.319336f, 0.655762f, + 0.324463f, 0.647461f, 0.327637f, 0.640625f, 0.332031f, 0.632812f, 0.334717f, 0.625977f, + 0.337891f, 0.618652f, 0.340088f, 0.612305f, 0.343018f, 0.605957f, 0.344482f, 0.600098f, + 0.346436f, 0.594238f, 0.347656f, 0.588379f, 0.347656f, 0.582520f, 0.348877f, 0.576172f, + 0.348633f, 0.570801f, 0.347656f, 0.564453f, 0.347168f, 0.558105f, 0.345703f, 0.551758f, + 0.344727f, 0.544922f, 0.342529f, 0.538086f, 0.340820f, 0.530762f, 0.337402f, 0.522461f, + 0.334229f, 0.514160f, 0.329590f, 0.505371f, 0.324463f, 0.495361f, 0.318848f, 0.484863f, + 0.312744f, 0.472900f, 0.305664f, 0.460205f, 0.297363f, 0.445801f, 0.287598f, 0.430176f, + 0.276367f, 0.411865f, 0.264404f, 0.391113f, 0.249756f, 0.367432f, 0.232666f, 0.338135f, + 0.211670f, 0.301514f, 0.184692f, 0.255859f, 0.148438f, 0.188721f, 0.090271f, 0.070923f, + 0.000000f, 1.000000f, 0.023575f, 0.988281f, 0.045563f, 0.972656f, 0.066711f, 0.955566f, + 0.086243f, 0.938477f, 0.105103f, 0.920898f, 0.123169f, 0.903809f, 0.138916f, 0.887207f, + 0.154419f, 0.871094f, 0.168701f, 0.855957f, 0.182983f, 0.840332f, 0.195435f, 0.826172f, + 0.207397f, 0.812012f, 0.219360f, 0.798340f, 0.230347f, 0.785156f, 0.240479f, 0.772461f, + 0.250488f, 0.760254f, 0.259766f, 0.748535f, 0.268555f, 0.736816f, 0.275879f, 0.726074f, + 0.284424f, 0.715332f, 0.291504f, 0.705078f, 0.298828f, 0.694824f, 0.305908f, 0.685059f, + 0.310791f, 0.676270f, 0.316650f, 0.666992f, 0.323242f, 0.657715f, 0.327637f, 0.648926f, + 0.332275f, 0.641113f, 0.337158f, 0.633301f, 0.340576f, 0.625977f, 0.344482f, 0.618164f, + 0.348877f, 0.610840f, 0.351318f, 0.604004f, 0.353760f, 0.597656f, 0.356445f, 0.591309f, + 0.357910f, 0.585449f, 0.359619f, 0.579590f, 0.360596f, 0.573730f, 0.361328f, 0.567383f, + 0.362061f, 0.561035f, 0.361328f, 0.555176f, 0.361816f, 0.548828f, 0.361328f, 0.541992f, + 0.361084f, 0.535645f, 0.358887f, 0.527832f, 0.357666f, 0.520508f, 0.354492f, 0.512207f, + 0.351807f, 0.504395f, 0.347900f, 0.495117f, 0.343994f, 0.485107f, 0.340088f, 0.474854f, + 0.334473f, 0.462402f, 0.327637f, 0.449463f, 0.320557f, 0.435303f, 0.312012f, 0.420166f, + 0.301758f, 0.402100f, 0.290039f, 0.381592f, 0.276611f, 0.358398f, 0.260254f, 0.329834f, + 0.239746f, 0.294922f, 0.214111f, 0.250244f, 0.178711f, 0.184326f, 0.118408f, 0.069946f, + 0.000000f, 1.000000f, 0.023590f, 0.988281f, 0.045593f, 0.973145f, 0.066833f, 0.955566f, + 0.086975f, 0.937988f, 0.105957f, 0.920410f, 0.124084f, 0.903320f, 0.140015f, 0.886719f, + 0.155884f, 0.870605f, 0.169800f, 0.854980f, 0.184814f, 0.839355f, 0.197998f, 0.824707f, + 0.210327f, 0.810059f, 0.222290f, 0.796387f, 0.233887f, 0.783203f, 0.244385f, 0.770020f, + 0.253662f, 0.757812f, 0.263184f, 0.745605f, 0.272949f, 0.733887f, 0.281738f, 0.722168f, + 0.290039f, 0.710938f, 0.298340f, 0.699707f, 0.305420f, 0.689453f, 0.312256f, 0.679688f, + 0.318359f, 0.670410f, 0.324951f, 0.660645f, 0.330811f, 0.651855f, 0.335693f, 0.643066f, + 0.341064f, 0.634766f, 0.345703f, 0.626465f, 0.349121f, 0.619141f, 0.354248f, 0.611328f, + 0.357910f, 0.604004f, 0.362061f, 0.596191f, 0.363770f, 0.589844f, 0.366699f, 0.583496f, + 0.368896f, 0.577148f, 0.370850f, 0.571289f, 0.374023f, 0.564453f, 0.374756f, 0.558105f, + 0.376465f, 0.551758f, 0.376709f, 0.545410f, 0.376465f, 0.539062f, 0.376709f, 0.532227f, + 0.376709f, 0.524902f, 0.375977f, 0.517090f, 0.375244f, 0.509277f, 0.373535f, 0.501465f, + 0.370850f, 0.493164f, 0.368164f, 0.483643f, 0.365234f, 0.473877f, 0.359619f, 0.464111f, + 0.355957f, 0.451904f, 0.350342f, 0.439453f, 0.343750f, 0.425537f, 0.335693f, 0.410156f, + 0.327148f, 0.392334f, 0.316162f, 0.372559f, 0.303711f, 0.349121f, 0.288086f, 0.321045f, + 0.269043f, 0.287598f, 0.244263f, 0.244507f, 0.209106f, 0.180664f, 0.149292f, 0.068176f, + 0.000000f, 1.000000f, 0.023499f, 0.988281f, 0.045319f, 0.973145f, 0.067078f, 0.955078f, + 0.087463f, 0.937500f, 0.107056f, 0.919922f, 0.123840f, 0.903320f, 0.139893f, 0.886719f, + 0.156006f, 0.870117f, 0.171753f, 0.853516f, 0.186523f, 0.838379f, 0.200073f, 0.823242f, + 0.212891f, 0.808594f, 0.225220f, 0.793945f, 0.237061f, 0.780273f, 0.247925f, 0.767578f, + 0.257324f, 0.754395f, 0.269287f, 0.741211f, 0.276367f, 0.729980f, 0.287842f, 0.718262f, + 0.294922f, 0.707031f, 0.302979f, 0.696289f, 0.310791f, 0.685547f, 0.318848f, 0.675293f, + 0.325195f, 0.666016f, 0.332520f, 0.655762f, 0.336914f, 0.646973f, 0.343506f, 0.637695f, + 0.349365f, 0.628906f, 0.354248f, 0.620605f, 0.359131f, 0.612305f, 0.363281f, 0.604492f, + 0.368164f, 0.596680f, 0.371826f, 0.588867f, 0.375000f, 0.582031f, 0.379150f, 0.574707f, + 0.381592f, 0.567871f, 0.384521f, 0.561035f, 0.387695f, 0.554199f, 0.388916f, 0.548340f, + 0.390381f, 0.541504f, 0.391357f, 0.535156f, 0.392090f, 0.528320f, 0.393311f, 0.520996f, + 0.392822f, 0.514160f, 0.393066f, 0.506836f, 0.391602f, 0.499023f, 0.391602f, 0.490967f, + 0.388916f, 0.482178f, 0.387939f, 0.472900f, 0.385498f, 0.462891f, 0.381348f, 0.452393f, + 0.377686f, 0.441162f, 0.372803f, 0.428223f, 0.366699f, 0.414551f, 0.359619f, 0.399658f, + 0.352295f, 0.382324f, 0.342773f, 0.362305f, 0.330322f, 0.339600f, 0.317139f, 0.312988f, + 0.298096f, 0.280273f, 0.274902f, 0.236816f, 0.241821f, 0.175659f, 0.181885f, 0.066345f, + 0.000000f, 1.000000f, 0.023575f, 0.988281f, 0.045929f, 0.972656f, 0.067505f, 0.955078f, + 0.087769f, 0.937500f, 0.106750f, 0.919922f, 0.124634f, 0.902344f, 0.142212f, 0.885254f, + 0.158447f, 0.868652f, 0.173218f, 0.852539f, 0.187988f, 0.836914f, 0.203003f, 0.820801f, + 0.215820f, 0.806152f, 0.228760f, 0.791504f, 0.240479f, 0.777832f, 0.250977f, 0.764648f, + 0.262451f, 0.750977f, 0.272461f, 0.738770f, 0.281982f, 0.726562f, 0.291748f, 0.714355f, + 0.299316f, 0.703613f, 0.309082f, 0.692383f, 0.317139f, 0.681641f, 0.324707f, 0.670898f, + 0.331787f, 0.661133f, 0.337646f, 0.651367f, 0.344482f, 0.641602f, 0.351562f, 0.632324f, + 0.358154f, 0.622559f, 0.363281f, 0.613770f, 0.368896f, 0.604980f, 0.373291f, 0.597168f, + 0.379150f, 0.588867f, 0.382812f, 0.580566f, 0.387207f, 0.572754f, 0.390381f, 0.565918f, + 0.393066f, 0.559082f, 0.396729f, 0.552246f, 0.400146f, 0.545410f, 0.402832f, 0.538574f, + 0.404053f, 0.531738f, 0.406006f, 0.524902f, 0.407471f, 0.518066f, 0.409424f, 0.510254f, + 0.409424f, 0.503418f, 0.409912f, 0.496094f, 0.410156f, 0.487793f, 0.409912f, 0.479492f, + 0.408691f, 0.471436f, 0.407227f, 0.461914f, 0.405029f, 0.451660f, 0.403076f, 0.441162f, + 0.399414f, 0.430176f, 0.395264f, 0.417236f, 0.390869f, 0.403809f, 0.384033f, 0.388916f, + 0.378662f, 0.371826f, 0.369141f, 0.352539f, 0.358154f, 0.330078f, 0.345947f, 0.304199f, + 0.329102f, 0.272217f, 0.307129f, 0.230713f, 0.274658f, 0.171143f, 0.216431f, 0.064514f, + 0.000000f, 1.000000f, 0.023270f, 0.988770f, 0.045654f, 0.972656f, 0.067322f, 0.955566f, + 0.087585f, 0.937500f, 0.107178f, 0.919434f, 0.125488f, 0.901855f, 0.143433f, 0.884277f, + 0.160034f, 0.867676f, 0.174927f, 0.851562f, 0.190796f, 0.834473f, 0.204468f, 0.819336f, + 0.217651f, 0.804199f, 0.230469f, 0.790039f, 0.242798f, 0.775879f, 0.256104f, 0.761719f, + 0.266113f, 0.749023f, 0.276855f, 0.735840f, 0.286377f, 0.724121f, 0.296631f, 0.711426f, + 0.305176f, 0.699707f, 0.314209f, 0.688477f, 0.322754f, 0.677246f, 0.331055f, 0.666504f, + 0.338867f, 0.655762f, 0.346191f, 0.645508f, 0.353271f, 0.635254f, 0.359619f, 0.625977f, + 0.366943f, 0.616211f, 0.372314f, 0.606934f, 0.378662f, 0.598145f, 0.383301f, 0.589844f, + 0.387695f, 0.582031f, 0.393555f, 0.573242f, 0.398438f, 0.564941f, 0.401855f, 0.557617f, + 0.405762f, 0.549805f, 0.409912f, 0.542480f, 0.413330f, 0.535156f, 0.416016f, 0.528320f, + 0.418945f, 0.521973f, 0.421143f, 0.514648f, 0.423096f, 0.506836f, 0.424316f, 0.500488f, + 0.425293f, 0.492676f, 0.426514f, 0.485107f, 0.428467f, 0.476562f, 0.428223f, 0.468018f, + 0.426758f, 0.459717f, 0.426025f, 0.450439f, 0.427002f, 0.440674f, 0.425293f, 0.429688f, + 0.421631f, 0.418701f, 0.418457f, 0.405762f, 0.414795f, 0.392334f, 0.409668f, 0.377686f, + 0.403809f, 0.361084f, 0.395996f, 0.342041f, 0.386719f, 0.320312f, 0.375000f, 0.294678f, + 0.359375f, 0.262939f, 0.338623f, 0.223511f, 0.308105f, 0.164795f, 0.251465f, 0.062103f, + 0.000000f, 1.000000f, 0.023148f, 0.988770f, 0.046021f, 0.972656f, 0.067383f, 0.955566f, + 0.088318f, 0.937012f, 0.108032f, 0.918945f, 0.126587f, 0.901367f, 0.144409f, 0.883789f, + 0.161255f, 0.866211f, 0.177734f, 0.849121f, 0.191406f, 0.833984f, 0.207642f, 0.817383f, + 0.221191f, 0.802734f, 0.234009f, 0.788086f, 0.246826f, 0.773438f, 0.257324f, 0.760254f, + 0.269531f, 0.746582f, 0.280762f, 0.733398f, 0.291504f, 0.720215f, 0.301025f, 0.708008f, + 0.311035f, 0.695801f, 0.320557f, 0.684082f, 0.329102f, 0.672363f, 0.338135f, 0.661133f, + 0.346680f, 0.650391f, 0.354492f, 0.639648f, 0.361328f, 0.629883f, 0.367920f, 0.619629f, + 0.374756f, 0.610352f, 0.380859f, 0.600586f, 0.387695f, 0.591797f, 0.393311f, 0.582520f, + 0.399170f, 0.573730f, 0.405029f, 0.564453f, 0.409668f, 0.556641f, 0.414062f, 0.548340f, + 0.418945f, 0.540527f, 0.422607f, 0.532715f, 0.426270f, 0.525879f, 0.430420f, 0.518555f, + 0.433350f, 0.511230f, 0.436035f, 0.503906f, 0.438721f, 0.496094f, 0.440430f, 0.489258f, + 0.442627f, 0.481445f, 0.444580f, 0.473389f, 0.445312f, 0.465332f, 0.447266f, 0.456787f, + 0.447510f, 0.447998f, 0.446777f, 0.438721f, 0.446533f, 0.428711f, 0.445068f, 0.417725f, + 0.443848f, 0.406738f, 0.441650f, 0.394287f, 0.438721f, 0.381104f, 0.434570f, 0.366699f, + 0.429443f, 0.349854f, 0.423096f, 0.331299f, 0.413818f, 0.310547f, 0.404297f, 0.285156f, + 0.390869f, 0.254883f, 0.371338f, 0.215698f, 0.342773f, 0.159912f, 0.289062f, 0.060211f, + 0.000000f, 1.000000f, 0.023102f, 0.988770f, 0.046082f, 0.972656f, 0.067627f, 0.955078f, + 0.088745f, 0.937012f, 0.108459f, 0.918945f, 0.127930f, 0.899902f, 0.146362f, 0.882324f, + 0.163696f, 0.864746f, 0.178589f, 0.848633f, 0.195435f, 0.831543f, 0.208496f, 0.816895f, + 0.222290f, 0.801270f, 0.235962f, 0.786133f, 0.249146f, 0.771484f, 0.262939f, 0.756836f, + 0.273926f, 0.743652f, 0.284668f, 0.729980f, 0.296875f, 0.716797f, 0.306885f, 0.703613f, + 0.317383f, 0.691406f, 0.326660f, 0.679688f, 0.334961f, 0.667969f, 0.343750f, 0.656738f, + 0.352783f, 0.645996f, 0.360596f, 0.634766f, 0.369141f, 0.624023f, 0.376709f, 0.613770f, + 0.384033f, 0.603516f, 0.390625f, 0.593750f, 0.396973f, 0.583984f, 0.403564f, 0.574707f, + 0.408936f, 0.565918f, 0.414551f, 0.557129f, 0.420166f, 0.548340f, 0.426514f, 0.539551f, + 0.431152f, 0.531250f, 0.435791f, 0.522949f, 0.440186f, 0.515625f, 0.443359f, 0.508301f, + 0.447754f, 0.500488f, 0.451416f, 0.493164f, 0.454346f, 0.485352f, 0.457275f, 0.477783f, + 0.459961f, 0.470215f, 0.461670f, 0.461914f, 0.463379f, 0.453857f, 0.465576f, 0.445068f, + 0.466064f, 0.435791f, 0.466553f, 0.427002f, 0.467529f, 0.416748f, 0.467529f, 0.406738f, + 0.465820f, 0.395264f, 0.465332f, 0.382812f, 0.462891f, 0.369385f, 0.460205f, 0.354980f, + 0.455322f, 0.338379f, 0.451172f, 0.321289f, 0.442871f, 0.299561f, 0.434326f, 0.275391f, + 0.420898f, 0.245605f, 0.403320f, 0.208374f, 0.377441f, 0.154297f, 0.325928f, 0.058807f, + 0.000000f, 1.000000f, 0.022980f, 0.988770f, 0.046143f, 0.972168f, 0.068359f, 0.954590f, + 0.089783f, 0.936035f, 0.109497f, 0.917969f, 0.129028f, 0.898926f, 0.146606f, 0.881836f, + 0.164307f, 0.864258f, 0.180664f, 0.847656f, 0.196045f, 0.831543f, 0.211426f, 0.814941f, + 0.225586f, 0.799316f, 0.239868f, 0.784180f, 0.253174f, 0.769043f, 0.265381f, 0.754883f, + 0.277832f, 0.740234f, 0.289551f, 0.726562f, 0.300293f, 0.713379f, 0.311523f, 0.700684f, + 0.322266f, 0.687500f, 0.332031f, 0.675781f, 0.341553f, 0.663574f, 0.350586f, 0.651855f, + 0.360107f, 0.640137f, 0.368652f, 0.628906f, 0.377441f, 0.617676f, 0.384766f, 0.607422f, + 0.392090f, 0.597168f, 0.400391f, 0.586914f, 0.407471f, 0.576660f, 0.413574f, 0.567383f, + 0.420898f, 0.557617f, 0.426270f, 0.548340f, 0.432373f, 0.539551f, 0.437988f, 0.530762f, + 0.443848f, 0.521973f, 0.448730f, 0.513672f, 0.452637f, 0.505859f, 0.457275f, 0.497803f, + 0.462158f, 0.489746f, 0.466064f, 0.482422f, 0.470947f, 0.474854f, 0.473877f, 0.466064f, + 0.476074f, 0.458496f, 0.479492f, 0.450439f, 0.482422f, 0.441406f, 0.484863f, 0.433105f, + 0.485840f, 0.423828f, 0.487061f, 0.414551f, 0.488037f, 0.404541f, 0.488525f, 0.393799f, + 0.487549f, 0.382324f, 0.487793f, 0.370850f, 0.486084f, 0.357178f, 0.484375f, 0.343750f, + 0.480469f, 0.327393f, 0.475830f, 0.309570f, 0.471436f, 0.289551f, 0.463379f, 0.265381f, + 0.451904f, 0.237427f, 0.436768f, 0.200684f, 0.411865f, 0.148315f, 0.364258f, 0.057251f, + 0.000000f, 1.000000f, 0.023148f, 0.988770f, 0.046234f, 0.972168f, 0.068176f, 0.954590f, + 0.088684f, 0.937012f, 0.110352f, 0.916992f, 0.130005f, 0.898926f, 0.148071f, 0.880859f, + 0.166260f, 0.863281f, 0.181763f, 0.847168f, 0.197998f, 0.830078f, 0.213257f, 0.813965f, + 0.227783f, 0.797852f, 0.243042f, 0.781738f, 0.256592f, 0.766602f, 0.269287f, 0.751953f, + 0.281494f, 0.737793f, 0.293945f, 0.723633f, 0.305908f, 0.709961f, 0.317139f, 0.696777f, + 0.328369f, 0.683105f, 0.336914f, 0.671387f, 0.347900f, 0.658691f, 0.358154f, 0.646484f, + 0.367432f, 0.634766f, 0.375488f, 0.624023f, 0.384277f, 0.612305f, 0.394043f, 0.601074f, + 0.402100f, 0.589844f, 0.409668f, 0.579590f, 0.417236f, 0.569824f, 0.423584f, 0.560059f, + 0.431396f, 0.549805f, 0.437744f, 0.540039f, 0.443848f, 0.530762f, 0.450439f, 0.521973f, + 0.456055f, 0.512695f, 0.461426f, 0.503906f, 0.467529f, 0.495361f, 0.472412f, 0.487061f, + 0.477051f, 0.479004f, 0.480957f, 0.471191f, 0.485840f, 0.463135f, 0.490479f, 0.454834f, + 0.492676f, 0.446777f, 0.497070f, 0.437988f, 0.500000f, 0.429443f, 0.502441f, 0.420898f, + 0.504883f, 0.411621f, 0.507324f, 0.402588f, 0.508789f, 0.392334f, 0.510742f, 0.381348f, + 0.511230f, 0.370605f, 0.510254f, 0.358398f, 0.510742f, 0.345459f, 0.509766f, 0.331543f, + 0.507324f, 0.315918f, 0.503906f, 0.298096f, 0.499268f, 0.278809f, 0.492188f, 0.255127f, + 0.482422f, 0.228027f, 0.467773f, 0.192993f, 0.447754f, 0.142578f, 0.401123f, 0.054169f, + 0.000000f, 1.000000f, 0.023102f, 0.988770f, 0.046387f, 0.972656f, 0.068909f, 0.954102f, + 0.091064f, 0.935059f, 0.111694f, 0.916504f, 0.130493f, 0.898438f, 0.148438f, 0.880859f, + 0.165771f, 0.863281f, 0.183716f, 0.845703f, 0.199463f, 0.829102f, 0.216797f, 0.811523f, + 0.231079f, 0.795410f, 0.245972f, 0.779297f, 0.260254f, 0.764160f, 0.272705f, 0.749512f, + 0.285889f, 0.734863f, 0.298340f, 0.720703f, 0.311523f, 0.706055f, 0.322021f, 0.692871f, + 0.333740f, 0.679688f, 0.344482f, 0.666504f, 0.354492f, 0.654297f, 0.364502f, 0.641602f, + 0.373535f, 0.629395f, 0.383545f, 0.617676f, 0.393555f, 0.605957f, 0.402588f, 0.594727f, + 0.409912f, 0.583984f, 0.418945f, 0.572754f, 0.426025f, 0.562500f, 0.434570f, 0.551758f, + 0.441406f, 0.542480f, 0.449707f, 0.531738f, 0.456299f, 0.521973f, 0.462158f, 0.512695f, + 0.469482f, 0.503418f, 0.474854f, 0.494385f, 0.481201f, 0.485352f, 0.486328f, 0.476318f, + 0.492432f, 0.468018f, 0.498291f, 0.459473f, 0.501465f, 0.451416f, 0.507324f, 0.443359f, + 0.510254f, 0.434570f, 0.514648f, 0.426025f, 0.519043f, 0.416992f, 0.521484f, 0.408203f, + 0.524902f, 0.399170f, 0.527344f, 0.389404f, 0.528809f, 0.380127f, 0.532227f, 0.368896f, + 0.533691f, 0.357910f, 0.534668f, 0.346436f, 0.534668f, 0.333740f, 0.533691f, 0.319092f, + 0.532715f, 0.304443f, 0.529785f, 0.287109f, 0.526367f, 0.267822f, 0.521973f, 0.245483f, + 0.512695f, 0.218872f, 0.500488f, 0.184692f, 0.481445f, 0.136841f, 0.440674f, 0.052094f, + 0.000000f, 1.000000f, 0.022919f, 0.988770f, 0.046387f, 0.972168f, 0.069458f, 0.953613f, + 0.092285f, 0.934082f, 0.111755f, 0.916504f, 0.131104f, 0.898438f, 0.149414f, 0.880371f, + 0.167725f, 0.862305f, 0.185303f, 0.844727f, 0.203125f, 0.826660f, 0.218750f, 0.810059f, + 0.234253f, 0.793457f, 0.248413f, 0.777832f, 0.263916f, 0.761719f, 0.276367f, 0.747070f, + 0.290527f, 0.731934f, 0.303223f, 0.717285f, 0.314941f, 0.703125f, 0.327148f, 0.689453f, + 0.339111f, 0.675781f, 0.349609f, 0.662109f, 0.361572f, 0.648926f, 0.372070f, 0.636719f, + 0.382568f, 0.623535f, 0.392334f, 0.611816f, 0.400879f, 0.600586f, 0.409668f, 0.588867f, + 0.418945f, 0.577148f, 0.428955f, 0.565918f, 0.437012f, 0.555176f, 0.444824f, 0.544434f, + 0.453125f, 0.533691f, 0.460449f, 0.523438f, 0.467529f, 0.513672f, 0.475342f, 0.503418f, + 0.480957f, 0.494629f, 0.488281f, 0.484375f, 0.494629f, 0.475098f, 0.500488f, 0.465820f, + 0.507324f, 0.456787f, 0.512207f, 0.448486f, 0.518555f, 0.439453f, 0.522461f, 0.431396f, + 0.527832f, 0.422852f, 0.532715f, 0.413818f, 0.537109f, 0.404541f, 0.541016f, 0.395996f, + 0.544434f, 0.386719f, 0.547852f, 0.377441f, 0.549316f, 0.366943f, 0.553223f, 0.356445f, + 0.555664f, 0.345459f, 0.556641f, 0.333740f, 0.557617f, 0.320801f, 0.558105f, 0.307129f, + 0.557129f, 0.292969f, 0.557129f, 0.275391f, 0.555176f, 0.257324f, 0.549805f, 0.234863f, + 0.544434f, 0.209473f, 0.534180f, 0.175781f, 0.515625f, 0.130371f, 0.477783f, 0.049103f, + 0.000000f, 1.000000f, 0.023056f, 0.988770f, 0.046051f, 0.972656f, 0.070496f, 0.952637f, + 0.091858f, 0.934570f, 0.112366f, 0.916016f, 0.132202f, 0.897949f, 0.151123f, 0.879395f, + 0.169067f, 0.861328f, 0.187622f, 0.842773f, 0.203369f, 0.826172f, 0.220459f, 0.809082f, + 0.236206f, 0.792480f, 0.251221f, 0.775879f, 0.265381f, 0.759766f, 0.280273f, 0.744141f, + 0.294189f, 0.729004f, 0.306396f, 0.714355f, 0.320801f, 0.699219f, 0.331787f, 0.685547f, + 0.345215f, 0.671387f, 0.355957f, 0.657715f, 0.367432f, 0.644531f, 0.379150f, 0.631348f, + 0.389160f, 0.618652f, 0.399658f, 0.605957f, 0.409180f, 0.594238f, 0.419434f, 0.581543f, + 0.429688f, 0.569824f, 0.437988f, 0.558594f, 0.446533f, 0.547363f, 0.455322f, 0.536621f, + 0.464600f, 0.524902f, 0.470947f, 0.515137f, 0.480469f, 0.504395f, 0.487793f, 0.494385f, + 0.494873f, 0.484375f, 0.502441f, 0.474609f, 0.508301f, 0.464844f, 0.516113f, 0.455078f, + 0.521484f, 0.445801f, 0.528320f, 0.436768f, 0.533691f, 0.427734f, 0.539062f, 0.419189f, + 0.544922f, 0.410156f, 0.550293f, 0.401611f, 0.554688f, 0.392090f, 0.559570f, 0.382812f, + 0.564453f, 0.373779f, 0.567871f, 0.364014f, 0.570801f, 0.354248f, 0.574219f, 0.343750f, + 0.577637f, 0.332031f, 0.580078f, 0.320557f, 0.582520f, 0.308105f, 0.584473f, 0.294434f, + 0.583496f, 0.280273f, 0.583984f, 0.264160f, 0.583008f, 0.245483f, 0.579590f, 0.224854f, + 0.573242f, 0.199341f, 0.564941f, 0.168945f, 0.549805f, 0.124329f, 0.514648f, 0.047058f, + 0.000000f, 1.000000f, 0.023087f, 0.988770f, 0.047150f, 0.971680f, 0.070435f, 0.953125f, + 0.091675f, 0.935059f, 0.111877f, 0.916992f, 0.131836f, 0.897949f, 0.151978f, 0.878906f, + 0.170898f, 0.860352f, 0.188354f, 0.842285f, 0.206055f, 0.824707f, 0.222900f, 0.807129f, + 0.239746f, 0.789551f, 0.255127f, 0.773438f, 0.270020f, 0.757324f, 0.284668f, 0.741211f, + 0.297852f, 0.726074f, 0.312988f, 0.710938f, 0.324707f, 0.695801f, 0.338135f, 0.681152f, + 0.350830f, 0.666992f, 0.362305f, 0.653320f, 0.374756f, 0.639160f, 0.385254f, 0.626465f, + 0.397461f, 0.612793f, 0.408203f, 0.600098f, 0.419189f, 0.587891f, 0.428223f, 0.575684f, + 0.437256f, 0.563965f, 0.447266f, 0.551758f, 0.457031f, 0.540039f, 0.467529f, 0.528320f, + 0.474609f, 0.517578f, 0.483887f, 0.505859f, 0.491455f, 0.495850f, 0.500488f, 0.484863f, + 0.507812f, 0.474609f, 0.514160f, 0.464844f, 0.523926f, 0.453857f, 0.530273f, 0.444336f, + 0.537598f, 0.434570f, 0.543945f, 0.425049f, 0.550781f, 0.415771f, 0.556152f, 0.406738f, + 0.561523f, 0.397949f, 0.567871f, 0.388672f, 0.572754f, 0.380127f, 0.578613f, 0.369873f, + 0.583984f, 0.360596f, 0.587402f, 0.351318f, 0.592285f, 0.340820f, 0.595215f, 0.330566f, + 0.600586f, 0.319092f, 0.602051f, 0.307861f, 0.605957f, 0.295654f, 0.607910f, 0.281982f, + 0.610352f, 0.268555f, 0.610352f, 0.251953f, 0.608887f, 0.234253f, 0.607910f, 0.214111f, + 0.604004f, 0.190308f, 0.596680f, 0.159790f, 0.583984f, 0.117981f, 0.553711f, 0.044434f, + 0.000000f, 1.000000f, 0.023010f, 0.988770f, 0.047394f, 0.971191f, 0.070435f, 0.953125f, + 0.091614f, 0.935059f, 0.113525f, 0.915527f, 0.133789f, 0.896484f, 0.154419f, 0.876953f, + 0.171875f, 0.859375f, 0.190308f, 0.841309f, 0.208740f, 0.823242f, 0.225586f, 0.805176f, + 0.241821f, 0.788574f, 0.257568f, 0.771973f, 0.272705f, 0.755371f, 0.287354f, 0.738770f, + 0.302734f, 0.722656f, 0.316162f, 0.707520f, 0.330811f, 0.691895f, 0.342041f, 0.677734f, + 0.357666f, 0.662598f, 0.369385f, 0.648438f, 0.380859f, 0.634277f, 0.392822f, 0.621094f, + 0.404541f, 0.607422f, 0.415527f, 0.594238f, 0.427490f, 0.581055f, 0.436768f, 0.568848f, + 0.447510f, 0.556641f, 0.457031f, 0.544434f, 0.466309f, 0.532715f, 0.476807f, 0.520508f, + 0.486084f, 0.508789f, 0.495605f, 0.497803f, 0.503906f, 0.486816f, 0.511719f, 0.476074f, + 0.520020f, 0.465332f, 0.529297f, 0.454102f, 0.536133f, 0.444336f, 0.544434f, 0.433838f, + 0.552246f, 0.423340f, 0.559570f, 0.413330f, 0.567383f, 0.403809f, 0.572266f, 0.394775f, + 0.579102f, 0.385254f, 0.585449f, 0.375977f, 0.591309f, 0.366943f, 0.597656f, 0.357178f, + 0.603027f, 0.347412f, 0.607910f, 0.337891f, 0.612793f, 0.327637f, 0.617676f, 0.317139f, + 0.622559f, 0.305664f, 0.625977f, 0.294678f, 0.629395f, 0.282715f, 0.631836f, 0.269287f, + 0.633789f, 0.255859f, 0.634766f, 0.239868f, 0.637207f, 0.223389f, 0.635254f, 0.203979f, + 0.633301f, 0.180054f, 0.627930f, 0.151367f, 0.618164f, 0.111938f, 0.589355f, 0.042847f, + 0.000000f, 1.000000f, 0.022888f, 0.988770f, 0.048126f, 0.970703f, 0.070801f, 0.953125f, + 0.092102f, 0.935059f, 0.113831f, 0.915527f, 0.134766f, 0.895996f, 0.153564f, 0.877441f, + 0.174072f, 0.858398f, 0.192139f, 0.840332f, 0.211548f, 0.821289f, 0.228516f, 0.803711f, + 0.244995f, 0.786133f, 0.260986f, 0.769043f, 0.276123f, 0.752441f, 0.291504f, 0.736328f, + 0.307617f, 0.719727f, 0.321045f, 0.704102f, 0.335938f, 0.688477f, 0.349609f, 0.673340f, + 0.362305f, 0.658691f, 0.374756f, 0.644043f, 0.387451f, 0.629883f, 0.400879f, 0.615723f, + 0.413330f, 0.601562f, 0.424805f, 0.588379f, 0.436279f, 0.574707f, 0.446289f, 0.562500f, + 0.456299f, 0.549805f, 0.467285f, 0.537109f, 0.478516f, 0.524414f, 0.488037f, 0.512207f, + 0.498291f, 0.500488f, 0.506348f, 0.489258f, 0.516602f, 0.477295f, 0.524902f, 0.466553f, + 0.535156f, 0.455078f, 0.541992f, 0.444336f, 0.549805f, 0.433838f, 0.558594f, 0.423096f, + 0.567383f, 0.412354f, 0.575684f, 0.401611f, 0.582031f, 0.392090f, 0.590332f, 0.381836f, + 0.597168f, 0.372070f, 0.604004f, 0.362549f, 0.609375f, 0.353516f, 0.616699f, 0.343994f, + 0.622070f, 0.334229f, 0.627930f, 0.323975f, 0.632812f, 0.314209f, 0.638672f, 0.303467f, + 0.644043f, 0.292725f, 0.648438f, 0.281006f, 0.651855f, 0.269531f, 0.656738f, 0.256836f, + 0.659668f, 0.243530f, 0.662109f, 0.228027f, 0.663574f, 0.211792f, 0.663574f, 0.192383f, + 0.661621f, 0.171021f, 0.659668f, 0.143311f, 0.649414f, 0.104797f, 0.626953f, 0.040009f, + 0.000000f, 1.000000f, 0.022675f, 0.988770f, 0.047974f, 0.971191f, 0.070557f, 0.953613f, + 0.092834f, 0.934570f, 0.115173f, 0.914551f, 0.135132f, 0.895996f, 0.156006f, 0.876465f, + 0.175049f, 0.857910f, 0.194702f, 0.838379f, 0.212402f, 0.820312f, 0.230591f, 0.802246f, + 0.246704f, 0.784668f, 0.263916f, 0.767090f, 0.281006f, 0.750000f, 0.296875f, 0.732910f, + 0.310547f, 0.716797f, 0.326416f, 0.700684f, 0.341064f, 0.684570f, 0.354980f, 0.669434f, + 0.368896f, 0.653809f, 0.381348f, 0.639648f, 0.395508f, 0.624512f, 0.408203f, 0.609863f, + 0.420410f, 0.596191f, 0.430908f, 0.583008f, 0.442627f, 0.568848f, 0.454346f, 0.555664f, + 0.466797f, 0.542480f, 0.476807f, 0.529785f, 0.487793f, 0.517090f, 0.498291f, 0.504395f, + 0.507812f, 0.492432f, 0.519043f, 0.480225f, 0.527832f, 0.468506f, 0.539062f, 0.456543f, + 0.547852f, 0.445068f, 0.557129f, 0.434082f, 0.565430f, 0.422852f, 0.572266f, 0.412598f, + 0.581543f, 0.401611f, 0.590332f, 0.390625f, 0.598145f, 0.379883f, 0.606445f, 0.369629f, + 0.615234f, 0.359131f, 0.619141f, 0.350342f, 0.628418f, 0.339600f, 0.635254f, 0.330322f, + 0.642090f, 0.320557f, 0.647949f, 0.310547f, 0.652832f, 0.300537f, 0.659668f, 0.289795f, + 0.665039f, 0.279053f, 0.671387f, 0.267578f, 0.675781f, 0.255859f, 0.680176f, 0.243530f, + 0.684082f, 0.230225f, 0.686523f, 0.216187f, 0.690430f, 0.199951f, 0.690430f, 0.182495f, + 0.691895f, 0.161377f, 0.688477f, 0.134766f, 0.681641f, 0.098877f, 0.663086f, 0.038025f, + 0.000000f, 1.000000f, 0.023010f, 0.988770f, 0.048401f, 0.970703f, 0.071045f, 0.953125f, + 0.093140f, 0.934082f, 0.114502f, 0.915039f, 0.136597f, 0.895020f, 0.156372f, 0.875977f, + 0.177734f, 0.855957f, 0.195801f, 0.837402f, 0.214478f, 0.818848f, 0.233765f, 0.800293f, + 0.250000f, 0.782715f, 0.267578f, 0.764648f, 0.283447f, 0.747559f, 0.299316f, 0.730469f, + 0.315918f, 0.713379f, 0.330322f, 0.697266f, 0.346436f, 0.681152f, 0.359619f, 0.665527f, + 0.374512f, 0.649902f, 0.388184f, 0.634277f, 0.401611f, 0.619629f, 0.414307f, 0.604980f, + 0.427246f, 0.590332f, 0.439941f, 0.576660f, 0.451660f, 0.562500f, 0.464355f, 0.548828f, + 0.475586f, 0.535156f, 0.488037f, 0.521973f, 0.498047f, 0.509277f, 0.509277f, 0.496338f, + 0.520508f, 0.483643f, 0.530273f, 0.471436f, 0.541016f, 0.459229f, 0.550781f, 0.447266f, + 0.560547f, 0.435059f, 0.569824f, 0.423584f, 0.579590f, 0.412354f, 0.589355f, 0.400635f, + 0.598633f, 0.389648f, 0.604980f, 0.379639f, 0.615234f, 0.368164f, 0.623535f, 0.357178f, + 0.630859f, 0.346924f, 0.637695f, 0.336670f, 0.646484f, 0.326416f, 0.654297f, 0.316406f, + 0.661621f, 0.306396f, 0.669434f, 0.296387f, 0.674316f, 0.286621f, 0.681152f, 0.275635f, + 0.687500f, 0.264893f, 0.694336f, 0.253662f, 0.699219f, 0.242432f, 0.704590f, 0.230469f, + 0.708984f, 0.217407f, 0.711914f, 0.203613f, 0.715820f, 0.187866f, 0.718262f, 0.171265f, + 0.720215f, 0.150146f, 0.719238f, 0.125732f, 0.712402f, 0.092590f, 0.697754f, 0.035126f, + 0.000000f, 1.000000f, 0.023560f, 0.988281f, 0.048157f, 0.971191f, 0.070618f, 0.953613f, + 0.094360f, 0.933105f, 0.115234f, 0.914551f, 0.137451f, 0.894531f, 0.158447f, 0.875000f, + 0.177612f, 0.855957f, 0.198120f, 0.836426f, 0.217041f, 0.817383f, 0.234985f, 0.798828f, + 0.252930f, 0.780273f, 0.270508f, 0.762695f, 0.288086f, 0.745117f, 0.303467f, 0.728027f, + 0.320801f, 0.710449f, 0.336426f, 0.693359f, 0.350342f, 0.677734f, 0.365967f, 0.661133f, + 0.381104f, 0.645020f, 0.394775f, 0.629883f, 0.408691f, 0.614746f, 0.422852f, 0.599609f, + 0.435303f, 0.584961f, 0.448730f, 0.569824f, 0.461182f, 0.556152f, 0.474365f, 0.541992f, + 0.486328f, 0.527832f, 0.497803f, 0.514648f, 0.509766f, 0.500977f, 0.520020f, 0.488525f, + 0.531250f, 0.475098f, 0.542480f, 0.462646f, 0.551758f, 0.450439f, 0.563965f, 0.437256f, + 0.573242f, 0.425781f, 0.583984f, 0.413330f, 0.594238f, 0.401611f, 0.604492f, 0.389893f, + 0.612305f, 0.378662f, 0.621582f, 0.367432f, 0.629395f, 0.356689f, 0.640137f, 0.344971f, + 0.647949f, 0.334473f, 0.656738f, 0.323486f, 0.664062f, 0.312988f, 0.673340f, 0.302490f, + 0.679688f, 0.292725f, 0.688477f, 0.282227f, 0.695801f, 0.272217f, 0.702148f, 0.262207f, + 0.708496f, 0.251221f, 0.714844f, 0.240356f, 0.722168f, 0.228516f, 0.727051f, 0.217163f, + 0.732422f, 0.204590f, 0.736816f, 0.191528f, 0.742676f, 0.176270f, 0.744629f, 0.159912f, + 0.747559f, 0.140625f, 0.748047f, 0.117004f, 0.745117f, 0.085266f, 0.731445f, 0.031067f, + 0.000000f, 1.000000f, 0.023895f, 0.987793f, 0.048157f, 0.971191f, 0.071167f, 0.953125f, + 0.094788f, 0.933105f, 0.116272f, 0.914062f, 0.137939f, 0.894043f, 0.159424f, 0.874512f, + 0.180176f, 0.854492f, 0.199829f, 0.834961f, 0.219360f, 0.815918f, 0.237305f, 0.797363f, + 0.256348f, 0.778320f, 0.274170f, 0.760254f, 0.291504f, 0.742188f, 0.308105f, 0.724609f, + 0.323975f, 0.707520f, 0.342041f, 0.689941f, 0.356201f, 0.673828f, 0.372314f, 0.657227f, + 0.387207f, 0.640625f, 0.401123f, 0.625000f, 0.414795f, 0.609863f, 0.430420f, 0.593750f, + 0.444336f, 0.578613f, 0.457275f, 0.563477f, 0.470703f, 0.549316f, 0.483643f, 0.535156f, + 0.495605f, 0.520996f, 0.508301f, 0.506836f, 0.519531f, 0.493408f, 0.531250f, 0.479980f, + 0.543457f, 0.466797f, 0.553711f, 0.453613f, 0.565430f, 0.440674f, 0.576172f, 0.428223f, + 0.587402f, 0.415283f, 0.597656f, 0.403076f, 0.608887f, 0.391113f, 0.616211f, 0.379395f, + 0.628418f, 0.367188f, 0.636719f, 0.355713f, 0.646973f, 0.343994f, 0.656738f, 0.333252f, + 0.665527f, 0.321777f, 0.673340f, 0.310791f, 0.682617f, 0.299561f, 0.692383f, 0.288818f, + 0.699219f, 0.278564f, 0.707031f, 0.268311f, 0.715820f, 0.257568f, 0.723633f, 0.247803f, + 0.730469f, 0.237793f, 0.735840f, 0.226685f, 0.743652f, 0.215210f, 0.750000f, 0.203613f, + 0.756836f, 0.191528f, 0.761230f, 0.178467f, 0.766602f, 0.163940f, 0.770996f, 0.148804f, + 0.774902f, 0.130737f, 0.776855f, 0.108154f, 0.775391f, 0.079651f, 0.764648f, 0.028809f, + 0.000000f, 1.000000f, 0.024796f, 0.986816f, 0.047729f, 0.971680f, 0.071899f, 0.952148f, + 0.094849f, 0.933105f, 0.117432f, 0.913086f, 0.138184f, 0.894043f, 0.161255f, 0.872559f, + 0.180542f, 0.854004f, 0.200806f, 0.834473f, 0.221069f, 0.814941f, 0.240601f, 0.795410f, + 0.257568f, 0.777344f, 0.277100f, 0.758301f, 0.294678f, 0.739746f, 0.312256f, 0.721680f, + 0.328369f, 0.704590f, 0.346436f, 0.686523f, 0.360840f, 0.669922f, 0.377441f, 0.652832f, + 0.393799f, 0.635742f, 0.408203f, 0.620117f, 0.423096f, 0.604004f, 0.436768f, 0.588379f, + 0.452881f, 0.572266f, 0.466064f, 0.557617f, 0.479004f, 0.542480f, 0.492188f, 0.527832f, + 0.505371f, 0.513672f, 0.518066f, 0.499512f, 0.530273f, 0.485352f, 0.543457f, 0.471436f, + 0.554688f, 0.458008f, 0.565918f, 0.444580f, 0.578613f, 0.431152f, 0.589355f, 0.418213f, + 0.602051f, 0.405273f, 0.611328f, 0.393066f, 0.621094f, 0.380615f, 0.632324f, 0.368164f, + 0.643066f, 0.355713f, 0.653320f, 0.343994f, 0.663574f, 0.332275f, 0.672852f, 0.320557f, + 0.681641f, 0.309570f, 0.690918f, 0.298096f, 0.701660f, 0.286133f, 0.709961f, 0.275146f, + 0.720215f, 0.264404f, 0.727051f, 0.253906f, 0.735352f, 0.243652f, 0.743652f, 0.233032f, + 0.751953f, 0.222412f, 0.759277f, 0.212524f, 0.766113f, 0.200928f, 0.772949f, 0.189575f, + 0.780273f, 0.177856f, 0.786621f, 0.165283f, 0.791992f, 0.151611f, 0.796875f, 0.136719f, + 0.800781f, 0.120178f, 0.805664f, 0.099182f, 0.803711f, 0.072327f, 0.796875f, 0.026505f, + 0.000000f, 1.000000f, 0.025131f, 0.986816f, 0.048157f, 0.971680f, 0.071899f, 0.952637f, + 0.094910f, 0.933105f, 0.117920f, 0.913086f, 0.140625f, 0.892578f, 0.161743f, 0.872559f, + 0.184082f, 0.852051f, 0.203247f, 0.833008f, 0.223755f, 0.812988f, 0.242798f, 0.793945f, + 0.261475f, 0.774902f, 0.280029f, 0.755859f, 0.298340f, 0.737305f, 0.316406f, 0.718750f, + 0.333008f, 0.701172f, 0.351562f, 0.682617f, 0.366699f, 0.666016f, 0.384033f, 0.648438f, + 0.399414f, 0.631348f, 0.414795f, 0.615234f, 0.430420f, 0.598633f, 0.445068f, 0.583008f, + 0.460693f, 0.566895f, 0.474854f, 0.550781f, 0.489014f, 0.535645f, 0.501953f, 0.520996f, + 0.515625f, 0.505859f, 0.528809f, 0.491455f, 0.541992f, 0.477051f, 0.554688f, 0.462891f, + 0.566895f, 0.449219f, 0.580078f, 0.435303f, 0.589844f, 0.422363f, 0.601562f, 0.408691f, + 0.614746f, 0.395264f, 0.625488f, 0.382324f, 0.635742f, 0.370117f, 0.648438f, 0.356689f, + 0.658203f, 0.344727f, 0.669434f, 0.332520f, 0.679688f, 0.320068f, 0.689453f, 0.308350f, + 0.699707f, 0.296387f, 0.708496f, 0.284912f, 0.718262f, 0.273682f, 0.729004f, 0.261719f, + 0.737305f, 0.250977f, 0.747070f, 0.239624f, 0.755371f, 0.229248f, 0.763184f, 0.218506f, + 0.771973f, 0.208252f, 0.779297f, 0.197388f, 0.788574f, 0.186890f, 0.794922f, 0.175415f, + 0.803223f, 0.163696f, 0.809570f, 0.152344f, 0.816406f, 0.139282f, 0.822266f, 0.125366f, + 0.828613f, 0.109253f, 0.832031f, 0.091003f, 0.832520f, 0.065674f, 0.828613f, 0.024155f, + 0.000000f, 1.000000f, 0.024414f, 0.988281f, 0.048126f, 0.971191f, 0.072205f, 0.952637f, + 0.096008f, 0.932617f, 0.118042f, 0.913086f, 0.141113f, 0.892090f, 0.163208f, 0.871582f, + 0.184448f, 0.851562f, 0.204834f, 0.832031f, 0.225708f, 0.811523f, 0.245605f, 0.791992f, + 0.265381f, 0.772461f, 0.283936f, 0.753418f, 0.302246f, 0.734863f, 0.320557f, 0.715820f, + 0.338867f, 0.697754f, 0.354980f, 0.679688f, 0.372803f, 0.661621f, 0.390381f, 0.644043f, + 0.405762f, 0.627441f, 0.421631f, 0.610352f, 0.437500f, 0.593262f, 0.452881f, 0.576660f, + 0.468506f, 0.560547f, 0.481934f, 0.545410f, 0.496582f, 0.529785f, 0.510254f, 0.514160f, + 0.524902f, 0.499023f, 0.538086f, 0.484131f, 0.550781f, 0.469482f, 0.564453f, 0.454834f, + 0.578125f, 0.440430f, 0.592285f, 0.426025f, 0.602539f, 0.412842f, 0.615234f, 0.398926f, + 0.627930f, 0.385254f, 0.640137f, 0.371826f, 0.651855f, 0.358643f, 0.662109f, 0.346436f, + 0.674316f, 0.333008f, 0.684570f, 0.320801f, 0.695312f, 0.308594f, 0.706055f, 0.296143f, + 0.716309f, 0.284180f, 0.726562f, 0.272217f, 0.736816f, 0.260010f, 0.746094f, 0.249023f, + 0.756836f, 0.237305f, 0.766113f, 0.225952f, 0.773926f, 0.214966f, 0.784180f, 0.203613f, + 0.792480f, 0.192871f, 0.801758f, 0.182129f, 0.809082f, 0.171875f, 0.818848f, 0.160767f, + 0.826172f, 0.150269f, 0.833496f, 0.138184f, 0.841797f, 0.125977f, 0.846191f, 0.113586f, + 0.853027f, 0.098511f, 0.858398f, 0.081116f, 0.861328f, 0.058472f, 0.859375f, 0.022568f, + 0.000000f, 1.000000f, 0.024719f, 0.987793f, 0.048187f, 0.971191f, 0.072021f, 0.952637f, + 0.096375f, 0.932617f, 0.119019f, 0.912109f, 0.142334f, 0.891602f, 0.163452f, 0.871582f, + 0.185791f, 0.850586f, 0.207031f, 0.830566f, 0.228638f, 0.810059f, 0.247559f, 0.790527f, + 0.267822f, 0.770508f, 0.288330f, 0.750488f, 0.305420f, 0.732422f, 0.325195f, 0.712891f, + 0.343262f, 0.694336f, 0.361572f, 0.675781f, 0.378174f, 0.658203f, 0.395752f, 0.639648f, + 0.412598f, 0.622070f, 0.428711f, 0.605469f, 0.446289f, 0.587891f, 0.461182f, 0.571289f, + 0.476074f, 0.554688f, 0.490479f, 0.538574f, 0.505859f, 0.522461f, 0.520508f, 0.506836f, + 0.535156f, 0.491455f, 0.548828f, 0.476318f, 0.562500f, 0.461182f, 0.577148f, 0.446289f, + 0.589844f, 0.431641f, 0.603027f, 0.417236f, 0.617188f, 0.402832f, 0.629395f, 0.388916f, + 0.640625f, 0.375732f, 0.652344f, 0.361572f, 0.666504f, 0.347656f, 0.677734f, 0.335205f, + 0.687988f, 0.322266f, 0.700195f, 0.309082f, 0.711914f, 0.296143f, 0.722656f, 0.283936f, + 0.733398f, 0.271484f, 0.743652f, 0.259277f, 0.753418f, 0.247803f, 0.764648f, 0.235107f, + 0.774902f, 0.223633f, 0.783691f, 0.212646f, 0.794922f, 0.200684f, 0.804199f, 0.189453f, + 0.813477f, 0.177979f, 0.822266f, 0.167480f, 0.830078f, 0.156738f, 0.839844f, 0.145874f, + 0.847656f, 0.135620f, 0.856445f, 0.124817f, 0.863770f, 0.112671f, 0.872070f, 0.100769f, + 0.876953f, 0.087585f, 0.883301f, 0.071716f, 0.889648f, 0.052063f, 0.887207f, 0.019165f, + 0.000000f, 1.000000f, 0.024582f, 0.988281f, 0.049316f, 0.970703f, 0.073120f, 0.951660f, + 0.096436f, 0.932129f, 0.119263f, 0.912598f, 0.142822f, 0.891602f, 0.164917f, 0.870605f, + 0.187012f, 0.850098f, 0.209473f, 0.829102f, 0.229736f, 0.809082f, 0.250000f, 0.789062f, + 0.271240f, 0.768066f, 0.289795f, 0.749023f, 0.312012f, 0.728516f, 0.329102f, 0.709961f, + 0.348145f, 0.690918f, 0.365723f, 0.672363f, 0.383545f, 0.653809f, 0.401611f, 0.635742f, + 0.418457f, 0.617676f, 0.435059f, 0.600098f, 0.451660f, 0.583008f, 0.468262f, 0.565430f, + 0.484863f, 0.548340f, 0.500000f, 0.532227f, 0.515625f, 0.515625f, 0.530762f, 0.499756f, + 0.545410f, 0.483887f, 0.560059f, 0.468506f, 0.572754f, 0.453369f, 0.587402f, 0.437988f, + 0.601562f, 0.422852f, 0.614746f, 0.407959f, 0.629883f, 0.393066f, 0.643066f, 0.379150f, + 0.654297f, 0.365234f, 0.666504f, 0.351562f, 0.679688f, 0.337402f, 0.691895f, 0.323975f, + 0.705078f, 0.310303f, 0.715820f, 0.297607f, 0.728516f, 0.284180f, 0.738770f, 0.271729f, + 0.750000f, 0.259277f, 0.759766f, 0.247070f, 0.772461f, 0.234131f, 0.783203f, 0.222046f, + 0.793457f, 0.210449f, 0.803223f, 0.198486f, 0.812500f, 0.187134f, 0.821777f, 0.175903f, + 0.833496f, 0.163818f, 0.842285f, 0.152588f, 0.852539f, 0.141113f, 0.861816f, 0.130127f, + 0.871094f, 0.119629f, 0.878418f, 0.109436f, 0.887695f, 0.098511f, 0.895508f, 0.087219f, + 0.902832f, 0.074646f, 0.909668f, 0.061127f, 0.915527f, 0.043549f, 0.918945f, 0.016251f, + 0.000000f, 1.000000f, 0.024323f, 0.987793f, 0.048218f, 0.971680f, 0.073364f, 0.951660f, + 0.096436f, 0.932129f, 0.120911f, 0.911133f, 0.143921f, 0.890625f, 0.166504f, 0.869629f, + 0.189087f, 0.848633f, 0.210938f, 0.827637f, 0.232788f, 0.806641f, 0.254150f, 0.786133f, + 0.274414f, 0.766113f, 0.293701f, 0.746582f, 0.314209f, 0.726562f, 0.333008f, 0.707031f, + 0.352295f, 0.687500f, 0.370117f, 0.668945f, 0.389893f, 0.649414f, 0.407227f, 0.631348f, + 0.424072f, 0.613281f, 0.442627f, 0.595215f, 0.460693f, 0.577148f, 0.477783f, 0.559570f, + 0.493408f, 0.542480f, 0.509277f, 0.525391f, 0.525879f, 0.508789f, 0.541504f, 0.492188f, + 0.557129f, 0.476074f, 0.570312f, 0.460693f, 0.585449f, 0.444824f, 0.599121f, 0.429443f, + 0.612793f, 0.414307f, 0.627441f, 0.398682f, 0.642090f, 0.383789f, 0.655273f, 0.369141f, + 0.668945f, 0.354736f, 0.681641f, 0.340820f, 0.694336f, 0.326904f, 0.706543f, 0.313232f, + 0.719238f, 0.299561f, 0.731445f, 0.285889f, 0.743652f, 0.272705f, 0.754395f, 0.259521f, + 0.767578f, 0.246338f, 0.778809f, 0.233887f, 0.789551f, 0.221802f, 0.798828f, 0.209717f, + 0.811035f, 0.197021f, 0.823242f, 0.184082f, 0.833008f, 0.173096f, 0.842285f, 0.161499f, + 0.853027f, 0.149536f, 0.862793f, 0.138428f, 0.872559f, 0.127075f, 0.883301f, 0.115662f, + 0.891602f, 0.104858f, 0.899902f, 0.094177f, 0.909180f, 0.083374f, 0.918457f, 0.072998f, + 0.926270f, 0.062805f, 0.934570f, 0.049561f, 0.941406f, 0.035126f, 0.946777f, 0.013084f, + 0.000000f, 1.000000f, 0.022781f, 0.989258f, 0.048920f, 0.970703f, 0.073975f, 0.951172f, + 0.097534f, 0.931641f, 0.120605f, 0.911621f, 0.144531f, 0.890137f, 0.167358f, 0.869141f, + 0.190063f, 0.848145f, 0.212402f, 0.826660f, 0.234375f, 0.805664f, 0.256348f, 0.784668f, + 0.277100f, 0.764160f, 0.298340f, 0.743652f, 0.318359f, 0.723633f, 0.338135f, 0.703613f, + 0.357178f, 0.684082f, 0.376709f, 0.664551f, 0.395752f, 0.645508f, 0.415283f, 0.626465f, + 0.432129f, 0.607910f, 0.449951f, 0.589355f, 0.467773f, 0.571777f, 0.485107f, 0.553711f, + 0.501465f, 0.536133f, 0.518066f, 0.519043f, 0.534180f, 0.501953f, 0.549805f, 0.485352f, + 0.565918f, 0.468750f, 0.581543f, 0.452393f, 0.595703f, 0.436523f, 0.610840f, 0.420410f, + 0.626465f, 0.404785f, 0.641113f, 0.389404f, 0.654297f, 0.374512f, 0.667969f, 0.359619f, + 0.681641f, 0.344971f, 0.696289f, 0.330078f, 0.708984f, 0.315918f, 0.721191f, 0.302002f, + 0.734375f, 0.288086f, 0.747559f, 0.274170f, 0.758789f, 0.261230f, 0.771484f, 0.247559f, + 0.783691f, 0.234253f, 0.794434f, 0.221802f, 0.807617f, 0.208496f, 0.817383f, 0.196533f, + 0.829102f, 0.183838f, 0.840820f, 0.171631f, 0.851074f, 0.159302f, 0.861328f, 0.147705f, + 0.873535f, 0.135254f, 0.882324f, 0.124634f, 0.893066f, 0.112610f, 0.902832f, 0.101196f, + 0.911133f, 0.090698f, 0.921875f, 0.079346f, 0.933105f, 0.067505f, 0.940430f, 0.057343f, + 0.949707f, 0.046661f, 0.958496f, 0.036591f, 0.967285f, 0.025909f, 0.973633f, 0.009155f, + 0.000000f, 1.000000f, 0.023911f, 0.988281f, 0.049011f, 0.971191f, 0.074768f, 0.950684f, + 0.097229f, 0.932129f, 0.122131f, 0.910645f, 0.145508f, 0.889648f, 0.168213f, 0.868652f, + 0.191650f, 0.847168f, 0.214478f, 0.825684f, 0.236694f, 0.804199f, 0.258789f, 0.783203f, + 0.280518f, 0.762207f, 0.300781f, 0.741699f, 0.321533f, 0.721191f, 0.342529f, 0.700684f, + 0.361572f, 0.680664f, 0.380859f, 0.661621f, 0.401123f, 0.641602f, 0.420898f, 0.622070f, + 0.438477f, 0.603027f, 0.456543f, 0.584473f, 0.474365f, 0.566406f, 0.491699f, 0.548340f, + 0.509277f, 0.530273f, 0.526855f, 0.512207f, 0.543457f, 0.495117f, 0.559570f, 0.478027f, + 0.575684f, 0.461182f, 0.591797f, 0.444336f, 0.607422f, 0.427979f, 0.623047f, 0.411621f, + 0.638672f, 0.395752f, 0.653320f, 0.380371f, 0.667480f, 0.364990f, 0.681152f, 0.349854f, + 0.695312f, 0.334961f, 0.708496f, 0.320312f, 0.721191f, 0.305664f, 0.736328f, 0.290771f, + 0.750488f, 0.276367f, 0.763184f, 0.262939f, 0.774414f, 0.249878f, 0.786133f, 0.235962f, + 0.799805f, 0.221924f, 0.813965f, 0.208618f, 0.822754f, 0.197144f, 0.834473f, 0.183716f, + 0.847656f, 0.170288f, 0.860352f, 0.158081f, 0.868164f, 0.146606f, 0.880859f, 0.133667f, + 0.892578f, 0.121765f, 0.901367f, 0.110657f, 0.912598f, 0.098450f, 0.922363f, 0.087585f, + 0.933105f, 0.075806f, 0.942871f, 0.064697f, 0.952637f, 0.053192f, 0.963379f, 0.042450f, + 0.968262f, 0.033875f, 0.983887f, 0.018707f, 0.988281f, 0.013397f, 0.999512f, 0.000030f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998047f, + 0.000000f, 0.996582f, 0.000000f, 0.994629f, 0.000000f, 0.992188f, 0.000000f, 0.990723f, + 0.000000f, 0.988281f, 0.000000f, 0.985840f, 0.000000f, 0.982910f, 0.000000f, 0.979980f, + 0.000000f, 0.977051f, 0.000000f, 0.973145f, 0.000000f, 0.969727f, 0.000000f, 0.965332f, + 0.000000f, 0.961426f, 0.000000f, 0.957031f, 0.000000f, 0.952148f, 0.000000f, 0.947266f, + 0.000000f, 0.941895f, 0.000000f, 0.936523f, 0.000000f, 0.931152f, 0.000000f, 0.925293f, + 0.000000f, 0.918945f, 0.000000f, 0.912109f, 0.000000f, 0.905762f, 0.000000f, 0.898926f, + 0.000000f, 0.891602f, 0.000000f, 0.884277f, 0.000000f, 0.875977f, 0.000000f, 0.867676f, + 0.000000f, 0.859375f, 0.000000f, 0.850098f, 0.000000f, 0.841309f, 0.000000f, 0.831543f, + 0.000000f, 0.821289f, 0.000000f, 0.810059f, 0.000000f, 0.799316f, 0.000000f, 0.787598f, + 0.000000f, 0.775879f, 0.000000f, 0.764160f, 0.000000f, 0.750488f, 0.000000f, 0.736816f, + 0.000000f, 0.722656f, 0.000000f, 0.707520f, 0.000000f, 0.691895f, 0.000000f, 0.675781f, + 0.000000f, 0.658203f, 0.000000f, 0.639160f, 0.000000f, 0.620117f, 0.000000f, 0.599609f, + 0.000000f, 0.578613f, 0.000000f, 0.554199f, 0.000000f, 0.528809f, 0.000000f, 0.502441f, + 0.000000f, 0.474121f, 0.000000f, 0.441162f, 0.000000f, 0.404785f, 0.000000f, 0.365234f, + 0.000000f, 0.317871f, 0.000000f, 0.261230f, 0.000000f, 0.186401f, 0.000000f, 0.073303f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.997559f, + 0.000000f, 0.996582f, 0.000000f, 0.994141f, 0.000000f, 0.992676f, 0.000000f, 0.991211f, + 0.000000f, 0.988770f, 0.000000f, 0.985840f, 0.000000f, 0.982910f, 0.000000f, 0.979492f, + 0.000000f, 0.976562f, 0.000000f, 0.972656f, 0.000000f, 0.968750f, 0.000000f, 0.964844f, + 0.000000f, 0.960938f, 0.000000f, 0.957031f, 0.000000f, 0.952148f, 0.000000f, 0.946777f, + 0.000000f, 0.941895f, 0.000000f, 0.936035f, 0.000000f, 0.930664f, 0.000000f, 0.925293f, + 0.000000f, 0.918457f, 0.000000f, 0.912109f, 0.000000f, 0.905273f, 0.000000f, 0.898438f, + 0.000000f, 0.891602f, 0.000000f, 0.884277f, 0.000000f, 0.875488f, 0.000000f, 0.867188f, + 0.000000f, 0.858398f, 0.000000f, 0.849609f, 0.000000f, 0.840820f, 0.000000f, 0.831055f, + 0.000000f, 0.820801f, 0.000000f, 0.810059f, 0.000000f, 0.798828f, 0.000000f, 0.787598f, + 0.000000f, 0.775879f, 0.000000f, 0.763672f, 0.000000f, 0.750488f, 0.000000f, 0.736816f, + 0.000002f, 0.722168f, 0.000004f, 0.707031f, 0.000006f, 0.691895f, 0.000009f, 0.675781f, + 0.000011f, 0.658203f, 0.000012f, 0.639648f, 0.000012f, 0.620117f, 0.000011f, 0.599609f, + 0.000010f, 0.578613f, 0.000010f, 0.554199f, 0.000009f, 0.528809f, 0.000008f, 0.502441f, + 0.000007f, 0.474854f, 0.000008f, 0.440918f, 0.000006f, 0.404541f, 0.000006f, 0.366455f, + 0.000005f, 0.318359f, 0.000004f, 0.260986f, 0.000003f, 0.187012f, 0.000001f, 0.073303f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.997559f, + 0.000000f, 0.995605f, 0.000000f, 0.994141f, 0.000000f, 0.992676f, 0.000000f, 0.990723f, + 0.000000f, 0.988281f, 0.000000f, 0.985352f, 0.000000f, 0.982422f, 0.000000f, 0.979492f, + 0.000000f, 0.976074f, 0.000002f, 0.972656f, 0.000008f, 0.968750f, 0.000013f, 0.964844f, + 0.000019f, 0.960449f, 0.000026f, 0.956055f, 0.000032f, 0.951172f, 0.000040f, 0.946289f, + 0.000046f, 0.941406f, 0.000052f, 0.935547f, 0.000059f, 0.930176f, 0.000066f, 0.924316f, + 0.000073f, 0.918457f, 0.000078f, 0.911621f, 0.000085f, 0.904785f, 0.000091f, 0.897949f, + 0.000098f, 0.891113f, 0.000103f, 0.883301f, 0.000108f, 0.875488f, 0.000111f, 0.866699f, + 0.000111f, 0.858398f, 0.000110f, 0.849609f, 0.000107f, 0.840332f, 0.000103f, 0.831055f, + 0.000101f, 0.820312f, 0.000097f, 0.809570f, 0.000093f, 0.798340f, 0.000091f, 0.787109f, + 0.000090f, 0.775879f, 0.000091f, 0.763672f, 0.000090f, 0.750000f, 0.000091f, 0.736328f, + 0.000092f, 0.721680f, 0.000092f, 0.707031f, 0.000090f, 0.691895f, 0.000084f, 0.675293f, + 0.000082f, 0.657227f, 0.000081f, 0.639160f, 0.000082f, 0.619629f, 0.000080f, 0.599609f, + 0.000072f, 0.578613f, 0.000071f, 0.553711f, 0.000067f, 0.528809f, 0.000068f, 0.501953f, + 0.000064f, 0.474365f, 0.000054f, 0.440674f, 0.000052f, 0.404541f, 0.000049f, 0.365967f, + 0.000036f, 0.318604f, 0.000032f, 0.260742f, 0.000020f, 0.186768f, 0.000005f, 0.073242f, + 0.000000f, 1.000000f, 0.000043f, 0.999512f, 0.000081f, 0.998535f, 0.000108f, 0.997070f, + 0.000124f, 0.995605f, 0.000155f, 0.993652f, 0.000170f, 0.991699f, 0.000178f, 0.989746f, + 0.000201f, 0.987305f, 0.000216f, 0.984375f, 0.000226f, 0.981445f, 0.000232f, 0.979004f, + 0.000245f, 0.975586f, 0.000261f, 0.972168f, 0.000270f, 0.967773f, 0.000276f, 0.963867f, + 0.000280f, 0.959961f, 0.000290f, 0.955078f, 0.000303f, 0.950195f, 0.000311f, 0.945312f, + 0.000319f, 0.940430f, 0.000324f, 0.935059f, 0.000323f, 0.929688f, 0.000330f, 0.923340f, + 0.000333f, 0.916992f, 0.000335f, 0.910645f, 0.000334f, 0.903809f, 0.000332f, 0.896973f, + 0.000332f, 0.890137f, 0.000340f, 0.882324f, 0.000335f, 0.874023f, 0.000337f, 0.865723f, + 0.000339f, 0.856934f, 0.000343f, 0.848145f, 0.000347f, 0.839355f, 0.000354f, 0.830078f, + 0.000346f, 0.819336f, 0.000346f, 0.808594f, 0.000344f, 0.797363f, 0.000340f, 0.786133f, + 0.000340f, 0.774902f, 0.000347f, 0.762695f, 0.000331f, 0.749023f, 0.000326f, 0.734863f, + 0.000325f, 0.721191f, 0.000322f, 0.706055f, 0.000317f, 0.691406f, 0.000297f, 0.674805f, + 0.000297f, 0.656738f, 0.000291f, 0.638672f, 0.000285f, 0.619141f, 0.000276f, 0.599609f, + 0.000257f, 0.577637f, 0.000249f, 0.553711f, 0.000239f, 0.528320f, 0.000229f, 0.501953f, + 0.000222f, 0.474121f, 0.000192f, 0.440430f, 0.000177f, 0.404541f, 0.000162f, 0.366211f, + 0.000131f, 0.317627f, 0.000109f, 0.260498f, 0.000069f, 0.186401f, 0.000016f, 0.072571f, + 0.000000f, 1.000000f, 0.000240f, 0.999023f, 0.000381f, 0.998047f, 0.000352f, 0.997070f, + 0.000453f, 0.995117f, 0.000445f, 0.993164f, 0.000432f, 0.991211f, 0.000427f, 0.989258f, + 0.000529f, 0.986328f, 0.000539f, 0.983398f, 0.000548f, 0.980469f, 0.000558f, 0.977539f, + 0.000641f, 0.974121f, 0.000657f, 0.970215f, 0.000670f, 0.966309f, 0.000674f, 0.962891f, + 0.000666f, 0.958496f, 0.000720f, 0.953613f, 0.000724f, 0.948730f, 0.000719f, 0.943848f, + 0.000719f, 0.938965f, 0.000719f, 0.933594f, 0.000724f, 0.928223f, 0.000784f, 0.921875f, + 0.000794f, 0.915527f, 0.000779f, 0.909180f, 0.000781f, 0.902344f, 0.000791f, 0.895508f, + 0.000794f, 0.888672f, 0.000840f, 0.880859f, 0.000815f, 0.872559f, 0.000814f, 0.864258f, + 0.000812f, 0.855957f, 0.000812f, 0.847168f, 0.000815f, 0.838379f, 0.000852f, 0.828613f, + 0.000819f, 0.817871f, 0.000807f, 0.807617f, 0.000807f, 0.796875f, 0.000807f, 0.785645f, + 0.000801f, 0.773926f, 0.000828f, 0.761230f, 0.000789f, 0.748047f, 0.000767f, 0.734375f, + 0.000766f, 0.720215f, 0.000756f, 0.705566f, 0.000741f, 0.690918f, 0.000760f, 0.673828f, + 0.000701f, 0.656250f, 0.000685f, 0.637695f, 0.000669f, 0.618652f, 0.000653f, 0.599121f, + 0.000625f, 0.577148f, 0.000587f, 0.553223f, 0.000565f, 0.527832f, 0.000539f, 0.501465f, + 0.000528f, 0.473877f, 0.000452f, 0.439697f, 0.000420f, 0.403809f, 0.000381f, 0.365967f, + 0.000308f, 0.317871f, 0.000253f, 0.260742f, 0.000157f, 0.186401f, 0.000031f, 0.072388f, + 0.000000f, 1.000000f, 0.000383f, 0.999023f, 0.000658f, 0.997559f, 0.000662f, 0.996094f, + 0.000860f, 0.994629f, 0.000876f, 0.992188f, 0.000875f, 0.990234f, 0.000867f, 0.988770f, + 0.001044f, 0.984863f, 0.001068f, 0.982422f, 0.001084f, 0.979492f, 0.001096f, 0.976562f, + 0.001233f, 0.972656f, 0.001249f, 0.969238f, 0.001255f, 0.965332f, 0.001245f, 0.961426f, + 0.001245f, 0.957520f, 0.001364f, 0.952148f, 0.001392f, 0.947266f, 0.001414f, 0.942383f, + 0.001401f, 0.937012f, 0.001410f, 0.932129f, 0.001413f, 0.926758f, 0.001525f, 0.919922f, + 0.001539f, 0.913574f, 0.001513f, 0.907227f, 0.001514f, 0.900879f, 0.001509f, 0.894043f, + 0.001519f, 0.887207f, 0.001614f, 0.878906f, 0.001627f, 0.871094f, 0.001584f, 0.862793f, + 0.001567f, 0.854004f, 0.001572f, 0.845703f, 0.001568f, 0.836914f, 0.001637f, 0.826660f, + 0.001644f, 0.816895f, 0.001596f, 0.806152f, 0.001570f, 0.794922f, 0.001554f, 0.784180f, + 0.001540f, 0.772949f, 0.001595f, 0.760254f, 0.001542f, 0.746582f, 0.001506f, 0.733398f, + 0.001476f, 0.719238f, 0.001456f, 0.704590f, 0.001433f, 0.689941f, 0.001471f, 0.672852f, + 0.001373f, 0.655273f, 0.001327f, 0.636719f, 0.001291f, 0.618164f, 0.001261f, 0.598633f, + 0.001273f, 0.576660f, 0.001151f, 0.552734f, 0.001091f, 0.527344f, 0.001044f, 0.501465f, + 0.001024f, 0.473145f, 0.000885f, 0.439453f, 0.000810f, 0.404053f, 0.000731f, 0.365967f, + 0.000594f, 0.317139f, 0.000479f, 0.260986f, 0.000290f, 0.185913f, 0.000055f, 0.072205f, + 0.000000f, 1.000000f, 0.000665f, 0.998535f, 0.001108f, 0.997070f, 0.001078f, 0.995605f, + 0.001183f, 0.993652f, 0.001465f, 0.991699f, 0.001467f, 0.989746f, 0.001527f, 0.987305f, + 0.001788f, 0.983887f, 0.001810f, 0.980469f, 0.001819f, 0.978027f, 0.001825f, 0.975098f, + 0.002068f, 0.970703f, 0.002083f, 0.966797f, 0.002113f, 0.963379f, 0.002136f, 0.959473f, + 0.002121f, 0.955566f, 0.002344f, 0.950195f, 0.002380f, 0.944824f, 0.002407f, 0.940430f, + 0.002377f, 0.935059f, 0.002382f, 0.929688f, 0.002417f, 0.924316f, 0.002584f, 0.917969f, + 0.002621f, 0.911621f, 0.002634f, 0.905273f, 0.002584f, 0.898926f, 0.002573f, 0.892090f, + 0.002617f, 0.885254f, 0.002737f, 0.876953f, 0.002756f, 0.869141f, 0.002714f, 0.860352f, + 0.002716f, 0.852539f, 0.002682f, 0.843750f, 0.002665f, 0.835449f, 0.002785f, 0.824707f, + 0.002800f, 0.814453f, 0.002737f, 0.803711f, 0.002689f, 0.792969f, 0.002657f, 0.782715f, + 0.002623f, 0.771484f, 0.002718f, 0.758301f, 0.002647f, 0.745117f, 0.002590f, 0.731445f, + 0.002539f, 0.717773f, 0.002491f, 0.703613f, 0.002455f, 0.688477f, 0.002506f, 0.671387f, + 0.002419f, 0.653809f, 0.002304f, 0.635742f, 0.002209f, 0.617188f, 0.002146f, 0.597656f, + 0.002169f, 0.575195f, 0.002022f, 0.551758f, 0.001869f, 0.527344f, 0.001777f, 0.501465f, + 0.001743f, 0.472412f, 0.001549f, 0.439209f, 0.001372f, 0.403809f, 0.001231f, 0.366211f, + 0.001015f, 0.317627f, 0.000793f, 0.261230f, 0.000472f, 0.185547f, 0.000089f, 0.071411f, + 0.000000f, 1.000000f, 0.000511f, 0.998535f, 0.001285f, 0.997070f, 0.001654f, 0.995117f, + 0.001899f, 0.992676f, 0.002253f, 0.990234f, 0.002249f, 0.988281f, 0.002424f, 0.985352f, + 0.002768f, 0.982422f, 0.002787f, 0.979492f, 0.002794f, 0.976562f, 0.002808f, 0.974121f, + 0.003235f, 0.968750f, 0.003250f, 0.964844f, 0.003298f, 0.960938f, 0.003326f, 0.957031f, + 0.003334f, 0.953125f, 0.003654f, 0.947754f, 0.003704f, 0.942871f, 0.003731f, 0.937988f, + 0.003765f, 0.933105f, 0.003729f, 0.927734f, 0.003851f, 0.921875f, 0.004032f, 0.915039f, + 0.004082f, 0.909180f, 0.004101f, 0.902832f, 0.004047f, 0.895996f, 0.004066f, 0.889648f, + 0.004128f, 0.882324f, 0.004284f, 0.874023f, 0.004318f, 0.866211f, 0.004318f, 0.857910f, + 0.004253f, 0.849609f, 0.004208f, 0.841797f, 0.004238f, 0.832520f, 0.004372f, 0.822266f, + 0.004372f, 0.812500f, 0.004295f, 0.801758f, 0.004227f, 0.791016f, 0.004211f, 0.780762f, + 0.004169f, 0.769043f, 0.004265f, 0.755859f, 0.004242f, 0.743164f, 0.004139f, 0.729492f, + 0.004044f, 0.716309f, 0.003922f, 0.702148f, 0.003960f, 0.686523f, 0.003929f, 0.669922f, + 0.003799f, 0.652344f, 0.003635f, 0.634766f, 0.003494f, 0.616211f, 0.003368f, 0.597168f, + 0.003389f, 0.574219f, 0.003183f, 0.550293f, 0.002970f, 0.525879f, 0.002785f, 0.500977f, + 0.002716f, 0.471680f, 0.002438f, 0.438965f, 0.002150f, 0.403564f, 0.001896f, 0.366211f, + 0.001602f, 0.316895f, 0.001202f, 0.261475f, 0.000722f, 0.185059f, 0.000137f, 0.071045f, + 0.000000f, 1.000000f, 0.000868f, 0.998535f, 0.001947f, 0.996094f, 0.002363f, 0.994629f, + 0.002825f, 0.991211f, 0.003231f, 0.988770f, 0.003258f, 0.986816f, 0.003414f, 0.984375f, + 0.003702f, 0.980469f, 0.004047f, 0.977051f, 0.004097f, 0.974609f, 0.004158f, 0.971191f, + 0.004467f, 0.966797f, 0.004810f, 0.962891f, 0.004799f, 0.958496f, 0.004841f, 0.955078f, + 0.004944f, 0.950684f, 0.005356f, 0.944824f, 0.005440f, 0.939941f, 0.005493f, 0.935059f, + 0.005497f, 0.930176f, 0.005550f, 0.925293f, 0.005707f, 0.918457f, 0.005974f, 0.912109f, + 0.005993f, 0.905762f, 0.006039f, 0.899902f, 0.006046f, 0.893555f, 0.005966f, 0.887207f, + 0.006180f, 0.879395f, 0.006344f, 0.871094f, 0.006348f, 0.863281f, 0.006348f, 0.855469f, + 0.006279f, 0.847168f, 0.006264f, 0.839355f, 0.006348f, 0.829590f, 0.006474f, 0.819336f, + 0.006462f, 0.809570f, 0.006344f, 0.799316f, 0.006317f, 0.789062f, 0.006210f, 0.778320f, + 0.006241f, 0.766602f, 0.006332f, 0.753418f, 0.006252f, 0.740723f, 0.006111f, 0.727051f, + 0.005966f, 0.714355f, 0.005840f, 0.700684f, 0.005886f, 0.684570f, 0.005795f, 0.667969f, + 0.005604f, 0.650879f, 0.005424f, 0.633301f, 0.005203f, 0.614746f, 0.005043f, 0.595215f, + 0.005001f, 0.572754f, 0.004692f, 0.549805f, 0.004417f, 0.525391f, 0.004093f, 0.500000f, + 0.003971f, 0.470459f, 0.003572f, 0.438232f, 0.003149f, 0.403320f, 0.002739f, 0.366699f, + 0.002323f, 0.316162f, 0.001709f, 0.261475f, 0.001044f, 0.185669f, 0.000188f, 0.070312f, + 0.000000f, 1.000000f, 0.001301f, 0.998535f, 0.001880f, 0.996094f, 0.002771f, 0.993652f, + 0.003651f, 0.990234f, 0.004047f, 0.987793f, 0.004498f, 0.985352f, 0.004833f, 0.981934f, + 0.005249f, 0.978516f, 0.005646f, 0.975098f, 0.005669f, 0.972168f, 0.005970f, 0.968262f, + 0.006287f, 0.963867f, 0.006695f, 0.959473f, 0.006775f, 0.956055f, 0.006760f, 0.951660f, + 0.007030f, 0.947266f, 0.007313f, 0.941895f, 0.007607f, 0.936523f, 0.007675f, 0.931641f, + 0.007744f, 0.926758f, 0.007744f, 0.922363f, 0.008095f, 0.915527f, 0.008392f, 0.908691f, + 0.008453f, 0.902832f, 0.008469f, 0.896484f, 0.008507f, 0.890625f, 0.008392f, 0.884277f, + 0.008728f, 0.875488f, 0.008919f, 0.867676f, 0.008980f, 0.859863f, 0.008949f, 0.852051f, + 0.008820f, 0.844238f, 0.008789f, 0.836426f, 0.008965f, 0.826172f, 0.009178f, 0.816406f, + 0.009132f, 0.806152f, 0.009079f, 0.796387f, 0.008911f, 0.786133f, 0.008759f, 0.776367f, + 0.008827f, 0.763672f, 0.008911f, 0.750488f, 0.008835f, 0.738281f, 0.008629f, 0.725098f, + 0.008408f, 0.712402f, 0.008224f, 0.698730f, 0.008354f, 0.682617f, 0.008179f, 0.666016f, + 0.007904f, 0.648926f, 0.007645f, 0.631348f, 0.007317f, 0.613770f, 0.007168f, 0.593750f, + 0.007042f, 0.571289f, 0.006683f, 0.548828f, 0.006203f, 0.524902f, 0.005756f, 0.500000f, + 0.005562f, 0.469727f, 0.005039f, 0.437256f, 0.004406f, 0.403320f, 0.003811f, 0.366211f, + 0.003242f, 0.316406f, 0.002337f, 0.261475f, 0.001417f, 0.185059f, 0.000250f, 0.069946f, + 0.000000f, 1.000000f, 0.001305f, 0.998535f, 0.002796f, 0.995605f, 0.003759f, 0.993164f, + 0.004532f, 0.989258f, 0.005486f, 0.986328f, 0.005547f, 0.983887f, 0.006359f, 0.979492f, + 0.007092f, 0.976074f, 0.007229f, 0.973145f, 0.007645f, 0.969727f, 0.007950f, 0.965332f, + 0.008621f, 0.960449f, 0.009010f, 0.956543f, 0.009109f, 0.952637f, 0.009224f, 0.949219f, + 0.009575f, 0.943359f, 0.010010f, 0.938477f, 0.010345f, 0.933105f, 0.010384f, 0.928223f, + 0.010475f, 0.923340f, 0.010666f, 0.918457f, 0.011108f, 0.911133f, 0.011414f, 0.904785f, + 0.011459f, 0.898926f, 0.011513f, 0.893066f, 0.011513f, 0.886719f, 0.011612f, 0.879883f, + 0.011932f, 0.871582f, 0.012199f, 0.863770f, 0.012169f, 0.856445f, 0.012184f, 0.848633f, + 0.012146f, 0.841309f, 0.011993f, 0.833008f, 0.012367f, 0.822754f, 0.012474f, 0.812988f, + 0.012390f, 0.803223f, 0.012299f, 0.792969f, 0.012085f, 0.783203f, 0.011978f, 0.773438f, + 0.012169f, 0.760742f, 0.012199f, 0.747559f, 0.012032f, 0.735352f, 0.011703f, 0.722656f, + 0.011536f, 0.709961f, 0.011276f, 0.697266f, 0.011368f, 0.679688f, 0.011154f, 0.663574f, + 0.010765f, 0.646973f, 0.010376f, 0.629883f, 0.010002f, 0.612793f, 0.009781f, 0.592285f, + 0.009514f, 0.569824f, 0.009041f, 0.547363f, 0.008453f, 0.524414f, 0.007805f, 0.499756f, + 0.007500f, 0.468506f, 0.006767f, 0.436523f, 0.005943f, 0.402588f, 0.005157f, 0.365234f, + 0.004299f, 0.315430f, 0.003090f, 0.261719f, 0.001874f, 0.184937f, 0.000340f, 0.069336f, + 0.000000f, 1.000000f, 0.001388f, 0.998047f, 0.002949f, 0.995117f, 0.003960f, 0.992676f, + 0.005760f, 0.987793f, 0.006760f, 0.984863f, 0.007267f, 0.981934f, 0.008400f, 0.977539f, + 0.008934f, 0.973633f, 0.009468f, 0.970215f, 0.009995f, 0.967285f, 0.010574f, 0.962402f, + 0.011307f, 0.957031f, 0.011543f, 0.953613f, 0.011986f, 0.949219f, 0.012039f, 0.945312f, + 0.012878f, 0.939941f, 0.013222f, 0.934082f, 0.013702f, 0.929688f, 0.013824f, 0.924805f, + 0.013779f, 0.919922f, 0.014191f, 0.913574f, 0.014801f, 0.907227f, 0.014854f, 0.900879f, + 0.015144f, 0.894531f, 0.015190f, 0.888672f, 0.015099f, 0.882812f, 0.015526f, 0.875488f, + 0.015915f, 0.867676f, 0.016144f, 0.859863f, 0.016144f, 0.852539f, 0.016068f, 0.844727f, + 0.015961f, 0.837402f, 0.016113f, 0.828613f, 0.016434f, 0.818359f, 0.016525f, 0.808594f, + 0.016479f, 0.799316f, 0.016281f, 0.790039f, 0.016129f, 0.780273f, 0.016037f, 0.769531f, + 0.016159f, 0.756836f, 0.016113f, 0.744629f, 0.015869f, 0.732422f, 0.015640f, 0.720215f, + 0.015244f, 0.707520f, 0.014992f, 0.693359f, 0.015114f, 0.676758f, 0.014694f, 0.660645f, + 0.014343f, 0.645020f, 0.013794f, 0.628418f, 0.013161f, 0.611328f, 0.012917f, 0.589355f, + 0.012550f, 0.567871f, 0.011826f, 0.545410f, 0.011040f, 0.522949f, 0.010208f, 0.499268f, + 0.009827f, 0.467041f, 0.008827f, 0.436035f, 0.007713f, 0.402832f, 0.006733f, 0.363525f, + 0.005547f, 0.315430f, 0.003967f, 0.261475f, 0.002380f, 0.184937f, 0.000430f, 0.068237f, + 0.000000f, 1.000000f, 0.001554f, 0.998047f, 0.003771f, 0.994141f, 0.005260f, 0.991211f, + 0.006737f, 0.986816f, 0.008194f, 0.983398f, 0.009239f, 0.979980f, 0.010109f, 0.975586f, + 0.011467f, 0.970703f, 0.012070f, 0.967285f, 0.012260f, 0.964355f, 0.013695f, 0.958984f, + 0.014343f, 0.954102f, 0.014755f, 0.949707f, 0.014999f, 0.945801f, 0.015686f, 0.941406f, + 0.016403f, 0.935059f, 0.017197f, 0.930176f, 0.017258f, 0.925293f, 0.017776f, 0.920410f, + 0.017960f, 0.916016f, 0.018463f, 0.908691f, 0.018951f, 0.902344f, 0.019348f, 0.896484f, + 0.019699f, 0.890137f, 0.019699f, 0.884766f, 0.019653f, 0.878906f, 0.020340f, 0.870117f, + 0.020752f, 0.862793f, 0.020828f, 0.854980f, 0.020935f, 0.847656f, 0.020737f, 0.840820f, + 0.020737f, 0.833496f, 0.021194f, 0.823242f, 0.021225f, 0.813965f, 0.021484f, 0.804688f, + 0.021271f, 0.795410f, 0.021011f, 0.786133f, 0.020889f, 0.776855f, 0.020905f, 0.765137f, + 0.021057f, 0.752930f, 0.020874f, 0.741211f, 0.020584f, 0.729004f, 0.020233f, 0.717773f, + 0.019592f, 0.705078f, 0.019577f, 0.689941f, 0.019516f, 0.673828f, 0.019012f, 0.658203f, + 0.018417f, 0.642578f, 0.017761f, 0.626953f, 0.016922f, 0.609375f, 0.016739f, 0.587402f, + 0.016174f, 0.565918f, 0.015182f, 0.543945f, 0.014122f, 0.522461f, 0.013283f, 0.497070f, + 0.012520f, 0.465820f, 0.011261f, 0.435303f, 0.009857f, 0.403076f, 0.008575f, 0.362793f, + 0.007057f, 0.315186f, 0.004986f, 0.262207f, 0.002995f, 0.185425f, 0.000528f, 0.067444f, + 0.000000f, 1.000000f, 0.002249f, 0.997559f, 0.004627f, 0.993652f, 0.005775f, 0.991211f, + 0.008293f, 0.985840f, 0.009468f, 0.981934f, 0.010590f, 0.979004f, 0.012863f, 0.972656f, + 0.013573f, 0.968262f, 0.014664f, 0.964844f, 0.015450f, 0.960449f, 0.016556f, 0.955078f, + 0.017975f, 0.950195f, 0.018661f, 0.946289f, 0.018860f, 0.942383f, 0.019928f, 0.936523f, + 0.020767f, 0.930664f, 0.021362f, 0.925781f, 0.021942f, 0.920410f, 0.022369f, 0.916016f, + 0.022751f, 0.910156f, 0.023743f, 0.903809f, 0.024002f, 0.896973f, 0.024597f, 0.891602f, + 0.025009f, 0.885742f, 0.024994f, 0.880371f, 0.025375f, 0.873047f, 0.026062f, 0.865234f, + 0.026337f, 0.857422f, 0.026459f, 0.850586f, 0.026566f, 0.843262f, 0.026550f, 0.836426f, + 0.026581f, 0.828125f, 0.027206f, 0.818359f, 0.027161f, 0.809082f, 0.027283f, 0.799805f, + 0.026978f, 0.791504f, 0.026810f, 0.782715f, 0.026505f, 0.773438f, 0.026749f, 0.760742f, + 0.026764f, 0.748535f, 0.026611f, 0.737305f, 0.026108f, 0.725586f, 0.025650f, 0.714844f, + 0.024933f, 0.702637f, 0.025146f, 0.686523f, 0.024811f, 0.670898f, 0.024063f, 0.655273f, + 0.023361f, 0.640625f, 0.022400f, 0.625000f, 0.021805f, 0.605957f, 0.021347f, 0.584961f, + 0.020370f, 0.563965f, 0.019135f, 0.542969f, 0.017868f, 0.521484f, 0.016830f, 0.494385f, + 0.015762f, 0.464844f, 0.014183f, 0.434326f, 0.012291f, 0.402588f, 0.010735f, 0.361084f, + 0.008743f, 0.314697f, 0.006134f, 0.262451f, 0.003664f, 0.184448f, 0.000638f, 0.066772f, + 0.000000f, 1.000000f, 0.002054f, 0.998047f, 0.005222f, 0.993164f, 0.006458f, 0.990723f, + 0.009277f, 0.984863f, 0.011032f, 0.980469f, 0.012871f, 0.976074f, 0.014778f, 0.970215f, + 0.016830f, 0.965332f, 0.017563f, 0.961914f, 0.019226f, 0.956543f, 0.020554f, 0.951172f, + 0.021362f, 0.946289f, 0.022537f, 0.941895f, 0.023254f, 0.937988f, 0.024429f, 0.931641f, + 0.025772f, 0.925781f, 0.026566f, 0.920410f, 0.027069f, 0.916016f, 0.027344f, 0.911621f, + 0.028687f, 0.904297f, 0.029526f, 0.897461f, 0.030212f, 0.892090f, 0.030380f, 0.885742f, + 0.030716f, 0.880859f, 0.031097f, 0.875488f, 0.031891f, 0.866699f, 0.032410f, 0.859375f, + 0.032959f, 0.852051f, 0.032928f, 0.845215f, 0.033264f, 0.838867f, 0.033051f, 0.832031f, + 0.033630f, 0.822266f, 0.033997f, 0.812500f, 0.034210f, 0.804199f, 0.034180f, 0.795410f, + 0.033936f, 0.787109f, 0.033417f, 0.778809f, 0.033661f, 0.767578f, 0.033844f, 0.755859f, + 0.033630f, 0.744629f, 0.033234f, 0.733398f, 0.032776f, 0.722168f, 0.032074f, 0.711426f, + 0.031616f, 0.697266f, 0.031464f, 0.682129f, 0.031067f, 0.667480f, 0.030090f, 0.652832f, + 0.029144f, 0.638184f, 0.027969f, 0.623047f, 0.027359f, 0.603027f, 0.026703f, 0.582520f, + 0.025375f, 0.562500f, 0.023758f, 0.541504f, 0.022186f, 0.520508f, 0.021103f, 0.492920f, + 0.019562f, 0.463379f, 0.017548f, 0.434082f, 0.015221f, 0.402344f, 0.013191f, 0.360596f, + 0.010681f, 0.314209f, 0.007496f, 0.263184f, 0.004452f, 0.183594f, 0.000767f, 0.065796f, + 0.000000f, 1.000000f, 0.002428f, 0.997559f, 0.005573f, 0.993164f, 0.008026f, 0.989258f, + 0.010979f, 0.983398f, 0.013222f, 0.979004f, 0.015213f, 0.973633f, 0.017471f, 0.967773f, + 0.019196f, 0.963379f, 0.020935f, 0.958984f, 0.022690f, 0.952637f, 0.024796f, 0.946777f, + 0.026001f, 0.941895f, 0.027252f, 0.937500f, 0.028152f, 0.932617f, 0.029953f, 0.926270f, + 0.030746f, 0.920898f, 0.032166f, 0.915527f, 0.032654f, 0.911133f, 0.033539f, 0.905273f, + 0.034729f, 0.898438f, 0.036102f, 0.891602f, 0.036713f, 0.885742f, 0.037415f, 0.880859f, + 0.037323f, 0.875488f, 0.038544f, 0.868164f, 0.039368f, 0.860352f, 0.039795f, 0.853516f, + 0.040222f, 0.846680f, 0.040436f, 0.839844f, 0.040680f, 0.833984f, 0.041046f, 0.825195f, + 0.041534f, 0.815918f, 0.041901f, 0.807129f, 0.042023f, 0.798828f, 0.041504f, 0.791016f, + 0.041595f, 0.782227f, 0.041443f, 0.773438f, 0.041718f, 0.761719f, 0.041656f, 0.750488f, + 0.041321f, 0.739746f, 0.040985f, 0.729492f, 0.040100f, 0.718750f, 0.039337f, 0.708496f, + 0.039307f, 0.692871f, 0.038727f, 0.678223f, 0.038208f, 0.664062f, 0.036987f, 0.650391f, + 0.035736f, 0.635742f, 0.034393f, 0.620117f, 0.033875f, 0.599609f, 0.032745f, 0.580078f, + 0.031097f, 0.560547f, 0.029327f, 0.540527f, 0.027054f, 0.520508f, 0.025848f, 0.490234f, + 0.023834f, 0.461670f, 0.021332f, 0.433350f, 0.018372f, 0.402344f, 0.016144f, 0.359131f, + 0.012894f, 0.313721f, 0.009102f, 0.264160f, 0.005341f, 0.182739f, 0.000927f, 0.064758f, + 0.000000f, 1.000000f, 0.002878f, 0.997559f, 0.006504f, 0.992676f, 0.009315f, 0.987793f, + 0.012947f, 0.981934f, 0.015312f, 0.977539f, 0.017731f, 0.971191f, 0.020447f, 0.965332f, + 0.022369f, 0.960449f, 0.023743f, 0.956543f, 0.027145f, 0.948242f, 0.028946f, 0.942383f, + 0.030807f, 0.937500f, 0.031708f, 0.933594f, 0.034027f, 0.926270f, 0.035736f, 0.920410f, + 0.037018f, 0.915039f, 0.037964f, 0.910645f, 0.038910f, 0.905762f, 0.040680f, 0.898438f, + 0.041992f, 0.891602f, 0.043213f, 0.885742f, 0.043793f, 0.880371f, 0.044373f, 0.875000f, + 0.045227f, 0.869629f, 0.046204f, 0.860840f, 0.047607f, 0.853516f, 0.048126f, 0.847168f, + 0.048370f, 0.840820f, 0.048767f, 0.834473f, 0.048706f, 0.827637f, 0.049896f, 0.818359f, + 0.050446f, 0.809570f, 0.050720f, 0.801270f, 0.050568f, 0.793457f, 0.050323f, 0.785645f, + 0.050049f, 0.777832f, 0.050476f, 0.766602f, 0.050598f, 0.755859f, 0.050629f, 0.746094f, + 0.050049f, 0.735840f, 0.049408f, 0.725586f, 0.048431f, 0.715332f, 0.048218f, 0.702637f, + 0.048035f, 0.688477f, 0.046997f, 0.674316f, 0.046051f, 0.660645f, 0.044861f, 0.647461f, + 0.043060f, 0.633789f, 0.041901f, 0.615723f, 0.040985f, 0.596191f, 0.039429f, 0.577148f, + 0.037567f, 0.558594f, 0.035339f, 0.540039f, 0.032837f, 0.516113f, 0.031128f, 0.487793f, + 0.028809f, 0.461182f, 0.025543f, 0.432617f, 0.022003f, 0.402832f, 0.019440f, 0.357910f, + 0.015465f, 0.313965f, 0.010681f, 0.264404f, 0.006344f, 0.182617f, 0.001092f, 0.064209f, + 0.000000f, 1.000000f, 0.003632f, 0.996582f, 0.007587f, 0.992188f, 0.010414f, 0.986328f, + 0.014725f, 0.980469f, 0.017197f, 0.976074f, 0.020142f, 0.968750f, 0.023468f, 0.962891f, + 0.025879f, 0.958008f, 0.028595f, 0.951172f, 0.030853f, 0.944824f, 0.033691f, 0.938477f, + 0.035583f, 0.934082f, 0.037842f, 0.927734f, 0.039734f, 0.920898f, 0.041992f, 0.914551f, + 0.043793f, 0.909180f, 0.044800f, 0.904785f, 0.046661f, 0.898926f, 0.048096f, 0.891602f, + 0.049866f, 0.884766f, 0.050751f, 0.879395f, 0.051941f, 0.874023f, 0.052490f, 0.869141f, + 0.054169f, 0.861328f, 0.055359f, 0.854004f, 0.056305f, 0.846680f, 0.057098f, 0.840332f, + 0.057495f, 0.834961f, 0.057800f, 0.828613f, 0.058685f, 0.819824f, 0.059479f, 0.811035f, + 0.060120f, 0.803223f, 0.060242f, 0.795410f, 0.060333f, 0.788086f, 0.059753f, 0.780762f, + 0.060242f, 0.770996f, 0.060242f, 0.760254f, 0.060455f, 0.750000f, 0.060059f, 0.740723f, + 0.059387f, 0.730469f, 0.058685f, 0.721680f, 0.057800f, 0.710449f, 0.057587f, 0.696289f, + 0.056915f, 0.683105f, 0.056030f, 0.669922f, 0.054504f, 0.657715f, 0.053131f, 0.644531f, + 0.051422f, 0.630371f, 0.050293f, 0.611328f, 0.048889f, 0.593262f, 0.047058f, 0.575195f, + 0.044586f, 0.557129f, 0.041656f, 0.538086f, 0.039398f, 0.512695f, 0.037201f, 0.486572f, + 0.033936f, 0.459717f, 0.030258f, 0.432373f, 0.026291f, 0.400879f, 0.022949f, 0.356445f, + 0.018234f, 0.313721f, 0.012558f, 0.265137f, 0.007404f, 0.182617f, 0.001262f, 0.063599f, + 0.000000f, 1.000000f, 0.004120f, 0.996094f, 0.008354f, 0.991699f, 0.012260f, 0.985352f, + 0.016769f, 0.979492f, 0.019363f, 0.974609f, 0.023438f, 0.966309f, 0.026428f, 0.960938f, + 0.029419f, 0.955078f, 0.032990f, 0.947266f, 0.036072f, 0.940430f, 0.038086f, 0.935059f, + 0.040924f, 0.929688f, 0.043762f, 0.921875f, 0.046936f, 0.914551f, 0.048859f, 0.909180f, + 0.050446f, 0.903809f, 0.051880f, 0.899414f, 0.054321f, 0.891113f, 0.056641f, 0.884277f, + 0.058228f, 0.878418f, 0.059387f, 0.873047f, 0.060181f, 0.868164f, 0.062256f, 0.860840f, + 0.063416f, 0.853027f, 0.064941f, 0.846191f, 0.065857f, 0.840332f, 0.066772f, 0.834473f, + 0.067139f, 0.828613f, 0.068298f, 0.820312f, 0.069092f, 0.812012f, 0.070190f, 0.804199f, + 0.070251f, 0.796387f, 0.070618f, 0.789551f, 0.070251f, 0.782715f, 0.070618f, 0.773926f, + 0.071106f, 0.763184f, 0.070984f, 0.753418f, 0.071045f, 0.744141f, 0.070435f, 0.735352f, + 0.069702f, 0.726074f, 0.068787f, 0.717285f, 0.068542f, 0.703613f, 0.067932f, 0.690918f, + 0.066772f, 0.678711f, 0.065796f, 0.666504f, 0.063721f, 0.654297f, 0.062164f, 0.642090f, + 0.060852f, 0.624512f, 0.059387f, 0.606934f, 0.057251f, 0.590332f, 0.055054f, 0.572754f, + 0.052002f, 0.555664f, 0.048828f, 0.536621f, 0.046387f, 0.509766f, 0.043457f, 0.484375f, + 0.039734f, 0.458984f, 0.035187f, 0.432861f, 0.031067f, 0.397705f, 0.026810f, 0.355713f, + 0.021164f, 0.313965f, 0.014526f, 0.266602f, 0.008568f, 0.182129f, 0.001485f, 0.063538f, + 0.000000f, 1.000000f, 0.004551f, 0.996094f, 0.009392f, 0.991211f, 0.013962f, 0.983887f, + 0.017792f, 0.978516f, 0.022156f, 0.971191f, 0.026657f, 0.964355f, 0.030258f, 0.958008f, + 0.033203f, 0.952148f, 0.037201f, 0.943848f, 0.040710f, 0.937012f, 0.044250f, 0.931152f, + 0.046509f, 0.924316f, 0.050598f, 0.916016f, 0.053192f, 0.909180f, 0.056091f, 0.903320f, + 0.057648f, 0.897949f, 0.060669f, 0.890625f, 0.063293f, 0.883301f, 0.064880f, 0.877441f, + 0.067139f, 0.871582f, 0.068604f, 0.866699f, 0.069702f, 0.859863f, 0.072205f, 0.852051f, + 0.074036f, 0.845215f, 0.075134f, 0.838379f, 0.076111f, 0.833496f, 0.077271f, 0.827637f, + 0.078186f, 0.820312f, 0.079224f, 0.811523f, 0.080261f, 0.804199f, 0.080994f, 0.796875f, + 0.081299f, 0.790039f, 0.081299f, 0.783691f, 0.081482f, 0.775879f, 0.082214f, 0.765137f, + 0.082520f, 0.756836f, 0.082764f, 0.747070f, 0.082214f, 0.738770f, 0.081543f, 0.730469f, + 0.080566f, 0.721680f, 0.080139f, 0.709961f, 0.079895f, 0.697266f, 0.078735f, 0.685547f, + 0.077271f, 0.673828f, 0.076050f, 0.662598f, 0.073669f, 0.650879f, 0.072266f, 0.636719f, + 0.070679f, 0.620117f, 0.068787f, 0.603516f, 0.066345f, 0.587402f, 0.063354f, 0.570801f, + 0.059723f, 0.554199f, 0.057007f, 0.531250f, 0.053925f, 0.506836f, 0.049957f, 0.482666f, + 0.045593f, 0.458496f, 0.040375f, 0.431885f, 0.035828f, 0.394531f, 0.030869f, 0.355225f, + 0.024323f, 0.314941f, 0.017105f, 0.262695f, 0.009865f, 0.182373f, 0.001684f, 0.062286f, + 0.000000f, 1.000000f, 0.005116f, 0.995605f, 0.010109f, 0.990723f, 0.015930f, 0.982910f, + 0.020416f, 0.977051f, 0.024887f, 0.969238f, 0.030289f, 0.961426f, 0.034027f, 0.956055f, + 0.038147f, 0.947754f, 0.042694f, 0.939453f, 0.046021f, 0.933105f, 0.049103f, 0.927246f, + 0.053406f, 0.917969f, 0.057281f, 0.910645f, 0.060638f, 0.904297f, 0.062927f, 0.898438f, + 0.066040f, 0.890625f, 0.069458f, 0.882324f, 0.071777f, 0.875977f, 0.074585f, 0.869629f, + 0.076416f, 0.864746f, 0.078430f, 0.858398f, 0.081116f, 0.850586f, 0.082764f, 0.843750f, + 0.084961f, 0.837402f, 0.085999f, 0.831543f, 0.086853f, 0.826172f, 0.088196f, 0.819336f, + 0.090210f, 0.810547f, 0.091370f, 0.803223f, 0.092224f, 0.796387f, 0.092285f, 0.790039f, + 0.093140f, 0.783691f, 0.093140f, 0.776367f, 0.094177f, 0.766113f, 0.094727f, 0.757812f, + 0.094849f, 0.749512f, 0.094421f, 0.741211f, 0.094238f, 0.732910f, 0.093140f, 0.725098f, + 0.092529f, 0.713867f, 0.092285f, 0.702148f, 0.091431f, 0.690918f, 0.090271f, 0.680176f, + 0.088379f, 0.669434f, 0.086548f, 0.658691f, 0.084290f, 0.646973f, 0.083191f, 0.630371f, + 0.081299f, 0.614746f, 0.078918f, 0.600098f, 0.075500f, 0.584473f, 0.072266f, 0.569336f, + 0.068359f, 0.551270f, 0.065552f, 0.527832f, 0.061829f, 0.504395f, 0.057281f, 0.481689f, + 0.051941f, 0.457520f, 0.045990f, 0.432373f, 0.041321f, 0.392822f, 0.035065f, 0.354736f, + 0.027573f, 0.314941f, 0.019547f, 0.259033f, 0.011169f, 0.182983f, 0.001916f, 0.061859f, + 0.000000f, 1.000000f, 0.006191f, 0.995117f, 0.011017f, 0.990723f, 0.017899f, 0.981934f, + 0.022003f, 0.976562f, 0.028793f, 0.966309f, 0.032928f, 0.959961f, 0.037384f, 0.953125f, + 0.043152f, 0.943359f, 0.047943f, 0.935547f, 0.051788f, 0.929688f, 0.056061f, 0.920898f, + 0.060486f, 0.912598f, 0.064880f, 0.904785f, 0.067993f, 0.898926f, 0.071533f, 0.891602f, + 0.075378f, 0.882812f, 0.078735f, 0.875488f, 0.082092f, 0.868652f, 0.084045f, 0.863281f, + 0.086487f, 0.856934f, 0.089417f, 0.848633f, 0.092346f, 0.841797f, 0.094604f, 0.835449f, + 0.095642f, 0.830078f, 0.097473f, 0.824219f, 0.099304f, 0.816406f, 0.101074f, 0.808594f, + 0.102478f, 0.801758f, 0.104187f, 0.794922f, 0.104309f, 0.789062f, 0.105164f, 0.782715f, + 0.105164f, 0.775879f, 0.106873f, 0.766113f, 0.107544f, 0.757812f, 0.107605f, 0.749512f, + 0.107605f, 0.742676f, 0.107117f, 0.735352f, 0.106262f, 0.727539f, 0.105835f, 0.716797f, + 0.105896f, 0.706055f, 0.104858f, 0.695312f, 0.103638f, 0.685547f, 0.102295f, 0.675293f, + 0.100159f, 0.666016f, 0.097900f, 0.654785f, 0.096436f, 0.639160f, 0.094910f, 0.625000f, + 0.092041f, 0.610352f, 0.089050f, 0.596680f, 0.085388f, 0.582031f, 0.081604f, 0.567383f, + 0.077942f, 0.545410f, 0.074585f, 0.524414f, 0.069946f, 0.502930f, 0.064758f, 0.480225f, + 0.058472f, 0.457031f, 0.052612f, 0.427246f, 0.046936f, 0.391602f, 0.039703f, 0.354736f, + 0.031036f, 0.315918f, 0.022400f, 0.257080f, 0.012619f, 0.183350f, 0.002148f, 0.061646f, + 0.000000f, 1.000000f, 0.006817f, 0.995117f, 0.012398f, 0.989258f, 0.019669f, 0.980957f, + 0.024902f, 0.974121f, 0.031738f, 0.964355f, 0.037354f, 0.957520f, 0.042908f, 0.948242f, + 0.048340f, 0.939941f, 0.053680f, 0.932617f, 0.057648f, 0.924805f, 0.063416f, 0.915039f, + 0.067627f, 0.907715f, 0.072266f, 0.899902f, 0.076172f, 0.893066f, 0.081116f, 0.883301f, + 0.085388f, 0.875000f, 0.088745f, 0.868652f, 0.091675f, 0.862305f, 0.094788f, 0.854980f, + 0.098633f, 0.846191f, 0.101318f, 0.839355f, 0.103577f, 0.833008f, 0.106140f, 0.827148f, + 0.107727f, 0.822266f, 0.109985f, 0.813965f, 0.112549f, 0.806152f, 0.114563f, 0.798828f, + 0.115540f, 0.792969f, 0.117065f, 0.787109f, 0.116943f, 0.781738f, 0.118591f, 0.773438f, + 0.119934f, 0.765137f, 0.120544f, 0.756836f, 0.121277f, 0.750000f, 0.121155f, 0.742676f, + 0.120300f, 0.735840f, 0.119812f, 0.729492f, 0.120056f, 0.717773f, 0.119690f, 0.708008f, + 0.119141f, 0.698242f, 0.117920f, 0.689453f, 0.116821f, 0.680176f, 0.114380f, 0.670898f, + 0.112244f, 0.661133f, 0.110962f, 0.646484f, 0.109131f, 0.633301f, 0.106567f, 0.620117f, + 0.103149f, 0.606445f, 0.099426f, 0.593262f, 0.095703f, 0.580078f, 0.091797f, 0.561523f, + 0.088196f, 0.541504f, 0.083618f, 0.521484f, 0.078247f, 0.500488f, 0.072266f, 0.479492f, + 0.065491f, 0.457031f, 0.059631f, 0.423828f, 0.052521f, 0.390381f, 0.044403f, 0.354980f, + 0.034576f, 0.315674f, 0.025177f, 0.255127f, 0.014053f, 0.183350f, 0.002422f, 0.061646f, + 0.000000f, 1.000000f, 0.007477f, 0.994629f, 0.014580f, 0.987305f, 0.021271f, 0.980469f, + 0.028717f, 0.970703f, 0.034760f, 0.962891f, 0.040588f, 0.955566f, 0.048798f, 0.944336f, + 0.054474f, 0.936523f, 0.058929f, 0.929688f, 0.065491f, 0.918457f, 0.071106f, 0.909668f, + 0.075867f, 0.902344f, 0.080261f, 0.894531f, 0.086365f, 0.884277f, 0.090149f, 0.876465f, + 0.095154f, 0.868652f, 0.098572f, 0.862305f, 0.101868f, 0.854004f, 0.106812f, 0.845215f, + 0.110413f, 0.837402f, 0.113098f, 0.831055f, 0.116028f, 0.825195f, 0.117920f, 0.818848f, + 0.121521f, 0.810059f, 0.123779f, 0.803223f, 0.125732f, 0.796875f, 0.127686f, 0.790527f, + 0.128662f, 0.785156f, 0.129395f, 0.779297f, 0.131958f, 0.770508f, 0.133423f, 0.762207f, + 0.134155f, 0.755371f, 0.134888f, 0.749023f, 0.134888f, 0.742188f, 0.134888f, 0.736328f, + 0.134399f, 0.728027f, 0.134644f, 0.718262f, 0.134888f, 0.708984f, 0.134033f, 0.700195f, + 0.132812f, 0.691895f, 0.131592f, 0.684082f, 0.129761f, 0.675293f, 0.127319f, 0.665039f, + 0.126221f, 0.652344f, 0.124207f, 0.640137f, 0.121277f, 0.627930f, 0.118408f, 0.615723f, + 0.114990f, 0.603516f, 0.110474f, 0.591309f, 0.106873f, 0.574707f, 0.102905f, 0.555664f, + 0.098206f, 0.537109f, 0.093018f, 0.518555f, 0.086853f, 0.499268f, 0.080017f, 0.479248f, + 0.073364f, 0.452637f, 0.066711f, 0.422119f, 0.058594f, 0.389893f, 0.049225f, 0.354980f, + 0.038177f, 0.316406f, 0.028336f, 0.254150f, 0.015450f, 0.183838f, 0.002693f, 0.061462f, + 0.000000f, 1.000000f, 0.008354f, 0.994629f, 0.015961f, 0.986816f, 0.023605f, 0.979492f, + 0.031921f, 0.968750f, 0.038483f, 0.961426f, 0.046234f, 0.950684f, 0.053558f, 0.941406f, + 0.059143f, 0.934082f, 0.066406f, 0.922852f, 0.073486f, 0.913574f, 0.078979f, 0.905273f, + 0.084167f, 0.896973f, 0.090210f, 0.886719f, 0.096008f, 0.877441f, 0.100464f, 0.870117f, + 0.104309f, 0.863281f, 0.109802f, 0.853027f, 0.114563f, 0.844727f, 0.118225f, 0.836914f, + 0.122681f, 0.829590f, 0.125244f, 0.823730f, 0.128784f, 0.814941f, 0.132690f, 0.806641f, + 0.134888f, 0.799805f, 0.137939f, 0.793457f, 0.139893f, 0.787598f, 0.141602f, 0.782715f, + 0.143433f, 0.774414f, 0.145386f, 0.766602f, 0.146729f, 0.759766f, 0.147949f, 0.753418f, + 0.148682f, 0.747070f, 0.148804f, 0.741211f, 0.148926f, 0.735352f, 0.149536f, 0.725098f, + 0.150635f, 0.717285f, 0.150024f, 0.708984f, 0.149536f, 0.701172f, 0.148682f, 0.693848f, + 0.146729f, 0.686035f, 0.144775f, 0.678711f, 0.143311f, 0.666992f, 0.142334f, 0.655762f, + 0.140015f, 0.645020f, 0.137329f, 0.634277f, 0.134399f, 0.623047f, 0.130859f, 0.612305f, + 0.126587f, 0.600586f, 0.122620f, 0.584961f, 0.118958f, 0.567871f, 0.114075f, 0.551270f, + 0.108887f, 0.534180f, 0.102661f, 0.517090f, 0.095764f, 0.498535f, 0.088257f, 0.477295f, + 0.081665f, 0.448730f, 0.073486f, 0.419922f, 0.064331f, 0.388428f, 0.053955f, 0.354736f, + 0.042419f, 0.314209f, 0.031403f, 0.253174f, 0.017044f, 0.184692f, 0.002956f, 0.061035f, + 0.000000f, 1.000000f, 0.009033f, 0.994629f, 0.018036f, 0.985840f, 0.026031f, 0.977051f, + 0.035248f, 0.967773f, 0.042816f, 0.958008f, 0.051422f, 0.947754f, 0.058624f, 0.938965f, + 0.066345f, 0.927734f, 0.074097f, 0.917480f, 0.080078f, 0.909180f, 0.087097f, 0.899902f, + 0.094360f, 0.888672f, 0.099976f, 0.880371f, 0.105713f, 0.872070f, 0.110474f, 0.863281f, + 0.116028f, 0.853516f, 0.121643f, 0.844238f, 0.126831f, 0.836426f, 0.130859f, 0.829590f, + 0.134766f, 0.820801f, 0.139404f, 0.812012f, 0.142700f, 0.804199f, 0.146973f, 0.797363f, + 0.149170f, 0.790527f, 0.150757f, 0.785156f, 0.154541f, 0.777344f, 0.157104f, 0.769531f, + 0.159424f, 0.763184f, 0.161133f, 0.755859f, 0.161743f, 0.750000f, 0.162964f, 0.744629f, + 0.163330f, 0.739258f, 0.164307f, 0.730469f, 0.165283f, 0.722656f, 0.165771f, 0.714844f, + 0.165649f, 0.708008f, 0.165039f, 0.701660f, 0.164062f, 0.694336f, 0.162476f, 0.687500f, + 0.161743f, 0.678223f, 0.160767f, 0.667969f, 0.158813f, 0.658203f, 0.156616f, 0.648438f, + 0.153931f, 0.639160f, 0.150757f, 0.629395f, 0.147095f, 0.619141f, 0.143188f, 0.607910f, + 0.139771f, 0.592773f, 0.135498f, 0.578125f, 0.130981f, 0.563477f, 0.125244f, 0.547852f, + 0.119202f, 0.532227f, 0.112183f, 0.515625f, 0.104919f, 0.497559f, 0.097717f, 0.471680f, + 0.089905f, 0.445557f, 0.080811f, 0.417969f, 0.070679f, 0.388428f, 0.058960f, 0.354980f, + 0.047211f, 0.310059f, 0.034393f, 0.252441f, 0.018539f, 0.185547f, 0.003244f, 0.061188f, + 0.000000f, 1.000000f, 0.009888f, 0.994141f, 0.019958f, 0.985352f, 0.029358f, 0.975098f, + 0.038239f, 0.966309f, 0.048859f, 0.954102f, 0.056885f, 0.944824f, 0.065552f, 0.933594f, + 0.073547f, 0.923340f, 0.081238f, 0.914551f, 0.088806f, 0.903320f, 0.097168f, 0.892090f, + 0.103149f, 0.883789f, 0.109131f, 0.875488f, 0.117065f, 0.863770f, 0.123047f, 0.854004f, + 0.128418f, 0.845703f, 0.133179f, 0.837402f, 0.138794f, 0.828613f, 0.144409f, 0.818848f, + 0.148926f, 0.810059f, 0.153564f, 0.802246f, 0.157471f, 0.795410f, 0.160034f, 0.789062f, + 0.164307f, 0.779785f, 0.167603f, 0.771973f, 0.170044f, 0.765137f, 0.172607f, 0.758789f, + 0.174316f, 0.752930f, 0.176514f, 0.747559f, 0.177368f, 0.740234f, 0.179077f, 0.732910f, + 0.180664f, 0.725586f, 0.181396f, 0.718750f, 0.181396f, 0.712402f, 0.181885f, 0.706543f, + 0.180786f, 0.700195f, 0.179810f, 0.694336f, 0.179077f, 0.685547f, 0.178833f, 0.676270f, + 0.177734f, 0.667969f, 0.175659f, 0.659180f, 0.173462f, 0.650879f, 0.171143f, 0.642578f, + 0.167725f, 0.634277f, 0.163940f, 0.624512f, 0.161255f, 0.611816f, 0.158081f, 0.599609f, + 0.153320f, 0.586426f, 0.148438f, 0.573242f, 0.143188f, 0.560059f, 0.136230f, 0.545898f, + 0.129883f, 0.531250f, 0.122375f, 0.512695f, 0.115662f, 0.490967f, 0.107544f, 0.467529f, + 0.098450f, 0.443115f, 0.088379f, 0.417236f, 0.076660f, 0.388184f, 0.064453f, 0.355713f, + 0.051910f, 0.307373f, 0.037720f, 0.252930f, 0.020309f, 0.187012f, 0.003546f, 0.060883f, + 0.000000f, 1.000000f, 0.010391f, 0.994141f, 0.021210f, 0.985352f, 0.032745f, 0.974121f, + 0.042908f, 0.962891f, 0.053345f, 0.952148f, 0.062500f, 0.940918f, 0.072205f, 0.929688f, + 0.080505f, 0.920410f, 0.090271f, 0.907227f, 0.097961f, 0.897461f, 0.105774f, 0.887695f, + 0.114502f, 0.876465f, 0.121704f, 0.865723f, 0.128662f, 0.855957f, 0.134521f, 0.847656f, + 0.140625f, 0.837402f, 0.146851f, 0.827148f, 0.153076f, 0.817871f, 0.157959f, 0.809570f, + 0.162964f, 0.802246f, 0.167480f, 0.793457f, 0.172241f, 0.784180f, 0.175903f, 0.776367f, + 0.180054f, 0.768555f, 0.183228f, 0.761719f, 0.185791f, 0.755371f, 0.188232f, 0.748535f, + 0.191162f, 0.740723f, 0.192871f, 0.734375f, 0.195679f, 0.727539f, 0.195801f, 0.721680f, + 0.196777f, 0.715820f, 0.197510f, 0.709961f, 0.197388f, 0.704590f, 0.197021f, 0.696777f, + 0.197632f, 0.688965f, 0.197266f, 0.681641f, 0.196411f, 0.674316f, 0.194946f, 0.666992f, + 0.193604f, 0.659668f, 0.191162f, 0.652832f, 0.188110f, 0.645508f, 0.185913f, 0.636230f, + 0.182983f, 0.625488f, 0.179443f, 0.615234f, 0.176025f, 0.604492f, 0.171753f, 0.593750f, + 0.166138f, 0.582031f, 0.161011f, 0.570312f, 0.154907f, 0.557617f, 0.148071f, 0.543945f, + 0.141357f, 0.524902f, 0.134033f, 0.505859f, 0.125977f, 0.486084f, 0.117004f, 0.464844f, + 0.106873f, 0.441650f, 0.095703f, 0.416748f, 0.083252f, 0.388916f, 0.070435f, 0.349854f, + 0.056671f, 0.305908f, 0.040863f, 0.253662f, 0.021820f, 0.188477f, 0.003828f, 0.060883f, + 0.000000f, 1.000000f, 0.012199f, 0.992676f, 0.024460f, 0.982910f, 0.035431f, 0.972168f, + 0.047913f, 0.960449f, 0.058899f, 0.948730f, 0.069214f, 0.937500f, 0.079407f, 0.925781f, + 0.089722f, 0.913574f, 0.098389f, 0.903320f, 0.107483f, 0.891602f, 0.116760f, 0.879883f, + 0.124756f, 0.869629f, 0.131836f, 0.859863f, 0.140503f, 0.848145f, 0.147949f, 0.837891f, + 0.154785f, 0.828125f, 0.160400f, 0.819336f, 0.166992f, 0.809570f, 0.172974f, 0.799316f, + 0.178345f, 0.790527f, 0.183105f, 0.782227f, 0.186890f, 0.774902f, 0.191162f, 0.767578f, + 0.195435f, 0.758789f, 0.199951f, 0.750000f, 0.202515f, 0.742676f, 0.205566f, 0.735352f, + 0.207886f, 0.729004f, 0.209595f, 0.723145f, 0.210449f, 0.717773f, 0.213257f, 0.710938f, + 0.213989f, 0.704102f, 0.214722f, 0.697266f, 0.215088f, 0.690918f, 0.215332f, 0.685059f, + 0.215088f, 0.678711f, 0.213867f, 0.672852f, 0.212280f, 0.666504f, 0.210693f, 0.661133f, + 0.209106f, 0.651855f, 0.207520f, 0.644043f, 0.204834f, 0.635254f, 0.202148f, 0.626953f, + 0.198486f, 0.617676f, 0.194946f, 0.608398f, 0.190552f, 0.598633f, 0.185181f, 0.588379f, + 0.179443f, 0.577637f, 0.173584f, 0.564941f, 0.167969f, 0.550293f, 0.160767f, 0.535156f, + 0.154175f, 0.519043f, 0.145386f, 0.501953f, 0.136597f, 0.483643f, 0.126465f, 0.463379f, + 0.114807f, 0.441406f, 0.102905f, 0.417236f, 0.090820f, 0.384766f, 0.076904f, 0.347168f, + 0.061798f, 0.305420f, 0.043976f, 0.254150f, 0.023560f, 0.189575f, 0.004086f, 0.060669f, + 0.000000f, 1.000000f, 0.013603f, 0.992676f, 0.026031f, 0.982422f, 0.039551f, 0.970703f, + 0.052856f, 0.958008f, 0.064270f, 0.945801f, 0.076294f, 0.933105f, 0.087158f, 0.921875f, + 0.097717f, 0.908691f, 0.108765f, 0.896484f, 0.117859f, 0.885254f, 0.128052f, 0.873047f, + 0.136353f, 0.861816f, 0.145264f, 0.851562f, 0.153564f, 0.840820f, 0.160889f, 0.829102f, + 0.168213f, 0.818848f, 0.174927f, 0.809082f, 0.181885f, 0.799316f, 0.187744f, 0.790527f, + 0.193726f, 0.780273f, 0.199341f, 0.771484f, 0.203613f, 0.762695f, 0.207886f, 0.754883f, + 0.212280f, 0.747070f, 0.215332f, 0.740234f, 0.219849f, 0.731934f, 0.223267f, 0.724121f, + 0.225830f, 0.717285f, 0.227417f, 0.710449f, 0.229248f, 0.704590f, 0.230347f, 0.698730f, + 0.231445f, 0.692871f, 0.231445f, 0.687500f, 0.232056f, 0.681641f, 0.231934f, 0.674805f, + 0.231201f, 0.668457f, 0.230835f, 0.661621f, 0.229858f, 0.654785f, 0.228394f, 0.647949f, + 0.226440f, 0.640625f, 0.224365f, 0.634277f, 0.221436f, 0.626953f, 0.217041f, 0.619141f, + 0.213623f, 0.610840f, 0.209473f, 0.602051f, 0.204712f, 0.591309f, 0.200073f, 0.581055f, + 0.194702f, 0.569336f, 0.188599f, 0.557129f, 0.181274f, 0.543945f, 0.173828f, 0.530273f, + 0.165649f, 0.515137f, 0.156250f, 0.499268f, 0.146484f, 0.482178f, 0.135376f, 0.462891f, + 0.124146f, 0.438477f, 0.111877f, 0.412109f, 0.098328f, 0.381348f, 0.083130f, 0.346191f, + 0.066162f, 0.305664f, 0.047180f, 0.255615f, 0.025009f, 0.190796f, 0.004433f, 0.061157f, + 0.000000f, 1.000000f, 0.015060f, 0.991699f, 0.029160f, 0.981445f, 0.043610f, 0.968750f, + 0.057648f, 0.955566f, 0.071167f, 0.942383f, 0.083618f, 0.929688f, 0.095642f, 0.916016f, + 0.108215f, 0.903320f, 0.117920f, 0.891602f, 0.129883f, 0.877930f, 0.139404f, 0.866211f, + 0.148560f, 0.854492f, 0.157837f, 0.843750f, 0.166382f, 0.832031f, 0.175171f, 0.820801f, + 0.182983f, 0.810059f, 0.190186f, 0.799805f, 0.196289f, 0.790039f, 0.202271f, 0.780273f, + 0.209106f, 0.770020f, 0.214966f, 0.760742f, 0.220215f, 0.751465f, 0.225220f, 0.743164f, + 0.229492f, 0.734863f, 0.233643f, 0.726562f, 0.236816f, 0.719727f, 0.240479f, 0.712402f, + 0.243042f, 0.704590f, 0.245728f, 0.697754f, 0.247070f, 0.690918f, 0.249023f, 0.684570f, + 0.250488f, 0.679199f, 0.250732f, 0.673340f, 0.250488f, 0.667969f, 0.250732f, 0.662109f, + 0.249634f, 0.656738f, 0.248657f, 0.650879f, 0.247681f, 0.645020f, 0.245850f, 0.638184f, + 0.243896f, 0.631836f, 0.240601f, 0.624023f, 0.237915f, 0.617188f, 0.234009f, 0.609375f, + 0.230469f, 0.601074f, 0.226196f, 0.592773f, 0.221069f, 0.583496f, 0.214844f, 0.574219f, + 0.209595f, 0.563965f, 0.202271f, 0.552734f, 0.194824f, 0.541016f, 0.186279f, 0.527832f, + 0.177490f, 0.512207f, 0.168091f, 0.495850f, 0.157349f, 0.477539f, 0.145752f, 0.457031f, + 0.134033f, 0.434570f, 0.120422f, 0.409180f, 0.105530f, 0.380127f, 0.089111f, 0.346436f, + 0.071106f, 0.306641f, 0.050690f, 0.257324f, 0.027359f, 0.186646f, 0.004692f, 0.061188f, + 0.000000f, 1.000000f, 0.016144f, 0.991699f, 0.032501f, 0.979004f, 0.048553f, 0.965332f, + 0.063599f, 0.951660f, 0.077332f, 0.938965f, 0.092041f, 0.923828f, 0.105225f, 0.910645f, + 0.117493f, 0.896973f, 0.130371f, 0.883301f, 0.141113f, 0.870605f, 0.152344f, 0.857910f, + 0.162231f, 0.845703f, 0.172363f, 0.833496f, 0.181885f, 0.821777f, 0.190674f, 0.810059f, + 0.198364f, 0.799316f, 0.206909f, 0.788086f, 0.213257f, 0.778320f, 0.220947f, 0.768066f, + 0.226440f, 0.758789f, 0.232666f, 0.749023f, 0.237305f, 0.740234f, 0.242798f, 0.730957f, + 0.247314f, 0.722656f, 0.251465f, 0.714355f, 0.255615f, 0.706543f, 0.258789f, 0.699219f, + 0.261719f, 0.691895f, 0.264404f, 0.685059f, 0.266113f, 0.678711f, 0.267334f, 0.672363f, + 0.268311f, 0.666992f, 0.269287f, 0.661133f, 0.268799f, 0.656250f, 0.268799f, 0.650391f, + 0.268311f, 0.645020f, 0.266602f, 0.639648f, 0.265381f, 0.633789f, 0.263672f, 0.627930f, + 0.260498f, 0.621582f, 0.257812f, 0.615234f, 0.254639f, 0.608398f, 0.250488f, 0.601562f, + 0.246582f, 0.593750f, 0.241455f, 0.585449f, 0.235840f, 0.576660f, 0.230103f, 0.567383f, + 0.223511f, 0.557617f, 0.216187f, 0.546387f, 0.208496f, 0.534668f, 0.200073f, 0.521973f, + 0.190063f, 0.507324f, 0.179810f, 0.491699f, 0.168457f, 0.474121f, 0.156372f, 0.455078f, + 0.142822f, 0.433350f, 0.128418f, 0.408447f, 0.112305f, 0.380127f, 0.094971f, 0.346680f, + 0.075867f, 0.306885f, 0.054291f, 0.255615f, 0.029739f, 0.184692f, 0.005028f, 0.062134f, + 0.000000f, 1.000000f, 0.017303f, 0.991211f, 0.034760f, 0.978516f, 0.050659f, 0.965332f, + 0.066528f, 0.951172f, 0.081360f, 0.937012f, 0.096375f, 0.922363f, 0.109497f, 0.908691f, + 0.122620f, 0.894531f, 0.135376f, 0.880859f, 0.148071f, 0.867188f, 0.158325f, 0.854492f, + 0.169922f, 0.841309f, 0.179565f, 0.829102f, 0.189697f, 0.816895f, 0.198242f, 0.805664f, + 0.207397f, 0.793945f, 0.216675f, 0.782715f, 0.221802f, 0.772949f, 0.230469f, 0.761719f, + 0.237183f, 0.751953f, 0.242676f, 0.742188f, 0.248535f, 0.733398f, 0.254395f, 0.724121f, + 0.258789f, 0.715332f, 0.263916f, 0.707031f, 0.267334f, 0.698730f, 0.270752f, 0.690918f, + 0.273926f, 0.684082f, 0.276611f, 0.676758f, 0.278809f, 0.669922f, 0.280273f, 0.664062f, + 0.281738f, 0.657715f, 0.281982f, 0.652344f, 0.283203f, 0.646484f, 0.281982f, 0.641602f, + 0.282227f, 0.635742f, 0.281494f, 0.630371f, 0.279541f, 0.625000f, 0.278076f, 0.619141f, + 0.275146f, 0.613281f, 0.272949f, 0.606934f, 0.269043f, 0.600586f, 0.265381f, 0.593750f, + 0.260986f, 0.586426f, 0.255859f, 0.578125f, 0.251465f, 0.570312f, 0.244995f, 0.561035f, + 0.238647f, 0.551270f, 0.231812f, 0.541016f, 0.223389f, 0.529297f, 0.214233f, 0.516602f, + 0.204712f, 0.502441f, 0.195190f, 0.487305f, 0.183350f, 0.470459f, 0.171021f, 0.451172f, + 0.157471f, 0.429688f, 0.142334f, 0.405029f, 0.125977f, 0.377197f, 0.107971f, 0.343750f, + 0.088074f, 0.304199f, 0.065125f, 0.253662f, 0.038574f, 0.183838f, 0.008568f, 0.066162f, + 0.000000f, 1.000000f, 0.017303f, 0.991211f, 0.034607f, 0.978516f, 0.050690f, 0.965332f, + 0.066711f, 0.951172f, 0.081970f, 0.936523f, 0.096313f, 0.922363f, 0.110413f, 0.907715f, + 0.123901f, 0.893555f, 0.136475f, 0.880371f, 0.148682f, 0.866699f, 0.159546f, 0.854004f, + 0.170410f, 0.840820f, 0.181519f, 0.828125f, 0.192017f, 0.815430f, 0.201050f, 0.804199f, + 0.209717f, 0.792480f, 0.218018f, 0.781250f, 0.226196f, 0.770508f, 0.233032f, 0.760254f, + 0.240723f, 0.749512f, 0.247559f, 0.739746f, 0.253174f, 0.729980f, 0.258545f, 0.721191f, + 0.263916f, 0.711914f, 0.268311f, 0.703613f, 0.273438f, 0.695312f, 0.277344f, 0.687012f, + 0.280029f, 0.679688f, 0.282959f, 0.672363f, 0.286133f, 0.665039f, 0.288086f, 0.658691f, + 0.289551f, 0.652832f, 0.290283f, 0.646484f, 0.291504f, 0.641113f, 0.291992f, 0.635742f, + 0.291992f, 0.629883f, 0.291260f, 0.624023f, 0.290039f, 0.618652f, 0.288818f, 0.612305f, + 0.286865f, 0.606445f, 0.284668f, 0.600098f, 0.281494f, 0.594238f, 0.278809f, 0.586426f, + 0.274414f, 0.579590f, 0.270752f, 0.571289f, 0.265625f, 0.563477f, 0.260010f, 0.553711f, + 0.254639f, 0.544434f, 0.247681f, 0.533691f, 0.240479f, 0.522461f, 0.231934f, 0.510254f, + 0.222778f, 0.496338f, 0.212891f, 0.481201f, 0.202148f, 0.464600f, 0.190186f, 0.446045f, + 0.177002f, 0.424561f, 0.162964f, 0.400879f, 0.146484f, 0.373047f, 0.128052f, 0.340088f, + 0.108032f, 0.301758f, 0.083984f, 0.251709f, 0.054810f, 0.182495f, 0.018692f, 0.068237f, + 0.000000f, 1.000000f, 0.017197f, 0.991211f, 0.034637f, 0.978516f, 0.051056f, 0.965332f, + 0.066589f, 0.951172f, 0.082703f, 0.936035f, 0.096252f, 0.922363f, 0.111145f, 0.907715f, + 0.124268f, 0.894043f, 0.136963f, 0.879883f, 0.149414f, 0.866211f, 0.161987f, 0.853027f, + 0.172363f, 0.839844f, 0.182861f, 0.827148f, 0.192627f, 0.814941f, 0.202759f, 0.802734f, + 0.211670f, 0.791016f, 0.221558f, 0.779297f, 0.229126f, 0.768555f, 0.237183f, 0.757812f, + 0.244141f, 0.747070f, 0.251221f, 0.737305f, 0.257568f, 0.727539f, 0.263184f, 0.718262f, + 0.268799f, 0.708984f, 0.273682f, 0.700195f, 0.278564f, 0.691406f, 0.282715f, 0.683594f, + 0.286865f, 0.675293f, 0.289551f, 0.667969f, 0.293213f, 0.660645f, 0.295898f, 0.653320f, + 0.298096f, 0.646973f, 0.299072f, 0.641113f, 0.300293f, 0.635254f, 0.301270f, 0.629395f, + 0.301514f, 0.624023f, 0.301514f, 0.617188f, 0.300781f, 0.611816f, 0.299805f, 0.605957f, + 0.298584f, 0.599609f, 0.296875f, 0.593262f, 0.294434f, 0.586426f, 0.291748f, 0.579102f, + 0.288818f, 0.572266f, 0.284668f, 0.563965f, 0.280029f, 0.556152f, 0.275879f, 0.546875f, + 0.269531f, 0.537109f, 0.264160f, 0.526855f, 0.256348f, 0.515625f, 0.250000f, 0.503418f, + 0.241333f, 0.489746f, 0.231567f, 0.474365f, 0.221436f, 0.458496f, 0.210083f, 0.439697f, + 0.197388f, 0.419189f, 0.183105f, 0.395508f, 0.167847f, 0.368896f, 0.149902f, 0.336426f, + 0.129272f, 0.297852f, 0.104980f, 0.248901f, 0.074402f, 0.180786f, 0.032623f, 0.065308f, + 0.000000f, 1.000000f, 0.017410f, 0.991211f, 0.034210f, 0.979004f, 0.050873f, 0.965332f, + 0.066772f, 0.951172f, 0.082520f, 0.936035f, 0.097351f, 0.921875f, 0.111328f, 0.907715f, + 0.124817f, 0.893555f, 0.137817f, 0.879395f, 0.150757f, 0.865723f, 0.162598f, 0.852539f, + 0.174316f, 0.839355f, 0.185303f, 0.825684f, 0.195312f, 0.813477f, 0.205444f, 0.801270f, + 0.215088f, 0.789551f, 0.224121f, 0.778320f, 0.231323f, 0.767090f, 0.240601f, 0.755859f, + 0.248047f, 0.745117f, 0.254395f, 0.734863f, 0.261230f, 0.725098f, 0.267090f, 0.715332f, + 0.273682f, 0.706055f, 0.279053f, 0.696777f, 0.283691f, 0.687988f, 0.288330f, 0.679688f, + 0.293213f, 0.670898f, 0.297119f, 0.663086f, 0.300049f, 0.655762f, 0.303711f, 0.648438f, + 0.306152f, 0.641602f, 0.308350f, 0.634766f, 0.309570f, 0.628906f, 0.311035f, 0.622559f, + 0.311035f, 0.617188f, 0.312012f, 0.610840f, 0.312012f, 0.604492f, 0.311768f, 0.598633f, + 0.310791f, 0.592285f, 0.309570f, 0.585938f, 0.307617f, 0.579102f, 0.305664f, 0.572266f, + 0.302490f, 0.564453f, 0.298828f, 0.556641f, 0.296143f, 0.548340f, 0.291260f, 0.539551f, + 0.286377f, 0.529297f, 0.281494f, 0.519531f, 0.274658f, 0.507812f, 0.268066f, 0.495850f, + 0.260498f, 0.482422f, 0.250732f, 0.467285f, 0.241821f, 0.451172f, 0.230957f, 0.432617f, + 0.219360f, 0.411621f, 0.205322f, 0.388672f, 0.189941f, 0.361816f, 0.172119f, 0.330322f, + 0.152100f, 0.293213f, 0.127319f, 0.244873f, 0.095825f, 0.178711f, 0.049957f, 0.065735f, + 0.000000f, 1.000000f, 0.017456f, 0.991211f, 0.034058f, 0.979004f, 0.050537f, 0.965332f, + 0.066895f, 0.951172f, 0.082397f, 0.936523f, 0.097656f, 0.921875f, 0.111877f, 0.907715f, + 0.125488f, 0.893066f, 0.139038f, 0.878906f, 0.151611f, 0.865234f, 0.164062f, 0.851562f, + 0.175293f, 0.838379f, 0.186401f, 0.825195f, 0.197266f, 0.812500f, 0.207886f, 0.799805f, + 0.217163f, 0.788086f, 0.225586f, 0.776367f, 0.234985f, 0.765137f, 0.243774f, 0.753418f, + 0.251709f, 0.743164f, 0.258301f, 0.732422f, 0.266357f, 0.721680f, 0.272461f, 0.711914f, + 0.278320f, 0.702637f, 0.284424f, 0.693359f, 0.289551f, 0.684082f, 0.295410f, 0.675293f, + 0.300293f, 0.666992f, 0.303223f, 0.658691f, 0.306885f, 0.650879f, 0.310791f, 0.643066f, + 0.312988f, 0.636230f, 0.316406f, 0.628906f, 0.318604f, 0.622070f, 0.320068f, 0.616211f, + 0.322021f, 0.609863f, 0.323242f, 0.603516f, 0.322998f, 0.597168f, 0.323486f, 0.590820f, + 0.323486f, 0.583984f, 0.321777f, 0.578125f, 0.321533f, 0.570801f, 0.320312f, 0.563477f, + 0.317383f, 0.555664f, 0.315674f, 0.548340f, 0.311279f, 0.539551f, 0.308594f, 0.530273f, + 0.303467f, 0.520508f, 0.298584f, 0.510254f, 0.292969f, 0.499512f, 0.286377f, 0.487549f, + 0.279541f, 0.474609f, 0.271240f, 0.459961f, 0.262207f, 0.443359f, 0.251953f, 0.426270f, + 0.240967f, 0.406006f, 0.227417f, 0.383301f, 0.212891f, 0.357422f, 0.195557f, 0.326172f, + 0.175781f, 0.289551f, 0.150757f, 0.242554f, 0.118347f, 0.176025f, 0.069946f, 0.064331f, + 0.000000f, 1.000000f, 0.017212f, 0.991211f, 0.034332f, 0.979004f, 0.050720f, 0.965332f, + 0.067261f, 0.950684f, 0.083008f, 0.936035f, 0.097900f, 0.921387f, 0.112122f, 0.907715f, + 0.126099f, 0.893066f, 0.139648f, 0.878418f, 0.152710f, 0.864258f, 0.164917f, 0.851074f, + 0.177246f, 0.836914f, 0.187500f, 0.824707f, 0.199219f, 0.811035f, 0.209229f, 0.798828f, + 0.219604f, 0.786621f, 0.229004f, 0.774414f, 0.238525f, 0.762695f, 0.246704f, 0.751465f, + 0.255371f, 0.740234f, 0.262207f, 0.729980f, 0.270264f, 0.719238f, 0.278076f, 0.708984f, + 0.284424f, 0.698730f, 0.289795f, 0.689453f, 0.296143f, 0.680176f, 0.301270f, 0.670898f, + 0.304932f, 0.662598f, 0.311035f, 0.653809f, 0.315430f, 0.645508f, 0.318848f, 0.637695f, + 0.323242f, 0.629395f, 0.326904f, 0.621582f, 0.329102f, 0.614746f, 0.330322f, 0.608398f, + 0.333008f, 0.601562f, 0.333984f, 0.595703f, 0.334961f, 0.588867f, 0.335693f, 0.582520f, + 0.335938f, 0.576172f, 0.335449f, 0.569336f, 0.333984f, 0.562500f, 0.333496f, 0.555664f, + 0.332520f, 0.547852f, 0.329346f, 0.540039f, 0.326904f, 0.531250f, 0.324219f, 0.521973f, + 0.320312f, 0.513184f, 0.315918f, 0.502930f, 0.311279f, 0.492188f, 0.304932f, 0.479980f, + 0.298828f, 0.467529f, 0.291504f, 0.452881f, 0.282471f, 0.437012f, 0.273926f, 0.419189f, + 0.262207f, 0.399170f, 0.250244f, 0.376953f, 0.236206f, 0.351318f, 0.220337f, 0.321045f, + 0.199829f, 0.284668f, 0.175781f, 0.238403f, 0.143066f, 0.173706f, 0.092285f, 0.063904f, + 0.000000f, 1.000000f, 0.017197f, 0.991211f, 0.034607f, 0.978516f, 0.050629f, 0.965332f, + 0.067017f, 0.951172f, 0.083618f, 0.936035f, 0.098633f, 0.921387f, 0.112732f, 0.906738f, + 0.127319f, 0.892090f, 0.140503f, 0.877930f, 0.153442f, 0.863770f, 0.166260f, 0.850098f, + 0.178223f, 0.836914f, 0.190186f, 0.823242f, 0.200928f, 0.810059f, 0.211914f, 0.797363f, + 0.221680f, 0.785156f, 0.231567f, 0.772461f, 0.242065f, 0.760742f, 0.250488f, 0.749023f, + 0.259277f, 0.737305f, 0.267334f, 0.726562f, 0.274902f, 0.715820f, 0.281250f, 0.705566f, + 0.289307f, 0.695312f, 0.296387f, 0.685059f, 0.302734f, 0.674805f, 0.308350f, 0.665527f, + 0.313721f, 0.656738f, 0.319580f, 0.647461f, 0.323975f, 0.639160f, 0.327393f, 0.631348f, + 0.332031f, 0.623047f, 0.335205f, 0.615723f, 0.337646f, 0.608398f, 0.340576f, 0.601562f, + 0.343262f, 0.594727f, 0.344482f, 0.588379f, 0.346191f, 0.582031f, 0.347656f, 0.574707f, + 0.347656f, 0.568359f, 0.347900f, 0.561523f, 0.348389f, 0.554688f, 0.346924f, 0.547363f, + 0.346924f, 0.539551f, 0.344482f, 0.531738f, 0.343018f, 0.523926f, 0.340820f, 0.514160f, + 0.336670f, 0.504883f, 0.333252f, 0.494629f, 0.328613f, 0.483887f, 0.324219f, 0.471436f, + 0.318115f, 0.458740f, 0.312012f, 0.444336f, 0.303467f, 0.429199f, 0.295410f, 0.411377f, + 0.285156f, 0.392090f, 0.273438f, 0.370117f, 0.260254f, 0.344971f, 0.244507f, 0.315674f, + 0.225342f, 0.280273f, 0.201660f, 0.234497f, 0.169434f, 0.170410f, 0.117493f, 0.062866f, + 0.000000f, 1.000000f, 0.017044f, 0.991211f, 0.034515f, 0.978516f, 0.051208f, 0.964844f, + 0.067200f, 0.950684f, 0.083496f, 0.936035f, 0.099304f, 0.920898f, 0.113525f, 0.906738f, + 0.127930f, 0.892090f, 0.141357f, 0.877441f, 0.154419f, 0.863281f, 0.167725f, 0.849121f, + 0.180298f, 0.835449f, 0.191528f, 0.821777f, 0.202515f, 0.809082f, 0.214233f, 0.795410f, + 0.224854f, 0.782715f, 0.235474f, 0.770508f, 0.244751f, 0.758301f, 0.254150f, 0.746094f, + 0.262695f, 0.734863f, 0.272705f, 0.723145f, 0.280518f, 0.711914f, 0.288330f, 0.701172f, + 0.295166f, 0.690918f, 0.301270f, 0.681152f, 0.309082f, 0.670898f, 0.315186f, 0.661133f, + 0.321045f, 0.651855f, 0.324951f, 0.643555f, 0.331787f, 0.634277f, 0.335938f, 0.625977f, + 0.339600f, 0.618164f, 0.343262f, 0.609863f, 0.347656f, 0.602051f, 0.350830f, 0.594727f, + 0.353271f, 0.588379f, 0.355469f, 0.581055f, 0.357178f, 0.574707f, 0.358887f, 0.567383f, + 0.360352f, 0.560547f, 0.361328f, 0.553711f, 0.361328f, 0.546387f, 0.361572f, 0.539062f, + 0.361572f, 0.530762f, 0.361084f, 0.522949f, 0.359375f, 0.514160f, 0.356689f, 0.504883f, + 0.354980f, 0.495850f, 0.350830f, 0.486084f, 0.347900f, 0.475098f, 0.344238f, 0.463379f, + 0.337891f, 0.450439f, 0.331787f, 0.437012f, 0.325195f, 0.421387f, 0.317383f, 0.404297f, + 0.309082f, 0.384766f, 0.297363f, 0.363037f, 0.285156f, 0.338623f, 0.269531f, 0.309326f, + 0.251709f, 0.274658f, 0.228149f, 0.230713f, 0.196655f, 0.167969f, 0.145020f, 0.062622f, + 0.000000f, 1.000000f, 0.016602f, 0.991699f, 0.034302f, 0.979004f, 0.051178f, 0.965332f, + 0.067322f, 0.950684f, 0.083618f, 0.936035f, 0.098694f, 0.921387f, 0.113586f, 0.906738f, + 0.128174f, 0.891602f, 0.142944f, 0.876465f, 0.155762f, 0.862793f, 0.169189f, 0.848145f, + 0.182007f, 0.833984f, 0.193604f, 0.820801f, 0.206299f, 0.806641f, 0.217285f, 0.793457f, + 0.228149f, 0.780762f, 0.238647f, 0.767578f, 0.249512f, 0.755371f, 0.257812f, 0.743652f, + 0.266602f, 0.731934f, 0.276123f, 0.720215f, 0.283203f, 0.709473f, 0.292725f, 0.698242f, + 0.300537f, 0.687500f, 0.307129f, 0.677246f, 0.314453f, 0.667480f, 0.321045f, 0.657227f, + 0.326660f, 0.647949f, 0.332764f, 0.638672f, 0.338379f, 0.629395f, 0.343018f, 0.620605f, + 0.347168f, 0.612793f, 0.353271f, 0.603516f, 0.357178f, 0.595703f, 0.359619f, 0.588379f, + 0.363525f, 0.581055f, 0.367188f, 0.573242f, 0.369385f, 0.566406f, 0.372070f, 0.559082f, + 0.372803f, 0.551758f, 0.375000f, 0.544434f, 0.375000f, 0.537598f, 0.376465f, 0.530273f, + 0.376465f, 0.521973f, 0.375977f, 0.514160f, 0.375000f, 0.505371f, 0.374268f, 0.497314f, + 0.372314f, 0.487549f, 0.369629f, 0.477783f, 0.366699f, 0.465820f, 0.363525f, 0.454590f, + 0.358398f, 0.441406f, 0.354004f, 0.427979f, 0.347168f, 0.412842f, 0.340088f, 0.396484f, + 0.331787f, 0.377686f, 0.321533f, 0.356201f, 0.309326f, 0.331787f, 0.296143f, 0.303711f, + 0.278320f, 0.269043f, 0.256104f, 0.226440f, 0.225586f, 0.165283f, 0.173584f, 0.061523f, + 0.000000f, 1.000000f, 0.016647f, 0.991699f, 0.033936f, 0.979004f, 0.050934f, 0.965332f, + 0.067566f, 0.950684f, 0.083801f, 0.936035f, 0.099915f, 0.920410f, 0.115051f, 0.905762f, + 0.129272f, 0.890625f, 0.143677f, 0.876465f, 0.157593f, 0.861328f, 0.170532f, 0.847168f, + 0.183716f, 0.833008f, 0.196289f, 0.818359f, 0.208740f, 0.805176f, 0.219238f, 0.791992f, + 0.230957f, 0.778320f, 0.241821f, 0.765625f, 0.251465f, 0.753418f, 0.261475f, 0.741211f, + 0.271240f, 0.729004f, 0.279785f, 0.717773f, 0.289795f, 0.706055f, 0.296875f, 0.695312f, + 0.305176f, 0.684570f, 0.312744f, 0.673828f, 0.319824f, 0.663574f, 0.327148f, 0.653320f, + 0.333496f, 0.643555f, 0.340332f, 0.633301f, 0.346436f, 0.624023f, 0.352051f, 0.614746f, + 0.357422f, 0.605957f, 0.362549f, 0.597168f, 0.366455f, 0.588867f, 0.370850f, 0.580566f, + 0.374268f, 0.572754f, 0.378174f, 0.565430f, 0.381104f, 0.558105f, 0.384277f, 0.551270f, + 0.385498f, 0.543945f, 0.386963f, 0.537109f, 0.389893f, 0.529297f, 0.389648f, 0.521484f, + 0.391357f, 0.513184f, 0.392090f, 0.504395f, 0.391602f, 0.496338f, 0.390869f, 0.487549f, + 0.388672f, 0.478027f, 0.387207f, 0.468018f, 0.385254f, 0.456787f, 0.382568f, 0.446289f, + 0.379150f, 0.433105f, 0.374268f, 0.418945f, 0.368652f, 0.404541f, 0.362549f, 0.387451f, + 0.354980f, 0.369629f, 0.345947f, 0.348389f, 0.336182f, 0.324707f, 0.322998f, 0.297119f, + 0.306152f, 0.263916f, 0.285889f, 0.221436f, 0.255859f, 0.161743f, 0.203735f, 0.060760f, + 0.000000f, 1.000000f, 0.016815f, 0.991699f, 0.034088f, 0.979004f, 0.051514f, 0.964844f, + 0.068787f, 0.950195f, 0.083984f, 0.936035f, 0.099487f, 0.920898f, 0.115906f, 0.904785f, + 0.129517f, 0.890625f, 0.144287f, 0.875488f, 0.158936f, 0.860352f, 0.172974f, 0.845215f, + 0.185669f, 0.831055f, 0.197876f, 0.817383f, 0.210449f, 0.803711f, 0.221802f, 0.790527f, + 0.232788f, 0.777344f, 0.244385f, 0.764160f, 0.254395f, 0.751465f, 0.264404f, 0.739258f, + 0.274658f, 0.727051f, 0.283936f, 0.715332f, 0.293457f, 0.703613f, 0.302490f, 0.691895f, + 0.310303f, 0.681152f, 0.318848f, 0.669922f, 0.326172f, 0.659180f, 0.334229f, 0.648438f, + 0.341309f, 0.638184f, 0.347656f, 0.628418f, 0.353760f, 0.618652f, 0.361328f, 0.608887f, + 0.366211f, 0.600098f, 0.370361f, 0.591309f, 0.375977f, 0.582520f, 0.381592f, 0.573730f, + 0.384766f, 0.565918f, 0.388672f, 0.558105f, 0.392822f, 0.550293f, 0.395996f, 0.542480f, + 0.399414f, 0.535156f, 0.401367f, 0.527832f, 0.403320f, 0.520020f, 0.405273f, 0.512207f, + 0.406250f, 0.504395f, 0.407227f, 0.495850f, 0.407959f, 0.487793f, 0.408447f, 0.478271f, + 0.407959f, 0.468994f, 0.406250f, 0.458496f, 0.405518f, 0.447754f, 0.402588f, 0.436523f, + 0.399902f, 0.423828f, 0.395752f, 0.410400f, 0.392578f, 0.395996f, 0.386475f, 0.379150f, + 0.379150f, 0.361328f, 0.372070f, 0.341064f, 0.361816f, 0.317383f, 0.349854f, 0.290527f, + 0.333984f, 0.258057f, 0.315430f, 0.216797f, 0.285889f, 0.158936f, 0.235107f, 0.058167f, + 0.000000f, 1.000000f, 0.016891f, 0.991699f, 0.034027f, 0.979004f, 0.051239f, 0.965332f, + 0.068054f, 0.950195f, 0.084473f, 0.935547f, 0.100037f, 0.920410f, 0.116028f, 0.904785f, + 0.131470f, 0.889160f, 0.145996f, 0.874023f, 0.160278f, 0.859375f, 0.173584f, 0.845215f, + 0.187744f, 0.830078f, 0.199829f, 0.816406f, 0.212646f, 0.802246f, 0.224365f, 0.789062f, + 0.236206f, 0.775391f, 0.246460f, 0.762695f, 0.257568f, 0.749512f, 0.268311f, 0.736816f, + 0.278564f, 0.724609f, 0.288574f, 0.712402f, 0.298828f, 0.700195f, 0.307617f, 0.687988f, + 0.315918f, 0.676758f, 0.324707f, 0.665527f, 0.333008f, 0.654785f, 0.340576f, 0.644043f, + 0.347656f, 0.633789f, 0.354004f, 0.623535f, 0.361572f, 0.613770f, 0.367920f, 0.604004f, + 0.374268f, 0.594238f, 0.380127f, 0.584961f, 0.386475f, 0.575684f, 0.392334f, 0.566406f, + 0.395996f, 0.558105f, 0.399658f, 0.549805f, 0.403809f, 0.541992f, 0.407715f, 0.534668f, + 0.411865f, 0.526855f, 0.414795f, 0.519043f, 0.417236f, 0.511230f, 0.420410f, 0.502930f, + 0.421631f, 0.494629f, 0.423828f, 0.486572f, 0.424072f, 0.478027f, 0.425293f, 0.468750f, + 0.424805f, 0.458984f, 0.424805f, 0.448730f, 0.424561f, 0.438232f, 0.421875f, 0.426758f, + 0.420410f, 0.414307f, 0.416748f, 0.401611f, 0.414795f, 0.386230f, 0.409912f, 0.370605f, + 0.403564f, 0.353027f, 0.396973f, 0.332764f, 0.387207f, 0.309814f, 0.376709f, 0.283203f, + 0.363037f, 0.250977f, 0.344727f, 0.211914f, 0.317139f, 0.154907f, 0.268311f, 0.057495f, + 0.000000f, 1.000000f, 0.016891f, 0.991699f, 0.034027f, 0.979004f, 0.051636f, 0.964844f, + 0.067871f, 0.950684f, 0.084351f, 0.935547f, 0.101257f, 0.919434f, 0.117004f, 0.904297f, + 0.132812f, 0.888672f, 0.147461f, 0.873047f, 0.161621f, 0.858398f, 0.175415f, 0.843750f, + 0.188232f, 0.829590f, 0.199951f, 0.816406f, 0.214233f, 0.801270f, 0.226318f, 0.787598f, + 0.237793f, 0.774414f, 0.250732f, 0.760254f, 0.261963f, 0.747559f, 0.271729f, 0.734375f, + 0.283447f, 0.721680f, 0.293213f, 0.708984f, 0.303467f, 0.697266f, 0.312500f, 0.685059f, + 0.321289f, 0.673340f, 0.330322f, 0.661621f, 0.338867f, 0.650879f, 0.346924f, 0.639648f, + 0.355957f, 0.628418f, 0.363281f, 0.618164f, 0.370117f, 0.607910f, 0.375977f, 0.598145f, + 0.383301f, 0.587891f, 0.390869f, 0.578125f, 0.395020f, 0.569336f, 0.401611f, 0.559570f, + 0.406982f, 0.550781f, 0.411621f, 0.541992f, 0.416504f, 0.534180f, 0.421143f, 0.525391f, + 0.425049f, 0.517578f, 0.429199f, 0.509277f, 0.431396f, 0.501465f, 0.434814f, 0.493408f, + 0.437500f, 0.485107f, 0.438965f, 0.476807f, 0.441895f, 0.467529f, 0.442627f, 0.458984f, + 0.442871f, 0.449219f, 0.443359f, 0.439453f, 0.443848f, 0.427979f, 0.443115f, 0.416992f, + 0.441650f, 0.404785f, 0.439209f, 0.392334f, 0.437012f, 0.376953f, 0.433594f, 0.361328f, + 0.427490f, 0.344238f, 0.422363f, 0.324463f, 0.414307f, 0.302002f, 0.405029f, 0.276611f, + 0.391846f, 0.244995f, 0.374756f, 0.206055f, 0.348633f, 0.151367f, 0.302490f, 0.056274f, + 0.000000f, 1.000000f, 0.016785f, 0.991699f, 0.034454f, 0.979004f, 0.051300f, 0.965332f, + 0.068359f, 0.950195f, 0.085144f, 0.934570f, 0.101685f, 0.918945f, 0.118408f, 0.902832f, + 0.133423f, 0.887695f, 0.148560f, 0.873047f, 0.161987f, 0.858398f, 0.176270f, 0.843750f, + 0.189941f, 0.829102f, 0.204346f, 0.813965f, 0.216919f, 0.799805f, 0.229126f, 0.786133f, + 0.241455f, 0.772461f, 0.252686f, 0.758301f, 0.265137f, 0.745117f, 0.276611f, 0.731445f, + 0.286865f, 0.718750f, 0.297607f, 0.706543f, 0.308105f, 0.693359f, 0.316650f, 0.682129f, + 0.326172f, 0.670410f, 0.336914f, 0.657715f, 0.345703f, 0.646484f, 0.353516f, 0.635254f, + 0.362549f, 0.624023f, 0.370605f, 0.613281f, 0.377686f, 0.602539f, 0.385254f, 0.592285f, + 0.392334f, 0.582031f, 0.398926f, 0.572266f, 0.405029f, 0.562500f, 0.410645f, 0.553223f, + 0.417725f, 0.542969f, 0.423584f, 0.534180f, 0.428467f, 0.525391f, 0.432861f, 0.517090f, + 0.438477f, 0.508301f, 0.443115f, 0.500000f, 0.446045f, 0.492432f, 0.449463f, 0.483887f, + 0.452881f, 0.475342f, 0.455078f, 0.467041f, 0.458740f, 0.457520f, 0.459717f, 0.448486f, + 0.460938f, 0.438965f, 0.462646f, 0.428711f, 0.463135f, 0.418457f, 0.464355f, 0.406982f, + 0.462891f, 0.394531f, 0.460693f, 0.382324f, 0.459473f, 0.367432f, 0.456299f, 0.352295f, + 0.453369f, 0.334473f, 0.448242f, 0.315674f, 0.441162f, 0.294189f, 0.433350f, 0.268799f, + 0.421387f, 0.238403f, 0.405518f, 0.200195f, 0.382080f, 0.146362f, 0.337402f, 0.054291f, + 0.000000f, 1.000000f, 0.016983f, 0.991211f, 0.034607f, 0.978516f, 0.051331f, 0.964844f, + 0.068726f, 0.950195f, 0.086365f, 0.934082f, 0.102539f, 0.918457f, 0.118408f, 0.902832f, + 0.134033f, 0.887695f, 0.147705f, 0.873535f, 0.163452f, 0.857910f, 0.177856f, 0.842773f, + 0.191406f, 0.828125f, 0.204712f, 0.813477f, 0.217651f, 0.798828f, 0.231689f, 0.784180f, + 0.244263f, 0.770020f, 0.256348f, 0.756348f, 0.267578f, 0.743164f, 0.280273f, 0.729492f, + 0.290527f, 0.716797f, 0.302002f, 0.703613f, 0.312012f, 0.690918f, 0.322754f, 0.678223f, + 0.333008f, 0.666016f, 0.342773f, 0.653809f, 0.352539f, 0.642090f, 0.360107f, 0.630371f, + 0.369141f, 0.619141f, 0.379150f, 0.607422f, 0.386475f, 0.596680f, 0.393555f, 0.586426f, + 0.401855f, 0.575684f, 0.409180f, 0.565430f, 0.416260f, 0.555176f, 0.422363f, 0.545410f, + 0.429443f, 0.535645f, 0.434326f, 0.526367f, 0.439941f, 0.517090f, 0.446045f, 0.507812f, + 0.451904f, 0.499268f, 0.455078f, 0.491455f, 0.461670f, 0.481934f, 0.464844f, 0.474365f, + 0.468262f, 0.465088f, 0.471680f, 0.456543f, 0.475098f, 0.447021f, 0.477783f, 0.438232f, + 0.479980f, 0.428467f, 0.482422f, 0.417969f, 0.483643f, 0.407471f, 0.483643f, 0.396240f, + 0.484131f, 0.385010f, 0.483643f, 0.371582f, 0.482666f, 0.357910f, 0.480469f, 0.342285f, + 0.478516f, 0.325684f, 0.473145f, 0.306641f, 0.468506f, 0.285156f, 0.460693f, 0.260986f, + 0.451660f, 0.231201f, 0.436768f, 0.194458f, 0.415283f, 0.141968f, 0.373047f, 0.053589f, + 0.000000f, 1.000000f, 0.016998f, 0.991211f, 0.034210f, 0.979004f, 0.052094f, 0.964355f, + 0.069275f, 0.949219f, 0.086426f, 0.933594f, 0.102783f, 0.918457f, 0.118774f, 0.902832f, + 0.134521f, 0.887695f, 0.149170f, 0.872559f, 0.164673f, 0.856934f, 0.178589f, 0.842285f, + 0.193604f, 0.826660f, 0.208252f, 0.811035f, 0.221802f, 0.796875f, 0.234985f, 0.782227f, + 0.246216f, 0.769043f, 0.259033f, 0.754883f, 0.272217f, 0.740234f, 0.283447f, 0.727539f, + 0.295898f, 0.713379f, 0.305908f, 0.700684f, 0.317139f, 0.687500f, 0.328125f, 0.674805f, + 0.338135f, 0.662109f, 0.347168f, 0.650391f, 0.358154f, 0.638184f, 0.367432f, 0.625977f, + 0.377686f, 0.614258f, 0.385254f, 0.603027f, 0.393555f, 0.591797f, 0.402100f, 0.580566f, + 0.411621f, 0.569824f, 0.419189f, 0.558594f, 0.425781f, 0.548340f, 0.432861f, 0.538086f, + 0.439941f, 0.528320f, 0.446777f, 0.518066f, 0.453369f, 0.508301f, 0.458252f, 0.499512f, + 0.464111f, 0.490479f, 0.469971f, 0.481201f, 0.475342f, 0.472412f, 0.479736f, 0.464111f, + 0.484375f, 0.455566f, 0.488281f, 0.445801f, 0.492188f, 0.437012f, 0.496094f, 0.427002f, + 0.498291f, 0.417725f, 0.501465f, 0.407227f, 0.503906f, 0.396484f, 0.504883f, 0.385742f, + 0.506348f, 0.373535f, 0.504883f, 0.361084f, 0.506348f, 0.347656f, 0.505371f, 0.332031f, + 0.503418f, 0.316162f, 0.500488f, 0.297363f, 0.495117f, 0.277344f, 0.489746f, 0.252686f, + 0.481934f, 0.224121f, 0.468018f, 0.187988f, 0.448242f, 0.137451f, 0.409912f, 0.051300f, + 0.000000f, 1.000000f, 0.016922f, 0.991211f, 0.034454f, 0.978516f, 0.052185f, 0.964355f, + 0.070251f, 0.948242f, 0.087158f, 0.933105f, 0.104004f, 0.917969f, 0.119263f, 0.902832f, + 0.135132f, 0.887695f, 0.150391f, 0.872070f, 0.166138f, 0.855957f, 0.180908f, 0.840820f, + 0.195557f, 0.825195f, 0.209229f, 0.810547f, 0.223511f, 0.795410f, 0.235962f, 0.781250f, + 0.250000f, 0.766602f, 0.263184f, 0.752441f, 0.274414f, 0.738281f, 0.287354f, 0.724609f, + 0.298584f, 0.710938f, 0.311279f, 0.697754f, 0.321777f, 0.684570f, 0.333008f, 0.671387f, + 0.344238f, 0.658203f, 0.354736f, 0.645508f, 0.364258f, 0.633789f, 0.374512f, 0.621094f, + 0.384033f, 0.609375f, 0.393555f, 0.597168f, 0.402100f, 0.585938f, 0.410889f, 0.574707f, + 0.418701f, 0.563965f, 0.427979f, 0.552246f, 0.436279f, 0.541504f, 0.444092f, 0.530762f, + 0.451416f, 0.520508f, 0.458008f, 0.510742f, 0.465820f, 0.500000f, 0.471680f, 0.490234f, + 0.478027f, 0.480957f, 0.484375f, 0.471680f, 0.489502f, 0.462402f, 0.494873f, 0.453369f, + 0.500000f, 0.444824f, 0.504883f, 0.435059f, 0.509766f, 0.425537f, 0.513672f, 0.416504f, + 0.517090f, 0.406250f, 0.520508f, 0.396484f, 0.522461f, 0.385986f, 0.525879f, 0.374756f, + 0.527344f, 0.363281f, 0.528809f, 0.350586f, 0.529297f, 0.336914f, 0.529785f, 0.322021f, + 0.528809f, 0.305420f, 0.525879f, 0.288086f, 0.522461f, 0.267578f, 0.518066f, 0.244263f, + 0.511230f, 0.216553f, 0.500000f, 0.181641f, 0.482910f, 0.132812f, 0.446777f, 0.049377f, + 0.000000f, 1.000000f, 0.016632f, 0.991699f, 0.034515f, 0.978516f, 0.051971f, 0.964355f, + 0.070496f, 0.948242f, 0.087646f, 0.933105f, 0.103149f, 0.918457f, 0.120117f, 0.902344f, + 0.135864f, 0.886719f, 0.151733f, 0.871094f, 0.167358f, 0.854980f, 0.182983f, 0.839355f, + 0.196411f, 0.824707f, 0.210815f, 0.809570f, 0.224854f, 0.794434f, 0.239380f, 0.779297f, + 0.252930f, 0.764648f, 0.265381f, 0.750488f, 0.277588f, 0.736328f, 0.291748f, 0.722168f, + 0.303955f, 0.708008f, 0.315430f, 0.694336f, 0.327148f, 0.680664f, 0.338135f, 0.667969f, + 0.349609f, 0.654785f, 0.361328f, 0.641602f, 0.370850f, 0.628906f, 0.380615f, 0.616699f, + 0.391357f, 0.604492f, 0.400879f, 0.592285f, 0.411377f, 0.580078f, 0.420654f, 0.568359f, + 0.429199f, 0.556641f, 0.436523f, 0.545898f, 0.445801f, 0.534668f, 0.453857f, 0.523926f, + 0.462402f, 0.512695f, 0.469482f, 0.502930f, 0.478027f, 0.491943f, 0.485107f, 0.481689f, + 0.491699f, 0.471436f, 0.498535f, 0.461670f, 0.504395f, 0.452393f, 0.510254f, 0.442627f, + 0.515625f, 0.433594f, 0.521973f, 0.424316f, 0.526367f, 0.414795f, 0.530762f, 0.405273f, + 0.535645f, 0.395020f, 0.539062f, 0.385254f, 0.543457f, 0.374268f, 0.546875f, 0.363037f, + 0.549316f, 0.351807f, 0.551758f, 0.339111f, 0.552734f, 0.326416f, 0.554199f, 0.311279f, + 0.554199f, 0.295410f, 0.553223f, 0.278076f, 0.551270f, 0.258545f, 0.548340f, 0.235718f, + 0.541992f, 0.208008f, 0.531738f, 0.175049f, 0.516113f, 0.127808f, 0.482422f, 0.047516f, + 0.000000f, 1.000000f, 0.016479f, 0.991699f, 0.034515f, 0.978516f, 0.053406f, 0.962891f, + 0.070190f, 0.948730f, 0.088135f, 0.933105f, 0.103577f, 0.918457f, 0.120361f, 0.902832f, + 0.136719f, 0.886230f, 0.152954f, 0.870117f, 0.168457f, 0.854492f, 0.184326f, 0.838867f, + 0.197754f, 0.823730f, 0.212769f, 0.808594f, 0.228760f, 0.792480f, 0.241699f, 0.778320f, + 0.255127f, 0.763184f, 0.269043f, 0.748535f, 0.282715f, 0.733887f, 0.294434f, 0.719727f, + 0.307861f, 0.705078f, 0.318848f, 0.691895f, 0.332031f, 0.678223f, 0.343994f, 0.664062f, + 0.354492f, 0.650879f, 0.367188f, 0.637695f, 0.376953f, 0.625000f, 0.389160f, 0.611816f, + 0.398926f, 0.599121f, 0.408691f, 0.586914f, 0.419922f, 0.574219f, 0.428955f, 0.562988f, + 0.437744f, 0.550781f, 0.446533f, 0.539062f, 0.455566f, 0.527832f, 0.466309f, 0.515625f, + 0.473145f, 0.505371f, 0.482422f, 0.493896f, 0.490234f, 0.483154f, 0.497070f, 0.472900f, + 0.505371f, 0.462158f, 0.511230f, 0.452393f, 0.519043f, 0.441650f, 0.524902f, 0.432373f, + 0.533203f, 0.422363f, 0.537598f, 0.413086f, 0.544922f, 0.403564f, 0.549316f, 0.393066f, + 0.555664f, 0.383057f, 0.559570f, 0.373047f, 0.564453f, 0.362305f, 0.568359f, 0.351562f, + 0.570312f, 0.340332f, 0.573730f, 0.327637f, 0.576660f, 0.314697f, 0.578613f, 0.299561f, + 0.579590f, 0.284668f, 0.579590f, 0.268311f, 0.580078f, 0.247925f, 0.577148f, 0.226807f, + 0.572754f, 0.200439f, 0.563965f, 0.167725f, 0.551270f, 0.123474f, 0.520020f, 0.045990f, + 0.000000f, 1.000000f, 0.016113f, 0.992188f, 0.034698f, 0.978516f, 0.053680f, 0.962891f, + 0.071106f, 0.948242f, 0.087952f, 0.933105f, 0.103760f, 0.918457f, 0.120850f, 0.902344f, + 0.137939f, 0.885742f, 0.154175f, 0.869629f, 0.169434f, 0.854004f, 0.184814f, 0.838379f, + 0.200317f, 0.822754f, 0.216064f, 0.806641f, 0.229492f, 0.791504f, 0.244385f, 0.776367f, + 0.258789f, 0.761230f, 0.271729f, 0.746582f, 0.285889f, 0.731934f, 0.298584f, 0.717285f, + 0.311279f, 0.702637f, 0.324951f, 0.688477f, 0.337402f, 0.674316f, 0.348877f, 0.660645f, + 0.360840f, 0.647461f, 0.373047f, 0.633301f, 0.384277f, 0.620117f, 0.394043f, 0.607422f, + 0.406250f, 0.594238f, 0.416504f, 0.581543f, 0.427734f, 0.568848f, 0.437988f, 0.556641f, + 0.448730f, 0.543945f, 0.457031f, 0.532227f, 0.466553f, 0.520508f, 0.476562f, 0.508301f, + 0.485840f, 0.497070f, 0.493896f, 0.486084f, 0.502441f, 0.474854f, 0.510254f, 0.463867f, + 0.518555f, 0.453369f, 0.527344f, 0.441650f, 0.533691f, 0.431885f, 0.541992f, 0.421143f, + 0.548340f, 0.411133f, 0.555176f, 0.401367f, 0.561035f, 0.391602f, 0.568359f, 0.381592f, + 0.572266f, 0.371582f, 0.578613f, 0.360840f, 0.583496f, 0.350586f, 0.589844f, 0.339355f, + 0.593262f, 0.327393f, 0.596680f, 0.315430f, 0.600098f, 0.302490f, 0.602539f, 0.288818f, + 0.605469f, 0.273438f, 0.606934f, 0.256836f, 0.606934f, 0.238281f, 0.604980f, 0.217285f, + 0.604004f, 0.191895f, 0.597168f, 0.160522f, 0.584961f, 0.117798f, 0.556641f, 0.044098f, + 0.000000f, 1.000000f, 0.016373f, 0.991699f, 0.034668f, 0.978516f, 0.053589f, 0.963379f, + 0.070435f, 0.949219f, 0.087769f, 0.933594f, 0.104797f, 0.917480f, 0.122681f, 0.900879f, + 0.138794f, 0.885254f, 0.153687f, 0.870117f, 0.170044f, 0.853516f, 0.186768f, 0.836914f, + 0.202271f, 0.821289f, 0.217651f, 0.805664f, 0.231812f, 0.790039f, 0.246704f, 0.774414f, + 0.260254f, 0.759766f, 0.275391f, 0.744141f, 0.288574f, 0.729492f, 0.303467f, 0.714355f, + 0.315186f, 0.700195f, 0.329590f, 0.685547f, 0.341064f, 0.671387f, 0.354736f, 0.657227f, + 0.366455f, 0.643066f, 0.379639f, 0.629395f, 0.391846f, 0.615723f, 0.402344f, 0.602539f, + 0.413330f, 0.589355f, 0.424805f, 0.576172f, 0.434570f, 0.563477f, 0.445557f, 0.550781f, + 0.457031f, 0.538086f, 0.466553f, 0.525879f, 0.477295f, 0.513184f, 0.486816f, 0.501465f, + 0.496094f, 0.489502f, 0.505859f, 0.477539f, 0.515625f, 0.465820f, 0.523926f, 0.454834f, + 0.532715f, 0.443359f, 0.540527f, 0.432617f, 0.548828f, 0.421631f, 0.557129f, 0.410645f, + 0.564453f, 0.400146f, 0.572266f, 0.389404f, 0.579590f, 0.379395f, 0.585449f, 0.369873f, + 0.592285f, 0.359619f, 0.598633f, 0.348389f, 0.604980f, 0.337891f, 0.609375f, 0.326904f, + 0.615723f, 0.315186f, 0.619141f, 0.303223f, 0.623535f, 0.290283f, 0.627930f, 0.276855f, + 0.631348f, 0.262207f, 0.633789f, 0.246460f, 0.634766f, 0.227783f, 0.634277f, 0.207397f, + 0.633301f, 0.182617f, 0.627930f, 0.153076f, 0.618652f, 0.112427f, 0.597168f, 0.042389f, + 0.000000f, 1.000000f, 0.016586f, 0.991699f, 0.035858f, 0.977051f, 0.053131f, 0.963867f, + 0.070496f, 0.949219f, 0.088135f, 0.933105f, 0.105225f, 0.917480f, 0.122559f, 0.900879f, + 0.139160f, 0.884766f, 0.156372f, 0.868652f, 0.172485f, 0.852051f, 0.187988f, 0.836426f, + 0.203735f, 0.820801f, 0.219604f, 0.804199f, 0.234985f, 0.788574f, 0.248535f, 0.773438f, + 0.264648f, 0.757324f, 0.278809f, 0.742188f, 0.293213f, 0.726562f, 0.306885f, 0.711914f, + 0.321045f, 0.696777f, 0.333252f, 0.682617f, 0.346924f, 0.667969f, 0.360107f, 0.653320f, + 0.372314f, 0.639160f, 0.385742f, 0.625000f, 0.396484f, 0.611816f, 0.409424f, 0.597656f, + 0.421143f, 0.584473f, 0.433838f, 0.570312f, 0.444336f, 0.557617f, 0.456299f, 0.544434f, + 0.466553f, 0.531738f, 0.477295f, 0.519043f, 0.488037f, 0.506348f, 0.498779f, 0.493652f, + 0.508301f, 0.481689f, 0.519043f, 0.469238f, 0.527832f, 0.457520f, 0.538086f, 0.445312f, + 0.544922f, 0.434326f, 0.555664f, 0.422607f, 0.564453f, 0.411133f, 0.572266f, 0.400146f, + 0.581543f, 0.388672f, 0.588379f, 0.378418f, 0.596680f, 0.367432f, 0.603516f, 0.357178f, + 0.611328f, 0.346436f, 0.618652f, 0.336182f, 0.624023f, 0.324951f, 0.631348f, 0.313965f, + 0.637695f, 0.302246f, 0.642090f, 0.290771f, 0.646973f, 0.278076f, 0.652344f, 0.264648f, + 0.656738f, 0.250244f, 0.660156f, 0.234253f, 0.662598f, 0.216431f, 0.664551f, 0.197266f, + 0.664062f, 0.174194f, 0.661133f, 0.145386f, 0.653809f, 0.106384f, 0.632324f, 0.039246f, + 0.000000f, 1.000000f, 0.016739f, 0.991211f, 0.036163f, 0.977051f, 0.053284f, 0.963867f, + 0.071106f, 0.948730f, 0.088806f, 0.932617f, 0.105652f, 0.916992f, 0.122620f, 0.900879f, + 0.139771f, 0.884766f, 0.156616f, 0.867676f, 0.172852f, 0.852051f, 0.188599f, 0.835938f, + 0.206177f, 0.818848f, 0.220703f, 0.803223f, 0.236450f, 0.787598f, 0.252441f, 0.770996f, + 0.267090f, 0.755859f, 0.281006f, 0.740234f, 0.296875f, 0.724609f, 0.309570f, 0.709961f, + 0.324463f, 0.694336f, 0.338379f, 0.679199f, 0.351562f, 0.664551f, 0.365967f, 0.649902f, + 0.379150f, 0.635254f, 0.391602f, 0.621094f, 0.404297f, 0.606934f, 0.416992f, 0.592773f, + 0.428955f, 0.579102f, 0.441406f, 0.564941f, 0.452881f, 0.551758f, 0.464844f, 0.538086f, + 0.476318f, 0.524902f, 0.487549f, 0.512207f, 0.498291f, 0.499268f, 0.507812f, 0.486816f, + 0.519531f, 0.473633f, 0.529297f, 0.461182f, 0.540527f, 0.448730f, 0.549805f, 0.437012f, + 0.560547f, 0.424316f, 0.570312f, 0.412598f, 0.578613f, 0.400879f, 0.588379f, 0.389404f, + 0.596680f, 0.377930f, 0.606445f, 0.365967f, 0.614258f, 0.355469f, 0.622070f, 0.344238f, + 0.630859f, 0.333252f, 0.638672f, 0.322754f, 0.645996f, 0.312012f, 0.652832f, 0.300293f, + 0.660645f, 0.289062f, 0.665527f, 0.277588f, 0.671875f, 0.265137f, 0.677246f, 0.251709f, + 0.681641f, 0.237915f, 0.687500f, 0.222046f, 0.690918f, 0.205688f, 0.692871f, 0.186523f, + 0.693848f, 0.164429f, 0.692871f, 0.137451f, 0.687012f, 0.100342f, 0.670898f, 0.037354f, + 0.000000f, 1.000000f, 0.016800f, 0.991211f, 0.036499f, 0.977051f, 0.053680f, 0.963867f, + 0.070740f, 0.948730f, 0.089417f, 0.932129f, 0.106201f, 0.916992f, 0.124146f, 0.899902f, + 0.141357f, 0.883789f, 0.158081f, 0.867188f, 0.174316f, 0.851074f, 0.190674f, 0.834473f, + 0.206421f, 0.818848f, 0.223022f, 0.802246f, 0.239136f, 0.785645f, 0.254639f, 0.770020f, + 0.270264f, 0.753906f, 0.284180f, 0.738281f, 0.299316f, 0.722656f, 0.314453f, 0.706543f, + 0.328857f, 0.691406f, 0.343262f, 0.676270f, 0.358154f, 0.660645f, 0.371826f, 0.645996f, + 0.384521f, 0.631348f, 0.398682f, 0.616699f, 0.411621f, 0.602051f, 0.423828f, 0.587891f, + 0.436279f, 0.574219f, 0.449951f, 0.559570f, 0.462402f, 0.545898f, 0.473389f, 0.532227f, + 0.485840f, 0.518555f, 0.497559f, 0.504883f, 0.508789f, 0.491943f, 0.520996f, 0.478516f, + 0.531250f, 0.465820f, 0.542480f, 0.452881f, 0.553711f, 0.439697f, 0.565430f, 0.427002f, + 0.574707f, 0.415039f, 0.584473f, 0.402832f, 0.594727f, 0.390381f, 0.604004f, 0.378662f, + 0.612793f, 0.366699f, 0.623535f, 0.354492f, 0.632324f, 0.343018f, 0.641113f, 0.331543f, + 0.649414f, 0.320312f, 0.658691f, 0.308838f, 0.665527f, 0.298340f, 0.674805f, 0.286865f, + 0.682129f, 0.275391f, 0.689941f, 0.263672f, 0.695801f, 0.252197f, 0.702637f, 0.238647f, + 0.708496f, 0.224976f, 0.713379f, 0.209839f, 0.718262f, 0.194214f, 0.723145f, 0.175781f, + 0.726074f, 0.155273f, 0.725586f, 0.129150f, 0.721191f, 0.093445f, 0.708496f, 0.035828f, + 0.000000f, 1.000000f, 0.016815f, 0.991211f, 0.035889f, 0.978027f, 0.053314f, 0.963867f, + 0.072266f, 0.947754f, 0.089172f, 0.932617f, 0.106995f, 0.916504f, 0.125122f, 0.899414f, + 0.141357f, 0.883789f, 0.158691f, 0.866699f, 0.176025f, 0.850098f, 0.192383f, 0.833496f, + 0.209351f, 0.816895f, 0.225708f, 0.800781f, 0.240845f, 0.784668f, 0.257080f, 0.768066f, + 0.272949f, 0.751953f, 0.288574f, 0.735352f, 0.303467f, 0.720215f, 0.317871f, 0.704102f, + 0.333740f, 0.688477f, 0.347168f, 0.673340f, 0.362305f, 0.658203f, 0.377197f, 0.642578f, + 0.389404f, 0.627930f, 0.403809f, 0.612793f, 0.418457f, 0.597656f, 0.431152f, 0.583008f, + 0.444336f, 0.568359f, 0.457275f, 0.554199f, 0.470459f, 0.540039f, 0.482666f, 0.525879f, + 0.495117f, 0.512207f, 0.506836f, 0.498535f, 0.519531f, 0.484863f, 0.531250f, 0.471191f, + 0.544434f, 0.457275f, 0.555176f, 0.444580f, 0.565430f, 0.431641f, 0.577148f, 0.418213f, + 0.587402f, 0.405762f, 0.599609f, 0.392334f, 0.609375f, 0.380127f, 0.620605f, 0.367432f, + 0.630371f, 0.355225f, 0.639648f, 0.343262f, 0.650391f, 0.330811f, 0.658691f, 0.319336f, + 0.668457f, 0.306885f, 0.677734f, 0.295410f, 0.687012f, 0.283691f, 0.695801f, 0.272705f, + 0.704102f, 0.261475f, 0.712402f, 0.249390f, 0.719238f, 0.237183f, 0.727051f, 0.224976f, + 0.733887f, 0.211426f, 0.741211f, 0.197021f, 0.745117f, 0.182251f, 0.750977f, 0.164185f, + 0.755371f, 0.144165f, 0.757324f, 0.119934f, 0.756836f, 0.087341f, 0.747070f, 0.032013f, + 0.000000f, 1.000000f, 0.017166f, 0.990723f, 0.035431f, 0.978516f, 0.053558f, 0.963867f, + 0.071533f, 0.948242f, 0.089539f, 0.932617f, 0.107849f, 0.915527f, 0.125122f, 0.899414f, + 0.142334f, 0.883301f, 0.160400f, 0.865723f, 0.176636f, 0.849609f, 0.193115f, 0.833008f, + 0.209717f, 0.816406f, 0.227417f, 0.799316f, 0.242676f, 0.783203f, 0.260010f, 0.766113f, + 0.276367f, 0.750000f, 0.291748f, 0.733398f, 0.307861f, 0.717773f, 0.322266f, 0.701660f, + 0.338623f, 0.685547f, 0.352539f, 0.669922f, 0.367432f, 0.654785f, 0.382812f, 0.638672f, + 0.396973f, 0.623535f, 0.410156f, 0.608398f, 0.424561f, 0.593262f, 0.438965f, 0.578125f, + 0.451660f, 0.563477f, 0.465820f, 0.548340f, 0.479736f, 0.534180f, 0.492188f, 0.519531f, + 0.505371f, 0.504883f, 0.518555f, 0.490967f, 0.530762f, 0.477295f, 0.541992f, 0.463379f, + 0.555664f, 0.449463f, 0.566406f, 0.436035f, 0.579102f, 0.422363f, 0.590820f, 0.408936f, + 0.602539f, 0.395508f, 0.614746f, 0.382080f, 0.626465f, 0.369385f, 0.635742f, 0.356934f, + 0.646973f, 0.343750f, 0.657227f, 0.331299f, 0.667480f, 0.318848f, 0.678711f, 0.306396f, + 0.687988f, 0.294189f, 0.698730f, 0.281494f, 0.708496f, 0.269531f, 0.717773f, 0.257568f, + 0.727539f, 0.245850f, 0.736328f, 0.234741f, 0.744141f, 0.222900f, 0.751953f, 0.210205f, + 0.760254f, 0.197510f, 0.768066f, 0.183472f, 0.774902f, 0.168091f, 0.780273f, 0.151489f, + 0.785156f, 0.133545f, 0.788574f, 0.111023f, 0.789551f, 0.080322f, 0.783203f, 0.028793f, + 0.000000f, 1.000000f, 0.017410f, 0.990234f, 0.035706f, 0.978027f, 0.053162f, 0.964355f, + 0.072021f, 0.948242f, 0.090149f, 0.932129f, 0.107239f, 0.916016f, 0.125000f, 0.899902f, + 0.143311f, 0.882812f, 0.161133f, 0.865723f, 0.177490f, 0.849121f, 0.196899f, 0.831543f, + 0.211670f, 0.814941f, 0.230225f, 0.797852f, 0.246826f, 0.780762f, 0.263184f, 0.764160f, + 0.279053f, 0.748047f, 0.294434f, 0.731934f, 0.310303f, 0.715332f, 0.325684f, 0.699219f, + 0.341797f, 0.683105f, 0.358398f, 0.666504f, 0.371826f, 0.651367f, 0.387207f, 0.635254f, + 0.403076f, 0.619141f, 0.417236f, 0.604004f, 0.431152f, 0.588867f, 0.445801f, 0.573242f, + 0.460205f, 0.558105f, 0.474609f, 0.542969f, 0.488037f, 0.528320f, 0.502930f, 0.513184f, + 0.516113f, 0.498535f, 0.528809f, 0.484131f, 0.541992f, 0.469727f, 0.555664f, 0.455078f, + 0.568848f, 0.440918f, 0.580566f, 0.427246f, 0.592285f, 0.413574f, 0.604492f, 0.399902f, + 0.616211f, 0.386230f, 0.627930f, 0.372559f, 0.641113f, 0.358887f, 0.652344f, 0.345703f, + 0.663574f, 0.332520f, 0.674316f, 0.319580f, 0.685547f, 0.306641f, 0.696289f, 0.293701f, + 0.707520f, 0.281006f, 0.718750f, 0.268066f, 0.729004f, 0.255371f, 0.738770f, 0.243164f, + 0.748047f, 0.231323f, 0.757812f, 0.218994f, 0.767578f, 0.207275f, 0.776367f, 0.195435f, + 0.784180f, 0.182495f, 0.792969f, 0.169556f, 0.802734f, 0.154785f, 0.809570f, 0.138794f, + 0.814941f, 0.121826f, 0.820801f, 0.101318f, 0.823730f, 0.072754f, 0.820801f, 0.027664f, + 0.000000f, 1.000000f, 0.018005f, 0.990234f, 0.035400f, 0.978516f, 0.054352f, 0.962891f, + 0.071411f, 0.948730f, 0.090088f, 0.932129f, 0.108276f, 0.916016f, 0.126587f, 0.898926f, + 0.144775f, 0.881836f, 0.161987f, 0.864746f, 0.179077f, 0.848145f, 0.197144f, 0.831055f, + 0.214844f, 0.813477f, 0.230225f, 0.797363f, 0.248901f, 0.779785f, 0.264160f, 0.763184f, + 0.281250f, 0.746582f, 0.297363f, 0.729492f, 0.314209f, 0.712891f, 0.329590f, 0.696289f, + 0.346680f, 0.679688f, 0.362061f, 0.663574f, 0.378418f, 0.647461f, 0.394043f, 0.631348f, + 0.409180f, 0.615234f, 0.423584f, 0.599609f, 0.438965f, 0.583496f, 0.453369f, 0.568359f, + 0.468262f, 0.552734f, 0.482178f, 0.537598f, 0.497314f, 0.521973f, 0.512207f, 0.506836f, + 0.524902f, 0.492188f, 0.539062f, 0.477051f, 0.552246f, 0.462402f, 0.565918f, 0.447754f, + 0.580078f, 0.433105f, 0.592773f, 0.418945f, 0.604980f, 0.404785f, 0.617676f, 0.390381f, + 0.631836f, 0.375977f, 0.643066f, 0.362549f, 0.655273f, 0.348633f, 0.668457f, 0.334717f, + 0.680176f, 0.321045f, 0.692383f, 0.307617f, 0.704102f, 0.293945f, 0.716309f, 0.281250f, + 0.726562f, 0.267822f, 0.737793f, 0.254639f, 0.749512f, 0.242065f, 0.759766f, 0.228882f, + 0.770996f, 0.216064f, 0.781250f, 0.203491f, 0.791016f, 0.191162f, 0.801758f, 0.178711f, + 0.810547f, 0.166992f, 0.820312f, 0.154053f, 0.829102f, 0.139648f, 0.838867f, 0.125000f, + 0.845703f, 0.109192f, 0.853027f, 0.089905f, 0.856934f, 0.064453f, 0.855957f, 0.024933f, + 0.000000f, 1.000000f, 0.018250f, 0.990723f, 0.034637f, 0.979004f, 0.053894f, 0.963867f, + 0.073181f, 0.947266f, 0.090881f, 0.931641f, 0.109253f, 0.915039f, 0.127686f, 0.897949f, + 0.145020f, 0.881836f, 0.163452f, 0.864258f, 0.180908f, 0.847168f, 0.198608f, 0.830078f, + 0.216187f, 0.812500f, 0.232910f, 0.795898f, 0.250732f, 0.778320f, 0.268799f, 0.760742f, + 0.284424f, 0.744141f, 0.300049f, 0.727539f, 0.318115f, 0.710449f, 0.334961f, 0.693848f, + 0.350098f, 0.677246f, 0.367676f, 0.660156f, 0.383545f, 0.643555f, 0.398926f, 0.627441f, + 0.415527f, 0.611328f, 0.431152f, 0.595215f, 0.445801f, 0.579102f, 0.460938f, 0.562988f, + 0.476074f, 0.547363f, 0.490234f, 0.531738f, 0.504395f, 0.516113f, 0.520508f, 0.500488f, + 0.535156f, 0.485596f, 0.548828f, 0.470459f, 0.562988f, 0.455322f, 0.577148f, 0.439941f, + 0.591309f, 0.425049f, 0.605469f, 0.410400f, 0.618164f, 0.395752f, 0.630859f, 0.381348f, + 0.645020f, 0.366699f, 0.658203f, 0.352051f, 0.671875f, 0.337646f, 0.684570f, 0.323486f, + 0.697266f, 0.309814f, 0.708984f, 0.296143f, 0.721191f, 0.281982f, 0.734863f, 0.268311f, + 0.745605f, 0.254639f, 0.757324f, 0.241455f, 0.770020f, 0.227295f, 0.782227f, 0.214111f, + 0.793457f, 0.201416f, 0.804688f, 0.187622f, 0.816406f, 0.174438f, 0.826172f, 0.161987f, + 0.835938f, 0.149780f, 0.845703f, 0.137207f, 0.856934f, 0.124390f, 0.865723f, 0.110168f, + 0.875977f, 0.095398f, 0.884277f, 0.077576f, 0.890137f, 0.055084f, 0.891113f, 0.020645f, + 0.000000f, 1.000000f, 0.018402f, 0.990723f, 0.036224f, 0.977539f, 0.053894f, 0.963867f, + 0.072876f, 0.947754f, 0.091736f, 0.931152f, 0.109619f, 0.915039f, 0.127319f, 0.898438f, + 0.145142f, 0.881348f, 0.164307f, 0.863281f, 0.182251f, 0.846191f, 0.199219f, 0.829590f, + 0.217651f, 0.811523f, 0.235596f, 0.793945f, 0.253906f, 0.776855f, 0.270996f, 0.759277f, + 0.287598f, 0.742188f, 0.305420f, 0.725098f, 0.322266f, 0.708008f, 0.338867f, 0.691406f, + 0.355957f, 0.673828f, 0.372803f, 0.656738f, 0.388916f, 0.640137f, 0.404785f, 0.623535f, + 0.419922f, 0.607422f, 0.436035f, 0.590820f, 0.453125f, 0.574219f, 0.468994f, 0.558105f, + 0.484619f, 0.541992f, 0.499756f, 0.525391f, 0.515137f, 0.509766f, 0.530273f, 0.494141f, + 0.545410f, 0.478760f, 0.559082f, 0.463135f, 0.573730f, 0.447754f, 0.588867f, 0.432129f, + 0.603516f, 0.416992f, 0.617188f, 0.401611f, 0.631348f, 0.386475f, 0.645996f, 0.371338f, + 0.659668f, 0.356689f, 0.674805f, 0.341553f, 0.687988f, 0.327148f, 0.700684f, 0.312988f, + 0.713379f, 0.298828f, 0.725586f, 0.284180f, 0.739746f, 0.269775f, 0.753418f, 0.255371f, + 0.765625f, 0.241333f, 0.777832f, 0.227783f, 0.790039f, 0.213623f, 0.802734f, 0.199951f, + 0.815430f, 0.185791f, 0.827637f, 0.172241f, 0.838867f, 0.159424f, 0.850586f, 0.145752f, + 0.861328f, 0.132446f, 0.873047f, 0.119141f, 0.883301f, 0.106384f, 0.894043f, 0.093933f, + 0.905273f, 0.080444f, 0.914551f, 0.064392f, 0.923340f, 0.045380f, 0.929199f, 0.016312f, + 0.000000f, 1.000000f, 0.018188f, 0.990723f, 0.036255f, 0.977539f, 0.054260f, 0.963379f, + 0.073486f, 0.946777f, 0.091797f, 0.931152f, 0.109375f, 0.915039f, 0.127930f, 0.897949f, + 0.147095f, 0.880371f, 0.164917f, 0.863281f, 0.183350f, 0.845703f, 0.201660f, 0.828125f, + 0.220215f, 0.810059f, 0.238281f, 0.792480f, 0.255371f, 0.775391f, 0.272461f, 0.758301f, + 0.291016f, 0.740234f, 0.308350f, 0.723145f, 0.326172f, 0.705566f, 0.343262f, 0.687988f, + 0.360107f, 0.670898f, 0.377197f, 0.653809f, 0.393799f, 0.636719f, 0.410156f, 0.620117f, + 0.426514f, 0.603027f, 0.444092f, 0.585938f, 0.459473f, 0.569824f, 0.476562f, 0.552734f, + 0.493408f, 0.536621f, 0.508301f, 0.520020f, 0.523438f, 0.503906f, 0.539062f, 0.487793f, + 0.555176f, 0.471680f, 0.570312f, 0.455811f, 0.585938f, 0.439941f, 0.600586f, 0.424072f, + 0.616699f, 0.408447f, 0.630859f, 0.393066f, 0.644531f, 0.377686f, 0.660156f, 0.362061f, + 0.674316f, 0.346924f, 0.687988f, 0.332031f, 0.702637f, 0.316650f, 0.717285f, 0.301514f, + 0.729980f, 0.286865f, 0.744629f, 0.272217f, 0.756836f, 0.257568f, 0.771484f, 0.242920f, + 0.784668f, 0.228516f, 0.797363f, 0.214233f, 0.811523f, 0.199585f, 0.824707f, 0.185425f, + 0.836914f, 0.171387f, 0.849609f, 0.157104f, 0.861328f, 0.143433f, 0.875000f, 0.129150f, + 0.886719f, 0.115479f, 0.897949f, 0.102600f, 0.910645f, 0.088196f, 0.922852f, 0.074524f, + 0.934082f, 0.061005f, 0.945801f, 0.047729f, 0.956055f, 0.032867f, 0.963379f, 0.011261f, + 0.000000f, 1.000000f, 0.017197f, 0.991211f, 0.035645f, 0.978516f, 0.053741f, 0.963867f, + 0.073975f, 0.946777f, 0.091614f, 0.931152f, 0.109009f, 0.915527f, 0.129028f, 0.897461f, + 0.148804f, 0.878906f, 0.166138f, 0.862305f, 0.184204f, 0.845215f, 0.203125f, 0.827148f, + 0.221313f, 0.809570f, 0.240356f, 0.791504f, 0.257812f, 0.773438f, 0.275879f, 0.756348f, + 0.294189f, 0.738281f, 0.311523f, 0.720703f, 0.329346f, 0.703125f, 0.346924f, 0.685547f, + 0.364258f, 0.668457f, 0.382568f, 0.650879f, 0.399170f, 0.633301f, 0.416504f, 0.616211f, + 0.433838f, 0.598633f, 0.450684f, 0.581543f, 0.467773f, 0.564941f, 0.483887f, 0.547852f, + 0.500488f, 0.531250f, 0.516602f, 0.514160f, 0.532715f, 0.497803f, 0.549316f, 0.481445f, + 0.565430f, 0.465088f, 0.581055f, 0.448730f, 0.596680f, 0.432617f, 0.612305f, 0.416504f, + 0.627441f, 0.400391f, 0.642578f, 0.384521f, 0.657227f, 0.368896f, 0.672363f, 0.353027f, + 0.687988f, 0.337158f, 0.703613f, 0.321289f, 0.719238f, 0.305664f, 0.734375f, 0.290283f, + 0.748535f, 0.275391f, 0.762207f, 0.260498f, 0.775879f, 0.245728f, 0.789062f, 0.231079f, + 0.802734f, 0.215820f, 0.817383f, 0.200562f, 0.832031f, 0.185303f, 0.847168f, 0.170410f, + 0.860840f, 0.156006f, 0.871582f, 0.142822f, 0.884277f, 0.128174f, 0.898438f, 0.113220f, + 0.912109f, 0.098511f, 0.925781f, 0.084290f, 0.936523f, 0.070618f, 0.952148f, 0.055542f, + 0.963379f, 0.042084f, 0.975098f, 0.028702f, 0.983887f, 0.016449f, 0.999512f, 0.000059f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998047f, 0.000000f, 0.997070f, + 0.000000f, 0.995605f, 0.000000f, 0.993164f, 0.000000f, 0.990723f, 0.000000f, 0.988281f, + 0.000000f, 0.984863f, 0.000000f, 0.981445f, 0.000000f, 0.978027f, 0.000000f, 0.974609f, + 0.000000f, 0.970215f, 0.000000f, 0.965820f, 0.000000f, 0.960938f, 0.000000f, 0.956543f, + 0.000000f, 0.951660f, 0.000000f, 0.946777f, 0.000000f, 0.940430f, 0.000000f, 0.934570f, + 0.000000f, 0.928223f, 0.000000f, 0.921387f, 0.000000f, 0.915527f, 0.000000f, 0.908691f, + 0.000000f, 0.901367f, 0.000000f, 0.893555f, 0.000000f, 0.885254f, 0.000000f, 0.877441f, + 0.000000f, 0.869629f, 0.000000f, 0.860840f, 0.000000f, 0.852051f, 0.000000f, 0.842285f, + 0.000000f, 0.832520f, 0.000000f, 0.822266f, 0.000000f, 0.812500f, 0.000000f, 0.802246f, + 0.000000f, 0.791016f, 0.000000f, 0.778809f, 0.000000f, 0.766602f, 0.000000f, 0.754883f, + 0.000000f, 0.742676f, 0.000000f, 0.729492f, 0.000000f, 0.714844f, 0.000000f, 0.700684f, + 0.000000f, 0.685547f, 0.000000f, 0.670410f, 0.000000f, 0.654785f, 0.000000f, 0.637695f, + 0.000000f, 0.620117f, 0.000000f, 0.600586f, 0.000000f, 0.581055f, 0.000000f, 0.561523f, + 0.000000f, 0.540527f, 0.000000f, 0.516602f, 0.000000f, 0.491211f, 0.000000f, 0.465820f, + 0.000000f, 0.439697f, 0.000000f, 0.406738f, 0.000000f, 0.371582f, 0.000000f, 0.336182f, + 0.000000f, 0.291992f, 0.000000f, 0.238159f, 0.000000f, 0.169434f, 0.000000f, 0.067261f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.997070f, + 0.000000f, 0.995117f, 0.000000f, 0.992676f, 0.000000f, 0.990723f, 0.000000f, 0.988281f, + 0.000000f, 0.984863f, 0.000000f, 0.981445f, 0.000000f, 0.978027f, 0.000000f, 0.974609f, + 0.000000f, 0.970215f, 0.000000f, 0.965332f, 0.000000f, 0.960938f, 0.000000f, 0.956055f, + 0.000000f, 0.950684f, 0.000000f, 0.945801f, 0.000000f, 0.939941f, 0.000000f, 0.934082f, + 0.000000f, 0.927734f, 0.000000f, 0.921387f, 0.000000f, 0.915039f, 0.000000f, 0.908203f, + 0.000000f, 0.900879f, 0.000000f, 0.893066f, 0.000000f, 0.885254f, 0.000000f, 0.876953f, + 0.000000f, 0.869141f, 0.000000f, 0.860840f, 0.000000f, 0.851074f, 0.000000f, 0.841797f, + 0.000000f, 0.832031f, 0.000000f, 0.822266f, 0.000000f, 0.812500f, 0.000000f, 0.802246f, + 0.000000f, 0.790527f, 0.000000f, 0.778809f, 0.000000f, 0.766602f, 0.000001f, 0.754395f, + 0.000003f, 0.742188f, 0.000005f, 0.729492f, 0.000007f, 0.715332f, 0.000010f, 0.700684f, + 0.000012f, 0.685547f, 0.000014f, 0.670410f, 0.000014f, 0.654785f, 0.000014f, 0.637695f, + 0.000014f, 0.619629f, 0.000013f, 0.600098f, 0.000013f, 0.581055f, 0.000012f, 0.562012f, + 0.000010f, 0.540527f, 0.000009f, 0.516602f, 0.000009f, 0.491699f, 0.000010f, 0.466064f, + 0.000009f, 0.439697f, 0.000008f, 0.406982f, 0.000007f, 0.372314f, 0.000007f, 0.336426f, + 0.000005f, 0.291260f, 0.000005f, 0.237549f, 0.000003f, 0.169189f, 0.000001f, 0.067505f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998047f, 0.000000f, 0.997070f, + 0.000000f, 0.995117f, 0.000000f, 0.992676f, 0.000000f, 0.990234f, 0.000002f, 0.987793f, + 0.000007f, 0.984375f, 0.000014f, 0.980957f, 0.000021f, 0.977539f, 0.000029f, 0.974121f, + 0.000036f, 0.969727f, 0.000043f, 0.965332f, 0.000051f, 0.960449f, 0.000058f, 0.955566f, + 0.000064f, 0.951172f, 0.000070f, 0.945801f, 0.000077f, 0.939941f, 0.000084f, 0.933594f, + 0.000089f, 0.927246f, 0.000094f, 0.920898f, 0.000100f, 0.914551f, 0.000106f, 0.908203f, + 0.000111f, 0.900391f, 0.000116f, 0.892578f, 0.000120f, 0.884766f, 0.000124f, 0.876953f, + 0.000125f, 0.869141f, 0.000124f, 0.860352f, 0.000121f, 0.851074f, 0.000117f, 0.841797f, + 0.000113f, 0.832031f, 0.000112f, 0.821777f, 0.000112f, 0.812012f, 0.000112f, 0.801758f, + 0.000109f, 0.790039f, 0.000109f, 0.778320f, 0.000110f, 0.766602f, 0.000112f, 0.754395f, + 0.000114f, 0.742188f, 0.000116f, 0.729492f, 0.000108f, 0.714844f, 0.000105f, 0.700195f, + 0.000107f, 0.685059f, 0.000107f, 0.669922f, 0.000106f, 0.654297f, 0.000099f, 0.637695f, + 0.000096f, 0.619141f, 0.000096f, 0.600098f, 0.000096f, 0.581055f, 0.000094f, 0.561523f, + 0.000083f, 0.540039f, 0.000081f, 0.516113f, 0.000080f, 0.491699f, 0.000077f, 0.465576f, + 0.000066f, 0.439453f, 0.000062f, 0.406738f, 0.000059f, 0.372314f, 0.000052f, 0.337158f, + 0.000042f, 0.291992f, 0.000035f, 0.237915f, 0.000021f, 0.169189f, 0.000004f, 0.067383f, + 0.000000f, 1.000000f, 0.000113f, 0.999023f, 0.000178f, 0.998047f, 0.000176f, 0.996582f, + 0.000218f, 0.994141f, 0.000227f, 0.992676f, 0.000228f, 0.989746f, 0.000226f, 0.987305f, + 0.000267f, 0.983398f, 0.000271f, 0.980469f, 0.000272f, 0.977051f, 0.000271f, 0.973145f, + 0.000300f, 0.968750f, 0.000308f, 0.964355f, 0.000315f, 0.959473f, 0.000322f, 0.954590f, + 0.000329f, 0.949707f, 0.000360f, 0.944336f, 0.000369f, 0.938477f, 0.000371f, 0.932617f, + 0.000369f, 0.926270f, 0.000366f, 0.919922f, 0.000363f, 0.913574f, 0.000384f, 0.906738f, + 0.000379f, 0.899414f, 0.000378f, 0.891602f, 0.000377f, 0.883789f, 0.000380f, 0.875977f, + 0.000383f, 0.868164f, 0.000405f, 0.859375f, 0.000400f, 0.850098f, 0.000404f, 0.840332f, + 0.000403f, 0.831055f, 0.000401f, 0.821289f, 0.000398f, 0.811523f, 0.000410f, 0.800781f, + 0.000398f, 0.789551f, 0.000400f, 0.777344f, 0.000398f, 0.765625f, 0.000392f, 0.753906f, + 0.000388f, 0.741699f, 0.000399f, 0.728516f, 0.000379f, 0.714355f, 0.000375f, 0.699707f, + 0.000370f, 0.684570f, 0.000365f, 0.669434f, 0.000359f, 0.654785f, 0.000348f, 0.637207f, + 0.000337f, 0.618652f, 0.000329f, 0.600098f, 0.000320f, 0.581055f, 0.000314f, 0.561523f, + 0.000294f, 0.540039f, 0.000277f, 0.516602f, 0.000267f, 0.491455f, 0.000254f, 0.465820f, + 0.000247f, 0.438965f, 0.000209f, 0.406494f, 0.000193f, 0.371826f, 0.000173f, 0.336914f, + 0.000136f, 0.292236f, 0.000110f, 0.238403f, 0.000065f, 0.169556f, 0.000012f, 0.067261f, + 0.000000f, 1.000000f, 0.000267f, 0.999023f, 0.000419f, 0.997559f, 0.000392f, 0.996094f, + 0.000529f, 0.993652f, 0.000532f, 0.991211f, 0.000531f, 0.989258f, 0.000537f, 0.986816f, + 0.000649f, 0.982910f, 0.000649f, 0.979004f, 0.000659f, 0.975586f, 0.000662f, 0.972168f, + 0.000753f, 0.967773f, 0.000757f, 0.962891f, 0.000760f, 0.958496f, 0.000763f, 0.953613f, + 0.000763f, 0.948730f, 0.000831f, 0.943359f, 0.000836f, 0.937012f, 0.000831f, 0.931152f, + 0.000835f, 0.924805f, 0.000842f, 0.918945f, 0.000849f, 0.913086f, 0.000917f, 0.905273f, + 0.000905f, 0.897949f, 0.000908f, 0.890625f, 0.000909f, 0.882812f, 0.000908f, 0.875000f, + 0.000907f, 0.867188f, 0.000958f, 0.858398f, 0.000939f, 0.849121f, 0.000937f, 0.839355f, + 0.000938f, 0.830078f, 0.000936f, 0.820312f, 0.000932f, 0.810547f, 0.000970f, 0.799805f, + 0.000943f, 0.788086f, 0.000931f, 0.776855f, 0.000926f, 0.765137f, 0.000915f, 0.752930f, + 0.000910f, 0.740723f, 0.000939f, 0.727539f, 0.000904f, 0.713379f, 0.000873f, 0.698730f, + 0.000864f, 0.684082f, 0.000851f, 0.668945f, 0.000837f, 0.654297f, 0.000821f, 0.636230f, + 0.000784f, 0.618164f, 0.000764f, 0.600098f, 0.000746f, 0.580566f, 0.000723f, 0.561035f, + 0.000697f, 0.539551f, 0.000641f, 0.515625f, 0.000615f, 0.490967f, 0.000585f, 0.465820f, + 0.000568f, 0.439209f, 0.000479f, 0.406494f, 0.000438f, 0.372070f, 0.000391f, 0.336426f, + 0.000307f, 0.291016f, 0.000244f, 0.239136f, 0.000140f, 0.169189f, 0.000023f, 0.067078f, + 0.000000f, 1.000000f, 0.000519f, 0.998535f, 0.000839f, 0.997070f, 0.000782f, 0.995605f, + 0.001030f, 0.992676f, 0.001041f, 0.990234f, 0.001035f, 0.987793f, 0.001052f, 0.985352f, + 0.001259f, 0.981445f, 0.001264f, 0.978516f, 0.001260f, 0.974609f, 0.001259f, 0.970703f, + 0.001434f, 0.965820f, 0.001449f, 0.960938f, 0.001454f, 0.957031f, 0.001442f, 0.952148f, + 0.001452f, 0.947754f, 0.001609f, 0.941406f, 0.001631f, 0.935547f, 0.001645f, 0.929688f, + 0.001622f, 0.923828f, 0.001623f, 0.917480f, 0.001636f, 0.911133f, 0.001754f, 0.903809f, + 0.001770f, 0.895996f, 0.001750f, 0.888672f, 0.001744f, 0.880859f, 0.001740f, 0.873535f, + 0.001737f, 0.865723f, 0.001850f, 0.856445f, 0.001861f, 0.847168f, 0.001822f, 0.837891f, + 0.001800f, 0.828613f, 0.001790f, 0.819336f, 0.001783f, 0.809082f, 0.001864f, 0.798340f, + 0.001823f, 0.787109f, 0.001794f, 0.775391f, 0.001772f, 0.763672f, 0.001753f, 0.751953f, + 0.001739f, 0.740234f, 0.001797f, 0.726562f, 0.001744f, 0.712402f, 0.001681f, 0.697754f, + 0.001650f, 0.683594f, 0.001621f, 0.668457f, 0.001591f, 0.653809f, 0.001631f, 0.635742f, + 0.001534f, 0.617676f, 0.001457f, 0.599121f, 0.001414f, 0.580078f, 0.001370f, 0.561035f, + 0.001341f, 0.538574f, 0.001233f, 0.515137f, 0.001164f, 0.490723f, 0.001102f, 0.465576f, + 0.001074f, 0.438477f, 0.000912f, 0.406006f, 0.000821f, 0.372070f, 0.000726f, 0.337402f, + 0.000569f, 0.290283f, 0.000445f, 0.238770f, 0.000249f, 0.169434f, 0.000040f, 0.066528f, + 0.000000f, 1.000000f, 0.000836f, 0.998535f, 0.001378f, 0.996582f, 0.001312f, 0.994629f, + 0.001456f, 0.992188f, 0.001756f, 0.989258f, 0.001740f, 0.986816f, 0.001827f, 0.983887f, + 0.002106f, 0.979492f, 0.002115f, 0.976074f, 0.002119f, 0.973145f, 0.002125f, 0.969727f, + 0.002417f, 0.963867f, 0.002443f, 0.959473f, 0.002472f, 0.954590f, 0.002464f, 0.950195f, + 0.002464f, 0.945312f, 0.002714f, 0.938965f, 0.002747f, 0.933594f, 0.002773f, 0.927734f, + 0.002750f, 0.921387f, 0.002762f, 0.915527f, 0.002811f, 0.909180f, 0.002975f, 0.901367f, + 0.002996f, 0.894043f, 0.002970f, 0.886719f, 0.002977f, 0.879395f, 0.002951f, 0.872070f, + 0.002995f, 0.863770f, 0.003126f, 0.854492f, 0.003143f, 0.845215f, 0.003096f, 0.836426f, + 0.003057f, 0.826660f, 0.003033f, 0.817871f, 0.003008f, 0.808594f, 0.003153f, 0.796875f, + 0.003159f, 0.785156f, 0.003092f, 0.774414f, 0.003038f, 0.762695f, 0.002968f, 0.750977f, + 0.002930f, 0.739258f, 0.003029f, 0.725098f, 0.002956f, 0.710938f, 0.002890f, 0.696777f, + 0.002798f, 0.682617f, 0.002728f, 0.667969f, 0.002703f, 0.652832f, 0.002743f, 0.634766f, + 0.002602f, 0.617188f, 0.002487f, 0.598633f, 0.002377f, 0.579590f, 0.002291f, 0.561035f, + 0.002310f, 0.538086f, 0.002117f, 0.514648f, 0.001955f, 0.490479f, 0.001832f, 0.466064f, + 0.001786f, 0.437744f, 0.001535f, 0.405762f, 0.001353f, 0.372314f, 0.001190f, 0.337402f, + 0.000955f, 0.290771f, 0.000717f, 0.238525f, 0.000398f, 0.169678f, 0.000067f, 0.065735f, + 0.000000f, 1.000000f, 0.000743f, 0.998535f, 0.001665f, 0.996094f, 0.002008f, 0.994141f, + 0.002346f, 0.990723f, 0.002684f, 0.987793f, 0.002678f, 0.985352f, 0.002752f, 0.981934f, + 0.003250f, 0.978027f, 0.003258f, 0.974121f, 0.003281f, 0.970703f, 0.003288f, 0.967773f, + 0.003754f, 0.961914f, 0.003803f, 0.957031f, 0.003826f, 0.952637f, 0.003841f, 0.948242f, + 0.003820f, 0.943359f, 0.004246f, 0.936523f, 0.004269f, 0.930664f, 0.004307f, 0.925293f, + 0.004322f, 0.919434f, 0.004292f, 0.913086f, 0.004463f, 0.906738f, 0.004635f, 0.898926f, + 0.004665f, 0.891602f, 0.004677f, 0.884277f, 0.004627f, 0.876953f, 0.004593f, 0.870117f, + 0.004730f, 0.861328f, 0.004879f, 0.852051f, 0.004883f, 0.843262f, 0.004814f, 0.834473f, + 0.004810f, 0.825195f, 0.004757f, 0.815918f, 0.004803f, 0.806152f, 0.004898f, 0.794434f, + 0.004890f, 0.783691f, 0.004799f, 0.771973f, 0.004723f, 0.760742f, 0.004650f, 0.750000f, + 0.004570f, 0.737793f, 0.004707f, 0.723633f, 0.004662f, 0.709473f, 0.004486f, 0.695801f, + 0.004387f, 0.681152f, 0.004253f, 0.667480f, 0.004215f, 0.651367f, 0.004227f, 0.633301f, + 0.004025f, 0.615723f, 0.003859f, 0.597656f, 0.003700f, 0.579590f, 0.003527f, 0.561035f, + 0.003540f, 0.537109f, 0.003271f, 0.514160f, 0.003042f, 0.490234f, 0.002800f, 0.465576f, + 0.002720f, 0.437256f, 0.002392f, 0.405273f, 0.002062f, 0.371826f, 0.001789f, 0.337646f, + 0.001477f, 0.290527f, 0.001062f, 0.238770f, 0.000602f, 0.169556f, 0.000105f, 0.065247f, + 0.000000f, 1.000000f, 0.001196f, 0.998535f, 0.002502f, 0.995117f, 0.002876f, 0.992676f, + 0.003199f, 0.989746f, 0.003517f, 0.986816f, 0.003880f, 0.983887f, 0.004108f, 0.979980f, + 0.004414f, 0.976074f, 0.004761f, 0.972168f, 0.004765f, 0.968750f, 0.004841f, 0.964844f, + 0.005260f, 0.959473f, 0.005539f, 0.954590f, 0.005581f, 0.950195f, 0.005604f, 0.945801f, + 0.005680f, 0.940430f, 0.005978f, 0.933594f, 0.006275f, 0.927734f, 0.006283f, 0.922363f, + 0.006325f, 0.916992f, 0.006264f, 0.910645f, 0.006573f, 0.903320f, 0.006786f, 0.895996f, + 0.006844f, 0.888672f, 0.006844f, 0.881836f, 0.006767f, 0.874512f, 0.006763f, 0.867676f, + 0.006966f, 0.858398f, 0.007133f, 0.849121f, 0.007133f, 0.840332f, 0.007122f, 0.832031f, + 0.007023f, 0.823242f, 0.006935f, 0.813965f, 0.007061f, 0.803711f, 0.007187f, 0.791992f, + 0.007160f, 0.781250f, 0.007030f, 0.770508f, 0.006893f, 0.759277f, 0.006779f, 0.748047f, + 0.006832f, 0.735840f, 0.006901f, 0.721680f, 0.006802f, 0.708008f, 0.006618f, 0.693848f, + 0.006386f, 0.680176f, 0.006229f, 0.666504f, 0.006199f, 0.649902f, 0.006168f, 0.632324f, + 0.005928f, 0.614746f, 0.005661f, 0.597168f, 0.005367f, 0.579102f, 0.005241f, 0.559082f, + 0.005116f, 0.536133f, 0.004791f, 0.513184f, 0.004398f, 0.489990f, 0.004051f, 0.465820f, + 0.003904f, 0.436523f, 0.003481f, 0.405273f, 0.002977f, 0.372314f, 0.002529f, 0.337891f, + 0.002108f, 0.290039f, 0.001489f, 0.239014f, 0.000866f, 0.169556f, 0.000147f, 0.064087f, + 0.000000f, 1.000000f, 0.001239f, 0.998047f, 0.002592f, 0.994629f, 0.003477f, 0.992188f, + 0.004539f, 0.988281f, 0.004944f, 0.984863f, 0.005348f, 0.981934f, 0.005646f, 0.978027f, + 0.006233f, 0.973633f, 0.006599f, 0.969727f, 0.006657f, 0.966309f, 0.006851f, 0.961914f, + 0.007393f, 0.956055f, 0.007782f, 0.951660f, 0.007763f, 0.947266f, 0.007820f, 0.942871f, + 0.008011f, 0.937500f, 0.008484f, 0.930664f, 0.008728f, 0.924805f, 0.008812f, 0.919434f, + 0.008797f, 0.913574f, 0.008842f, 0.908203f, 0.009239f, 0.899902f, 0.009537f, 0.892578f, + 0.009529f, 0.885742f, 0.009575f, 0.878906f, 0.009567f, 0.872070f, 0.009438f, 0.865234f, + 0.009857f, 0.855469f, 0.010017f, 0.846680f, 0.009979f, 0.837891f, 0.009949f, 0.829102f, + 0.009804f, 0.820312f, 0.009750f, 0.812012f, 0.009979f, 0.800781f, 0.010086f, 0.789551f, + 0.010002f, 0.778809f, 0.009880f, 0.768555f, 0.009697f, 0.757812f, 0.009521f, 0.746582f, + 0.009628f, 0.733398f, 0.009613f, 0.719727f, 0.009483f, 0.706055f, 0.009216f, 0.692383f, + 0.008965f, 0.679199f, 0.008644f, 0.665039f, 0.008736f, 0.647949f, 0.008537f, 0.630371f, + 0.008232f, 0.613281f, 0.007851f, 0.596191f, 0.007481f, 0.578613f, 0.007275f, 0.558105f, + 0.007076f, 0.535156f, 0.006618f, 0.512695f, 0.006111f, 0.489746f, 0.005592f, 0.465820f, + 0.005367f, 0.435547f, 0.004776f, 0.404053f, 0.004097f, 0.372314f, 0.003468f, 0.337158f, + 0.002897f, 0.290283f, 0.002012f, 0.238892f, 0.001186f, 0.169434f, 0.000203f, 0.063721f, + 0.000000f, 1.000000f, 0.001400f, 0.998047f, 0.003353f, 0.994141f, 0.004185f, 0.991699f, + 0.005409f, 0.986816f, 0.006649f, 0.982910f, 0.006687f, 0.980469f, 0.007683f, 0.975586f, + 0.008133f, 0.971191f, 0.008553f, 0.967773f, 0.008949f, 0.963379f, 0.009407f, 0.958496f, + 0.009995f, 0.953125f, 0.010132f, 0.948242f, 0.010536f, 0.943848f, 0.010490f, 0.939453f, + 0.010963f, 0.933594f, 0.011513f, 0.926758f, 0.011848f, 0.921387f, 0.011826f, 0.915527f, + 0.011894f, 0.910645f, 0.012009f, 0.904297f, 0.012459f, 0.896484f, 0.012642f, 0.889648f, + 0.012917f, 0.882812f, 0.012863f, 0.875977f, 0.012817f, 0.869141f, 0.012993f, 0.861816f, + 0.013351f, 0.852051f, 0.013504f, 0.842773f, 0.013512f, 0.834961f, 0.013420f, 0.826660f, + 0.013329f, 0.818359f, 0.013176f, 0.809570f, 0.013489f, 0.797852f, 0.013573f, 0.786621f, + 0.013420f, 0.775879f, 0.013298f, 0.766113f, 0.013046f, 0.755371f, 0.012787f, 0.745117f, + 0.012985f, 0.730469f, 0.012978f, 0.717285f, 0.012703f, 0.704102f, 0.012375f, 0.690918f, + 0.012009f, 0.677734f, 0.011658f, 0.664062f, 0.011787f, 0.645508f, 0.011467f, 0.628906f, + 0.011032f, 0.612305f, 0.010597f, 0.595215f, 0.010040f, 0.578125f, 0.009789f, 0.556152f, + 0.009453f, 0.534180f, 0.008820f, 0.511719f, 0.008179f, 0.489258f, 0.007450f, 0.465576f, + 0.007130f, 0.434814f, 0.006325f, 0.404297f, 0.005444f, 0.372559f, 0.004631f, 0.336426f, + 0.003807f, 0.289307f, 0.002638f, 0.240112f, 0.001544f, 0.168701f, 0.000274f, 0.062744f, + 0.000000f, 1.000000f, 0.001608f, 0.998047f, 0.003750f, 0.993652f, 0.005112f, 0.990723f, + 0.006462f, 0.985840f, 0.007797f, 0.981445f, 0.008713f, 0.978516f, 0.009453f, 0.973145f, + 0.010658f, 0.968262f, 0.011154f, 0.964355f, 0.011276f, 0.960938f, 0.012253f, 0.955078f, + 0.012917f, 0.949219f, 0.013412f, 0.945312f, 0.013725f, 0.940430f, 0.013863f, 0.936523f, + 0.014458f, 0.929199f, 0.015152f, 0.922852f, 0.015289f, 0.917480f, 0.015640f, 0.912109f, + 0.015541f, 0.906738f, 0.015961f, 0.899902f, 0.016388f, 0.892578f, 0.016754f, 0.885742f, + 0.016953f, 0.878906f, 0.016937f, 0.872070f, 0.016815f, 0.865723f, 0.017197f, 0.856934f, + 0.017578f, 0.848145f, 0.017807f, 0.839355f, 0.017685f, 0.831543f, 0.017548f, 0.823242f, + 0.017456f, 0.815430f, 0.017456f, 0.805664f, 0.017853f, 0.793945f, 0.017853f, 0.783691f, + 0.017624f, 0.773438f, 0.017410f, 0.763672f, 0.017059f, 0.753418f, 0.017014f, 0.741699f, + 0.017105f, 0.728027f, 0.017014f, 0.714844f, 0.016617f, 0.702148f, 0.016159f, 0.688965f, + 0.015778f, 0.676270f, 0.015427f, 0.661621f, 0.015442f, 0.644043f, 0.014977f, 0.627441f, + 0.014381f, 0.610840f, 0.013771f, 0.594727f, 0.013016f, 0.577637f, 0.012810f, 0.555176f, + 0.012276f, 0.532715f, 0.011520f, 0.511230f, 0.010567f, 0.489014f, 0.009666f, 0.465820f, + 0.009216f, 0.433838f, 0.008209f, 0.403809f, 0.007027f, 0.372314f, 0.006031f, 0.334961f, + 0.004913f, 0.289307f, 0.003365f, 0.240234f, 0.001982f, 0.167603f, 0.000346f, 0.061798f, + 0.000000f, 1.000000f, 0.001885f, 0.997559f, 0.004303f, 0.993164f, 0.005737f, 0.990234f, + 0.007801f, 0.984375f, 0.009171f, 0.980469f, 0.010170f, 0.977051f, 0.011986f, 0.970215f, + 0.013268f, 0.965820f, 0.013802f, 0.961426f, 0.014313f, 0.958008f, 0.015793f, 0.951172f, + 0.016571f, 0.945801f, 0.017059f, 0.940918f, 0.017273f, 0.937012f, 0.017807f, 0.931641f, + 0.018814f, 0.924805f, 0.019150f, 0.918945f, 0.019638f, 0.913574f, 0.020004f, 0.908203f, + 0.019943f, 0.903320f, 0.020706f, 0.895020f, 0.021225f, 0.887695f, 0.021545f, 0.881348f, + 0.021805f, 0.875000f, 0.021729f, 0.868164f, 0.021652f, 0.862305f, 0.022263f, 0.852539f, + 0.022644f, 0.843750f, 0.022537f, 0.835449f, 0.022781f, 0.827637f, 0.022568f, 0.819824f, + 0.022339f, 0.812500f, 0.022736f, 0.801270f, 0.022873f, 0.790527f, 0.022751f, 0.780273f, + 0.022614f, 0.770508f, 0.022308f, 0.760742f, 0.022003f, 0.751465f, 0.021896f, 0.738281f, + 0.021912f, 0.724609f, 0.021698f, 0.711914f, 0.021271f, 0.699707f, 0.020676f, 0.687500f, + 0.020096f, 0.675293f, 0.019913f, 0.658691f, 0.019531f, 0.641602f, 0.019119f, 0.625488f, + 0.018433f, 0.609863f, 0.017456f, 0.593750f, 0.016678f, 0.576660f, 0.016357f, 0.553223f, + 0.015587f, 0.531738f, 0.014587f, 0.510742f, 0.013428f, 0.489014f, 0.012344f, 0.464111f, + 0.011665f, 0.433105f, 0.010361f, 0.403809f, 0.008804f, 0.372803f, 0.007610f, 0.334473f, + 0.006142f, 0.288818f, 0.004189f, 0.240356f, 0.002451f, 0.166870f, 0.000427f, 0.060730f, + 0.000000f, 1.000000f, 0.002254f, 0.997559f, 0.005020f, 0.992676f, 0.006535f, 0.989746f, + 0.009361f, 0.983398f, 0.010857f, 0.979004f, 0.012276f, 0.975098f, 0.014267f, 0.968262f, + 0.016144f, 0.962891f, 0.017197f, 0.958496f, 0.017914f, 0.953613f, 0.019135f, 0.947266f, + 0.020462f, 0.941895f, 0.020981f, 0.937500f, 0.021469f, 0.933105f, 0.022339f, 0.927246f, + 0.023392f, 0.919922f, 0.024200f, 0.914062f, 0.024628f, 0.909180f, 0.024734f, 0.904297f, + 0.025467f, 0.897949f, 0.026093f, 0.889648f, 0.026794f, 0.882812f, 0.027237f, 0.876953f, + 0.027145f, 0.870605f, 0.027359f, 0.864746f, 0.027695f, 0.856445f, 0.028198f, 0.847168f, + 0.028442f, 0.839355f, 0.028412f, 0.831543f, 0.028610f, 0.823730f, 0.028366f, 0.816895f, + 0.028549f, 0.807617f, 0.028885f, 0.796875f, 0.028900f, 0.786621f, 0.028839f, 0.776855f, + 0.028412f, 0.767578f, 0.028015f, 0.757812f, 0.027695f, 0.748047f, 0.027710f, 0.734375f, + 0.027634f, 0.721680f, 0.027313f, 0.709473f, 0.026672f, 0.697754f, 0.025955f, 0.685547f, + 0.025253f, 0.673340f, 0.025208f, 0.655762f, 0.024612f, 0.639648f, 0.023865f, 0.623535f, + 0.022964f, 0.607910f, 0.021942f, 0.593262f, 0.021088f, 0.573242f, 0.020432f, 0.551758f, + 0.019470f, 0.530762f, 0.018173f, 0.509766f, 0.016678f, 0.488525f, 0.015549f, 0.461914f, + 0.014511f, 0.432373f, 0.012840f, 0.403076f, 0.010925f, 0.372559f, 0.009460f, 0.333496f, + 0.007565f, 0.288330f, 0.005146f, 0.241333f, 0.003029f, 0.166504f, 0.000531f, 0.059662f, + 0.000000f, 1.000000f, 0.002697f, 0.997559f, 0.005894f, 0.992188f, 0.007965f, 0.988770f, + 0.011200f, 0.981934f, 0.012756f, 0.977539f, 0.014572f, 0.972168f, 0.017044f, 0.965332f, + 0.019043f, 0.960449f, 0.020172f, 0.955566f, 0.021912f, 0.949707f, 0.023605f, 0.942871f, + 0.024338f, 0.937988f, 0.025742f, 0.933105f, 0.026047f, 0.929688f, 0.027542f, 0.921387f, + 0.028931f, 0.915039f, 0.029419f, 0.909668f, 0.029968f, 0.904785f, 0.030472f, 0.899902f, + 0.031525f, 0.892090f, 0.032562f, 0.884766f, 0.032806f, 0.877930f, 0.033173f, 0.872070f, + 0.033600f, 0.866211f, 0.033691f, 0.860352f, 0.034515f, 0.851074f, 0.035126f, 0.842773f, + 0.035187f, 0.834473f, 0.035370f, 0.827637f, 0.035309f, 0.820312f, 0.035095f, 0.812988f, + 0.035431f, 0.802246f, 0.035858f, 0.792480f, 0.035919f, 0.782715f, 0.035461f, 0.773438f, + 0.035248f, 0.764648f, 0.034729f, 0.755371f, 0.034698f, 0.743652f, 0.034515f, 0.730469f, + 0.034393f, 0.718750f, 0.033813f, 0.707031f, 0.033020f, 0.695312f, 0.032104f, 0.683594f, + 0.031555f, 0.669434f, 0.031250f, 0.652832f, 0.030411f, 0.637207f, 0.029556f, 0.622070f, + 0.028336f, 0.606934f, 0.027039f, 0.591797f, 0.026337f, 0.571289f, 0.025345f, 0.549805f, + 0.023926f, 0.529785f, 0.022278f, 0.509277f, 0.020416f, 0.488281f, 0.019287f, 0.459961f, + 0.017838f, 0.431152f, 0.015717f, 0.403076f, 0.013298f, 0.373535f, 0.011597f, 0.331787f, + 0.009270f, 0.288818f, 0.006207f, 0.242065f, 0.003660f, 0.166260f, 0.000636f, 0.059082f, + 0.000000f, 1.000000f, 0.002750f, 0.997559f, 0.006912f, 0.991699f, 0.009270f, 0.987305f, + 0.012810f, 0.980469f, 0.014969f, 0.975586f, 0.017136f, 0.969727f, 0.019791f, 0.962891f, + 0.021851f, 0.957520f, 0.023514f, 0.953125f, 0.025696f, 0.945312f, 0.027924f, 0.938965f, + 0.029434f, 0.933594f, 0.030167f, 0.929199f, 0.031647f, 0.923340f, 0.033417f, 0.916504f, + 0.034363f, 0.910645f, 0.035645f, 0.904785f, 0.036224f, 0.899902f, 0.036957f, 0.894043f, + 0.038116f, 0.886230f, 0.039337f, 0.878906f, 0.039978f, 0.873047f, 0.040161f, 0.867188f, + 0.040588f, 0.861816f, 0.041168f, 0.854004f, 0.042297f, 0.845215f, 0.042786f, 0.837402f, + 0.042938f, 0.830078f, 0.042969f, 0.822754f, 0.042786f, 0.816895f, 0.043030f, 0.807129f, + 0.043671f, 0.796875f, 0.043671f, 0.787598f, 0.043427f, 0.778320f, 0.043152f, 0.770020f, + 0.042938f, 0.761230f, 0.042389f, 0.751465f, 0.042480f, 0.738770f, 0.042175f, 0.726562f, + 0.041809f, 0.714844f, 0.041138f, 0.704102f, 0.040161f, 0.692871f, 0.038879f, 0.681641f, + 0.038818f, 0.665527f, 0.038269f, 0.649902f, 0.037109f, 0.635254f, 0.035828f, 0.620117f, + 0.034454f, 0.606445f, 0.032990f, 0.589844f, 0.032104f, 0.568359f, 0.030762f, 0.548340f, + 0.029068f, 0.528809f, 0.026993f, 0.508789f, 0.024857f, 0.488770f, 0.023544f, 0.458740f, + 0.021500f, 0.430664f, 0.019043f, 0.402832f, 0.016113f, 0.373779f, 0.013977f, 0.331055f, + 0.011101f, 0.289062f, 0.007458f, 0.243042f, 0.004395f, 0.166016f, 0.000759f, 0.058838f, + 0.000000f, 1.000000f, 0.003342f, 0.997070f, 0.007214f, 0.991699f, 0.010582f, 0.985352f, + 0.014206f, 0.979492f, 0.016922f, 0.974609f, 0.020294f, 0.966797f, 0.022873f, 0.960938f, + 0.025055f, 0.955078f, 0.027206f, 0.950195f, 0.030518f, 0.941406f, 0.032654f, 0.935059f, + 0.034271f, 0.930176f, 0.035461f, 0.925293f, 0.037292f, 0.917480f, 0.039520f, 0.910645f, + 0.041046f, 0.905273f, 0.041687f, 0.899902f, 0.042664f, 0.895020f, 0.044159f, 0.887207f, + 0.045685f, 0.879883f, 0.046448f, 0.874023f, 0.047577f, 0.867676f, 0.048157f, 0.862305f, + 0.048370f, 0.855957f, 0.049652f, 0.847168f, 0.050812f, 0.839355f, 0.051025f, 0.832031f, + 0.051178f, 0.825195f, 0.051544f, 0.818848f, 0.051208f, 0.811523f, 0.052032f, 0.801270f, + 0.052368f, 0.791504f, 0.052399f, 0.783203f, 0.052032f, 0.774414f, 0.051727f, 0.766113f, + 0.051117f, 0.757812f, 0.051422f, 0.745605f, 0.051208f, 0.733887f, 0.050598f, 0.723145f, + 0.050201f, 0.711914f, 0.049347f, 0.701660f, 0.048035f, 0.690918f, 0.047272f, 0.676758f, + 0.047028f, 0.662109f, 0.045715f, 0.646973f, 0.044373f, 0.632812f, 0.042908f, 0.619141f, + 0.041046f, 0.604980f, 0.039825f, 0.585938f, 0.038483f, 0.566406f, 0.036865f, 0.546875f, + 0.034668f, 0.527832f, 0.032227f, 0.508789f, 0.029953f, 0.485596f, 0.028061f, 0.456787f, + 0.025681f, 0.429932f, 0.022537f, 0.403564f, 0.019104f, 0.374023f, 0.016663f, 0.329834f, + 0.013145f, 0.288818f, 0.008850f, 0.244263f, 0.005169f, 0.165771f, 0.000897f, 0.058228f, + 0.000000f, 1.000000f, 0.003767f, 0.996094f, 0.008530f, 0.990723f, 0.011810f, 0.984863f, + 0.015808f, 0.978516f, 0.019150f, 0.973145f, 0.023117f, 0.964844f, 0.026337f, 0.958496f, + 0.028595f, 0.952637f, 0.031525f, 0.945312f, 0.034729f, 0.937500f, 0.037415f, 0.931641f, + 0.039520f, 0.925781f, 0.041077f, 0.919922f, 0.044189f, 0.911621f, 0.045837f, 0.905762f, + 0.047455f, 0.899902f, 0.048981f, 0.895020f, 0.050262f, 0.888672f, 0.052216f, 0.880371f, + 0.053955f, 0.874023f, 0.054749f, 0.867676f, 0.055725f, 0.862305f, 0.055939f, 0.856934f, + 0.057556f, 0.848145f, 0.058502f, 0.840332f, 0.059235f, 0.833496f, 0.060120f, 0.826660f, + 0.059998f, 0.820312f, 0.060028f, 0.814453f, 0.061127f, 0.804199f, 0.061829f, 0.794922f, + 0.061707f, 0.786133f, 0.061890f, 0.778320f, 0.061462f, 0.770508f, 0.060913f, 0.762695f, + 0.060852f, 0.751953f, 0.061005f, 0.740234f, 0.060730f, 0.729492f, 0.059723f, 0.719238f, + 0.059204f, 0.708984f, 0.057770f, 0.698730f, 0.056702f, 0.687012f, 0.056244f, 0.672363f, + 0.055420f, 0.658203f, 0.054047f, 0.644531f, 0.052185f, 0.630859f, 0.050629f, 0.617676f, + 0.048615f, 0.603027f, 0.047394f, 0.583008f, 0.045624f, 0.563477f, 0.043457f, 0.545410f, + 0.040833f, 0.526855f, 0.037964f, 0.508789f, 0.035645f, 0.482422f, 0.033112f, 0.455566f, + 0.030151f, 0.430176f, 0.026382f, 0.403320f, 0.022766f, 0.372559f, 0.019562f, 0.329102f, + 0.015305f, 0.289551f, 0.010284f, 0.244263f, 0.006035f, 0.166016f, 0.001036f, 0.056915f, + 0.000000f, 1.000000f, 0.004234f, 0.996094f, 0.009125f, 0.990723f, 0.013443f, 0.983398f, + 0.017822f, 0.977051f, 0.020660f, 0.972168f, 0.025879f, 0.962891f, 0.029648f, 0.956055f, + 0.031982f, 0.950684f, 0.036255f, 0.941406f, 0.039429f, 0.934570f, 0.042450f, 0.927734f, + 0.044312f, 0.922852f, 0.048187f, 0.913574f, 0.050201f, 0.906738f, 0.053040f, 0.899902f, + 0.054657f, 0.895020f, 0.055908f, 0.890137f, 0.058502f, 0.880859f, 0.060303f, 0.874512f, + 0.062164f, 0.867676f, 0.063354f, 0.862305f, 0.064209f, 0.856934f, 0.065796f, 0.849121f, + 0.067261f, 0.841309f, 0.068359f, 0.833984f, 0.068665f, 0.827148f, 0.069824f, 0.821289f, + 0.069824f, 0.815430f, 0.070312f, 0.806152f, 0.071411f, 0.797363f, 0.071899f, 0.789551f, + 0.072144f, 0.780762f, 0.071777f, 0.773438f, 0.071533f, 0.766602f, 0.071167f, 0.756836f, + 0.071167f, 0.746094f, 0.071289f, 0.735352f, 0.070984f, 0.725586f, 0.069763f, 0.715820f, + 0.068604f, 0.706055f, 0.067139f, 0.696777f, 0.066895f, 0.681641f, 0.066101f, 0.668457f, + 0.064575f, 0.654785f, 0.062744f, 0.641602f, 0.061096f, 0.629395f, 0.058716f, 0.616699f, + 0.057251f, 0.598145f, 0.055573f, 0.580078f, 0.053314f, 0.562012f, 0.050507f, 0.544922f, + 0.047333f, 0.526367f, 0.044098f, 0.507324f, 0.041687f, 0.480469f, 0.038757f, 0.455078f, + 0.035034f, 0.429443f, 0.030624f, 0.403320f, 0.026657f, 0.369385f, 0.022934f, 0.329102f, + 0.017715f, 0.290039f, 0.011932f, 0.245239f, 0.007030f, 0.166626f, 0.001216f, 0.056305f, + 0.000000f, 1.000000f, 0.005039f, 0.995605f, 0.009857f, 0.990234f, 0.015373f, 0.982422f, + 0.019577f, 0.976562f, 0.023788f, 0.969238f, 0.028442f, 0.960938f, 0.032928f, 0.954102f, + 0.036102f, 0.947266f, 0.040375f, 0.938477f, 0.044006f, 0.931152f, 0.047607f, 0.924805f, + 0.050537f, 0.916992f, 0.053864f, 0.908691f, 0.057343f, 0.901367f, 0.059540f, 0.895508f, + 0.062073f, 0.889648f, 0.064453f, 0.881836f, 0.067749f, 0.874023f, 0.069397f, 0.867676f, + 0.070923f, 0.862305f, 0.072266f, 0.856934f, 0.073730f, 0.849609f, 0.075806f, 0.841309f, + 0.077515f, 0.833984f, 0.078369f, 0.828125f, 0.079163f, 0.821289f, 0.079285f, 0.815918f, + 0.080688f, 0.807617f, 0.081726f, 0.798828f, 0.082458f, 0.790527f, 0.082581f, 0.783203f, + 0.082825f, 0.775879f, 0.082458f, 0.769043f, 0.082092f, 0.760742f, 0.082703f, 0.749512f, + 0.082153f, 0.739746f, 0.082092f, 0.729980f, 0.081238f, 0.721191f, 0.080017f, 0.711914f, + 0.078491f, 0.703125f, 0.078064f, 0.690430f, 0.077148f, 0.676270f, 0.075867f, 0.664062f, + 0.074280f, 0.651855f, 0.072144f, 0.640137f, 0.070068f, 0.627441f, 0.067932f, 0.611816f, + 0.066162f, 0.594727f, 0.063904f, 0.577148f, 0.061188f, 0.560547f, 0.057861f, 0.543457f, + 0.054413f, 0.525879f, 0.051392f, 0.503418f, 0.048370f, 0.479248f, 0.044586f, 0.453857f, + 0.040039f, 0.428955f, 0.034973f, 0.403809f, 0.030685f, 0.367188f, 0.026230f, 0.328857f, + 0.020370f, 0.291016f, 0.013924f, 0.240845f, 0.007980f, 0.166626f, 0.001383f, 0.055695f, + 0.000000f, 1.000000f, 0.005764f, 0.995117f, 0.010727f, 0.990234f, 0.016769f, 0.981934f, + 0.021439f, 0.975586f, 0.026550f, 0.966797f, 0.031952f, 0.958984f, 0.035492f, 0.953125f, + 0.040680f, 0.943359f, 0.045532f, 0.935059f, 0.049469f, 0.928223f, 0.052673f, 0.921875f, + 0.056763f, 0.912109f, 0.061493f, 0.903809f, 0.063782f, 0.896973f, 0.066895f, 0.891113f, + 0.069763f, 0.883301f, 0.073608f, 0.874512f, 0.075989f, 0.867676f, 0.078674f, 0.860840f, + 0.080200f, 0.855957f, 0.081726f, 0.849609f, 0.084290f, 0.841309f, 0.086365f, 0.833496f, + 0.087585f, 0.827637f, 0.089111f, 0.821289f, 0.089905f, 0.815918f, 0.090820f, 0.808105f, + 0.092346f, 0.799805f, 0.093506f, 0.791504f, 0.093567f, 0.784668f, 0.093811f, 0.777832f, + 0.093689f, 0.770996f, 0.093750f, 0.763672f, 0.094360f, 0.752930f, 0.094299f, 0.743164f, + 0.094055f, 0.734375f, 0.093506f, 0.725586f, 0.092468f, 0.717285f, 0.090942f, 0.708496f, + 0.090027f, 0.696289f, 0.089539f, 0.684082f, 0.088135f, 0.671875f, 0.086670f, 0.660645f, + 0.084778f, 0.648926f, 0.082092f, 0.637695f, 0.079590f, 0.625000f, 0.077942f, 0.607422f, + 0.075684f, 0.591309f, 0.072937f, 0.574707f, 0.069580f, 0.558594f, 0.065674f, 0.542969f, + 0.061829f, 0.524902f, 0.058685f, 0.500977f, 0.055206f, 0.477051f, 0.050598f, 0.453125f, + 0.045532f, 0.429199f, 0.039581f, 0.404785f, 0.035309f, 0.365723f, 0.029953f, 0.329346f, + 0.023056f, 0.291016f, 0.015854f, 0.237793f, 0.009064f, 0.166870f, 0.001560f, 0.055237f, + 0.000000f, 1.000000f, 0.006138f, 0.995117f, 0.011711f, 0.989258f, 0.018356f, 0.980957f, + 0.023132f, 0.974609f, 0.030045f, 0.964844f, 0.034698f, 0.957520f, 0.039764f, 0.950195f, + 0.045166f, 0.940430f, 0.050354f, 0.932129f, 0.053925f, 0.925781f, 0.058868f, 0.916504f, + 0.063782f, 0.907227f, 0.067871f, 0.899414f, 0.071411f, 0.893066f, 0.074951f, 0.885254f, + 0.079224f, 0.875977f, 0.082703f, 0.868652f, 0.085266f, 0.861328f, 0.087219f, 0.855957f, + 0.089966f, 0.848633f, 0.092896f, 0.840332f, 0.095032f, 0.833008f, 0.097839f, 0.826660f, + 0.098694f, 0.820801f, 0.099731f, 0.815430f, 0.101562f, 0.807617f, 0.103088f, 0.798828f, + 0.104248f, 0.791992f, 0.105103f, 0.784668f, 0.105469f, 0.778320f, 0.105347f, 0.771973f, + 0.105713f, 0.764648f, 0.106689f, 0.754395f, 0.106934f, 0.745605f, 0.106689f, 0.737793f, + 0.106262f, 0.729004f, 0.104797f, 0.721191f, 0.103760f, 0.713379f, 0.103027f, 0.701660f, + 0.102295f, 0.690430f, 0.101624f, 0.679199f, 0.099670f, 0.667969f, 0.097778f, 0.657227f, + 0.095032f, 0.646484f, 0.092468f, 0.635742f, 0.090576f, 0.619141f, 0.088501f, 0.603027f, + 0.085510f, 0.588379f, 0.082092f, 0.573242f, 0.078186f, 0.558105f, 0.073730f, 0.542969f, + 0.070312f, 0.520020f, 0.066650f, 0.497803f, 0.061981f, 0.475342f, 0.056885f, 0.452881f, + 0.050812f, 0.429932f, 0.045319f, 0.400635f, 0.040100f, 0.365234f, 0.033478f, 0.329102f, + 0.025726f, 0.291016f, 0.018326f, 0.236084f, 0.010094f, 0.166870f, 0.001750f, 0.054657f, + 0.000000f, 1.000000f, 0.006809f, 0.995117f, 0.012581f, 0.988770f, 0.019684f, 0.980469f, + 0.025528f, 0.972656f, 0.032959f, 0.963379f, 0.038269f, 0.956055f, 0.043854f, 0.946289f, + 0.050293f, 0.937500f, 0.055115f, 0.929688f, 0.060089f, 0.921387f, 0.065796f, 0.911133f, + 0.070801f, 0.902832f, 0.074585f, 0.895996f, 0.078857f, 0.888184f, 0.084106f, 0.877930f, + 0.087830f, 0.870117f, 0.091553f, 0.862793f, 0.094482f, 0.856445f, 0.097839f, 0.848633f, + 0.101135f, 0.839844f, 0.104370f, 0.832031f, 0.106140f, 0.825684f, 0.108459f, 0.819824f, + 0.110046f, 0.814941f, 0.111877f, 0.805664f, 0.114014f, 0.797852f, 0.115601f, 0.791504f, + 0.116577f, 0.784668f, 0.117249f, 0.778809f, 0.117798f, 0.772461f, 0.118103f, 0.764160f, + 0.118774f, 0.755371f, 0.119446f, 0.747070f, 0.119812f, 0.739258f, 0.118896f, 0.731934f, + 0.118347f, 0.724609f, 0.117004f, 0.717773f, 0.117126f, 0.705566f, 0.115784f, 0.694336f, + 0.115051f, 0.684570f, 0.113342f, 0.674316f, 0.111328f, 0.664551f, 0.108887f, 0.654785f, + 0.105957f, 0.643555f, 0.104248f, 0.628418f, 0.101685f, 0.613770f, 0.098999f, 0.600098f, + 0.095459f, 0.585938f, 0.091736f, 0.572266f, 0.087036f, 0.557129f, 0.082886f, 0.537598f, + 0.079224f, 0.516113f, 0.074585f, 0.495605f, 0.069092f, 0.474609f, 0.063049f, 0.453125f, + 0.056732f, 0.430664f, 0.050995f, 0.397949f, 0.044586f, 0.364258f, 0.037354f, 0.329346f, + 0.028717f, 0.292480f, 0.020645f, 0.234497f, 0.011307f, 0.167725f, 0.001945f, 0.054443f, + 0.000000f, 1.000000f, 0.007446f, 0.994629f, 0.014336f, 0.987305f, 0.021194f, 0.979980f, + 0.028076f, 0.970703f, 0.035339f, 0.962402f, 0.041168f, 0.954590f, 0.048096f, 0.943848f, + 0.054718f, 0.935059f, 0.059662f, 0.927734f, 0.066162f, 0.916504f, 0.072693f, 0.907715f, + 0.077759f, 0.899414f, 0.082092f, 0.891602f, 0.087646f, 0.880859f, 0.092712f, 0.872559f, + 0.096436f, 0.865234f, 0.100403f, 0.857910f, 0.104492f, 0.849121f, 0.108337f, 0.839844f, + 0.111755f, 0.832520f, 0.115051f, 0.825195f, 0.117798f, 0.818848f, 0.119568f, 0.812988f, + 0.122559f, 0.804199f, 0.124878f, 0.796875f, 0.126343f, 0.790039f, 0.127808f, 0.783691f, + 0.129272f, 0.778320f, 0.129395f, 0.771973f, 0.131104f, 0.763184f, 0.132080f, 0.754883f, + 0.132935f, 0.747559f, 0.132324f, 0.740234f, 0.132568f, 0.733398f, 0.132080f, 0.726562f, + 0.131226f, 0.717773f, 0.130615f, 0.708008f, 0.130249f, 0.698242f, 0.129028f, 0.688965f, + 0.127563f, 0.679688f, 0.125488f, 0.670410f, 0.122925f, 0.661621f, 0.120972f, 0.649902f, + 0.118958f, 0.636719f, 0.116211f, 0.623535f, 0.113525f, 0.610840f, 0.109741f, 0.597656f, + 0.105530f, 0.583984f, 0.101013f, 0.570312f, 0.097107f, 0.553223f, 0.092834f, 0.533203f, + 0.088257f, 0.514160f, 0.082764f, 0.494873f, 0.076660f, 0.474609f, 0.069763f, 0.453857f, + 0.063538f, 0.427490f, 0.057159f, 0.395996f, 0.049530f, 0.363281f, 0.041138f, 0.329102f, + 0.031555f, 0.292969f, 0.023087f, 0.233276f, 0.012466f, 0.168335f, 0.002146f, 0.053955f, + 0.000000f, 1.000000f, 0.007866f, 0.994629f, 0.015533f, 0.986816f, 0.022812f, 0.979492f, + 0.031311f, 0.969238f, 0.037750f, 0.961914f, 0.045288f, 0.951172f, 0.052368f, 0.941895f, + 0.058899f, 0.933594f, 0.066101f, 0.922363f, 0.072876f, 0.912598f, 0.078735f, 0.904785f, + 0.083618f, 0.895996f, 0.090881f, 0.884766f, 0.096497f, 0.875488f, 0.101318f, 0.867676f, + 0.105835f, 0.860840f, 0.110291f, 0.850098f, 0.115845f, 0.840820f, 0.119690f, 0.833496f, + 0.122620f, 0.826172f, 0.125854f, 0.819824f, 0.128906f, 0.811035f, 0.132935f, 0.802246f, + 0.135376f, 0.795410f, 0.137695f, 0.788574f, 0.139282f, 0.783203f, 0.140625f, 0.777344f, + 0.142456f, 0.769531f, 0.144287f, 0.761230f, 0.144897f, 0.753906f, 0.146118f, 0.747070f, + 0.145752f, 0.740723f, 0.146240f, 0.734375f, 0.145020f, 0.728027f, 0.146118f, 0.718262f, + 0.145630f, 0.709473f, 0.144775f, 0.700684f, 0.143555f, 0.692383f, 0.142334f, 0.683594f, + 0.140015f, 0.675293f, 0.137939f, 0.666992f, 0.135986f, 0.655273f, 0.133789f, 0.643066f, + 0.131592f, 0.630859f, 0.128174f, 0.619141f, 0.125000f, 0.607422f, 0.120667f, 0.594727f, + 0.116089f, 0.582520f, 0.112000f, 0.565430f, 0.107849f, 0.548340f, 0.102722f, 0.530762f, + 0.097229f, 0.512207f, 0.091003f, 0.494141f, 0.084351f, 0.475342f, 0.077087f, 0.453125f, + 0.070435f, 0.423828f, 0.062805f, 0.394287f, 0.054779f, 0.363281f, 0.045197f, 0.329834f, + 0.034973f, 0.291260f, 0.025497f, 0.232422f, 0.013664f, 0.169312f, 0.002337f, 0.053894f, + 0.000000f, 1.000000f, 0.008675f, 0.994629f, 0.016830f, 0.986816f, 0.024796f, 0.978027f, + 0.033447f, 0.968750f, 0.041473f, 0.958984f, 0.049957f, 0.948730f, 0.056702f, 0.939941f, + 0.064758f, 0.929199f, 0.071960f, 0.919434f, 0.078735f, 0.910156f, 0.085144f, 0.900391f, + 0.092285f, 0.889648f, 0.098633f, 0.880371f, 0.103516f, 0.872559f, 0.109558f, 0.863281f, + 0.115051f, 0.852539f, 0.120544f, 0.843750f, 0.125732f, 0.835449f, 0.129883f, 0.828125f, + 0.133789f, 0.819336f, 0.137573f, 0.810059f, 0.142456f, 0.801758f, 0.145142f, 0.794434f, + 0.148071f, 0.787598f, 0.149780f, 0.781738f, 0.152466f, 0.773926f, 0.154907f, 0.766113f, + 0.156616f, 0.759277f, 0.158325f, 0.752930f, 0.159180f, 0.746582f, 0.159180f, 0.740723f, + 0.159546f, 0.734863f, 0.160278f, 0.725586f, 0.160522f, 0.717773f, 0.160278f, 0.708984f, + 0.159912f, 0.702148f, 0.158569f, 0.694336f, 0.157227f, 0.687500f, 0.155884f, 0.680176f, + 0.153931f, 0.669434f, 0.152344f, 0.658691f, 0.149780f, 0.647461f, 0.147339f, 0.637207f, + 0.144287f, 0.626953f, 0.140625f, 0.616211f, 0.136597f, 0.604980f, 0.131958f, 0.592773f, + 0.128052f, 0.576660f, 0.123840f, 0.561035f, 0.118469f, 0.545410f, 0.112732f, 0.528809f, + 0.106262f, 0.511719f, 0.099121f, 0.494385f, 0.091797f, 0.474365f, 0.085327f, 0.447998f, + 0.077637f, 0.420898f, 0.069214f, 0.393311f, 0.059723f, 0.363037f, 0.049408f, 0.331055f, + 0.038940f, 0.287842f, 0.028168f, 0.233154f, 0.014854f, 0.169922f, 0.002617f, 0.054565f, + 0.000000f, 1.000000f, 0.009232f, 0.994141f, 0.018173f, 0.986328f, 0.027130f, 0.976562f, + 0.035339f, 0.968262f, 0.045166f, 0.957031f, 0.053101f, 0.947754f, 0.060852f, 0.937012f, + 0.069824f, 0.926270f, 0.077209f, 0.917480f, 0.085205f, 0.906250f, 0.092651f, 0.895508f, + 0.099609f, 0.886230f, 0.105286f, 0.877930f, 0.113342f, 0.866211f, 0.119629f, 0.856445f, + 0.125366f, 0.847168f, 0.130005f, 0.838867f, 0.135376f, 0.830078f, 0.141724f, 0.819336f, + 0.146484f, 0.811035f, 0.149658f, 0.802734f, 0.154053f, 0.795410f, 0.157959f, 0.788574f, + 0.160522f, 0.779785f, 0.164185f, 0.770996f, 0.166748f, 0.763672f, 0.169556f, 0.757324f, + 0.170654f, 0.750977f, 0.171265f, 0.745605f, 0.173218f, 0.738770f, 0.174316f, 0.730957f, + 0.175415f, 0.723145f, 0.175537f, 0.716797f, 0.175293f, 0.709473f, 0.174927f, 0.703125f, + 0.174072f, 0.695801f, 0.172485f, 0.689453f, 0.171265f, 0.679688f, 0.170654f, 0.670410f, + 0.168823f, 0.661133f, 0.165649f, 0.651855f, 0.163696f, 0.642578f, 0.160522f, 0.633301f, + 0.156616f, 0.623535f, 0.152954f, 0.613770f, 0.149170f, 0.600098f, 0.144775f, 0.586426f, + 0.140259f, 0.572266f, 0.134888f, 0.558105f, 0.129150f, 0.543457f, 0.122437f, 0.527344f, + 0.115417f, 0.510742f, 0.108276f, 0.491699f, 0.101013f, 0.468750f, 0.093323f, 0.444824f, + 0.084839f, 0.419678f, 0.075439f, 0.393066f, 0.065125f, 0.364258f, 0.053772f, 0.331787f, + 0.042877f, 0.285400f, 0.030746f, 0.232910f, 0.016144f, 0.171509f, 0.002817f, 0.054291f, + 0.000000f, 1.000000f, 0.008987f, 0.994629f, 0.018814f, 0.986328f, 0.029449f, 0.975586f, + 0.039124f, 0.965332f, 0.048492f, 0.956055f, 0.057098f, 0.945312f, 0.066772f, 0.934570f, + 0.074280f, 0.925293f, 0.084045f, 0.912598f, 0.091675f, 0.902832f, 0.099365f, 0.893066f, + 0.107788f, 0.881836f, 0.114929f, 0.871094f, 0.121765f, 0.860840f, 0.127930f, 0.852539f, + 0.135742f, 0.841309f, 0.141724f, 0.831543f, 0.147461f, 0.822266f, 0.153320f, 0.812988f, + 0.157593f, 0.804688f, 0.162109f, 0.796387f, 0.166870f, 0.786621f, 0.171021f, 0.777832f, + 0.175659f, 0.770508f, 0.178101f, 0.763184f, 0.180298f, 0.756836f, 0.182495f, 0.750000f, + 0.185425f, 0.741699f, 0.187256f, 0.734375f, 0.188721f, 0.727539f, 0.189697f, 0.720703f, + 0.189697f, 0.715332f, 0.190308f, 0.708496f, 0.189819f, 0.703125f, 0.189575f, 0.694824f, + 0.189819f, 0.687012f, 0.188477f, 0.679199f, 0.187012f, 0.671387f, 0.185059f, 0.663574f, + 0.183228f, 0.655762f, 0.179688f, 0.647461f, 0.177002f, 0.639160f, 0.173340f, 0.629395f, + 0.170532f, 0.618164f, 0.166992f, 0.606445f, 0.161987f, 0.593750f, 0.157104f, 0.582031f, + 0.151855f, 0.568848f, 0.146240f, 0.555664f, 0.139893f, 0.541504f, 0.132446f, 0.525879f, + 0.125977f, 0.506836f, 0.118530f, 0.486816f, 0.110352f, 0.465576f, 0.101868f, 0.443359f, + 0.091919f, 0.418945f, 0.081726f, 0.393555f, 0.070129f, 0.365234f, 0.058929f, 0.327393f, + 0.046570f, 0.283691f, 0.033203f, 0.233398f, 0.017288f, 0.172241f, 0.003036f, 0.054382f, + 0.000000f, 1.000000f, 0.010231f, 0.993652f, 0.020981f, 0.984863f, 0.031113f, 0.975098f, + 0.041016f, 0.965332f, 0.051483f, 0.954102f, 0.061768f, 0.943359f, 0.070801f, 0.932129f, + 0.080688f, 0.921387f, 0.089783f, 0.910645f, 0.098816f, 0.898926f, 0.107605f, 0.888184f, + 0.116211f, 0.877930f, 0.123169f, 0.867188f, 0.130981f, 0.855957f, 0.139282f, 0.845215f, + 0.145630f, 0.835449f, 0.151855f, 0.826660f, 0.157959f, 0.816406f, 0.163696f, 0.806641f, + 0.170410f, 0.796387f, 0.175293f, 0.787598f, 0.179565f, 0.779297f, 0.184082f, 0.771484f, + 0.188110f, 0.762207f, 0.192261f, 0.753906f, 0.195435f, 0.745605f, 0.197510f, 0.738770f, + 0.199829f, 0.731934f, 0.202271f, 0.725586f, 0.203125f, 0.719727f, 0.204346f, 0.713379f, + 0.205322f, 0.706055f, 0.205933f, 0.699219f, 0.205811f, 0.692383f, 0.205322f, 0.686035f, + 0.204346f, 0.679688f, 0.203491f, 0.672363f, 0.201904f, 0.666016f, 0.199097f, 0.658691f, + 0.197388f, 0.649414f, 0.194458f, 0.640137f, 0.192017f, 0.630859f, 0.188599f, 0.621582f, + 0.184814f, 0.610840f, 0.180176f, 0.600098f, 0.175537f, 0.589355f, 0.169800f, 0.578613f, + 0.163940f, 0.566406f, 0.157715f, 0.552246f, 0.151489f, 0.536621f, 0.144043f, 0.520020f, + 0.136719f, 0.502441f, 0.128296f, 0.484131f, 0.119812f, 0.464600f, 0.109863f, 0.442871f, + 0.099304f, 0.419434f, 0.088135f, 0.394775f, 0.076477f, 0.361816f, 0.064148f, 0.324951f, + 0.050781f, 0.284180f, 0.035797f, 0.234619f, 0.018677f, 0.174194f, 0.003256f, 0.054749f, + 0.000000f, 1.000000f, 0.010963f, 0.993652f, 0.021759f, 0.984863f, 0.033356f, 0.975098f, + 0.044403f, 0.963379f, 0.054718f, 0.953125f, 0.066101f, 0.940918f, 0.075806f, 0.930664f, + 0.086243f, 0.917969f, 0.096436f, 0.907227f, 0.105530f, 0.895996f, 0.114624f, 0.884277f, + 0.123718f, 0.872559f, 0.131958f, 0.862305f, 0.140015f, 0.851562f, 0.148682f, 0.839844f, + 0.156006f, 0.829102f, 0.163696f, 0.819336f, 0.169556f, 0.809570f, 0.175659f, 0.799805f, + 0.182373f, 0.790039f, 0.187012f, 0.780762f, 0.192505f, 0.771484f, 0.197754f, 0.762695f, + 0.201660f, 0.754395f, 0.205811f, 0.746582f, 0.209229f, 0.738770f, 0.211914f, 0.730957f, + 0.214966f, 0.722656f, 0.216675f, 0.715820f, 0.218750f, 0.708496f, 0.220215f, 0.702637f, + 0.221069f, 0.696289f, 0.221191f, 0.690430f, 0.221313f, 0.684570f, 0.221069f, 0.677246f, + 0.219849f, 0.670410f, 0.219360f, 0.663086f, 0.217041f, 0.655273f, 0.215332f, 0.648438f, + 0.212891f, 0.640625f, 0.210205f, 0.632324f, 0.206665f, 0.624512f, 0.202393f, 0.615723f, + 0.198364f, 0.606445f, 0.193604f, 0.596191f, 0.188354f, 0.584961f, 0.182861f, 0.572754f, + 0.176636f, 0.560059f, 0.170410f, 0.546387f, 0.163452f, 0.532227f, 0.155762f, 0.517090f, + 0.147217f, 0.500488f, 0.138306f, 0.483154f, 0.128540f, 0.464111f, 0.117737f, 0.443115f, + 0.107361f, 0.418457f, 0.095337f, 0.390625f, 0.082520f, 0.359863f, 0.069275f, 0.324707f, + 0.054626f, 0.284424f, 0.038544f, 0.235840f, 0.019958f, 0.175537f, 0.003546f, 0.055634f, + 0.000000f, 1.000000f, 0.012215f, 0.993164f, 0.023682f, 0.984375f, 0.035767f, 0.974121f, + 0.047485f, 0.961914f, 0.058838f, 0.950684f, 0.070312f, 0.939453f, 0.081848f, 0.927246f, + 0.092224f, 0.915527f, 0.102295f, 0.904297f, 0.112793f, 0.892090f, 0.122742f, 0.880371f, + 0.131714f, 0.869629f, 0.140503f, 0.858398f, 0.149536f, 0.846191f, 0.158081f, 0.834961f, + 0.165649f, 0.823730f, 0.174194f, 0.812988f, 0.181641f, 0.802734f, 0.187622f, 0.792480f, + 0.195312f, 0.781738f, 0.200928f, 0.771973f, 0.205933f, 0.762695f, 0.210938f, 0.753906f, + 0.216675f, 0.744629f, 0.220581f, 0.736328f, 0.224243f, 0.728516f, 0.227295f, 0.720703f, + 0.230469f, 0.712402f, 0.233398f, 0.705078f, 0.234985f, 0.698242f, 0.236206f, 0.691406f, + 0.236938f, 0.685547f, 0.238037f, 0.679199f, 0.237183f, 0.673340f, 0.237305f, 0.667480f, + 0.236694f, 0.661133f, 0.234253f, 0.655273f, 0.233154f, 0.648438f, 0.231201f, 0.640625f, + 0.228027f, 0.633301f, 0.225464f, 0.625000f, 0.221802f, 0.617188f, 0.217529f, 0.608398f, + 0.213745f, 0.599609f, 0.208252f, 0.589355f, 0.202393f, 0.579102f, 0.196655f, 0.568359f, + 0.189941f, 0.556152f, 0.182739f, 0.543457f, 0.174805f, 0.530273f, 0.166992f, 0.515625f, + 0.157471f, 0.498535f, 0.148071f, 0.480713f, 0.137939f, 0.461182f, 0.126953f, 0.439209f, + 0.114990f, 0.415283f, 0.102417f, 0.388672f, 0.088989f, 0.358887f, 0.074463f, 0.324951f, + 0.058289f, 0.285400f, 0.041046f, 0.237427f, 0.021713f, 0.171631f, 0.003746f, 0.055847f, + 0.000000f, 1.000000f, 0.012253f, 0.993652f, 0.025192f, 0.983398f, 0.038239f, 0.972168f, + 0.050659f, 0.960449f, 0.062988f, 0.948730f, 0.075439f, 0.936523f, 0.086792f, 0.924805f, + 0.097900f, 0.912598f, 0.109253f, 0.900391f, 0.119995f, 0.887695f, 0.130249f, 0.875977f, + 0.140015f, 0.864258f, 0.150269f, 0.852051f, 0.160278f, 0.840332f, 0.169067f, 0.828613f, + 0.177368f, 0.817383f, 0.185669f, 0.806641f, 0.193359f, 0.795898f, 0.200439f, 0.785645f, + 0.207642f, 0.774902f, 0.213989f, 0.765137f, 0.220703f, 0.754883f, 0.225342f, 0.745605f, + 0.231567f, 0.736328f, 0.234863f, 0.727539f, 0.238892f, 0.719238f, 0.242920f, 0.710938f, + 0.245483f, 0.703613f, 0.248901f, 0.695312f, 0.250732f, 0.688477f, 0.251709f, 0.682129f, + 0.253418f, 0.675293f, 0.253418f, 0.669922f, 0.253662f, 0.663574f, 0.253174f, 0.657715f, + 0.252686f, 0.651855f, 0.250977f, 0.645996f, 0.249268f, 0.639160f, 0.247437f, 0.632812f, + 0.244141f, 0.625977f, 0.240967f, 0.618164f, 0.237183f, 0.610840f, 0.232178f, 0.602051f, + 0.227417f, 0.593750f, 0.222168f, 0.583984f, 0.216309f, 0.574219f, 0.210327f, 0.563477f, + 0.203613f, 0.551758f, 0.195679f, 0.539062f, 0.186646f, 0.525879f, 0.178345f, 0.511230f, + 0.168701f, 0.495117f, 0.158569f, 0.477783f, 0.147583f, 0.458740f, 0.135376f, 0.437744f, + 0.122864f, 0.414551f, 0.109924f, 0.388916f, 0.095093f, 0.359619f, 0.079529f, 0.325684f, + 0.062469f, 0.286133f, 0.044067f, 0.236450f, 0.023499f, 0.169922f, 0.004017f, 0.056610f, + 0.000000f, 1.000000f, 0.013107f, 0.993164f, 0.026093f, 0.983398f, 0.039032f, 0.972656f, + 0.052094f, 0.960938f, 0.065063f, 0.948242f, 0.077698f, 0.936035f, 0.089539f, 0.923828f, + 0.101074f, 0.911621f, 0.113403f, 0.898438f, 0.123840f, 0.886719f, 0.134888f, 0.874023f, + 0.144897f, 0.861816f, 0.155396f, 0.849609f, 0.165405f, 0.837891f, 0.174805f, 0.826172f, + 0.183838f, 0.814453f, 0.191895f, 0.803223f, 0.200684f, 0.791992f, 0.208130f, 0.781250f, + 0.214966f, 0.770996f, 0.221802f, 0.760742f, 0.228638f, 0.750488f, 0.233643f, 0.741211f, + 0.239380f, 0.731445f, 0.243774f, 0.722656f, 0.248779f, 0.713379f, 0.252686f, 0.705566f, + 0.256348f, 0.697266f, 0.259277f, 0.689453f, 0.262207f, 0.682129f, 0.263672f, 0.674805f, + 0.264404f, 0.668457f, 0.265869f, 0.662109f, 0.266357f, 0.656250f, 0.265625f, 0.650391f, + 0.265137f, 0.644531f, 0.263672f, 0.638184f, 0.261963f, 0.632324f, 0.259766f, 0.625977f, + 0.257080f, 0.619141f, 0.254150f, 0.612305f, 0.250244f, 0.604492f, 0.246094f, 0.596191f, + 0.241455f, 0.588379f, 0.236572f, 0.579102f, 0.230347f, 0.569336f, 0.223999f, 0.559082f, + 0.216919f, 0.547852f, 0.209106f, 0.535156f, 0.200806f, 0.521973f, 0.192139f, 0.508301f, + 0.181885f, 0.491943f, 0.171387f, 0.475098f, 0.160400f, 0.456299f, 0.148315f, 0.435547f, + 0.135132f, 0.412598f, 0.121704f, 0.386963f, 0.106140f, 0.357422f, 0.090454f, 0.323975f, + 0.072388f, 0.284668f, 0.052643f, 0.235352f, 0.030457f, 0.169189f, 0.006878f, 0.060669f, + 0.000000f, 1.000000f, 0.013000f, 0.993164f, 0.026215f, 0.983398f, 0.039032f, 0.972656f, + 0.052002f, 0.960938f, 0.064575f, 0.948730f, 0.077454f, 0.936523f, 0.089417f, 0.923828f, + 0.101440f, 0.911133f, 0.113586f, 0.898438f, 0.124390f, 0.886230f, 0.135620f, 0.873535f, + 0.145996f, 0.861816f, 0.156494f, 0.849121f, 0.166504f, 0.837402f, 0.176147f, 0.825684f, + 0.184570f, 0.813965f, 0.193481f, 0.802246f, 0.201660f, 0.791504f, 0.210449f, 0.779785f, + 0.217285f, 0.770020f, 0.224976f, 0.758789f, 0.231201f, 0.749023f, 0.237671f, 0.738770f, + 0.243408f, 0.729492f, 0.248901f, 0.720215f, 0.253174f, 0.711426f, 0.257568f, 0.702637f, + 0.261719f, 0.693848f, 0.264160f, 0.686523f, 0.266846f, 0.678711f, 0.270508f, 0.670898f, + 0.271729f, 0.664551f, 0.273438f, 0.657715f, 0.273682f, 0.651855f, 0.273926f, 0.645996f, + 0.273193f, 0.639648f, 0.273438f, 0.633301f, 0.271240f, 0.627441f, 0.270020f, 0.620605f, + 0.267578f, 0.613770f, 0.265137f, 0.606934f, 0.261963f, 0.599121f, 0.258301f, 0.591309f, + 0.253418f, 0.582520f, 0.249268f, 0.574219f, 0.243408f, 0.563965f, 0.237061f, 0.554199f, + 0.230957f, 0.542969f, 0.223999f, 0.530762f, 0.216187f, 0.517578f, 0.207520f, 0.503418f, + 0.198242f, 0.488037f, 0.188232f, 0.471436f, 0.177246f, 0.452637f, 0.165283f, 0.432617f, + 0.152466f, 0.409424f, 0.138550f, 0.384277f, 0.123474f, 0.355469f, 0.107422f, 0.322266f, + 0.088745f, 0.283203f, 0.068054f, 0.234253f, 0.043793f, 0.168579f, 0.014336f, 0.061371f, + 0.000000f, 1.000000f, 0.013023f, 0.993164f, 0.026016f, 0.983398f, 0.039551f, 0.972168f, + 0.051727f, 0.960938f, 0.064941f, 0.948730f, 0.077148f, 0.936523f, 0.089233f, 0.923828f, + 0.101868f, 0.911133f, 0.113586f, 0.898438f, 0.125244f, 0.886230f, 0.135986f, 0.873535f, + 0.147583f, 0.860840f, 0.157715f, 0.848633f, 0.167969f, 0.836914f, 0.177368f, 0.824707f, + 0.186279f, 0.813477f, 0.195923f, 0.801758f, 0.204346f, 0.790039f, 0.212402f, 0.779297f, + 0.220215f, 0.768066f, 0.227295f, 0.757812f, 0.234497f, 0.747070f, 0.241333f, 0.737305f, + 0.247559f, 0.727051f, 0.252441f, 0.717773f, 0.258057f, 0.708496f, 0.262451f, 0.699707f, + 0.266846f, 0.691406f, 0.270508f, 0.682617f, 0.273682f, 0.674805f, 0.277100f, 0.666992f, + 0.278564f, 0.660156f, 0.280029f, 0.653320f, 0.281250f, 0.646973f, 0.281982f, 0.640625f, + 0.281982f, 0.634766f, 0.282471f, 0.627930f, 0.281006f, 0.621582f, 0.280029f, 0.615234f, + 0.278564f, 0.608398f, 0.276123f, 0.601562f, 0.273193f, 0.593750f, 0.269775f, 0.585938f, + 0.266113f, 0.577148f, 0.262451f, 0.568848f, 0.257324f, 0.559082f, 0.251221f, 0.548340f, + 0.246094f, 0.538086f, 0.239258f, 0.525879f, 0.231567f, 0.513184f, 0.223267f, 0.498779f, + 0.214844f, 0.483887f, 0.204956f, 0.467529f, 0.194336f, 0.449219f, 0.182495f, 0.428955f, + 0.170654f, 0.406250f, 0.156860f, 0.381104f, 0.141357f, 0.352783f, 0.125000f, 0.320068f, + 0.106384f, 0.281494f, 0.084900f, 0.233032f, 0.059113f, 0.168091f, 0.025330f, 0.061462f, + 0.000000f, 1.000000f, 0.013138f, 0.993164f, 0.025894f, 0.983398f, 0.039368f, 0.972168f, + 0.052155f, 0.960449f, 0.064880f, 0.948730f, 0.077698f, 0.936035f, 0.090393f, 0.923340f, + 0.102478f, 0.911133f, 0.113831f, 0.898438f, 0.124756f, 0.886230f, 0.136841f, 0.873047f, + 0.147217f, 0.861328f, 0.158325f, 0.848633f, 0.169067f, 0.836426f, 0.178955f, 0.824219f, + 0.188232f, 0.812012f, 0.197510f, 0.800781f, 0.206665f, 0.789062f, 0.214966f, 0.777832f, + 0.222656f, 0.767090f, 0.229980f, 0.756348f, 0.238281f, 0.745605f, 0.244385f, 0.735352f, + 0.251221f, 0.725098f, 0.256592f, 0.715332f, 0.261963f, 0.706055f, 0.267090f, 0.696777f, + 0.271240f, 0.688477f, 0.277100f, 0.679688f, 0.280518f, 0.671387f, 0.282227f, 0.663574f, + 0.285645f, 0.656250f, 0.287354f, 0.648926f, 0.289551f, 0.642090f, 0.291016f, 0.635254f, + 0.291016f, 0.629395f, 0.291260f, 0.622559f, 0.291016f, 0.616211f, 0.290283f, 0.609375f, + 0.289062f, 0.602539f, 0.287109f, 0.595215f, 0.285400f, 0.588379f, 0.282227f, 0.580078f, + 0.279541f, 0.571777f, 0.274658f, 0.562988f, 0.271240f, 0.553223f, 0.265625f, 0.542969f, + 0.259766f, 0.532715f, 0.254639f, 0.520508f, 0.247314f, 0.507812f, 0.239990f, 0.494629f, + 0.231323f, 0.479248f, 0.222290f, 0.462402f, 0.211914f, 0.444336f, 0.201050f, 0.424805f, + 0.189087f, 0.402588f, 0.175415f, 0.377686f, 0.161255f, 0.349609f, 0.144531f, 0.316650f, + 0.125732f, 0.277588f, 0.104248f, 0.229980f, 0.076416f, 0.165527f, 0.039185f, 0.059326f, + 0.000000f, 1.000000f, 0.013107f, 0.992676f, 0.026016f, 0.983398f, 0.039429f, 0.972168f, + 0.052490f, 0.960449f, 0.065125f, 0.948730f, 0.078064f, 0.936035f, 0.090576f, 0.923340f, + 0.102539f, 0.911133f, 0.114441f, 0.898438f, 0.126343f, 0.885742f, 0.137939f, 0.873047f, + 0.148926f, 0.860352f, 0.159302f, 0.848145f, 0.169800f, 0.835938f, 0.179443f, 0.823730f, + 0.189941f, 0.811523f, 0.199463f, 0.799805f, 0.208740f, 0.788086f, 0.216797f, 0.776855f, + 0.224976f, 0.765625f, 0.233765f, 0.754395f, 0.240601f, 0.744141f, 0.247803f, 0.733398f, + 0.254639f, 0.723145f, 0.260986f, 0.713379f, 0.267334f, 0.703125f, 0.272217f, 0.693848f, + 0.277588f, 0.684570f, 0.281494f, 0.676270f, 0.285400f, 0.667969f, 0.289062f, 0.659668f, + 0.292725f, 0.651367f, 0.294922f, 0.644043f, 0.298096f, 0.636719f, 0.298584f, 0.630371f, + 0.300781f, 0.624023f, 0.300293f, 0.617188f, 0.301514f, 0.610352f, 0.301025f, 0.603516f, + 0.300049f, 0.596680f, 0.299072f, 0.589355f, 0.296631f, 0.582031f, 0.294678f, 0.573730f, + 0.291748f, 0.565430f, 0.288574f, 0.556152f, 0.285645f, 0.547363f, 0.280029f, 0.537109f, + 0.275391f, 0.525879f, 0.270508f, 0.514160f, 0.263916f, 0.501465f, 0.256836f, 0.488037f, + 0.249268f, 0.473145f, 0.240479f, 0.456299f, 0.231079f, 0.438477f, 0.220581f, 0.419189f, + 0.208130f, 0.397461f, 0.195557f, 0.373047f, 0.181152f, 0.345703f, 0.164307f, 0.313477f, + 0.146118f, 0.275635f, 0.123596f, 0.229370f, 0.095337f, 0.164917f, 0.054840f, 0.059937f, + 0.000000f, 1.000000f, 0.012680f, 0.993164f, 0.025787f, 0.983887f, 0.039124f, 0.972656f, + 0.052582f, 0.960449f, 0.065491f, 0.948242f, 0.077576f, 0.936523f, 0.090454f, 0.923340f, + 0.102783f, 0.910645f, 0.115173f, 0.897949f, 0.127075f, 0.885254f, 0.138062f, 0.872559f, + 0.149536f, 0.860352f, 0.160767f, 0.847656f, 0.171143f, 0.834961f, 0.181885f, 0.822754f, + 0.191406f, 0.810547f, 0.201538f, 0.798340f, 0.210693f, 0.787109f, 0.219604f, 0.775391f, + 0.228027f, 0.764160f, 0.236206f, 0.752930f, 0.244507f, 0.742188f, 0.251465f, 0.731445f, + 0.258789f, 0.720703f, 0.264648f, 0.710938f, 0.271240f, 0.700684f, 0.276611f, 0.691406f, + 0.283447f, 0.681152f, 0.287598f, 0.672363f, 0.292236f, 0.663574f, 0.296143f, 0.655273f, + 0.301025f, 0.646973f, 0.303223f, 0.639160f, 0.305908f, 0.631836f, 0.307617f, 0.625000f, + 0.309570f, 0.617676f, 0.310547f, 0.611328f, 0.311523f, 0.604004f, 0.311768f, 0.597168f, + 0.311279f, 0.589355f, 0.310303f, 0.582031f, 0.309570f, 0.574707f, 0.308105f, 0.566895f, + 0.305664f, 0.558105f, 0.303467f, 0.549316f, 0.300049f, 0.540039f, 0.295898f, 0.530273f, + 0.291504f, 0.519531f, 0.286621f, 0.508301f, 0.280518f, 0.495850f, 0.273926f, 0.482178f, + 0.266357f, 0.468018f, 0.258789f, 0.451660f, 0.249390f, 0.434326f, 0.239380f, 0.415283f, + 0.227905f, 0.393555f, 0.215820f, 0.369873f, 0.201294f, 0.342285f, 0.185181f, 0.311035f, + 0.166626f, 0.273682f, 0.144653f, 0.227173f, 0.116333f, 0.162964f, 0.073181f, 0.059082f, + 0.000000f, 1.000000f, 0.012787f, 0.993164f, 0.025696f, 0.983887f, 0.038879f, 0.972656f, + 0.052216f, 0.960938f, 0.065063f, 0.948730f, 0.078064f, 0.936035f, 0.091064f, 0.923340f, + 0.103027f, 0.911133f, 0.115295f, 0.897949f, 0.127197f, 0.885254f, 0.138916f, 0.872559f, + 0.150513f, 0.859375f, 0.161377f, 0.847168f, 0.172363f, 0.834473f, 0.183350f, 0.822266f, + 0.193970f, 0.809570f, 0.203369f, 0.797852f, 0.213013f, 0.786133f, 0.221191f, 0.774414f, + 0.230469f, 0.762695f, 0.240234f, 0.750977f, 0.246948f, 0.740234f, 0.255371f, 0.729004f, + 0.262207f, 0.718750f, 0.269775f, 0.708008f, 0.276855f, 0.697754f, 0.282715f, 0.687500f, + 0.287842f, 0.678223f, 0.293945f, 0.668457f, 0.299316f, 0.659668f, 0.303223f, 0.650391f, + 0.308105f, 0.641602f, 0.311279f, 0.633301f, 0.313721f, 0.625977f, 0.316650f, 0.618652f, + 0.318848f, 0.611328f, 0.320801f, 0.604492f, 0.321045f, 0.597656f, 0.322998f, 0.590332f, + 0.322266f, 0.583008f, 0.322510f, 0.576172f, 0.321533f, 0.568359f, 0.321045f, 0.560547f, + 0.319336f, 0.552246f, 0.317139f, 0.543457f, 0.313721f, 0.533691f, 0.310303f, 0.524414f, + 0.306885f, 0.513672f, 0.301758f, 0.501953f, 0.297607f, 0.489990f, 0.291260f, 0.476562f, + 0.284424f, 0.462646f, 0.277344f, 0.446777f, 0.268066f, 0.429199f, 0.259277f, 0.410400f, + 0.248413f, 0.389404f, 0.236572f, 0.364990f, 0.223389f, 0.338623f, 0.207153f, 0.307129f, + 0.189087f, 0.269775f, 0.166626f, 0.225098f, 0.137939f, 0.162964f, 0.093628f, 0.059509f, + 0.000000f, 1.000000f, 0.012566f, 0.993164f, 0.026138f, 0.983398f, 0.039093f, 0.972656f, + 0.052246f, 0.960938f, 0.065308f, 0.948730f, 0.078552f, 0.936035f, 0.091675f, 0.923340f, + 0.103271f, 0.911133f, 0.116028f, 0.897949f, 0.127808f, 0.885254f, 0.139526f, 0.872070f, + 0.151611f, 0.859375f, 0.163208f, 0.846191f, 0.173584f, 0.833984f, 0.184937f, 0.821289f, + 0.194214f, 0.809082f, 0.205322f, 0.796387f, 0.214478f, 0.784668f, 0.225098f, 0.772461f, + 0.233765f, 0.760742f, 0.241577f, 0.749512f, 0.251709f, 0.737305f, 0.258789f, 0.726562f, + 0.266357f, 0.715820f, 0.274658f, 0.704590f, 0.282227f, 0.693848f, 0.288574f, 0.683594f, + 0.294678f, 0.673828f, 0.300537f, 0.664062f, 0.305420f, 0.655273f, 0.310303f, 0.645996f, + 0.314209f, 0.637695f, 0.319824f, 0.628418f, 0.322510f, 0.620605f, 0.324951f, 0.613281f, + 0.328125f, 0.605469f, 0.330078f, 0.598633f, 0.331543f, 0.591797f, 0.333252f, 0.583984f, + 0.333740f, 0.577148f, 0.334229f, 0.569824f, 0.333740f, 0.562012f, 0.333252f, 0.554199f, + 0.332520f, 0.545898f, 0.330322f, 0.536621f, 0.328369f, 0.527832f, 0.325928f, 0.517578f, + 0.322754f, 0.507324f, 0.318115f, 0.496338f, 0.315430f, 0.484131f, 0.309082f, 0.470215f, + 0.302979f, 0.456055f, 0.296143f, 0.440674f, 0.287842f, 0.423584f, 0.279297f, 0.404785f, + 0.269287f, 0.384277f, 0.257812f, 0.361084f, 0.244629f, 0.334717f, 0.229858f, 0.303955f, + 0.212036f, 0.267334f, 0.190186f, 0.221924f, 0.160767f, 0.160522f, 0.115051f, 0.058319f, + 0.000000f, 1.000000f, 0.012390f, 0.993652f, 0.025955f, 0.983398f, 0.039337f, 0.972656f, + 0.051727f, 0.961426f, 0.065369f, 0.948730f, 0.078430f, 0.936035f, 0.090698f, 0.923828f, + 0.104248f, 0.910156f, 0.116821f, 0.897461f, 0.128540f, 0.884277f, 0.140625f, 0.871582f, + 0.152100f, 0.858398f, 0.163818f, 0.846191f, 0.174927f, 0.833008f, 0.186523f, 0.820312f, + 0.196777f, 0.807617f, 0.207886f, 0.795410f, 0.217285f, 0.783203f, 0.226685f, 0.770996f, + 0.236694f, 0.758301f, 0.245850f, 0.747070f, 0.254883f, 0.734863f, 0.262939f, 0.724121f, + 0.271973f, 0.712402f, 0.279053f, 0.702148f, 0.286377f, 0.690918f, 0.292236f, 0.681152f, + 0.299805f, 0.670898f, 0.305420f, 0.661133f, 0.311279f, 0.651367f, 0.316895f, 0.642090f, + 0.321777f, 0.633301f, 0.326904f, 0.624512f, 0.330811f, 0.615723f, 0.333740f, 0.607910f, + 0.336670f, 0.600098f, 0.339355f, 0.592773f, 0.342285f, 0.585449f, 0.344238f, 0.578125f, + 0.345215f, 0.570312f, 0.345947f, 0.562988f, 0.346924f, 0.554688f, 0.345947f, 0.547363f, + 0.345947f, 0.538574f, 0.345459f, 0.529297f, 0.344238f, 0.520508f, 0.341309f, 0.510254f, + 0.338379f, 0.500000f, 0.334961f, 0.489258f, 0.331299f, 0.477051f, 0.326660f, 0.463867f, + 0.321045f, 0.449707f, 0.314941f, 0.434814f, 0.307617f, 0.418457f, 0.299561f, 0.399414f, + 0.290771f, 0.379395f, 0.279785f, 0.355957f, 0.267822f, 0.329834f, 0.253174f, 0.299805f, + 0.235718f, 0.264404f, 0.214233f, 0.219727f, 0.186035f, 0.159302f, 0.139648f, 0.058105f, + 0.000000f, 1.000000f, 0.012421f, 0.993652f, 0.026154f, 0.983398f, 0.039032f, 0.972656f, + 0.051605f, 0.961426f, 0.065491f, 0.948730f, 0.078247f, 0.936523f, 0.091797f, 0.922852f, + 0.105103f, 0.910156f, 0.116699f, 0.897461f, 0.129639f, 0.883789f, 0.141357f, 0.871094f, + 0.153442f, 0.857910f, 0.164917f, 0.845215f, 0.176636f, 0.832031f, 0.187866f, 0.819336f, + 0.199097f, 0.806152f, 0.209473f, 0.793457f, 0.219604f, 0.781250f, 0.230957f, 0.768555f, + 0.239746f, 0.756836f, 0.249512f, 0.744629f, 0.258301f, 0.733398f, 0.266602f, 0.722168f, + 0.274658f, 0.710938f, 0.282959f, 0.699707f, 0.291016f, 0.688965f, 0.298584f, 0.678223f, + 0.304688f, 0.667969f, 0.311035f, 0.657715f, 0.317139f, 0.647949f, 0.322754f, 0.638672f, + 0.328613f, 0.628906f, 0.333008f, 0.620117f, 0.338623f, 0.611328f, 0.343018f, 0.602539f, + 0.346680f, 0.594238f, 0.349365f, 0.586426f, 0.352783f, 0.578613f, 0.354980f, 0.571289f, + 0.357178f, 0.563477f, 0.358154f, 0.555664f, 0.359619f, 0.547852f, 0.359375f, 0.540039f, + 0.359863f, 0.531738f, 0.359863f, 0.522461f, 0.358154f, 0.513184f, 0.357666f, 0.503418f, + 0.354248f, 0.493408f, 0.352051f, 0.482910f, 0.348877f, 0.470459f, 0.345459f, 0.457275f, + 0.341064f, 0.443359f, 0.334961f, 0.428711f, 0.328613f, 0.411865f, 0.321533f, 0.394043f, + 0.312012f, 0.374023f, 0.301758f, 0.351562f, 0.291260f, 0.325439f, 0.276123f, 0.295654f, + 0.260254f, 0.260742f, 0.239014f, 0.217529f, 0.211792f, 0.156494f, 0.165283f, 0.057495f, + 0.000000f, 1.000000f, 0.012566f, 0.993164f, 0.025940f, 0.983398f, 0.039276f, 0.972656f, + 0.052155f, 0.960938f, 0.065552f, 0.948730f, 0.078430f, 0.936035f, 0.091797f, 0.922852f, + 0.104614f, 0.910156f, 0.117310f, 0.896973f, 0.129028f, 0.884277f, 0.142822f, 0.870117f, + 0.154663f, 0.857422f, 0.166504f, 0.844238f, 0.178711f, 0.830566f, 0.190063f, 0.817383f, + 0.200928f, 0.805176f, 0.211670f, 0.792480f, 0.222778f, 0.779785f, 0.232422f, 0.767578f, + 0.242310f, 0.755859f, 0.251709f, 0.743652f, 0.260742f, 0.731934f, 0.269043f, 0.720703f, + 0.278564f, 0.708496f, 0.287354f, 0.697754f, 0.294922f, 0.686523f, 0.302002f, 0.675781f, + 0.310059f, 0.665039f, 0.317139f, 0.654297f, 0.322998f, 0.644531f, 0.330078f, 0.634277f, + 0.336670f, 0.624023f, 0.341797f, 0.614746f, 0.347168f, 0.605957f, 0.352051f, 0.596191f, + 0.356445f, 0.587891f, 0.359863f, 0.579590f, 0.362549f, 0.571777f, 0.365234f, 0.564453f, + 0.368896f, 0.556641f, 0.370361f, 0.548340f, 0.371582f, 0.541016f, 0.373047f, 0.532227f, + 0.373779f, 0.523926f, 0.373535f, 0.515625f, 0.374512f, 0.505371f, 0.372559f, 0.496338f, + 0.371094f, 0.485840f, 0.369385f, 0.474854f, 0.366455f, 0.463135f, 0.363281f, 0.450684f, + 0.360107f, 0.436768f, 0.354736f, 0.422363f, 0.350098f, 0.405029f, 0.342529f, 0.387451f, + 0.334473f, 0.368164f, 0.325684f, 0.345947f, 0.314941f, 0.320557f, 0.302246f, 0.291504f, + 0.285400f, 0.257080f, 0.265381f, 0.214355f, 0.238281f, 0.155151f, 0.192993f, 0.055817f, + 0.000000f, 1.000000f, 0.012619f, 0.993164f, 0.025803f, 0.983887f, 0.038879f, 0.972656f, + 0.051758f, 0.961426f, 0.065369f, 0.948730f, 0.079041f, 0.936035f, 0.091553f, 0.923340f, + 0.105469f, 0.909668f, 0.117310f, 0.896973f, 0.130737f, 0.883301f, 0.143188f, 0.869629f, + 0.155396f, 0.856445f, 0.167969f, 0.842773f, 0.179688f, 0.829590f, 0.191162f, 0.817383f, + 0.202393f, 0.804199f, 0.213379f, 0.791504f, 0.224854f, 0.778809f, 0.234741f, 0.766602f, + 0.244751f, 0.754395f, 0.255371f, 0.741699f, 0.263428f, 0.730469f, 0.273926f, 0.718262f, + 0.282959f, 0.706543f, 0.291016f, 0.695312f, 0.299805f, 0.684082f, 0.308594f, 0.672363f, + 0.316406f, 0.661133f, 0.323242f, 0.650391f, 0.330322f, 0.640137f, 0.337402f, 0.629883f, + 0.343506f, 0.620117f, 0.349854f, 0.609863f, 0.354980f, 0.600586f, 0.360596f, 0.591309f, + 0.364502f, 0.583008f, 0.369629f, 0.573730f, 0.372803f, 0.565430f, 0.376709f, 0.557617f, + 0.379883f, 0.549805f, 0.382812f, 0.541016f, 0.385010f, 0.533203f, 0.386963f, 0.524414f, + 0.387939f, 0.516113f, 0.388428f, 0.507324f, 0.389648f, 0.498047f, 0.388184f, 0.488525f, + 0.388672f, 0.478760f, 0.386475f, 0.467285f, 0.385254f, 0.455811f, 0.382080f, 0.442871f, + 0.380127f, 0.429932f, 0.375488f, 0.415039f, 0.370605f, 0.399414f, 0.364746f, 0.381348f, + 0.356934f, 0.361816f, 0.348389f, 0.340576f, 0.338623f, 0.315674f, 0.327637f, 0.287354f, + 0.312500f, 0.253174f, 0.292969f, 0.210938f, 0.267090f, 0.152832f, 0.220703f, 0.055206f, + 0.000000f, 1.000000f, 0.012627f, 0.993164f, 0.025696f, 0.983887f, 0.038879f, 0.973145f, + 0.052155f, 0.961426f, 0.065735f, 0.948242f, 0.079651f, 0.935547f, 0.092651f, 0.922363f, + 0.105652f, 0.909180f, 0.118713f, 0.895996f, 0.132080f, 0.881836f, 0.145020f, 0.868652f, + 0.157593f, 0.855469f, 0.169189f, 0.842285f, 0.180664f, 0.829590f, 0.192749f, 0.816406f, + 0.203979f, 0.803711f, 0.215454f, 0.790527f, 0.225830f, 0.778320f, 0.237183f, 0.765137f, + 0.247681f, 0.753418f, 0.257324f, 0.740723f, 0.267090f, 0.728516f, 0.277344f, 0.716309f, + 0.287354f, 0.704102f, 0.297119f, 0.691895f, 0.304932f, 0.680176f, 0.312988f, 0.669434f, + 0.321289f, 0.658203f, 0.329346f, 0.646973f, 0.336914f, 0.636230f, 0.343994f, 0.625488f, + 0.350098f, 0.615723f, 0.357422f, 0.605469f, 0.363525f, 0.595215f, 0.368652f, 0.586426f, + 0.374512f, 0.576660f, 0.380615f, 0.566895f, 0.384521f, 0.558105f, 0.387207f, 0.550781f, + 0.390869f, 0.542480f, 0.395264f, 0.534180f, 0.397705f, 0.525391f, 0.399902f, 0.517578f, + 0.402832f, 0.508301f, 0.403809f, 0.499512f, 0.404785f, 0.489990f, 0.405029f, 0.480469f, + 0.405029f, 0.470459f, 0.404541f, 0.459229f, 0.403320f, 0.447998f, 0.401855f, 0.435303f, + 0.400146f, 0.422119f, 0.395508f, 0.407471f, 0.392578f, 0.392090f, 0.386963f, 0.375488f, + 0.380127f, 0.355469f, 0.373535f, 0.334473f, 0.364258f, 0.310303f, 0.352783f, 0.282471f, + 0.339111f, 0.248413f, 0.321289f, 0.207153f, 0.295410f, 0.150024f, 0.250977f, 0.055573f, + 0.000000f, 1.000000f, 0.012405f, 0.993652f, 0.026001f, 0.983398f, 0.038910f, 0.972656f, + 0.052338f, 0.960938f, 0.066589f, 0.947754f, 0.078979f, 0.935547f, 0.093323f, 0.922363f, + 0.106750f, 0.908203f, 0.119690f, 0.895020f, 0.133423f, 0.881348f, 0.145630f, 0.868164f, + 0.156982f, 0.855469f, 0.170288f, 0.842285f, 0.181763f, 0.829102f, 0.193481f, 0.816406f, + 0.205933f, 0.802734f, 0.217285f, 0.790039f, 0.227539f, 0.777344f, 0.239746f, 0.764160f, + 0.249634f, 0.751465f, 0.261475f, 0.738281f, 0.271729f, 0.726074f, 0.281982f, 0.713379f, + 0.291504f, 0.701172f, 0.299805f, 0.689453f, 0.310059f, 0.678223f, 0.319092f, 0.666016f, + 0.326904f, 0.654785f, 0.335205f, 0.644043f, 0.343262f, 0.632812f, 0.351318f, 0.621582f, + 0.358398f, 0.610840f, 0.364990f, 0.600586f, 0.372559f, 0.589844f, 0.378174f, 0.580078f, + 0.383789f, 0.570801f, 0.388672f, 0.561523f, 0.394287f, 0.552246f, 0.398926f, 0.543457f, + 0.404297f, 0.534668f, 0.406738f, 0.526367f, 0.410889f, 0.517578f, 0.413086f, 0.509277f, + 0.416504f, 0.500488f, 0.417969f, 0.491455f, 0.420166f, 0.481934f, 0.421631f, 0.472168f, + 0.422119f, 0.462158f, 0.422852f, 0.451172f, 0.421631f, 0.439941f, 0.420410f, 0.428223f, + 0.419922f, 0.414307f, 0.416748f, 0.400146f, 0.414307f, 0.385010f, 0.408447f, 0.367920f, + 0.403809f, 0.348877f, 0.397705f, 0.327881f, 0.389404f, 0.304199f, 0.378418f, 0.276611f, + 0.366455f, 0.244507f, 0.349121f, 0.203491f, 0.324951f, 0.147583f, 0.282471f, 0.053955f, + 0.000000f, 1.000000f, 0.012566f, 0.993164f, 0.025864f, 0.983887f, 0.039215f, 0.972656f, + 0.052826f, 0.960449f, 0.066345f, 0.947754f, 0.079773f, 0.935059f, 0.093628f, 0.921387f, + 0.107666f, 0.908203f, 0.120300f, 0.894531f, 0.133301f, 0.881836f, 0.145386f, 0.868652f, + 0.158325f, 0.854980f, 0.171143f, 0.841797f, 0.183594f, 0.828613f, 0.195923f, 0.814941f, + 0.207397f, 0.802246f, 0.218872f, 0.789062f, 0.231201f, 0.775391f, 0.242188f, 0.762207f, + 0.253418f, 0.749512f, 0.264160f, 0.736816f, 0.273438f, 0.724121f, 0.284668f, 0.711914f, + 0.294189f, 0.699707f, 0.305420f, 0.687500f, 0.314209f, 0.675293f, 0.323486f, 0.663574f, + 0.333740f, 0.651367f, 0.341309f, 0.640137f, 0.349365f, 0.628906f, 0.357666f, 0.617676f, + 0.364746f, 0.606445f, 0.372070f, 0.596191f, 0.379883f, 0.585449f, 0.387695f, 0.574707f, + 0.393311f, 0.564941f, 0.399658f, 0.554688f, 0.405762f, 0.545410f, 0.410889f, 0.535645f, + 0.415039f, 0.527344f, 0.419678f, 0.518555f, 0.423584f, 0.510254f, 0.427734f, 0.500488f, + 0.432129f, 0.491943f, 0.434326f, 0.482910f, 0.435547f, 0.473877f, 0.439209f, 0.463623f, + 0.439697f, 0.453125f, 0.439941f, 0.442383f, 0.440674f, 0.431152f, 0.440918f, 0.419678f, + 0.439697f, 0.405762f, 0.437744f, 0.392578f, 0.435791f, 0.377197f, 0.432617f, 0.360840f, + 0.427734f, 0.342041f, 0.422363f, 0.321777f, 0.415527f, 0.297607f, 0.406250f, 0.271240f, + 0.395020f, 0.239014f, 0.378418f, 0.199463f, 0.355957f, 0.145142f, 0.315918f, 0.052887f, + 0.000000f, 1.000000f, 0.012573f, 0.993164f, 0.025833f, 0.983398f, 0.039368f, 0.972656f, + 0.052643f, 0.960449f, 0.066833f, 0.947754f, 0.081299f, 0.934082f, 0.094421f, 0.920898f, + 0.107910f, 0.907715f, 0.120361f, 0.895020f, 0.134399f, 0.881348f, 0.146484f, 0.868164f, + 0.159424f, 0.854980f, 0.171631f, 0.841797f, 0.183960f, 0.828125f, 0.196045f, 0.814941f, + 0.209351f, 0.800781f, 0.221313f, 0.787109f, 0.233398f, 0.773926f, 0.244629f, 0.761230f, + 0.256104f, 0.748047f, 0.266602f, 0.735352f, 0.278320f, 0.722168f, 0.287598f, 0.709961f, + 0.299805f, 0.697266f, 0.309814f, 0.684570f, 0.319092f, 0.672363f, 0.328125f, 0.660156f, + 0.339111f, 0.648438f, 0.347656f, 0.636230f, 0.355225f, 0.625000f, 0.364746f, 0.613770f, + 0.373779f, 0.601562f, 0.380859f, 0.591309f, 0.388184f, 0.580078f, 0.395752f, 0.569336f, + 0.403076f, 0.559082f, 0.408691f, 0.549316f, 0.416016f, 0.539062f, 0.422119f, 0.528809f, + 0.427246f, 0.519531f, 0.432373f, 0.510254f, 0.437256f, 0.501465f, 0.441895f, 0.492676f, + 0.444580f, 0.483887f, 0.449219f, 0.473633f, 0.451904f, 0.464600f, 0.455322f, 0.455322f, + 0.457031f, 0.444580f, 0.458496f, 0.433838f, 0.460449f, 0.422607f, 0.459961f, 0.410645f, + 0.460205f, 0.397949f, 0.460205f, 0.383789f, 0.457520f, 0.369385f, 0.455811f, 0.352539f, + 0.451660f, 0.334473f, 0.448975f, 0.314453f, 0.442139f, 0.291748f, 0.434814f, 0.265625f, + 0.424805f, 0.234375f, 0.408936f, 0.195068f, 0.387695f, 0.141968f, 0.348633f, 0.051575f, + 0.000000f, 1.000000f, 0.012520f, 0.993164f, 0.025620f, 0.983887f, 0.038788f, 0.972656f, + 0.052856f, 0.960449f, 0.067627f, 0.946777f, 0.081360f, 0.934082f, 0.095093f, 0.920898f, + 0.107849f, 0.908203f, 0.121277f, 0.894531f, 0.133911f, 0.881348f, 0.146973f, 0.868164f, + 0.160767f, 0.854492f, 0.173584f, 0.840332f, 0.186646f, 0.826660f, 0.199097f, 0.812988f, + 0.211304f, 0.799805f, 0.223389f, 0.786621f, 0.234497f, 0.772949f, 0.246582f, 0.760254f, + 0.258789f, 0.746582f, 0.269287f, 0.733887f, 0.281738f, 0.720215f, 0.291504f, 0.707520f, + 0.303223f, 0.694824f, 0.312744f, 0.682129f, 0.324219f, 0.669434f, 0.334229f, 0.657227f, + 0.343506f, 0.645020f, 0.354004f, 0.632812f, 0.363037f, 0.620605f, 0.371094f, 0.609375f, + 0.379395f, 0.598145f, 0.388916f, 0.585938f, 0.396729f, 0.575195f, 0.404785f, 0.563965f, + 0.411865f, 0.553223f, 0.419189f, 0.542480f, 0.427002f, 0.532227f, 0.432129f, 0.522461f, + 0.439697f, 0.511719f, 0.445801f, 0.502441f, 0.450439f, 0.492920f, 0.454590f, 0.484131f, + 0.460449f, 0.474854f, 0.464111f, 0.465088f, 0.468994f, 0.455566f, 0.471436f, 0.445801f, + 0.474854f, 0.435059f, 0.477295f, 0.425049f, 0.479248f, 0.413330f, 0.479736f, 0.402100f, + 0.481445f, 0.389160f, 0.481689f, 0.375244f, 0.481689f, 0.360840f, 0.478516f, 0.344482f, + 0.477295f, 0.326660f, 0.474365f, 0.307129f, 0.468506f, 0.285156f, 0.462402f, 0.259033f, + 0.453613f, 0.228271f, 0.439453f, 0.190674f, 0.420898f, 0.137817f, 0.383301f, 0.052277f, + 0.000000f, 1.000000f, 0.012436f, 0.993164f, 0.025482f, 0.983887f, 0.039398f, 0.972168f, + 0.053711f, 0.959961f, 0.067749f, 0.946777f, 0.080383f, 0.934570f, 0.093933f, 0.921875f, + 0.108093f, 0.908203f, 0.121460f, 0.894531f, 0.134766f, 0.881348f, 0.148071f, 0.867676f, + 0.162354f, 0.853516f, 0.175049f, 0.839355f, 0.188110f, 0.825684f, 0.200073f, 0.812500f, + 0.213501f, 0.798828f, 0.225464f, 0.785645f, 0.237549f, 0.772461f, 0.248779f, 0.758789f, + 0.262207f, 0.744629f, 0.274170f, 0.731445f, 0.283936f, 0.718262f, 0.296143f, 0.705566f, + 0.306641f, 0.692383f, 0.317627f, 0.679688f, 0.329346f, 0.666504f, 0.338867f, 0.654297f, + 0.349365f, 0.641602f, 0.358398f, 0.629883f, 0.368896f, 0.617188f, 0.379150f, 0.605469f, + 0.389160f, 0.592773f, 0.396729f, 0.581543f, 0.404541f, 0.569824f, 0.413330f, 0.558594f, + 0.423096f, 0.546875f, 0.430420f, 0.536133f, 0.437012f, 0.525391f, 0.444580f, 0.514648f, + 0.450684f, 0.504883f, 0.457520f, 0.494629f, 0.463379f, 0.484375f, 0.469238f, 0.475098f, + 0.474609f, 0.465576f, 0.479980f, 0.456055f, 0.484619f, 0.446045f, 0.489014f, 0.436035f, + 0.492432f, 0.425537f, 0.495361f, 0.414551f, 0.498535f, 0.404297f, 0.501465f, 0.391602f, + 0.502441f, 0.379639f, 0.504395f, 0.366211f, 0.503418f, 0.351318f, 0.504395f, 0.336182f, + 0.502441f, 0.318604f, 0.500977f, 0.299561f, 0.496582f, 0.277832f, 0.491455f, 0.252930f, + 0.482178f, 0.223145f, 0.470947f, 0.186279f, 0.454834f, 0.134888f, 0.419189f, 0.048889f, + 0.000000f, 1.000000f, 0.012390f, 0.993164f, 0.025208f, 0.983887f, 0.039673f, 0.972168f, + 0.054291f, 0.958984f, 0.068054f, 0.946777f, 0.080444f, 0.935059f, 0.094543f, 0.921875f, + 0.108093f, 0.908203f, 0.121277f, 0.895020f, 0.135376f, 0.880859f, 0.148804f, 0.866699f, + 0.162109f, 0.853027f, 0.175659f, 0.839355f, 0.187988f, 0.826172f, 0.201050f, 0.812012f, + 0.214355f, 0.798340f, 0.227539f, 0.784668f, 0.240112f, 0.770020f, 0.251953f, 0.757324f, + 0.263916f, 0.743652f, 0.276367f, 0.729980f, 0.287842f, 0.716797f, 0.299805f, 0.703613f, + 0.311035f, 0.690430f, 0.322998f, 0.676758f, 0.333496f, 0.664062f, 0.344238f, 0.651367f, + 0.354248f, 0.638672f, 0.365479f, 0.625977f, 0.376465f, 0.612793f, 0.385986f, 0.601074f, + 0.395264f, 0.588867f, 0.405029f, 0.576660f, 0.413818f, 0.564453f, 0.422607f, 0.553711f, + 0.431152f, 0.541504f, 0.439697f, 0.530273f, 0.448730f, 0.518555f, 0.455811f, 0.507812f, + 0.463135f, 0.497314f, 0.471680f, 0.485840f, 0.477539f, 0.475830f, 0.484131f, 0.465820f, + 0.490234f, 0.456299f, 0.495605f, 0.446533f, 0.500977f, 0.436523f, 0.505859f, 0.426025f, + 0.511230f, 0.415771f, 0.514160f, 0.405029f, 0.518555f, 0.393799f, 0.521484f, 0.381592f, + 0.524414f, 0.369385f, 0.525391f, 0.355957f, 0.526855f, 0.341797f, 0.527344f, 0.326904f, + 0.527344f, 0.309326f, 0.527344f, 0.291016f, 0.523438f, 0.269775f, 0.520020f, 0.245728f, + 0.512695f, 0.216919f, 0.503418f, 0.181152f, 0.487305f, 0.130859f, 0.454834f, 0.048218f, + 0.000000f, 1.000000f, 0.012207f, 0.993164f, 0.025513f, 0.983887f, 0.040070f, 0.971680f, + 0.054382f, 0.958984f, 0.067993f, 0.946777f, 0.081482f, 0.934082f, 0.095581f, 0.920898f, + 0.109802f, 0.907715f, 0.122864f, 0.894043f, 0.136353f, 0.879883f, 0.150024f, 0.866211f, + 0.163452f, 0.852539f, 0.176758f, 0.838867f, 0.189697f, 0.825195f, 0.203247f, 0.811035f, + 0.215698f, 0.797363f, 0.228638f, 0.783203f, 0.242432f, 0.769531f, 0.254639f, 0.755859f, + 0.266846f, 0.742188f, 0.279297f, 0.728027f, 0.290527f, 0.715332f, 0.303467f, 0.701172f, + 0.314697f, 0.687988f, 0.326904f, 0.674316f, 0.338135f, 0.661133f, 0.349609f, 0.648438f, + 0.360596f, 0.635254f, 0.371338f, 0.622559f, 0.383057f, 0.609375f, 0.393066f, 0.596680f, + 0.402344f, 0.584473f, 0.412109f, 0.572266f, 0.422607f, 0.559570f, 0.432617f, 0.547363f, + 0.441162f, 0.535645f, 0.449707f, 0.523926f, 0.458496f, 0.512207f, 0.467529f, 0.500977f, + 0.475586f, 0.489746f, 0.484131f, 0.478271f, 0.491211f, 0.467529f, 0.498291f, 0.456787f, + 0.504883f, 0.446533f, 0.512207f, 0.435791f, 0.518066f, 0.426025f, 0.523926f, 0.415771f, + 0.527832f, 0.405273f, 0.533203f, 0.395020f, 0.538086f, 0.383057f, 0.542969f, 0.371582f, + 0.544922f, 0.359131f, 0.548340f, 0.346191f, 0.551758f, 0.331787f, 0.551758f, 0.316650f, + 0.554199f, 0.300781f, 0.554688f, 0.281982f, 0.551758f, 0.261719f, 0.549805f, 0.237671f, + 0.544434f, 0.209717f, 0.537598f, 0.175049f, 0.522461f, 0.127441f, 0.493896f, 0.046814f, + 0.000000f, 1.000000f, 0.011963f, 0.993652f, 0.025787f, 0.983398f, 0.040527f, 0.971191f, + 0.054321f, 0.959473f, 0.067871f, 0.947266f, 0.081543f, 0.934570f, 0.095947f, 0.920898f, + 0.109680f, 0.907715f, 0.123047f, 0.893555f, 0.136230f, 0.880371f, 0.150391f, 0.866211f, + 0.164185f, 0.852051f, 0.177490f, 0.838379f, 0.191528f, 0.823730f, 0.205933f, 0.809570f, + 0.218140f, 0.795898f, 0.230957f, 0.782227f, 0.244385f, 0.768066f, 0.258301f, 0.753906f, + 0.269043f, 0.740723f, 0.282959f, 0.726562f, 0.294189f, 0.713379f, 0.307617f, 0.699219f, + 0.319092f, 0.685547f, 0.330566f, 0.672363f, 0.342285f, 0.658691f, 0.354492f, 0.645508f, + 0.367188f, 0.631836f, 0.377197f, 0.618652f, 0.388184f, 0.605957f, 0.399658f, 0.592773f, + 0.410400f, 0.580078f, 0.420654f, 0.566895f, 0.430176f, 0.555176f, 0.440918f, 0.541992f, + 0.451172f, 0.529785f, 0.460693f, 0.517578f, 0.470215f, 0.505371f, 0.478271f, 0.493896f, + 0.486572f, 0.482178f, 0.495605f, 0.470703f, 0.504395f, 0.459229f, 0.512695f, 0.447754f, + 0.520996f, 0.436523f, 0.526855f, 0.426270f, 0.534180f, 0.415771f, 0.540039f, 0.405518f, + 0.546387f, 0.394531f, 0.553223f, 0.383545f, 0.559082f, 0.371826f, 0.562500f, 0.360596f, + 0.567871f, 0.348389f, 0.571777f, 0.335205f, 0.575195f, 0.321533f, 0.578613f, 0.306641f, + 0.580566f, 0.290527f, 0.580566f, 0.272705f, 0.581055f, 0.252686f, 0.579102f, 0.229614f, + 0.575684f, 0.202515f, 0.569336f, 0.169189f, 0.557617f, 0.121826f, 0.531250f, 0.044739f, + 0.000000f, 1.000000f, 0.011620f, 0.993652f, 0.025833f, 0.983398f, 0.040833f, 0.970703f, + 0.054504f, 0.959473f, 0.068237f, 0.947266f, 0.081787f, 0.934570f, 0.096069f, 0.920898f, + 0.110229f, 0.906738f, 0.124023f, 0.893066f, 0.138306f, 0.879395f, 0.152100f, 0.865723f, + 0.165405f, 0.852051f, 0.178467f, 0.837891f, 0.192139f, 0.823730f, 0.206055f, 0.809570f, + 0.220703f, 0.794922f, 0.232666f, 0.781250f, 0.246582f, 0.766602f, 0.259277f, 0.752930f, + 0.272949f, 0.739258f, 0.285645f, 0.724609f, 0.298828f, 0.710938f, 0.311279f, 0.697266f, + 0.323242f, 0.683594f, 0.335938f, 0.669434f, 0.347412f, 0.655762f, 0.360352f, 0.642090f, + 0.373047f, 0.628418f, 0.383545f, 0.615234f, 0.394531f, 0.602051f, 0.406006f, 0.588867f, + 0.418457f, 0.575195f, 0.429199f, 0.562012f, 0.439697f, 0.549805f, 0.449951f, 0.536621f, + 0.458740f, 0.524414f, 0.470947f, 0.511719f, 0.481445f, 0.498779f, 0.491211f, 0.486328f, + 0.499512f, 0.474609f, 0.509277f, 0.462646f, 0.516602f, 0.451172f, 0.526367f, 0.439209f, + 0.533691f, 0.427734f, 0.543945f, 0.415771f, 0.550781f, 0.405029f, 0.558594f, 0.394043f, + 0.565918f, 0.383301f, 0.572266f, 0.372070f, 0.578125f, 0.360840f, 0.584473f, 0.348877f, + 0.589844f, 0.336914f, 0.595215f, 0.323730f, 0.599121f, 0.310547f, 0.603027f, 0.295898f, + 0.607422f, 0.280273f, 0.608887f, 0.262939f, 0.610352f, 0.243286f, 0.609375f, 0.221436f, + 0.607910f, 0.194702f, 0.604492f, 0.162842f, 0.593262f, 0.118347f, 0.570312f, 0.043488f, + 0.000000f, 1.000000f, 0.011742f, 0.993652f, 0.026215f, 0.982910f, 0.040924f, 0.971191f, + 0.054016f, 0.959961f, 0.067322f, 0.947754f, 0.082031f, 0.934082f, 0.096375f, 0.920410f, + 0.110352f, 0.906738f, 0.124390f, 0.893555f, 0.137329f, 0.879883f, 0.152466f, 0.864746f, + 0.166626f, 0.851074f, 0.180298f, 0.836914f, 0.193604f, 0.823242f, 0.208008f, 0.808105f, + 0.221802f, 0.794434f, 0.235107f, 0.780273f, 0.247437f, 0.766602f, 0.262451f, 0.751465f, + 0.275635f, 0.737305f, 0.288330f, 0.723633f, 0.301758f, 0.708984f, 0.313965f, 0.695312f, + 0.327881f, 0.681152f, 0.340088f, 0.666992f, 0.353027f, 0.652832f, 0.364746f, 0.639160f, + 0.376709f, 0.625488f, 0.389893f, 0.611816f, 0.401611f, 0.598145f, 0.413330f, 0.584473f, + 0.426270f, 0.570801f, 0.437500f, 0.557617f, 0.449463f, 0.543945f, 0.460205f, 0.530762f, + 0.470215f, 0.518066f, 0.481445f, 0.504883f, 0.492188f, 0.492432f, 0.501953f, 0.479736f, + 0.512695f, 0.466553f, 0.522949f, 0.454346f, 0.532715f, 0.442139f, 0.540527f, 0.430176f, + 0.551270f, 0.417725f, 0.557617f, 0.406494f, 0.567383f, 0.394287f, 0.575684f, 0.383057f, + 0.583496f, 0.371582f, 0.592285f, 0.360352f, 0.599121f, 0.348877f, 0.605957f, 0.336914f, + 0.612305f, 0.324951f, 0.618652f, 0.312012f, 0.622559f, 0.298584f, 0.629395f, 0.284180f, + 0.632324f, 0.268799f, 0.636719f, 0.251953f, 0.638672f, 0.233398f, 0.641602f, 0.212036f, + 0.639648f, 0.187134f, 0.638184f, 0.155273f, 0.630859f, 0.112732f, 0.611816f, 0.041626f, + 0.000000f, 1.000000f, 0.011772f, 0.993652f, 0.026489f, 0.982422f, 0.040741f, 0.971680f, + 0.053833f, 0.959961f, 0.068054f, 0.947266f, 0.082886f, 0.933594f, 0.096436f, 0.920410f, + 0.110229f, 0.907227f, 0.123840f, 0.893555f, 0.139038f, 0.878906f, 0.152832f, 0.865234f, + 0.166626f, 0.851074f, 0.181641f, 0.835938f, 0.195557f, 0.821777f, 0.208130f, 0.808594f, + 0.223022f, 0.793457f, 0.237305f, 0.778809f, 0.249878f, 0.765137f, 0.264893f, 0.750488f, + 0.278320f, 0.735840f, 0.291992f, 0.721191f, 0.304688f, 0.707520f, 0.319336f, 0.692383f, + 0.331543f, 0.678711f, 0.344971f, 0.664551f, 0.358643f, 0.650391f, 0.369873f, 0.636230f, + 0.383789f, 0.622070f, 0.396484f, 0.607910f, 0.408691f, 0.594238f, 0.420654f, 0.580566f, + 0.433105f, 0.566406f, 0.445068f, 0.552734f, 0.457520f, 0.538574f, 0.469238f, 0.525391f, + 0.480713f, 0.512207f, 0.490479f, 0.499512f, 0.502930f, 0.485596f, 0.514160f, 0.472656f, + 0.524414f, 0.459473f, 0.535645f, 0.446289f, 0.544922f, 0.433838f, 0.555664f, 0.420654f, + 0.564453f, 0.408936f, 0.575195f, 0.395996f, 0.584961f, 0.383545f, 0.593750f, 0.371094f, + 0.604004f, 0.359131f, 0.611816f, 0.347656f, 0.620117f, 0.336182f, 0.627441f, 0.324707f, + 0.634766f, 0.312012f, 0.641113f, 0.300049f, 0.647949f, 0.286133f, 0.654297f, 0.271973f, + 0.660156f, 0.256836f, 0.664551f, 0.240845f, 0.668945f, 0.222168f, 0.671875f, 0.201904f, + 0.673340f, 0.177734f, 0.672363f, 0.147827f, 0.666992f, 0.106750f, 0.651367f, 0.039673f, + 0.000000f, 1.000000f, 0.011971f, 0.993652f, 0.026947f, 0.982422f, 0.040131f, 0.972168f, + 0.053833f, 0.960449f, 0.068359f, 0.946777f, 0.083008f, 0.933594f, 0.096802f, 0.920410f, + 0.111511f, 0.906738f, 0.125488f, 0.892578f, 0.139038f, 0.879395f, 0.153442f, 0.864746f, + 0.168457f, 0.850098f, 0.181641f, 0.836426f, 0.196777f, 0.821289f, 0.211792f, 0.806641f, + 0.224243f, 0.792480f, 0.238647f, 0.778320f, 0.252930f, 0.763184f, 0.267334f, 0.749023f, + 0.281006f, 0.734375f, 0.295410f, 0.719238f, 0.307617f, 0.705566f, 0.321045f, 0.691406f, + 0.335205f, 0.676758f, 0.348877f, 0.662109f, 0.363037f, 0.647461f, 0.375244f, 0.633789f, + 0.389404f, 0.618652f, 0.402100f, 0.604492f, 0.414551f, 0.590332f, 0.428223f, 0.576172f, + 0.441406f, 0.562012f, 0.453857f, 0.547852f, 0.465820f, 0.534180f, 0.478516f, 0.520020f, + 0.490479f, 0.506348f, 0.501953f, 0.492920f, 0.513184f, 0.479248f, 0.525879f, 0.465332f, + 0.537109f, 0.451660f, 0.548340f, 0.438477f, 0.559082f, 0.425049f, 0.569824f, 0.412354f, + 0.581543f, 0.398682f, 0.591309f, 0.385742f, 0.602051f, 0.373047f, 0.612793f, 0.359863f, + 0.621582f, 0.347412f, 0.631348f, 0.335205f, 0.638672f, 0.323730f, 0.648438f, 0.311523f, + 0.659180f, 0.298584f, 0.666016f, 0.285400f, 0.673340f, 0.272705f, 0.680176f, 0.259277f, + 0.688965f, 0.243530f, 0.693848f, 0.228271f, 0.699707f, 0.210327f, 0.703613f, 0.191040f, + 0.707031f, 0.168701f, 0.708984f, 0.139893f, 0.705566f, 0.101440f, 0.691406f, 0.037720f, + 0.000000f, 1.000000f, 0.012199f, 0.993164f, 0.027023f, 0.982910f, 0.040283f, 0.972168f, + 0.054169f, 0.959961f, 0.069092f, 0.946289f, 0.082886f, 0.933594f, 0.097168f, 0.920410f, + 0.111694f, 0.906250f, 0.126099f, 0.892578f, 0.140259f, 0.878418f, 0.155640f, 0.863770f, + 0.169067f, 0.849609f, 0.184570f, 0.834961f, 0.197876f, 0.820801f, 0.211792f, 0.806641f, + 0.226807f, 0.791504f, 0.241455f, 0.776855f, 0.254883f, 0.762695f, 0.269775f, 0.747559f, + 0.283691f, 0.733398f, 0.298340f, 0.717773f, 0.311279f, 0.703613f, 0.326172f, 0.688477f, + 0.339111f, 0.674316f, 0.353760f, 0.659668f, 0.368652f, 0.644043f, 0.380615f, 0.630371f, + 0.394531f, 0.615723f, 0.407959f, 0.601074f, 0.422607f, 0.586426f, 0.435059f, 0.571777f, + 0.447266f, 0.558105f, 0.460693f, 0.543945f, 0.473877f, 0.529297f, 0.486572f, 0.515137f, + 0.499756f, 0.500488f, 0.512695f, 0.486328f, 0.524902f, 0.472168f, 0.537598f, 0.458008f, + 0.549316f, 0.444580f, 0.560547f, 0.430664f, 0.572754f, 0.416504f, 0.584473f, 0.402832f, + 0.596680f, 0.389160f, 0.607910f, 0.375732f, 0.618652f, 0.362305f, 0.629395f, 0.349121f, + 0.640625f, 0.335693f, 0.650879f, 0.322510f, 0.662109f, 0.309326f, 0.671387f, 0.297119f, + 0.680664f, 0.284668f, 0.690430f, 0.271729f, 0.698730f, 0.258301f, 0.708008f, 0.244507f, + 0.715332f, 0.230103f, 0.722168f, 0.214722f, 0.730469f, 0.197876f, 0.735840f, 0.179321f, + 0.741211f, 0.157349f, 0.744141f, 0.130249f, 0.744141f, 0.094849f, 0.734863f, 0.035278f, + 0.000000f, 1.000000f, 0.012444f, 0.993164f, 0.027298f, 0.982422f, 0.040283f, 0.972168f, + 0.055054f, 0.958984f, 0.068970f, 0.946777f, 0.082336f, 0.934082f, 0.097351f, 0.919922f, + 0.112183f, 0.906250f, 0.126343f, 0.892578f, 0.141113f, 0.877930f, 0.155396f, 0.863770f, + 0.170532f, 0.848633f, 0.184448f, 0.834473f, 0.199707f, 0.820312f, 0.214355f, 0.804688f, + 0.228149f, 0.791016f, 0.242432f, 0.775879f, 0.256592f, 0.761230f, 0.272461f, 0.746094f, + 0.285645f, 0.731445f, 0.300781f, 0.716797f, 0.314453f, 0.701660f, 0.329590f, 0.687012f, + 0.344727f, 0.671875f, 0.357422f, 0.657227f, 0.372803f, 0.642090f, 0.387207f, 0.626953f, + 0.399902f, 0.612305f, 0.413086f, 0.597656f, 0.428467f, 0.583008f, 0.441162f, 0.568359f, + 0.455811f, 0.553223f, 0.469238f, 0.538574f, 0.482666f, 0.523926f, 0.496094f, 0.509277f, + 0.509277f, 0.494873f, 0.521973f, 0.480469f, 0.534668f, 0.466064f, 0.548340f, 0.451416f, + 0.561035f, 0.437256f, 0.573730f, 0.422607f, 0.587402f, 0.407715f, 0.600586f, 0.393799f, + 0.612305f, 0.379639f, 0.625488f, 0.365234f, 0.636230f, 0.351807f, 0.648438f, 0.337646f, + 0.659668f, 0.323730f, 0.671875f, 0.310059f, 0.682129f, 0.296387f, 0.693359f, 0.282715f, + 0.704590f, 0.269287f, 0.714355f, 0.256104f, 0.725098f, 0.242798f, 0.734375f, 0.229614f, + 0.743164f, 0.215088f, 0.752441f, 0.200073f, 0.760254f, 0.184570f, 0.768555f, 0.166260f, + 0.773926f, 0.145630f, 0.780762f, 0.120667f, 0.782715f, 0.086487f, 0.776367f, 0.031677f, + 0.000000f, 1.000000f, 0.012665f, 0.992676f, 0.026840f, 0.982910f, 0.039856f, 0.972168f, + 0.054871f, 0.959473f, 0.068848f, 0.946777f, 0.083618f, 0.933105f, 0.098145f, 0.919922f, + 0.112549f, 0.906250f, 0.127075f, 0.891602f, 0.141724f, 0.877930f, 0.156250f, 0.863281f, + 0.170776f, 0.849121f, 0.186401f, 0.833496f, 0.200073f, 0.819824f, 0.214600f, 0.804688f, + 0.229980f, 0.790039f, 0.245361f, 0.774414f, 0.259277f, 0.760254f, 0.275391f, 0.744629f, + 0.290039f, 0.729980f, 0.303711f, 0.714844f, 0.318604f, 0.699707f, 0.333740f, 0.684570f, + 0.347656f, 0.669434f, 0.362305f, 0.654785f, 0.377197f, 0.639160f, 0.391113f, 0.624023f, + 0.406982f, 0.608887f, 0.420166f, 0.594238f, 0.435547f, 0.578613f, 0.448730f, 0.563965f, + 0.463379f, 0.548828f, 0.477051f, 0.534180f, 0.491699f, 0.518555f, 0.505371f, 0.503906f, + 0.520020f, 0.489014f, 0.532715f, 0.473877f, 0.546875f, 0.458984f, 0.560059f, 0.444092f, + 0.573730f, 0.429199f, 0.587402f, 0.414307f, 0.600098f, 0.399658f, 0.614258f, 0.384766f, + 0.627441f, 0.370361f, 0.640137f, 0.355713f, 0.651855f, 0.341553f, 0.666016f, 0.326416f, + 0.679199f, 0.312012f, 0.691406f, 0.297363f, 0.702637f, 0.283447f, 0.715820f, 0.268799f, + 0.728516f, 0.254150f, 0.739258f, 0.240234f, 0.750000f, 0.226807f, 0.760254f, 0.213135f, + 0.772461f, 0.199219f, 0.782715f, 0.183716f, 0.791504f, 0.168945f, 0.801758f, 0.151123f, + 0.810059f, 0.132446f, 0.815918f, 0.109253f, 0.823242f, 0.079285f, 0.820312f, 0.029144f, + 0.000000f, 1.000000f, 0.013290f, 0.992188f, 0.026016f, 0.983887f, 0.040649f, 0.971680f, + 0.054962f, 0.959473f, 0.068970f, 0.946777f, 0.083130f, 0.933594f, 0.098511f, 0.919434f, + 0.112671f, 0.905762f, 0.128174f, 0.891602f, 0.141968f, 0.877441f, 0.157349f, 0.862793f, + 0.171997f, 0.848145f, 0.186646f, 0.833496f, 0.202148f, 0.818848f, 0.216797f, 0.803711f, + 0.231934f, 0.789062f, 0.246338f, 0.773926f, 0.261719f, 0.759277f, 0.277344f, 0.743652f, + 0.291992f, 0.728516f, 0.306152f, 0.713379f, 0.322510f, 0.697754f, 0.337158f, 0.682617f, + 0.352539f, 0.666992f, 0.367188f, 0.651855f, 0.382324f, 0.636719f, 0.397461f, 0.621094f, + 0.410645f, 0.605957f, 0.426270f, 0.590332f, 0.441650f, 0.575195f, 0.456299f, 0.560059f, + 0.471191f, 0.544434f, 0.485352f, 0.529297f, 0.499512f, 0.513672f, 0.514160f, 0.498535f, + 0.529297f, 0.483398f, 0.543457f, 0.468018f, 0.558594f, 0.452393f, 0.573242f, 0.437012f, + 0.586914f, 0.421875f, 0.601562f, 0.406494f, 0.615234f, 0.391357f, 0.629395f, 0.376221f, + 0.642578f, 0.360840f, 0.656250f, 0.345703f, 0.670410f, 0.330078f, 0.684570f, 0.314697f, + 0.698242f, 0.299805f, 0.711914f, 0.284668f, 0.725586f, 0.269775f, 0.737793f, 0.255127f, + 0.750000f, 0.240112f, 0.763672f, 0.224854f, 0.775879f, 0.210083f, 0.788574f, 0.195435f, + 0.800293f, 0.181030f, 0.812012f, 0.166504f, 0.823730f, 0.151611f, 0.834473f, 0.135010f, + 0.844238f, 0.117065f, 0.854980f, 0.096191f, 0.861328f, 0.069702f, 0.862793f, 0.025696f, + 0.000000f, 1.000000f, 0.013832f, 0.991699f, 0.026260f, 0.983398f, 0.041382f, 0.971191f, + 0.054626f, 0.959961f, 0.069336f, 0.946289f, 0.083618f, 0.933594f, 0.098633f, 0.919434f, + 0.112976f, 0.905762f, 0.128296f, 0.891602f, 0.142578f, 0.876953f, 0.158203f, 0.862793f, + 0.172974f, 0.847656f, 0.189087f, 0.832520f, 0.202759f, 0.818359f, 0.218384f, 0.803223f, + 0.234619f, 0.787598f, 0.248169f, 0.772949f, 0.264893f, 0.757324f, 0.279541f, 0.742188f, + 0.294678f, 0.727051f, 0.310791f, 0.710938f, 0.326660f, 0.695801f, 0.341064f, 0.680176f, + 0.356934f, 0.664551f, 0.371582f, 0.648926f, 0.387207f, 0.633789f, 0.402588f, 0.618164f, + 0.418457f, 0.602539f, 0.433105f, 0.586914f, 0.448242f, 0.571289f, 0.462891f, 0.555664f, + 0.478027f, 0.540039f, 0.492920f, 0.524414f, 0.508789f, 0.508789f, 0.525391f, 0.492920f, + 0.539551f, 0.477051f, 0.555664f, 0.461182f, 0.569824f, 0.445557f, 0.584473f, 0.429932f, + 0.599609f, 0.414307f, 0.614258f, 0.398438f, 0.628906f, 0.382568f, 0.644531f, 0.366455f, + 0.659180f, 0.350830f, 0.673828f, 0.335205f, 0.687500f, 0.319580f, 0.703125f, 0.303711f, + 0.717285f, 0.287842f, 0.731934f, 0.272217f, 0.746582f, 0.256592f, 0.760254f, 0.240967f, + 0.772949f, 0.225586f, 0.788086f, 0.209351f, 0.800781f, 0.194092f, 0.815430f, 0.178467f, + 0.830566f, 0.161865f, 0.842285f, 0.146606f, 0.854980f, 0.131592f, 0.868652f, 0.115723f, + 0.879883f, 0.100159f, 0.891113f, 0.081482f, 0.901855f, 0.057465f, 0.908203f, 0.020493f, + 0.000000f, 1.000000f, 0.013168f, 0.993164f, 0.026703f, 0.982910f, 0.040466f, 0.972168f, + 0.055054f, 0.959473f, 0.070007f, 0.946289f, 0.083313f, 0.933594f, 0.099060f, 0.919434f, + 0.114380f, 0.904785f, 0.128052f, 0.891602f, 0.143677f, 0.876953f, 0.159058f, 0.861816f, + 0.173462f, 0.847656f, 0.188965f, 0.832520f, 0.204956f, 0.817383f, 0.220825f, 0.801758f, + 0.235596f, 0.787109f, 0.251709f, 0.771484f, 0.266113f, 0.756348f, 0.282715f, 0.740723f, + 0.297852f, 0.725098f, 0.313477f, 0.709473f, 0.329834f, 0.693848f, 0.344482f, 0.678711f, + 0.360596f, 0.662598f, 0.375732f, 0.646973f, 0.391846f, 0.630859f, 0.407227f, 0.615234f, + 0.423340f, 0.599121f, 0.438965f, 0.583496f, 0.455078f, 0.567383f, 0.470947f, 0.551270f, + 0.486328f, 0.535645f, 0.501465f, 0.519531f, 0.518066f, 0.503418f, 0.533203f, 0.487549f, + 0.549316f, 0.471436f, 0.564941f, 0.455322f, 0.581055f, 0.438965f, 0.596680f, 0.422852f, + 0.612793f, 0.406738f, 0.628418f, 0.390381f, 0.644531f, 0.374023f, 0.660156f, 0.357666f, + 0.675293f, 0.341553f, 0.690918f, 0.324951f, 0.706055f, 0.308838f, 0.721191f, 0.292236f, + 0.737305f, 0.275879f, 0.752441f, 0.259277f, 0.768066f, 0.243042f, 0.783691f, 0.226562f, + 0.797363f, 0.210327f, 0.812500f, 0.193848f, 0.827637f, 0.177368f, 0.843262f, 0.160645f, + 0.857910f, 0.144043f, 0.872070f, 0.127686f, 0.887207f, 0.111084f, 0.902344f, 0.093933f, + 0.915527f, 0.077881f, 0.929688f, 0.061188f, 0.942383f, 0.042114f, 0.953125f, 0.014633f, + 0.000000f, 1.000000f, 0.013443f, 0.993164f, 0.026764f, 0.983398f, 0.040497f, 0.971680f, + 0.055206f, 0.959473f, 0.070374f, 0.945801f, 0.085266f, 0.932129f, 0.100281f, 0.918457f, + 0.115479f, 0.904297f, 0.130737f, 0.890137f, 0.145752f, 0.875977f, 0.161011f, 0.861328f, + 0.175903f, 0.846680f, 0.191528f, 0.831543f, 0.206665f, 0.816406f, 0.222168f, 0.801270f, + 0.237915f, 0.785645f, 0.253418f, 0.770508f, 0.269043f, 0.754883f, 0.285156f, 0.739258f, + 0.301270f, 0.723633f, 0.316895f, 0.708008f, 0.333252f, 0.691895f, 0.348877f, 0.676270f, + 0.365723f, 0.660156f, 0.381592f, 0.644043f, 0.397461f, 0.628418f, 0.413574f, 0.612305f, + 0.429443f, 0.596191f, 0.445557f, 0.580078f, 0.461914f, 0.563477f, 0.478027f, 0.547363f, + 0.494141f, 0.531250f, 0.510254f, 0.514648f, 0.526367f, 0.498535f, 0.542480f, 0.481934f, + 0.558594f, 0.465576f, 0.575195f, 0.448975f, 0.591309f, 0.432617f, 0.607422f, 0.416016f, + 0.624512f, 0.399414f, 0.641113f, 0.382568f, 0.657227f, 0.365967f, 0.673340f, 0.349121f, + 0.689941f, 0.332275f, 0.706543f, 0.315430f, 0.722656f, 0.298584f, 0.738770f, 0.281494f, + 0.754883f, 0.264648f, 0.771484f, 0.247681f, 0.787109f, 0.230591f, 0.803711f, 0.213501f, + 0.819336f, 0.196289f, 0.834961f, 0.179077f, 0.851562f, 0.161743f, 0.868164f, 0.144287f, + 0.884766f, 0.126709f, 0.901367f, 0.109131f, 0.917480f, 0.091248f, 0.935059f, 0.073059f, + 0.952637f, 0.054260f, 0.968262f, 0.035858f, 0.983887f, 0.017548f, 0.999512f, 0.000115f, + }, +}; diff --git a/source/blender/draw/engines/eevee/eevee_lut.h b/source/blender/draw/engines/eevee/eevee_lut.h index d5dbf8ce690..8e107adfe0a 100644 --- a/source/blender/draw/engines/eevee/eevee_lut.h +++ b/source/blender/draw/engines/eevee/eevee_lut.h @@ -27,5 +27,5 @@ extern const float ltc_mat_ggx[64 * 64 * 4]; extern const float ltc_mag_ggx[64 * 64 * 2]; extern const float bsdf_split_sum_ggx[64 * 64 * 2]; extern const float ltc_disk_integral[64 * 64]; -extern const float btdf_split_sum_ggx[32][64 * 64]; +extern const float btdf_split_sum_ggx[16][64 * 64 * 2]; extern const float blue_noise[64 * 64][4]; diff --git a/source/blender/draw/engines/eevee/eevee_lut_gen.c b/source/blender/draw/engines/eevee/eevee_lut_gen.c index 18645fea5e0..770134d27f9 100644 --- a/source/blender/draw/engines/eevee/eevee_lut_gen.c +++ b/source/blender/draw/engines/eevee/eevee_lut_gen.c @@ -27,145 +27,97 @@ #include "DRW_render.h" -#include "BLI_alloca.h" +#include "BLI_fileops.h" #include "BLI_rand.h" #include "BLI_string_utils.h" #include "eevee_private.h" -static struct GPUTexture *create_ggx_lut_texture(int UNUSED(w), int UNUSED(h)) +#define DO_FILE_OUTPUT 0 + +float *EEVEE_lut_update_ggx_brdf(int lut_size) { - struct GPUTexture *tex; - struct GPUFrameBuffer *fb = NULL; - static float samples_len = 8192.0f; - static float inv_samples_len = 1.0f / 8192.0f; - - DRWPass *pass = DRW_pass_create("LightProbe Filtering", DRW_STATE_WRITE_COLOR); + DRWPass *pass = DRW_pass_create(__func__, DRW_STATE_WRITE_COLOR); DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_ggx_lut_sh_get(), pass); - DRW_shgroup_uniform_float(grp, "sampleCount", &samples_len, 1); - DRW_shgroup_uniform_float(grp, "invSampleCount", &inv_samples_len, 1); - DRW_shgroup_uniform_texture(grp, "texHammersley", e_data.hammersley); - DRW_shgroup_uniform_texture(grp, "texJitter", e_data.jitter); - - struct GPUBatch *geom = DRW_cache_fullscreen_quad_get(); - DRW_shgroup_call(grp, geom, NULL); - - float *texels = MEM_mallocN(sizeof(float[2]) * w * h, "lut"); - - tex = DRW_texture_create_2d(w, h, GPU_RG16F, DRW_TEX_FILTER, (float *)texels); - - DRWFboTexture tex_filter = {&tex, GPU_RG16F, DRW_TEX_FILTER}; - GPU_framebuffer_init(&fb, &draw_engine_eevee_type, w, h, &tex_filter, 1); + DRW_shgroup_uniform_float_copy(grp, "sampleCount", 64.0f); /* Actual sample count is squared. */ + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + GPUTexture *tex = DRW_texture_create_2d(lut_size, lut_size, GPU_RG16F, 0, NULL); + GPUFrameBuffer *fb = NULL; + GPU_framebuffer_ensure_config(&fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(tex), + }); GPU_framebuffer_bind(fb); DRW_draw_pass(pass); + GPU_FRAMEBUFFER_FREE_SAFE(fb); - float *data = MEM_mallocN(sizeof(float[3]) * w * h, "lut"); - GPU_framebuffer_read_color(fb, 0, 0, w, h, 3, 0, GPU_DATA_FLOAT, data); - - printf("{"); - for (int i = 0; i < w * h * 3; i += 3) { - printf("%ff, %ff, ", data[i], data[i + 1]); - i += 3; - printf("%ff, %ff, ", data[i], data[i + 1]); - i += 3; - printf("%ff, %ff, ", data[i], data[i + 1]); - i += 3; - printf("%ff, %ff, \n", data[i], data[i + 1]); + float *data = GPU_texture_read(tex, GPU_DATA_FLOAT, 0); + GPU_texture_free(tex); +#if DO_FILE_OUTPUT + /* Content is to be put inside eevee_lut.c */ + FILE *f = BLI_fopen("bsdf_split_sum_ggx.h", "w"); + fprintf(f, "const float bsdf_split_sum_ggx[%d * %d * 2] = {", lut_size, lut_size); + for (int i = 0; i < lut_size * lut_size * 2;) { + fprintf(f, "\n "); + for (int j = 0; j < 4; j++, i += 2) { + fprintf(f, "%ff, %ff, ", data[i], data[i + 1]); + } } - printf("}"); - - MEM_freeN(texels); - MEM_freeN(data); - - return tex; -} - -static struct GPUTexture *create_ggx_refraction_lut_texture(int w, int h) -{ - struct GPUTexture *tex; - struct GPUTexture *hammersley = create_hammersley_sample_texture(8192); - struct GPUFrameBuffer *fb = NULL; - static float samples_len = 8192.0f; - static float a2 = 0.0f; - static float inv_samples_len = 1.0f / 8192.0f; - - DRWPass *pass = DRW_pass_create("LightProbe Filtering", DRW_STATE_WRITE_COLOR); - DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_ggx_refraction_lut_sh_get(), pass); - DRW_shgroup_uniform_float(grp, "a2", &a2, 1); - DRW_shgroup_uniform_float(grp, "sampleCount", &samples_len, 1); - DRW_shgroup_uniform_float(grp, "invSampleCount", &inv_samples_len, 1); - DRW_shgroup_uniform_texture(grp, "texHammersley", hammersley); - DRW_shgroup_uniform_texture(grp, "utilTex", e_data.util_tex); - - struct GPUBatch *geom = DRW_cache_fullscreen_quad_get(); - DRW_shgroup_call(grp, geom, NULL); - - float *texels = MEM_mallocN(sizeof(float[2]) * w * h, "lut"); - - tex = DRW_texture_create_2d(w, h, GPU_R16F, DRW_TEX_FILTER, (float *)texels); - - DRWFboTexture tex_filter = {&tex, GPU_R16F, DRW_TEX_FILTER}; - GPU_framebuffer_init(&fb, &draw_engine_eevee_type, w, h, &tex_filter, 1); - - GPU_framebuffer_bind(fb); - - float *data = MEM_mallocN(sizeof(float[3]) * w * h, "lut"); - - float inc = 1.0f / 31.0f; - float roughness = 1e-8f - inc; - FILE *f = BLI_fopen("btdf_split_sum_ggx.h", "w"); - fprintf(f, "static float btdf_split_sum_ggx[32][64 * 64] = {\n"); - do { - roughness += inc; - CLAMP(roughness, 1e-4f, 1.0f); - a2 = powf(roughness, 4.0f); - DRW_draw_pass(pass); - - GPU_framebuffer_read_data(0, 0, w, h, 3, 0, data); - -#if 1 - fprintf(f, "\t{\n\t\t"); - for (int i = 0; i < w * h * 3; i += 3) { - fprintf(f, "%ff,", data[i]); - if (((i / 3) + 1) % 12 == 0) { - fprintf(f, "\n\t\t"); - } - else { - fprintf(f, " "); - } - } - fprintf(f, "\n\t},\n"); -#else - for (int i = 0; i < w * h * 3; i += 3) { - if (data[i] < 0.01) { - printf(" "); - } - else if (data[i] < 0.3) { - printf("."); - } - else if (data[i] < 0.6) { - printf("+"); - } - else if (data[i] < 0.9) { - printf("%%"); - } - else { - printf("#"); - } - if ((i / 3 + 1) % 64 == 0) { - printf("\n"); - } - } + fprintf(f, "\n};\n"); + fclose(f); #endif - } while (roughness < 1.0f); - fprintf(f, "\n};\n"); - - fclose(f); - - MEM_freeN(texels); - MEM_freeN(data); - - return tex; + return data; +} + +float *EEVEE_lut_update_ggx_btdf(int lut_size, int lut_depth) +{ + float roughness; + DRWPass *pass = DRW_pass_create(__func__, DRW_STATE_WRITE_COLOR); + DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_ggx_refraction_lut_sh_get(), pass); + DRW_shgroup_uniform_float_copy(grp, "sampleCount", 64.0f); /* Actual sample count is squared. */ + DRW_shgroup_uniform_float(grp, "z", &roughness, 1); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + + GPUTexture *tex = DRW_texture_create_2d_array(lut_size, lut_size, lut_depth, GPU_RG16F, 0, NULL); + GPUFrameBuffer *fb = NULL; + for (int i = 0; i < lut_depth; i++) { + GPU_framebuffer_ensure_config(&fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE_LAYER(tex, i), + }); + GPU_framebuffer_bind(fb); + roughness = i / (lut_depth - 1.0f); + DRW_draw_pass(pass); + } + + GPU_FRAMEBUFFER_FREE_SAFE(fb); + + float *data = GPU_texture_read(tex, GPU_DATA_FLOAT, 0); + GPU_texture_free(tex); + +#if DO_FILE_OUTPUT + /* Content is to be put inside eevee_lut.c. Don't forget to format the output. */ + FILE *f = BLI_fopen("btdf_split_sum_ggx.h", "w"); + fprintf(f, "const float btdf_split_sum_ggx[%d][%d * %d * 2] = {", lut_depth, lut_size, lut_size); + fprintf(f, "\n "); + int ofs = 0; + for (int d = 0; d < lut_depth; d++) { + fprintf(f, "{\n"); + for (int i = 0; i < lut_size * lut_size * 2;) { + for (int j = 0; j < 4; j++, i += 2, ofs += 2) { + fprintf(f, "%ff, %ff, ", data[ofs], data[ofs + 1]); + } + fprintf(f, "\n "); + } + fprintf(f, "},\n"); + } + fprintf(f, "};\n"); + fclose(f); +#endif + + return data; } diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c index 5f2821730f1..9d74d916265 100644 --- a/source/blender/draw/engines/eevee/eevee_materials.c +++ b/source/blender/draw/engines/eevee/eevee_materials.c @@ -142,11 +142,20 @@ static void eevee_init_noise_texture(void) e_data.noise_tex = DRW_texture_create_2d(64, 64, GPU_RGBA16F, 0, (float *)blue_noise); } +#define RUNTIME_LUT_CREATION 0 + static void eevee_init_util_texture(void) { const int layers = 4 + 16; float(*texels)[4] = MEM_mallocN(sizeof(float[4]) * 64 * 64 * layers, "utils texels"); float(*texels_layer)[4] = texels; +#if RUNTIME_LUT_CREATION + float *bsdf_ggx_lut = EEVEE_lut_update_ggx_brdf(64); + float(*btdf_ggx_lut)[64 * 64 * 2] = (float(*)[64 * 64 * 2]) EEVEE_lut_update_ggx_btdf(64, 16); +#else + const float *bsdf_ggx_lut = bsdf_split_sum_ggx; + const float(*btdf_ggx_lut)[64 * 64 * 2] = btdf_split_sum_ggx; +#endif /* Copy ltc_mat_ggx into 1st layer */ memcpy(texels_layer, ltc_mat_ggx, sizeof(float[4]) * 64 * 64); @@ -155,8 +164,8 @@ static void eevee_init_util_texture(void) /* Copy bsdf_split_sum_ggx into 2nd layer red and green channels. * Copy ltc_mag_ggx into 2nd layer blue and alpha channel. */ for (int i = 0; i < 64 * 64; i++) { - texels_layer[i][0] = bsdf_split_sum_ggx[i * 2 + 0]; - texels_layer[i][1] = bsdf_split_sum_ggx[i * 2 + 1]; + texels_layer[i][0] = bsdf_ggx_lut[i * 2 + 0]; + texels_layer[i][1] = bsdf_ggx_lut[i * 2 + 1]; texels_layer[i][2] = ltc_mag_ggx[i * 2 + 0]; texels_layer[i][3] = ltc_mag_ggx[i * 2 + 1]; } @@ -183,8 +192,8 @@ static void eevee_init_util_texture(void) /* Copy Refraction GGX LUT in layer 5 - 21 */ for (int j = 0; j < 16; j++) { for (int i = 0; i < 64 * 64; i++) { - texels_layer[i][0] = btdf_split_sum_ggx[j * 2][i]; - texels_layer[i][1] = 0.0; /* UNUSED */ + texels_layer[i][0] = btdf_ggx_lut[j][i * 2 + 0]; + texels_layer[i][1] = btdf_ggx_lut[j][i * 2 + 1]; texels_layer[i][2] = 0.0; /* UNUSED */ texels_layer[i][3] = 0.0; /* UNUSED */ } @@ -195,6 +204,10 @@ static void eevee_init_util_texture(void) 64, 64, layers, GPU_RGBA16F, DRW_TEX_FILTER | DRW_TEX_WRAP, (float *)texels); MEM_freeN(texels); +#if RUNTIME_LUT_CREATION + MEM_freeN(bsdf_ggx_lut); + MEM_freeN(btdf_ggx_lut); +#endif } void EEVEE_update_noise(EEVEE_PassList *psl, EEVEE_FramebufferList *fbl, const double offsets[3]) @@ -1107,4 +1120,4 @@ void EEVEE_material_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *v } } -/* \} */ +/** \} */ diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index e48f5f9dd32..4e32854dedc 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -55,6 +55,9 @@ extern struct DrawEngineType draw_engine_eevee_type; #define MAX_BLOOM_STEP 16 #define MAX_AOVS 64 +/* Special value chosen to not be altered by depth of field sample count. */ +#define TAA_MAX_SAMPLE 10000926 + // #define DEBUG_SHADOW_DISTRIBUTION /* Only define one of these. */ @@ -202,10 +205,31 @@ enum { typedef enum EEVEE_SSRShaderOptions { SSR_RESOLVE = (1 << 0), SSR_FULL_TRACE = (1 << 1), - SSR_AO = (1 << 3), - SSR_MAX_SHADER = (1 << 4), + SSR_MAX_SHADER = (1 << 2), } EEVEE_SSRShaderOptions; +/* DOF Gather pass shader variations */ +typedef enum EEVEE_DofGatherPass { + DOF_GATHER_FOREGROUND = 0, + DOF_GATHER_BACKGROUND = 1, + DOF_GATHER_HOLEFILL = 2, + + DOF_GATHER_MAX_PASS, +} EEVEE_DofGatherPass; + +#define DOF_TILE_DIVISOR 16 +#define DOF_BOKEH_LUT_SIZE 32 +#define DOF_GATHER_RING_COUNT 5 +#define DOF_DILATE_RING_COUNT 3 +#define DOF_FAST_GATHER_COC_ERROR 0.05 + +#define DOF_SHADER_DEFINES \ + "#define DOF_TILE_DIVISOR " STRINGIFY(DOF_TILE_DIVISOR) "\n" \ + "#define DOF_BOKEH_LUT_SIZE " STRINGIFY(DOF_BOKEH_LUT_SIZE) "\n" \ + "#define DOF_GATHER_RING_COUNT " STRINGIFY(DOF_GATHER_RING_COUNT) "\n" \ + "#define DOF_DILATE_RING_COUNT " STRINGIFY(DOF_DILATE_RING_COUNT) "\n" \ + "#define DOF_FAST_GATHER_COC_ERROR " STRINGIFY(DOF_FAST_GATHER_COC_ERROR) "\n" + /* ************ PROBE UBO ************* */ /* They are the same struct as their Cache siblings. @@ -258,8 +282,20 @@ typedef struct EEVEE_PassList { struct DRWPass *bloom_upsample; struct DRWPass *bloom_resolve; struct DRWPass *bloom_accum_ps; - struct DRWPass *dof_down; - struct DRWPass *dof_scatter; + struct DRWPass *dof_setup; + struct DRWPass *dof_flatten_tiles; + struct DRWPass *dof_dilate_tiles_minmax; + struct DRWPass *dof_dilate_tiles_minabs; + struct DRWPass *dof_reduce_copy; + struct DRWPass *dof_downsample; + struct DRWPass *dof_reduce; + struct DRWPass *dof_bokeh; + struct DRWPass *dof_gather_fg; + struct DRWPass *dof_gather_fg_holefill; + struct DRWPass *dof_gather_bg; + struct DRWPass *dof_scatter_fg; + struct DRWPass *dof_scatter_bg; + struct DRWPass *dof_filter; struct DRWPass *dof_resolve; struct DRWPass *volumetric_world_ps; struct DRWPass *volumetric_objects_ps; @@ -339,8 +375,20 @@ typedef struct EEVEE_FramebufferList { struct GPUFrameBuffer *sss_clear_fb; struct GPUFrameBuffer *sss_translucency_fb; struct GPUFrameBuffer *sss_accum_fb; - struct GPUFrameBuffer *dof_down_fb; - struct GPUFrameBuffer *dof_scatter_fb; + struct GPUFrameBuffer *dof_setup_fb; + struct GPUFrameBuffer *dof_flatten_tiles_fb; + struct GPUFrameBuffer *dof_dilate_tiles_fb; + struct GPUFrameBuffer *dof_downsample_fb; + struct GPUFrameBuffer *dof_reduce_fb; + struct GPUFrameBuffer *dof_reduce_copy_fb; + struct GPUFrameBuffer *dof_bokeh_fb; + struct GPUFrameBuffer *dof_gather_fg_fb; + struct GPUFrameBuffer *dof_filter_fg_fb; + struct GPUFrameBuffer *dof_gather_fg_holefill_fb; + struct GPUFrameBuffer *dof_gather_bg_fb; + struct GPUFrameBuffer *dof_filter_bg_fb; + struct GPUFrameBuffer *dof_scatter_fg_fb; + struct GPUFrameBuffer *dof_scatter_bg_fb; struct GPUFrameBuffer *volumetric_fb; struct GPUFrameBuffer *volumetric_scat_fb; struct GPUFrameBuffer *volumetric_integ_fb; @@ -390,6 +438,9 @@ typedef struct EEVEE_TextureList { struct GPUTexture *cryptomatte; struct GPUTexture *refract_color; struct GPUTexture *taa_history; + /* Could not be pool texture because of mipmapping. */ + struct GPUTexture *dof_reduced_color; + struct GPUTexture *dof_reduced_coc; struct GPUTexture *volume_prop_scattering; struct GPUTexture *volume_prop_extinction; @@ -727,16 +778,45 @@ typedef struct EEVEE_EffectsInfo { struct GPUTexture *velocity_tiles_x_tx; struct GPUTexture *velocity_tiles_tx; /* Depth Of Field */ - float dof_near_far[2]; - float dof_params[2]; - float dof_bokeh[4]; - float dof_bokeh_sides[4]; - int dof_target_size[2]; - struct GPUTexture *dof_down_near; /* Textures from pool */ - struct GPUTexture *dof_down_far; - struct GPUTexture *dof_coc; - struct GPUTexture *dof_blur; - struct GPUTexture *dof_blur_alpha; + float dof_jitter_radius; + float dof_jitter_blades; + float dof_jitter_focus; + int dof_jitter_ring_count; + float dof_coc_params[2], dof_coc_near_dist, dof_coc_far_dist; + float dof_bokeh_blades, dof_bokeh_rotation, dof_bokeh_aniso[2], dof_bokeh_max_size; + float dof_bokeh_aniso_inv[2]; + float dof_scatter_color_threshold; + float dof_scatter_coc_threshold; + float dof_scatter_neighbor_max_color; + float dof_fx_max_coc; + float dof_denoise_factor; + int dof_dilate_slight_focus; + int dof_dilate_ring_count; + int dof_dilate_ring_width_multiplier; + int dof_reduce_steps; + bool dof_hq_slight_focus; + eGPUTextureFormat dof_color_format; + struct GPUTexture *dof_bg_color_tx; /* All textures from pool... */ + struct GPUTexture *dof_bg_occlusion_tx; + struct GPUTexture *dof_bg_weight_tx; + struct GPUTexture *dof_bokeh_gather_lut_tx; + struct GPUTexture *dof_bokeh_scatter_lut_tx; + struct GPUTexture *dof_bokeh_resolve_lut_tx; + struct GPUTexture *dof_coc_dilated_tiles_bg_tx; + struct GPUTexture *dof_coc_dilated_tiles_fg_tx; + struct GPUTexture *dof_coc_tiles_bg_tx; + struct GPUTexture *dof_coc_tiles_fg_tx; + struct GPUTexture *dof_downsample_tx; + struct GPUTexture *dof_fg_color_tx; + struct GPUTexture *dof_fg_occlusion_tx; + struct GPUTexture *dof_fg_weight_tx; + struct GPUTexture *dof_fg_holefill_color_tx; + struct GPUTexture *dof_fg_holefill_weight_tx; + struct GPUTexture *dof_half_res_coc_tx; + struct GPUTexture *dof_half_res_color_tx; + struct GPUTexture *dof_scatter_src_tx; + struct GPUTexture *dof_reduce_input_coc_tx; /* Just references to actual textures. */ + struct GPUTexture *dof_reduce_input_color_tx; /* Alpha Checker */ float color_checker_dark[4]; float color_checker_light[4]; @@ -1002,7 +1082,8 @@ typedef struct EEVEE_PrivateData { /** For rendering planar reflections. */ struct DRWView *planar_views[MAX_PLANAR]; - int render_tot_samples; + int render_timesteps; + int render_sample_count_per_timestep; } EEVEE_PrivateData; /* Transient data */ /* eevee_data.c */ @@ -1110,9 +1191,16 @@ struct GPUShader *EEVEE_shaders_bloom_blit_get(bool high_quality); struct GPUShader *EEVEE_shaders_bloom_downsample_get(bool high_quality); struct GPUShader *EEVEE_shaders_bloom_upsample_get(bool high_quality); struct GPUShader *EEVEE_shaders_bloom_resolve_get(bool high_quality); -struct GPUShader *EEVEE_shaders_depth_of_field_downsample_get(bool use_alpha); -struct GPUShader *EEVEE_shaders_depth_of_field_scatter_get(bool use_alpha); -struct GPUShader *EEVEE_shaders_depth_of_field_resolve_get(bool use_alpha); +struct GPUShader *EEVEE_shaders_depth_of_field_bokeh_get(void); +struct GPUShader *EEVEE_shaders_depth_of_field_setup_get(void); +struct GPUShader *EEVEE_shaders_depth_of_field_flatten_tiles_get(void); +struct GPUShader *EEVEE_shaders_depth_of_field_dilate_tiles_get(bool pass); +struct GPUShader *EEVEE_shaders_depth_of_field_downsample_get(void); +struct GPUShader *EEVEE_shaders_depth_of_field_reduce_get(bool is_copy_pass); +struct GPUShader *EEVEE_shaders_depth_of_field_gather_get(EEVEE_DofGatherPass pass, bool bokeh_tx); +struct GPUShader *EEVEE_shaders_depth_of_field_filter_get(void); +struct GPUShader *EEVEE_shaders_depth_of_field_scatter_get(bool is_foreground, bool bokeh_tx); +struct GPUShader *EEVEE_shaders_depth_of_field_resolve_get(bool use_bokeh_tx, bool use_hq_gather); struct GPUShader *EEVEE_shaders_effect_downsample_sh_get(void); struct GPUShader *EEVEE_shaders_effect_downsample_cube_sh_get(void); struct GPUShader *EEVEE_shaders_effect_minz_downlevel_sh_get(void); @@ -1232,6 +1320,12 @@ void EEVEE_lightprobes_planar_data_from_object(Object *ob, int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object *camera); void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_depth_of_field_draw(EEVEE_Data *vedata); +bool EEVEE_depth_of_field_jitter_get(EEVEE_EffectsInfo *effects, + float r_jitter[2], + float *r_focus_distance); +int EEVEE_depth_of_field_sample_count_get(EEVEE_EffectsInfo *effects, + int sample_count, + int *r_ring_count); /* eevee_bloom.c */ int EEVEE_bloom_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); @@ -1247,7 +1341,6 @@ void EEVEE_cryptomatte_output_init(EEVEE_ViewLayerData *sldata, int tot_samples); void EEVEE_cryptomatte_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_cryptomatte_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata, Object *ob); -void EEVEE_cryptomatte_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_cryptomatte_particle_hair_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata, Object *ob); @@ -1345,6 +1438,7 @@ int EEVEE_renderpasses_aov_hash(const ViewLayerAOV *aov); /* eevee_temporal_sampling.c */ void EEVEE_temporal_sampling_reset(EEVEE_Data *vedata); void EEVEE_temporal_sampling_create_view(EEVEE_Data *vedata); +int EEVEE_temporal_sampling_sample_count_get(const Scene *scene, const EEVEE_StorageList *stl); int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_temporal_sampling_offset_calc(const double ht_point[2], const float filter_size, @@ -1422,6 +1516,10 @@ void EEVEE_lookdev_draw(EEVEE_Data *vedata); /** eevee_engine.c */ void EEVEE_cache_populate(void *vedata, Object *ob); +/** eevee_lut_gen.c */ +float *EEVEE_lut_update_ggx_brdf(int lut_size); +float *EEVEE_lut_update_ggx_btdf(int lut_size, int lut_depth); + /* Shadow Matrix */ static const float texcomat[4][4] = { /* From NDC to TexCo */ diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c index 72b12f6daeb..bc05b7915c3 100644 --- a/source/blender/draw/engines/eevee/eevee_render.c +++ b/source/blender/draw/engines/eevee/eevee_render.c @@ -157,7 +157,7 @@ void EEVEE_render_view_sync(EEVEE_Data *vedata, RenderEngine *engine, struct Dep { EEVEE_PrivateData *g_data = vedata->stl->g_data; - /* Set the pers & view matrix. */ + /* Set the perspective & view matrix. */ float winmat[4][4], viewmat[4][4], viewinv[4][4]; /* TODO(sergey): Shall render hold pointer to an evaluated camera instead? */ struct Object *ob_camera_eval = DEG_get_evaluated_object(depsgraph, g_data->cam_original_ob); @@ -563,7 +563,7 @@ void EEVEE_render_draw(EEVEE_Data *vedata, RenderEngine *engine, RenderLayer *rl /* Sort transparents before the loop. */ DRW_pass_sort_shgroup_z(psl->transparent_pass); - uint tot_sample = stl->g_data->render_tot_samples; + uint tot_sample = stl->g_data->render_sample_count_per_timestep; uint render_samples = 0; /* SSR needs one iteration to start properly. */ diff --git a/source/blender/draw/engines/eevee/eevee_renderpasses.c b/source/blender/draw/engines/eevee/eevee_renderpasses.c index 9dec551e4b9..0e16037f42d 100644 --- a/source/blender/draw/engines/eevee/eevee_renderpasses.c +++ b/source/blender/draw/engines/eevee/eevee_renderpasses.c @@ -255,10 +255,6 @@ void EEVEE_renderpasses_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *ve else { psl->renderpass_pass = NULL; } - - if ((g_data->render_passes & (EEVEE_RENDER_PASS_CRYPTOMATTE)) != 0) { - EEVEE_cryptomatte_cache_finish(sldata, vedata); - } } /* Post-process data to construct a specific render-pass @@ -283,8 +279,9 @@ void EEVEE_renderpasses_postprocess(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_EffectsInfo *effects = stl->effects; /* Compensate for taa_current_sample being incremented after last drawing in - * EEVEE_temporal_sampling_draw. */ - const int current_sample = effects->taa_current_sample - 1; + * EEVEE_temporal_sampling_draw when DRW_state_is_image_render(). */ + const int current_sample = DRW_state_is_image_render() ? effects->taa_current_sample - 1 : + effects->taa_current_sample; g_data->renderpass_current_sample = current_sample; g_data->renderpass_type = renderpass_type; g_data->renderpass_postprocess = PASS_POST_UNDEFINED; @@ -442,7 +439,7 @@ void EEVEE_renderpasses_draw(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) EEVEE_EffectsInfo *effects = stl->effects; DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); - /* We can only draw a single renderpass. Lightpasses also select their color pass + /* We can only draw a single render-pass. Light-passes also select their color pass * (a second pass). We mask the light pass when a light pass is selected. */ const eViewLayerEEVEEPassType render_pass = ((stl->g_data->render_passes & EEVEE_RENDERPASSES_LIGHT_PASS) != 0) ? diff --git a/source/blender/draw/engines/eevee/eevee_sampling.c b/source/blender/draw/engines/eevee/eevee_sampling.c index aa11f072fa5..da4bd20106c 100644 --- a/source/blender/draw/engines/eevee/eevee_sampling.c +++ b/source/blender/draw/engines/eevee/eevee_sampling.c @@ -38,7 +38,7 @@ void EEVEE_sample_ball(int sample_ofs, float radius, float rsample[3]) BLI_halton_3d(ht_primes, ht_offset, sample_ofs, ht_point); - /* Decorelate AA and shadow samples. (see T68594) */ + /* De-correlate AA and shadow samples. (see T68594) */ ht_point[0] = fmod(ht_point[0] * 1151.0, 1.0); ht_point[1] = fmod(ht_point[1] * 1069.0, 1.0); ht_point[2] = fmod(ht_point[2] * 1151.0, 1.0); diff --git a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c index 1465c9dd84c..f9e22f5c08d 100644 --- a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c +++ b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c @@ -143,7 +143,6 @@ void EEVEE_screen_raytrace_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *v if ((effects->enabled_effects & EFFECT_SSR) != 0) { EEVEE_SSRShaderOptions options = (effects->reflection_trace_full) ? SSR_FULL_TRACE : 0; - options |= ((effects->enabled_effects & EFFECT_GTAO) != 0) ? SSR_AO : 0; struct GPUShader *trace_shader = EEVEE_shaders_effect_screen_raytrace_sh_get(options); struct GPUShader *resolve_shader = EEVEE_shaders_effect_screen_raytrace_sh_get(SSR_RESOLVE | @@ -191,16 +190,19 @@ void EEVEE_screen_raytrace_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *v DRW_shgroup_uniform_texture_ref(grp, "hitBuffer", &effects->ssr_hit_output); DRW_shgroup_uniform_texture_ref(grp, "pdfBuffer", &effects->ssr_pdf_output); DRW_shgroup_uniform_texture_ref(grp, "prevColorBuffer", &txl->color_double_buffer); + DRW_shgroup_uniform_texture_ref(grp, "maxzBuffer", &txl->maxzbuffer); + DRW_shgroup_uniform_texture_ref(grp, "shadowCubeTexture", &sldata->shadow_cube_pool); + DRW_shgroup_uniform_texture_ref(grp, "shadowCascadeTexture", &sldata->shadow_cascade_pool); + DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex()); + DRW_shgroup_uniform_block(grp, "light_block", sldata->light_ubo); + DRW_shgroup_uniform_block(grp, "shadow_block", sldata->shadow_ubo); DRW_shgroup_uniform_block(grp, "grid_block", sldata->grid_ubo); DRW_shgroup_uniform_block(grp, "probe_block", sldata->probe_ubo); DRW_shgroup_uniform_block(grp, "planar_block", sldata->planar_ubo); DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); DRW_shgroup_uniform_block(grp, "renderpass_block", sldata->renderpass_ubo.combined); DRW_shgroup_uniform_int(grp, "neighborOffset", &effects->ssr_neighbor_ofs, 1); - if ((effects->enabled_effects & EFFECT_GTAO) != 0) { - DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex()); - DRW_shgroup_uniform_texture_ref(grp, "horizonBuffer", &effects->gtao_horizons); - } + DRW_shgroup_uniform_texture_ref(grp, "horizonBuffer", &effects->gtao_horizons); DRW_shgroup_call(grp, quad, NULL); } @@ -243,13 +245,13 @@ void EEVEE_reflection_compute(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *v EEVEE_downsample_buffer(vedata, txl->color_double_buffer, 9); /* Resolve at fullres */ - int sample = (DRW_state_is_image_render()) ? effects->taa_render_sample : - effects->taa_current_sample; + int samp = (DRW_state_is_image_render()) ? effects->taa_render_sample : + effects->taa_current_sample; /* Doing a neighbor shift only after a few iteration. * We wait for a prime number of cycles to avoid noise correlation. * This reduces variance faster. */ - effects->ssr_neighbor_ofs = ((sample / 5) % 8) * 4; - switch ((sample / 11) % 4) { + effects->ssr_neighbor_ofs = ((samp / 5) % 8) * 4; + switch ((samp / 11) % 4) { case 0: effects->ssr_halfres_ofs[0] = 0; effects->ssr_halfres_ofs[1] = 0; diff --git a/source/blender/draw/engines/eevee/eevee_shaders.c b/source/blender/draw/engines/eevee/eevee_shaders.c index 52d330c3ad2..a3e9236dc79 100644 --- a/source/blender/draw/engines/eevee/eevee_shaders.c +++ b/source/blender/draw/engines/eevee/eevee_shaders.c @@ -77,9 +77,16 @@ static struct { struct GPUShader *bloom_resolve_sh[2]; /* Depth Of Field */ - struct GPUShader *dof_downsample_sh[2]; - struct GPUShader *dof_scatter_sh[2]; - struct GPUShader *dof_resolve_sh[2]; + struct GPUShader *dof_bokeh_sh; + struct GPUShader *dof_setup_sh; + struct GPUShader *dof_flatten_tiles_sh; + struct GPUShader *dof_dilate_tiles_sh[2]; + struct GPUShader *dof_downsample_sh; + struct GPUShader *dof_reduce_sh[2]; + struct GPUShader *dof_gather_sh[DOF_GATHER_MAX_PASS][2]; + struct GPUShader *dof_filter_sh; + struct GPUShader *dof_scatter_sh[2][2]; + struct GPUShader *dof_resolve_sh[2][2]; /* General purpose Shaders. */ struct GPUShader *lookdev_background; @@ -142,7 +149,6 @@ static struct { struct GPUShader *volumetric_accum_sh; /* Shader strings */ - char *closure_lit_lib; char *surface_lit_frag; char *surface_prepass_frag; char *surface_geom_barycentric; @@ -184,7 +190,7 @@ extern char datatoc_bsdf_common_lib_glsl[]; extern char datatoc_bsdf_lut_frag_glsl[]; extern char datatoc_bsdf_sampling_lib_glsl[]; extern char datatoc_btdf_lut_frag_glsl[]; -extern char datatoc_closure_lib_glsl[]; +extern char datatoc_closure_type_lib_glsl[]; extern char datatoc_common_uniforms_lib_glsl[]; extern char datatoc_common_utiltex_lib_glsl[]; extern char datatoc_cryptomatte_frag_glsl[]; @@ -192,8 +198,18 @@ extern char datatoc_cubemap_lib_glsl[]; extern char datatoc_default_frag_glsl[]; extern char datatoc_lookdev_world_frag_glsl[]; extern char datatoc_effect_bloom_frag_glsl[]; -extern char datatoc_effect_dof_frag_glsl[]; -extern char datatoc_effect_dof_vert_glsl[]; +extern char datatoc_effect_dof_bokeh_frag_glsl[]; +extern char datatoc_effect_dof_dilate_tiles_frag_glsl[]; +extern char datatoc_effect_dof_downsample_frag_glsl[]; +extern char datatoc_effect_dof_filter_frag_glsl[]; +extern char datatoc_effect_dof_flatten_tiles_frag_glsl[]; +extern char datatoc_effect_dof_gather_frag_glsl[]; +extern char datatoc_effect_dof_lib_glsl[]; +extern char datatoc_effect_dof_reduce_frag_glsl[]; +extern char datatoc_effect_dof_resolve_frag_glsl[]; +extern char datatoc_effect_dof_scatter_frag_glsl[]; +extern char datatoc_effect_dof_scatter_vert_glsl[]; +extern char datatoc_effect_dof_setup_frag_glsl[]; extern char datatoc_effect_downsample_cube_frag_glsl[]; extern char datatoc_effect_downsample_frag_glsl[]; extern char datatoc_effect_gtao_frag_glsl[]; @@ -224,7 +240,11 @@ extern char datatoc_lightprobe_planar_downsample_geom_glsl[]; extern char datatoc_lightprobe_planar_downsample_vert_glsl[]; extern char datatoc_lightprobe_vert_glsl[]; extern char datatoc_lights_lib_glsl[]; -extern char datatoc_closure_lit_lib_glsl[]; +extern char datatoc_closure_eval_lib_glsl[]; +extern char datatoc_closure_eval_diffuse_lib_glsl[]; +extern char datatoc_closure_eval_glossy_lib_glsl[]; +extern char datatoc_closure_eval_refraction_lib_glsl[]; +extern char datatoc_closure_eval_translucent_lib_glsl[]; extern char datatoc_ltc_lib_glsl[]; extern char datatoc_object_motion_frag_glsl[]; extern char datatoc_object_motion_vert_glsl[]; @@ -279,23 +299,14 @@ static void eevee_shader_library_ensure(void) DRW_SHADER_LIB_ADD(e_data.lib, lights_lib); DRW_SHADER_LIB_ADD(e_data.lib, surface_lib); DRW_SHADER_LIB_ADD(e_data.lib, volumetric_lib); - DRW_SHADER_LIB_ADD(e_data.lib, closure_lib); DRW_SHADER_LIB_ADD(e_data.lib, ssr_lib); - - /* Add one for each Closure */ - e_data.closure_lit_lib = BLI_string_joinN(datatoc_closure_lit_lib_glsl, - datatoc_closure_lit_lib_glsl, - datatoc_closure_lit_lib_glsl, - datatoc_closure_lit_lib_glsl, - datatoc_closure_lit_lib_glsl, - datatoc_closure_lit_lib_glsl, - datatoc_closure_lit_lib_glsl, - datatoc_closure_lit_lib_glsl, - datatoc_closure_lit_lib_glsl, - datatoc_closure_lit_lib_glsl, - datatoc_closure_lit_lib_glsl); - - DRW_shader_library_add_file(e_data.lib, e_data.closure_lit_lib, "closure_lit_lib.glsl"); + DRW_SHADER_LIB_ADD(e_data.lib, effect_dof_lib); + DRW_SHADER_LIB_ADD(e_data.lib, closure_type_lib); + DRW_SHADER_LIB_ADD(e_data.lib, closure_eval_lib); + DRW_SHADER_LIB_ADD(e_data.lib, closure_eval_diffuse_lib); + DRW_SHADER_LIB_ADD(e_data.lib, closure_eval_glossy_lib); + DRW_SHADER_LIB_ADD(e_data.lib, closure_eval_translucent_lib); + DRW_SHADER_LIB_ADD(e_data.lib, closure_eval_refraction_lib); e_data.surface_lit_frag = DRW_shader_library_create_shader_string(e_data.lib, datatoc_surface_frag_glsl); @@ -438,7 +449,7 @@ GPUShader *EEVEE_shaders_probe_planar_display_sh_get(void) } /* -------------------------------------------------------------------- */ -/** \name Downsampling +/** \name Down-sampling * \{ */ GPUShader *EEVEE_shaders_effect_downsample_sh_get(void) @@ -556,11 +567,8 @@ GPUShader *EEVEE_shaders_effect_maxz_copydepth_sh_get(void) GPUShader *EEVEE_shaders_ggx_lut_sh_get(void) { if (e_data.ggx_lut_sh == NULL) { - e_data.ggx_lut_sh = DRW_shader_create_with_shaderlib(datatoc_lightprobe_vert_glsl, - datatoc_lightprobe_geom_glsl, - datatoc_bsdf_lut_frag_glsl, - e_data.lib, - "#define HAMMERSLEY_SIZE 8192\n"); + e_data.ggx_lut_sh = DRW_shader_create_fullscreen_with_shaderlib( + datatoc_bsdf_lut_frag_glsl, e_data.lib, NULL); } return e_data.ggx_lut_sh; } @@ -745,9 +753,6 @@ struct GPUShader *EEVEE_shaders_effect_screen_raytrace_sh_get(EEVEE_SSRShaderOpt if (options & SSR_FULL_TRACE) { BLI_dynstr_append(ds_defines, "#define FULLRES\n"); } - if (options & SSR_AO) { - BLI_dynstr_append(ds_defines, "#define SSR_AO\n"); - } char *ssr_define_str = BLI_dynstr_get_cstring(ds_defines); BLI_dynstr_free(ds_defines); @@ -1004,57 +1009,181 @@ GPUShader *EEVEE_shaders_bloom_resolve_get(bool high_quality) return e_data.bloom_resolve_sh[index]; } -/* \} */ +/** \} */ /* -------------------------------------------------------------------- */ /** \name Depth of field * \{ */ -GPUShader *EEVEE_shaders_depth_of_field_downsample_get(bool use_alpha) +GPUShader *EEVEE_shaders_depth_of_field_bokeh_get(void) { - int index = use_alpha ? 1 : 0; - if (e_data.dof_downsample_sh[index] == NULL) { - e_data.dof_downsample_sh[index] = DRW_shader_create_fullscreen_with_shaderlib( - datatoc_effect_dof_frag_glsl, + if (e_data.dof_bokeh_sh == NULL) { + e_data.dof_bokeh_sh = DRW_shader_create_fullscreen_with_shaderlib( + datatoc_effect_dof_bokeh_frag_glsl, e_data.lib, DOF_SHADER_DEFINES); + } + return e_data.dof_bokeh_sh; +} + +GPUShader *EEVEE_shaders_depth_of_field_setup_get(void) +{ + if (e_data.dof_setup_sh == NULL) { + e_data.dof_setup_sh = DRW_shader_create_fullscreen_with_shaderlib( + datatoc_effect_dof_setup_frag_glsl, e_data.lib, DOF_SHADER_DEFINES); + } + return e_data.dof_setup_sh; +} + +GPUShader *EEVEE_shaders_depth_of_field_flatten_tiles_get(void) +{ + if (e_data.dof_flatten_tiles_sh == NULL) { + e_data.dof_flatten_tiles_sh = DRW_shader_create_fullscreen_with_shaderlib( + datatoc_effect_dof_flatten_tiles_frag_glsl, e_data.lib, DOF_SHADER_DEFINES); + } + return e_data.dof_flatten_tiles_sh; +} + +GPUShader *EEVEE_shaders_depth_of_field_dilate_tiles_get(bool b_pass) +{ + int pass = b_pass; + if (e_data.dof_dilate_tiles_sh[pass] == NULL) { + e_data.dof_dilate_tiles_sh[pass] = DRW_shader_create_fullscreen_with_shaderlib( + datatoc_effect_dof_dilate_tiles_frag_glsl, e_data.lib, - use_alpha ? "#define USE_ALPHA_DOF\n" - "#define STEP_DOWNSAMPLE\n" : - "#define STEP_DOWNSAMPLE\n"); + (pass == 0) ? DOF_SHADER_DEFINES "#define DILATE_MODE_MIN_MAX\n" : + DOF_SHADER_DEFINES "#define DILATE_MODE_MIN_ABS\n"); } - return e_data.dof_downsample_sh[index]; + return e_data.dof_dilate_tiles_sh[pass]; } -GPUShader *EEVEE_shaders_depth_of_field_scatter_get(bool use_alpha) +GPUShader *EEVEE_shaders_depth_of_field_downsample_get(void) { - int index = use_alpha ? 1 : 0; - if (e_data.dof_scatter_sh[index] == NULL) { - e_data.dof_scatter_sh[index] = DRW_shader_create_with_shaderlib(datatoc_effect_dof_vert_glsl, - NULL, - datatoc_effect_dof_frag_glsl, - e_data.lib, - use_alpha ? - "#define USE_ALPHA_DOF\n" - "#define STEP_SCATTER\n" : - "#define STEP_SCATTER\n"); + if (e_data.dof_downsample_sh == NULL) { + e_data.dof_downsample_sh = DRW_shader_create_fullscreen_with_shaderlib( + datatoc_effect_dof_downsample_frag_glsl, e_data.lib, DOF_SHADER_DEFINES); } - return e_data.dof_scatter_sh[index]; + return e_data.dof_downsample_sh; } -GPUShader *EEVEE_shaders_depth_of_field_resolve_get(bool use_alpha) +GPUShader *EEVEE_shaders_depth_of_field_reduce_get(bool b_is_copy_pass) { - int index = use_alpha ? 1 : 0; - if (e_data.dof_resolve_sh[index] == NULL) { - e_data.dof_resolve_sh[index] = DRW_shader_create_fullscreen_with_shaderlib( - datatoc_effect_dof_frag_glsl, + int is_copy_pass = b_is_copy_pass; + if (e_data.dof_reduce_sh[is_copy_pass] == NULL) { + e_data.dof_reduce_sh[is_copy_pass] = DRW_shader_create_fullscreen_with_shaderlib( + datatoc_effect_dof_reduce_frag_glsl, e_data.lib, - use_alpha ? "#define USE_ALPHA_DOF\n" - "#define STEP_RESOLVE\n" : - "#define STEP_RESOLVE\n"); + (is_copy_pass) ? DOF_SHADER_DEFINES "#define COPY_PASS\n" : + DOF_SHADER_DEFINES "#define REDUCE_PASS\n"); } - return e_data.dof_resolve_sh[index]; + return e_data.dof_reduce_sh[is_copy_pass]; } -/* \} */ +GPUShader *EEVEE_shaders_depth_of_field_gather_get(EEVEE_DofGatherPass pass, bool b_use_bokeh_tx) +{ + int use_bokeh_tx = b_use_bokeh_tx; + if (e_data.dof_gather_sh[pass][use_bokeh_tx] == NULL) { + DynStr *ds = BLI_dynstr_new(); + + BLI_dynstr_append(ds, DOF_SHADER_DEFINES); + + switch (pass) { + case DOF_GATHER_FOREGROUND: + BLI_dynstr_append(ds, "#define DOF_FOREGROUND_PASS\n"); + break; + case DOF_GATHER_BACKGROUND: + BLI_dynstr_append(ds, "#define DOF_BACKGROUND_PASS\n"); + break; + case DOF_GATHER_HOLEFILL: + BLI_dynstr_append(ds, + "#define DOF_BACKGROUND_PASS\n" + "#define DOF_HOLEFILL_PASS\n"); + break; + default: + break; + } + + if (use_bokeh_tx) { + BLI_dynstr_append(ds, "#define DOF_BOKEH_TEXTURE\n"); + } + + char *define = BLI_dynstr_get_cstring(ds); + BLI_dynstr_free(ds); + + e_data.dof_gather_sh[pass][use_bokeh_tx] = DRW_shader_create_fullscreen_with_shaderlib( + datatoc_effect_dof_gather_frag_glsl, e_data.lib, define); + + MEM_freeN(define); + } + return e_data.dof_gather_sh[pass][use_bokeh_tx]; +} + +GPUShader *EEVEE_shaders_depth_of_field_filter_get(void) +{ + if (e_data.dof_filter_sh == NULL) { + e_data.dof_filter_sh = DRW_shader_create_fullscreen_with_shaderlib( + datatoc_effect_dof_filter_frag_glsl, e_data.lib, DOF_SHADER_DEFINES); + } + return e_data.dof_filter_sh; +} + +GPUShader *EEVEE_shaders_depth_of_field_scatter_get(bool b_is_foreground, bool b_use_bokeh_tx) +{ + int is_foreground = b_is_foreground; + int use_bokeh_tx = b_use_bokeh_tx; + if (e_data.dof_scatter_sh[is_foreground][use_bokeh_tx] == NULL) { + DynStr *ds = BLI_dynstr_new(); + + BLI_dynstr_append(ds, DOF_SHADER_DEFINES); + BLI_dynstr_append( + ds, (is_foreground) ? "#define DOF_FOREGROUND_PASS\n" : "#define DOF_BACKGROUND_PASS\n"); + + if (use_bokeh_tx) { + BLI_dynstr_append(ds, "#define DOF_BOKEH_TEXTURE\n"); + } + + char *define = BLI_dynstr_get_cstring(ds); + BLI_dynstr_free(ds); + + e_data.dof_scatter_sh[is_foreground][use_bokeh_tx] = DRW_shader_create_with_shaderlib( + datatoc_effect_dof_scatter_vert_glsl, + NULL, + datatoc_effect_dof_scatter_frag_glsl, + e_data.lib, + define); + + MEM_freeN(define); + } + return e_data.dof_scatter_sh[is_foreground][use_bokeh_tx]; +} + +GPUShader *EEVEE_shaders_depth_of_field_resolve_get(bool b_use_bokeh_tx, bool b_use_hq_gather) +{ + int use_hq_gather = b_use_hq_gather; + int use_bokeh_tx = b_use_bokeh_tx; + if (e_data.dof_resolve_sh[use_bokeh_tx][use_hq_gather] == NULL) { + DynStr *ds = BLI_dynstr_new(); + + BLI_dynstr_append(ds, DOF_SHADER_DEFINES); + BLI_dynstr_append(ds, "#define DOF_RESOLVE_PASS\n"); + + if (use_bokeh_tx) { + BLI_dynstr_append(ds, "#define DOF_BOKEH_TEXTURE\n"); + } + + BLI_dynstr_appendf(ds, "#define DOF_SLIGHT_FOCUS_DENSITY %d\n", use_hq_gather ? 4 : 2); + + char *define = BLI_dynstr_get_cstring(ds); + BLI_dynstr_free(ds); + + e_data.dof_resolve_sh[use_bokeh_tx][use_hq_gather] = + DRW_shader_create_fullscreen_with_shaderlib( + datatoc_effect_dof_resolve_frag_glsl, e_data.lib, define); + + MEM_freeN(define); + } + return e_data.dof_resolve_sh[use_bokeh_tx][use_hq_gather]; +} + +/** \} */ Material *EEVEE_material_default_diffuse_get(void) { @@ -1403,7 +1532,6 @@ struct GPUMaterial *EEVEE_material_get( void EEVEE_shaders_free(void) { - MEM_SAFE_FREE(e_data.closure_lit_lib); MEM_SAFE_FREE(e_data.surface_prepass_frag); MEM_SAFE_FREE(e_data.surface_lit_frag); MEM_SAFE_FREE(e_data.surface_geom_barycentric); @@ -1458,6 +1586,27 @@ void EEVEE_shaders_free(void) DRW_SHADER_FREE_SAFE(e_data.velocity_resolve_sh); DRW_SHADER_FREE_SAFE(e_data.taa_resolve_sh); DRW_SHADER_FREE_SAFE(e_data.taa_resolve_reproject_sh); + DRW_SHADER_FREE_SAFE(e_data.dof_bokeh_sh); + DRW_SHADER_FREE_SAFE(e_data.dof_setup_sh); + DRW_SHADER_FREE_SAFE(e_data.dof_flatten_tiles_sh); + DRW_SHADER_FREE_SAFE(e_data.dof_dilate_tiles_sh[0]); + DRW_SHADER_FREE_SAFE(e_data.dof_dilate_tiles_sh[1]); + DRW_SHADER_FREE_SAFE(e_data.dof_downsample_sh); + DRW_SHADER_FREE_SAFE(e_data.dof_reduce_sh[0]); + DRW_SHADER_FREE_SAFE(e_data.dof_reduce_sh[1]); + for (int i = 0; i < DOF_GATHER_MAX_PASS; i++) { + DRW_SHADER_FREE_SAFE(e_data.dof_gather_sh[i][0]); + DRW_SHADER_FREE_SAFE(e_data.dof_gather_sh[i][1]); + } + DRW_SHADER_FREE_SAFE(e_data.dof_filter_sh); + DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh[0][0]); + DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh[0][1]); + DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh[1][0]); + DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh[1][1]); + DRW_SHADER_FREE_SAFE(e_data.dof_resolve_sh[0][0]); + DRW_SHADER_FREE_SAFE(e_data.dof_resolve_sh[0][1]); + DRW_SHADER_FREE_SAFE(e_data.dof_resolve_sh[1][0]); + DRW_SHADER_FREE_SAFE(e_data.dof_resolve_sh[1][1]); DRW_SHADER_FREE_SAFE(e_data.cryptomatte_sh[0]); DRW_SHADER_FREE_SAFE(e_data.cryptomatte_sh[1]); for (int i = 0; i < 2; i++) { @@ -1465,9 +1614,6 @@ void EEVEE_shaders_free(void) DRW_SHADER_FREE_SAFE(e_data.bloom_downsample_sh[i]); DRW_SHADER_FREE_SAFE(e_data.bloom_upsample_sh[i]); DRW_SHADER_FREE_SAFE(e_data.bloom_resolve_sh[i]); - DRW_SHADER_FREE_SAFE(e_data.dof_downsample_sh[i]); - DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh[i]); - DRW_SHADER_FREE_SAFE(e_data.dof_resolve_sh[i]); } for (int i = 0; i < SSR_MAX_SHADER; i++) { DRW_SHADER_FREE_SAFE(e_data.ssr_sh[i]); diff --git a/source/blender/draw/engines/eevee/eevee_shadows.c b/source/blender/draw/engines/eevee/eevee_shadows.c index e29830defff..f6fe9a76c70 100644 --- a/source/blender/draw/engines/eevee/eevee_shadows.c +++ b/source/blender/draw/engines/eevee/eevee_shadows.c @@ -412,4 +412,4 @@ void EEVEE_shadow_output_accumulate(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_D } } -/* \} */ +/** \} */ diff --git a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c index 456efeca0f0..e30f5d52d56 100644 --- a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c +++ b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c @@ -142,15 +142,53 @@ void EEVEE_temporal_sampling_matrices_calc(EEVEE_EffectsInfo *effects, const dou Scene *scene = draw_ctx->scene; RenderData *rd = &scene->r; - float persmat[4][4], viewmat[4][4], winmat[4][4]; + float persmat[4][4], viewmat[4][4], winmat[4][4], wininv[4][4]; DRW_view_persmat_get(NULL, persmat, false); DRW_view_viewmat_get(NULL, viewmat, false); DRW_view_winmat_get(NULL, winmat, false); + DRW_view_winmat_get(NULL, wininv, true); float ofs[2]; EEVEE_temporal_sampling_offset_calc(ht_point, rd->gauss, ofs); - window_translate_m4(winmat, persmat, ofs[0] / viewport_size[0], ofs[1] / viewport_size[1]); + if (effects->taa_current_sample > 1) { + window_translate_m4(winmat, persmat, ofs[0] / viewport_size[0], ofs[1] / viewport_size[1]); + } + + /* Jitter is in pixel space. Focus distance in world space units. */ + float dof_jitter[2], focus_distance; + if (EEVEE_depth_of_field_jitter_get(effects, dof_jitter, &focus_distance)) { + /* Convert to NDC space [-1..1]. */ + dof_jitter[0] /= viewport_size[0] * 0.5f; + dof_jitter[1] /= viewport_size[1] * 0.5f; + + /* Skew the projection matrix in the ray direction and offset it to ray origin. + * Make it focus at focus_distance. */ + if (winmat[2][3] != -1.0f) { + /* Orthographic */ + add_v2_v2(winmat[2], dof_jitter); + + window_translate_m4( + winmat, persmat, dof_jitter[0] * focus_distance, dof_jitter[1] * focus_distance); + } + else { + /* Get focus distance in NDC. */ + float focus_pt[3] = {0.0f, 0.0f, -focus_distance}; + mul_project_m4_v3(winmat, focus_pt); + /* Get pixel footprint in view-space. */ + float jitter_scaled[3] = {dof_jitter[0], dof_jitter[1], focus_pt[2]}; + float center[3] = {0.0f, 0.0f, focus_pt[2]}; + mul_project_m4_v3(wininv, jitter_scaled); + mul_project_m4_v3(wininv, center); + + /* FIXME(fclem): The offset is noticeably large and the culling might make object pop out + * of the blurring radius. To fix this, use custom enlarged culling matrix. */ + sub_v2_v2v2(jitter_scaled, jitter_scaled, center); + add_v2_v2(viewmat[3], jitter_scaled); + + window_translate_m4(winmat, persmat, -dof_jitter[0], -dof_jitter[1]); + } + } BLI_assert(effects->taa_view != NULL); @@ -194,6 +232,21 @@ void EEVEE_temporal_sampling_create_view(EEVEE_Data *vedata) DRW_view_clip_planes_set(effects->taa_view, NULL, 0); } +int EEVEE_temporal_sampling_sample_count_get(const Scene *scene, const EEVEE_StorageList *stl) +{ + const bool is_render = DRW_state_is_image_render(); + int sample_count = is_render ? scene->eevee.taa_render_samples : scene->eevee.taa_samples; + int timesteps = is_render ? stl->g_data->render_timesteps : 1; + + sample_count = max_ii(0, sample_count); + sample_count = (sample_count == 0) ? TAA_MAX_SAMPLE : sample_count; + sample_count = divide_ceil_u(sample_count, timesteps); + + int dof_sample_count = EEVEE_depth_of_field_sample_count_get(stl->effects, sample_count, NULL); + sample_count = dof_sample_count * divide_ceil_u(sample_count, dof_sample_count); + return sample_count; +} + int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) { EEVEE_StorageList *stl = vedata->stl; @@ -238,10 +291,12 @@ int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data view_is_valid = view_is_valid && (ED_screen_animation_no_scrub(wm) == NULL); } - const bool first_sample_only = EEVEE_renderpasses_only_first_sample_pass_active(vedata); - view_is_valid = view_is_valid && !first_sample_only; - effects->taa_total_sample = first_sample_only ? 1 : scene_eval->eevee.taa_samples; - MAX2(effects->taa_total_sample, 0); + effects->taa_total_sample = EEVEE_temporal_sampling_sample_count_get(scene_eval, stl); + + if (EEVEE_renderpasses_only_first_sample_pass_active(vedata)) { + view_is_valid = false; + effects->taa_total_sample = 1; + } /* Motion blur steps could reset the sampling when camera is animated (see T79970). */ if (!DRW_state_is_scene_render()) { diff --git a/source/blender/draw/engines/eevee/eevee_volumes.c b/source/blender/draw/engines/eevee/eevee_volumes.c index 1e75968f1de..52c96bf51e7 100644 --- a/source/blender/draw/engines/eevee/eevee_volumes.c +++ b/source/blender/draw/engines/eevee/eevee_volumes.c @@ -853,4 +853,4 @@ void EEVEE_volumes_output_accumulate(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_ } } -/* \} */ +/** \} */ diff --git a/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl b/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl index 2f6f8327f58..473990e1683 100644 --- a/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl @@ -1,5 +1,6 @@ #pragma BLENDER_REQUIRE(common_math_lib.glsl) +#pragma BLENDER_REQUIRE(common_math_geom_lib.glsl) #pragma BLENDER_REQUIRE(raytrace_lib.glsl) /* Based on Practical Realtime Strategies for Accurate Indirect Occlusion @@ -23,10 +24,6 @@ # endif #endif -#define MAX_PHI_STEP 32 -#define MAX_SEARCH_ITER 32 -#define MAX_LOD 6.0 - uniform sampler2D horizonBuffer; /* aoSettings flags */ @@ -34,191 +31,251 @@ uniform sampler2D horizonBuffer; #define USE_BENT_NORMAL 2 #define USE_DENOISE 4 -vec4 pack_horizons(vec4 v) +#define MAX_LOD 6.0 +#define NO_OCCLUSION_DATA OcclusionData(vec4(M_PI, -M_PI, M_PI, -M_PI), 1.0) + +struct OcclusionData { + /* 4 horizons angles, one in each direction around the view vector to form a cross pattern. */ + vec4 horizons; + /* Custom large scale occlusion. */ + float custom_occlusion; +}; + +vec4 pack_occlusion_data(OcclusionData data) { - return v * 0.5 + 0.5; -} -vec4 unpack_horizons(vec4 v) -{ - return v * 2.0 - 1.0; + return vec4(1.0 - data.horizons * vec4(1, -1, 1, -1) * M_1_PI); } -/* Returns maximum screen distance an AO ray can travel for a given view depth */ -vec2 get_max_dir(float view_depth) +OcclusionData unpack_occlusion_data(vec4 v) +{ + return OcclusionData((1.0 - v) * vec4(1, -1, 1, -1) * M_PI, 0.0); +} + +/* Returns maximum screen distance an AO ray can travel for a given view depth, in NDC space. */ +vec2 get_ao_area(float view_depth, float radius) { float homcco = ProjectionMatrix[2][3] * view_depth + ProjectionMatrix[3][3]; - float max_dist = aoDistance / homcco; + float max_dist = radius / homcco; return vec2(ProjectionMatrix[0][0], ProjectionMatrix[1][1]) * max_dist; } +vec2 get_ao_noise(void) +{ + return texelfetch_noise_tex(gl_FragCoord.xy).xy; +} + vec2 get_ao_dir(float jitter) { - /* Only half a turn because we integrate in slices. */ - jitter *= M_PI; + /* Only a quarter of a turn because we integrate using 2 slices. + * We use this instead of using utiltex circle noise to improve cache hits + * since all tracing direction will be in the same quadrant. */ + jitter *= M_PI_2; return vec2(cos(jitter), sin(jitter)); } -void get_max_horizon_grouped(vec4 co1, vec4 co2, vec3 x, float lod, inout float h) +/* Return horizon angle cosine. */ +float search_horizon(vec3 vI, + vec3 vP, + float noise, + vec2 uv_start, + vec2 uv_dir, + sampler2D depth_tx, + const float inverted, + float radius, + const float sample_count) { - int mip = int(lod) + hizMipOffset; - co1 *= mipRatio[mip].xyxy; - co2 *= mipRatio[mip].xyxy; + float sample_count_inv = 1.0 / sample_count; + /* Init at cos(M_PI). */ + float h = (inverted != 0.0) ? 1.0 : -1.0; - float depth1 = textureLod(maxzBuffer, co1.xy, floor(lod)).r; - float depth2 = textureLod(maxzBuffer, co1.zw, floor(lod)).r; - float depth3 = textureLod(maxzBuffer, co2.xy, floor(lod)).r; - float depth4 = textureLod(maxzBuffer, co2.zw, floor(lod)).r; + /* TODO(fclem) samples steps should be using the same approach as raytrace. (DDA line algo.) */ + for (float i = 0.0; i < sample_count; i++) { + float t = ((i + noise) * sample_count_inv); + vec2 uv = uv_start + uv_dir * t; + float lod = min(MAX_LOD, max(i - noise, 0.0) * aoQuality); - vec4 len, s_h; + int mip = int(lod) + hizMipOffset; + float depth = textureLod(depth_tx, uv * mipRatio[mip].xy, floor(lod)).r; - vec3 s1 = get_view_space_from_depth(co1.xy, depth1); /* s View coordinate */ - vec3 omega_s1 = s1 - x; - len.x = length(omega_s1); - s_h.x = omega_s1.z / len.x; + /* Bias depth a bit to avoid self shadowing issues. */ + const float bias = 2.0 * 2.4e-7; + depth += (inverted != 0.0) ? -bias : bias; - vec3 s2 = get_view_space_from_depth(co1.zw, depth2); /* s View coordinate */ - vec3 omega_s2 = s2 - x; - len.y = length(omega_s2); - s_h.y = omega_s2.z / len.y; + vec3 s = get_view_space_from_depth(uv, depth); + vec3 omega_s = s - vP; + float len = length(omega_s); + /* Sample's horizon angle cosine. */ + float s_h = dot(vI, omega_s / len); + /* Blend weight to fade artifacts. */ + float dist_ratio = abs(len) / radius; + /* TODO(fclem) parameter. */ + float dist_fac = sqr(saturate(dist_ratio * 2.0 - 1.0)); - vec3 s3 = get_view_space_from_depth(co2.xy, depth3); /* s View coordinate */ - vec3 omega_s3 = s3 - x; - len.z = length(omega_s3); - s_h.z = omega_s3.z / len.z; - - vec3 s4 = get_view_space_from_depth(co2.zw, depth4); /* s View coordinate */ - vec3 omega_s4 = s4 - x; - len.w = length(omega_s4); - s_h.w = omega_s4.z / len.w; - - /* Blend weight after half the aoDistance to fade artifacts */ - vec4 blend = saturate((1.0 - len / aoDistance) * 2.0); - - h = mix(h, max(h, s_h.x), blend.x); - h = mix(h, max(h, s_h.y), blend.y); - h = mix(h, max(h, s_h.z), blend.z); - h = mix(h, max(h, s_h.w), blend.w); + /* Thickness heuristic (Eq. 9). */ + if (inverted != 0.0) { + h = min(h, s_h); + } + else { + /* TODO This need to take the stride distance into account. Now it works because stride is + * constant. */ + if (s_h < h) { + /* TODO(fclem) parameter. */ + const float thickness_fac = 0.2; + s_h = mix(h, s_h, thickness_fac); + } + else { + s_h = max(h, s_h); + } + h = mix(s_h, h, dist_fac); + } + } + return fast_acos(h); } -vec2 search_horizon_sweep(vec2 t_phi, vec3 pos, vec2 uvs, float jitter, vec2 max_dir) +OcclusionData occlusion_search( + vec3 vP, sampler2D depth_tx, float radius, const float inverted, const float dir_sample_count) { - max_dir *= max_v2(abs(t_phi)); - - /* Convert to pixel space. */ - t_phi /= vec2(textureSize(maxzBuffer, 0)); - - /* Avoid division by 0 */ - t_phi += vec2(1e-5); - - jitter *= 0.25; - - /* Compute end points */ - vec2 corner1 = min(vec2(1.0) - uvs, max_dir); /* Top right */ - vec2 corner2 = max(vec2(0.0) - uvs, -max_dir); /* Bottom left */ - vec2 iter1 = corner1 / t_phi; - vec2 iter2 = corner2 / t_phi; - - vec2 min_iter = max(-iter1, -iter2); - vec2 max_iter = max(iter1, iter2); - - vec2 times = vec2(-min_v2(min_iter), min_v2(max_iter)); - - vec2 h = vec2(-1.0); /* init at cos(pi) */ - - /* This is freaking sexy optimized. */ - for (float i = 0.0, ofs = 4.0, time = -1.0; i < MAX_SEARCH_ITER && time > times.x; - i++, time -= ofs, ofs = min(exp2(MAX_LOD) * 4.0, ofs + ofs * aoQuality)) { - vec4 t = max(times.xxxx, vec4(time) - (vec4(0.25, 0.5, 0.75, 1.0) - jitter) * ofs); - vec4 cos1 = uvs.xyxy + t_phi.xyxy * t.xxyy; - vec4 cos2 = uvs.xyxy + t_phi.xyxy * t.zzww; - float lod = min(MAX_LOD, max(i - jitter * 4.0, 0.0) * aoQuality); - get_max_horizon_grouped(cos1, cos2, pos, lod, h.y); + if ((int(aoSettings) & USE_AO) == 0) { + return NO_OCCLUSION_DATA; } - for (float i = 0.0, ofs = 4.0, time = 1.0; i < MAX_SEARCH_ITER && time < times.y; - i++, time += ofs, ofs = min(exp2(MAX_LOD) * 4.0, ofs + ofs * aoQuality)) { - vec4 t = min(times.yyyy, vec4(time) + (vec4(0.25, 0.5, 0.75, 1.0) - jitter) * ofs); - vec4 cos1 = uvs.xyxy + t_phi.xyxy * t.xxyy; - vec4 cos2 = uvs.xyxy + t_phi.xyxy * t.zzww; - float lod = min(MAX_LOD, max(i - jitter * 4.0, 0.0) * aoQuality); - get_max_horizon_grouped(cos1, cos2, pos, lod, h.x); + vec2 noise = get_ao_noise(); + vec2 area = get_ao_area(vP.z, radius); + vec2 dir = get_ao_dir(noise.x); + vec2 uv = get_uvs_from_view(vP); + vec3 vI = ((ProjectionMatrix[3][3] == 0.0) ? normalize(-vP) : vec3(0.0, 0.0, 1.0)); + vec3 avg_dir = vec3(0.0); + float avg_apperture = 0.0; + + OcclusionData data = (inverted != 0.0) ? OcclusionData(vec4(0, 0, 0, 0), 1.0) : + NO_OCCLUSION_DATA; + + for (int i = 0; i < 2; i++) { + /* View > NDC > Uv space. */ + vec2 uv_dir = dir * area * 0.5; + /* Offset the start one pixel to avoid self shadowing. */ + /* TODO(fclem) Using DDA line algo should fix this. */ + vec2 px_dir = uv_dir * textureSize(depth_tx, 0); + float max_px_dir = max_v2(abs(px_dir)); + vec2 uv_ofs = (px_dir / max_px_dir) / textureSize(depth_tx, 0); + /* No need to trace more. */ + uv_dir -= uv_ofs; + + if (max_px_dir > 1.0) { + data.horizons[0 + i * 2] = search_horizon( + vI, vP, noise.y, uv + uv_ofs, uv_dir, depth_tx, inverted, radius, dir_sample_count); + data.horizons[1 + i * 2] = -search_horizon( + vI, vP, noise.y, uv - uv_ofs, -uv_dir, depth_tx, inverted, radius, dir_sample_count); + } + /* Rotate 90 degrees. */ + dir = vec2(-dir.y, dir.x); } - return h; + return data; } -void integrate_slice( - vec3 normal, vec2 t_phi, vec2 horizons, inout float visibility, inout vec3 bent_normal) +vec2 clamp_horizons_to_hemisphere(vec2 horizons, float angle_N, const float inverted) { - /* Projecting Normal to Plane P defined by t_phi and omega_o */ - vec3 np = vec3(t_phi.y, -t_phi.x, 0.0); /* Normal vector to Integration plane */ - vec3 t = vec3(-t_phi, 0.0); - vec3 n_proj = normal - np * dot(np, normal); - float n_proj_len = max(1e-16, length(n_proj)); + /* Add a little bias to fight self shadowing. */ + const float max_angle = M_PI_2 - 0.05; - float cos_n = clamp(n_proj.z / n_proj_len, -1.0, 1.0); - float n = sign(dot(n_proj, t)) * fast_acos(cos_n); /* Angle between view vec and normal */ - - /* (Slide 54) */ - vec2 h = fast_acos(horizons); - h.x = -h.x; - - /* Clamping thetas (slide 58) */ - h.x = n + max(h.x - n, -M_PI_2); - h.y = n + min(h.y - n, M_PI_2); - - /* Solving inner integral */ - vec2 h_2 = 2.0 * h; - vec2 vd = -cos(h_2 - n) + cos_n + h_2 * sin(n); - float vis = saturate((vd.x + vd.y) * 0.25 * n_proj_len); - - visibility += vis; - - /* O. Klehm, T. Ritschel, E. Eisemann, H.-P. Seidel - * Bent Normals and Cones in Screen-space - * Sec. 3.1 : Bent normals */ - float b_angle = (h.x + h.y) * 0.5; - bent_normal += vec3(sin(b_angle) * -t_phi, cos(b_angle)) * vis; + if (inverted != 0.0) { + horizons.x = max(horizons.x, angle_N + max_angle); + horizons.y = min(horizons.y, angle_N - max_angle); + } + else { + horizons.x = min(horizons.x, angle_N + max_angle); + horizons.y = max(horizons.y, angle_N - max_angle); + } + return horizons; } -void gtao_deferred( - vec3 normal, vec4 noise, float frag_depth, out float visibility, out vec3 bent_normal) +void occlusion_eval(OcclusionData data, + vec3 V, + vec3 N, + vec3 Ng, + const float inverted, + out float visibility, + out vec3 bent_normal) { - /* Fetch early, hide latency! */ - vec4 horizons = texelFetch(horizonBuffer, ivec2(gl_FragCoord.xy), 0); + if ((int(aoSettings) & USE_AO) == 0) { + visibility = data.custom_occlusion; + bent_normal = N; + return; + } - vec4 dirs; - dirs.xy = get_ao_dir(noise.x * 0.5); - dirs.zw = get_ao_dir(noise.x * 0.5 + 0.5); + bool early_out = (inverted != 0.0) ? (max_v4(abs(data.horizons)) == 0.0) : + (min_v4(abs(data.horizons)) == M_PI); + if (early_out) { + visibility = dot(N, Ng) * 0.5 + 0.5; + visibility = min(visibility, data.custom_occlusion); - bent_normal = normal * 1e-8; - visibility = 1e-8; + if ((int(aoSettings) & USE_BENT_NORMAL) == 0) { + bent_normal = N; + } + else { + bent_normal = normalize(N + Ng); + } + return; + } - horizons = unpack_horizons(horizons); - - integrate_slice(normal, dirs.xy, horizons.xy, visibility, bent_normal); - integrate_slice(normal, dirs.zw, horizons.zw, visibility, bent_normal); - - bent_normal = normalize(bent_normal / visibility); - - visibility *= 0.5; /* We integrated 2 slices. */ -} - -void gtao(vec3 normal, vec3 position, vec4 noise, out float visibility, out vec3 bent_normal) -{ - vec2 uvs = get_uvs_from_view(position); - vec2 max_dir = get_max_dir(position.z); + vec2 noise = get_ao_noise(); vec2 dir = get_ao_dir(noise.x); - bent_normal = normal * 1e-8; - visibility = 1e-8; + visibility = 0.0; + bent_normal = N * 0.001; - /* Only trace in 2 directions. May lead to a darker result but since it's mostly for - * alpha blended objects that will have overdraw, we limit the performance impact. */ - vec2 horizons = search_horizon_sweep(dir, position, uvs, noise.y, max_dir); - integrate_slice(normal, dir, horizons, visibility, bent_normal); + for (int i = 0; i < 2; i++) { + vec3 T = transform_direction(ViewMatrixInverse, vec3(dir, 0.0)); + /* Setup integration domain around V. */ + vec3 B = normalize(cross(V, T)); + T = normalize(cross(B, V)); - bent_normal = normalize(bent_normal / visibility); + float proj_N_len; + vec3 proj_N = normalize_len(N - B * dot(N, B), proj_N_len); + vec3 proj_Ng = normalize(Ng - B * dot(Ng, B)); + + vec2 h = (i == 0) ? data.horizons.xy : data.horizons.zw; + + float N_sin = dot(proj_N, T); + float Ng_sin = dot(proj_Ng, T); + float N_cos = saturate(dot(proj_N, V)); + float Ng_cos = saturate(dot(proj_Ng, V)); + /* Gamma, angle between normalized projected normal and view vector. */ + float angle_Ng = sign(Ng_sin) * fast_acos(Ng_cos); + float angle_N = sign(N_sin) * fast_acos(N_cos); + /* Clamp horizons to hemisphere around shading normal. */ + h = clamp_horizons_to_hemisphere(h, angle_N, inverted); + + float bent_angle = (h.x + h.y) * 0.5; + /* NOTE: here we multiply z by 0.5 as it shows less difference with the geometric normal. + * Also modulate by projected normal length to reduce issues with slanted surfaces. + * All of this is ad-hoc and not really grounded. */ + bent_normal += proj_N_len * (T * sin(bent_angle) + V * 0.5 * cos(bent_angle)); + + /* Clamp to geometric normal only for integral to keep smooth bent normal. */ + /* This is done to match Cycles ground truth but adds some computation. */ + h = clamp_horizons_to_hemisphere(h, angle_Ng, inverted); + + /* Inner integral (Eq. 7). */ + float a = dot(-cos(2.0 * h - angle_N) + N_cos + 2.0 * h * N_sin, vec2(0.25)); + /* Correct normal not on plane (Eq. 8). */ + visibility += proj_N_len * a; + + /* Rotate 90 degrees. */ + dir = vec2(-dir.y, dir.x); + } + /* We integrated 2 directions. */ + visibility *= 0.5; + + visibility = min(visibility, data.custom_occlusion); + + if ((int(aoSettings) & USE_BENT_NORMAL) == 0) { + bent_normal = N; + } + else { + bent_normal = normalize(mix(bent_normal, N, sqr(sqr(sqr(visibility))))); + } } /* Multibounce approximation base on surface albedo. @@ -240,46 +297,103 @@ float gtao_multibounce(float visibility, vec3 albedo) return max(x, ((x * a + b) * x + c) * x); } -float specular_occlusion(float NV, float AO, float roughness) +float diffuse_occlusion(OcclusionData data, vec3 V, vec3 N, vec3 Ng) { - return saturate(pow(NV + AO, roughness) - 1.0 + AO); + vec3 unused; + float visibility; + occlusion_eval(data, V, N, Ng, 0.0, visibility, unused); + /* Scale by user factor */ + visibility = pow(saturate(visibility), aoFactor); + return visibility; } -/* Use the right occlusion */ -float occlusion_compute(vec3 N, vec3 vpos, float user_occlusion, vec4 rand, out vec3 bent_normal) +float diffuse_occlusion( + OcclusionData data, vec3 V, vec3 N, vec3 Ng, vec3 albedo, out vec3 bent_normal) { -#ifndef USE_REFRACTION - if ((int(aoSettings) & USE_AO) != 0) { - float visibility; - vec3 vnor = mat3(ViewMatrix) * N; + float visibility; + occlusion_eval(data, V, N, Ng, 0.0, visibility, bent_normal); -# ifdef ENABLE_DEFERED_AO - gtao_deferred(vnor, rand, gl_FragCoord.z, visibility, bent_normal); -# else - gtao(vnor, vpos, rand, visibility, bent_normal); -# endif + visibility = gtao_multibounce(visibility, albedo); + /* Scale by user factor */ + visibility = pow(saturate(visibility), aoFactor); + return visibility; +} - /* Prevent some problems down the road. */ - visibility = max(1e-3, visibility); - - if ((int(aoSettings) & USE_BENT_NORMAL) != 0) { - /* The bent normal will show the facet look of the mesh. Try to minimize this. */ - float mix_fac = visibility * visibility * visibility; - bent_normal = normalize(mix(bent_normal, vnor, mix_fac)); - - bent_normal = transform_direction(ViewMatrixInverse, bent_normal); - } - else { - bent_normal = N; - } - - /* Scale by user factor */ - visibility = pow(visibility, aoFactor); - - return min(visibility, user_occlusion); +/** + * Approximate the area of intersection of two spherical caps + * radius1 : First cap’s radius (arc length in radians) + * radius2 : Second caps’ radius (in radians) + * dist : Distance between caps (radians between centers of caps) + * Note: Result is divided by pi to save one multiply. + **/ +float spherical_cap_intersection(float radius1, float radius2, float dist) +{ + /* From "Ambient Aperture Lighting" by Chris Oat + * Slide 15. */ + float max_radius = max(radius1, radius2); + float min_radius = min(radius1, radius2); + float sum_radius = radius1 + radius2; + float area; + if (dist <= max_radius - min_radius) { + /* One cap in completely inside the other */ + area = 1.0 - cos(min_radius); } + else if (dist >= sum_radius) { + /* No intersection exists */ + area = 0; + } + else { + float diff = max_radius - min_radius; + area = smoothstep(0.0, 1.0, 1.0 - saturate((dist - diff) / (sum_radius - diff))); + area *= 1.0 - cos(min_radius); + } + return area; +} + +float specular_occlusion( + OcclusionData data, vec3 V, vec3 N, float roughness, inout vec3 specular_dir) +{ + vec3 visibility_dir; + float visibility; + occlusion_eval(data, V, N, N, 0.0, visibility, visibility_dir); + + specular_dir = normalize(mix(specular_dir, visibility_dir, roughness * (1.0 - visibility))); + + /* Visibility to cone angle (eq. 18). */ + float vis_angle = fast_acos(sqrt(1 - visibility)); + /* Roughness to cone angle (eq. 26). */ + float spec_angle = max(0.001, fast_acos(cone_cosine(roughness))); + /* Angle between cone axes. */ + float cone_cone_dist = fast_acos(saturate(dot(visibility_dir, specular_dir))); + float cone_nor_dist = fast_acos(saturate(dot(N, specular_dir))); + + float isect_solid_angle = spherical_cap_intersection(vis_angle, spec_angle, cone_cone_dist); + float specular_solid_angle = spherical_cap_intersection(M_PI_2, spec_angle, cone_nor_dist); + float specular_occlusion = isect_solid_angle / specular_solid_angle; + /* Mix because it is unstable in unoccluded areas. */ + visibility = mix(isect_solid_angle / specular_solid_angle, 1.0, pow(visibility, 8.0)); + + /* Scale by user factor */ + visibility = pow(saturate(visibility), aoFactor); + return visibility; +} + +/* Use the right occlusion. */ +OcclusionData occlusion_load(vec3 vP, float custom_occlusion) +{ + /* Default to fully openned cone. */ + OcclusionData data = NO_OCCLUSION_DATA; + +#ifdef ENABLE_DEFERED_AO + if ((int(aoSettings) & USE_AO) != 0) { + data = unpack_occlusion_data(texelFetch(horizonBuffer, ivec2(gl_FragCoord.xy), 0)); + } +#else + /* For blended surfaces and */ + data = occlusion_search(vP, maxzBuffer, aoDistance, 0.0, 8.0); #endif - bent_normal = N; - return user_occlusion; + data.custom_occlusion = custom_occlusion; + + return data; } diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl index 3560ae62a84..bc2895ef3df 100644 --- a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl @@ -1,6 +1,11 @@ #pragma BLENDER_REQUIRE(common_math_lib.glsl) +vec3 diffuse_dominant_dir(vec3 bent_normal) +{ + return bent_normal; +} + vec3 specular_dominant_dir(vec3 N, vec3 V, float roughness) { vec3 R = -reflect(V, N); @@ -15,6 +20,7 @@ float ior_from_f0(float f0) return (-f - 1.0) / (f - 1.0); } +/* Simplified form of F_eta(eta, 1.0). */ float f0_from_ior(float eta) { float A = (eta - 1.0) / (eta + 1.0); @@ -47,30 +53,21 @@ float F_eta(float eta, float cos_theta) * the refracted direction */ float c = abs(cos_theta); float g = eta * eta - 1.0 + c * c; - float result; - if (g > 0.0) { g = sqrt(g); - vec2 g_c = vec2(g) + vec2(c, -c); - float A = g_c.y / g_c.x; - A *= A; - g_c *= c; - float B = (g_c.y - 1.0) / (g_c.x + 1.0); - B *= B; - result = 0.5 * A * (1.0 + B); + float A = (g - c) / (g + c); + float B = (c * (g + c) - 1.0) / (c * (g - c) + 1.0); + return 0.5 * A * A * (1.0 + B * B); } - else { - result = 1.0; /* TIR (no refracted component) */ - } - - return result; + /* Total internal reflections. */ + return 1.0; } /* Fresnel color blend base on fresnel factor */ vec3 F_color_blend(float eta, float fresnel, vec3 f0_color) { - float f0 = F_eta(eta, 1.0); - float fac = saturate((fresnel - f0) / max(1e-8, 1.0 - f0)); + float f0 = f0_from_ior(eta); + float fac = saturate((fresnel - f0) / (1.0 - f0)); return mix(f0_color, vec3(1.0), fac); } @@ -79,7 +76,7 @@ vec3 F_brdf_single_scatter(vec3 f0, vec3 f90, vec2 lut) { /* Unreal specular matching : if specular color is below 2% intensity, * treat as shadowning */ - return saturate(50.0 * dot(f0, vec3(0.3, 0.6, 0.1))) * lut.y * abs(f90) + lut.x * f0; + return lut.y * f90 + lut.x * f0; } /* Multi-scattering brdf approximation from : @@ -87,11 +84,7 @@ vec3 F_brdf_single_scatter(vec3 f0, vec3 f90, vec2 lut) * by Carmelo J. Fdez-Agüera. */ vec3 F_brdf_multi_scatter(vec3 f0, vec3 f90, vec2 lut) { - vec3 FssEss = F_brdf_single_scatter(f0, f90, lut); - /* Hack to avoid many more shader variations. */ - if (f90.g < 0.0) { - return FssEss; - } + vec3 FssEss = lut.y * f90 + lut.x * f0; float Ess = lut.x + lut.y; float Ems = 1.0 - Ess; @@ -102,8 +95,6 @@ vec3 F_brdf_multi_scatter(vec3 f0, vec3 f90, vec2 lut) return FssEss + Fms * Ems; } -#define F_brdf(f0, f90, lut) F_brdf_multi_scatter(f0, f90, lut) - /* GGX */ float D_ggx_opti(float NH, float a2) { @@ -144,7 +135,7 @@ void accumulate_light(vec3 light, float fac, inout vec4 accum) accum += vec4(light, 1.0) * min(fac, (1.0 - accum.a)); } -/* ----------- Cone Aperture Approximation --------- */ +/* ----------- Cone angle Approximation --------- */ /* Return a fitted cone angle given the input roughness */ float cone_cosine(float r) diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_lut_frag.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_lut_frag.glsl index 1e051994693..46ea8b747c8 100644 --- a/source/blender/draw/engines/eevee/shaders/bsdf_lut_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/bsdf_lut_frag.glsl @@ -1,48 +1,57 @@ +#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) #pragma BLENDER_REQUIRE(bsdf_sampling_lib.glsl) -out vec4 FragColor; +uniform float sampleCount; + +out vec2 FragColor; void main() { - vec3 N, T, B, V; + /* Make sure coordinates are covering the whole [0..1] range at texel center. */ + float y = floor(gl_FragCoord.y) / (LUT_SIZE - 1); + float x = floor(gl_FragCoord.x) / (LUT_SIZE - 1); - float NV = (1.0 - (clamp(gl_FragCoord.y / LUT_SIZE, 1e-4, 0.9999))); - float sqrtRoughness = clamp(gl_FragCoord.x / LUT_SIZE, 1e-4, 0.9999); - float a = sqrtRoughness * sqrtRoughness; - float a2 = a * a; + float NV = clamp(1.0 - y * y, 1e-4, 0.9999); + float a = x * x; + float a2 = clamp(a * a, 1e-4, 0.9999); - N = vec3(0.0, 0.0, 1.0); - T = vec3(1.0, 0.0, 0.0); - B = vec3(0.0, 1.0, 0.0); - V = vec3(sqrt(1.0 - NV * NV), 0.0, NV); - - setup_noise(); + vec3 V = vec3(sqrt(1.0 - NV * NV), 0.0, NV); /* Integrating BRDF */ float brdf_accum = 0.0; float fresnel_accum = 0.0; - for (float i = 0; i < sampleCount; i++) { - vec3 H = sample_ggx(i, a2, N, T, B); /* Microfacet normal */ - vec3 L = -reflect(V, H); - float NL = L.z; + for (float j = 0.0; j < sampleCount; j++) { + for (float i = 0.0; i < sampleCount; i++) { + vec3 Xi = (vec3(i, j, 0.0) + 0.5) / sampleCount; + Xi.yz = vec2(cos(Xi.y * M_2PI), sin(Xi.y * M_2PI)); - if (NL > 0.0) { - float NH = max(H.z, 0.0); - float VH = max(dot(V, H), 0.0); + vec3 H = sample_ggx(Xi, a2); /* Microfacet normal */ + vec3 L = -reflect(V, H); + float NL = L.z; - float G1_v = G1_Smith_GGX(NV, a2); - float G1_l = G1_Smith_GGX(NL, a2); - float G_smith = 4.0 * NV * NL / (G1_v * G1_l); /* See G1_Smith_GGX for explanations. */ + if (NL > 0.0) { + float NH = max(H.z, 0.0); + float VH = max(dot(V, H), 0.0); - float brdf = (G_smith * VH) / (NH * NV); - float Fc = pow(1.0 - VH, 5.0); + float G1_v = G1_Smith_GGX(NV, a2); + float G1_l = G1_Smith_GGX(NL, a2); + float G_smith = 4.0 * NV * NL / (G1_v * G1_l); /* See G1_Smith_GGX for explanations. */ - brdf_accum += (1.0 - Fc) * brdf; - fresnel_accum += Fc * brdf; + float brdf = (G_smith * VH) / (NH * NV); + + /* Follow maximum specular value for principled bsdf. */ + const float specular = 1.0; + const float eta = (2.0 / (1.0 - sqrt(0.08 * specular))) - 1.0; + float fresnel = F_eta(eta, VH); + float Fc = F_color_blend(eta, fresnel, vec3(0)).r; + + brdf_accum += (1.0 - Fc) * brdf; + fresnel_accum += Fc * brdf; + } } } - brdf_accum /= sampleCount; - fresnel_accum /= sampleCount; + brdf_accum /= sampleCount * sampleCount; + fresnel_accum /= sampleCount * sampleCount; - FragColor = vec4(brdf_accum, fresnel_accum, 0.0, 1.0); + FragColor = vec2(brdf_accum, fresnel_accum); } diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl index 066ea58e2bf..4abc313d7e3 100644 --- a/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl @@ -1,21 +1,7 @@ -#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) +#pragma BLENDER_REQUIRE(bsdf_common_lib.glsl) uniform sampler1D texHammersley; -uniform float sampleCount; -uniform float invSampleCount; - -vec2 jitternoise = vec2(0.0); - -#ifndef UTIL_TEX -# define UTIL_TEX - -#endif /* UTIL_TEX */ - -void setup_noise(void) -{ - jitternoise = texelfetch_noise_tex(gl_FragCoord.xy).rg; /* Global variable */ -} vec3 tangent_to_world(vec3 vector, vec3 N, vec3 T, vec3 B) { @@ -27,20 +13,11 @@ vec3 hammersley_3d(float i, float invsamplenbr) { vec3 Xi; /* Theta, cos(Phi), sin(Phi) */ - Xi.x = i * invsamplenbr; /* i/samples */ - Xi.x = fract(Xi.x + jitternoise.x); - - int u = int(mod(i + jitternoise.y * HAMMERSLEY_SIZE, HAMMERSLEY_SIZE)); - - Xi.yz = texelFetch(texHammersley, u, 0).rg; + Xi.x = i * invsamplenbr; + Xi.yz = texelFetch(texHammersley, int(i), 0).rg; return Xi; } - -vec3 hammersley_3d(float i) -{ - return hammersley_3d(i, invSampleCount); -} #endif /* -------------- BSDFS -------------- */ @@ -57,7 +34,7 @@ float pdf_hemisphere() vec3 sample_ggx(vec3 rand, float a2) { - /* Theta is the aperture angle of the cone */ + /* Theta is the cone angle. */ float z = sqrt((1.0 - rand.x) / (1.0 + a2 * rand.x - rand.x)); /* cos theta */ float r = sqrt(max(0.0, 1.0f - z * z)); /* sin theta */ float x = r * rand.y; @@ -75,16 +52,16 @@ vec3 sample_ggx(vec3 rand, float a2, vec3 N, vec3 T, vec3 B, out float NH) } #ifdef HAMMERSLEY_SIZE -vec3 sample_ggx(float nsample, float a2, vec3 N, vec3 T, vec3 B) +vec3 sample_ggx(float nsample, float inv_sample_count, float a2, vec3 N, vec3 T, vec3 B) { - vec3 Xi = hammersley_3d(nsample); + vec3 Xi = hammersley_3d(nsample, inv_sample_count); vec3 Ht = sample_ggx(Xi, a2); return tangent_to_world(Ht, N, T, B); } -vec3 sample_hemisphere(float nsample, vec3 N, vec3 T, vec3 B) +vec3 sample_hemisphere(float nsample, float inv_sample_count, vec3 N, vec3 T, vec3 B) { - vec3 Xi = hammersley_3d(nsample); + vec3 Xi = hammersley_3d(nsample, inv_sample_count); float z = Xi.x; /* cos theta */ float r = sqrt(max(0.0, 1.0f - z * z)); /* sin theta */ @@ -96,9 +73,9 @@ vec3 sample_hemisphere(float nsample, vec3 N, vec3 T, vec3 B) return tangent_to_world(Ht, N, T, B); } -vec3 sample_cone(float nsample, float angle, vec3 N, vec3 T, vec3 B) +vec3 sample_cone(float nsample, float inv_sample_count, float angle, vec3 N, vec3 T, vec3 B) { - vec3 Xi = hammersley_3d(nsample); + vec3 Xi = hammersley_3d(nsample, inv_sample_count); float z = cos(angle * Xi.x); /* cos theta */ float r = sqrt(max(0.0, 1.0f - z * z)); /* sin theta */ diff --git a/source/blender/draw/engines/eevee/shaders/btdf_lut_frag.glsl b/source/blender/draw/engines/eevee/shaders/btdf_lut_frag.glsl index d815d9d4e6b..2ffe23a9197 100644 --- a/source/blender/draw/engines/eevee/shaders/btdf_lut_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/btdf_lut_frag.glsl @@ -1,62 +1,89 @@ +#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) #pragma BLENDER_REQUIRE(bsdf_sampling_lib.glsl) -uniform float a2; +uniform float sampleCount; +uniform float z; out vec4 FragColor; void main() { - vec3 N, T, B, V; + float x = floor(gl_FragCoord.x) / (LUT_SIZE - 1.0); + float y = floor(gl_FragCoord.y) / (LUT_SIZE - 1.0); - float x = gl_FragCoord.x / LUT_SIZE; - float y = gl_FragCoord.y / LUT_SIZE; - /* There is little variation if ior > 1.0 so we - * maximize LUT precision for ior < 1.0 */ - x = x * 1.1; - float ior = (x > 1.0) ? ior_from_f0((x - 1.0) * 10.0) : sqrt(x); - float NV = (1.0 - (clamp(y, 1e-4, 0.9999))); + float ior = clamp(sqrt(x), 0.05, 0.999); + /* ior is sin of critical angle. */ + float critical_cos = sqrt(1.0 - saturate(ior * ior)); - N = vec3(0.0, 0.0, 1.0); - T = vec3(1.0, 0.0, 0.0); - B = vec3(0.0, 1.0, 0.0); - V = vec3(sqrt(1.0 - NV * NV), 0.0, NV); + y = y * 2.0 - 1.0; + /* Maximize texture usage on both sides of the critical angle. */ + y *= (y > 0.0) ? (1.0 - critical_cos) : critical_cos; + /* Center LUT around critical angle to avoid strange interpolation issues when the critical + * angle is changing. */ + y += critical_cos; + float NV = clamp(y, 1e-4, 0.9999); - setup_noise(); + float a = z * z; + float a2 = clamp(a * a, 1e-8, 0.9999); + + vec3 V = vec3(sqrt(1.0 - NV * NV), 0.0, NV); /* Integrating BTDF */ float btdf_accum = 0.0; - for (float i = 0.0; i < sampleCount; i++) { - vec3 H = sample_ggx(i, a2, N, T, B); /* Microfacet normal */ + float fresnel_accum = 0.0; + for (float j = 0.0; j < sampleCount; j++) { + for (float i = 0.0; i < sampleCount; i++) { + vec3 Xi = (vec3(i, j, 0.0) + 0.5) / sampleCount; + Xi.yz = vec2(cos(Xi.y * M_2PI), sin(Xi.y * M_2PI)); - float VH = dot(V, H); + /* Microfacet normal. */ + vec3 H = sample_ggx(Xi, a2); - /* Check if there is total internal reflections. */ - float c = abs(VH); - float g = ior * ior - 1.0 + c * c; + float VH = dot(V, H); - float eta = 1.0 / ior; - if (dot(H, V) < 0.0) { - H = -H; - eta = ior; - } + /* Check if there is total internal reflections. */ + float fresnel = F_eta(ior, VH); - vec3 L = refract(-V, H, eta); - float NL = -dot(N, L); + fresnel_accum += fresnel; - if ((NL > 0.0) && (g > 0.0)) { - float LH = dot(L, H); + float eta = 1.0 / ior; + if (dot(H, V) < 0.0) { + H = -H; + eta = ior; + } - float G1_l = NL * 2.0 / - G1_Smith_GGX(NL, a2); /* Balancing the adjustments made in G1_Smith */ + vec3 L = refract(-V, H, eta); + float NL = -L.z; - /* btdf = abs(VH*LH) * (ior*ior) * D * G(V) * G(L) / (Ht2 * NV) - * pdf = (VH * abs(LH)) * (ior*ior) * D * G(V) / (Ht2 * NV) */ - float btdf = G1_l * abs(VH * LH) / (VH * abs(LH)); + if ((NL > 0.0) && (fresnel < 0.999)) { + float LH = dot(L, H); - btdf_accum += btdf; + /* Balancing the adjustments made in G1_Smith. */ + float G1_l = NL * 2.0 / G1_Smith_GGX(NL, a2); + + /* btdf = abs(VH*LH) * (ior*ior) * D * G(V) * G(L) / (Ht2 * NV) + * pdf = (VH * abs(LH)) * (ior*ior) * D * G(V) / (Ht2 * NV) */ + float btdf = G1_l * abs(VH * LH) / (VH * abs(LH)); + + btdf_accum += btdf; + } } } - btdf_accum /= sampleCount; + btdf_accum /= sampleCount * sampleCount; + fresnel_accum /= sampleCount * sampleCount; - FragColor = vec4(btdf_accum, 0.0, 0.0, 1.0); + if (z == 0.0) { + /* Perfect mirror. Increased precision because the roughness is clamped. */ + fresnel_accum = F_eta(ior, NV); + } + + if (x == 0.0) { + /* Special case. */ + fresnel_accum = 1.0; + btdf_accum = 0.0; + } + + /* There is place to put multiscater result (which is a little bit different still) + * and / or lobe fitting for better sampling of */ + FragColor = vec4(btdf_accum, fresnel_accum, 0.0, 1.0); } diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_diffuse_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_diffuse_lib.glsl new file mode 100644 index 00000000000..c5996f5160a --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/closure_eval_diffuse_lib.glsl @@ -0,0 +1,87 @@ +#pragma BLENDER_REQUIRE(lights_lib.glsl) +#pragma BLENDER_REQUIRE(lightprobe_lib.glsl) +#pragma BLENDER_REQUIRE(ambient_occlusion_lib.glsl) + +struct ClosureInputDiffuse { + vec3 N; /** Shading normal. */ + vec3 albedo; /** Used for multibounce GTAO approximation. Not applied to final radiance. */ +}; + +#define CLOSURE_INPUT_Diffuse_DEFAULT ClosureInputDiffuse(vec3(0.0), vec3(0.0)) + +struct ClosureEvalDiffuse { + vec3 probe_sampling_dir; /** Direction to sample probes from. */ + float ambient_occlusion; /** Final occlusion for distant lighting. */ +}; + +/* Stubs. */ +#define ClosureOutputDiffuse ClosureOutput +#define closure_Diffuse_planar_eval(cl_in, cl_eval, cl_common, data, cl_out) +#define closure_Diffuse_cubemap_eval(cl_in, cl_eval, cl_common, data, cl_out) + +ClosureEvalDiffuse closure_Diffuse_eval_init(inout ClosureInputDiffuse cl_in, + ClosureEvalCommon cl_common, + out ClosureOutputDiffuse cl_out) +{ + cl_in.N = safe_normalize(cl_in.N); + cl_out.radiance = vec3(0.0); + + ClosureEvalDiffuse cl_eval; + cl_eval.ambient_occlusion = diffuse_occlusion(cl_common.occlusion_data, + cl_common.V, + cl_in.N, + cl_common.Ng, + cl_in.albedo, + cl_eval.probe_sampling_dir); + return cl_eval; +} + +void closure_Diffuse_light_eval(ClosureInputDiffuse cl_in, + ClosureEvalDiffuse cl_eval, + ClosureEvalCommon cl_common, + ClosureLightData light, + inout ClosureOutputDiffuse cl_out) +{ + float radiance = light_diffuse(light.data, cl_in.N, cl_common.V, light.L); + /* TODO(fclem) We could try to shadow lights that are shadowless with the ambient_occlusion + * factor here. */ + cl_out.radiance += light.data.l_color * (light.vis * light.contact_shadow * radiance); +} + +void closure_Diffuse_grid_eval(ClosureInputDiffuse cl_in, + ClosureEvalDiffuse cl_eval, + ClosureEvalCommon cl_common, + ClosureGridData grid, + inout ClosureOutputDiffuse cl_out) +{ + vec3 probe_radiance = probe_evaluate_grid( + grid.data, cl_common.P, cl_eval.probe_sampling_dir, grid.local_pos); + cl_out.radiance += grid.attenuation * probe_radiance; +} + +void closure_Diffuse_indirect_end(ClosureInputDiffuse cl_in, + ClosureEvalDiffuse cl_eval, + ClosureEvalCommon cl_common, + inout ClosureOutputDiffuse cl_out) +{ + /* If not enough light has been accumulated from probes, use the world specular cubemap + * to fill the remaining energy needed. */ + if (cl_common.diffuse_accum > 0.0) { + vec3 probe_radiance = probe_evaluate_world_diff(cl_eval.probe_sampling_dir); + cl_out.radiance += cl_common.diffuse_accum * probe_radiance; + } + /* Apply occlusion on radiance before the light loop. */ + cl_out.radiance *= cl_eval.ambient_occlusion; +} + +void closure_Diffuse_eval_end(ClosureInputDiffuse cl_in, + ClosureEvalDiffuse cl_eval, + ClosureEvalCommon cl_common, + inout ClosureOutputDiffuse cl_out) +{ +#if defined(DEPTH_SHADER) || defined(WORLD_BACKGROUND) + /* This makes shader resources become unused and avoid issues with samplers. (see T59747) */ + cl_out.radiance = vec3(0.0); + return; +#endif +} diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl new file mode 100644 index 00000000000..5c10a7f451f --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl @@ -0,0 +1,140 @@ + +#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) +#pragma BLENDER_REQUIRE(lights_lib.glsl) +#pragma BLENDER_REQUIRE(lightprobe_lib.glsl) +#pragma BLENDER_REQUIRE(ambient_occlusion_lib.glsl) + +struct ClosureInputGlossy { + vec3 N; /** Shading normal. */ + float roughness; /** Input roughness, not squared. */ +}; + +#define CLOSURE_INPUT_Glossy_DEFAULT ClosureInputGlossy(vec3(0.0), 0.0) + +struct ClosureEvalGlossy { + vec4 ltc_mat; /** LTC matrix values. */ + float ltc_brdf_scale; /** LTC BRDF scaling. */ + vec3 probe_sampling_dir; /** Direction to sample probes from. */ + float spec_occlusion; /** Specular Occlusion. */ + vec3 raytrace_radiance; /** Raytrace reflection to be accumulated after occlusion. */ +}; + +/* Stubs. */ +#define ClosureOutputGlossy ClosureOutput +#define closure_Glossy_grid_eval(cl_in, cl_eval, cl_common, data, cl_out) + +#ifdef STEP_RESOLVE /* SSR */ +/* Prototype. */ +void raytrace_resolve(ClosureInputGlossy cl_in, + inout ClosureEvalGlossy cl_eval, + inout ClosureEvalCommon cl_common, + inout ClosureOutputGlossy cl_out); +#endif + +ClosureEvalGlossy closure_Glossy_eval_init(inout ClosureInputGlossy cl_in, + inout ClosureEvalCommon cl_common, + out ClosureOutputGlossy cl_out) +{ + cl_in.N = safe_normalize(cl_in.N); + cl_in.roughness = clamp(cl_in.roughness, 1e-8, 0.9999); + cl_out.radiance = vec3(0.0); + + float NV = dot(cl_in.N, cl_common.V); + vec2 lut_uv = lut_coords(NV, cl_in.roughness); + + ClosureEvalGlossy cl_eval; + cl_eval.ltc_mat = texture(utilTex, vec3(lut_uv, LTC_MAT_LAYER)); + cl_eval.probe_sampling_dir = specular_dominant_dir(cl_in.N, cl_common.V, sqr(cl_in.roughness)); + cl_eval.spec_occlusion = specular_occlusion(cl_common.occlusion_data, + cl_common.V, + cl_common.N, + cl_in.roughness, + cl_eval.probe_sampling_dir); + cl_eval.raytrace_radiance = vec3(0.0); + +#ifdef STEP_RESOLVE /* SSR */ + raytrace_resolve(cl_in, cl_eval, cl_common, cl_out); +#endif + + /* The brdf split sum LUT is applied after the radiance accumulation. + * Correct the LTC so that its energy is constant. */ + /* TODO(fclem) Optimize this so that only one scale factor is stored. */ + vec4 ltc_brdf = texture(utilTex, vec3(lut_uv, LTC_BRDF_LAYER)).barg; + vec2 split_sum_brdf = ltc_brdf.zw; + cl_eval.ltc_brdf_scale = (ltc_brdf.x + ltc_brdf.y) / (split_sum_brdf.x + split_sum_brdf.y); + return cl_eval; +} + +void closure_Glossy_light_eval(ClosureInputGlossy cl_in, + ClosureEvalGlossy cl_eval, + ClosureEvalCommon cl_common, + ClosureLightData light, + inout ClosureOutputGlossy cl_out) +{ + float radiance = light_specular(light.data, cl_eval.ltc_mat, cl_in.N, cl_common.V, light.L); + radiance *= cl_eval.ltc_brdf_scale; + cl_out.radiance += light.data.l_color * + (light.data.l_spec * light.vis * light.contact_shadow * radiance); +} + +void closure_Glossy_planar_eval(ClosureInputGlossy cl_in, + ClosureEvalGlossy cl_eval, + inout ClosureEvalCommon cl_common, + ClosurePlanarData planar, + inout ClosureOutputGlossy cl_out) +{ +#ifndef STEP_RESOLVE /* SSR already evaluates planar reflections. */ + float attenuation = planar.attenuation * probe_attenuation_planar_normal_roughness( + planar.data, cl_in.N, cl_in.roughness); + + vec3 probe_radiance = probe_evaluate_planar( + planar.id, planar.data, cl_common.P, cl_in.N, cl_common.V, cl_in.roughness); + + cl_out.radiance = mix(cl_out.radiance, probe_radiance, attenuation); +#endif +} + +void closure_Glossy_cubemap_eval(ClosureInputGlossy cl_in, + ClosureEvalGlossy cl_eval, + ClosureEvalCommon cl_common, + ClosureCubemapData cube, + inout ClosureOutputGlossy cl_out) +{ + vec3 probe_radiance = probe_evaluate_cube( + cube.id, cl_common.P, cl_eval.probe_sampling_dir, cl_in.roughness); + cl_out.radiance += cube.attenuation * probe_radiance; +} + +void closure_Glossy_indirect_end(ClosureInputGlossy cl_in, + ClosureEvalGlossy cl_eval, + ClosureEvalCommon cl_common, + inout ClosureOutputGlossy cl_out) +{ + /* If not enough light has been accumulated from probes, use the world specular cubemap + * to fill the remaining energy needed. */ + if (specToggle && cl_common.specular_accum > 0.0) { + vec3 probe_radiance = probe_evaluate_world_spec(cl_eval.probe_sampling_dir, cl_in.roughness); + cl_out.radiance += cl_common.specular_accum * probe_radiance; + } + + /* Apply occlusion on distant lighting. */ + cl_out.radiance *= cl_eval.spec_occlusion; + /* Apply Raytrace reflections after occlusion since they are direct, local reflections. */ + cl_out.radiance += cl_eval.raytrace_radiance; +} + +void closure_Glossy_eval_end(ClosureInputGlossy cl_in, + ClosureEvalGlossy cl_eval, + ClosureEvalCommon cl_common, + inout ClosureOutputGlossy cl_out) +{ +#if defined(DEPTH_SHADER) || defined(WORLD_BACKGROUND) + /* This makes shader resources become unused and avoid issues with samplers. (see T59747) */ + cl_out.radiance = vec3(0.0); + return; +#endif + + if (!specToggle) { + cl_out.radiance = vec3(0.0); + } +} diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl new file mode 100644 index 00000000000..93492762bbe --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl @@ -0,0 +1,324 @@ + +#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) +#pragma BLENDER_REQUIRE(lights_lib.glsl) +#pragma BLENDER_REQUIRE(lightprobe_lib.glsl) + +/** + * Extensive use of Macros to be able to change the maximum amount of evaluated closure easily. + * NOTE: GLSL does not support variadic macros. + * + * Example + * // Declare the cl_eval function + * CLOSURE_EVAL_FUNCTION_DECLARE_3(name, Diffuse, Glossy, Refraction); + * // Declare the inputs & outputs + * CLOSURE_VARS_DECLARE(Diffuse, Glossy, Refraction); + * // Specify inputs + * in_Diffuse_0.N = N; + * ... + * // Call the cl_eval function + * CLOSURE_EVAL_FUNCTION_3(name, Diffuse, Glossy, Refraction); + * // Get the cl_out + * closure.radiance = out_Diffuse_0.radiance + out_Glossy_1.radiance + out_Refraction_2.radiance; + **/ + +#define CLOSURE_VARS_DECLARE(t0, t1, t2, t3) \ + ClosureInputCommon in_common = CLOSURE_INPUT_COMMON_DEFAULT; \ + ClosureInput##t0 in_##t0##_0 = CLOSURE_INPUT_##t0##_DEFAULT; \ + ClosureInput##t1 in_##t1##_1 = CLOSURE_INPUT_##t1##_DEFAULT; \ + ClosureInput##t2 in_##t2##_2 = CLOSURE_INPUT_##t2##_DEFAULT; \ + ClosureInput##t3 in_##t3##_3 = CLOSURE_INPUT_##t3##_DEFAULT; \ + ClosureOutput##t0 out_##t0##_0; \ + ClosureOutput##t1 out_##t1##_1; \ + ClosureOutput##t2 out_##t2##_2; \ + ClosureOutput##t3 out_##t3##_3; + +#define CLOSURE_EVAL_DECLARE(t0, t1, t2, t3) \ + ClosureEvalCommon cl_common = closure_Common_eval_init(in_common); \ + ClosureEval##t0 eval_##t0##_0 = closure_##t0##_eval_init(in_##t0##_0, cl_common, out_##t0##_0); \ + ClosureEval##t1 eval_##t1##_1 = closure_##t1##_eval_init(in_##t1##_1, cl_common, out_##t1##_1); \ + ClosureEval##t2 eval_##t2##_2 = closure_##t2##_eval_init(in_##t2##_2, cl_common, out_##t2##_2); \ + ClosureEval##t3 eval_##t3##_3 = closure_##t3##_eval_init(in_##t3##_3, cl_common, out_##t3##_3); + +#define CLOSURE_META_SUBROUTINE(subroutine, t0, t1, t2, t3) \ + closure_##t0##_##subroutine(in_##t0##_0, eval_##t0##_0, cl_common, out_##t0##_0); \ + closure_##t1##_##subroutine(in_##t1##_1, eval_##t1##_1, cl_common, out_##t1##_1); \ + closure_##t2##_##subroutine(in_##t2##_2, eval_##t2##_2, cl_common, out_##t2##_2); \ + closure_##t3##_##subroutine(in_##t3##_3, eval_##t3##_3, cl_common, out_##t3##_3); + +#define CLOSURE_META_SUBROUTINE_DATA(subroutine, sub_data, t0, t1, t2, t3) \ + closure_##t0##_##subroutine(in_##t0##_0, eval_##t0##_0, cl_common, sub_data, out_##t0##_0); \ + closure_##t1##_##subroutine(in_##t1##_1, eval_##t1##_1, cl_common, sub_data, out_##t1##_1); \ + closure_##t2##_##subroutine(in_##t2##_2, eval_##t2##_2, cl_common, sub_data, out_##t2##_2); \ + closure_##t3##_##subroutine(in_##t3##_3, eval_##t3##_3, cl_common, sub_data, out_##t3##_3); + +/* Inputs are inout so that callers can get the final inputs used for evaluation. */ +#define CLOSURE_EVAL_FUNCTION_DECLARE(name, t0, t1, t2, t3) \ + void closure_##name##_eval(ClosureInputCommon in_common, \ + inout ClosureInput##t0 in_##t0##_0, \ + inout ClosureInput##t1 in_##t1##_1, \ + inout ClosureInput##t2 in_##t2##_2, \ + inout ClosureInput##t3 in_##t3##_3, \ + out ClosureOutput##t0 out_##t0##_0, \ + out ClosureOutput##t1 out_##t1##_1, \ + out ClosureOutput##t2 out_##t2##_2, \ + out ClosureOutput##t3 out_##t3##_3) \ + { \ + CLOSURE_EVAL_DECLARE(t0, t1, t2, t3); \ +\ + /* Starts at 1 because 0 is world cubemap. */ \ + for (int i = 1; cl_common.specular_accum > 0.0 && i < prbNumRenderCube && i < MAX_PROBE; \ + i++) { \ + ClosureCubemapData cube = closure_cubemap_eval_init(i, cl_common); \ + if (cube.attenuation > 1e-8) { \ + CLOSURE_META_SUBROUTINE_DATA(cubemap_eval, cube, t0, t1, t2, t3); \ + } \ + } \ +\ + /* Starts at 1 because 0 is world irradiance. */ \ + for (int i = 1; cl_common.diffuse_accum > 0.0 && i < prbNumRenderGrid && i < MAX_GRID; i++) { \ + ClosureGridData grid = closure_grid_eval_init(i, cl_common); \ + if (grid.attenuation > 1e-8) { \ + CLOSURE_META_SUBROUTINE_DATA(grid_eval, grid, t0, t1, t2, t3); \ + } \ + } \ +\ + CLOSURE_META_SUBROUTINE(indirect_end, t0, t1, t2, t3); \ +\ + ClosurePlanarData planar = closure_planar_eval_init(cl_common); \ + if (planar.attenuation > 1e-8) { \ + CLOSURE_META_SUBROUTINE_DATA(planar_eval, planar, t0, t1, t2, t3); \ + } \ +\ + for (int i = 0; i < laNumLight && i < MAX_LIGHT; i++) { \ + ClosureLightData light = closure_light_eval_init(cl_common, i); \ + if (light.vis > 1e-8) { \ + CLOSURE_META_SUBROUTINE_DATA(light_eval, light, t0, t1, t2, t3); \ + } \ + } \ +\ + CLOSURE_META_SUBROUTINE(eval_end, t0, t1, t2, t3); \ + } + +#define CLOSURE_EVAL_FUNCTION(name, t0, t1, t2, t3) \ + closure_##name##_eval(in_common, \ + in_##t0##_0, \ + in_##t1##_1, \ + in_##t2##_2, \ + in_##t3##_3, \ + out_##t0##_0, \ + out_##t1##_1, \ + out_##t2##_2, \ + out_##t3##_3) + +#define CLOSURE_EVAL_FUNCTION_DECLARE_1(name, t0) \ + CLOSURE_EVAL_FUNCTION_DECLARE(name, t0, Dummy, Dummy, Dummy) +#define CLOSURE_EVAL_FUNCTION_DECLARE_2(name, t0, t1) \ + CLOSURE_EVAL_FUNCTION_DECLARE(name, t0, t1, Dummy, Dummy) +#define CLOSURE_EVAL_FUNCTION_DECLARE_3(name, t0, t1, t2) \ + CLOSURE_EVAL_FUNCTION_DECLARE(name, t0, t1, t2, Dummy) +#define CLOSURE_EVAL_FUNCTION_DECLARE_4(name, t0, t1, t2, t3) \ + CLOSURE_EVAL_FUNCTION_DECLARE(name, t0, t1, t2, t3) + +#define CLOSURE_VARS_DECLARE_1(t0) CLOSURE_VARS_DECLARE(t0, Dummy, Dummy, Dummy) +#define CLOSURE_VARS_DECLARE_2(t0, t1) CLOSURE_VARS_DECLARE(t0, t1, Dummy, Dummy) +#define CLOSURE_VARS_DECLARE_3(t0, t1, t2) CLOSURE_VARS_DECLARE(t0, t1, t2, Dummy) +#define CLOSURE_VARS_DECLARE_4(t0, t1, t2, t3) CLOSURE_VARS_DECLARE(t0, t1, t2, t3) + +#define CLOSURE_EVAL_FUNCTION_1(name, t0) CLOSURE_EVAL_FUNCTION(name, t0, Dummy, Dummy, Dummy) +#define CLOSURE_EVAL_FUNCTION_2(name, t0, t1) CLOSURE_EVAL_FUNCTION(name, t0, t1, Dummy, Dummy) +#define CLOSURE_EVAL_FUNCTION_3(name, t0, t1, t2) CLOSURE_EVAL_FUNCTION(name, t0, t1, t2, Dummy) +#define CLOSURE_EVAL_FUNCTION_4(name, t0, t1, t2, t3) CLOSURE_EVAL_FUNCTION(name, t0, t1, t2, t3) + +/* -------------------------------------------------------------------- */ +/** \name Dummy Closure + * + * Dummy closure type that will be optimized out by the compiler. + * \{ */ + +#define ClosureInputDummy ClosureOutput +#define ClosureOutputDummy ClosureOutput +#define ClosureEvalDummy ClosureOutput +#define CLOSURE_EVAL_DUMMY ClosureOutput(vec3(0)) +#define CLOSURE_INPUT_Dummy_DEFAULT CLOSURE_EVAL_DUMMY +#define closure_Dummy_eval_init(cl_in, cl_common, cl_out) CLOSURE_EVAL_DUMMY +#define closure_Dummy_planar_eval(cl_in, cl_eval, cl_common, data, cl_out) +#define closure_Dummy_cubemap_eval(cl_in, cl_eval, cl_common, data, cl_out) +#define closure_Dummy_grid_eval(cl_in, cl_eval, cl_common, data, cl_out) +#define closure_Dummy_indirect_end(cl_in, cl_eval, cl_common, cl_out) +#define closure_Dummy_light_eval(cl_in, cl_eval, cl_common, data, cl_out) +#define closure_Dummy_eval_end(cl_in, cl_eval, cl_common, cl_out) + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Common cl_eval data + * + * Eval data not dependant on input parameters. All might not be used but unused ones + * will be optimized out. + * \{ */ + +struct ClosureInputCommon { + /** Custom occlusion value set by the user. */ + float occlusion; +}; + +#define CLOSURE_INPUT_COMMON_DEFAULT ClosureInputCommon(1.0) + +struct ClosureEvalCommon { + /** Result of SSAO. */ + OcclusionData occlusion_data; + /** View vector. */ + vec3 V; + /** Surface position. */ + vec3 P; + /** Normal vector, always facing camera. */ + vec3 N; + /** Normal vector, always facing camera. (viewspace) */ + vec3 vN; + /** Surface position. (viewspace) */ + vec3 vP; + /** Geometric normal, always facing camera. */ + vec3 Ng; + /** Geometric normal, always facing camera. (viewspace) */ + vec3 vNg; + /** Random numbers. 3 random sequences. zw is a random point on a circle. */ + vec4 rand; + /** Specular probe accumulator. Shared between planar and cubemap probe. */ + float specular_accum; + /** Diffuse probe accumulator. */ + float diffuse_accum; + /** Viewspace depth to start raytracing from. */ + float tracing_depth; +}; + +/* Common cl_out struct used by most closures. */ +struct ClosureOutput { + vec3 radiance; +}; + +/* Workaround for screenspace shadows in SSR pass. */ +float FragDepth; + +ClosureEvalCommon closure_Common_eval_init(ClosureInputCommon cl_in) +{ + ClosureEvalCommon cl_eval; + cl_eval.rand = texelfetch_noise_tex(gl_FragCoord.xy); + cl_eval.V = cameraVec(worldPosition); + cl_eval.P = worldPosition; + cl_eval.N = safe_normalize(gl_FrontFacing ? worldNormal : -worldNormal); + cl_eval.vN = safe_normalize(gl_FrontFacing ? viewNormal : -viewNormal); + cl_eval.vP = viewPosition; + cl_eval.Ng = safe_normalize(cross(dFdx(cl_eval.P), dFdy(cl_eval.P))); + cl_eval.vNg = transform_direction(ViewMatrix, cl_eval.Ng); + /* TODO(fclem) See if we can avoid this complicated setup. */ +#ifdef STEP_RESOLVE /* SSR */ + cl_eval.tracing_depth = FragDepth; +#else + cl_eval.tracing_depth = gl_FragCoord.z; +#endif + /* Constant bias (due to depth buffer precision) */ + /* Magic numbers for 24bits of precision. + * From http://terathon.com/gdc07_lengyel.pdf (slide 26) */ + cl_eval.tracing_depth -= mix(2.4e-7, 4.8e-7, cl_eval.tracing_depth); + /* Convert to view Z. */ + cl_eval.tracing_depth = get_view_z_from_depth(cl_eval.tracing_depth); + + cl_eval.occlusion_data = occlusion_load(cl_eval.vP, cl_in.occlusion); + + cl_eval.specular_accum = 1.0; + cl_eval.diffuse_accum = 1.0; + return cl_eval; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Loop data + * + * Loop datas are conveniently packed into struct to make it future proof. + * \{ */ + +struct ClosureLightData { + LightData data; /** Light Data. */ + vec4 L; /** Non-Normalized Light Vector (surface to light) with length in W component. */ + float vis; /** Light visibility. */ + float contact_shadow; /** Result of contact shadow tracing. */ +}; + +ClosureLightData closure_light_eval_init(ClosureEvalCommon cl_common, int light_id) +{ + ClosureLightData light; + light.data = lights_data[light_id]; + + light.L.xyz = light.data.l_position - cl_common.P; + light.L.w = length(light.L.xyz); + + light.vis = light_visibility(light.data, cl_common.P, light.L); + light.contact_shadow = light_contact_shadows(light.data, + cl_common.P, + cl_common.vP, + cl_common.tracing_depth, + cl_common.vNg, + cl_common.rand.x, + light.vis); + + return light; +} + +struct ClosureCubemapData { + int id; /** Probe id. */ + float attenuation; /** Attenuation. */ +}; + +ClosureCubemapData closure_cubemap_eval_init(int cube_id, inout ClosureEvalCommon cl_common) +{ + ClosureCubemapData cube; + cube.id = cube_id; + cube.attenuation = probe_attenuation_cube(cube_id, cl_common.P); + cube.attenuation = min(cube.attenuation, cl_common.specular_accum); + cl_common.specular_accum -= cube.attenuation; + return cube; +} + +struct ClosurePlanarData { + int id; /** Probe id. */ + PlanarData data; /** planars_data[id]. */ + float attenuation; /** Attenuation. */ +}; + +ClosurePlanarData closure_planar_eval_init(inout ClosureEvalCommon cl_common) +{ + ClosurePlanarData planar; + planar.attenuation = 0.0; + + /* Find planar with the maximum weight. TODO(fclem) */ + for (int i = 0; i < prbNumPlanar && i < MAX_PLANAR; i++) { + float attenuation = probe_attenuation_planar(planars_data[i], cl_common.P); + if (attenuation > planar.attenuation) { + planar.id = i; + planar.attenuation = attenuation; + planar.data = planars_data[i]; + } + } + return planar; +} + +struct ClosureGridData { + int id; /** Grid id. */ + GridData data; /** grids_data[id] */ + float attenuation; /** Attenuation. */ + vec3 local_pos; /** Local position inside the grid. */ +}; + +ClosureGridData closure_grid_eval_init(int id, inout ClosureEvalCommon cl_common) +{ + ClosureGridData grid; + grid.id = id; + grid.data = grids_data[id]; + grid.attenuation = probe_attenuation_grid(grid.data, cl_common.P, grid.local_pos); + grid.attenuation = min(grid.attenuation, cl_common.diffuse_accum); + cl_common.diffuse_accum -= grid.attenuation; + return grid; +} + +/** \} */ diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_refraction_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_refraction_lib.glsl new file mode 100644 index 00000000000..9011eea07c4 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/closure_eval_refraction_lib.glsl @@ -0,0 +1,128 @@ + +#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) +#pragma BLENDER_REQUIRE(lights_lib.glsl) +#pragma BLENDER_REQUIRE(lightprobe_lib.glsl) +#pragma BLENDER_REQUIRE(ambient_occlusion_lib.glsl) +#pragma BLENDER_REQUIRE(ssr_lib.glsl) + +struct ClosureInputRefraction { + vec3 N; /** Shading normal. */ + float roughness; /** Input roughness, not squared. */ + float ior; /** Index of refraction ratio. */ +}; + +#define CLOSURE_INPUT_Refraction_DEFAULT ClosureInputRefraction(vec3(0.0), 0.0, 0.0) + +struct ClosureEvalRefraction { + vec3 P; /** LTC matrix values. */ + vec3 ltc_brdf; /** LTC BRDF values. */ + vec3 probe_sampling_dir; /** Direction to sample probes from. */ + float probes_weight; /** Factor to apply to probe radiance. */ +}; + +/* Stubs. */ +#define ClosureOutputRefraction ClosureOutput +#define closure_Refraction_grid_eval(cl_in, cl_eval, cl_common, data, cl_out) + +ClosureEvalRefraction closure_Refraction_eval_init(inout ClosureInputRefraction cl_in, + ClosureEvalCommon cl_common, + out ClosureOutputRefraction cl_out) +{ + cl_in.N = safe_normalize(cl_in.N); + cl_in.roughness = clamp(cl_in.roughness, 1e-8, 0.9999); + cl_in.ior = max(cl_in.ior, 1e-5); + cl_out.radiance = vec3(0.0); + + ClosureEvalRefraction cl_eval; + vec3 cl_V; + float eval_ior; + /* Refract the view vector using the depth heuristic. + * Then later Refract a second time the already refracted + * ray using the inverse ior. */ + if (refractionDepth > 0.0) { + eval_ior = 1.0 / cl_in.ior; + cl_V = -refract(-cl_common.V, cl_in.N, eval_ior); + vec3 plane_pos = cl_common.P - cl_in.N * refractionDepth; + cl_eval.P = line_plane_intersect(cl_common.P, cl_V, plane_pos, cl_in.N); + } + else { + eval_ior = cl_in.ior; + cl_V = cl_common.V; + cl_eval.P = cl_common.P; + } + + cl_eval.probe_sampling_dir = refraction_dominant_dir(cl_in.N, cl_V, cl_in.roughness, eval_ior); + cl_eval.probes_weight = 1.0; + +#ifdef USE_REFRACTION + if (ssrefractToggle && cl_in.roughness < ssrMaxRoughness + 0.2) { + /* Find approximated position of the 2nd refraction event. */ + vec3 vP = (refractionDepth > 0.0) ? transform_point(ViewMatrix, cl_eval.P) : cl_common.vP; + vec4 ssr_output = screen_space_refraction( + vP, cl_in.N, cl_V, eval_ior, sqr(cl_in.roughness), cl_common.rand); + ssr_output.a *= smoothstep(ssrMaxRoughness + 0.2, ssrMaxRoughness, cl_in.roughness); + cl_out.radiance += ssr_output.rgb * ssr_output.a; + cl_eval.probes_weight -= ssr_output.a; + } +#endif + return cl_eval; +} + +void closure_Refraction_light_eval(ClosureInputRefraction cl_in, + ClosureEvalRefraction cl_eval, + ClosureEvalCommon cl_common, + ClosureLightData light, + inout ClosureOutputRefraction cl_out) +{ + /* Not implemented yet. */ +} + +void closure_Refraction_planar_eval(ClosureInputRefraction cl_in, + ClosureEvalRefraction cl_eval, + ClosureEvalCommon cl_common, + ClosurePlanarData planar, + inout ClosureOutputRefraction cl_out) +{ + /* Not implemented yet. */ +} + +void closure_Refraction_cubemap_eval(ClosureInputRefraction cl_in, + ClosureEvalRefraction cl_eval, + ClosureEvalCommon cl_common, + ClosureCubemapData cube, + inout ClosureOutputRefraction cl_out) +{ + vec3 probe_radiance = probe_evaluate_cube( + cube.id, cl_eval.P, cl_eval.probe_sampling_dir, sqr(cl_in.roughness)); + cl_out.radiance += (cube.attenuation * cl_eval.probes_weight) * probe_radiance; +} + +void closure_Refraction_indirect_end(ClosureInputRefraction cl_in, + ClosureEvalRefraction cl_eval, + ClosureEvalCommon cl_common, + inout ClosureOutputRefraction cl_out) +{ + /* If not enough light has been accumulated from probes, use the world specular cubemap + * to fill the remaining energy needed. */ + if (specToggle && cl_common.specular_accum > 0.0) { + vec3 probe_radiance = probe_evaluate_world_spec(cl_eval.probe_sampling_dir, + sqr(cl_in.roughness)); + cl_out.radiance += (cl_common.specular_accum * cl_eval.probes_weight) * probe_radiance; + } +} + +void closure_Refraction_eval_end(ClosureInputRefraction cl_in, + ClosureEvalRefraction cl_eval, + ClosureEvalCommon cl_common, + inout ClosureOutputRefraction cl_out) +{ +#if defined(DEPTH_SHADER) || defined(WORLD_BACKGROUND) + /* This makes shader resources become unused and avoid issues with samplers. (see T59747) */ + cl_out.radiance = vec3(0.0); + return; +#endif + + if (!specToggle) { + cl_out.radiance = vec3(0.0); + } +} diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_translucent_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_translucent_lib.glsl new file mode 100644 index 00000000000..66c467af29b --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/closure_eval_translucent_lib.glsl @@ -0,0 +1,71 @@ + +#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) +#pragma BLENDER_REQUIRE(lights_lib.glsl) +#pragma BLENDER_REQUIRE(lightprobe_lib.glsl) +#pragma BLENDER_REQUIRE(ambient_occlusion_lib.glsl) + +struct ClosureInputTranslucent { + vec3 N; /** Shading normal. */ +}; + +#define CLOSURE_INPUT_Translucent_DEFAULT ClosureInputTranslucent(vec3(0.0)) + +/* Stubs. */ +#define ClosureEvalTranslucent ClosureEvalDummy +#define ClosureOutputTranslucent ClosureOutput +#define closure_Translucent_planar_eval(cl_in, cl_eval, cl_common, data, cl_out) +#define closure_Translucent_cubemap_eval(cl_in, cl_eval, cl_common, data, cl_out) + +ClosureEvalTranslucent closure_Translucent_eval_init(inout ClosureInputTranslucent cl_in, + ClosureEvalCommon cl_common, + out ClosureOutputTranslucent cl_out) +{ + cl_in.N = safe_normalize(cl_in.N); + cl_out.radiance = vec3(0.0); + return CLOSURE_EVAL_DUMMY; +} + +void closure_Translucent_light_eval(ClosureInputTranslucent cl_in, + ClosureEvalTranslucent cl_eval, + ClosureEvalCommon cl_common, + ClosureLightData light, + inout ClosureOutputTranslucent cl_out) +{ + float radiance = light_diffuse(light.data, cl_in.N, cl_common.V, light.L); + cl_out.radiance += light.data.l_color * (light.vis * radiance); +} + +void closure_Translucent_grid_eval(ClosureInputTranslucent cl_in, + ClosureEvalTranslucent cl_eval, + ClosureEvalCommon cl_common, + ClosureGridData grid, + inout ClosureOutputTranslucent cl_out) +{ + vec3 probe_radiance = probe_evaluate_grid(grid.data, cl_common.P, cl_in.N, grid.local_pos); + cl_out.radiance += grid.attenuation * probe_radiance; +} + +void closure_Translucent_indirect_end(ClosureInputTranslucent cl_in, + ClosureEvalTranslucent cl_eval, + ClosureEvalCommon cl_common, + inout ClosureOutputTranslucent cl_out) +{ + /* If not enough light has been accumulated from probes, use the world specular cubemap + * to fill the remaining energy needed. */ + if (cl_common.diffuse_accum > 0.0) { + vec3 probe_radiance = probe_evaluate_world_diff(cl_in.N); + cl_out.radiance += cl_common.diffuse_accum * probe_radiance; + } +} + +void closure_Translucent_eval_end(ClosureInputTranslucent cl_in, + ClosureEvalTranslucent cl_eval, + ClosureEvalCommon cl_common, + inout ClosureOutputTranslucent cl_out) +{ +#if defined(DEPTH_SHADER) || defined(WORLD_BACKGROUND) + /* This makes shader resources become unused and avoid issues with samplers. (see T59747) */ + cl_out.radiance = vec3(0.0); + return; +#endif +} diff --git a/source/blender/draw/engines/eevee/shaders/closure_lit_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_lit_lib.glsl deleted file mode 100644 index 30ce60f3ec0..00000000000 --- a/source/blender/draw/engines/eevee/shaders/closure_lit_lib.glsl +++ /dev/null @@ -1,545 +0,0 @@ - -#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) -#pragma BLENDER_REQUIRE(lightprobe_lib.glsl) -#pragma BLENDER_REQUIRE(ambient_occlusion_lib.glsl) -#pragma BLENDER_REQUIRE(ssr_lib.glsl) - -/** - * AUTO CONFIG - * We include the file multiple times each time with a different configuration. - * This leads to a lot of deadcode. Better idea would be to only generate the one needed. - */ -#if !defined(SURFACE_DEFAULT) -# define SURFACE_DEFAULT -# define CLOSURE_NAME eevee_closure_default -# define CLOSURE_DIFFUSE -# define CLOSURE_GLOSSY -#endif /* SURFACE_DEFAULT */ - -#if !defined(SURFACE_DEFAULT_CLEARCOAT) && !defined(CLOSURE_NAME) -# define SURFACE_DEFAULT_CLEARCOAT -# define CLOSURE_NAME eevee_closure_default_clearcoat -# define CLOSURE_DIFFUSE -# define CLOSURE_GLOSSY -# define CLOSURE_CLEARCOAT -#endif /* SURFACE_DEFAULT_CLEARCOAT */ - -#if !defined(SURFACE_PRINCIPLED) && !defined(CLOSURE_NAME) -# define SURFACE_PRINCIPLED -# define CLOSURE_NAME eevee_closure_principled -# define CLOSURE_DIFFUSE -# define CLOSURE_GLOSSY -# define CLOSURE_CLEARCOAT -# define CLOSURE_REFRACTION -# define CLOSURE_SUBSURFACE -#endif /* SURFACE_PRINCIPLED */ - -#if !defined(SURFACE_CLEARCOAT) && !defined(CLOSURE_NAME) -# define SURFACE_CLEARCOAT -# define CLOSURE_NAME eevee_closure_clearcoat -# define CLOSURE_GLOSSY -# define CLOSURE_CLEARCOAT -#endif /* SURFACE_CLEARCOAT */ - -#if !defined(SURFACE_DIFFUSE) && !defined(CLOSURE_NAME) -# define SURFACE_DIFFUSE -# define CLOSURE_NAME eevee_closure_diffuse -# define CLOSURE_DIFFUSE -#endif /* SURFACE_DIFFUSE */ - -#if !defined(SURFACE_SUBSURFACE) && !defined(CLOSURE_NAME) -# define SURFACE_SUBSURFACE -# define CLOSURE_NAME eevee_closure_subsurface -# define CLOSURE_DIFFUSE -# define CLOSURE_SUBSURFACE -#endif /* SURFACE_SUBSURFACE */ - -#if !defined(SURFACE_SKIN) && !defined(CLOSURE_NAME) -# define SURFACE_SKIN -# define CLOSURE_NAME eevee_closure_skin -# define CLOSURE_DIFFUSE -# define CLOSURE_SUBSURFACE -# define CLOSURE_GLOSSY -#endif /* SURFACE_SKIN */ - -#if !defined(SURFACE_GLOSSY) && !defined(CLOSURE_NAME) -# define SURFACE_GLOSSY -# define CLOSURE_NAME eevee_closure_glossy -# define CLOSURE_GLOSSY -#endif /* SURFACE_GLOSSY */ - -#if !defined(SURFACE_REFRACT) && !defined(CLOSURE_NAME) -# define SURFACE_REFRACT -# define CLOSURE_NAME eevee_closure_refraction -# define CLOSURE_REFRACTION -#endif /* SURFACE_REFRACT */ - -#if !defined(SURFACE_GLASS) && !defined(CLOSURE_NAME) -# define SURFACE_GLASS -# define CLOSURE_NAME eevee_closure_glass -# define CLOSURE_GLOSSY -# define CLOSURE_REFRACTION -#endif /* SURFACE_GLASS */ - -/* Safety : CLOSURE_CLEARCOAT implies CLOSURE_GLOSSY */ -#ifdef CLOSURE_CLEARCOAT -# ifndef CLOSURE_GLOSSY -# define CLOSURE_GLOSSY -# endif -#endif /* CLOSURE_CLEARCOAT */ - -void CLOSURE_NAME(vec3 N -#ifdef CLOSURE_DIFFUSE - , - vec3 albedo -#endif -#ifdef CLOSURE_GLOSSY - , - vec3 f0, - vec3 f90, - int ssr_id -#endif -#if defined(CLOSURE_GLOSSY) || defined(CLOSURE_REFRACTION) - , - float roughness -#endif -#ifdef CLOSURE_CLEARCOAT - , - vec3 C_N, - float C_intensity, - float C_roughness -#endif -#if defined(CLOSURE_GLOSSY) || defined(CLOSURE_DIFFUSE) - , - float ao -#endif -#ifdef CLOSURE_SUBSURFACE - , - float sss_scale -#endif -#ifdef CLOSURE_REFRACTION - , - float ior -#endif - , - const bool use_contact_shadows -#ifdef CLOSURE_DIFFUSE - , - out vec3 out_diff -#endif -#ifdef CLOSURE_GLOSSY - , - out vec3 out_spec -#endif -#ifdef CLOSURE_REFRACTION - , - out vec3 out_refr -#endif -#ifdef CLOSURE_GLOSSY - , - out vec3 ssr_spec -#endif -) -{ -#ifdef CLOSURE_DIFFUSE - out_diff = vec3(0.0); -#endif - -#ifdef CLOSURE_GLOSSY - out_spec = vec3(0.0); -#endif - -#ifdef CLOSURE_REFRACTION - out_refr = vec3(0.0); -#endif - -#if defined(DEPTH_SHADER) || defined(WORLD_BACKGROUND) - /* This makes shader resources become unused and avoid issues with samplers. (see T59747) */ - return; -#else - - /* Zero length vectors cause issues, see: T51979. */ - float len = length(N); - if (isnan(len)) { - return; - } - N /= len; - -# ifdef CLOSURE_CLEARCOAT - len = length(C_N); - if (isnan(len)) { - return; - } - C_N /= len; -# endif - -# if defined(CLOSURE_GLOSSY) || defined(CLOSURE_REFRACTION) - roughness = clamp(roughness, 1e-8, 0.9999); - float roughnessSquared = roughness * roughness; -# endif - -# ifdef CLOSURE_CLEARCOAT - C_roughness = clamp(C_roughness, 1e-8, 0.9999); - float C_roughnessSquared = C_roughness * C_roughness; -# endif - - vec3 V = cameraVec; - - vec4 rand = texelfetch_noise_tex(gl_FragCoord.xy); - - /* ---------------------------------------------------------------- */ - /* -------------------- SCENE LIGHTS LIGHTING --------------------- */ - /* ---------------------------------------------------------------- */ - -# ifdef CLOSURE_GLOSSY - vec2 lut_uv = lut_coords_ltc(dot(N, V), roughness); - vec4 ltc_mat = texture(utilTex, vec3(lut_uv, 0.0)).rgba; -# endif - -# ifdef CLOSURE_CLEARCOAT - vec2 lut_uv_clear = lut_coords_ltc(dot(C_N, V), C_roughness); - vec4 ltc_mat_clear = texture(utilTex, vec3(lut_uv_clear, 0.0)).rgba; - vec3 out_spec_clear = vec3(0.0); -# endif - - float tracing_depth = gl_FragCoord.z; - /* Constant bias (due to depth buffer precision) */ - /* Magic numbers for 24bits of precision. - * From http://terathon.com/gdc07_lengyel.pdf (slide 26) */ - tracing_depth -= mix(2.4e-7, 4.8e-7, gl_FragCoord.z); - /* Convert to view Z. */ - tracing_depth = get_view_z_from_depth(tracing_depth); - - vec3 true_normal = normalize(cross(dFdx(viewPosition), dFdy(viewPosition))); - - for (int i = 0; i < MAX_LIGHT && i < laNumLight; i++) { - LightData ld = lights_data[i]; - - vec4 l_vector; /* Non-Normalized Light Vector with length in last component. */ - l_vector.xyz = ld.l_position - worldPosition; - l_vector.w = length(l_vector.xyz); - - float l_vis = light_visibility(ld, - worldPosition, - viewPosition, - tracing_depth, - true_normal, - rand.x, - use_contact_shadows, - l_vector); - - if (l_vis < 1e-8) { - continue; - } - - vec3 l_color_vis = ld.l_color * l_vis; - -# ifdef CLOSURE_DIFFUSE - out_diff += l_color_vis * light_diffuse(ld, N, V, l_vector); -# endif - -# ifdef CLOSURE_GLOSSY - out_spec += l_color_vis * light_specular(ld, ltc_mat, N, V, l_vector) * ld.l_spec; -# endif - -# ifdef CLOSURE_CLEARCOAT - out_spec_clear += l_color_vis * light_specular(ld, ltc_mat_clear, C_N, V, l_vector) * - ld.l_spec; -# endif - } - -# ifdef CLOSURE_GLOSSY - vec2 brdf_lut_lights = texture(utilTex, vec3(lut_uv, 1.0)).ba; - out_spec *= F_brdf(f0, f90, brdf_lut_lights.xy); -# endif - -# ifdef CLOSURE_CLEARCOAT - vec2 brdf_lut_lights_clear = texture(utilTex, vec3(lut_uv_clear, 1.0)).ba; - out_spec_clear *= F_brdf(vec3(0.04), vec3(1.0), brdf_lut_lights_clear.xy); - out_spec += out_spec_clear * C_intensity; -# endif - - /* ---------------------------------------------------------------- */ - /* ---------------- SPECULAR ENVIRONMENT LIGHTING ----------------- */ - /* ---------------------------------------------------------------- */ - - /* Accumulate incoming light from all sources until accumulator is full. Then apply Occlusion and - * BRDF. */ -# ifdef CLOSURE_GLOSSY - vec4 spec_accum = vec4(0.0); -# endif - -# ifdef CLOSURE_CLEARCOAT - vec4 C_spec_accum = vec4(0.0); -# endif - -# ifdef CLOSURE_REFRACTION - vec4 refr_accum = vec4(0.0); -# endif - -# ifdef CLOSURE_GLOSSY - /* ---------------------------- */ - /* Planar Reflections */ - /* ---------------------------- */ - - for (int i = 0; i < MAX_PLANAR && i < prbNumPlanar && spec_accum.a < 0.999; i++) { - PlanarData pd = planars_data[i]; - - /* Fade on geometric normal. */ - float fade = probe_attenuation_planar( - pd, worldPosition, (gl_FrontFacing) ? worldNormal : -worldNormal, roughness); - - if (fade > 0.0) { - if (!(ssrToggle && ssr_id == outputSsrId)) { - vec3 spec = probe_evaluate_planar(float(i), pd, worldPosition, N, V, roughness, fade); - accumulate_light(spec, fade, spec_accum); - } - -# ifdef CLOSURE_CLEARCOAT - vec3 C_spec = probe_evaluate_planar(float(i), pd, worldPosition, C_N, V, C_roughness, fade); - accumulate_light(C_spec, fade, C_spec_accum); -# endif - } - } -# endif - -# ifdef CLOSURE_GLOSSY - vec3 spec_dir = specular_dominant_dir(N, V, roughnessSquared); -# endif - -# ifdef CLOSURE_CLEARCOAT - vec3 C_spec_dir = specular_dominant_dir(C_N, V, C_roughnessSquared); -# endif - -# ifdef CLOSURE_REFRACTION - /* Refract the view vector using the depth heuristic. - * Then later Refract a second time the already refracted - * ray using the inverse ior. */ - float final_ior = (refractionDepth > 0.0) ? 1.0 / ior : ior; - vec3 refr_V = (refractionDepth > 0.0) ? -refract(-V, N, final_ior) : V; - vec3 refr_pos = (refractionDepth > 0.0) ? - line_plane_intersect( - worldPosition, refr_V, worldPosition - N * refractionDepth, N) : - worldPosition; - vec3 refr_dir = refraction_dominant_dir(N, refr_V, roughness, final_ior); -# endif - -# ifdef CLOSURE_REFRACTION -/* ---------------------------- */ -/* Screen Space Refraction */ -/* ---------------------------- */ -# ifdef USE_REFRACTION - if (ssrefractToggle && roughness < ssrMaxRoughness + 0.2) { - /* Find approximated position of the 2nd refraction event. */ - vec3 refr_vpos = (refractionDepth > 0.0) ? transform_point(ViewMatrix, refr_pos) : - viewPosition; - vec4 trans = screen_space_refraction(refr_vpos, N, refr_V, final_ior, roughnessSquared, rand); - trans.a *= smoothstep(ssrMaxRoughness + 0.2, ssrMaxRoughness, roughness); - accumulate_light(trans.rgb, trans.a, refr_accum); - } -# endif - -# endif - - /* ---------------------------- */ - /* Specular probes */ - /* ---------------------------- */ -# if defined(CLOSURE_GLOSSY) || defined(CLOSURE_REFRACTION) - -# if defined(CLOSURE_GLOSSY) && defined(CLOSURE_REFRACTION) -# define GLASS_ACCUM 1 -# define ACCUM min(refr_accum.a, spec_accum.a) -# elif defined(CLOSURE_REFRACTION) -# define GLASS_ACCUM 0 -# define ACCUM refr_accum.a -# else -# define GLASS_ACCUM 0 -# define ACCUM spec_accum.a -# endif - - /* Starts at 1 because 0 is world probe */ - for (int i = 1; ACCUM < 0.999 && i < prbNumRenderCube && i < MAX_PROBE; i++) { - float fade = probe_attenuation_cube(i, worldPosition); - - if (fade > 0.0) { - -# if GLASS_ACCUM - if (spec_accum.a < 0.999) { -# endif -# ifdef CLOSURE_GLOSSY - if (!(ssrToggle && ssr_id == outputSsrId)) { - vec3 spec = probe_evaluate_cube(i, worldPosition, spec_dir, roughness); - accumulate_light(spec, fade, spec_accum); - } -# endif - -# ifdef CLOSURE_CLEARCOAT - vec3 C_spec = probe_evaluate_cube(i, worldPosition, C_spec_dir, C_roughness); - accumulate_light(C_spec, fade, C_spec_accum); -# endif -# if GLASS_ACCUM - } -# endif - -# if GLASS_ACCUM - if (refr_accum.a < 0.999) { -# endif -# ifdef CLOSURE_REFRACTION - vec3 trans = probe_evaluate_cube(i, refr_pos, refr_dir, roughnessSquared); - accumulate_light(trans, fade, refr_accum); -# endif -# if GLASS_ACCUM - } -# endif - } - } - -# undef GLASS_ACCUM -# undef ACCUM - -/* ---------------------------- */ -/* World Probe */ -/* ---------------------------- */ -# ifdef CLOSURE_GLOSSY - if (spec_accum.a < 0.999) { - if (!(ssrToggle && ssr_id == outputSsrId)) { - vec3 spec = probe_evaluate_world_spec(spec_dir, roughness); - accumulate_light(spec, 1.0, spec_accum); - } - -# ifdef CLOSURE_CLEARCOAT - vec3 C_spec = probe_evaluate_world_spec(C_spec_dir, C_roughness); - accumulate_light(C_spec, 1.0, C_spec_accum); -# endif - } -# endif - -# ifdef CLOSURE_REFRACTION - if (refr_accum.a < 0.999) { - vec3 trans = probe_evaluate_world_spec(refr_dir, roughnessSquared); - accumulate_light(trans, 1.0, refr_accum); - } -# endif -# endif /* Specular probes */ - - /* ---------------------------- */ - /* Ambient Occlusion */ - /* ---------------------------- */ -# if defined(CLOSURE_GLOSSY) || defined(CLOSURE_DIFFUSE) - if (!use_contact_shadows) { - /* HACK: Fix for translucent BSDF. (see T65631) */ - N = -N; - } - vec3 bent_normal; - float final_ao = occlusion_compute(N, viewPosition, ao, rand, bent_normal); - if (!use_contact_shadows) { - N = -N; - /* Bypass bent normal. */ - bent_normal = N; - } -# endif - - /* ---------------------------- */ - /* Specular Output */ - /* ---------------------------- */ - float NV = dot(N, V); -# ifdef CLOSURE_GLOSSY - vec2 uv = lut_coords(NV, roughness); - vec2 brdf_lut = texture(utilTex, vec3(uv, 1.0)).rg; - - /* This factor is outputted to be used by SSR in order - * to match the intensity of the regular reflections. */ - ssr_spec = F_brdf(f0, f90, brdf_lut); - float spec_occlu = specular_occlusion(NV, final_ao, roughness); - - /* The SSR pass recompute the occlusion to not apply it to the SSR */ - if (ssrToggle && ssr_id == outputSsrId) { - spec_occlu = 1.0; - } - - out_spec += spec_accum.rgb * ssr_spec * spec_occlu; -# endif - -# ifdef CLOSURE_REFRACTION - float btdf = get_btdf_lut(NV, roughness, ior); - - out_refr += refr_accum.rgb * btdf; - - /* Global toggle for lightprobe baking. */ - out_refr *= float(specToggle); -# endif - -# ifdef CLOSURE_CLEARCOAT - NV = dot(C_N, V); - vec2 C_uv = lut_coords(NV, C_roughness); - vec2 C_brdf_lut = texture(utilTex, vec3(C_uv, 1.0)).rg; - vec3 C_fresnel = F_brdf(vec3(0.04), vec3(1.0), C_brdf_lut) * - specular_occlusion(NV, final_ao, C_roughness); - - out_spec += C_spec_accum.rgb * C_fresnel * C_intensity; -# endif - -# ifdef CLOSURE_GLOSSY - /* Global toggle for lightprobe baking. */ - out_spec *= float(specToggle); -# endif - - /* ---------------------------------------------------------------- */ - /* ---------------- DIFFUSE ENVIRONMENT LIGHTING ------------------ */ - /* ---------------------------------------------------------------- */ - - /* Accumulate light from all sources until accumulator is full. Then apply Occlusion and BRDF. */ -# ifdef CLOSURE_DIFFUSE - vec4 diff_accum = vec4(0.0); - - /* ---------------------------- */ - /* Irradiance Grids */ - /* ---------------------------- */ - /* Start at 1 because 0 is world irradiance */ - for (int i = 1; i < MAX_GRID && i < prbNumRenderGrid && diff_accum.a < 0.999; i++) { - GridData gd = grids_data[i]; - - vec3 localpos; - float fade = probe_attenuation_grid(gd, grids_data[i].localmat, worldPosition, localpos); - - if (fade > 0.0) { - vec3 diff = probe_evaluate_grid(gd, worldPosition, bent_normal, localpos); - accumulate_light(diff, fade, diff_accum); - } - } - - /* ---------------------------- */ - /* World Diffuse */ - /* ---------------------------- */ - if (diff_accum.a < 0.999 && prbNumRenderGrid > 0) { - vec3 diff = probe_evaluate_world_diff(bent_normal); - accumulate_light(diff, 1.0, diff_accum); - } - - out_diff += diff_accum.rgb * gtao_multibounce(final_ao, albedo); -# endif -#endif -} - -/* Cleanup for next configuration */ -#undef CLOSURE_NAME - -#ifdef CLOSURE_DIFFUSE -# undef CLOSURE_DIFFUSE -#endif - -#ifdef CLOSURE_GLOSSY -# undef CLOSURE_GLOSSY -#endif - -#ifdef CLOSURE_CLEARCOAT -# undef CLOSURE_CLEARCOAT -#endif - -#ifdef CLOSURE_REFRACTION -# undef CLOSURE_REFRACTION -#endif - -#ifdef CLOSURE_SUBSURFACE -# undef CLOSURE_SUBSURFACE -#endif diff --git a/source/blender/draw/engines/eevee/shaders/closure_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl similarity index 86% rename from source/blender/draw/engines/eevee/shaders/closure_lib.glsl rename to source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl index b56a186ab3f..38ae3972aa7 100644 --- a/source/blender/draw/engines/eevee/shaders/closure_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl @@ -147,17 +147,27 @@ Closure closure_emission(vec3 rgb) #ifndef VOLUMETRICS +/* Let radiance passthrough or replace it to get the BRDF and color + * to applied to the SSR result. */ +vec3 closure_mask_ssr_radiance(vec3 radiance, float ssr_id) +{ + return (ssrToggle && int(ssr_id) == outputSsrId) ? vec3(1.0) : radiance; +} + void closure_load_ssr_data( - vec3 ssr_spec, float roughness, vec3 N, vec3 viewVec, int ssr_id, inout Closure cl) + vec3 ssr_radiance, float roughness, vec3 N, float ssr_id, inout Closure cl) { /* Still encode to avoid artifacts in the SSR pass. */ vec3 vN = normalize(mat3(ViewMatrix) * N); - cl.ssr_normal = normal_encode(vN, viewVec); + cl.ssr_normal = normal_encode(vN, viewCameraVec(viewPosition)); - if (ssr_id == outputSsrId) { - cl.ssr_data = vec4(ssr_spec, roughness); + if (ssrToggle && int(ssr_id) == outputSsrId) { + cl.ssr_data = vec4(ssr_radiance, roughness); cl.flag |= CLOSURE_SSR_FLAG; } + else { + cl.radiance += ssr_radiance; + } } void closure_load_sss_data( @@ -169,13 +179,11 @@ void closure_load_sss_data( cl.sss_radius = radius; cl.sss_albedo = sss_albedo; cl.flag |= CLOSURE_SSS_FLAG; - cl.radiance += render_pass_diffuse_mask(sss_albedo, vec3(0)); + /* Irradiance will be convolved by SSSS pass. Do not add to radiance. */ + sss_irradiance = vec3(0); } - else # endif - { - cl.radiance += render_pass_diffuse_mask(sss_albedo, sss_irradiance * sss_albedo); - } + cl.radiance += render_pass_diffuse_mask(vec3(1), sss_irradiance) * sss_albedo; } #endif diff --git a/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl b/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl index 95a585f0d9c..821859b3228 100644 --- a/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl @@ -12,52 +12,95 @@ uniform sampler2DArray utilTex; #define LUT_SIZE 64 +#define LTC_MAT_LAYER 0 +#define LTC_BRDF_LAYER 1 +#define BRDF_LUT_LAYER 1 +#define NOISE_LAYER 2 +#define LTC_DISK_LAYER 3 /* UNUSED */ + +/* Layers 4 to 20 are for BTDF Lut. */ +const float lut_btdf_layer_first = 4.0; +const float lut_btdf_layer_count = 16.0; + +/** + * Reminder: The 4 noise values are based of 3 uncorrelated blue noises: + * x : Uniformly distributed value [0..1] (noise 1). + * y : Uniformly distributed value [0..1] (noise 2). + * z,w : Uniformly distributed point on the unit circle [-1..1] (noise 3). + **/ #define texelfetch_noise_tex(coord) texelFetch(utilTex, ivec3(ivec2(coord) % LUT_SIZE, 2.0), 0) -/* Return texture coordinates to sample Surface LUT */ -vec2 lut_coords(float cosTheta, float roughness) +/* Return texture coordinates to sample Surface LUT. */ +vec2 lut_coords(float cos_theta, float roughness) { - float theta = acos(cosTheta); - vec2 coords = vec2(roughness, theta / M_PI_2); - + vec2 coords = vec2(roughness, sqrt(1.0 - cos_theta)); /* scale and bias coordinates, for correct filtered lookup */ return coords * (LUT_SIZE - 1.0) / LUT_SIZE + 0.5 / LUT_SIZE; } -vec2 lut_coords_ltc(float cosTheta, float roughness) +/* Returns the GGX split-sum precomputed in LUT. */ +vec2 brdf_lut(float cos_theta, float roughness) { - vec2 coords = vec2(roughness, sqrt(1.0 - cosTheta)); - - /* scale and bias coordinates, for correct filtered lookup */ - return coords * (LUT_SIZE - 1.0) / LUT_SIZE + 0.5 / LUT_SIZE; + return textureLod(utilTex, vec3(lut_coords(cos_theta, roughness), BRDF_LUT_LAYER), 0.0).rg; } -float get_btdf_lut(float NV, float roughness, float ior) +/* Return texture coordinates to sample Surface LUT. */ +vec3 lut_coords_btdf(float cos_theta, float roughness, float ior) { - const vec3 lut_scale_bias_texel_size = vec3((LUT_SIZE - 1.0), 0.5, 1.5) / LUT_SIZE; + /* ior is sin of critical angle. */ + float critical_cos = sqrt(1.0 - ior * ior); vec3 coords; - /* Try to compensate for the low resolution and interpolation error. */ - coords.x = (ior > 1.0) ? (0.9 + lut_scale_bias_texel_size.z) + - (0.1 - lut_scale_bias_texel_size.z) * f0_from_ior(ior) : - (0.9 + lut_scale_bias_texel_size.z) * ior * ior; - coords.y = 1.0 - saturate(NV); - coords.xy *= lut_scale_bias_texel_size.x; - coords.xy += lut_scale_bias_texel_size.y; + coords.x = sqr(ior); + coords.y = cos_theta; + coords.y -= critical_cos; + coords.y /= (coords.y > 0.0) ? (1.0 - critical_cos) : critical_cos; + coords.y = coords.y * 0.5 + 0.5; + coords.z = roughness; - const float lut_lvl_ofs = 4.0; /* First texture lvl of roughness. */ - const float lut_lvl_scale = 16.0; /* How many lvl of roughness in the lut. */ + coords = saturate(coords); - float mip = roughness * lut_lvl_scale; - float mip_floor = floor(mip); + /* scale and bias coordinates, for correct filtered lookup */ + coords.xy = coords.xy * (LUT_SIZE - 1.0) / LUT_SIZE + 0.5 / LUT_SIZE; - coords.z = lut_lvl_ofs + mip_floor + 1.0; - float btdf_high = textureLod(utilTex, coords, 0.0).r; + return coords; +} - coords.z -= 1.0; - float btdf_low = textureLod(utilTex, coords, 0.0).r; +/* Returns GGX BTDF in first component and fresnel in second. */ +vec2 btdf_lut(float cos_theta, float roughness, float ior) +{ + if (ior <= 1e-5) { + return vec2(0.0); + } - float btdf = (ior == 1.0) ? 1.0 : mix(btdf_low, btdf_high, mip - coords.z); + if (ior >= 1.0) { + vec2 split_sum = brdf_lut(cos_theta, roughness); + float f0 = f0_from_ior(ior); + /* Baked IOR for GGX BRDF. */ + const float specular = 1.0; + const float eta_brdf = (2.0 / (1.0 - sqrt(0.08 * specular))) - 1.0; + /* Avoid harsh transition comming from ior == 1. */ + float f90 = fast_sqrt(saturate(f0 / (f0_from_ior(eta_brdf) * 0.25))); + float fresnel = F_brdf_single_scatter(vec3(f0), vec3(f90), split_sum).r; + /* Setting the BTDF to one is not really important since it is only used for multiscatter + * and it's already quite close to ground truth. */ + float btdf = 1.0; + return vec2(btdf, fresnel); + } + + vec3 coords = lut_coords_btdf(cos_theta, roughness, ior); + + float layer = coords.z * lut_btdf_layer_count; + float layer_floored = floor(layer); + + coords.z = lut_btdf_layer_first + layer_floored; + vec2 btdf_low = textureLod(utilTex, coords, 0.0).rg; + + coords.z += 1.0; + vec2 btdf_high = textureLod(utilTex, coords, 0.0).rg; + + /* Manual trilinear interpolation. */ + vec2 btdf = mix(btdf_low, btdf_high, layer - layer_floored); return btdf; } diff --git a/source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl index 489e87e9a7d..33d7347a377 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl @@ -177,11 +177,11 @@ vec4 step_blit(void) vec4 step_downsample(void) { #ifdef HIGH_QUALITY /* Anti flicker */ - vec3 sample = downsample_filter_high(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize); + vec3 samp = downsample_filter_high(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize); #else - vec3 sample = downsample_filter(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize); + vec3 samp = downsample_filter(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize); #endif - return vec4(sample, 1.0); + return vec4(samp, 1.0); } vec4 step_upsample(void) diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_bokeh_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_bokeh_frag.glsl new file mode 100644 index 00000000000..40e4c5a313e --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_bokeh_frag.glsl @@ -0,0 +1,101 @@ + +/** + * Bokeh Look Up Table: This outputs a radius multiplier to shape the sampling in gather pass or + * the scatter sprite appearance. This is only used if bokeh shape is either anamorphic or is not + * a perfect circle. + * We correct samples spacing for polygonal bokeh shapes. However, we do not for anamorphic bokeh + * as it is way more complex and expensive to do. + **/ + +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +uniform float bokehSides; +uniform float bokehRotation; +uniform vec2 bokehAnisotropyInv; + +in vec4 uvcoordsvar; + +layout(location = 0) out vec2 outGatherLut; +layout(location = 1) out float outScatterLut; +layout(location = 2) out float outResolveLut; + +float polygon_sides_length(float sides_count) +{ + return 2.0 * sin(M_PI / sides_count); +} + +/* Returns intersection ratio between the radius edge at theta and the polygon edge. + * Start first corners at theta == 0. */ +float circle_to_polygon_radius(float sides_count, float theta) +{ + /* From Graphics Gems from CryENGINE 3 (Siggraph 2013) by Tiago Sousa (slide 36). */ + float side_angle = M_2PI / sides_count; + float halfside_angle = side_angle * 0.5; + return cos(side_angle * 0.5) / + cos(theta - side_angle * floor((sides_count * theta + M_PI) / M_2PI)); +} + +/* Remap input angle to have homogenous spacing of points along a polygon edge. + * Expect theta to be in [0..2pi] range. */ +float circle_to_polygon_angle(float sides_count, float theta) +{ + float side_angle = M_2PI / sides_count; + float halfside_angle = side_angle * 0.5; + float side = floor(theta / side_angle); + /* Length of segment from center to the middle of polygon side. */ + float adjacent = circle_to_polygon_radius(sides_count, 0.0); + + /* This is the relative position of the sample on the polygon half side. */ + float local_theta = theta - side * side_angle; + float ratio = (local_theta - halfside_angle) / halfside_angle; + + float halfside_len = polygon_sides_length(sides_count) * 0.5; + float oposite = ratio * halfside_len; + + /* NOTE: atan(y_over_x) has output range [-M_PI_2..M_PI_2]. */ + float final_local_theta = atan(oposite / adjacent); + + return side * side_angle + final_local_theta; +} + +void main() +{ + /* Center uv in range [-1..1]. */ + vec2 uv = uvcoordsvar.xy * 2.0 - 1.0; + + float radius = length(uv); + + vec2 texel = floor(gl_FragCoord.xy) - float(DOF_MAX_SLIGHT_FOCUS_RADIUS); + + if (bokehSides > 0.0) { + /* NOTE: atan(y,x) has output range [-M_PI..M_PI], so add 2pi to avoid negative angles. */ + float theta = atan(uv.y, uv.x) + M_2PI; + float r = length(uv); + + radius /= circle_to_polygon_radius(bokehSides, theta - bokehRotation); + + float theta_new = circle_to_polygon_angle(bokehSides, theta); + float r_new = circle_to_polygon_radius(bokehSides, theta_new); + + theta_new -= bokehRotation; + + uv = r_new * vec2(-cos(theta_new), sin(theta_new)); + + { + /* Slight focus distance */ + texel *= bokehAnisotropyInv; + float theta = atan(texel.y, -texel.x) + M_2PI; + texel /= circle_to_polygon_radius(bokehSides, theta + bokehRotation); + } + } + else { + uv *= safe_rcp(length(uv)); + } + + /* For gather store the normalized UV. */ + outGatherLut = uv; + /* For scatter store distance. */ + outScatterLut = radius; + /* For slight focus gather store pixel perfect distance. */ + outResolveLut = length(texel); +} diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_dilate_tiles_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_dilate_tiles_frag.glsl new file mode 100644 index 00000000000..22e6f929f36 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_dilate_tiles_frag.glsl @@ -0,0 +1,117 @@ + +/** + * Tile dilate pass: Takes the 8x8 Tiles buffer and converts dilates the tiles with large CoC to + * their neighborhood. This pass is repeated multiple time until the maximum CoC can be covered. + **/ + +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +/* 1/16th of fullres. */ +uniform sampler2D cocTilesFgBuffer; +uniform sampler2D cocTilesBgBuffer; + +uniform int ringCount; +uniform int ringWidthMultiplier; +uniform bool dilateSlightFocus; + +/* 1/16th of fullres. Same format as input. */ +layout(location = 0) out vec4 outFgCoc; +layout(location = 1) out vec3 outBgCoc; + +const float tile_to_fullres_factor = float(DOF_TILE_DIVISOR); + +/* Error introduced by the random offset of the gathering kernel's center. */ +const float bluring_radius_error = 1.0 + 1.0 / (gather_ring_count + 0.5); + +void main() +{ + ivec2 center_tile_pos = ivec2(gl_FragCoord.xy); + + CocTile ring_buckets[DOF_DILATE_RING_COUNT]; + + for (int ring = 0; ring < ringCount && ring < DOF_DILATE_RING_COUNT; ring++) { + ring_buckets[ring] = dof_coc_tile_init(); + + int ring_distance = ring + 1; + for (int sample_id = 0; sample_id < 4 * ring_distance; sample_id++) { + ivec2 offset = dof_square_ring_sample_offset(ring_distance, sample_id); + + offset *= ringWidthMultiplier; + + for (int i = 0; i < 2; i++) { + ivec2 adj_tile_pos = center_tile_pos + ((i == 0) ? offset : -offset); + + CocTile adj_tile = dof_coc_tile_load(cocTilesFgBuffer, cocTilesBgBuffer, adj_tile_pos); + +#ifdef DILATE_MODE_MIN_MAX + /* Actually gather the "absolute" biggest coc but keeping the sign. */ + ring_buckets[ring].fg_min_coc = min(ring_buckets[ring].fg_min_coc, adj_tile.fg_min_coc); + ring_buckets[ring].bg_max_coc = max(ring_buckets[ring].bg_max_coc, adj_tile.bg_max_coc); + + if (dilateSlightFocus) { + ring_buckets[ring].fg_slight_focus_max_coc = dof_coc_max_slight_focus( + ring_buckets[ring].fg_slight_focus_max_coc, adj_tile.fg_slight_focus_max_coc); + } + +#else /* DILATE_MODE_MIN_ABS */ + ring_buckets[ring].fg_max_coc = max(ring_buckets[ring].fg_max_coc, adj_tile.fg_max_coc); + ring_buckets[ring].bg_min_coc = min(ring_buckets[ring].bg_min_coc, adj_tile.bg_min_coc); + + /* Should be tight as possible to reduce gather overhead (see slide 61). */ + float closest_neighbor_distance = length(max(abs(vec2(offset)) - 1.0, 0.0)) * + tile_to_fullres_factor; + + ring_buckets[ring].fg_max_intersectable_coc = max( + ring_buckets[ring].fg_max_intersectable_coc, + adj_tile.fg_max_intersectable_coc + closest_neighbor_distance); + ring_buckets[ring].bg_min_intersectable_coc = min( + ring_buckets[ring].bg_min_intersectable_coc, + adj_tile.bg_min_intersectable_coc + closest_neighbor_distance); +#endif + } + } + } + + /* Load center tile. */ + CocTile out_tile = dof_coc_tile_load(cocTilesFgBuffer, cocTilesBgBuffer, center_tile_pos); + + /* Dilate once. */ + if (dilateSlightFocus) { + out_tile.fg_slight_focus_max_coc = dof_coc_max_slight_focus( + out_tile.fg_slight_focus_max_coc, ring_buckets[0].fg_slight_focus_max_coc); + } + + for (int ring = 0; ring < ringCount && ring < DOF_DILATE_RING_COUNT; ring++) { + float ring_distance = float(ring + 1); + + ring_distance = (ring_distance * ringWidthMultiplier - 1) * tile_to_fullres_factor; + + /* NOTE(fclem): Unsure if both sides of the inequalities have the same unit. */ +#ifdef DILATE_MODE_MIN_MAX + if (-ring_buckets[ring].fg_min_coc * bluring_radius_error > ring_distance) { + out_tile.fg_min_coc = min(out_tile.fg_min_coc, ring_buckets[ring].fg_min_coc); + } + + if (ring_buckets[ring].bg_max_coc * bluring_radius_error > ring_distance) { + out_tile.bg_max_coc = max(out_tile.bg_max_coc, ring_buckets[ring].bg_max_coc); + } + +#else /* DILATE_MODE_MIN_ABS */ + /* Find minimum absolute CoC radii that will be intersected for the previously + * computed maximum CoC values. */ + if (-out_tile.fg_min_coc * bluring_radius_error > ring_distance) { + out_tile.fg_max_coc = max(out_tile.fg_max_coc, ring_buckets[ring].fg_max_coc); + out_tile.fg_max_intersectable_coc = max(out_tile.fg_max_intersectable_coc, + ring_buckets[ring].fg_max_intersectable_coc); + } + + if (out_tile.bg_max_coc * bluring_radius_error > ring_distance) { + out_tile.bg_min_coc = min(out_tile.bg_min_coc, ring_buckets[ring].bg_min_coc); + out_tile.bg_min_intersectable_coc = min(out_tile.bg_min_intersectable_coc, + ring_buckets[ring].bg_min_intersectable_coc); + } +#endif + } + + dof_coc_tile_store(out_tile, outFgCoc, outBgCoc); +} diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_downsample_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_downsample_frag.glsl new file mode 100644 index 00000000000..c477e0f6eb8 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_downsample_frag.glsl @@ -0,0 +1,37 @@ + +/** + * Downsample pass: CoC aware downsample to quarter resolution. + * + * Pretty much identical to the setup pass but get CoC from buffer. Also does not + * weight luma for the bilateral weights. + **/ + +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +/* Half resolution. */ +uniform sampler2D colorBuffer; +uniform sampler2D cocBuffer; + +/* Quarter resolution. */ +layout(location = 0) out vec4 outColor; + +void main() +{ + vec2 halfres_texel_size = 1.0 / vec2(textureSize(colorBuffer, 0).xy); + /* Center uv around the 4 halfres pixels. */ + vec2 quad_center = (floor(gl_FragCoord.xy) * 2.0 + 1.0) * halfres_texel_size; + + vec4 colors[4]; + vec4 cocs; + for (int i = 0; i < 4; i++) { + vec2 sample_uv = quad_center + quad_offsets[i] * halfres_texel_size; + colors[i] = textureLod(colorBuffer, sample_uv, 0.0); + cocs[i] = textureLod(cocBuffer, sample_uv, 0.0).r; + } + + vec4 weights = dof_downsample_bilateral_coc_weights(cocs); + /* Normalize so that the sum is 1. */ + weights *= safe_rcp(sum(weights)); + + outColor = weighted_sum_array(colors, weights); +} diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_filter_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_filter_frag.glsl new file mode 100644 index 00000000000..8fd8215da0f --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_filter_frag.glsl @@ -0,0 +1,93 @@ + +/** + * Gather Filter pass: Filter the gather pass result to reduce noise. + * + * This is a simple 3x3 median filter to avoid dilating highlights with a 3x3 max filter even if + * cheaper. + **/ + +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +uniform sampler2D colorBuffer; +uniform sampler2D weightBuffer; + +in vec4 uvcoordsvar; + +layout(location = 0) out vec4 outColor; +layout(location = 1) out float outWeight; + +/* From: + * Implementing Median Filters in XC4000E FPGAs + * JOHN L. SMITH, Univision Technologies Inc., Billerica, MA + * http://users.utcluj.ro/~baruch/resources/Image/xl23_16.pdf + * Figure 1 */ + +/* Outputs low median and high value of a triple. */ +void lmh(vec4 s1, vec4 s2, vec4 s3, out vec4 l, out vec4 m, out vec4 h) +{ + /* From diagram, with nodes numbered from top to bottom. */ + vec4 h1 = max(s2, s3); + vec4 l1 = min(s2, s3); + + vec4 h2 = max(s1, l1); + vec4 l2 = min(s1, l1); + + vec4 h3 = max(h2, h1); + vec4 l3 = min(h2, h1); + + l = l2; + m = l3; + h = h3; +} + +vec4 median_filter(sampler2D tex, vec2 uv) +{ + vec2 texel_size = 1.0 / vec2(textureSize(tex, 0).xy); + vec4 samples[9]; + int s = 0; + + const vec2 ofs[9] = vec2[9](vec2(-1, -1), + vec2(0, -1), + vec2(1, -1), + vec2(-1, 0), + vec2(0, 0), + vec2(1, 0), + vec2(-1, 1), + vec2(0, 1), + vec2(1, 1)); + + for (int s = 0; s < 9; s++) { + samples[s] = textureLod(tex, uv + ofs[s] * texel_size, 0.0); + } + + if (no_gather_filtering) { + return samples[4]; + } + + for (int s = 0; s < 9; s += 3) { + lmh(samples[s], samples[s + 1], samples[s + 2], samples[s], samples[s + 1], samples[s + 2]); + } + /* Some aliases to better understand what's happening. */ + vec4 L123 = samples[0 + 0], L456 = samples[3 + 0], L789 = samples[6 + 0]; + vec4 M123 = samples[0 + 1], M456 = samples[3 + 1], M789 = samples[6 + 1]; + vec4 H123 = samples[0 + 2], H456 = samples[3 + 2], H789 = samples[6 + 2]; + vec4 dummy, l, m, h; + /* Left nodes. */ + h = max(max(L123, L456), L789); + /* Right nodes. */ + l = min(min(H123, H456), H789); + /* Center nodes. */ + lmh(M123, M456, M789, dummy, m, dummy); + /* Last bottom nodes. */ + lmh(l, m, h, dummy, m, dummy); + + return m; +} + +void main() +{ + /* OPTI(fclem) Could early return on some tiles. */ + + outColor = median_filter(colorBuffer, uvcoordsvar.xy); + outWeight = median_filter(weightBuffer, uvcoordsvar.xy).r; +} \ No newline at end of file diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_flatten_tiles_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_flatten_tiles_frag.glsl new file mode 100644 index 00000000000..bd81171c759 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_flatten_tiles_frag.glsl @@ -0,0 +1,57 @@ + +/** + * Tile flatten pass: Takes the halfres CoC buffer and converts it to 8x8 tiles. + * + * Output min and max values for each tile and for both foreground & background. + * Also outputs min intersectable CoC for the background, which is the minimum CoC + * that comes from the background pixels. + **/ + +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +/* Half resolution. */ +uniform sampler2D halfResCocBuffer; + +/* 1/8th of halfResCocBuffer resolution. So 1/16th of fullres. */ +layout(location = 0) out vec4 outFgCoc; +layout(location = 1) out vec3 outBgCoc; + +const int halfres_tile_divisor = DOF_TILE_DIVISOR / 2; + +void main() +{ + ivec2 halfres_bounds = textureSize(halfResCocBuffer, 0).xy - 1; + ivec2 tile_co = ivec2(gl_FragCoord.xy); + + CocTile tile = dof_coc_tile_init(); + + for (int x = 0; x < halfres_tile_divisor; x++) { + /* OPTI: Could be done in separate passes. */ + for (int y = 0; y < halfres_tile_divisor; y++) { + ivec2 sample_texel = tile_co * halfres_tile_divisor + ivec2(x, y); + vec2 sample_data = texelFetch(halfResCocBuffer, min(sample_texel, halfres_bounds), 0).rg; + float sample_coc = sample_data.x; + float sample_slight_focus_coc = sample_data.y; + + float fg_coc = min(sample_coc, 0.0); + tile.fg_min_coc = min(tile.fg_min_coc, fg_coc); + tile.fg_max_coc = max(tile.fg_max_coc, fg_coc); + + float bg_coc = max(sample_coc, 0.0); + tile.bg_min_coc = min(tile.bg_min_coc, bg_coc); + tile.bg_max_coc = max(tile.bg_max_coc, bg_coc); + + if (sample_coc > 0.0) { + tile.bg_min_intersectable_coc = min(tile.bg_min_intersectable_coc, bg_coc); + } + if (sample_coc < 0.0) { + tile.fg_max_intersectable_coc = max(tile.fg_max_intersectable_coc, fg_coc); + } + + tile.fg_slight_focus_max_coc = dof_coc_max_slight_focus(tile.fg_slight_focus_max_coc, + sample_slight_focus_coc); + } + } + + dof_coc_tile_store(tile, outFgCoc, outBgCoc); +} diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl deleted file mode 100644 index 9c1ca17f87c..00000000000 --- a/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl +++ /dev/null @@ -1,254 +0,0 @@ - - -#pragma BLENDER_REQUIRE(common_view_lib.glsl) -#pragma BLENDER_REQUIRE(common_math_lib.glsl) - -uniform sampler2D colorBuffer; -uniform sampler2D depthBuffer; - -uniform vec2 dofParams; -uniform bool unpremult; - -#define dof_mul dofParams.x /* distance * aperturesize * invsensorsize */ -#define dof_bias dofParams.y /* aperturesize * invsensorsize */ - -uniform vec4 bokehParams[2]; - -#define bokeh_rotation bokehParams[0].x -#define bokeh_ratio bokehParams[0].y -#define bokeh_maxsize bokehParams[0].z -#define bokeh_sides \ - bokehParams[1] /* Polygon Bokeh shape number of sides (with precomputed vars) */ - -uniform vec2 nearFar; /* Near & far view depths values */ - -/* -------------- Utils ------------- */ - -/* divide by sensor size to get the normalized size */ -#define calculate_coc(zdepth) (dof_mul / zdepth - dof_bias) - -#define linear_depth(z) \ - ((ProjectionMatrix[3][3] == 0.0) ? \ - (nearFar.x * nearFar.y) / (z * (nearFar.x - nearFar.y) + nearFar.y) : \ - z * (nearFar.y - nearFar.x) + nearFar.x) /* Only true for camera view! */ - -#define weighted_sum(a, b, c, d, e) \ - (a * e.x + b * e.y + c * e.z + d * e.w) / max(1e-6, dot(e, vec4(1.0))); - -vec4 safe_color(vec4 c) -{ - /* Clamp to avoid black square artifacts if a pixel goes NaN. */ - return clamp(c, vec4(0.0), vec4(1e20)); /* 1e20 arbitrary. */ -} - -#define THRESHOLD 1.0 - -#ifdef STEP_DOWNSAMPLE - -layout(location = 0) out vec4 nearColor; -layout(location = 1) out vec4 farColor; -layout(location = 2) out vec2 cocData; - -/* Downsample the color buffer to half resolution. - * Weight color samples by - * Compute maximum CoC for near and far blur. */ -void main(void) -{ - ivec4 uvs = ivec4(gl_FragCoord.xyxy) * 2 + ivec4(0, 0, 1, 1); - - /* custom downsampling */ - vec4 color1 = safe_color(texelFetch(colorBuffer, uvs.xy, 0)); - vec4 color2 = safe_color(texelFetch(colorBuffer, uvs.zw, 0)); - vec4 color3 = safe_color(texelFetch(colorBuffer, uvs.zy, 0)); - vec4 color4 = safe_color(texelFetch(colorBuffer, uvs.xw, 0)); - - /* Leverage SIMD by combining 4 depth samples into a vec4 */ - vec4 depth; - depth.r = texelFetch(depthBuffer, uvs.xy, 0).r; - depth.g = texelFetch(depthBuffer, uvs.zw, 0).r; - depth.b = texelFetch(depthBuffer, uvs.zy, 0).r; - depth.a = texelFetch(depthBuffer, uvs.xw, 0).r; - - vec4 zdepth = linear_depth(depth); - - /* Compute signed CoC for each depth samples */ - vec4 coc_near = calculate_coc(zdepth); - vec4 coc_far = -coc_near; - - cocData.x = max(max_v4(coc_near), 0.0); - cocData.y = max(max_v4(coc_far), 0.0); - - /* now we need to write the near-far fields premultiplied by the coc - * also use bilateral weighting by each coc values to avoid bleeding. */ - vec4 near_weights = step(THRESHOLD, coc_near) * clamp(1.0 - abs(cocData.x - coc_near), 0.0, 1.0); - vec4 far_weights = step(THRESHOLD, coc_far) * clamp(1.0 - abs(cocData.y - coc_far), 0.0, 1.0); - -# ifdef USE_ALPHA_DOF - /* Premult */ - color1.rgb *= color1.a; - color2.rgb *= color2.a; - color3.rgb *= color3.a; - color4.rgb *= color4.a; -# endif - - /* now write output to weighted buffers. */ - nearColor = weighted_sum(color1, color2, color3, color4, near_weights); - farColor = weighted_sum(color1, color2, color3, color4, far_weights); -} - -#elif defined(STEP_SCATTER) - -flat in vec4 color; -flat in float weight; -flat in float smoothFac; -flat in ivec2 edge; -/* coordinate used for calculating radius */ -in vec2 particlecoord; - -layout(location = 0) out vec4 fragColor; -# ifdef USE_ALPHA_DOF -layout(location = 1) out float fragAlpha; -# endif - -/* accumulate color in the near/far blur buffers */ -void main(void) -{ - /* Discard to avoid bleeding onto the next layer */ - if (int(gl_FragCoord.x) * edge.x + edge.y > 0) { - discard; - } - - /* Circle Dof */ - float dist = length(particlecoord); - - /* Outside of bokeh shape */ - if (dist > 1.0) { - discard; - } - - /* Regular Polygon Dof */ - if (bokeh_sides.x > 0.0) { - /* Circle parametrization */ - float theta = atan(particlecoord.y, particlecoord.x) + bokeh_rotation; - - /* Optimized version of : - * float denom = theta - (M_2PI / bokeh_sides) * floor((bokeh_sides * theta + M_PI) / M_2PI); - * float r = cos(M_PI / bokeh_sides) / cos(denom); */ - float denom = theta - bokeh_sides.y * floor(bokeh_sides.z * theta + 0.5); - float r = bokeh_sides.w / cos(denom); - - /* Divide circle radial coord by the shape radius for angle theta. - * Giving us the new linear radius to the shape edge. */ - dist /= r; - - /* Outside of bokeh shape */ - if (dist > 1.0) { - discard; - } - } - - fragColor = color; - - /* Smooth the edges a bit. This effectively reduce the bokeh shape - * but does fade out the undersampling artifacts. */ - float shape = smoothstep(1.0, min(0.999, smoothFac), dist); - - fragColor *= shape; - -# ifdef USE_ALPHA_DOF - fragAlpha = fragColor.a; - fragColor.a = weight * shape; -# endif -} - -#elif defined(STEP_RESOLVE) - -# define MERGE_THRESHOLD 4.0 - -uniform sampler2D scatterBuffer; -uniform sampler2D scatterAlphaBuffer; - -in vec4 uvcoordsvar; -out vec4 fragColor; - -vec4 upsample_filter(sampler2D tex, vec2 uv, vec2 texelSize) -{ - /* TODO FIXME: Clamp the sample position - * depending on the layer to avoid bleeding. - * This is not really noticeable so leaving it as is for now. */ - -# if 1 /* 9-tap bilinear upsampler (tent filter) */ - vec4 d = texelSize.xyxy * vec4(1, 1, -1, 0); - - vec4 s; - s = textureLod(tex, uv - d.xy, 0.0); - s += textureLod(tex, uv - d.wy, 0.0) * 2; - s += textureLod(tex, uv - d.zy, 0.0); - - s += textureLod(tex, uv + d.zw, 0.0) * 2; - s += textureLod(tex, uv, 0.0) * 4; - s += textureLod(tex, uv + d.xw, 0.0) * 2; - - s += textureLod(tex, uv + d.zy, 0.0); - s += textureLod(tex, uv + d.wy, 0.0) * 2; - s += textureLod(tex, uv + d.xy, 0.0); - - return s * (1.0 / 16.0); -# else - /* 4-tap bilinear upsampler */ - vec4 d = texelSize.xyxy * vec4(-1, -1, +1, +1) * 0.5; - - vec4 s; - s = textureLod(tex, uv + d.xy, 0.0); - s += textureLod(tex, uv + d.zy, 0.0); - s += textureLod(tex, uv + d.xw, 0.0); - s += textureLod(tex, uv + d.zw, 0.0); - - return s * (1.0 / 4.0); -# endif -} - -/* Combine the Far and Near color buffers */ -void main(void) -{ - vec2 uv = uvcoordsvar.xy; - /* Recompute Near / Far CoC per pixel */ - float depth = textureLod(depthBuffer, uv, 0.0).r; - float zdepth = linear_depth(depth); - float coc_signed = calculate_coc(zdepth); - float coc_far = max(-coc_signed, 0.0); - float coc_near = max(coc_signed, 0.0); - - vec4 focus_col = textureLod(colorBuffer, uv, 0.0); - - vec2 texelSize = vec2(0.5, 1.0) / vec2(textureSize(scatterBuffer, 0)); - vec2 near_uv = uv * vec2(0.5, 1.0); - vec2 far_uv = near_uv + vec2(0.5, 0.0); - vec4 near_col = upsample_filter(scatterBuffer, near_uv, texelSize); - vec4 far_col = upsample_filter(scatterBuffer, far_uv, texelSize); - - float far_w = far_col.a; - float near_w = near_col.a; - float focus_w = 1.0 - smoothstep(1.0, MERGE_THRESHOLD, abs(coc_signed)); - float inv_weight_sum = 1.0 / (near_w + focus_w + far_w); - - focus_col *= focus_w; /* Premul */ - -# ifdef USE_ALPHA_DOF - near_col.a = upsample_filter(scatterAlphaBuffer, near_uv, texelSize).r; - far_col.a = upsample_filter(scatterAlphaBuffer, far_uv, texelSize).r; -# endif - - fragColor = (far_col + near_col + focus_col) * inv_weight_sum; - -# ifdef USE_ALPHA_DOF - /* Sigh... viewport expect premult output but - * the final render output needs to be with - * associated alpha. */ - if (unpremult) { - fragColor.rgb /= (fragColor.a > 0.0) ? fragColor.a : 1.0; - } -# endif -} - -#endif diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_gather_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_gather_frag.glsl new file mode 100644 index 00000000000..79c95b6d433 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_gather_frag.glsl @@ -0,0 +1,293 @@ + +/** + * Gather pass: Convolve foreground and background parts in separate passes. + * + * Using the min&max CoC tile buffer, we select the best apropriate method to blur the scene color. + * A fast gather path is taken if there is not many CoC variation inside the tile. + * + * We sample using an octaweb sampling pattern. We randomize the kernel center and each ring + * rotation to ensure maximum coverage. + **/ + +#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +/* Mipmapped input buffers, halfres but with padding to ensure mipmap alignement. */ +uniform sampler2D colorBuffer; +uniform sampler2D cocBuffer; + +/* Same input buffer but with a bilinear sampler object. */ +uniform sampler2D colorBufferBilinear; + +/* CoC Min&Max tile buffer at 1/16th of fullres. */ +uniform sampler2D cocTilesFgBuffer; +uniform sampler2D cocTilesBgBuffer; + +uniform sampler2D bokehLut; + +/* Used to correct the padding in the color and CoC buffers. */ +uniform vec2 gatherInputUvCorrection; + +uniform vec2 gatherOutputTexelSize; + +uniform vec2 bokehAnisotropy; + +layout(location = 0) out vec4 outColor; +layout(location = 1) out float outWeight; +#ifndef DOF_HOLEFILL_PASS +layout(location = 2) out vec2 outOcclusion; +#else + +/* Dirty global variable that isn't used. So it should get optimized out. */ +vec2 outOcclusion; +#endif + +#ifdef DOF_FOREGROUND_PASS +const bool is_foreground = true; +#else /* DOF_BACKGROUND_PASS */ +const bool is_foreground = false; +#endif + +const float unit_ring_radius = 1.0 / float(gather_ring_count); +const float unit_sample_radius = 1.0 / float(gather_ring_count + 0.5); +const float large_kernel_radius = 0.5 + float(gather_ring_count); +const float smaller_kernel_radius = 0.5 + float(gather_ring_count - gather_density_change_ring); +/* NOTE(fclem) the bias is reducing issues with density change visible transition. */ +const float radius_downscale_factor = smaller_kernel_radius / large_kernel_radius; +const int change_density_at_ring = (gather_ring_count - gather_density_change_ring + 1); +const float coc_radius_error = 2.0; + +/* Radii needs to be halfres CoC sizes. */ +bool dof_do_density_change(float base_radius, float min_intersectable_radius) +{ + /* Reduce artifact for very large blur. */ + min_intersectable_radius *= 0.1; + + bool need_new_density = (base_radius * unit_ring_radius > min_intersectable_radius); + bool larger_than_min_density = (base_radius * radius_downscale_factor > + float(gather_ring_count)); + + return need_new_density && larger_than_min_density; +} + +void dof_gather_init(float base_radius, + vec4 noise, + out vec2 center_co, + out float lod, + out float intersection_multiplier) +{ + /* Jitter center half a ring to reduce undersampling. */ + vec2 jitter_ofs = 0.499 * noise.zw * sqrt(noise.x); +#ifdef DOF_BOKEH_TEXTURE + jitter_ofs *= bokehAnisotropy; +#endif + center_co = gl_FragCoord.xy + jitter_ofs * base_radius * unit_sample_radius; + + /* TODO(fclem) Seems like the default lod selection is too big. Bias to avoid blocky moving + * out of focus shapes. */ + const float lod_bias = -2.0; + lod = max(floor(log2(base_radius * unit_sample_radius) + 0.5) + lod_bias, 0.0); + + if (no_gather_mipmaps) { + lod = 0.0; + } + /* (Slide 64). */ + intersection_multiplier = pow(0.5, lod); +} + +void dof_gather_accumulator(float base_radius, + float min_intersectable_radius, + const bool do_fast_gather, + const bool do_density_change) +{ + vec4 noise = no_gather_random ? vec4(0.0, 0.0, 0.0, 1.0) : texelfetch_noise_tex(gl_FragCoord.xy); + + if (!do_fast_gather) { + /* Jitter the radius to reduce noticeable density changes. */ + base_radius += noise.x * unit_ring_radius * base_radius; + } + else { + /* Jittering the radius more than we need means we are going to feather the bokeh shape half + * a ring. So we need to compensate for fast gather that does not check CoC intersection. */ + base_radius += (0.5 - noise.x) * 1.5 * unit_ring_radius * base_radius; + } + /* TODO(fclem) another seed? For now Cranly-Partterson rotation with golden ratio. */ + noise.x = fract(noise.x + 0.61803398875); + + float lod, isect_mul; + vec2 center_co; + dof_gather_init(base_radius, noise, center_co, lod, isect_mul); + + bool first_ring = true; + + DofGatherData accum_data = GATHER_DATA_INIT; + + int density_change = 0; + for (int ring = gather_ring_count; ring > 0; ring--) { + int sample_pair_count = gather_ring_density * ring; + + float step_rot = M_PI / float(sample_pair_count); + mat2 step_rot_mat = rot2_from_angle(step_rot); + + float angle_offset = noise.y * step_rot; + vec2 offset = vec2(cos(angle_offset), sin(angle_offset)); + + float ring_radius = float(ring) * unit_sample_radius * base_radius; + + /* Slide 38. */ + float bordering_radius = ring_radius + + (0.5 + coc_radius_error) * base_radius * unit_sample_radius; + DofGatherData ring_data = GATHER_DATA_INIT; + for (int sample_pair = 0; sample_pair < sample_pair_count; sample_pair++) { + offset = step_rot_mat * offset; + + DofGatherData pair_data[2]; + for (int i = 0; i < 2; i++) { + vec2 offset_co = ((i == 0) ? offset : -offset); +#ifdef DOF_BOKEH_TEXTURE + /* Scaling to 0.25 for speed. Improves texture cache hit. */ + offset_co = texture(bokehLut, offset_co * 0.25 + 0.5).rg; + offset_co *= bokehAnisotropy; +#endif + vec2 sample_co = center_co + offset_co * ring_radius; + vec2 sample_uv = sample_co * gatherOutputTexelSize * gatherInputUvCorrection; + if (do_fast_gather) { + pair_data[i].color = dof_load_gather_color(colorBufferBilinear, sample_uv, lod); + } + else { + pair_data[i].color = dof_load_gather_color(colorBuffer, sample_uv, lod); + } + pair_data[i].coc = dof_load_gather_coc(cocBuffer, sample_uv, lod); + pair_data[i].dist = ring_radius; + } + + dof_gather_accumulate_sample_pair(pair_data, + bordering_radius, + isect_mul, + first_ring, + do_fast_gather, + is_foreground, + ring_data, + accum_data); + } + +#ifdef DOF_FOREGROUND_PASS /* Reduce issue with closer foreground over distant foreground. */ + /* TODO(fclem) this seems to not be completely correct as the issue remains. */ + float ring_area = (sqr(float(ring) + 0.5 + coc_radius_error) - + sqr(float(ring) - 0.5 + coc_radius_error)) * + sqr(base_radius * unit_sample_radius); + dof_gather_ammend_weight(ring_data, ring_area); +#endif + + dof_gather_accumulate_sample_ring( + ring_data, sample_pair_count * 2, first_ring, do_fast_gather, is_foreground, accum_data); + + first_ring = false; + + if (do_density_change && (ring == change_density_at_ring) && + (density_change < gather_max_density_change)) { + if (dof_do_density_change(base_radius, min_intersectable_radius)) { + base_radius *= radius_downscale_factor; + ring += gather_density_change_ring; + /* We need to account for the density change in the weights (slide 62). + * For that multiply old kernel data by its area divided by the new kernel area. */ + const float outer_rings_weight = 1.0 / (radius_downscale_factor * radius_downscale_factor); +#ifndef DOF_FOREGROUND_PASS /* Samples are already weighted per ring in foreground pass. */ + dof_gather_ammend_weight(accum_data, outer_rings_weight); +#endif + /* Re-init kernel position & sampling parameters. */ + dof_gather_init(base_radius, noise, center_co, lod, isect_mul); + density_change++; + } + } + } + + { + /* Center sample. */ + vec2 sample_uv = center_co * gatherOutputTexelSize * gatherInputUvCorrection; + DofGatherData center_data; + if (do_fast_gather) { + center_data.color = dof_load_gather_color(colorBufferBilinear, sample_uv, lod); + } + else { + center_data.color = dof_load_gather_color(colorBuffer, sample_uv, lod); + } + center_data.coc = dof_load_gather_coc(cocBuffer, sample_uv, lod); + center_data.dist = 0.0; + + /* Slide 38. */ + float bordering_radius = (0.5 + coc_radius_error) * base_radius * unit_sample_radius; + + dof_gather_accumulate_center_sample( + center_data, bordering_radius, do_fast_gather, is_foreground, accum_data); + } + + int total_sample_count = dof_gather_total_sample_count_with_density_change( + gather_ring_count, gather_ring_density, density_change); + dof_gather_accumulate_resolve(total_sample_count, accum_data, outColor, outWeight, outOcclusion); + +#if defined(DOF_DEBUG_GATHER_PERF) + if (density_change > 0) { + float fac = saturate(float(density_change) / float(10.0)); + outColor.rgb = avg(outColor.rgb) * neon_gradient(fac); + } + if (do_fast_gather) { + outColor.rgb = avg(outColor.rgb) * vec3(0.0, 1.0, 0.0); + } +#elif defined(DOF_DEBUG_SCATTER_PERF) + outColor.rgb = avg(outColor.rgb) * vec3(0.0, 1.0, 0.0); +#endif + + /* Output premultiplied color so we can use bilinear sampler in resolve pass. */ + outColor *= outWeight; +} + +void main() +{ + ivec2 tile_co = ivec2(gl_FragCoord.xy / float(DOF_TILE_DIVISOR / 2)); + CocTile coc_tile = dof_coc_tile_load(cocTilesFgBuffer, cocTilesBgBuffer, tile_co); + CocTilePrediction prediction = dof_coc_tile_prediction_get(coc_tile); + +#if defined(DOF_FOREGROUND_PASS) + float base_radius = -coc_tile.fg_min_coc; + float min_radius = -coc_tile.fg_max_coc; + float min_intersectable_radius = -coc_tile.fg_max_intersectable_coc; + bool can_early_out = !prediction.do_foreground; + +#elif defined(DOF_HOLEFILL_PASS) + float base_radius = -coc_tile.fg_min_coc; + float min_radius = -coc_tile.fg_max_coc; + float min_intersectable_radius = DOF_TILE_LARGE_COC; + bool can_early_out = !prediction.do_holefill; + +#else /* DOF_BACKGROUND_PASS */ + float base_radius = coc_tile.bg_max_coc; + float min_radius = coc_tile.bg_min_coc; + float min_intersectable_radius = coc_tile.bg_min_intersectable_coc; + bool can_early_out = !prediction.do_background; +#endif + + bool do_fast_gather = dof_do_fast_gather(base_radius, min_radius, is_foreground); + + /* Gather at half resolution. Divide CoC by 2. */ + base_radius *= 0.5; + min_intersectable_radius *= 0.5; + + bool do_density_change = dof_do_density_change(base_radius, min_intersectable_radius); + + if (can_early_out) { + /* Early out. */ + outColor = vec4(0.0); + outWeight = 0.0; + outOcclusion = vec2(0.0, 0.0); + } + else if (do_fast_gather) { + dof_gather_accumulator(base_radius, min_intersectable_radius, true, false); + } + else if (do_density_change) { + dof_gather_accumulator(base_radius, min_intersectable_radius, false, true); + } + else { + dof_gather_accumulator(base_radius, min_intersectable_radius, false, false); + } +} \ No newline at end of file diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_lib.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_lib.glsl new file mode 100644 index 00000000000..88d83cd913a --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_lib.glsl @@ -0,0 +1,631 @@ + +#pragma BLENDER_REQUIRE(common_view_lib.glsl) +#pragma BLENDER_REQUIRE(common_math_lib.glsl) + +uniform vec4 cocParams; + +#define cocMul cocParams[0] /* distance * aperturesize * invsensorsize */ +#define cocBias cocParams[1] /* aperturesize * invsensorsize */ +#define cocNear cocParams[2] /* Near view depths value. */ +#define cocFar cocParams[3] /* Far view depths value. */ + +/* -------------- Debug Defines ------------- */ + +// #define DOF_DEBUG_GATHER_PERF +// #define DOF_DEBUG_SCATTER_PERF + +const bool no_smooth_intersection = false; +const bool no_gather_occlusion = false; +const bool no_gather_mipmaps = false; +const bool no_gather_random = false; +const bool no_gather_filtering = false; +const bool no_scatter_occlusion = false; +const bool no_scatter_pass = false; +const bool no_foreground_pass = false; +const bool no_background_pass = false; +const bool no_slight_focus_pass = false; +const bool no_focus_pass = false; +const bool no_holefill_pass = false; + +/* -------------- Quality Defines ------------- */ + +#ifdef DOF_HOLEFILL_PASS +/* No need for very high density for holefill. */ +const int gather_ring_count = 3; +const int gather_ring_density = 3; +const int gather_max_density_change = 0; +const int gather_density_change_ring = 1; +#else +const int gather_ring_count = DOF_GATHER_RING_COUNT; +const int gather_ring_density = 3; +const int gather_max_density_change = 50; /* Dictates the maximum good quality blur. */ +const int gather_density_change_ring = 1; +#endif + +/* -------------- Utils ------------- */ + +const vec2 quad_offsets[4] = vec2[4]( + vec2(-0.5, 0.5), vec2(0.5, 0.5), vec2(0.5, -0.5), vec2(-0.5, -0.5)); + +/* Divide by sensor size to get the normalized size. */ +#define calculate_coc_persp(zdepth) (cocMul / zdepth - cocBias) +#define calculate_coc_ortho(zdepth) ((zdepth + cocMul / cocBias) * cocMul) +#define calculate_coc(z) \ + (ProjectionMatrix[3][3] == 0.0) ? calculate_coc_persp(z) : calculate_coc_ortho(z) + +/* Ortho conversion is only true for camera view! */ +#define linear_depth_persp(d) ((cocNear * cocFar) / (d * (cocNear - cocFar) + cocFar)) +#define linear_depth_ortho(d) (d * (cocNear - cocFar) + cocNear) + +#define linear_depth(d) \ + ((ProjectionMatrix[3][3] == 0.0) ? linear_depth_persp(d) : linear_depth_ortho(d)) + +#define dof_coc_from_zdepth(d) calculate_coc(linear_depth(d)) + +vec4 safe_color(vec4 c) +{ + /* Clamp to avoid black square artifacts if a pixel goes NaN. */ + return clamp(c, vec4(0.0), vec4(1e20)); /* 1e20 arbitrary. */ +} + +float dof_hdr_color_weight(vec4 color) +{ + /* From UE4. Very fast "luma" weighting. */ + float luma = (color.g * 2.0) + (color.r + color.b); + /* TODO(fclem) Pass correct exposure. */ + const float exposure = 1.0; + return 1.0 / (luma * exposure + 4.0); +} + +float dof_coc_select(vec4 cocs) +{ + /* Select biggest coc. */ + float selected_coc = cocs.x; + if (abs(cocs.y) > abs(selected_coc)) { + selected_coc = cocs.y; + } + if (abs(cocs.z) > abs(selected_coc)) { + selected_coc = cocs.z; + } + if (abs(cocs.w) > abs(selected_coc)) { + selected_coc = cocs.w; + } + return selected_coc; +} + +/* NOTE: Do not forget to normalize weights afterwards. */ +vec4 dof_downsample_bilateral_coc_weights(vec4 cocs) +{ + float chosen_coc = dof_coc_select(cocs); + + const float scale = 4.0; /* TODO(fclem) revisit. */ + /* NOTE: The difference between the cocs should be inside a abs() function, + * but we follow UE4 implementation to improve how dithered transparency looks (see slide 19). */ + return saturate(1.0 - (chosen_coc - cocs) * scale); +} + +/* NOTE: Do not forget to normalize weights afterwards. */ +vec4 dof_downsample_bilateral_color_weights(vec4 colors[4]) +{ + vec4 weights; + for (int i = 0; i < 4; i++) { + weights[i] = dof_hdr_color_weight(colors[i]); + } + return weights; +} + +/* Makes sure the load functions distribute the energy correctly + * to both scatter and gather passes. */ +vec4 dof_load_gather_color(sampler2D gather_input_color_buffer, vec2 uv, float lod) +{ + vec4 color = textureLod(gather_input_color_buffer, uv, lod); + return color; +} + +vec4 dof_load_scatter_color(sampler2D scatter_input_color_buffer, vec2 uv, float lod) +{ + vec4 color = textureLod(scatter_input_color_buffer, uv, lod); + return color; +} + +float dof_load_gather_coc(sampler2D gather_input_coc_buffer, vec2 uv, float lod) +{ + float coc = textureLod(gather_input_coc_buffer, uv, lod).r; + /* We gather at halfres. CoC must be divided by 2 to be compared against radii. */ + return coc * 0.5; +} + +/* Distribute weights between near/slightfocus/far fields (slide 117). */ +const float layer_threshold = 4.0; +/* Make sure it overlaps. */ +const float layer_offset_fg = 0.5 + 1.0; +/* Extra offset for convolution layers to avoid light leaking from background. */ +const float layer_offset = 0.5 + 0.5; + +#define DOF_MAX_SLIGHT_FOCUS_RADIUS 5 + +float dof_layer_weight(float coc, const bool is_foreground) +{ +/* NOTE: These are fullres pixel CoC value. */ +#ifdef DOF_RESOLVE_PASS + return saturate(-abs(coc) + layer_threshold + layer_offset) * + float(is_foreground ? (coc <= 0.5) : (coc > -0.5)); +#else + coc *= 2.0; /* Account for half pixel gather. */ + float threshold = layer_threshold - ((is_foreground) ? layer_offset_fg : layer_offset); + return saturate(((is_foreground) ? -coc : coc) - threshold); +#endif +} +vec4 dof_layer_weight(vec4 coc) +{ + /* NOTE: Used for scatter pass which already flipped the sign correctly. */ + coc *= 2.0; /* Account for half pixel gather. */ + return saturate(coc - layer_threshold + layer_offset); +} + +/* NOTE: This is halfres CoC radius. */ +float dof_sample_weight(float coc) +{ + /* Full intensity if CoC radius is below the pixel footprint. */ + const float min_coc = 1.0; + coc = max(min_coc, abs(coc)); + return (M_PI * min_coc * min_coc) / (M_PI * coc * coc); +} +vec4 dof_sample_weight(vec4 coc) +{ + /* Full intensity if CoC radius is below the pixel footprint. */ + const float min_coc = 1.0; + coc = max(vec4(min_coc), abs(coc)); + return (M_PI * min_coc * min_coc) / (M_PI * coc * coc); +} + +/* Intersection with the center of the kernel. */ +float dof_intersection_weight(float coc, float distance_from_center, float intersection_multiplier) +{ + if (no_smooth_intersection) { + return step(0.0, (abs(coc) - distance_from_center)); + } + else { + /* (Slide 64). */ + return saturate((abs(coc) - distance_from_center) * intersection_multiplier + 0.5); + } +} + +/* Returns weight of the sample for the outer bucket (containing previous rings). */ +float dof_gather_accum_weight(float coc, float bordering_radius, bool first_ring) +{ + /* First ring has nothing to be mixed against. */ + if (first_ring) { + return 0.0; + } + return saturate(coc - bordering_radius); +} + +bool dof_do_fast_gather(float max_absolute_coc, float min_absolute_coc, const bool is_foreground) +{ + float min_weight = dof_layer_weight((is_foreground) ? -min_absolute_coc : min_absolute_coc, + is_foreground); + if (min_weight < 1.0) { + return false; + } + /* FIXME(fclem): This is a workaround to fast gather triggering too early. + * Since we use custom opacity mask, the opacity is not given to be 100% even for + * after normal threshold. */ + if (is_foreground && min_absolute_coc < layer_threshold) { + return false; + } + return (max_absolute_coc - min_absolute_coc) < (DOF_FAST_GATHER_COC_ERROR * max_absolute_coc); +} + +/* ------------------- COC TILES UTILS ------------------- */ + +struct CocTile { + float fg_min_coc; + float fg_max_coc; + float fg_max_intersectable_coc; + float fg_slight_focus_max_coc; + float bg_min_coc; + float bg_max_coc; + float bg_min_intersectable_coc; +}; + +struct CocTilePrediction { + bool do_foreground; + bool do_slight_focus; + bool do_focus; + bool do_background; + bool do_holefill; +}; + +/* WATCH: Might have to change depending on the texture format. */ +#define DOF_TILE_DEFOCUS 0.25 +#define DOF_TILE_FOCUS 0.0 +#define DOF_TILE_MIXED 0.75 +#define DOF_TILE_LARGE_COC 1024.0 + +/* Init a CoC tile for reduction algorithms. */ +CocTile dof_coc_tile_init(void) +{ + CocTile tile; + tile.fg_min_coc = 0.0; + tile.fg_max_coc = -DOF_TILE_LARGE_COC; + tile.fg_max_intersectable_coc = DOF_TILE_LARGE_COC; + tile.fg_slight_focus_max_coc = -1.0; + tile.bg_min_coc = DOF_TILE_LARGE_COC; + tile.bg_max_coc = 0.0; + tile.bg_min_intersectable_coc = DOF_TILE_LARGE_COC; + return tile; +} + +CocTile dof_coc_tile_load(sampler2D fg_buffer, sampler2D bg_buffer, ivec2 tile_co) +{ + ivec2 tex_size = textureSize(fg_buffer, 0).xy; + tile_co = clamp(tile_co, ivec2(0), tex_size - 1); + + vec4 fg = texelFetch(fg_buffer, tile_co, 0); + vec3 bg = texelFetch(bg_buffer, tile_co, 0).xyz; + + CocTile tile; + tile.fg_min_coc = -fg.x; + tile.fg_max_coc = -fg.y; + tile.fg_max_intersectable_coc = -fg.z; + tile.fg_slight_focus_max_coc = fg.w; + tile.bg_min_coc = bg.x; + tile.bg_max_coc = bg.y; + tile.bg_min_intersectable_coc = bg.z; + return tile; +} + +void dof_coc_tile_store(CocTile tile, out vec4 out_fg, out vec3 out_bg) +{ + out_fg.x = -tile.fg_min_coc; + out_fg.y = -tile.fg_max_coc; + out_fg.z = -tile.fg_max_intersectable_coc; + out_fg.w = tile.fg_slight_focus_max_coc; + out_bg.x = tile.bg_min_coc; + out_bg.y = tile.bg_max_coc; + out_bg.z = tile.bg_min_intersectable_coc; +} + +CocTilePrediction dof_coc_tile_prediction_get(CocTile tile) +{ + /* Based on tile value, predict what pass we need to load. */ + CocTilePrediction predict; + + predict.do_foreground = (-tile.fg_min_coc > layer_threshold - layer_offset_fg); + bool fg_fully_opaque = predict.do_foreground && + dof_do_fast_gather(-tile.fg_min_coc, -tile.fg_max_coc, true); + + predict.do_slight_focus = !fg_fully_opaque && (tile.fg_slight_focus_max_coc >= 0.5); + predict.do_focus = !fg_fully_opaque && (tile.fg_slight_focus_max_coc == DOF_TILE_FOCUS); + + predict.do_background = !predict.do_focus && !fg_fully_opaque && + (tile.bg_max_coc > layer_threshold - layer_offset); + bool bg_fully_opaque = predict.do_background && + dof_do_fast_gather(-tile.bg_max_coc, tile.bg_min_coc, false); + predict.do_holefill = !predict.do_focus && !fg_fully_opaque && -tile.fg_max_coc > 0.0; + +#if 0 /* Debug */ + predict.do_foreground = predict.do_background = predict.do_holefill = true; +#endif + return predict; +} + +/* Special function to return the correct max value of 2 slight focus coc. */ +float dof_coc_max_slight_focus(float coc1, float coc2) +{ + /* Do not consider values below 0.5 for expansion as they are "encoded". + * See setup pass shader for more infos. */ + if ((coc1 == DOF_TILE_DEFOCUS && coc2 == DOF_TILE_FOCUS) || + (coc1 == DOF_TILE_FOCUS && coc2 == DOF_TILE_DEFOCUS)) { + /* Tile where completely out of focus and in focus are both present. + * Consider as very slightly out of focus. */ + return DOF_TILE_MIXED; + } + return max(coc1, coc2); +} + +/* ------------------- GATHER UTILS ------------------- */ + +struct DofGatherData { + vec4 color; + float weight; + float dist; /* TODO remove */ + /* For scatter occlusion. */ + float coc; + float coc_sqr; + /* For ring bucket merging. */ + float transparency; + + float layer_opacity; +}; + +#define GATHER_DATA_INIT DofGatherData(vec4(0.0), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) + +void dof_gather_ammend_weight(inout DofGatherData sample_data, float weight) +{ + sample_data.color *= weight; + sample_data.coc *= weight; + sample_data.coc_sqr *= weight; + sample_data.weight *= weight; +} + +void dof_gather_accumulate_sample(DofGatherData sample_data, + float weight, + inout DofGatherData accum_data) +{ + accum_data.color += sample_data.color * weight; + accum_data.coc += sample_data.coc * weight; + accum_data.coc_sqr += sample_data.coc * (sample_data.coc * weight); + accum_data.weight += weight; +} + +void dof_gather_accumulate_sample_pair(DofGatherData pair_data[2], + float bordering_radius, + float intersection_multiplier, + bool first_ring, + const bool do_fast_gather, + const bool is_foreground, + inout DofGatherData ring_data, + inout DofGatherData accum_data) +{ + if (do_fast_gather) { + for (int i = 0; i < 2; i++) { + dof_gather_accumulate_sample(pair_data[i], 1.0, accum_data); + accum_data.layer_opacity += 1.0; + } + return; + } + +#if 0 + const float mirroring_threshold = -layer_threshold - layer_offset; + /* TODO(fclem) Promote to parameter? dither with Noise? */ + const float mirroring_min_distance = 15.0; + if (pair_data[0].coc < mirroring_threshold && + (pair_data[1].coc - mirroring_min_distance) > pair_data[0].coc) { + pair_data[1].coc = pair_data[0].coc; + } + else if (pair_data[1].coc < mirroring_threshold && + (pair_data[0].coc - mirroring_min_distance) > pair_data[1].coc) { + pair_data[0].coc = pair_data[1].coc; + } +#endif + + for (int i = 0; i < 2; i++) { + float sample_weight = dof_sample_weight(pair_data[i].coc); + float layer_weight = dof_layer_weight(pair_data[i].coc, is_foreground); + float inter_weight = dof_intersection_weight( + pair_data[i].coc, pair_data[i].dist, intersection_multiplier); + float weight = inter_weight * layer_weight * sample_weight; + + /** + * If a CoC is larger than bordering radius we accumulate it to the general accumulator. + * If not, we accumulate to the ring bucket. This is to have more consistent sample occlusion. + **/ + float accum_weight = dof_gather_accum_weight(pair_data[i].coc, bordering_radius, first_ring); + dof_gather_accumulate_sample(pair_data[i], weight * accum_weight, accum_data); + dof_gather_accumulate_sample(pair_data[i], weight * (1.0 - accum_weight), ring_data); + + accum_data.layer_opacity += layer_weight; + + if (is_foreground) { + ring_data.transparency += 1.0 - inter_weight * layer_weight; + } + else { + float coc = is_foreground ? -pair_data[i].coc : pair_data[i].coc; + ring_data.transparency += saturate(coc - bordering_radius); + } + } +} + +void dof_gather_accumulate_sample_ring(DofGatherData ring_data, + int sample_count, + bool first_ring, + const bool do_fast_gather, + /* accum_data occludes the ring_data if true. */ + const bool reversed_occlusion, + inout DofGatherData accum_data) +{ + if (do_fast_gather) { + /* Do nothing as ring_data contains nothing. All samples are already in accum_data. */ + return; + } + + if (first_ring) { + /* Layer opacity is directly accumulated into accum_data data. */ + accum_data.color = ring_data.color; + accum_data.coc = ring_data.coc; + accum_data.coc_sqr = ring_data.coc_sqr; + accum_data.weight = ring_data.weight; + + accum_data.transparency = ring_data.transparency / float(sample_count); + return; + } + + if (ring_data.weight == 0.0) { + return; + } + + float ring_avg_coc = ring_data.coc / ring_data.weight; + float accum_avg_coc = accum_data.coc / accum_data.weight; + + /* Smooth test to set opacity to see if the ring average coc occludes the accumulation. + * Test is reversed to be multiplied against opacity. */ + float ring_occlu = saturate(accum_avg_coc - ring_avg_coc); + /* The bias here is arbitrary. Seems to avoid weird looking foreground in most cases. + * We might need to make it a parameter or find a relative bias. */ + float accum_occlu = saturate((ring_avg_coc - accum_avg_coc) * 0.1 - 1.0); + +#ifdef DOF_RESOLVE_PASS + ring_occlu = accum_occlu = 0.0; +#endif + + if (no_gather_occlusion) { + ring_occlu = 0.0; + accum_occlu = 0.0; + } + + /* (Slide 40) */ + float ring_opacity = saturate(1.0 - ring_data.transparency / float(sample_count)); + float accum_opacity = 1.0 - accum_data.transparency; + + if (reversed_occlusion) { + /* Accum_data occludes the ring. */ + float alpha = (accum_data.weight == 0.0) ? 0.0 : accum_opacity * accum_occlu; + float one_minus_alpha = 1.0 - alpha; + + accum_data.color += ring_data.color * one_minus_alpha; + accum_data.coc += ring_data.coc * one_minus_alpha; + accum_data.coc_sqr += ring_data.coc_sqr * one_minus_alpha; + accum_data.weight += ring_data.weight * one_minus_alpha; + + accum_data.transparency *= 1.0 - ring_opacity; + } + else { + /* Ring occludes the accum_data (Same as reference). */ + float alpha = (accum_data.weight == 0.0) ? 1.0 : (ring_opacity * ring_occlu); + float one_minus_alpha = 1.0 - alpha; + + accum_data.color = accum_data.color * one_minus_alpha + ring_data.color; + accum_data.coc = accum_data.coc * one_minus_alpha + ring_data.coc; + accum_data.coc_sqr = accum_data.coc_sqr * one_minus_alpha + ring_data.coc_sqr; + accum_data.weight = accum_data.weight * one_minus_alpha + ring_data.weight; + } +} + +/* FIXME(fclem) Seems to be wrong since it needs ringcount+1 as input for slightfocus gather. */ +int dof_gather_total_sample_count(const int ring_count, const int ring_density) +{ + return (ring_count * ring_count - ring_count) * ring_density + 1; +} + +void dof_gather_accumulate_center_sample(DofGatherData center_data, + float bordering_radius, +#ifdef DOF_RESOLVE_PASS + int i_radius, +#endif + const bool do_fast_gather, + const bool is_foreground, + inout DofGatherData accum_data) +{ + float layer_weight = dof_layer_weight(center_data.coc, is_foreground); + float sample_weight = dof_sample_weight(center_data.coc); + float weight = layer_weight * sample_weight; + float accum_weight = dof_gather_accum_weight(center_data.coc, bordering_radius, false); + + if (do_fast_gather) { + /* Hope for the compiler to optimize the above. */ + layer_weight = 1.0; + sample_weight = 1.0; + accum_weight = 1.0; + weight = 1.0; + } + + center_data.transparency = 1.0 - weight; + + dof_gather_accumulate_sample(center_data, weight * accum_weight, accum_data); + + if (!do_fast_gather) { +#ifdef DOF_RESOLVE_PASS + /* NOTE(fclem): Hack to smooth transition to full in-focus opacity. */ + int total_sample_count = dof_gather_total_sample_count(i_radius + 1, DOF_SLIGHT_FOCUS_DENSITY); + float fac = saturate(1.0 - abs(center_data.coc) / float(layer_threshold)); + accum_data.layer_opacity += float(total_sample_count) * fac * fac; +#endif + accum_data.layer_opacity += layer_weight; + + /* Logic of dof_gather_accumulate_sample(). */ + weight *= (1.0 - accum_weight); + center_data.coc_sqr = center_data.coc * (center_data.coc * weight); + center_data.color *= weight; + center_data.coc *= weight; + center_data.weight = weight; + +#ifdef DOF_FOREGROUND_PASS /* Reduce issue with closer foreground over distant foreground. */ + float ring_area = sqr(bordering_radius); + dof_gather_ammend_weight(center_data, ring_area); +#endif + + /* Accumulate center as its own ring. */ + dof_gather_accumulate_sample_ring( + center_data, 1, false, do_fast_gather, is_foreground, accum_data); + } +} + +int dof_gather_total_sample_count_with_density_change(const int ring_count, + const int ring_density, + int density_change) +{ + int sample_count_per_density_change = dof_gather_total_sample_count(ring_count, ring_density) - + dof_gather_total_sample_count( + ring_count - gather_density_change_ring, ring_density); + + return dof_gather_total_sample_count(ring_count, ring_density) + + sample_count_per_density_change * density_change; +} + +void dof_gather_accumulate_resolve(int total_sample_count, + DofGatherData accum_data, + out vec4 out_col, + out float out_weight, + out vec2 out_occlusion) +{ + float weight_inv = safe_rcp(accum_data.weight); + out_col = accum_data.color * weight_inv; + out_occlusion = vec2(abs(accum_data.coc), accum_data.coc_sqr) * weight_inv; + +#ifdef DOF_FOREGROUND_PASS + out_weight = 1.0 - accum_data.transparency; +#else + if (accum_data.weight > 0.0) { + out_weight = accum_data.layer_opacity / float(total_sample_count); + } + else { + out_weight = 0.0; + } +#endif + /* Gathering may not accumulate to 1.0 alpha because of float precision. */ + if (out_weight > 0.99) { + out_weight = 1.0; + } + else if (out_weight < 0.01) { + out_weight = 0.0; + } + /* Same thing for alpha channel. */ + if (out_col.a > 0.99) { + out_col.a = 1.0; + } + else if (out_col.a < 0.01) { + out_col.a = 0.0; + } +} + +ivec2 dof_square_ring_sample_offset(int ring_distance, int sample_id) +{ + /** + * Generate samples in a square pattern with the ring radius. X is the center tile. + * + * Dist1 Dist2 + * 6 5 4 3 2 + * 3 2 1 7 1 + * . X 0 . X 0 + * . . . . . + * . . . . . + * + * Samples are expected to be mirrored to complete the pattern. + **/ + ivec2 offset; + if (sample_id < ring_distance) { + offset.x = ring_distance; + offset.y = sample_id; + } + else if (sample_id < ring_distance * 3) { + offset.x = ring_distance - sample_id + ring_distance; + offset.y = ring_distance; + } + else { + offset.x = -ring_distance; + offset.y = ring_distance - sample_id + 3 * ring_distance; + } + return offset; +} \ No newline at end of file diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_reduce_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_reduce_frag.glsl new file mode 100644 index 00000000000..51a139ad343 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_reduce_frag.glsl @@ -0,0 +1,179 @@ + +/** + * Reduce pass: Downsample the color buffer to generate mipmaps. + * Also decide if a pixel is to be convolved by scattering or gathering during the first pass. + **/ + +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +/** Inputs: + * COPY_PASS: Is output of setup pass (halfres) and downsample pass (quarter res). + * REDUCE_PASS: Is previous Gather input miplvl (halfres >> miplvl). + **/ +uniform sampler2D colorBuffer; +uniform sampler2D cocBuffer; +uniform sampler2D downsampledBuffer; + +uniform vec2 bokehAnisotropy; +uniform float scatterColorThreshold; +uniform float scatterCocThreshold; +uniform float scatterColorNeighborMax; +uniform float colorNeighborClamping; + +/** Outputs: + * COPY_PASS: Gather input mip0. + * REDUCE_PASS: Is next Gather input miplvl (halfres >> miplvl). + **/ +layout(location = 0) out vec4 outColor; +layout(location = 1) out float outCoc; + +#ifdef COPY_PASS + +layout(location = 2) out vec3 outScatterColor; + +/* NOTE: Do not compare alpha as it is not scattered by the scatter pass. */ +float dof_scatter_neighborhood_rejection(vec3 color) +{ + color = min(vec3(scatterColorNeighborMax), color); + + float validity = 0.0; + + /* Centered in the middle of 4 quarter res texel. */ + vec2 texel_size = 1.0 / vec2(textureSize(downsampledBuffer, 0).xy); + vec2 uv = (gl_FragCoord.xy * 0.5) * texel_size; + + vec3 max_diff = vec3(0.0); + for (int i = 0; i < 4; i++) { + vec2 sample_uv = uv + quad_offsets[i] * texel_size; + vec3 ref = textureLod(downsampledBuffer, sample_uv, 0.0).rgb; + + ref = min(vec3(scatterColorNeighborMax), ref); + float diff = max_v3(max(vec3(0.0), abs(ref - color))); + + const float rejection_threshold = 0.7; + diff = saturate(diff / rejection_threshold - 1.0); + validity = max(validity, diff); + } + + return validity; +} + +/* This avoids sprite popping in and out at the screen border and + * drawing sprites larger than the screen. */ +float dof_scatter_screen_border_rejection(float coc, vec2 uv, vec2 screen_size) +{ + vec2 screen_pos = uv * screen_size; + float min_screen_border_distance = min_v2(min(screen_pos, screen_size - screen_pos)); + /* Fullres to halfres CoC. */ + coc *= 0.5; + /* Allow 10px transition. */ + const float rejection_hardeness = 1.0 / 10.0; + return saturate((min_screen_border_distance - abs(coc)) * rejection_hardeness + 1.0); +} + +float dof_scatter_luminosity_rejection(vec3 color) +{ + const float rejection_hardness = 1.0; + return saturate(max_v3(color - scatterColorThreshold) * rejection_hardness); +} + +float dof_scatter_coc_radius_rejection(float coc) +{ + const float rejection_hardness = 0.3; + return saturate((abs(coc) - scatterCocThreshold) * rejection_hardness); +} + +float fast_luma(vec3 color) +{ + return (2.0 * color.g) + color.r + color.b; +} + +/* Lightweight version of neighborhood clamping found in TAA. */ +vec3 dof_neighborhood_clamping(vec3 color) +{ + vec2 texel_size = 1.0 / vec2(textureSize(colorBuffer, 0)); + vec2 uv = gl_FragCoord.xy * texel_size; + vec4 ofs = vec4(-1, 1, -1, 1) * texel_size.xxyy; + + /* Luma clamping. 3x3 square neighborhood. */ + float c00 = fast_luma(textureLod(colorBuffer, uv + ofs.xz, 0.0).rgb); + float c01 = fast_luma(textureLod(colorBuffer, uv + ofs.xz * vec2(1.0, 0.0), 0.0).rgb); + float c02 = fast_luma(textureLod(colorBuffer, uv + ofs.xw, 0.0).rgb); + + float c10 = fast_luma(textureLod(colorBuffer, uv + ofs.xz * vec2(0.0, 1.0), 0.0).rgb); + float c11 = fast_luma(color); + float c12 = fast_luma(textureLod(colorBuffer, uv + ofs.xw * vec2(0.0, 1.0), 0.0).rgb); + + float c20 = fast_luma(textureLod(colorBuffer, uv + ofs.yz, 0.0).rgb); + float c21 = fast_luma(textureLod(colorBuffer, uv + ofs.yz * vec2(1.0, 0.0), 0.0).rgb); + float c22 = fast_luma(textureLod(colorBuffer, uv + ofs.yw, 0.0).rgb); + + float avg_luma = avg8(c00, c01, c02, c10, c12, c20, c21, c22); + float max_luma = max8(c00, c01, c02, c10, c12, c20, c21, c22); + + float upper_bound = mix(max_luma, avg_luma, colorNeighborClamping); + upper_bound = mix(c11, upper_bound, colorNeighborClamping); + + float clamped_luma = min(upper_bound, c11); + + return color * clamped_luma * safe_rcp(c11); +} + +/* Simple copy pass where we select what pixels to scatter. Also the resolution might change. + * NOTE: The texture can end up being too big because of the mipmap padding. We correct for + * that during the convolution phase. */ +void main() +{ + vec2 halfres = vec2(textureSize(colorBuffer, 0).xy); + vec2 uv = gl_FragCoord.xy / halfres; + + outColor = textureLod(colorBuffer, uv, 0.0); + outCoc = textureLod(cocBuffer, uv, 0.0).r; + + outColor.rgb = dof_neighborhood_clamping(outColor.rgb); + + /* Only scatter if luminous enough. */ + float do_scatter = dof_scatter_luminosity_rejection(outColor.rgb); + /* Only scatter if CoC is big enough. */ + do_scatter *= dof_scatter_coc_radius_rejection(outCoc); + /* Only scatter if CoC is not too big to avoid performance issues. */ + do_scatter *= dof_scatter_screen_border_rejection(outCoc, uv, halfres); + /* Only scatter if neighborhood is different enough. */ + do_scatter *= dof_scatter_neighborhood_rejection(outColor.rgb); + /* For debuging. */ + do_scatter *= float(!no_scatter_pass); + + outScatterColor = mix(vec3(0.0), outColor.rgb, do_scatter); + outColor.rgb = mix(outColor.rgb, vec3(0.0), do_scatter); + + /* Apply energy conservation to anamorphic scattered bokeh. */ + outScatterColor /= min_v2(bokehAnisotropy); +} + +#else /* REDUCE_PASS */ + +/* Downsample pass done for each mip starting from mip1. */ +void main() +{ + vec2 input_texel_size = 1.0 / vec2(textureSize(colorBuffer, 0).xy); + /* Center uv around the 4 pixels of the previous mip. */ + vec2 quad_center = (floor(gl_FragCoord.xy) * 2.0 + 1.0) * input_texel_size; + + vec4 colors[4]; + vec4 cocs; + for (int i = 0; i < 4; i++) { + vec2 sample_uv = quad_center + quad_offsets[i] * input_texel_size; + colors[i] = dof_load_gather_color(colorBuffer, sample_uv, 0.0); + cocs[i] = textureLod(cocBuffer, sample_uv, 0.0).r; + } + + vec4 weights = dof_downsample_bilateral_coc_weights(cocs); + weights *= dof_downsample_bilateral_color_weights(colors); + /* Normalize so that the sum is 1. */ + weights *= safe_rcp(sum(weights)); + + outColor = weighted_sum_array(colors, weights); + outCoc = dot(cocs, weights); +} + +#endif diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_resolve_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_resolve_frag.glsl new file mode 100644 index 00000000000..469745206e2 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_resolve_frag.glsl @@ -0,0 +1,212 @@ + +/** + * Recombine Pass: Load separate convolution layer and composite with self slight defocus + * convolution and in-focus fields. + * + * The halfres gather methods are fast but lack precision for small CoC areas. To fix this we + * do a bruteforce gather to have a smooth transition between in-focus and defocus regions. + */ + +#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +uniform sampler2D fullResColorBuffer; +uniform sampler2D fullResDepthBuffer; + +uniform sampler2D bgColorBuffer; +uniform sampler2D bgWeightBuffer; +uniform sampler2D bgTileBuffer; + +uniform sampler2D fgColorBuffer; +uniform sampler2D fgWeightBuffer; +uniform sampler2D fgTileBuffer; + +uniform sampler2D holefillColorBuffer; +uniform sampler2D holefillWeightBuffer; + +uniform sampler2D bokehLut; + +uniform float bokehMaxSize; + +in vec4 uvcoordsvar; + +out vec4 fragColor; + +void dof_slight_focus_gather(float radius, out vec4 out_color, out float out_weight) +{ + /* offset coord to avoid correlation with sampling pattern. */ + vec4 noise = texelfetch_noise_tex(gl_FragCoord.xy + 7.0); + + DofGatherData fg_accum = GATHER_DATA_INIT; + DofGatherData bg_accum = GATHER_DATA_INIT; + + int i_radius = clamp(int(radius), 0, int(layer_threshold)); + const int resolve_ring_density = DOF_SLIGHT_FOCUS_DENSITY; + ivec2 texel = ivec2(gl_FragCoord.xy); + + bool first_ring = true; + + for (int ring = i_radius; ring > 0; ring--) { + DofGatherData fg_ring = GATHER_DATA_INIT; + DofGatherData bg_ring = GATHER_DATA_INIT; + + int ring_distance = ring; + int ring_sample_count = resolve_ring_density * ring_distance; + for (int sample_id = 0; sample_id < ring_sample_count; sample_id++) { + int s = sample_id * (4 / resolve_ring_density) + + int(noise.y * float((4 - resolve_ring_density) * ring_distance)); + + ivec2 offset = dof_square_ring_sample_offset(ring_distance, s); + float ring_dist = length(vec2(offset)); + + DofGatherData pair_data[2]; + for (int i = 0; i < 2; i++) { + ivec2 sample_offset = ((i == 0) ? offset : -offset); + ivec2 sample_texel = texel + sample_offset; + /* OPTI: could precompute the factor. */ + vec2 sample_uv = (vec2(sample_texel) + 0.5) / vec2(textureSize(fullResDepthBuffer, 0)); + float depth = textureLod(fullResDepthBuffer, sample_uv, 0.0).r; + pair_data[i].color = safe_color(textureLod(fullResColorBuffer, sample_uv, 0.0)); + pair_data[i].coc = dof_coc_from_zdepth(depth); + pair_data[i].dist = ring_dist; +#ifdef DOF_BOKEH_TEXTURE + /* Contains subpixel distance to bokeh shape. */ + pair_data[i].dist = texelFetch(bokehLut, sample_offset + DOF_MAX_SLIGHT_FOCUS_RADIUS, 0).r; +#endif + pair_data[i].coc = clamp(pair_data[i].coc, -bokehMaxSize, bokehMaxSize); + } + + float bordering_radius = ring_dist + 0.5; + const float isect_mul = 1.0; + dof_gather_accumulate_sample_pair( + pair_data, bordering_radius, isect_mul, first_ring, false, false, bg_ring, bg_accum); + +#ifdef DOF_BOKEH_TEXTURE + /* Swap distances in order to flip bokeh shape for foreground. */ + float tmp = pair_data[0].dist; + pair_data[0].dist = pair_data[1].dist; + pair_data[1].dist = tmp; +#endif + dof_gather_accumulate_sample_pair( + pair_data, bordering_radius, isect_mul, first_ring, false, true, fg_ring, fg_accum); + } + + dof_gather_accumulate_sample_ring( + bg_ring, ring_sample_count * 2, first_ring, false, false, bg_accum); + dof_gather_accumulate_sample_ring( + fg_ring, ring_sample_count * 2, first_ring, false, true, fg_accum); + + first_ring = false; + } + + /* Center sample. */ + vec2 sample_uv = uvcoordsvar.xy; + float depth = textureLod(fullResDepthBuffer, sample_uv, 0.0).r; + DofGatherData center_data; + center_data.color = safe_color(textureLod(fullResColorBuffer, sample_uv, 0.0)); + center_data.coc = dof_coc_from_zdepth(depth); + center_data.coc = clamp(center_data.coc, -bokehMaxSize, bokehMaxSize); + center_data.dist = 0.0; + + /* Slide 38. */ + float bordering_radius = 0.5; + + dof_gather_accumulate_center_sample( + center_data, bordering_radius, i_radius, false, true, fg_accum); + dof_gather_accumulate_center_sample( + center_data, bordering_radius, i_radius, false, false, bg_accum); + + vec4 bg_col, fg_col; + float bg_weight, fg_weight; + vec2 unused_occlusion; + + int total_sample_count = dof_gather_total_sample_count(i_radius + 1, resolve_ring_density); + dof_gather_accumulate_resolve(total_sample_count, bg_accum, bg_col, bg_weight, unused_occlusion); + dof_gather_accumulate_resolve(total_sample_count, fg_accum, fg_col, fg_weight, unused_occlusion); + + /* Fix weighting issues on perfectly focus > slight focus transitionning areas. */ + if (abs(center_data.coc) < 0.5) { + bg_col = center_data.color; + bg_weight = 1.0; + } + + /* Alpha Over */ + float alpha = 1.0 - fg_weight; + out_weight = bg_weight * alpha + fg_weight; + out_color = bg_col * bg_weight * alpha + fg_col * fg_weight; +} + +void dof_resolve_load_layer(sampler2D color_tex, + sampler2D weight_tex, + out vec4 out_color, + out float out_weight) +{ + vec2 pixel_co = gl_FragCoord.xy / 2.0; + vec2 uv = pixel_co / textureSize(color_tex, 0).xy; + out_color = textureLod(color_tex, uv, 0.0); + out_weight = textureLod(weight_tex, uv, 0.0).r; +} + +void main(void) +{ + ivec2 tile_co = ivec2(gl_FragCoord.xy / float(DOF_TILE_DIVISOR)); + CocTile coc_tile = dof_coc_tile_load(fgTileBuffer, bgTileBuffer, tile_co); + CocTilePrediction prediction = dof_coc_tile_prediction_get(coc_tile); + + fragColor = vec4(0.0); + float weight = 0.0; + + vec4 layer_color; + float layer_weight; + + if (!no_holefill_pass && prediction.do_holefill) { + dof_resolve_load_layer(holefillColorBuffer, holefillWeightBuffer, layer_color, layer_weight); + fragColor = layer_color * safe_rcp(layer_weight); + weight = float(layer_weight > 0.0); + } + + if (!no_background_pass && prediction.do_background) { + dof_resolve_load_layer(bgColorBuffer, bgWeightBuffer, layer_color, layer_weight); + /* Always prefer background to holefill pass. */ + layer_color *= safe_rcp(layer_weight); + layer_weight = float(layer_weight > 0.0); + /* Composite background. */ + fragColor = fragColor * (1.0 - layer_weight) + layer_color; + weight = weight * (1.0 - layer_weight) + layer_weight; + /* Fill holes with the composited background. */ + fragColor *= safe_rcp(weight); + weight = float(weight > 0.0); + } + + if (!no_slight_focus_pass && prediction.do_slight_focus) { + dof_slight_focus_gather(coc_tile.fg_slight_focus_max_coc, layer_color, layer_weight); + /* Composite slight defocus. */ + fragColor = fragColor * (1.0 - layer_weight) + layer_color; + weight = weight * (1.0 - layer_weight) + layer_weight; + } + + if (!no_focus_pass && prediction.do_focus) { + layer_color = safe_color(textureLod(fullResColorBuffer, uvcoordsvar.xy, 0.0)); + layer_weight = 1.0; + /* Composite in focus. */ + fragColor = fragColor * (1.0 - layer_weight) + layer_color; + weight = weight * (1.0 - layer_weight) + layer_weight; + } + + if (!no_foreground_pass && prediction.do_foreground) { + dof_resolve_load_layer(fgColorBuffer, fgWeightBuffer, layer_color, layer_weight); + /* Composite foreground. */ + fragColor = fragColor * (1.0 - layer_weight) + layer_color; + } + + /* Fix float precision issue in alpha compositing. */ + if (fragColor.a > 0.99) { + fragColor.a = 1.0; + } + +#if 0 /* Debug */ + if (coc_tile.fg_slight_focus_max_coc >= 0.5) { + fragColor.rgb *= vec3(1.0, 0.1, 0.1); + } +#endif +} \ No newline at end of file diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_frag.glsl new file mode 100644 index 00000000000..704bbf6d999 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_frag.glsl @@ -0,0 +1,85 @@ + +/** + * Scatter pass: Use sprites to scatter the color of very bright pixel to have higher quality blur. + * + * We only scatter one triangle per sprite and one sprite per 4 pixels to reduce vertex shader + * invocations and overdraw. + **/ + +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +uniform sampler2D occlusionBuffer; +uniform sampler2D bokehLut; + +uniform vec2 bokehAnisotropyInv; + +flat in vec4 color1; +flat in vec4 color2; +flat in vec4 color3; +flat in vec4 color4; +flat in vec4 weights; +flat in vec4 cocs; +flat in vec2 spritepos; +flat in float spritesize; /* MaxCoC */ + +layout(location = 0) out vec4 fragColor; + +float bokeh_shape(vec2 center) +{ + vec2 co = gl_FragCoord.xy - center; + +#ifdef DOF_BOKEH_TEXTURE + co *= bokehAnisotropyInv; + float texture_size = float(textureSize(bokehLut, 0).x); + /* Bias scale to avoid sampling at the texture's border. */ + float scale_fac = spritesize * (float(DOF_BOKEH_LUT_SIZE) / float(DOF_BOKEH_LUT_SIZE - 1)); + float dist = scale_fac * textureLod(bokehLut, (co / scale_fac) * 0.5 + 0.5, 0.0).r; +#else + float dist = length(co); +#endif + + return dist; +} + +#define linearstep(p0, p1, v) (clamp(((v) - (p0)) / abs((p1) - (p0)), 0.0, 1.0)) + +void main(void) +{ + vec4 shapes; + for (int i = 0; i < 4; i++) { + shapes[i] = bokeh_shape(spritepos + quad_offsets[i]); + } + /* Becomes signed distance field in pixel units. */ + shapes -= cocs; + /* Smooth the edges a bit to fade out the undersampling artifacts. */ + shapes = 1.0 - linearstep(-0.8, 0.8, shapes); + /* Outside of bokeh shape. Try to avoid overloading ROPs. */ + if (max_v4(shapes) == 0.0) { + discard; + } + + if (!no_scatter_occlusion) { + /* Works because target is the same size as occlusionBuffer. */ + vec2 uv = gl_FragCoord.xy / vec2(textureSize(occlusionBuffer, 0).xy); + vec2 occlusion_data = texture(occlusionBuffer, uv).rg; + /* Fix tilling artifacts. (Slide 90) */ + const float correction_fac = 1.0 - DOF_FAST_GATHER_COC_ERROR; + /* Occlude the sprite with geometry from the same field + * using a VSM like chebychev test (slide 85). */ + float mean = occlusion_data.x; + float variance = occlusion_data.x; + shapes *= variance * safe_rcp(variance + sqr(max(cocs * correction_fac - mean, 0.0))); + } + + fragColor = color1 * shapes.x; + fragColor += color2 * shapes.y; + fragColor += color3 * shapes.z; + fragColor += color4 * shapes.w; + + /* Do not accumulate alpha. This has already been accumulated by the gather pass. */ + fragColor.a = 0.0; + +#ifdef DOF_DEBUG_SCATTER_PERF + fragColor.rgb = avg(fragColor.rgb) * vec3(1.0, 0.0, 0.0); +#endif +} diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_vert.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_vert.glsl new file mode 100644 index 00000000000..276ab119fab --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_vert.glsl @@ -0,0 +1,138 @@ + +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +uniform vec2 targetTexelSize; +uniform int spritePerRow; +uniform vec2 bokehAnisotropy; + +uniform sampler2D colorBuffer; +uniform sampler2D cocBuffer; + +/* Scatter pass, calculate a triangle covering the CoC. + * We render to a half resolution target with double width so we can + * separate near and far fields. We also generate only one triangle per group of 4 pixels + * to limit overdraw. */ + +flat out vec4 color1; +flat out vec4 color2; +flat out vec4 color3; +flat out vec4 color4; +flat out vec4 weights; +flat out vec4 cocs; +flat out vec2 spritepos; +flat out float spritesize; + +/* Load 4 Circle of confusion values. texel_co is centered around the 4 taps. */ +vec4 fetch_cocs(vec2 texel_co) +{ + /* TODO(fclem) The textureGather(sampler, co, comp) variant isn't here on some implementations.*/ +#if 0 // GPU_ARB_texture_gather + vec2 uvs = texel_co / vec2(textureSize(cocBuffer, 0)); + /* Reminder: Samples order is CW starting from top left. */ + cocs = textureGather(cocBuffer, uvs, isForegroundPass ? 0 : 1); +#else + ivec2 texel = ivec2(texel_co - 0.5); + vec4 cocs; + cocs.x = texelFetchOffset(cocBuffer, texel, 0, ivec2(0, 1)).r; + cocs.y = texelFetchOffset(cocBuffer, texel, 0, ivec2(1, 1)).r; + cocs.z = texelFetchOffset(cocBuffer, texel, 0, ivec2(1, 0)).r; + cocs.w = texelFetchOffset(cocBuffer, texel, 0, ivec2(0, 0)).r; +#endif + +#ifdef DOF_FOREGROUND_PASS + cocs *= -1.0; +#endif + + cocs = max(vec4(0.0), cocs); + /* We are scattering at half resolution, so divide CoC by 2. */ + return cocs * 0.5; +} + +void vertex_discard() +{ + /* Don't produce any fragments */ + gl_Position = vec4(0.0, 0.0, 0.0, 1.0); +} + +void main() +{ + ivec2 tex_size = textureSize(cocBuffer, 0); + + int t_id = gl_VertexID / 3; /* Triangle Id */ + + /* Some math to get the target pixel. */ + ivec2 texelco = ivec2(t_id % spritePerRow, t_id / spritePerRow) * 2; + + /* Center sprite around the 4 texture taps. */ + spritepos = vec2(texelco) + 1.0; + + cocs = fetch_cocs(spritepos); + + /* Early out from local CoC radius. */ + if (all(lessThan(cocs, vec4(0.5)))) { + vertex_discard(); + return; + } + + vec2 input_texel_size = 1.0 / vec2(tex_size); + vec2 quad_center = spritepos * input_texel_size; + vec4 colors[4]; + bool no_color = true; + for (int i = 0; i < 4; i++) { + vec2 sample_uv = quad_center + quad_offsets[i] * input_texel_size; + + colors[i] = dof_load_scatter_color(colorBuffer, sample_uv, 0.0); + no_color = no_color && all(equal(colors[i].rgb, vec3(0.0))); + } + + /* Early out from no color to scatter. */ + if (no_color) { + vertex_discard(); + return; + } + + weights = dof_layer_weight(cocs) * dof_sample_weight(cocs); + /* Filter NaNs. */ + weights = mix(weights, vec4(0.0), equal(cocs, vec4(0.0))); + + color1 = colors[0] * weights[0]; + color2 = colors[1] * weights[1]; + color3 = colors[2] * weights[2]; + color4 = colors[3] * weights[3]; + + /* Extend to cover at least the unit circle */ + const float extend = (cos(M_PI / 4.0) + 1.0) * 2.0; + /* Crappy diagram + * ex 1 + * | \ + * | \ + * 1 | \ + * | \ + * | \ + * 0 | x \ + * | Circle \ + * | Origin \ + * -1 0 --------------- 2 + * -1 0 1 ex + */ + + /* Generate Triangle : less memory fetches from a VBO */ + int v_id = gl_VertexID % 3; /* Vertex Id */ + gl_Position.x = float(v_id / 2) * extend - 1.0; /* int divisor round down */ + gl_Position.y = float(v_id % 2) * extend - 1.0; + gl_Position.z = 0.0; + gl_Position.w = 1.0; + + spritesize = max_v4(cocs); + + /* Add 2.5 to max_coc because the max_coc may not be centered on the sprite origin + * and because we smooth the bokeh shape a bit in the pixel shader. */ + gl_Position.xy *= spritesize * bokehAnisotropy + 2.5; + /* Position the sprite. */ + gl_Position.xy += spritepos; + /* NDC range [-1..1]. */ + gl_Position.xy = gl_Position.xy * targetTexelSize * 2.0 - 1.0; + + /* Add 2.5 for the same reason but without the ratio. */ + spritesize += 2.5; +} diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_setup_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_setup_frag.glsl new file mode 100644 index 00000000000..d1ecc0fc244 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_setup_frag.glsl @@ -0,0 +1,65 @@ + +/** + * Setup pass: CoC and luma aware downsample to half resolution of the input scene color buffer. + * + * An addition to the downsample CoC, we output the maximum slight out of focus CoC to be + * sure we don't miss a pixel. + **/ + +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +/* Full resolution. */ +uniform sampler2D colorBuffer; +uniform sampler2D depthBuffer; + +uniform float bokehMaxSize; + +/* Half resolution. */ +layout(location = 0) out vec4 outColor; +layout(location = 1) out vec2 outCoc; /* x: Downsample CoC, y: Max slight focus abs CoC */ + +void main() +{ + vec2 fullres_texel_size = 1.0 / vec2(textureSize(colorBuffer, 0).xy); + /* Center uv around the 4 fullres pixels. */ + vec2 quad_center = (floor(gl_FragCoord.xy) * 2.0 + 1.0) * fullres_texel_size; + + vec4 colors[4]; + vec4 depths; + for (int i = 0; i < 4; i++) { + vec2 sample_uv = quad_center + quad_offsets[i] * fullres_texel_size; + colors[i] = safe_color(textureLod(colorBuffer, sample_uv, 0.0)); + depths[i] = textureLod(depthBuffer, sample_uv, 0.0).r; + } + + vec4 cocs = dof_coc_from_zdepth(depths); + + cocs = clamp(cocs, -bokehMaxSize, bokehMaxSize); + + vec4 weights = dof_downsample_bilateral_coc_weights(cocs); + weights *= dof_downsample_bilateral_color_weights(colors); + /* Normalize so that the sum is 1. */ + weights *= safe_rcp(sum(weights)); + + outColor = weighted_sum_array(colors, weights); + outCoc.x = dot(cocs, weights); + + /* Max slight focus abs CoC. */ + + /* Clamp to 0.5 if full in defocus to differentiate full focus tiles with coc == 0.0. + * This enables an optimization in the resolve pass. */ + const vec4 threshold = vec4(layer_threshold + layer_offset); + cocs = abs(cocs); + bvec4 defocus = greaterThan(cocs, threshold); + bvec4 focus = lessThanEqual(cocs, vec4(0.5)); + if (any(defocus) && any(focus)) { + /* For the same reason as in the flatten pass. This is a case we cannot optimize for. */ + cocs = mix(cocs, vec4(DOF_TILE_MIXED), focus); + cocs = mix(cocs, vec4(DOF_TILE_MIXED), defocus); + } + else { + cocs = mix(cocs, vec4(DOF_TILE_FOCUS), focus); + cocs = mix(cocs, vec4(DOF_TILE_DEFOCUS), defocus); + } + outCoc.y = max_v4(cocs); +} diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl deleted file mode 100644 index 6e35d4a54ae..00000000000 --- a/source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl +++ /dev/null @@ -1,109 +0,0 @@ - -#pragma BLENDER_REQUIRE(common_math_lib.glsl) - -uniform vec4 bokehParams[2]; - -#define bokeh_rotation bokehParams[0].x -#define bokeh_ratio bokehParams[0].y -#define bokeh_maxsize bokehParams[0].z - -uniform sampler2D nearBuffer; -uniform sampler2D farBuffer; -uniform sampler2D cocBuffer; - -flat out vec4 color; -flat out float weight; -flat out float smoothFac; -flat out ivec2 edge; -out vec2 particlecoord; - -/* Scatter pass, calculate a triangle covering the CoC. */ -void main() -{ - ivec2 tex_size = textureSize(cocBuffer, 0); - /* We render to a double width texture so compute - * the target texel size accordingly */ - vec2 texel_size = vec2(0.5, 1.0) / vec2(tex_size); - - int t_id = gl_VertexID / 3; /* Triangle Id */ - - ivec2 texelco = ivec2(0); - /* some math to get the target pixel */ - texelco.x = t_id % tex_size.x; - texelco.y = t_id / tex_size.x; - - vec2 cocs = texelFetch(cocBuffer, texelco, 0).rg; - - bool is_near = (cocs.x > cocs.y); - float coc = (is_near) ? cocs.x : cocs.y; - - /* Clamp to max size for performance */ - coc = min(coc, bokeh_maxsize); - - if (coc >= 1.0) { - if (is_near) { - color = texelFetch(nearBuffer, texelco, 0); - } - else { - color = texelFetch(farBuffer, texelco, 0); - } - /* find the area the pixel will cover and divide the color by it */ - /* HACK: 4.0 out of nowhere (I suppose it's 4 pixels footprint for coc 0?) - * Makes near in focus more closer to 1.0 alpha. */ - weight = 4.0 / (coc * coc * M_PI); - color *= weight; - - /* Compute edge to discard fragment that does not belong to the other layer. */ - edge.x = (is_near) ? 1 : -1; - edge.y = (is_near) ? -tex_size.x + 1 : tex_size.x; - } - else { - /* Don't produce any fragments */ - color = vec4(0.0); - gl_Position = vec4(0.0, 0.0, 0.0, 1.0); - return; - } - - /* Generate Triangle : less memory fetches from a VBO */ - int v_id = gl_VertexID % 3; /* Vertex Id */ - - /* Extend to cover at least the unit circle */ - const float extend = (cos(M_PI / 4.0) + 1.0) * 2.0; - /* Crappy diagram - * ex 1 - * | \ - * | \ - * 1 | \ - * | \ - * | \ - * 0 | x \ - * | Circle \ - * | Origin \ - * -1 0 --------------- 2 - * -1 0 1 ex - */ - gl_Position.x = float(v_id / 2) * extend - 1.0; /* int divisor round down */ - gl_Position.y = float(v_id % 2) * extend - 1.0; - gl_Position.z = 0.0; - gl_Position.w = 1.0; - - /* Generate Triangle */ - particlecoord = gl_Position.xy; - - gl_Position.xy *= coc * texel_size * vec2(bokeh_ratio, 1.0); - gl_Position.xy -= 1.0 - 0.5 * texel_size; /* NDC Bottom left */ - gl_Position.xy += (0.5 + vec2(texelco) * 2.0) * texel_size; - - /* Push far plane to left side. */ - if (!is_near) { - gl_Position.x += 2.0 / 2.0; - } - - /* don't do smoothing for small sprites */ - if (coc > 3.0) { - smoothFac = 1.0 - 1.5 / coc; - } - else { - smoothFac = 1.0; - } -} diff --git a/source/blender/draw/engines/eevee/shaders/effect_gtao_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_gtao_frag.glsl index 47fe21928b3..19ae0acc443 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_gtao_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_gtao_frag.glsl @@ -26,60 +26,99 @@ uniform sampler2D depthBuffer; #endif -uniform float rotationOffset; +/* Similar to https://atyuwen.github.io/posts/normal-reconstruction/. + * This samples the depth buffer 4 time for each direction to get the most correct + * implicit normal reconstruction out of the depth buffer. */ +vec3 view_position_derivative_from_depth(vec2 uvs, vec2 ofs, vec3 vP, float depth_center) +{ + vec2 uv1 = uvs - ofs * 2.0; + vec2 uv2 = uvs - ofs; + vec2 uv3 = uvs + ofs; + vec2 uv4 = uvs + ofs * 2.0; + vec4 H; + H.x = gtao_textureLod(gtao_depthBuffer, uv1, 0.0).r; + H.y = gtao_textureLod(gtao_depthBuffer, uv2, 0.0).r; + H.z = gtao_textureLod(gtao_depthBuffer, uv3, 0.0).r; + H.w = gtao_textureLod(gtao_depthBuffer, uv4, 0.0).r; + /* Fix issue with depth precision. Take even larger diff. */ + vec4 diff = abs(vec4(depth_center, H.yzw) - H.x); + if (max_v4(diff) < 2.4e-7 && all(lessThan(diff.xyz, diff.www))) { + return 0.25 * (get_view_space_from_depth(uv3, H.w) - get_view_space_from_depth(uv1, H.x)); + } + /* Simplified (H.xw + 2.0 * (H.yz - H.xw)) - depth_center */ + vec2 deltas = abs((2.0 * H.yz - H.xw) - depth_center); + if (deltas.x < deltas.y) { + return vP - get_view_space_from_depth(uv2, H.y); + } + else { + return get_view_space_from_depth(uv3, H.z) - vP; + } +} + +/* TODO(fclem) port to a common place for other effects to use. */ +bool reconstruct_view_position_and_normal_from_depth(vec2 texel, out vec3 vP, out vec3 vNg) +{ + vec2 texel_size = 1.0 / vec2(textureSize(gtao_depthBuffer, 0).xy); + vec2 uvs = gl_FragCoord.xy * texel_size; + float depth_center = gtao_textureLod(gtao_depthBuffer, uvs, 0.0).r; + + /* Background case. */ + if (depth_center == 1.0) { + return false; + } + + vP = get_view_space_from_depth(uvs, depth_center); + + vec3 dPdx = view_position_derivative_from_depth(uvs, texel_size * vec2(1, 0), vP, depth_center); + vec3 dPdy = view_position_derivative_from_depth(uvs, texel_size * vec2(0, 1), vP, depth_center); + + vNg = safe_normalize(cross(dPdx, dPdy)); + + return true; +} #ifdef DEBUG_AO +in vec4 uvcoordsvar; + void main() { - vec2 texel_size = 1.0 / vec2(textureSize(depthBuffer, 0)).xy; - vec2 uvs = saturate(gl_FragCoord.xy * texel_size); + vec3 vP, vNg; - float depth = textureLod(depthBuffer, uvs, 0.0).r; + if (!reconstruct_view_position_and_normal_from_depth(gl_FragCoord.xy, vP, vNg)) { + /* Handle Background case. Prevent artifact due to uncleared Horizon Render Target. */ + FragColor = vec4(0.0); + } + else { + vec3 P = transform_point(ViewMatrixInverse, vP); + vec3 V = cameraVec(P); + vec3 vV = viewCameraVec(vP); + vec3 vN = normal_decode(texture(normalBuffer, uvcoordsvar.xy).rg, vV); + vec3 N = transform_direction(ViewMatrixInverse, vN); + vec3 Ng = transform_direction(ViewMatrixInverse, vNg); - vec3 viewPosition = get_view_space_from_depth(uvs, depth); - vec3 V = viewCameraVec; - vec3 normal = normal_decode(texture(normalBuffer, uvs).rg, V); + OcclusionData data = occlusion_load(vP, 1.0); - vec3 bent_normal; - float visibility; + float visibility = diffuse_occlusion(data, V, N, Ng); - vec4 noise = texelfetch_noise_tex(gl_FragCoord.xy); - - gtao_deferred(normal, noise, depth, visibility, bent_normal); - - /* Handle Background case. Prevent artifact due to uncleared Horizon Render Target. */ - FragColor = vec4((depth == 1.0) ? 0.0 : visibility); + FragColor = vec4(visibility); + } } #else void main() { - vec2 uvs = saturate(gl_FragCoord.xy / vec2(textureSize(gtao_depthBuffer, 0).xy)); + vec2 uvs = gl_FragCoord.xy / vec2(textureSize(gtao_depthBuffer, 0).xy); float depth = gtao_textureLod(gtao_depthBuffer, uvs, 0.0).r; + vec3 vP = get_view_space_from_depth(uvs, depth); - if (depth == 1.0) { - /* Do not trace for background */ - FragColor = vec4(0.0); - return; + OcclusionData data = NO_OCCLUSION_DATA; + /* Do not trace for background */ + if (depth != 1.0) { + data = occlusion_search(vP, maxzBuffer, aoDistance, 0.0, 8.0); } - /* Avoid self shadowing. */ - depth = saturate(depth - 3e-6); /* Tweaked for 24bit depth buffer. */ - - vec3 viewPosition = get_view_space_from_depth(uvs, depth); - vec4 noise = texelfetch_noise_tex(gl_FragCoord.xy); - vec2 max_dir = get_max_dir(viewPosition.z); - vec4 dirs; - dirs.xy = get_ao_dir(noise.x * 0.5); - dirs.zw = get_ao_dir(noise.x * 0.5 + 0.5); - - /* Search in 4 directions. */ - FragColor.xy = search_horizon_sweep(dirs.xy, viewPosition, uvs, noise.y, max_dir); - FragColor.zw = search_horizon_sweep(dirs.zw, viewPosition, uvs, noise.y, max_dir); - - /* Resize output for integer texture. */ - FragColor = pack_horizons(FragColor); + FragColor = pack_occlusion_data(data); } #endif diff --git a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl index d50a4eaea3c..a4b29d68ac4 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl @@ -2,6 +2,8 @@ #pragma BLENDER_REQUIRE(common_math_lib.glsl) #pragma BLENDER_REQUIRE(common_math_geom_lib.glsl) #pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_glossy_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_lib.glsl) #pragma BLENDER_REQUIRE(raytrace_lib.glsl) #pragma BLENDER_REQUIRE(lightprobe_lib.glsl) #pragma BLENDER_REQUIRE(ssr_lib.glsl) @@ -40,15 +42,8 @@ uniform sampler2D specroughBuffer; layout(location = 0) out ivec2 hitData; layout(location = 1) out float pdfData; -void do_planar_ssr(int index, - vec3 V, - vec3 N, - vec3 T, - vec3 B, - vec3 planeNormal, - vec3 viewPosition, - float a2, - vec4 rand) +void do_planar_ssr( + int index, vec3 V, vec3 N, vec3 T, vec3 B, vec3 planeNormal, vec3 vP, float a2, vec4 rand) { float NH; vec3 H = sample_ggx(rand.xzw, a2, N, T, B, NH); /* Microfacet normal */ @@ -73,12 +68,12 @@ void do_planar_ssr(int index, * below the reflection plane). This way it's garanted that the hit will * be in front of the camera. That let us tag the bad rays with a negative * sign in the Z component. */ - vec3 hit_pos = raycast(index, viewPosition, R * 1e16, 1e16, rand.y, ssrQuality, a2, false); + vec3 hit_pos = raycast(index, vP, R * 1e16, 1e16, rand.y, ssrQuality, a2, false); hitData = encode_hit_data(hit_pos.xy, (hit_pos.z > 0.0), true); } -void do_ssr(vec3 V, vec3 N, vec3 T, vec3 B, vec3 viewPosition, float a2, vec4 rand) +void do_ssr(vec3 V, vec3 N, vec3 T, vec3 B, vec3 vP, float a2, vec4 rand) { float NH; /* Microfacet normal */ @@ -110,7 +105,7 @@ void do_ssr(vec3 V, vec3 N, vec3 T, vec3 B, vec3 viewPosition, float a2, vec4 ra pdfData = min(1024e32, pdf_ggx_reflect(NH, a2)); /* Theoretical limit of 16bit float */ - vec3 hit_pos = raycast(-1, viewPosition, R * 1e16, ssrThickness, rand.y, ssrQuality, a2, true); + vec3 hit_pos = raycast(-1, vP, R * 1e16, ssrThickness, rand.y, ssrQuality, a2, true); hitData = encode_hit_data(hit_pos.xy, (hit_pos.z > 0.0), false); } @@ -140,9 +135,12 @@ void main() vec2 uvs = vec2(fullres_texel) / vec2(textureSize(depthBuffer, 0)); /* Using view space */ - vec3 viewPosition = get_view_space_from_depth(uvs, depth); - vec3 V = viewCameraVec; - vec3 N = normal_decode(texelFetch(normalBuffer, fullres_texel, 0).rg, V); + vec3 vP = get_view_space_from_depth(uvs, depth); + vec3 P = transform_point(ViewMatrixInverse, vP); + vec3 vV = viewCameraVec(vP); + vec3 V = cameraVec(P); + vec3 vN = normal_decode(texelFetch(normalBuffer, fullres_texel, 0).rg, vV); + vec3 N = transform_direction(ViewMatrixInverse, vN); /* Retrieve pixel data */ vec4 speccol_roughness = texelFetch(specroughBuffer, fullres_texel, 0).rgba; @@ -170,26 +168,24 @@ void main() /* Importance sampling bias */ rand.x = mix(rand.x, 0.0, ssrBrdfBias); - vec3 worldPosition = transform_point(ViewMatrixInverse, viewPosition); - vec3 wN = transform_direction(ViewMatrixInverse, N); - - vec3 T, B; - make_orthonormal_basis(N, T, B); /* Generate tangent space */ + vec3 vT, vB; + make_orthonormal_basis(vN, vT, vB); /* Generate tangent space */ /* Planar Reflections */ for (int i = 0; i < MAX_PLANAR && i < prbNumPlanar; i++) { PlanarData pd = planars_data[i]; - float fade = probe_attenuation_planar(pd, worldPosition, wN, 0.0); + float fade = probe_attenuation_planar(pd, P); + fade *= probe_attenuation_planar_normal_roughness(pd, N, 0.0); if (fade > 0.5) { /* Find view vector / reflection plane intersection. */ /* TODO optimize, use view space for all. */ - vec3 tracePosition = line_plane_intersect(worldPosition, cameraVec, pd.pl_plane_eq); + vec3 tracePosition = line_plane_intersect(P, V, pd.pl_plane_eq); tracePosition = transform_point(ViewMatrix, tracePosition); vec3 planeNormal = transform_direction(ViewMatrix, pd.pl_normal); - do_planar_ssr(i, V, N, T, B, planeNormal, tracePosition, a2, rand); + do_planar_ssr(i, vV, vN, vT, vB, planeNormal, tracePosition, a2, rand); return; } } @@ -197,9 +193,9 @@ void main() /* Constant bias (due to depth buffer precision). Helps with self intersection. */ /* Magic numbers for 24bits of precision. * From http://terathon.com/gdc07_lengyel.pdf (slide 26) */ - viewPosition.z = get_view_z_from_depth(depth - mix(2.4e-7, 4.8e-7, depth)); + vP.z = get_view_z_from_depth(depth - mix(2.4e-7, 4.8e-7, depth)); - do_ssr(V, N, T, B, viewPosition, a2, rand); + do_ssr(vV, vN, vT, vB, vP, a2, rand); } #else /* STEP_RESOLVE */ @@ -213,6 +209,8 @@ uniform sampler2D pdfBuffer; uniform int neighborOffset; +in vec4 uvcoordsvar; + const ivec2 neighbors[32] = ivec2[32](ivec2(0, 0), ivec2(1, 1), ivec2(-2, 0), @@ -298,7 +296,7 @@ float get_sample_depth(vec2 hit_co, bool is_planar, float planar_index) vec3 get_hit_vector(vec3 hit_pos, PlanarData pd, - vec3 worldPosition, + vec3 P, vec3 N, vec3 V, bool is_planar, @@ -309,7 +307,7 @@ vec3 get_hit_vector(vec3 hit_pos, if (is_planar) { /* Reflect back the hit position to have it in non-reflected world space */ - vec3 trace_pos = line_plane_intersect(worldPosition, V, pd.pl_plane_eq); + vec3 trace_pos = line_plane_intersect(P, V, pd.pl_plane_eq); hit_vec = hit_pos - trace_pos; hit_vec = reflect(hit_vec, pd.pl_normal); /* Modify here so mip texel alignment is correct. */ @@ -317,8 +315,8 @@ vec3 get_hit_vector(vec3 hit_pos, } else { /* Find hit position in previous frame. */ - hit_co = get_reprojected_reflection(hit_pos, worldPosition, N); - hit_vec = hit_pos - worldPosition; + hit_co = get_reprojected_reflection(hit_pos, P, N); + hit_vec = hit_pos - P; } mask = screen_border_mask(hit_co); @@ -339,7 +337,7 @@ vec4 get_ssr_samples(vec4 hit_pdf, ivec4 hit_data[2], PlanarData pd, float planar_index, - vec3 worldPosition, + vec3 P, vec3 N, vec3 V, float roughnessSquared, @@ -379,14 +377,10 @@ vec4 get_ssr_samples(vec4 hit_pdf, /* Get actual hit vector and hit coordinate (from last frame). */ vec4 mask = vec4(1.0); - hit_pos[0] = get_hit_vector( - hit_pos[0], pd, worldPosition, N, V, is_planar.x, hit_co[0].xy, mask.x); - hit_pos[1] = get_hit_vector( - hit_pos[1], pd, worldPosition, N, V, is_planar.y, hit_co[0].zw, mask.y); - hit_pos[2] = get_hit_vector( - hit_pos[2], pd, worldPosition, N, V, is_planar.z, hit_co[1].xy, mask.z); - hit_pos[3] = get_hit_vector( - hit_pos[3], pd, worldPosition, N, V, is_planar.w, hit_co[1].zw, mask.w); + hit_pos[0] = get_hit_vector(hit_pos[0], pd, P, N, V, is_planar.x, hit_co[0].xy, mask.x); + hit_pos[1] = get_hit_vector(hit_pos[1], pd, P, N, V, is_planar.y, hit_co[0].zw, mask.y); + hit_pos[2] = get_hit_vector(hit_pos[2], pd, P, N, V, is_planar.z, hit_co[1].xy, mask.z); + hit_pos[3] = get_hit_vector(hit_pos[3], pd, P, N, V, is_planar.w, hit_co[1].zw, mask.w); vec4 hit_dist; hit_dist.x = length(hit_pos[0]); @@ -476,47 +470,30 @@ vec4 get_ssr_samples(vec4 hit_pdf, return accum; } -void main() +void raytrace_resolve(ClosureInputGlossy cl_in, + inout ClosureEvalGlossy cl_eval, + inout ClosureEvalCommon cl_common, + inout ClosureOutputGlossy cl_out) { - ivec2 fullres_texel = ivec2(gl_FragCoord.xy); # ifdef FULLRES - ivec2 halfres_texel = fullres_texel; + ivec2 texel = ivec2(gl_FragCoord.xy); # else - ivec2 halfres_texel = ivec2(gl_FragCoord.xy / 2.0); + ivec2 texel = ivec2(gl_FragCoord.xy / 2.0); # endif - vec2 uvs = gl_FragCoord.xy / vec2(textureSize(depthBuffer, 0)); - - float depth = textureLod(depthBuffer, uvs, 0.0).r; - - /* Early out */ - if (depth == 1.0) { - discard; - } - /* Using world space */ - vec3 viewPosition = get_view_space_from_depth(uvs, depth); /* Needed for viewCameraVec */ - vec3 worldPosition = transform_point(ViewMatrixInverse, viewPosition); - vec3 V = cameraVec; - vec3 vN = normal_decode(texelFetch(normalBuffer, fullres_texel, 0).rg, viewCameraVec); - vec3 N = transform_direction(ViewMatrixInverse, vN); - vec4 speccol_roughness = texelFetch(specroughBuffer, fullres_texel, 0).rgba; + vec3 V = cl_common.V; + vec3 N = cl_in.N; + vec3 P = cl_common.P; - /* Early out */ - if (dot(speccol_roughness.rgb, vec3(1.0)) == 0.0) { - discard; - } - - float roughness = speccol_roughness.a; - float roughnessSquared = max(1e-3, roughness * roughness); - - vec4 spec_accum = vec4(0.0); + float roughness = cl_in.roughness; + float roughnessSquared = max(1e-3, sqr(roughness)); /* Resolve SSR */ float cone_cos = cone_cosine(roughnessSquared); float cone_tan = sqrt(1 - cone_cos * cone_cos) / cone_cos; cone_tan *= mix(saturate(dot(N, -V) * 2.0), 1.0, roughness); /* Elongation fit */ - vec2 source_uvs = project_point(pastViewProjectionMatrix, worldPosition).xy * 0.5 + 0.5; + vec2 source_uvs = project_point(pastViewProjectionMatrix, P).xy * 0.5 + 0.5; vec4 ssr_accum = vec4(0.0); float weight_acc = 0.0; @@ -525,16 +502,16 @@ void main() /* TODO optimize with textureGather */ /* Doing these fetches early to hide latency. */ vec4 hit_pdf; - hit_pdf.x = texelFetch(pdfBuffer, halfres_texel + neighbors[0 + neighborOffset], 0).r; - hit_pdf.y = texelFetch(pdfBuffer, halfres_texel + neighbors[1 + neighborOffset], 0).r; - hit_pdf.z = texelFetch(pdfBuffer, halfres_texel + neighbors[2 + neighborOffset], 0).r; - hit_pdf.w = texelFetch(pdfBuffer, halfres_texel + neighbors[3 + neighborOffset], 0).r; + hit_pdf.x = texelFetch(pdfBuffer, texel + neighbors[0 + neighborOffset], 0).r; + hit_pdf.y = texelFetch(pdfBuffer, texel + neighbors[1 + neighborOffset], 0).r; + hit_pdf.z = texelFetch(pdfBuffer, texel + neighbors[2 + neighborOffset], 0).r; + hit_pdf.w = texelFetch(pdfBuffer, texel + neighbors[3 + neighborOffset], 0).r; ivec4 hit_data[2]; - hit_data[0].xy = texelFetch(hitBuffer, halfres_texel + neighbors[0 + neighborOffset], 0).rg; - hit_data[0].zw = texelFetch(hitBuffer, halfres_texel + neighbors[1 + neighborOffset], 0).rg; - hit_data[1].xy = texelFetch(hitBuffer, halfres_texel + neighbors[2 + neighborOffset], 0).rg; - hit_data[1].zw = texelFetch(hitBuffer, halfres_texel + neighbors[3 + neighborOffset], 0).rg; + hit_data[0].xy = texelFetch(hitBuffer, texel + neighbors[0 + neighborOffset], 0).rg; + hit_data[0].zw = texelFetch(hitBuffer, texel + neighbors[1 + neighborOffset], 0).rg; + hit_data[1].xy = texelFetch(hitBuffer, texel + neighbors[2 + neighborOffset], 0).rg; + hit_data[1].zw = texelFetch(hitBuffer, texel + neighbors[3 + neighborOffset], 0).rg; /* Find Planar Reflections affecting this pixel */ PlanarData pd; @@ -542,7 +519,8 @@ void main() for (int i = 0; i < MAX_PLANAR && i < prbNumPlanar; i++) { pd = planars_data[i]; - float fade = probe_attenuation_planar(pd, worldPosition, N, 0.0); + float fade = probe_attenuation_planar(pd, P); + fade *= probe_attenuation_planar_normal_roughness(pd, N, 0.0); if (fade > 0.5) { planar_index = float(i); @@ -554,7 +532,7 @@ void main() hit_data, pd, planar_index, - worldPosition, + P, N, V, roughnessSquared, @@ -564,19 +542,53 @@ void main() } /* Compute SSR contribution */ - if (weight_acc > 0.0) { - ssr_accum /= weight_acc; - /* fade between 0.5 and 1.0 roughness */ - ssr_accum.a *= smoothstep(ssrMaxRoughness + 0.2, ssrMaxRoughness, roughness); - accumulate_light(ssr_accum.rgb, ssr_accum.a, spec_accum); + ssr_accum *= (weight_acc == 0.0) ? 0.0 : (1.0 / weight_acc); + /* fade between 0.5 and 1.0 roughness */ + ssr_accum.a *= smoothstep(ssrMaxRoughness + 0.2, ssrMaxRoughness, roughness); + + cl_eval.raytrace_radiance = ssr_accum.rgb * ssr_accum.a; + cl_common.specular_accum -= ssr_accum.a; +} + +CLOSURE_EVAL_FUNCTION_DECLARE_1(ssr_resolve, Glossy) + +void main() +{ + ivec2 texel = ivec2(gl_FragCoord.xy); + float depth = texelFetch(depthBuffer, texel, 0).r; + + if (depth == 1.0) { + discard; } - /* If SSR contribution is not 1.0, blend with cubemaps */ - if (spec_accum.a < 1.0) { - fallback_cubemap(N, V, worldPosition, viewPosition, roughness, roughnessSquared, spec_accum); + vec4 speccol_roughness = texelFetch(specroughBuffer, texel, 0).rgba; + vec3 brdf = speccol_roughness.rgb; + float roughness = speccol_roughness.a; + + if (max_v3(brdf) <= 0.0) { + discard; } - fragColor = vec4(spec_accum.rgb * speccol_roughness.rgb, 1.0); + FragDepth = depth; + + viewPosition = get_view_space_from_depth(uvcoordsvar.xy, depth); + worldPosition = transform_point(ViewMatrixInverse, viewPosition); + + vec2 normal_encoded = texelFetch(normalBuffer, texel, 0).rg; + viewNormal = normal_decode(normal_encoded, viewCameraVec(viewPosition)); + worldNormal = transform_direction(ViewMatrixInverse, viewNormal); + + CLOSURE_VARS_DECLARE_1(Glossy); + + in_Glossy_0.N = worldNormal; + in_Glossy_0.roughness = roughness; + + /* Do a full deferred evaluation of the glossy BSDF. The only difference is that we inject the + * SSR resolve before the cubemap iter. BRDF term is already computed during main pass and is + * passed as specular color. */ + CLOSURE_EVAL_FUNCTION_1(ssr_resolve, Glossy); + + fragColor = vec4(out_Glossy_0.radiance * brdf, 1.0); } #endif diff --git a/source/blender/draw/engines/eevee/shaders/effect_translucency_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_translucency_frag.glsl index 724e63eaba8..737ef7dc509 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_translucency_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_translucency_frag.glsl @@ -81,7 +81,7 @@ float shadow_cube_radial_depth(vec3 cubevec, float tex_id, int shadow_id) return depth; } -vec3 light_translucent(LightData ld, vec3 W, vec3 N, vec4 l_vector, vec2 rand, float sss_scale) +vec3 light_translucent(LightData ld, vec3 P, vec3 N, vec4 l_vector, vec2 rand, float sss_scale) { int shadow_id = int(ld.l_shadowid); @@ -98,7 +98,7 @@ vec3 light_translucent(LightData ld, vec3 W, vec3 N, vec4 l_vector, vec2 rand, f float d, dist; int data_id = int(sd(shadow_id).sh_data_index); if (ld.l_type == SUN) { - vec4 view_z = vec4(dot(W - cameraPos, cameraForward)); + vec4 view_z = vec4(dot(P - cameraPos, cameraForward)); vec4 weights = step(scascade(data_id).split_end_distances, view_z); float id = abs(4.0 - dot(weights, weights)); @@ -109,7 +109,7 @@ vec3 light_translucent(LightData ld, vec3 W, vec3 N, vec4 l_vector, vec2 rand, f /* Same factor as in get_cascade_world_distance(). */ float range = abs(sd(shadow_id).sh_far - sd(shadow_id).sh_near); - vec4 shpos = scascade(data_id).shadowmat[int(id)] * vec4(W, 1.0); + vec4 shpos = scascade(data_id).shadowmat[int(id)] * vec4(P, 1.0); dist = shpos.z * range; if (shpos.z > 1.0 || shpos.z < 0.0) { @@ -149,7 +149,7 @@ vec3 light_translucent(LightData ld, vec3 W, vec3 N, vec4 l_vector, vec2 rand, f else { float ofs = 1.0 / float(textureSize(sssShadowCubes, 0).x); - vec3 cubevec = transform_point(scube(data_id).shadowmat, W); + vec3 cubevec = transform_point(scube(data_id).shadowmat, P); dist = length(cubevec); cubevec /= dist; /* tex_id == data_id for cube shadowmap */ @@ -187,8 +187,8 @@ void main(void) { vec2 uvs = uvcoordsvar.xy; float sss_scale = texture(sssRadius, uvs).r; - vec3 W = get_world_space_from_depth(uvs, texture(depthBuffer, uvs).r); - vec3 N = normalize(cross(dFdx(W), dFdy(W))); + vec3 P = get_world_space_from_depth(uvs, texture(depthBuffer, uvs).r); + vec3 N = normalize(cross(dFdx(P), dFdy(P))); vec3 rand = texelfetch_noise_tex(gl_FragCoord.xy).zwy; rand.xy *= fast_sqrt(rand.z); @@ -203,7 +203,7 @@ void main(void) } vec4 l_vector; /* Non-Normalized Light Vector with length in last component. */ - l_vector.xyz = ld.l_position - W; + l_vector.xyz = ld.l_position - P; l_vector.w = length(l_vector.xyz); float att = light_attenuation(ld, l_vector); @@ -211,7 +211,7 @@ void main(void) continue; } - accum += att * ld.l_color * light_translucent(ld, W, -N, l_vector, rand.xy, sss_scale); + accum += att * ld.l_color * light_translucent(ld, P, -N, l_vector, rand.xy, sss_scale); } FragColor = vec4(accum, 1.0); diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_diffuse_frag.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_diffuse_frag.glsl index bf45169ebaa..0d0ae6ea4a5 100644 --- a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_diffuse_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_diffuse_frag.glsl @@ -9,6 +9,9 @@ uniform float lodFactor; uniform float lodMax; uniform float intensityFac; +uniform float sampleCount; +uniform float invSampleCount; + in vec3 worldPosition; out vec4 FragColor; @@ -105,8 +108,8 @@ void main() weight = texel_solid_angle(facecoord, halfpix); - vec4 sample = textureLod(probeHdr, cubevec, lodMax); - sh += sample.rgb * coef * weight; + vec4 samp = textureLod(probeHdr, cubevec, lodMax); + sh += samp.rgb * coef * weight; weight_accum += weight; } } @@ -144,7 +147,7 @@ void main() float weight = 0.0; vec3 out_radiance = vec3(0.0); for (float i = 0; i < sampleCount; i++) { - vec3 L = sample_hemisphere(i, N, T, B); /* Microfacet normal */ + vec3 L = sample_hemisphere(i, invSampleCount, N, T, B); /* Microfacet normal */ float NL = dot(N, L); if (NL > 0.0) { diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl index ccb77427ed2..35fdbcb715f 100644 --- a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl @@ -11,6 +11,9 @@ uniform float paddingSize; uniform float intensityFac; uniform float fireflyFactor; +uniform float sampleCount; +uniform float invSampleCount; + in vec3 worldPosition; out vec4 FragColor; @@ -45,15 +48,11 @@ void main() make_orthonormal_basis(N, T, B); /* Generate tangent space */ - /* Noise to dither the samples */ - /* Note : ghosting is better looking than noise. */ - // setup_noise(); - /* Integrating Envmap */ float weight = 0.0; vec3 out_radiance = vec3(0.0); for (float i = 0; i < sampleCount; i++) { - vec3 H = sample_ggx(i, roughnessSquared, N, T, B); /* Microfacet normal */ + vec3 H = sample_ggx(i, invSampleCount, roughnessSquared, N, T, B); /* Microfacet normal */ vec3 L = -reflect(V, H); float NL = dot(N, L); diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_visibility_frag.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_visibility_frag.glsl index 8d7c58a93d5..b802b39c56e 100644 --- a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_visibility_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_visibility_frag.glsl @@ -13,6 +13,9 @@ uniform float farClip; uniform float visibilityRange; uniform float visibilityBlur; +uniform float sampleCount; +uniform float invSampleCount; + out vec4 FragColor; vec3 octahedral_to_cubemap_proj(vec2 co) @@ -77,9 +80,9 @@ void main() vec2 accum = vec2(0.0); for (float i = 0; i < sampleCount; i++) { - vec3 sample = sample_cone(i, M_PI_2 * visibilityBlur, cos, T, B); - float depth = texture(probeDepth, sample).r; - depth = get_world_distance(depth, sample); + vec3 samp = sample_cone(i, invSampleCount, M_PI_2 * visibilityBlur, cos, T, B); + float depth = texture(probeDepth, samp).r; + depth = get_world_distance(depth, samp); accum += vec2(depth, depth * depth); } diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl index a2e25b83532..de384146b80 100644 --- a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl @@ -99,9 +99,9 @@ layout(std140) uniform planar_block /* ----------- Functions --------- */ -float probe_attenuation_cube(int pd_id, vec3 W) +float probe_attenuation_cube(int pd_id, vec3 P) { - vec3 localpos = transform_point(probes_data[pd_id].influencemat, W); + vec3 localpos = transform_point(probes_data[pd_id].influencemat, P); float probe_atten_fac = probes_data[pd_id].p_atten_fac; float fac; @@ -116,39 +116,40 @@ float probe_attenuation_cube(int pd_id, vec3 W) return fac; } -float probe_attenuation_planar(PlanarData pd, vec3 W, vec3 N, float roughness) +float probe_attenuation_planar(PlanarData pd, vec3 P) { - /* Normal Facing */ - float fac = saturate(dot(pd.pl_normal, N) * pd.pl_facing_scale + pd.pl_facing_bias); - /* Distance from plane */ - fac *= saturate(abs(dot(pd.pl_plane_eq, vec4(W, 1.0))) * pd.pl_fade_scale + pd.pl_fade_bias); - + float fac = saturate(abs(dot(pd.pl_plane_eq, vec4(P, 1.0))) * pd.pl_fade_scale + + pd.pl_fade_bias); /* Fancy fast clipping calculation */ vec2 dist_to_clip; - dist_to_clip.x = dot(pd.pl_clip_pos_x, W); - dist_to_clip.y = dot(pd.pl_clip_pos_y, W); + dist_to_clip.x = dot(pd.pl_clip_pos_x, P); + dist_to_clip.y = dot(pd.pl_clip_pos_y, P); /* compare and add all tests */ fac *= step(2.0, dot(step(pd.pl_clip_edges, dist_to_clip.xxyy), vec2(-1.0, 1.0).xyxy)); - - /* Decrease influence for high roughness */ - fac *= saturate(1.0 - roughness * 10.0); - return fac; } -float probe_attenuation_grid(GridData gd, mat4 localmat, vec3 W, out vec3 localpos) +float probe_attenuation_planar_normal_roughness(PlanarData pd, vec3 N, float roughness) { - localpos = transform_point(localmat, W); + /* Normal Facing */ + float fac = saturate(dot(pd.pl_normal, N) * pd.pl_facing_scale + pd.pl_facing_bias); + /* Decrease influence for high roughness */ + return fac * saturate(1.0 - roughness * 10.0); +} + +float probe_attenuation_grid(GridData gd, vec3 P, out vec3 localpos) +{ + localpos = transform_point(gd.localmat, P); vec3 pos_to_edge = max(vec3(0.0), abs(localpos) - 1.0); float fade = length(pos_to_edge); return saturate(-fade * gd.g_atten_scale + gd.g_atten_bias); } -vec3 probe_evaluate_cube(int pd_id, vec3 W, vec3 R, float roughness) +vec3 probe_evaluate_cube(int pd_id, vec3 P, vec3 R, float roughness) { /* Correct reflection ray using parallax volume intersection. */ - vec3 localpos = transform_point(probes_data[pd_id].parallaxmat, W); + vec3 localpos = transform_point(probes_data[pd_id].parallaxmat, P); vec3 localray = transform_direction(probes_data[pd_id].parallaxmat, R); float dist; @@ -160,14 +161,14 @@ vec3 probe_evaluate_cube(int pd_id, vec3 W, vec3 R, float roughness) } /* Use Distance in WS directly to recover intersection */ - vec3 intersection = W + R * dist - probes_data[pd_id].p_position; + vec3 intersection = P + R * dist - probes_data[pd_id].p_position; /* From Frostbite PBR Course * Distance based roughness * http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf */ float original_roughness = roughness; - float linear_roughness = sqrt(roughness); + float linear_roughness = fast_sqrt(roughness); float distance_roughness = saturate(dist * linear_roughness / length(intersection)); linear_roughness = mix(distance_roughness, linear_roughness, linear_roughness); roughness = linear_roughness * linear_roughness; @@ -175,19 +176,20 @@ vec3 probe_evaluate_cube(int pd_id, vec3 W, vec3 R, float roughness) float fac = saturate(original_roughness * 2.0 - 1.0); R = mix(intersection, R, fac * fac); - return textureLod_cubemapArray(probeCubes, vec4(R, float(pd_id)), roughness * prbLodCubeMax).rgb; + float lod = linear_roughness * prbLodCubeMax; + return textureLod_cubemapArray(probeCubes, vec4(R, float(pd_id)), lod).rgb; } vec3 probe_evaluate_world_spec(vec3 R, float roughness) { - return textureLod_cubemapArray(probeCubes, vec4(R, 0.0), roughness * prbLodCubeMax).rgb; + float lod = fast_sqrt(roughness) * prbLodCubeMax; + return textureLod_cubemapArray(probeCubes, vec4(R, 0.0), lod).rgb; } -vec3 probe_evaluate_planar( - float id, PlanarData pd, vec3 W, vec3 N, vec3 V, float roughness, inout float fade) +vec3 probe_evaluate_planar(int id, PlanarData pd, vec3 P, vec3 N, vec3 V, float roughness) { /* Find view vector / reflection plane intersection. */ - vec3 point_on_plane = line_plane_intersect(W, V, pd.pl_plane_eq); + vec3 point_on_plane = line_plane_intersect(P, V, pd.pl_plane_eq); /* How far the pixel is from the plane. */ float ref_depth = 1.0; /* TODO parameter */ @@ -207,15 +209,15 @@ vec3 probe_evaluate_planar( /* TODO: If we support non-ssr planar reflection, we should blur them with gaussian * and chose the right mip depending on the cone footprint after projection */ /* NOTE: X is inverted here to compensate inverted drawing. */ - vec3 sample = textureLod(probePlanars, vec3(refco.xy * vec2(-0.5, 0.5) + 0.5, id), 0.0).rgb; + vec3 radiance = textureLod(probePlanars, vec3(refco.xy * vec2(-0.5, 0.5) + 0.5, id), 0.0).rgb; - return sample; + return radiance; } void fallback_cubemap(vec3 N, vec3 V, - vec3 W, - vec3 viewPosition, + vec3 P, + vec3 vP, float roughness, float roughnessSquared, inout vec4 spec_accum) @@ -223,21 +225,15 @@ void fallback_cubemap(vec3 N, /* Specular probes */ vec3 spec_dir = specular_dominant_dir(N, V, roughnessSquared); -#ifdef SSR_AO - vec4 rand = texelfetch_noise_tex(gl_FragCoord.xy); - vec3 bent_normal; - float final_ao = occlusion_compute(N, viewPosition, 1.0, rand, bent_normal); - final_ao = specular_occlusion(dot(N, V), final_ao, roughness); -#else - const float final_ao = 1.0; -#endif + OcclusionData occlusion_data = occlusion_load(vP, 1.0); + float final_ao = specular_occlusion(occlusion_data, V, N, roughness, spec_dir); /* Starts at 1 because 0 is world probe */ for (int i = 1; i < MAX_PROBE && i < prbNumRenderCube && spec_accum.a < 0.999; i++) { - float fade = probe_attenuation_cube(i, W); + float fade = probe_attenuation_cube(i, P); if (fade > 0.0) { - vec3 spec = final_ao * probe_evaluate_cube(i, W, spec_dir, roughness); + vec3 spec = final_ao * probe_evaluate_cube(i, P, spec_dir, roughness); accumulate_light(spec, fade, spec_accum); } } @@ -249,7 +245,7 @@ void fallback_cubemap(vec3 N, } } -vec3 probe_evaluate_grid(GridData gd, vec3 W, vec3 N, vec3 localpos) +vec3 probe_evaluate_grid(GridData gd, vec3 P, vec3 N, vec3 localpos) { localpos = localpos * 0.5 + 0.5; localpos = localpos * vec3(gd.g_resolution) - 0.5; @@ -278,7 +274,7 @@ vec3 probe_evaluate_grid(GridData gd, vec3 W, vec3 N, vec3 localpos) (gd.g_increment_x * cell_cos.x + gd.g_increment_y * cell_cos.y + gd.g_increment_z * cell_cos.z); - vec3 ws_point_to_cell = ws_cell_location - W; + vec3 ws_point_to_cell = ws_cell_location - P; float ws_dist_point_to_cell = length(ws_point_to_cell); vec3 ws_light = ws_point_to_cell / ws_dist_point_to_cell; diff --git a/source/blender/draw/engines/eevee/shaders/lights_lib.glsl b/source/blender/draw/engines/eevee/shaders/lights_lib.glsl index 949e4d8f04f..04ad53eabb7 100644 --- a/source/blender/draw/engines/eevee/shaders/lights_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/lights_lib.glsl @@ -164,10 +164,10 @@ vec4 sample_cascade(sampler2DArray tex, vec2 co, float cascade_id) #define scube(x) shadows_cube_data[x] #define scascade(x) shadows_cascade_data[x] -float sample_cube_shadow(int shadow_id, vec3 W) +float sample_cube_shadow(int shadow_id, vec3 P) { int data_id = int(sd(shadow_id).sh_data_index); - vec3 cubevec = transform_point(scube(data_id).shadowmat, W); + vec3 cubevec = transform_point(scube(data_id).shadowmat, P); float dist = max(sd(shadow_id).sh_near, max_v3(abs(cubevec)) - sd(shadow_id).sh_bias); dist = buffer_depth(true, dist, sd(shadow_id).sh_far, sd(shadow_id).sh_near); /* Manual Shadow Cube Layer indexing. */ @@ -179,11 +179,11 @@ float sample_cube_shadow(int shadow_id, vec3 W) return texture(shadowCubeTexture, vec4(coord, tex_id * 6.0 + face, dist)); } -float sample_cascade_shadow(int shadow_id, vec3 W) +float sample_cascade_shadow(int shadow_id, vec3 P) { int data_id = int(sd(shadow_id).sh_data_index); float tex_id = scascade(data_id).sh_tex_index; - vec4 view_z = vec4(dot(W - cameraPos, cameraForward)); + vec4 view_z = vec4(dot(P - cameraPos, cameraForward)); vec4 weights = 1.0 - smoothstep(scascade(data_id).split_end_distances, scascade(data_id).split_start_distances.yzwx, view_z); @@ -194,13 +194,13 @@ float sample_cascade_shadow(int shadow_id, vec3 W) float vis = weights.w; vec4 coord, shpos; /* Main cascade. */ - shpos = scascade(data_id).shadowmat[cascade] * vec4(W, 1.0); + shpos = scascade(data_id).shadowmat[cascade] * vec4(P, 1.0); coord = vec4(shpos.xy, tex_id + float(cascade), shpos.z - sd(shadow_id).sh_bias); vis += texture(shadowCascadeTexture, coord) * (1.0 - blend); cascade = min(3, cascade + 1); /* Second cascade. */ - shpos = scascade(data_id).shadowmat[cascade] * vec4(W, 1.0); + shpos = scascade(data_id).shadowmat[cascade] * vec4(P, 1.0); coord = vec4(shpos.xy, tex_id + float(cascade), shpos.z - sd(shadow_id).sh_bias); vis += texture(shadowCascadeTexture, coord) * blend; @@ -252,32 +252,29 @@ float light_attenuation(LightData ld, vec4 l_vector) return vis; } -float light_shadowing(LightData ld, - vec3 W, -#ifndef VOLUMETRICS - vec3 viewPosition, - float tracing_depth, - vec3 true_normal, - float rand_x, - const bool use_contact_shadows, -#endif - float vis) +float light_shadowing(LightData ld, vec3 P, float vis) { #if !defined(VOLUMETRICS) || defined(VOLUME_SHADOW) - /* shadowing */ if (ld.l_shadowid >= 0.0 && vis > 0.001) { - if (ld.l_type == SUN) { - vis *= sample_cascade_shadow(int(ld.l_shadowid), W); + vis *= sample_cascade_shadow(int(ld.l_shadowid), P); } else { - vis *= sample_cube_shadow(int(ld.l_shadowid), W); + vis *= sample_cube_shadow(int(ld.l_shadowid), P); } + } +#endif + return vis; +} -# ifndef VOLUMETRICS +#ifndef VOLUMETRICS +float light_contact_shadows( + LightData ld, vec3 P, vec3 vP, float tracing_depth, vec3 vNg, float rand_x, float vis) +{ + if (ld.l_shadowid >= 0.0 && vis > 0.001) { ShadowData sd = shadows_data[int(ld.l_shadowid)]; /* Only compute if not already in shadow. */ - if (use_contact_shadows && sd.sh_contact_dist > 0.0 && vis > 1e-8) { + if (sd.sh_contact_dist > 0.0) { /* Contact Shadows. */ vec3 ray_ori, ray_dir; float trace_distance; @@ -287,54 +284,34 @@ float light_shadowing(LightData ld, ray_dir = shadows_cascade_data[int(sd.sh_data_index)].sh_shadow_vec * trace_distance; } else { - ray_dir = shadows_cube_data[int(sd.sh_data_index)].position.xyz - W; + ray_dir = shadows_cube_data[int(sd.sh_data_index)].position.xyz - P; float len = length(ray_dir); trace_distance = min(sd.sh_contact_dist, len); ray_dir *= trace_distance / len; } ray_dir = transform_direction(ViewMatrix, ray_dir); - ray_ori = vec3(viewPosition.xy, tracing_depth) + true_normal * sd.sh_contact_offset; + ray_ori = vec3(vP.xy, tracing_depth) + vNg * sd.sh_contact_offset; vec3 hit_pos = raycast( -1, ray_ori, ray_dir, sd.sh_contact_thickness, rand_x, 0.1, 0.001, false); if (hit_pos.z > 0.0) { hit_pos = get_view_space_from_depth(hit_pos.xy, hit_pos.z); - float hit_dist = distance(viewPosition, hit_pos); + float hit_dist = distance(vP, hit_pos); float dist_ratio = hit_dist / trace_distance; - return vis * saturate(dist_ratio * 3.0 - 2.0); + return saturate(dist_ratio * 3.0 - 2.0); } } -# endif /* VOLUMETRICS */ } -#endif - - return vis; + return 1.0; } +#endif /* VOLUMETRICS */ -float light_visibility(LightData ld, - vec3 W, -#ifndef VOLUMETRICS - vec3 viewPosition, - float tracing_depth, - vec3 true_normal, - float rand_x, - const bool use_contact_shadows, -#endif - vec4 l_vector) +float light_visibility(LightData ld, vec3 P, vec4 l_vector) { float l_atten = light_attenuation(ld, l_vector); - return light_shadowing(ld, - W, -#ifndef VOLUMETRICS - viewPosition, - tracing_depth, - true_normal, - rand_x, - use_contact_shadows, -#endif - l_atten); + return light_shadowing(ld, P, l_atten); } float light_diffuse(LightData ld, vec3 N, vec3 V, vec4 l_vector) diff --git a/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl b/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl index 34999076f9c..fd08dfda060 100644 --- a/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl @@ -5,8 +5,12 @@ #pragma BLENDER_REQUIRE(common_view_lib.glsl) #pragma BLENDER_REQUIRE(common_uniforms_lib.glsl) -#pragma BLENDER_REQUIRE(closure_lib.glsl) -#pragma BLENDER_REQUIRE(closure_lit_lib.glsl) +#pragma BLENDER_REQUIRE(closure_type_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_diffuse_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_glossy_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_translucent_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_refraction_lib.glsl) #pragma BLENDER_REQUIRE(surface_lib.glsl) #ifdef USE_ALPHA_HASH diff --git a/source/blender/draw/engines/eevee/shaders/renderpass_postprocess_frag.glsl b/source/blender/draw/engines/eevee/shaders/renderpass_postprocess_frag.glsl index 0bbbe58c44a..363b5cb978a 100644 --- a/source/blender/draw/engines/eevee/shaders/renderpass_postprocess_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/renderpass_postprocess_frag.glsl @@ -82,7 +82,7 @@ void main() * with NaN's */ if (depth != 1.0 && any(notEqual(encoded_normal, vec2(0.0)))) { vec3 decoded_normal = normal_decode(texelFetch(inputBuffer, texel, 0).rg, vec3(0.0)); - vec3 world_normal = mat3(ViewMatrixInverse) * decoded_normal; + vec3 world_normal = transform_direction(ViewMatrixInverse, decoded_normal); color.rgb = world_normal; } else { diff --git a/source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl b/source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl index e0b9d4a60db..c48828b7b8d 100644 --- a/source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl @@ -36,20 +36,21 @@ void main() /* Convert to view Z. */ tracing_depth = get_view_z_from_depth(tracing_depth); - vec3 viewPosition = get_view_space_from_depth(uvs, depth); - vec3 worldPosition = transform_point(ViewMatrixInverse, viewPosition); + vec3 vP = get_view_space_from_depth(uvs, depth); + vec3 P = transform_point(ViewMatrixInverse, vP); - vec3 true_normal = normalize(cross(dFdx(viewPosition), dFdy(viewPosition))); + vec3 vNg = safe_normalize(cross(dFdx(vP), dFdy(vP))); for (int i = 0; i < MAX_LIGHT && i < laNumLight; i++) { LightData ld = lights_data[i]; vec4 l_vector; /* Non-Normalized Light Vector with length in last component. */ - l_vector.xyz = ld.l_position - worldPosition; + l_vector.xyz = ld.l_position - P; l_vector.w = length(l_vector.xyz); - float l_vis = light_shadowing( - ld, worldPosition, viewPosition, tracing_depth, true_normal, rand.x, true, 1.0); + float l_vis = light_shadowing(ld, P, 1.0); + + l_vis *= light_contact_shadows(ld, P, vP, tracing_depth, vNg, rand.x, 1.0); accum_light += l_vis; } diff --git a/source/blender/draw/engines/eevee/shaders/ssr_lib.glsl b/source/blender/draw/engines/eevee/shaders/ssr_lib.glsl index 29495e98355..15c28efe622 100644 --- a/source/blender/draw/engines/eevee/shaders/ssr_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/ssr_lib.glsl @@ -9,8 +9,7 @@ #define BTDF_BIAS 0.85 -vec4 screen_space_refraction( - vec3 viewPosition, vec3 N, vec3 V, float ior, float roughnessSquared, vec4 rand) +vec4 screen_space_refraction(vec3 vP, vec3 N, vec3 V, float ior, float roughnessSquared, vec4 rand) { float a2 = max(5e-6, roughnessSquared * roughnessSquared); @@ -29,7 +28,7 @@ vec4 screen_space_refraction( pdf = pdf_ggx_reflect(NH, a2); } - vec3 vV = viewCameraVec; + vec3 vV = viewCameraVec(vP); float eta = 1.0 / ior; if (dot(H, V) < 0.0) { H = -H; @@ -41,11 +40,11 @@ vec4 screen_space_refraction( R = transform_direction(ViewMatrix, R); vec3 hit_pos = raycast( - -1, viewPosition, R * 1e16, ssrThickness, rand.y, ssrQuality, roughnessSquared, false); + -1, vP, R * 1e16, ssrThickness, rand.y, ssrQuality, roughnessSquared, false); if ((hit_pos.z > 0.0) && (F_eta(ior, dot(H, V)) < 1.0)) { hit_pos = get_view_space_from_depth(hit_pos.xy, hit_pos.z); - float hit_dist = distance(hit_pos, viewPosition); + float hit_dist = distance(hit_pos, vP); float cone_cos = cone_cosine(roughnessSquared); float cone_tan = sqrt(1 - cone_cos * cone_cos) / cone_cos; diff --git a/source/blender/draw/engines/eevee/shaders/surface_frag.glsl b/source/blender/draw/engines/eevee/shaders/surface_frag.glsl index d0297c8cb7f..62930b9944a 100644 --- a/source/blender/draw/engines/eevee/shaders/surface_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/surface_frag.glsl @@ -3,8 +3,13 @@ #pragma BLENDER_REQUIRE(common_hair_lib.glsl) #pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) -#pragma BLENDER_REQUIRE(closure_lib.glsl) -#pragma BLENDER_REQUIRE(closure_lit_lib.glsl) +#pragma BLENDER_REQUIRE(closure_type_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_diffuse_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_glossy_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_translucent_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_refraction_lib.glsl) + #pragma BLENDER_REQUIRE(surface_lib.glsl) #pragma BLENDER_REQUIRE(volumetric_lib.glsl) diff --git a/source/blender/draw/engines/eevee/shaders/surface_lib.glsl b/source/blender/draw/engines/eevee/shaders/surface_lib.glsl index b93a3a23eff..e80dc1761f0 100644 --- a/source/blender/draw/engines/eevee/shaders/surface_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/surface_lib.glsl @@ -13,7 +13,15 @@ uniform float refractionDepth; vec3 worldNormal; \ vec3 viewNormal; -#ifdef GPU_GEOMETRY_SHADER +#if defined(STEP_RESOLVE) || defined(STEP_RAYTRACE) +/* SSR will set these global variables itself. + * Also make false positive compiler warnings disapear by setting values. */ +vec3 worldPosition = vec3(0); +vec3 viewPosition = vec3(0); +vec3 worldNormal = vec3(0); +vec3 viewNormal = vec3(0); + +#elif defined(GPU_GEOMETRY_SHADER) in ShaderStageInterface{SURFACE_INTERFACE} dataIn[]; out ShaderStageInterface{SURFACE_INTERFACE} dataOut; @@ -24,7 +32,7 @@ out ShaderStageInterface{SURFACE_INTERFACE} dataOut; dataOut.worldNormal = dataIn[vert].worldNormal; \ dataOut.viewNormal = dataIn[vert].viewNormal; -#else +#else /* GPU_VERTEX_SHADER || GPU_FRAGMENT_SHADER*/ IN_OUT ShaderStageInterface{SURFACE_INTERFACE}; diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl index bac69ab0355..25661a0d731 100644 --- a/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl @@ -1,6 +1,6 @@ #pragma BLENDER_REQUIRE(volumetric_lib.glsl) -#pragma BLENDER_REQUIRE(closure_lib.glsl) +#pragma BLENDER_REQUIRE(closure_type_lib.glsl) /* Based on Frosbite Unified Volumetric. * https://www.ea.com/frostbite/news/physically-based-unified-volumetric-rendering-in-frostbite */ diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl index 806f1b5b205..e72bf8b9150 100644 --- a/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl @@ -29,15 +29,14 @@ void main() outTransmittance = texelFetch(volumeExtinction, volume_cell, 0); vec3 s_scattering = texelFetch(volumeScattering, volume_cell, 0).rgb; vec3 volume_ndc = volume_to_ndc((vec3(volume_cell) + volJitter.xyz) * volInvTexSize.xyz); - vec3 worldPosition = get_world_space_from_depth(volume_ndc.xy, volume_ndc.z); - vec3 wdir = cameraVec; + vec3 P = get_world_space_from_depth(volume_ndc.xy, volume_ndc.z); + vec3 V = cameraVec(P); vec2 phase = texelFetch(volumePhase, volume_cell, 0).rg; float s_anisotropy = phase.x / max(1.0, phase.y); /* Environment : Average color. */ - outScattering.rgb += irradiance_volumetric(worldPosition) * s_scattering * - phase_function_isotropic(); + outScattering.rgb += irradiance_volumetric(P) * s_scattering * phase_function_isotropic(); #ifdef VOLUME_LIGHTING /* Lights */ for (int i = 0; i < MAX_LIGHT && i < laNumLight; i++) { @@ -45,16 +44,15 @@ void main() LightData ld = lights_data[i]; vec4 l_vector; - l_vector.xyz = (ld.l_type == SUN) ? -ld.l_forward : ld.l_position - worldPosition; + l_vector.xyz = (ld.l_type == SUN) ? -ld.l_forward : ld.l_position - P; l_vector.w = length(l_vector.xyz); - float Vis = light_visibility(ld, worldPosition, l_vector); + float Vis = light_visibility(ld, P, l_vector); - vec3 Li = light_volume(ld, l_vector) * - light_volume_shadow(ld, worldPosition, l_vector, volumeExtinction); + vec3 Li = light_volume(ld, l_vector) * light_volume_shadow(ld, P, l_vector, volumeExtinction); outScattering.rgb += Li * Vis * s_scattering * - phase_function(-wdir, l_vector.xyz / l_vector.w, s_anisotropy); + phase_function(-V, l_vector.xyz / l_vector.w, s_anisotropy); } #endif diff --git a/source/blender/draw/engines/gpencil/gpencil_antialiasing.c b/source/blender/draw/engines/gpencil/gpencil_antialiasing.c index 511f09db247..eaf010e81c9 100644 --- a/source/blender/draw/engines/gpencil/gpencil_antialiasing.c +++ b/source/blender/draw/engines/gpencil/gpencil_antialiasing.c @@ -58,11 +58,11 @@ void GPENCIL_antialiasing_init(struct GPENCIL_Data *vedata) if (txl->smaa_search_tx == NULL) { txl->smaa_search_tx = GPU_texture_create_2d( "smaa_search", SEARCHTEX_WIDTH, SEARCHTEX_HEIGHT, 1, GPU_R8, NULL); - GPU_texture_update(txl->smaa_search_tx, GPU_DATA_UNSIGNED_BYTE, searchTexBytes); + GPU_texture_update(txl->smaa_search_tx, GPU_DATA_UBYTE, searchTexBytes); txl->smaa_area_tx = GPU_texture_create_2d( "smaa_area", AREATEX_WIDTH, AREATEX_HEIGHT, 1, GPU_RG8, NULL); - GPU_texture_update(txl->smaa_area_tx, GPU_DATA_UNSIGNED_BYTE, areaTexBytes); + GPU_texture_update(txl->smaa_area_tx, GPU_DATA_UBYTE, areaTexBytes); GPU_texture_filter_mode(txl->smaa_search_tx, true); GPU_texture_filter_mode(txl->smaa_area_tx, true); diff --git a/source/blender/draw/engines/gpencil/gpencil_cache_utils.c b/source/blender/draw/engines/gpencil/gpencil_cache_utils.c index 33b91efc848..ee51b751187 100644 --- a/source/blender/draw/engines/gpencil/gpencil_cache_utils.c +++ b/source/blender/draw/engines/gpencil/gpencil_cache_utils.c @@ -270,12 +270,12 @@ GPENCIL_tLayer *gpencil_layer_cache_add(GPENCIL_PrivateData *pd, const bool is_in_front = (ob->dtx & OB_DRAW_IN_FRONT); const bool is_screenspace = (gpd->flag & GP_DATA_STROKE_KEEPTHICKNESS) != 0; - const bool overide_vertcol = (pd->v3d_color_type != -1); + const bool override_vertcol = (pd->v3d_color_type != -1); const bool is_vert_col_mode = (pd->v3d_color_type == V3D_SHADING_VERTEX_COLOR) || GPENCIL_VERTEX_MODE(gpd) || pd->is_render; bool is_masked = (gpl->flag & GP_LAYER_USE_MASK) && !BLI_listbase_is_empty(&gpl->mask_layers); - float vert_col_opacity = (overide_vertcol) ? + float vert_col_opacity = (override_vertcol) ? (is_vert_col_mode ? pd->vertex_paint_opacity : 0.0f) : pd->is_render ? gpl->vertex_paint_opacity : pd->vertex_paint_opacity; diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c index e738b0d063c..8bb336ebc96 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine.c +++ b/source/blender/draw/engines/gpencil/gpencil_engine.c @@ -23,6 +23,7 @@ #include "DRW_render.h" #include "BKE_gpencil.h" +#include "BKE_gpencil_modifier.h" #include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_object.h" @@ -140,7 +141,7 @@ void GPENCIL_engine_init(void *ved) /* For non active frame, use only lines in multiedit mode. */ const bool overlays_on = (v3d->flag2 & V3D_HIDE_OVERLAYS) == 0; - stl->pd->use_multiedit_lines_only = !overlays_on || + stl->pd->use_multiedit_lines_only = overlays_on && (v3d->gp_flag & V3D_GP_SHOW_MULTIEDIT_LINES) != 0; const bool shmode_xray_support = v3d->shading.type <= OB_SOLID; @@ -487,6 +488,7 @@ static void gpencil_stroke_cache_populate(bGPDlayer *gpl, { gpIterPopulateData *iter = (gpIterPopulateData *)thunk; + bGPdata *gpd = iter->ob->data; MaterialGPencilStyle *gp_style = BKE_gpencil_material_settings(iter->ob, gps->mat_nr + 1); const bool is_render = iter->pd->is_render; @@ -495,12 +497,12 @@ static void gpencil_stroke_cache_populate(bGPDlayer *gpl, (!is_render && ((gps->flag & GP_STROKE_NOFILL) != 0)); bool show_fill = (gps->tot_triangles > 0) && ((gp_style->flag & GP_MATERIAL_FILL_SHOW) != 0) && (!iter->pd->simplify_fill) && ((gps->flag & GP_STROKE_NOFILL) == 0); - - bool only_lines = gpl && gpf && gpl->actframe != gpf && iter->pd->use_multiedit_lines_only; - bool hide_onion = gpl && gpf && gpf->runtime.onion_id != 0 && - ((gp_style->flag & GP_MATERIAL_HIDE_ONIONSKIN) != 0); - - if (hide_material || (!show_stroke && !show_fill) || (only_lines && hide_onion) || hide_onion) { + bool only_lines = !GPENCIL_PAINT_MODE(gpd) && gpl && gpf && gpl->actframe != gpf && + iter->pd->use_multiedit_lines_only; + bool is_onion = gpl && gpf && gpf->runtime.onion_id != 0; + bool hide_onion = is_onion && ((gp_style->flag & GP_MATERIAL_HIDE_ONIONSKIN) != 0); + if ((hide_material) || (!show_stroke && !show_fill) || (only_lines && !is_onion) || + (hide_onion)) { return; } @@ -621,19 +623,20 @@ void GPENCIL_cache_populate(void *ved, Object *ob) bool do_onion = (!pd->is_render) ? pd->do_onion : (gpd->onion_flag & GP_ONION_GHOST_ALWAYS); gpd->runtime.playing = (short)pd->playing; - /* When render in background the active frame could not be properly set due thread priority + /* When render in background the active frame could not be properly set due thread priority, * better set again. This is not required in viewport. */ if (txl->render_depth_tx) { - LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { - gpl->actframe = BKE_gpencil_layer_frame_get(gpl, pd->cfra, GP_GETFRAME_USE_PREV); - } - } + const bool time_remap = BKE_gpencil_has_time_modifiers(ob); + const DRWContextState *draw_ctx = DRW_context_state_get(); - /* When render in background the active frame could not be properly set due thread priority - * better set again. This is not required in viewport. */ - if (txl->render_depth_tx) { LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { - gpl->actframe = BKE_gpencil_layer_frame_get(gpl, pd->cfra, GP_GETFRAME_USE_PREV); + /* If there is a time modifier, need remap the time before. */ + if (time_remap) { + gpl->actframe = BKE_gpencil_frame_retime_get(draw_ctx->depsgraph, pd->scene, ob, gpl); + } + else { + gpl->actframe = BKE_gpencil_layer_frame_get(gpl, pd->cfra, GP_GETFRAME_USE_PREV); + } } } diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl index 3065d553dce..7412959a30b 100644 --- a/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl +++ b/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl @@ -156,6 +156,7 @@ IN_OUT ShaderStageInterface vec3 finalPos; vec2 finalUvs; noperspective float strokeThickness; + noperspective float unclampedThickness; noperspective float strokeHardeness; flat vec2 strokeAspect; flat vec2 strokePt1; @@ -324,7 +325,7 @@ vec2 safe_normalize_len(vec2 v, out float len) } } -float stroke_thickness_modulate(float thickness, out float opacity) +float stroke_thickness_modulate(float thickness) { /* Modify stroke thickness by object and layer factors.-*/ thickness *= thicknessScale; @@ -340,9 +341,14 @@ float stroke_thickness_modulate(float thickness, out float opacity) /* World space point size. */ thickness *= thicknessWorldScale * ProjectionMatrix[1][1] * sizeViewport.y; } - /* To avoid aliasing artifact, we clamp the line thickness and reduce its opacity. */ + return thickness; +} + +float clamp_small_stroke_thickness(float thickness) +{ + /* To avoid aliasing artifacts, we clamp the line thickness and + * reduce its opacity in the fragment shader.*/ float min_thickness = gl_Position.w * 1.3; - opacity = smoothstep(0.0, gl_Position.w * 1.0, thickness); thickness = max(min_thickness, thickness); return thickness; @@ -426,9 +432,9 @@ void stroke_vertex() vec2 line = safe_normalize_len(ss2 - ss1, line_len); vec2 line_adj = safe_normalize((use_curr) ? (ss1 - ss_adj) : (ss_adj - ss2)); - float small_line_opacity; float thickness = abs((use_curr) ? thickness1 : thickness2); - thickness = stroke_thickness_modulate(thickness, small_line_opacity); + thickness = stroke_thickness_modulate(thickness); + float clampedThickness = clamp_small_stroke_thickness(thickness); finalUvs = vec2(x, y) * 0.5 + 0.5; strokeHardeness = decode_hardness(use_curr ? hardness1 : hardness2); @@ -479,11 +485,12 @@ void stroke_vertex() /* Invert for vertex shader. */ strokeAspect = 1.0 / strokeAspect; - gl_Position.xy += (x * x_axis + y * y_axis) * sizeViewportInv.xy * thickness; + gl_Position.xy += (x * x_axis + y * y_axis) * sizeViewportInv.xy * clampedThickness; strokePt1 = ss1; strokePt2 = ss1 + x_axis * 0.5; - strokeThickness = (is_squares) ? 1e18 : (thickness / gl_Position.w); + strokeThickness = (is_squares) ? 1e18 : (clampedThickness / gl_Position.w); + unclampedThickness = (is_squares) ? 1e18 : (thickness / gl_Position.w); } else { bool is_stroke_start = (ma.x == -1 && x == -1); @@ -501,7 +508,8 @@ void stroke_vertex() strokePt1.xy = ss1; strokePt2.xy = ss2; - strokeThickness = thickness / gl_Position.w; + strokeThickness = clampedThickness / gl_Position.w; + unclampedThickness = thickness / gl_Position.w; strokeAspect = vec2(1.0); vec2 screen_ofs = miter * y; @@ -512,7 +520,7 @@ void stroke_vertex() screen_ofs += line * x; } - gl_Position.xy += screen_ofs * sizeViewportInv.xy * thickness; + gl_Position.xy += screen_ofs * sizeViewportInv.xy * clampedThickness; finalUvs.x = (use_curr) ? uv1.z : uv2.z; # ifdef GP_MATERIAL_BUFFER_LEN @@ -531,7 +539,7 @@ void stroke_vertex() vert_col = vec4(0.0); } - color_output(stroke_col, vert_col, vert_strength * small_line_opacity, mix_tex); + color_output(stroke_col, vert_col, vert_strength, mix_tex); matFlag = GP_FLAG(m) & ~GP_FILL_FLAGS; # endif @@ -607,6 +615,7 @@ void fill_vertex() strokeHardeness = 1.0; strokeThickness = 1e18; + unclampedThickness = 1e20; strokeAspect = vec2(1.0); strokePt1 = strokePt2 = vec2(0.0); diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl index 31e6df80d23..87365c2844d 100644 --- a/source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl +++ b/source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl @@ -89,6 +89,9 @@ void main() fragColor *= stroke_round_cap_mask( strokePt1, strokePt2, strokeAspect, strokeThickness, strokeHardeness); + /* To avoid aliasing artifacts, we reduce the opacity of small strokes. */ + fragColor *= smoothstep(0.0, 1.0, unclampedThickness); + /* Holdout materials. */ if (GP_FLAG_TEST(matFlag, GP_STROKE_HOLDOUT | GP_FILL_HOLDOUT)) { revealColor = fragColor.aaaa; diff --git a/source/blender/draw/engines/image/image_engine.c b/source/blender/draw/engines/image/image_engine.c index 04bdee131d7..d75f887ce2b 100644 --- a/source/blender/draw/engines/image/image_engine.c +++ b/source/blender/draw/engines/image/image_engine.c @@ -113,7 +113,8 @@ static void space_image_gpu_texture_get(Image *image, BKE_image_multiview_index(image, &sima->iuser); if (ibuf) { - if (sima->flag & SI_SHOW_ZBUF && (ibuf->zbuf || ibuf->zbuf_float || (ibuf->channels == 1))) { + const int sima_flag = sima->flag & ED_space_image_get_display_channel_mask(ibuf); + if (sima_flag & SI_SHOW_ZBUF && (ibuf->zbuf || ibuf->zbuf_float || (ibuf->channels == 1))) { if (ibuf->zbuf) { BLI_assert(!"Integer based depth buffers not supported"); } @@ -204,30 +205,31 @@ static void image_cache_image(IMAGE_Data *vedata, Image *image, ImageUser *iuser int draw_flags = 0; if (space_type == SPACE_IMAGE) { SpaceImage *sima = (SpaceImage *)draw_ctx->space_data; + const int sima_flag = sima->flag & ED_space_image_get_display_channel_mask(ibuf); const bool do_repeat = (!is_tiled_texture) && ((sima->flag & SI_DRAW_TILE) != 0); SET_FLAG_FROM_TEST(draw_flags, do_repeat, IMAGE_DRAW_FLAG_DO_REPEAT); SET_FLAG_FROM_TEST(draw_flags, is_tiled_texture, IMAGE_DRAW_FLAG_USE_WORLD_POS); - if ((sima->flag & SI_USE_ALPHA) != 0) { + if ((sima_flag & SI_USE_ALPHA) != 0) { /* Show RGBA */ draw_flags |= IMAGE_DRAW_FLAG_SHOW_ALPHA | IMAGE_DRAW_FLAG_APPLY_ALPHA; } - else if ((sima->flag & SI_SHOW_ALPHA) != 0) { + else if ((sima_flag & SI_SHOW_ALPHA) != 0) { draw_flags |= IMAGE_DRAW_FLAG_SHUFFLING; copy_v4_fl4(shuffle, 0.0f, 0.0f, 0.0f, 1.0f); } - else if ((sima->flag & SI_SHOW_ZBUF) != 0) { + else if ((sima_flag & SI_SHOW_ZBUF) != 0) { draw_flags |= IMAGE_DRAW_FLAG_DEPTH | IMAGE_DRAW_FLAG_SHUFFLING; copy_v4_fl4(shuffle, 1.0f, 0.0f, 0.0f, 0.0f); } - else if ((sima->flag & SI_SHOW_R) != 0) { + else if ((sima_flag & SI_SHOW_R) != 0) { draw_flags |= IMAGE_DRAW_FLAG_APPLY_ALPHA | IMAGE_DRAW_FLAG_SHUFFLING; copy_v4_fl4(shuffle, 1.0f, 0.0f, 0.0f, 0.0f); } - else if ((sima->flag & SI_SHOW_G) != 0) { + else if ((sima_flag & SI_SHOW_G) != 0) { draw_flags |= IMAGE_DRAW_FLAG_APPLY_ALPHA | IMAGE_DRAW_FLAG_SHUFFLING; copy_v4_fl4(shuffle, 0.0f, 1.0f, 0.0f, 0.0f); } - else if ((sima->flag & SI_SHOW_B) != 0) { + else if ((sima_flag & SI_SHOW_B) != 0) { draw_flags |= IMAGE_DRAW_FLAG_APPLY_ALPHA | IMAGE_DRAW_FLAG_SHUFFLING; copy_v4_fl4(shuffle, 0.0f, 0.0f, 1.0f, 0.0f); } @@ -283,6 +285,7 @@ static void image_cache_image(IMAGE_Data *vedata, Image *image, ImageUser *iuser /* -------------------------------------------------------------------- */ /** \name Engine Callbacks * \{ */ + static void IMAGE_engine_init(void *ved) { IMAGE_shader_library_ensure(); @@ -394,7 +397,8 @@ static void IMAGE_engine_free(void) IMAGE_shader_free(); } -/* \} */ +/** \} */ + static const DrawEngineDataSize IMAGE_data_size = DRW_VIEWPORT_DATA_SIZE(IMAGE_Data); DrawEngineType draw_engine_image_type = { diff --git a/source/blender/draw/engines/overlay/overlay_edit_uv.c b/source/blender/draw/engines/overlay/overlay_edit_uv.c index 97dcf934c11..fe0741d1606 100644 --- a/source/blender/draw/engines/overlay/overlay_edit_uv.c +++ b/source/blender/draw/engines/overlay/overlay_edit_uv.c @@ -401,7 +401,8 @@ void OVERLAY_edit_uv_cache_init(OVERLAY_Data *vedata) /* HACK: When editing objects that share the same mesh we should only draw the * first one in the order that is used during uv editing. We can only trust that the first object * has the correct batches with the correct selection state. See T83187. */ - if (pd->edit_uv.do_uv_overlay || pd->edit_uv.do_uv_shadow_overlay) { + if ((pd->edit_uv.do_uv_overlay || pd->edit_uv.do_uv_shadow_overlay) && + draw_ctx->obact->type == OB_MESH) { uint objects_len = 0; Object **objects = BKE_view_layer_array_from_objects_in_mode_unique_data( draw_ctx->view_layer, NULL, &objects_len, draw_ctx->object_mode); @@ -574,4 +575,4 @@ void OVERLAY_edit_uv_draw(OVERLAY_Data *vedata) OVERLAY_edit_uv_draw_finish(vedata); } -/* \} */ +/** \} */ diff --git a/source/blender/draw/engines/overlay/overlay_gpencil.c b/source/blender/draw/engines/overlay/overlay_gpencil.c index 19af3ae7e5d..891142fe0a2 100644 --- a/source/blender/draw/engines/overlay/overlay_gpencil.c +++ b/source/blender/draw/engines/overlay/overlay_gpencil.c @@ -85,7 +85,9 @@ void OVERLAY_edit_gpencil_cache_init(OVERLAY_Data *vedata) (GPENCIL_VERTEX_MODE(gpd) && !use_vertex_mask)); const bool do_multiedit = GPENCIL_MULTIEDIT_SESSIONS_ON(gpd); - const bool show_multi_edit_lines = (v3d->gp_flag & V3D_GP_SHOW_MULTIEDIT_LINES) != 0; + const bool show_multi_edit_lines = (do_multiedit) && + ((v3d->gp_flag & (V3D_GP_SHOW_MULTIEDIT_LINES | + V3D_GP_SHOW_EDIT_LINES)) != 0); const bool show_lines = (v3d->gp_flag & V3D_GP_SHOW_EDIT_LINES) || show_multi_edit_lines; diff --git a/source/blender/draw/engines/overlay/overlay_grid.c b/source/blender/draw/engines/overlay/overlay_grid.c index 87aa013f03a..5bb157ed081 100644 --- a/source/blender/draw/engines/overlay/overlay_grid.c +++ b/source/blender/draw/engines/overlay/overlay_grid.c @@ -93,7 +93,7 @@ void OVERLAY_grid_init(OVERLAY_Data *vedata) DRW_view_viewmat_get(NULL, viewmat, false); DRW_view_viewmat_get(NULL, viewinv, true); - /* if perps */ + /* If perspective view or non-axis aligned view. */ if (winmat[3][3] == 0.0f || rv3d->view == RV3D_VIEW_USER) { if (show_axis_x) { shd->grid_flag |= PLANE_XY | SHOW_AXIS_X; diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c index 6b07547bf96..c9c26e3faaa 100644 --- a/source/blender/draw/engines/overlay/overlay_shader.c +++ b/source/blender/draw/engines/overlay/overlay_shader.c @@ -1684,7 +1684,7 @@ GPUShader *OVERLAY_shader_edit_uv_tiled_image_borders_get(void) return sh_data->edit_uv_tiled_image_borders; } -/* \} */ +/** \} */ static OVERLAY_InstanceFormats g_formats = {NULL}; diff --git a/source/blender/draw/engines/overlay/shaders/edit_curve_handle_geom.glsl b/source/blender/draw/engines/overlay/shaders/edit_curve_handle_geom.glsl index ad791a9416d..036efa41555 100644 --- a/source/blender/draw/engines/overlay/shaders/edit_curve_handle_geom.glsl +++ b/source/blender/draw/engines/overlay/shaders/edit_curve_handle_geom.glsl @@ -1,7 +1,7 @@ /* Keep the same value of `ACTIVE_NURB` in `draw_cache_imp_curve.c` */ -#define ACTIVE_NURB 1 << 2 -#define EVEN_U_BIT 1 << 4 +#define ACTIVE_NURB (1 << 2) +#define EVEN_U_BIT (1 << 4) #define COLOR_SHIFT 5 /* Keep the same value in `handle_display` in `DNA_view3d_types.h` */ diff --git a/source/blender/draw/engines/overlay/shaders/edit_curve_point_vert.glsl b/source/blender/draw/engines/overlay/shaders/edit_curve_point_vert.glsl index 64cc1b7d840..5f2154f00b8 100644 --- a/source/blender/draw/engines/overlay/shaders/edit_curve_point_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/edit_curve_point_vert.glsl @@ -1,6 +1,6 @@ /* Keep the same value of `BEZIER_HANDLE` in `draw_cache_imp_curve.c` */ -#define BEZIER_HANDLE 1 << 3 +#define BEZIER_HANDLE (1 << 3) /* Keep the same value in `handle_display` in `DNA_view3d_types.h` */ #define CURVE_HANDLE_SELECTED 0 diff --git a/source/blender/draw/engines/overlay/shaders/edit_mesh_geom.glsl b/source/blender/draw/engines/overlay/shaders/edit_mesh_geom.glsl index 92252bbd223..66fa85685e2 100644 --- a/source/blender/draw/engines/overlay/shaders/edit_mesh_geom.glsl +++ b/source/blender/draw/engines/overlay/shaders/edit_mesh_geom.glsl @@ -4,7 +4,7 @@ layout(triangle_strip, max_vertices = 4) out; in vec4 finalColor[2]; in vec4 finalColorOuter[2]; -in int selectOveride[2]; +in int selectOverride[2]; flat out vec4 finalColorOuter_f; out vec4 finalColor_f; @@ -80,7 +80,7 @@ void main() #ifdef USE_WORLD_CLIP_PLANES world_clip_planes_set_clip_distance(gl_in[1].gl_ClipDistance); #endif - vec4 final_color = (selectOveride[0] == 0) ? finalColor[1] : finalColor[0]; + vec4 final_color = (selectOverride[0] == 0) ? finalColor[1] : finalColor[0]; do_vertex(final_color, pos1, half_size, edge_ofs.xy); do_vertex(final_color, pos1, -half_size, -edge_ofs.xy); diff --git a/source/blender/draw/engines/overlay/shaders/edit_mesh_vert.glsl b/source/blender/draw/engines/overlay/shaders/edit_mesh_vert.glsl index 2cefab56722..a3ff277b714 100644 --- a/source/blender/draw/engines/overlay/shaders/edit_mesh_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/edit_mesh_vert.glsl @@ -17,7 +17,7 @@ out vec4 finalColor; out vec4 finalColorOuter; #endif #ifdef USE_GEOM_SHADER -out int selectOveride; +out int selectOverride; #endif bool test_occlusion() @@ -59,10 +59,10 @@ void main() #elif defined(EDGE) # ifdef FLAT finalColor = EDIT_MESH_edge_color_inner(m_data.y); - selectOveride = 1; + selectOverride = 1; # else finalColor = EDIT_MESH_edge_vertex_color(m_data.y); - selectOveride = (m_data.y & EDGE_SELECTED); + selectOverride = (m_data.y & EDGE_SELECTED); # endif float crease = float(m_data.z) / 255.0; diff --git a/source/blender/draw/engines/overlay/shaders/grid_frag.glsl b/source/blender/draw/engines/overlay/shaders/grid_frag.glsl index 9cf6898cf18..3220adbff36 100644 --- a/source/blender/draw/engines/overlay/shaders/grid_frag.glsl +++ b/source/blender/draw/engines/overlay/shaders/grid_frag.glsl @@ -187,8 +187,8 @@ void main() FragColor = colorGrid; FragColor.a *= gridA * blend; - FragColor = mix(FragColor, mix(colorGrid, colorGridEmphasise, blend), gridB); - FragColor = mix(FragColor, colorGridEmphasise, gridC); + FragColor = mix(FragColor, mix(colorGrid, colorGridEmphasis, blend), gridB); + FragColor = mix(FragColor, colorGridEmphasis, gridC); } else { FragColor = vec4(colorGrid.rgb, 0.0); diff --git a/source/blender/draw/engines/workbench/shaders/workbench_effect_dof_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_effect_dof_frag.glsl index 102a8ddca7b..8f6940a6062 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_effect_dof_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_effect_dof_frag.glsl @@ -24,9 +24,6 @@ uniform sampler2D noiseTex; #define dof_distance dofParams.y #define dof_invsensorsize dofParams.z -#define weighted_sum(a, b, c, d, e, e_sum) \ - ((a)*e.x + (b)*e.y + (c)*e.z + (d)*e.w) / max(1e-6, e_sum); - /* divide by sensor size to get the normalized size */ #define calculate_coc(zdepth) \ (dof_aperturesize * (dof_distance / zdepth - 1.0) * dof_invsensorsize) @@ -89,8 +86,7 @@ void main() /* now write output to weighted buffers. */ /* Take far plane pixels in priority. */ vec4 w = any(notEqual(far_weights, vec4(0.0))) ? far_weights : near_weights; - float tot_weight = dot(w, vec4(1.0)); - halfResColor = weighted_sum(color1, color2, color3, color4, w, tot_weight); + halfResColor = weighted_sum(color1, color2, color3, color4, w); halfResColor = clamp(halfResColor, 0.0, 3.0); normalizedCoc = encode_coc(coc_near, coc_far); @@ -138,8 +134,7 @@ void main() /* now write output to weighted buffers. */ vec4 w = any(notEqual(far_weights, vec4(0.0))) ? far_weights : near_weights; - float tot_weight = dot(w, vec4(1.0)); - outColor = weighted_sum(color1, color2, color3, color4, w, tot_weight); + outColor = weighted_sum(color1, color2, color3, color4, w); outCocs = encode_coc(coc_near, coc_far); } diff --git a/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl index 2dea2fc4883..9797a5e3301 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl @@ -5,7 +5,7 @@ uniform sampler2D searchTex; uniform sampler2D blendTex; uniform sampler2D colorTex; uniform float mixFactor; -uniform float taaSampleCountInv; +uniform float taaAccumulatedWeight; in vec2 uvs; in vec2 pixcoord; @@ -39,6 +39,12 @@ void main() if (mixFactor < 1.0) { fragColor += texture(colorTex, uvs) * (1.0 - mixFactor); } - fragColor *= taaSampleCountInv; + fragColor /= taaAccumulatedWeight; + fragColor = exp2(fragColor) - 0.5; + + /* Avoid float precision issue. */ + if (fragColor.a > 0.999) { + fragColor.a = 1.0; + } #endif } diff --git a/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl index b877c2c3f76..d021e4696f7 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl @@ -1,11 +1,22 @@ uniform sampler2D colorBuffer; - -in vec4 uvcoordsvar; +uniform float samplesWeights[9]; out vec4 fragColor; void main() { - fragColor = texture(colorBuffer, uvcoordsvar.st); + vec2 texel_size = 1.0 / vec2(textureSize(colorBuffer, 0)); + vec2 uv = gl_FragCoord.xy * texel_size; + + fragColor = vec4(0.0); + int i = 0; + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++, i++) { + /* Use log2 space to avoid highlights creating too much aliasing. */ + vec4 color = log2(texture(colorBuffer, uv + vec2(x, y) * texel_size) + 0.5); + + fragColor += color * samplesWeights[i]; + } + } } diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c index 4f689fd55a5..b84ddec4973 100644 --- a/source/blender/draw/engines/workbench/workbench_data.c +++ b/source/blender/draw/engines/workbench/workbench_data.c @@ -84,7 +84,7 @@ static WORKBENCH_ViewLayerData *workbench_view_layer_data_ensure_ex(struct ViewL return *vldata; } -/* \} */ +/** \} */ static void workbench_studiolight_data_update(WORKBENCH_PrivateData *wpd, WORKBENCH_UBO_World *wd) { diff --git a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c index feb48b2623d..10a782c9987 100644 --- a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c +++ b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c @@ -64,10 +64,17 @@ static void workbench_taa_jitter_init_order(float (*table)[2], int num) } } - /* move jitter table so that closest sample is in center */ + float closest_sample[2]; + copy_v2_v2(closest_sample, table[closest_index]); for (int index = 0; index < num; index++) { - sub_v2_v2(table[index], table[closest_index]); - mul_v2_fl(table[index], 2.0f); + /* move jitter table so that closest sample is in center */ + sub_v2_v2(table[index], closest_sample); + for (int i = 0; i < 2; i++) { + /* Avoid samples outside range (wrap around). */ + table[index][i] = fmodf(table[index][i] + 0.5f, 1.0f); + /* Recenter the distribution[-1..1]. */ + table[index][i] = table[index][i] * 2.0f - 1.0f; + } } /* swap center sample to the start of the table */ @@ -244,11 +251,11 @@ void workbench_antialiasing_engine_init(WORKBENCH_Data *vedata) if (txl->smaa_search_tx == NULL) { txl->smaa_search_tx = GPU_texture_create_2d( "smaa_search", SEARCHTEX_WIDTH, SEARCHTEX_HEIGHT, 1, GPU_R8, NULL); - GPU_texture_update(txl->smaa_search_tx, GPU_DATA_UNSIGNED_BYTE, searchTexBytes); + GPU_texture_update(txl->smaa_search_tx, GPU_DATA_UBYTE, searchTexBytes); txl->smaa_area_tx = GPU_texture_create_2d( "smaa_area", AREATEX_WIDTH, AREATEX_HEIGHT, 1, GPU_RG8, NULL); - GPU_texture_update(txl->smaa_area_tx, GPU_DATA_UNSIGNED_BYTE, areaTexBytes); + GPU_texture_update(txl->smaa_area_tx, GPU_DATA_UBYTE, areaTexBytes); GPU_texture_filter_mode(txl->smaa_search_tx, true); GPU_texture_filter_mode(txl->smaa_area_tx, true); @@ -264,6 +271,37 @@ void workbench_antialiasing_engine_init(WORKBENCH_Data *vedata) } } +static float filter_blackman_harris(float x, const float width) +{ + if (x > width * 0.5f) { + return 0.0f; + } + x = 2.0f * M_PI * clamp_f((x / width + 0.5f), 0.0f, 1.0f); + return 0.35875f - 0.48829f * cosf(x) + 0.14128f * cosf(2.0f * x) - 0.01168f * cosf(3.0f * x); +} + +/* Compute weights for the 3x3 neighborhood using a 1.5px filter. */ +static void workbench_antialiasing_weights_get(const float offset[2], + float r_weights[9], + float *r_weight_sum) +{ + /* NOTE: If filter width is bigger than 2.0f, then we need to sample more neighborhood. */ + const float filter_width = 2.0f; + *r_weight_sum = 0.0f; + int i = 0; + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++, i++) { + float sample_co[2] = {x, y}; + sub_v2_v2(sample_co, offset); + float r = len_v2(sample_co); + /* fclem: is radial distance ok here? */ + float weight = filter_blackman_harris(r, filter_width); + *r_weight_sum += weight; + r_weights[i] = weight; + } + } +} + void workbench_antialiasing_cache_init(WORKBENCH_Data *vedata) { WORKBENCH_TextureList *txl = vedata->txl; @@ -278,10 +316,12 @@ void workbench_antialiasing_cache_init(WORKBENCH_Data *vedata) { DRW_PASS_CREATE(psl->aa_accum_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD_FULL); + DRW_PASS_INSTANCE_CREATE(psl->aa_accum_replace_ps, psl->aa_accum_ps, DRW_STATE_WRITE_COLOR); GPUShader *shader = workbench_shader_antialiasing_accumulation_get(); grp = DRW_shgroup_create(shader, psl->aa_accum_ps); - DRW_shgroup_uniform_texture(grp, "colorBuffer", dtxl->color); + DRW_shgroup_uniform_texture_ex(grp, "colorBuffer", dtxl->color, GPU_SAMPLER_DEFAULT); + DRW_shgroup_uniform_float(grp, "samplesWeights", wpd->taa_weights, 9); DRW_shgroup_call_procedural_triangles(grp, NULL, 1); } @@ -325,7 +365,7 @@ void workbench_antialiasing_cache_init(WORKBENCH_Data *vedata) DRW_shgroup_uniform_texture(grp, "colorTex", txl->history_buffer_tx); DRW_shgroup_uniform_vec4_copy(grp, "viewportMetrics", metrics); DRW_shgroup_uniform_float(grp, "mixFactor", &wpd->smaa_mix_factor, 1); - DRW_shgroup_uniform_float(grp, "taaSampleCountInv", &wpd->taa_sample_inv, 1); + DRW_shgroup_uniform_float(grp, "taaAccumulatedWeight", &wpd->taa_weight_accum, 1); DRW_shgroup_call_procedural_triangles(grp, NULL, 1); } @@ -369,6 +409,8 @@ bool workbench_antialiasing_setup(WORKBENCH_Data *vedata) break; } + workbench_antialiasing_weights_get(transform_offset, wpd->taa_weights, &wpd->taa_weights_sum); + /* construct new matrices from transform delta */ float winmat[4][4], viewmat[4][4], persmat[4][4]; DRW_view_winmat_get(default_view, winmat, false); @@ -419,8 +461,11 @@ void workbench_antialiasing_draw_pass(WORKBENCH_Data *vedata) const bool last_sample = wpd->taa_sample + 1 == wpd->taa_sample_len; const bool taa_finished = wpd->taa_sample >= wpd->taa_sample_len; if (wpd->taa_sample == 0) { + wpd->taa_weight_accum = wpd->taa_weights_sum; wpd->valid_history = true; - GPU_texture_copy(txl->history_buffer_tx, dtxl->color); + + GPU_framebuffer_bind(fbl->antialiasing_fb); + DRW_draw_pass(psl->aa_accum_replace_ps); /* In playback mode, we are sure the next redraw will not use the same viewmatrix. * In this case no need to save the depth buffer. */ if (!wpd->is_playback) { @@ -435,6 +480,7 @@ void workbench_antialiasing_draw_pass(WORKBENCH_Data *vedata) /* Accumulate result to the TAA buffer. */ GPU_framebuffer_bind(fbl->antialiasing_fb); DRW_draw_pass(psl->aa_accum_ps); + wpd->taa_weight_accum += wpd->taa_weights_sum; } /* Copy back the saved depth buffer for correct overlays. */ GPU_texture_copy(dtxl->depth, txl->depth_buffer_tx); @@ -446,7 +492,6 @@ void workbench_antialiasing_draw_pass(WORKBENCH_Data *vedata) if (!DRW_state_is_image_render() || last_sample) { /* After a certain point SMAA is no longer necessary. */ wpd->smaa_mix_factor = 1.0f - clamp_f(wpd->taa_sample / 4.0f, 0.0f, 1.0f); - wpd->taa_sample_inv = 1.0f / min_ii(wpd->taa_sample + 1, wpd->taa_sample_len); if (wpd->smaa_mix_factor > 0.0f) { GPU_framebuffer_bind(fbl->smaa_edge_fb); diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h index 522aae7f542..6247436feea 100644 --- a/source/blender/draw/engines/workbench/workbench_private.h +++ b/source/blender/draw/engines/workbench/workbench_private.h @@ -164,6 +164,7 @@ typedef struct WORKBENCH_PassList { struct DRWPass *volume_ps; struct DRWPass *aa_accum_ps; + struct DRWPass *aa_accum_replace_ps; struct DRWPass *aa_edge_ps; struct DRWPass *aa_weight_ps; struct DRWPass *aa_resolve_ps; @@ -286,8 +287,12 @@ typedef struct WORKBENCH_PrivateData { int taa_sample_len_previous; /** Current TAA sample index in [0..taa_sample_len[ range. */ int taa_sample; - /** Inverse of taa_sample to divide the accumulation buffer. */ - float taa_sample_inv; + /** Weight accumulated. */ + float taa_weight_accum; + /** Samples weight for this iteration. */ + float taa_weights[9]; + /** Sum of taa_weights. */ + float taa_weights_sum; /** If the view has been updated and TAA needs to be reset. */ bool view_updated; /** True if the history buffer contains relevant data and false if it could contain garbage. */ diff --git a/source/blender/draw/engines/workbench/workbench_render.c b/source/blender/draw/engines/workbench/workbench_render.c index 47592578c34..f2d178f6565 100644 --- a/source/blender/draw/engines/workbench/workbench_render.c +++ b/source/blender/draw/engines/workbench/workbench_render.c @@ -54,7 +54,7 @@ static void workbench_render_matrices_init(RenderEngine *engine, Depsgraph *deps /* TODO(sergey): Shall render hold pointer to an evaluated camera instead? */ struct Object *ob_camera_eval = DEG_get_evaluated_object(depsgraph, RE_GetCamera(engine->re)); - /* Set the persective, view and window matrix. */ + /* Set the perspective, view and window matrix. */ float winmat[4][4], viewmat[4][4], viewinv[4][4]; RE_GetCameraWindow(engine->re, ob_camera_eval, winmat); diff --git a/source/blender/draw/intern/draw_cache_extract.h b/source/blender/draw/intern/draw_cache_extract.h index a0679ba6442..c929fe7dfd3 100644 --- a/source/blender/draw/intern/draw_cache_extract.h +++ b/source/blender/draw/intern/draw_cache_extract.h @@ -109,8 +109,8 @@ typedef struct MeshBufferCache { /* Only for edit mode. */ GPUVertBuf *edit_data; /* extend */ GPUVertBuf *edituv_data; - GPUVertBuf *stretch_area; - GPUVertBuf *stretch_angle; + GPUVertBuf *edituv_stretch_area; + GPUVertBuf *edituv_stretch_angle; GPUVertBuf *mesh_analysis; GPUVertBuf *fdots_pos; GPUVertBuf *fdots_nor; diff --git a/source/blender/draw/intern/draw_cache_extract_mesh.c b/source/blender/draw/intern/draw_cache_extract_mesh.c index d9fbb01789f..f167ea3d540 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh.c +++ b/source/blender/draw/intern/draw_cache_extract_mesh.c @@ -3849,9 +3849,9 @@ static const MeshExtract extract_edituv_data = { /** \name Extract Edit UV area stretch * \{ */ -static void *extract_stretch_area_init(const MeshRenderData *mr, - struct MeshBatchCache *UNUSED(cache), - void *buf) +static void *extract_edituv_stretch_area_init(const MeshRenderData *mr, + struct MeshBatchCache *UNUSED(cache), + void *buf) { static GPUVertFormat format = {0}; if (format.attr_len == 0) { @@ -3880,10 +3880,10 @@ BLI_INLINE float area_ratio_to_stretch(float ratio, float tot_ratio, float inv_t return (ratio > 1.0f) ? (1.0f / ratio) : ratio; } -static void mesh_stretch_area_finish(const MeshRenderData *mr, - struct MeshBatchCache *cache, - void *buf, - void *UNUSED(data)) +static void mesh_edituv_stretch_area_finish(const MeshRenderData *mr, + struct MeshBatchCache *cache, + void *buf, + void *UNUSED(data)) { float tot_area = 0.0f, tot_uv_area = 0.0f; float *area_ratio = MEM_mallocN(sizeof(float) * mr->poly_len, __func__); @@ -3903,7 +3903,8 @@ static void mesh_stretch_area_finish(const MeshRenderData *mr, area_ratio[f] = area_ratio_get(area, uvarea); } } - else if (mr->extract_type == MR_EXTRACT_MAPPED) { + else { + BLI_assert(ELEM(mr->extract_type, MR_EXTRACT_MAPPED, MR_EXTRACT_MESH)); const MLoopUV *uv_data = CustomData_get_layer(&mr->me->ldata, CD_MLOOPUV); const MPoly *mp = mr->mpoly; for (int mp_index = 0; mp_index < mr->poly_len; mp_index++, mp++) { @@ -3914,10 +3915,6 @@ static void mesh_stretch_area_finish(const MeshRenderData *mr, area_ratio[mp_index] = area_ratio_get(area, uvarea); } } - else { - /* Should not happen. */ - BLI_assert(0); - } cache->tot_area = tot_area; cache->tot_uv_area = tot_uv_area; @@ -3942,7 +3939,8 @@ static void mesh_stretch_area_finish(const MeshRenderData *mr, } } } - else if (mr->extract_type == MR_EXTRACT_MAPPED) { + else { + BLI_assert(ELEM(mr->extract_type, MR_EXTRACT_MAPPED, MR_EXTRACT_MESH)); const MPoly *mp = mr->mpoly; for (int mp_index = 0, l_index = 0; mp_index < mr->poly_len; mp_index++, mp++) { for (int i = 0; i < mp->totloop; i++, l_index++) { @@ -3950,17 +3948,13 @@ static void mesh_stretch_area_finish(const MeshRenderData *mr, } } } - else { - /* Should not happen. */ - BLI_assert(0); - } MEM_freeN(area_ratio); } -static const MeshExtract extract_stretch_area = { - .init = extract_stretch_area_init, - .finish = mesh_stretch_area_finish, +static const MeshExtract extract_edituv_stretch_area = { + .init = extract_edituv_stretch_area_init, + .finish = mesh_edituv_stretch_area_finish, .data_flag = 0, .use_threading = false, }; @@ -4007,9 +4001,9 @@ static short v2_to_short_angle(const float v[2]) return atan2f(v[1], v[0]) * (float)M_1_PI * SHRT_MAX; } -static void edituv_get_stretch_angle(float auv[2][2], - const float av[2][3], - UVStretchAngle *r_stretch) +static void edituv_get_edituv_stretch_angle(float auv[2][2], + const float av[2][3], + UVStretchAngle *r_stretch) { /* Send UV's to the shader and let it compute the aspect corrected angle. */ r_stretch->uv_angles[0] = v2_to_short_angle(auv[0]); @@ -4025,9 +4019,9 @@ static void edituv_get_stretch_angle(float auv[2][2], #endif } -static void *extract_stretch_angle_init(const MeshRenderData *mr, - struct MeshBatchCache *UNUSED(cache), - void *buf) +static void *extract_edituv_stretch_angle_init(const MeshRenderData *mr, + struct MeshBatchCache *UNUSED(cache), + void *buf) { static GPUVertFormat format = {0}; if (format.attr_len == 0) { @@ -4047,18 +4041,16 @@ static void *extract_stretch_angle_init(const MeshRenderData *mr, if (mr->extract_type == MR_EXTRACT_BMESH) { data->cd_ofs = CustomData_get_offset(&mr->bm->ldata, CD_MLOOPUV); } - else if (mr->extract_type == MR_EXTRACT_MAPPED) { - data->luv = CustomData_get_layer(&mr->me->ldata, CD_MLOOPUV); - } else { - BLI_assert(0); + BLI_assert(ELEM(mr->extract_type, MR_EXTRACT_MAPPED, MR_EXTRACT_MESH)); + data->luv = CustomData_get_layer(&mr->me->ldata, CD_MLOOPUV); } return data; } -static void extract_stretch_angle_iter_poly_bm(const MeshRenderData *mr, - const ExtractPolyBMesh_Params *params, - void *_data) +static void extract_edituv_stretch_angle_iter_poly_bm(const MeshRenderData *mr, + const ExtractPolyBMesh_Params *params, + void *_data) { MeshExtract_StretchAngle_Data *data = _data; float(*auv)[2] = data->auv, *last_auv = data->last_auv; @@ -4098,14 +4090,14 @@ static void extract_stretch_angle_iter_poly_bm(const MeshRenderData *mr, compute_normalize_edge_vectors( auv, av, luv->uv, luv_next->uv, bm_vert_co_get(mr, l->v), bm_vert_co_get(mr, l_next->v)); } - edituv_get_stretch_angle(auv, av, &data->vbo_data[l_index]); + edituv_get_edituv_stretch_angle(auv, av, &data->vbo_data[l_index]); } EXTRACT_POLY_AND_LOOP_FOREACH_BM_END(l); } -static void extract_stretch_angle_iter_poly_mesh(const MeshRenderData *mr, - const ExtractPolyMesh_Params *params, - void *_data) +static void extract_edituv_stretch_angle_iter_poly_mesh(const MeshRenderData *mr, + const ExtractPolyMesh_Params *params, + void *_data) { MeshExtract_StretchAngle_Data *data = _data; @@ -4142,24 +4134,24 @@ static void extract_stretch_angle_iter_poly_mesh(const MeshRenderData *mr, compute_normalize_edge_vectors( auv, av, data->luv[ml_index].uv, data->luv[l_next].uv, v->co, v_next->co); } - edituv_get_stretch_angle(auv, av, &data->vbo_data[ml_index]); + edituv_get_edituv_stretch_angle(auv, av, &data->vbo_data[ml_index]); } EXTRACT_POLY_AND_LOOP_FOREACH_MESH_END; } -static void extract_stretch_angle_finish(const MeshRenderData *UNUSED(mr), - struct MeshBatchCache *UNUSED(cache), - void *UNUSED(buf), - void *data) +static void extract_edituv_stretch_angle_finish(const MeshRenderData *UNUSED(mr), + struct MeshBatchCache *UNUSED(cache), + void *UNUSED(buf), + void *data) { MEM_freeN(data); } -static const MeshExtract extract_stretch_angle = { - .init = extract_stretch_angle_init, - .iter_poly_bm = extract_stretch_angle_iter_poly_bm, - .iter_poly_mesh = extract_stretch_angle_iter_poly_mesh, - .finish = extract_stretch_angle_finish, +static const MeshExtract extract_edituv_stretch_angle = { + .init = extract_edituv_stretch_angle_init, + .iter_poly_bm = extract_edituv_stretch_angle_iter_poly_bm, + .iter_poly_mesh = extract_edituv_stretch_angle_iter_poly_mesh, + .finish = extract_edituv_stretch_angle_finish, .data_flag = 0, .use_threading = false, }; @@ -5984,8 +5976,8 @@ void mesh_buffer_cache_create_requested(struct TaskGraph *task_graph, TEST_ASSIGN(VBO, vbo, weights); TEST_ASSIGN(VBO, vbo, edit_data); TEST_ASSIGN(VBO, vbo, edituv_data); - TEST_ASSIGN(VBO, vbo, stretch_area); - TEST_ASSIGN(VBO, vbo, stretch_angle); + TEST_ASSIGN(VBO, vbo, edituv_stretch_area); + TEST_ASSIGN(VBO, vbo, edituv_stretch_angle); TEST_ASSIGN(VBO, vbo, mesh_analysis); TEST_ASSIGN(VBO, vbo, fdots_pos); TEST_ASSIGN(VBO, vbo, fdots_nor); @@ -6078,8 +6070,8 @@ void mesh_buffer_cache_create_requested(struct TaskGraph *task_graph, EXTRACT(vbo, weights); EXTRACT(vbo, edit_data); EXTRACT(vbo, edituv_data); - EXTRACT(vbo, stretch_area); - EXTRACT(vbo, stretch_angle); + EXTRACT(vbo, edituv_stretch_area); + EXTRACT(vbo, edituv_stretch_angle); EXTRACT(vbo, mesh_analysis); EXTRACT(vbo, fdots_pos); EXTRACT(vbo, fdots_nor); diff --git a/source/blender/draw/intern/draw_cache_impl_curve.c b/source/blender/draw/intern/draw_cache_impl_curve.c index 3ccada23d47..e9558fb320c 100644 --- a/source/blender/draw/intern/draw_cache_impl_curve.c +++ b/source/blender/draw/intern/draw_cache_impl_curve.c @@ -50,9 +50,9 @@ /* See: edit_curve_point_vert.glsl for duplicate includes. */ #define SELECT 1 -#define ACTIVE_NURB 1 << 2 -#define BEZIER_HANDLE 1 << 3 -#define EVEN_U_BIT 1 << 4 /* Alternate this bit for every U vert. */ +#define ACTIVE_NURB (1 << 2) +#define BEZIER_HANDLE (1 << 3) +#define EVEN_U_BIT (1 << 4) /* Alternate this bit for every U vert. */ #define COLOR_SHIFT 5 /* Used as values of `color_id` in `edit_curve_overlay_handle_geom.glsl` */ diff --git a/source/blender/draw/intern/draw_cache_impl_gpencil.c b/source/blender/draw/intern/draw_cache_impl_gpencil.c index 8feacf8b026..c07271a0d33 100644 --- a/source/blender/draw/intern/draw_cache_impl_gpencil.c +++ b/source/blender/draw/intern/draw_cache_impl_gpencil.c @@ -44,7 +44,7 @@ #include "draw_cache.h" #include "draw_cache_impl.h" -#define BEZIER_HANDLE 1 << 3 +#define BEZIER_HANDLE (1 << 3) #define COLOR_SHIFT 5 /* ---------------------------------------------------------------------- */ diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c index 1a1caa2943a..04bfb667d24 100644 --- a/source/blender/draw/intern/draw_cache_impl_mesh.c +++ b/source/blender/draw/intern/draw_cache_impl_mesh.c @@ -570,8 +570,8 @@ static void mesh_batch_cache_discard_shaded_tri(MeshBatchCache *cache) static void mesh_batch_cache_discard_uvedit(MeshBatchCache *cache) { FOREACH_MESH_BUFFER_CACHE (cache, mbufcache) { - GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.stretch_angle); - GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.stretch_area); + GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.edituv_stretch_angle); + GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.edituv_stretch_area); GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.uv); GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.edituv_data); GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.fdots_uv); @@ -1497,13 +1497,13 @@ void DRW_mesh_batch_cache_create_requested(struct TaskGraph *task_graph, DRW_ibo_request(cache->batch.edituv_faces_stretch_area, &mbufcache->ibo.edituv_tris); DRW_vbo_request(cache->batch.edituv_faces_stretch_area, &mbufcache->vbo.uv); DRW_vbo_request(cache->batch.edituv_faces_stretch_area, &mbufcache->vbo.edituv_data); - DRW_vbo_request(cache->batch.edituv_faces_stretch_area, &mbufcache->vbo.stretch_area); + DRW_vbo_request(cache->batch.edituv_faces_stretch_area, &mbufcache->vbo.edituv_stretch_area); } if (DRW_batch_requested(cache->batch.edituv_faces_stretch_angle, GPU_PRIM_TRIS)) { DRW_ibo_request(cache->batch.edituv_faces_stretch_angle, &mbufcache->ibo.edituv_tris); DRW_vbo_request(cache->batch.edituv_faces_stretch_angle, &mbufcache->vbo.uv); DRW_vbo_request(cache->batch.edituv_faces_stretch_angle, &mbufcache->vbo.edituv_data); - DRW_vbo_request(cache->batch.edituv_faces_stretch_angle, &mbufcache->vbo.stretch_angle); + DRW_vbo_request(cache->batch.edituv_faces_stretch_angle, &mbufcache->vbo.edituv_stretch_angle); } if (DRW_batch_requested(cache->batch.edituv_edges, GPU_PRIM_LINES)) { DRW_ibo_request(cache->batch.edituv_edges, &mbufcache->ibo.edituv_lines); @@ -1522,8 +1522,7 @@ void DRW_mesh_batch_cache_create_requested(struct TaskGraph *task_graph, } /* Meh loose Scene const correctness here. */ - const bool use_subsurf_fdots = scene ? BKE_modifiers_uses_subsurf_facedots((Scene *)scene, ob) : - false; + const bool use_subsurf_fdots = scene ? BKE_modifiers_uses_subsurf_facedots(scene, ob) : false; if (do_uvcage) { mesh_buffer_cache_create_requested(task_graph, diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c index fef8ba4b606..132b5274517 100644 --- a/source/blender/draw/intern/draw_common.c +++ b/source/blender/draw/intern/draw_common.c @@ -168,7 +168,7 @@ void DRW_globals_update(void) gb->colorBackground[0] + gb->colorBackground[1] + gb->colorBackground[2]) ? 20 : -10, - gb->colorGridEmphasise); + gb->colorGridEmphasis); /* Grid Axis */ UI_GetThemeColorBlendShade4fv(TH_GRID, TH_AXIS_X, 0.5f, -10, gb->colorGridAxisX); UI_GetThemeColorBlendShade4fv(TH_GRID, TH_AXIS_Y, 0.5f, -10, gb->colorGridAxisY); diff --git a/source/blender/draw/intern/draw_common.h b/source/blender/draw/intern/draw_common.h index a059ac32311..6e3a73a8314 100644 --- a/source/blender/draw/intern/draw_common.h +++ b/source/blender/draw/intern/draw_common.h @@ -131,7 +131,7 @@ typedef struct GlobalsUboStorage { float colorCurrentFrame[4]; float colorGrid[4]; - float colorGridEmphasise[4]; + float colorGridEmphasis[4]; float colorGridAxisX[4]; float colorGridAxisY[4]; float colorGridAxisZ[4]; diff --git a/source/blender/draw/intern/draw_hair_private.h b/source/blender/draw/intern/draw_hair_private.h index 33abae156cc..28bd5d4dfb5 100644 --- a/source/blender/draw/intern/draw_hair_private.h +++ b/source/blender/draw/intern/draw_hair_private.h @@ -24,7 +24,7 @@ #pragma once #define MAX_LAYER_NAME_CT 4 /* u0123456789, u, au, a0123456789 */ -#define MAX_LAYER_NAME_LEN GPU_MAX_SAFE_ATTR_NAME + 2 +#define MAX_LAYER_NAME_LEN (GPU_MAX_SAFE_ATTR_NAME + 2) #define MAX_THICKRES 2 /* see eHairType */ #define MAX_HAIR_SUBDIV 4 /* see hair_subdiv rna */ diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index fd40d38d238..244b0133e64 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -154,6 +154,7 @@ static bool drw_draw_show_annotation(void) /* -------------------------------------------------------------------- */ /** \name Threading * \{ */ + static void drw_task_graph_init(void) { BLI_assert(DST.task_graph == NULL); @@ -172,7 +173,8 @@ static void drw_task_graph_deinit(void) BLI_task_graph_free(DST.task_graph); DST.task_graph = NULL; } -/* \} */ + +/** \} */ /* -------------------------------------------------------------------- */ /** \name Settings @@ -1706,7 +1708,7 @@ void DRW_draw_render_loop_offscreen(struct Depsgraph *depsgraph, if (draw_background) { /* HACK(fclem): In this case we need to make sure the final alpha is 1. * We use the blend mode to ensure that. A better way to fix that would - * be to do that in the colormanagmeent shader. */ + * be to do that in the color-management shader. */ GPU_offscreen_bind(ofs, false); GPU_clear_color(0.0f, 0.0f, 0.0f, 1.0f); /* Premult Alpha over black background. */ diff --git a/source/blender/draw/intern/draw_manager_texture.c b/source/blender/draw/intern/draw_manager_texture.c index e9432f370b8..73afdd6e1e3 100644 --- a/source/blender/draw/intern/draw_manager_texture.c +++ b/source/blender/draw/intern/draw_manager_texture.c @@ -43,6 +43,7 @@ static bool drw_texture_format_supports_framebuffer(eGPUTextureFormat format) case GPU_RG16F: case GPU_RG16I: case GPU_RG32F: + case GPU_RGB10_A2: case GPU_R11F_G11F_B10F: case GPU_RGBA8: case GPU_RGBA16: diff --git a/source/blender/draw/intern/draw_select_buffer.c b/source/blender/draw/intern/draw_select_buffer.c index ee5561e1e38..b5151293c1b 100644 --- a/source/blender/draw/intern/draw_select_buffer.c +++ b/source/blender/draw/intern/draw_select_buffer.c @@ -91,7 +91,7 @@ uint *DRW_select_buffer_read(struct Depsgraph *depsgraph, BLI_rcti_size_y(&rect_clamp), 1, 0, - GPU_DATA_UNSIGNED_INT, + GPU_DATA_UINT, r_buf); if (!BLI_rcti_compare(rect, &rect_clamp)) { diff --git a/source/blender/draw/intern/draw_view.c b/source/blender/draw/intern/draw_view.c index 8ba3ee097df..2fb44d0030b 100644 --- a/source/blender/draw/intern/draw_view.c +++ b/source/blender/draw/intern/draw_view.c @@ -256,7 +256,7 @@ void DRW_draw_cursor_2d(void) GPU_matrix_projection_set(original_proj); } } -/* \} */ +/** \} */ /* **************************** 3D Gizmo ******************************** */ diff --git a/source/blender/draw/intern/shaders/common_globals_lib.glsl b/source/blender/draw/intern/shaders/common_globals_lib.glsl index 91fb822edac..3c76c8a5b28 100644 --- a/source/blender/draw/intern/shaders/common_globals_lib.glsl +++ b/source/blender/draw/intern/shaders/common_globals_lib.glsl @@ -95,7 +95,7 @@ layout(std140) uniform globalsBlock vec4 colorCurrentFrame; vec4 colorGrid; - vec4 colorGridEmphasise; + vec4 colorGridEmphasis; vec4 colorGridAxisX; vec4 colorGridAxisY; vec4 colorGridAxisZ; diff --git a/source/blender/draw/intern/shaders/common_math_lib.glsl b/source/blender/draw/intern/shaders/common_math_lib.glsl index a82e0b5a5e9..d02fd27f35f 100644 --- a/source/blender/draw/intern/shaders/common_math_lib.glsl +++ b/source/blender/draw/intern/shaders/common_math_lib.glsl @@ -3,12 +3,14 @@ /** \name Common Math Utilities * \{ */ -#define M_PI 3.14159265358979323846 /* pi */ -#define M_2PI 6.28318530717958647692 /* 2*pi */ -#define M_PI_2 1.57079632679489661923 /* pi/2 */ -#define M_1_PI 0.318309886183790671538 /* 1/pi */ -#define M_1_2PI 0.159154943091895335768 /* 1/(2*pi) */ -#define M_1_PI2 0.101321183642337771443 /* 1/(pi^2) */ +#define M_PI 3.14159265358979323846 /* pi */ +#define M_2PI 6.28318530717958647692 /* 2*pi */ +#define M_PI_2 1.57079632679489661923 /* pi/2 */ +#define M_1_PI 0.318309886183790671538 /* 1/pi */ +#define M_1_2PI 0.159154943091895335768 /* 1/(2*pi) */ +#define M_1_PI2 0.101321183642337771443 /* 1/(pi^2) */ +#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ +#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ #define FLT_MAX 3.402823e+38 vec3 mul(mat3 m, vec3 v) @@ -33,6 +35,13 @@ vec3 project_point(mat4 m, vec3 v) return tmp.xyz / tmp.w; } +mat2 rot2_from_angle(float a) +{ + float c = cos(a); + float s = sin(a); + return mat2(c, -s, s, c); +} + #define min3(a, b, c) min(a, min(b, c)) #define min4(a, b, c, d) min(a, min3(b, c, d)) #define min5(a, b, c, d, e) min(a, min4(b, c, d, e)) @@ -72,6 +81,22 @@ float sum(vec4 v) { return dot(vec4(1.0), v); } float avg(vec2 v) { return dot(vec2(1.0 / 2.0), v); } float avg(vec3 v) { return dot(vec3(1.0 / 3.0), v); } float avg(vec4 v) { return dot(vec4(1.0 / 4.0), v); } + +float safe_rcp(float a) { return (a != 0.0) ? (1.0 / a) : 0.0; } +vec2 safe_rcp(vec2 a) { return mix(vec2(0.0), (1.0 / a), notEqual(a, vec2(0.0))); } +vec4 safe_rcp(vec4 a) { return mix(vec4(0.0), (1.0 / a), notEqual(a, vec4(0.0))); } + +float sqr(float a) { return a * a; } +vec2 sqr(vec2 a) { return a * a; } +vec3 sqr(vec3 a) { return a * a; } +vec4 sqr(vec4 a) { return a * a; } + +float len_squared(vec3 a) { return dot(a, a); } +float len_squared(vec2 a) { return dot(a, a); } + +#define weighted_sum(val0, val1, val2, val3, weights) ((val0 * weights[0] + val1 * weights[1] + val2 * weights[2] + val3 * weights[3]) * safe_rcp(sum(weights))); +#define weighted_sum_array(val, weights) ((val[0] * weights[0] + val[1] * weights[1] + val[2] * weights[2] + val[3] * weights[3]) * safe_rcp(sum(weights))); + /* clang-format on */ #define saturate(a) clamp(a, 0.0, 1.0) @@ -88,9 +113,19 @@ float distance_squared(vec3 a, vec3 b) return dot(a, a); } -float len_squared(vec3 a) +vec3 safe_normalize(vec3 v) { - return dot(a, a); + float len = length(v); + if (isnan(len) || len == 0.0) { + return vec3(1.0, 0.0, 0.0); + } + return v / len; +} + +vec3 normalize_len(vec3 v, out float len) +{ + len = length(v); + return v / len; } /** \} */ @@ -128,3 +163,14 @@ vec2 fast_acos(vec2 v) } /** \} */ + +/* + * For debugging purpose mainly. + * From https://www.shadertoy.com/view/4dsSzr + * By Morgan McGuire @morgan3d, http://graphicscodex.com + * Reuse permitted under the BSD license. + */ +vec3 neon_gradient(float t) +{ + return clamp(vec3(t * 1.3 + 0.1, sqr(abs(0.43 - t) * 1.7), (1.0 - t) * 1.7), 0.0, 1.0); +} diff --git a/source/blender/draw/intern/shaders/common_view_lib.glsl b/source/blender/draw/intern/shaders/common_view_lib.glsl index 0f2782fc2b2..4012de4f95b 100644 --- a/source/blender/draw/intern/shaders/common_view_lib.glsl +++ b/source/blender/draw/intern/shaders/common_view_lib.glsl @@ -27,10 +27,8 @@ layout(std140) uniform viewBlock #define cameraForward ViewMatrixInverse[2].xyz #define cameraPos ViewMatrixInverse[3].xyz -#define cameraVec \ - ((ProjectionMatrix[3][3] == 0.0) ? normalize(cameraPos - worldPosition) : cameraForward) -#define viewCameraVec \ - ((ProjectionMatrix[3][3] == 0.0) ? normalize(-viewPosition) : vec3(0.0, 0.0, 1.0)) +#define cameraVec(P) ((ProjectionMatrix[3][3] == 0.0) ? normalize(cameraPos - P) : cameraForward) +#define viewCameraVec(vP) ((ProjectionMatrix[3][3] == 0.0) ? normalize(-vP) : vec3(0.0, 0.0, 1.0)) #ifdef world_clip_planes_calc_clip_distance # undef world_clip_planes_calc_clip_distance diff --git a/source/blender/draw/tests/shaders_test.cc b/source/blender/draw/tests/shaders_test.cc index 2c8b3d85a0a..8ab626ed7ba 100644 --- a/source/blender/draw/tests/shaders_test.cc +++ b/source/blender/draw/tests/shaders_test.cc @@ -299,12 +299,29 @@ TEST_F(DrawTest, eevee_glsl_shaders_static) EXPECT_NE(EEVEE_shaders_bloom_upsample_get(true), nullptr); EXPECT_NE(EEVEE_shaders_bloom_resolve_get(false), nullptr); EXPECT_NE(EEVEE_shaders_bloom_resolve_get(true), nullptr); - EXPECT_NE(EEVEE_shaders_depth_of_field_downsample_get(false), nullptr); - EXPECT_NE(EEVEE_shaders_depth_of_field_downsample_get(true), nullptr); - EXPECT_NE(EEVEE_shaders_depth_of_field_scatter_get(false), nullptr); - EXPECT_NE(EEVEE_shaders_depth_of_field_scatter_get(true), nullptr); - EXPECT_NE(EEVEE_shaders_depth_of_field_resolve_get(false), nullptr); - EXPECT_NE(EEVEE_shaders_depth_of_field_resolve_get(true), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_bokeh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_setup_get(), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_flatten_tiles_get(), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_dilate_tiles_get(false), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_dilate_tiles_get(true), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_downsample_get(), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_reduce_get(true), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_reduce_get(false), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_FOREGROUND, false), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_FOREGROUND, true), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_BACKGROUND, false), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_BACKGROUND, true), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_HOLEFILL, false), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_HOLEFILL, true), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_filter_get(), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_scatter_get(false, false), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_scatter_get(false, true), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_scatter_get(true, false), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_scatter_get(true, true), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_resolve_get(false, true), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_resolve_get(false, false), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_resolve_get(true, true), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_resolve_get(true, false), nullptr); EXPECT_NE(EEVEE_shaders_effect_downsample_sh_get(), nullptr); EXPECT_NE(EEVEE_shaders_effect_downsample_cube_sh_get(), nullptr); EXPECT_NE(EEVEE_shaders_effect_minz_downlevel_sh_get(), nullptr); diff --git a/source/blender/editors/animation/anim_channels_defines.c b/source/blender/editors/animation/anim_channels_defines.c index 24bb58535a5..2bfa417eb78 100644 --- a/source/blender/editors/animation/anim_channels_defines.c +++ b/source/blender/editors/animation/anim_channels_defines.c @@ -4161,7 +4161,7 @@ static void ANIM_init_channel_typeinfo_data(void) /* Get type info from given channel type */ const bAnimChannelType *ANIM_channel_get_typeinfo(bAnimListElem *ale) { - /* santiy checks */ + /* Sanity checks. */ if (ale == NULL) { return NULL; } diff --git a/source/blender/editors/animation/anim_channels_edit.c b/source/blender/editors/animation/anim_channels_edit.c index 109cf79c786..38820e05869 100644 --- a/source/blender/editors/animation/anim_channels_edit.c +++ b/source/blender/editors/animation/anim_channels_edit.c @@ -2284,7 +2284,7 @@ static void ANIM_OT_channels_expand(wmOperatorType *ot) /* identifiers */ ot->name = "Expand Channels"; ot->idname = "ANIM_OT_channels_expand"; - ot->description = "Expand (i.e. open) all selected expandable animation channels"; + ot->description = "Expand (open) all selected expandable animation channels"; /* api callbacks */ ot->exec = animchannels_expand_exec; @@ -2329,7 +2329,7 @@ static void ANIM_OT_channels_collapse(wmOperatorType *ot) /* identifiers */ ot->name = "Collapse Channels"; ot->idname = "ANIM_OT_channels_collapse"; - ot->description = "Collapse (i.e. close) all selected expandable animation channels"; + ot->description = "Collapse (close) all selected expandable animation channels"; /* api callbacks */ ot->exec = animchannels_collapse_exec; diff --git a/source/blender/editors/animation/anim_ops.c b/source/blender/editors/animation/anim_ops.c index a5514f6517e..72d9bff545a 100644 --- a/source/blender/editors/animation/anim_ops.c +++ b/source/blender/editors/animation/anim_ops.c @@ -29,12 +29,10 @@ #include "BLI_math_base.h" #include "BLI_utildefines.h" -#include "DNA_anim_types.h" #include "DNA_scene_types.h" #include "BKE_context.h" #include "BKE_global.h" -#include "BKE_main.h" #include "BKE_report.h" #include "BKE_scene.h" @@ -50,10 +48,8 @@ #include "ED_screen.h" #include "ED_sequencer.h" #include "ED_time_scrub_ui.h" -#include "ED_util.h" #include "DEG_depsgraph.h" -#include "DEG_depsgraph_query.h" #include "SEQ_sequencer.h" #include "SEQ_time.h" diff --git a/source/blender/editors/animation/drivers.c b/source/blender/editors/animation/drivers.c index b2a9d6ac9b7..43d5efe9ea9 100644 --- a/source/blender/editors/animation/drivers.c +++ b/source/blender/editors/animation/drivers.c @@ -33,7 +33,6 @@ #include "DNA_anim_types.h" #include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_texture_types.h" #include "BKE_anim_data.h" diff --git a/source/blender/editors/animation/fmodifier_ui.c b/source/blender/editors/animation/fmodifier_ui.c index deebf1d1efc..b344e67f62d 100644 --- a/source/blender/editors/animation/fmodifier_ui.c +++ b/source/blender/editors/animation/fmodifier_ui.c @@ -32,6 +32,7 @@ #include "DNA_anim_types.h" #include "DNA_scene_types.h" +#include "DNA_space_types.h" #include "MEM_guardedalloc.h" @@ -42,6 +43,7 @@ #include "BKE_context.h" #include "BKE_fcurve.h" +#include "BKE_screen.h" #include "WM_api.h" #include "WM_types.h" @@ -56,8 +58,193 @@ #include "DEG_depsgraph.h" -/* ********************************************** */ -/* UI STUFF */ +typedef void (*PanelDrawFn)(const bContext *, struct Panel *); +static void fmodifier_panel_header(const bContext *C, Panel *panel); + +/* -------------------------------------------------------------------- */ +/** \name Panel Registering and Panel Callbacks + * \{ */ + +/** + * Get the list of FModifiers from the context (either the NLA or graph editor). + */ +static ListBase *fmodifier_list_space_specific(const bContext *C) +{ + ScrArea *area = CTX_wm_area(C); + + if (area->spacetype == SPACE_GRAPH) { + FCurve *fcu = ANIM_graph_context_fcurve(C); + return &fcu->modifiers; + } + + if (area->spacetype == SPACE_NLA) { + NlaStrip *strip = ANIM_nla_context_strip(C); + return &strip->modifiers; + } + + /* This should not be called in any other space. */ + BLI_assert(false); + return NULL; +} + +/** + * Get a pointer to the panel's FModifier, and also its owner ID if \a r_owner_id is not NULL. + * Also in the graph editor, gray out the panel if the FModifier's FCurve has modifiers turned off. + */ +static PointerRNA *fmodifier_get_pointers(const bContext *C, const Panel *panel, ID **r_owner_id) +{ + PointerRNA *ptr = UI_panel_custom_data_get(panel); + + if (r_owner_id != NULL) { + *r_owner_id = ptr->owner_id; + } + + if (C != NULL && CTX_wm_space_graph(C)) { + FCurve *fcu = ANIM_graph_context_fcurve(C); + uiLayoutSetActive(panel->layout, !(fcu->flag & FCURVE_MOD_OFF)); + } + + return ptr; +} + +/** + * Move an FModifier to the index it's moved to after a drag and drop. + */ +static void fmodifier_reorder(bContext *C, Panel *panel, int new_index) +{ + ID *owner_id; + PointerRNA *ptr = fmodifier_get_pointers(NULL, panel, &owner_id); + FModifier *fcm = ptr->data; + const FModifierTypeInfo *fmi = get_fmodifier_typeinfo(fcm->type); + + /* Cycles modifier has to be the first, so make sure it's kept that way. */ + if (fmi->requires & FMI_REQUIRES_ORIGINAL_DATA) { + WM_report(RPT_ERROR, "Modifier requires original data"); + return; + } + + ListBase *modifiers = fmodifier_list_space_specific(C); + + /* Again, make sure we don't move a modifier before a cycles modifier. */ + FModifier *fcm_first = modifiers->first; + const FModifierTypeInfo *fmi_first = get_fmodifier_typeinfo(fcm_first->type); + if (fmi_first->requires & FMI_REQUIRES_ORIGINAL_DATA && new_index == 0) { + WM_report(RPT_ERROR, "Modifier requires original data"); + return; + } + + int current_index = BLI_findindex(modifiers, fcm); + BLI_assert(current_index >= 0); + BLI_assert(new_index >= 0); + + /* Don't do anything if the drag didn't change the index. */ + if (current_index == new_index) { + return; + } + + /* Move the FModifier in the list. */ + BLI_listbase_link_move(modifiers, fcm, new_index - current_index); + + ED_undo_push(C, "Reorder F-Curve Modifier"); + + WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL); + DEG_id_tag_update(owner_id, ID_RECALC_ANIMATION); +} + +static short get_fmodifier_expand_flag(const bContext *UNUSED(C), Panel *panel) +{ + PointerRNA *ptr = fmodifier_get_pointers(NULL, panel, NULL); + FModifier *fcm = (FModifier *)ptr->data; + + return fcm->ui_expand_flag; +} + +static void set_fmodifier_expand_flag(const bContext *UNUSED(C), Panel *panel, short expand_flag) +{ + PointerRNA *ptr = fmodifier_get_pointers(NULL, panel, NULL); + FModifier *fcm = (FModifier *)ptr->data; + + fcm->ui_expand_flag = expand_flag; +} + +static PanelType *fmodifier_panel_register(ARegionType *region_type, + eFModifier_Types type, + PanelDrawFn draw, + PanelTypePollFn poll, + const char *id_prefix) +{ + /* Get the name for the modifier's panel. */ + char panel_idname[BKE_ST_MAXNAME]; + const FModifierTypeInfo *fmi = get_fmodifier_typeinfo(type); + BLI_snprintf(panel_idname, BKE_ST_MAXNAME, "%s_PT_%s", id_prefix, fmi->name); + + PanelType *panel_type = MEM_callocN(sizeof(PanelType), panel_idname); + + /* Intentionally leave the label field blank. The header is filled with buttons. */ + BLI_strncpy(panel_type->idname, panel_idname, BKE_ST_MAXNAME); + BLI_strncpy(panel_type->category, "Modifiers", BKE_ST_MAXNAME); + BLI_strncpy(panel_type->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA, BKE_ST_MAXNAME); + + panel_type->draw_header = fmodifier_panel_header; + panel_type->draw = draw; + panel_type->poll = poll; + + /* Give the panel the special flag that says it was built here and corresponds to a + * modifier rather than a #PanelType. */ + panel_type->flag = PANEL_TYPE_HEADER_EXPAND | PANEL_TYPE_DRAW_BOX | PANEL_TYPE_INSTANCED; + panel_type->reorder = fmodifier_reorder; + panel_type->get_list_data_expand_flag = get_fmodifier_expand_flag; + panel_type->set_list_data_expand_flag = set_fmodifier_expand_flag; + + BLI_addtail(®ion_type->paneltypes, panel_type); + + return panel_type; +} + +/** + * Add a child panel to the parent. + * + * \note To create the panel type's idname, it appends the \a name argument to the \a parent's + * idname. + */ +static PanelType *fmodifier_subpanel_register(ARegionType *region_type, + const char *name, + const char *label, + PanelDrawFn draw_header, + PanelDrawFn draw, + PanelTypePollFn poll, + PanelType *parent) +{ + /* Create the subpanel's ID name. */ + char panel_idname[BKE_ST_MAXNAME]; + BLI_snprintf(panel_idname, BKE_ST_MAXNAME, "%s_%s", parent->idname, name); + + PanelType *panel_type = MEM_callocN(sizeof(PanelType), panel_idname); + + BLI_strncpy(panel_type->idname, panel_idname, BKE_ST_MAXNAME); + BLI_strncpy(panel_type->label, label, BKE_ST_MAXNAME); + BLI_strncpy(panel_type->category, "Modifiers", BKE_ST_MAXNAME); + BLI_strncpy(panel_type->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA, BKE_ST_MAXNAME); + + panel_type->draw_header = draw_header; + panel_type->draw = draw; + panel_type->poll = poll; + panel_type->flag = PANEL_TYPE_DEFAULT_CLOSED | PANEL_TYPE_DRAW_BOX; + + BLI_assert(parent != NULL); + BLI_strncpy(panel_type->parent_id, parent->idname, BKE_ST_MAXNAME); + panel_type->parent = parent; + BLI_addtail(&parent->children, BLI_genericNodeN(panel_type)); + BLI_addtail(®ion_type->paneltypes, panel_type); + + return panel_type; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name General UI Callbacks and Drawing + * \{ */ /* XXX! -------------------------------- */ /* Temporary definition for limits of float number buttons @@ -67,36 +254,12 @@ #define B_REDR 1 #define B_FMODIFIER_REDRAW 20 -/* callback to update depsgraph on value changes */ -static void deg_update(bContext *C, void *owner_id, void *UNUSED(var2)) -{ - /* send notifiers */ - /* XXX for now, this is the only way to get updates in all the right places... - * but would be nice to have a special one in this case. */ - WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL); - DEG_id_tag_update(owner_id, ID_RECALC_ANIMATION); -} - -/* callback to verify modifier data */ -static void validate_fmodifier_cb(bContext *C, void *fcm_v, void *owner_id) -{ - FModifier *fcm = (FModifier *)fcm_v; - const FModifierTypeInfo *fmi = fmodifier_get_typeinfo(fcm); - - /* call the verify callback on the modifier if applicable */ - if (fmi && fmi->verify_data) { - fmi->verify_data(fcm); - } - if (owner_id) { - deg_update(C, owner_id, NULL); - } -} - /* callback to remove the given modifier */ typedef struct FModifierDeleteContext { - ID *fcurve_owner_id; + ID *owner_id; ListBase *modifiers; } FModifierDeleteContext; + static void delete_fmodifier_cb(bContext *C, void *ctx_v, void *fcm_v) { FModifierDeleteContext *ctx = (FModifierDeleteContext *)ctx_v; @@ -108,466 +271,334 @@ static void delete_fmodifier_cb(bContext *C, void *ctx_v, void *fcm_v) ED_undo_push(C, "Delete F-Curve Modifier"); - deg_update(C, ctx->fcurve_owner_id, NULL); + WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL); + DEG_id_tag_update(ctx->owner_id, ID_RECALC_ANIMATION); } -/* --------------- */ -/* draw settings for generator modifier */ -static void draw_modifier__generator(uiLayout *layout, - ID *fcurve_owner_id, - FModifier *fcm, - short width) +static void fmodifier_influence_draw(uiLayout *layout, PointerRNA *ptr) { + FModifier *fcm = (FModifier *)ptr->data; + uiItemS(layout); + + uiLayout *row = uiLayoutRowWithHeading(layout, true, IFACE_("Influence")); + uiItemR(row, ptr, "use_influence", 0, "", ICON_NONE); + uiLayout *sub = uiLayoutRow(row, true); + + uiLayoutSetActive(sub, fcm->flag & FMODIFIER_FLAG_USEINFLUENCE); + uiItemR(sub, ptr, "influence", 0, "", ICON_NONE); +} + +static void fmodifier_frame_range_header_draw(const bContext *C, Panel *panel) +{ + uiLayout *layout = panel->layout; + + PointerRNA *ptr = fmodifier_get_pointers(C, panel, NULL); + + uiItemR(layout, ptr, "use_restricted_range", 0, NULL, ICON_NONE); +} + +static void fmodifier_frame_range_draw(const bContext *C, Panel *panel) +{ + uiLayout *col; + uiLayout *layout = panel->layout; + + PointerRNA *ptr = fmodifier_get_pointers(C, panel, NULL); + + uiLayoutSetPropSep(layout, true); + + FModifier *fcm = (FModifier *)ptr->data; + uiLayoutSetActive(layout, fcm->flag & FMODIFIER_FLAG_RANGERESTRICT); + + col = uiLayoutColumn(layout, true); + uiItemR(col, ptr, "frame_start", 0, IFACE_("Start"), ICON_NONE); + uiItemR(col, ptr, "frame_end", 0, IFACE_("End"), ICON_NONE); + + col = uiLayoutColumn(layout, true); + uiItemR(col, ptr, "blend_in", 0, IFACE_("Blend In"), ICON_NONE); + uiItemR(col, ptr, "blend_out", 0, IFACE_("Out"), ICON_NONE); +} + +static void fmodifier_panel_header(const bContext *C, Panel *panel) +{ + uiLayout *layout = panel->layout; + + ID *owner_id; + PointerRNA *ptr = fmodifier_get_pointers(C, panel, &owner_id); + FModifier *fcm = (FModifier *)ptr->data; + const FModifierTypeInfo *fmi = fmodifier_get_typeinfo(fcm); + + uiBlock *block = uiLayoutGetBlock(layout); + + uiLayout *sub = uiLayoutRow(layout, true); + uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_LEFT); + uiLayoutSetEmboss(sub, UI_EMBOSS_NONE); + + /* Checkbox for 'active' status (for now). */ + uiItemR(sub, ptr, "active", UI_ITEM_R_ICON_ONLY, "", ICON_NONE); + + /* Name. */ + if (fmi) { + uiItemL(sub, IFACE_(fmi->name), ICON_NONE); + } + else { + uiItemL(sub, IFACE_(""), ICON_NONE); + } + + /* Right align. */ + sub = uiLayoutRow(layout, true); + uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_RIGHT); + uiLayoutSetEmboss(sub, UI_EMBOSS_NONE); + + /* 'Mute' button. */ + uiItemR(sub, ptr, "mute", UI_ITEM_R_ICON_ONLY, "", ICON_NONE); + + /* Delete button. */ + uiBut *but = uiDefIconBut(block, + UI_BTYPE_BUT, + B_REDR, + ICON_X, + 0, + 0, + UI_UNIT_X, + UI_UNIT_Y, + NULL, + 0.0, + 0.0, + 0.0, + 0.0, + TIP_("Delete Modifier")); + FModifierDeleteContext *ctx = MEM_mallocN(sizeof(FModifierDeleteContext), __func__); + ctx->owner_id = owner_id; + ctx->modifiers = fmodifier_list_space_specific(C); + BLI_assert(ctx->modifiers != NULL); + + UI_but_funcN_set(but, delete_fmodifier_cb, ctx, fcm); + + uiItemS(layout); +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Generator Modifier + * \{ */ + +static void generator_panel_draw(const bContext *C, Panel *panel) +{ + uiLayout *layout = panel->layout; + + ID *owner_id; + PointerRNA *ptr = fmodifier_get_pointers(C, panel, &owner_id); + FModifier *fcm = (FModifier *)ptr->data; FMod_Generator *data = (FMod_Generator *)fcm->data; - uiLayout /* *col, */ /* UNUSED */ *row; - uiBlock *block; - uiBut *but; - PointerRNA ptr; - short bwidth = width - 1.5 * UI_UNIT_X; /* max button width */ - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierFunctionGenerator, fcm, &ptr); + uiItemR(layout, ptr, "mode", 0, "", ICON_NONE); - /* basic settings (backdrop + mode selector + some padding) */ - /* col = uiLayoutColumn(layout, true); */ /* UNUSED */ - block = uiLayoutGetBlock(layout); - UI_block_align_begin(block); - but = uiDefButR(block, - UI_BTYPE_MENU, - B_FMODIFIER_REDRAW, - NULL, - 0, - 0, - bwidth, - UI_UNIT_Y, - &ptr, - "mode", - -1, - 0, - 0, - -1, - -1, - NULL); - UI_but_func_set(but, validate_fmodifier_cb, fcm, NULL); + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); - uiDefButR(block, - UI_BTYPE_TOGGLE, - B_FMODIFIER_REDRAW, - NULL, - 0, - 0, - bwidth, - UI_UNIT_Y, - &ptr, - "use_additive", - -1, - 0, - 0, - -1, - -1, - NULL); - UI_block_align_end(block); + uiItemR(layout, ptr, "use_additive", 0, NULL, ICON_NONE); - /* now add settings for individual modes */ + uiItemR(layout, ptr, "poly_order", 0, IFACE_("Order"), ICON_NONE); + + PropertyRNA *prop = RNA_struct_find_property(ptr, "coefficients"); + uiLayout *col = uiLayoutColumn(layout, true); switch (data->mode) { - case FCM_GENERATOR_POLYNOMIAL: /* polynomial expression */ + case FCM_GENERATOR_POLYNOMIAL: /* Polynomial expression. */ { - const uiFontStyle *fstyle = UI_FSTYLE_WIDGET; - float *cp = NULL; + char xval[32]; - int maxXWidth; - /* draw polynomial order selector */ - row = uiLayoutRow(layout, false); - block = uiLayoutGetBlock(row); + /* The first value gets a "Coefficient" label. */ + BLI_strncpy(xval, "Coefficient", sizeof(xval)); - but = uiDefButI( - block, - UI_BTYPE_NUM, - B_FMODIFIER_REDRAW, - IFACE_("Poly Order:"), - 0.5f * UI_UNIT_X, - 0, - bwidth, - UI_UNIT_Y, - &data->poly_order, - 1, - 100, - 0, - 0, - TIP_("'Order' of the Polynomial (for a polynomial with n terms, 'order' is n-1)")); - UI_but_number_step_size_set(but, 1); - UI_but_func_set(but, validate_fmodifier_cb, fcm, fcurve_owner_id); - - /* calculate maximum width of label for "x^n" labels */ - if (data->arraysize > 2) { - BLI_snprintf(xval, sizeof(xval), "x^%u", data->arraysize); - /* XXX: UI_fontstyle_string_width is not accurate */ - maxXWidth = UI_fontstyle_string_width(fstyle, xval) + 0.5 * UI_UNIT_X; - } - else { - /* basic size (just "x") */ - maxXWidth = UI_fontstyle_string_width(fstyle, "x") + 0.5 * UI_UNIT_X; - } - - /* draw controls for each coefficient and a + sign at end of row */ - row = uiLayoutRow(layout, true); - block = uiLayoutGetBlock(row); - - /* Update depsgraph when values change */ - UI_block_func_set(block, deg_update, fcurve_owner_id, NULL); - - cp = data->coefficients; - for (uint i = 0; (i < data->arraysize) && (cp); i++, cp++) { - /* To align with first line... */ - if (i) { - uiDefBut(block, - UI_BTYPE_LABEL, - 1, - " ", - 0, - 0, - 2 * UI_UNIT_X, - UI_UNIT_Y, - NULL, - 0.0, - 0.0, - 0, - 0, - ""); - } - else { - uiDefBut(block, - UI_BTYPE_LABEL, - 1, - "y =", - 0, - 0, - 2 * UI_UNIT_X, - UI_UNIT_Y, - NULL, - 0.0, - 0.0, - 0, - 0, - ""); - } - - /* coefficient */ - but = uiDefButF(block, - UI_BTYPE_NUM, - B_FMODIFIER_REDRAW, - "", - 0, - 0, - bwidth / 2, - UI_UNIT_Y, - cp, - -UI_FLT_MAX, - UI_FLT_MAX, - 0, - 0, - TIP_("Coefficient for polynomial")); - UI_but_number_step_size_set(but, 10); - UI_but_number_precision_set(but, 3); - - /* 'x' param (and '+' if necessary) */ - if (i == 0) { - BLI_strncpy(xval, " ", sizeof(xval)); - } - else if (i == 1) { - BLI_strncpy(xval, "x", sizeof(xval)); - } - else { - BLI_snprintf(xval, sizeof(xval), "x^%u", i); - } - uiDefBut(block, - UI_BTYPE_LABEL, - 1, - xval, - 0, - 0, - maxXWidth, - UI_UNIT_Y, - NULL, - 0.0, - 0.0, - 0, - 0, - TIP_("Power of x")); - - if ((i != (data->arraysize - 1)) || ((i == 0) && data->arraysize == 2)) { - uiDefBut( - block, UI_BTYPE_LABEL, 1, "+", 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); - - /* next coefficient on a new row */ - row = uiLayoutRow(layout, true); - block = uiLayoutGetBlock(row); - } - else { - /* For alignment in UI! */ - uiDefBut( - block, UI_BTYPE_LABEL, 1, " ", 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); - } + for (int i = 0; i < data->arraysize; i++) { + uiItemFullR(col, ptr, prop, i, 0, 0, N_(xval), ICON_NONE); + BLI_snprintf(xval, sizeof(xval), "x^%d", i + 1); } break; } - case FCM_GENERATOR_POLYNOMIAL_FACTORISED: /* Factorized polynomial expression */ { - float *cp = NULL; + { + /* Add column labels above the buttons to prevent confusion. + * Fake the property split layout, otherwise the labels use the full row. */ + uiLayout *split = uiLayoutSplit(col, 0.4f, false); + uiLayoutColumn(split, false); + uiLayout *title_col = uiLayoutColumn(split, false); + uiLayout *title_row = uiLayoutRow(title_col, true); + uiItemL(title_row, N_("A"), ICON_NONE); + uiItemL(title_row, N_("B"), ICON_NONE); + } - /* draw polynomial order selector */ - row = uiLayoutRow(layout, false); - block = uiLayoutGetBlock(row); - - but = uiDefButI( - block, - UI_BTYPE_NUM, - B_FMODIFIER_REDRAW, - IFACE_("Poly Order:"), - 0, - 0, - width - 1.5 * UI_UNIT_X, - UI_UNIT_Y, - &data->poly_order, - 1, - 100, - 0, - 0, - TIP_("'Order' of the Polynomial (for a polynomial with n terms, 'order' is n-1)")); - UI_but_func_set(but, validate_fmodifier_cb, fcm, fcurve_owner_id); - UI_but_number_step_size_set(but, 1); - - /* draw controls for each pair of coefficients */ - row = uiLayoutRow(layout, true); - block = uiLayoutGetBlock(row); - - /* Update depsgraph when values change */ - UI_block_func_set(block, deg_update, fcurve_owner_id, NULL); - - cp = data->coefficients; - for (uint i = 0; (i < data->poly_order) && (cp); i++, cp += 2) { - /* To align with first line */ - if (i) { - uiDefBut(block, - UI_BTYPE_LABEL, - 1, - " ", - 0, - 0, - 2.5 * UI_UNIT_X, - UI_UNIT_Y, - NULL, - 0.0, - 0.0, - 0, - 0, - ""); - } - else { - uiDefBut(block, - UI_BTYPE_LABEL, - 1, - "y =", - 0, - 0, - 2.5 * UI_UNIT_X, - UI_UNIT_Y, - NULL, - 0.0, - 0.0, - 0, - 0, - ""); - } - /* opening bracket */ - uiDefBut( - block, UI_BTYPE_LABEL, 1, "(", 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); - - /* coefficients */ - but = uiDefButF(block, - UI_BTYPE_NUM, - B_FMODIFIER_REDRAW, - "", - 0, - 0, - 5 * UI_UNIT_X, - UI_UNIT_Y, - cp, - -UI_FLT_MAX, - UI_FLT_MAX, - 0, - 0, - TIP_("Coefficient of x")); - UI_but_number_step_size_set(but, 10); - UI_but_number_precision_set(but, 3); - - uiDefBut(block, - UI_BTYPE_LABEL, - 1, - "x +", - 0, - 0, - 2 * UI_UNIT_X, - UI_UNIT_Y, - NULL, - 0.0, - 0.0, - 0, - 0, - ""); - - but = uiDefButF(block, - UI_BTYPE_NUM, - B_FMODIFIER_REDRAW, - "", - 0, - 0, - 5 * UI_UNIT_X, - UI_UNIT_Y, - cp + 1, - -UI_FLT_MAX, - UI_FLT_MAX, - 0, - 0, - TIP_("Second coefficient")); - UI_but_number_step_size_set(but, 10); - UI_but_number_precision_set(but, 3); - - /* closing bracket and multiplication sign */ - if ((i != (data->poly_order - 1)) || ((i == 0) && data->poly_order == 2)) { - uiDefBut(block, - UI_BTYPE_LABEL, - 1, - ") \xc3\x97", - 0, - 0, - 2 * UI_UNIT_X, - UI_UNIT_Y, - NULL, - 0.0, - 0.0, - 0, - 0, - ""); - - /* set up new row for the next pair of coefficients */ - row = uiLayoutRow(layout, true); - block = uiLayoutGetBlock(row); - } - else { - uiDefBut(block, - UI_BTYPE_LABEL, - 1, - ") ", - 0, - 0, - 2 * UI_UNIT_X, - UI_UNIT_Y, - NULL, - 0.0, - 0.0, - 0, - 0, - ""); - } + uiLayout *first_row = uiLayoutRow(col, true); + uiItemFullR(first_row, ptr, prop, 0, 0, 0, N_("y = (Ax + B)"), ICON_NONE); + uiItemFullR(first_row, ptr, prop, 1, 0, 0, "", ICON_NONE); + for (int i = 2; i < data->arraysize - 1; i++) { + /* \u2715 is the multiplication symbol. */ + uiLayout *row = uiLayoutRow(col, true); + uiItemFullR(row, ptr, prop, i, 0, 0, N_("\u2715 (Ax + B)"), ICON_NONE); + uiItemFullR(row, ptr, prop, i + 1, 0, 0, "", ICON_NONE); } break; } } + + fmodifier_influence_draw(layout, ptr); } -/* --------------- */ +static void panel_register_generator(ARegionType *region_type, + const char *id_prefix, + PanelTypePollFn poll_fn) +{ + PanelType *panel_type = fmodifier_panel_register( + region_type, FMODIFIER_TYPE_GENERATOR, generator_panel_draw, poll_fn, id_prefix); + fmodifier_subpanel_register(region_type, + "frame_range", + "", + fmodifier_frame_range_header_draw, + fmodifier_frame_range_draw, + poll_fn, + panel_type); +} -/* draw settings for generator modifier */ -static void draw_modifier__fn_generator(uiLayout *layout, - ID *fcurve_owner_id, - FModifier *fcm, - short UNUSED(width)) +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Function Generator Modifier + * \{ */ + +static void fn_generator_panel_draw(const bContext *C, Panel *panel) { uiLayout *col; - PointerRNA ptr; + uiLayout *layout = panel->layout; - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierFunctionGenerator, fcm, &ptr); + PointerRNA *ptr = fmodifier_get_pointers(C, panel, NULL); - /* add the settings */ - col = uiLayoutColumn(layout, true); - uiItemR(col, &ptr, "function_type", 0, "", ICON_NONE); - uiItemR(col, &ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, ICON_NONE); + uiItemR(layout, ptr, "function_type", 0, "", ICON_NONE); - col = uiLayoutColumn(layout, false); /* no grouping for now */ - uiItemR(col, &ptr, "amplitude", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "phase_multiplier", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "phase_offset", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "value_offset", 0, NULL, ICON_NONE); + uiLayoutSetPropSep(layout, true); + + col = uiLayoutColumn(layout, false); + uiItemR(col, ptr, "use_additive", 0, NULL, ICON_NONE); + + col = uiLayoutColumn(layout, false); + uiItemR(col, ptr, "amplitude", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "phase_multiplier", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "phase_offset", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "value_offset", 0, NULL, ICON_NONE); + + fmodifier_influence_draw(layout, ptr); } -/* --------------- */ - -/* draw settings for cycles modifier */ -static void draw_modifier__cycles(uiLayout *layout, - ID *fcurve_owner_id, - FModifier *fcm, - short UNUSED(width)) +static void panel_register_fn_generator(ARegionType *region_type, + const char *id_prefix, + PanelTypePollFn poll_fn) { - uiLayout *split, *col; - PointerRNA ptr; - - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierCycles, fcm, &ptr); - - /* split into 2 columns - * NOTE: the mode combination-boxes shouldn't get labels, otherwise there isn't enough room. */ - split = uiLayoutSplit(layout, 0.5f, false); - - /* before range */ - col = uiLayoutColumn(split, true); - uiItemL(col, IFACE_("Before:"), ICON_NONE); - uiItemR(col, &ptr, "mode_before", 0, "", ICON_NONE); - uiItemR(col, &ptr, "cycles_before", 0, NULL, ICON_NONE); - - /* after range */ - col = uiLayoutColumn(split, true); - uiItemL(col, IFACE_("After:"), ICON_NONE); - uiItemR(col, &ptr, "mode_after", 0, "", ICON_NONE); - uiItemR(col, &ptr, "cycles_after", 0, NULL, ICON_NONE); + PanelType *panel_type = fmodifier_panel_register( + region_type, FMODIFIER_TYPE_FN_GENERATOR, fn_generator_panel_draw, poll_fn, id_prefix); + fmodifier_subpanel_register(region_type, + "frame_range", + "", + fmodifier_frame_range_header_draw, + fmodifier_frame_range_draw, + poll_fn, + panel_type); } -/* --------------- */ +/** \} */ -/* draw settings for noise modifier */ -static void draw_modifier__noise(uiLayout *layout, - ID *fcurve_owner_id, - FModifier *fcm, - short UNUSED(width)) +/* -------------------------------------------------------------------- */ +/** \name Cycles Modifier + * \{ */ + +static void cycles_panel_draw(const bContext *C, Panel *panel) { - uiLayout *split, *col; - PointerRNA ptr; + uiLayout *col; + uiLayout *layout = panel->layout; - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierNoise, fcm, &ptr); + PointerRNA *ptr = fmodifier_get_pointers(C, panel, NULL); - /* blending mode */ - uiItemR(layout, &ptr, "blend_type", 0, NULL, ICON_NONE); + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); - /* split into 2 columns */ - split = uiLayoutSplit(layout, 0.5f, false); + /* Before. */ + col = uiLayoutColumn(layout, false); + uiItemR(col, ptr, "mode_before", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "cycles_before", 0, IFACE_("Count"), ICON_NONE); - /* col 1 */ - col = uiLayoutColumn(split, false); - uiItemR(col, &ptr, "scale", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "strength", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "offset", 0, NULL, ICON_NONE); + /* After. */ + col = uiLayoutColumn(layout, false); + uiItemR(col, ptr, "mode_after", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "cycles_after", 0, IFACE_("Count"), ICON_NONE); - /* col 2 */ - col = uiLayoutColumn(split, false); - uiItemR(col, &ptr, "phase", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "depth", 0, NULL, ICON_NONE); + fmodifier_influence_draw(layout, ptr); } -/* callback to add new envelope data point */ +static void panel_register_cycles(ARegionType *region_type, + const char *id_prefix, + PanelTypePollFn poll_fn) +{ + PanelType *panel_type = fmodifier_panel_register( + region_type, FMODIFIER_TYPE_CYCLES, cycles_panel_draw, poll_fn, id_prefix); + fmodifier_subpanel_register(region_type, + "frame_range", + "", + fmodifier_frame_range_header_draw, + fmodifier_frame_range_draw, + poll_fn, + panel_type); +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Noise Modifier + * \{ */ + +static void noise_panel_draw(const bContext *C, Panel *panel) +{ + uiLayout *col; + uiLayout *layout = panel->layout; + + PointerRNA *ptr = fmodifier_get_pointers(C, panel, NULL); + + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + + uiItemR(layout, ptr, "blend_type", 0, NULL, ICON_NONE); + + col = uiLayoutColumn(layout, false); + uiItemR(col, ptr, "scale", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "strength", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "offset", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "phase", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "depth", 0, NULL, ICON_NONE); + + fmodifier_influence_draw(layout, ptr); +} + +static void panel_register_noise(ARegionType *region_type, + const char *id_prefix, + PanelTypePollFn poll_fn) +{ + PanelType *panel_type = fmodifier_panel_register( + region_type, FMODIFIER_TYPE_NOISE, noise_panel_draw, poll_fn, id_prefix); + fmodifier_subpanel_register(region_type, + "frame_range", + "", + fmodifier_frame_range_header_draw, + fmodifier_frame_range_draw, + poll_fn, + panel_type); +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Envelope Modifier + * \{ */ + static void fmod_envelope_addpoint_cb(bContext *C, void *fcm_dv, void *UNUSED(arg)) { Scene *scene = CTX_data_scene(C); @@ -656,132 +687,60 @@ static void fmod_envelope_deletepoint_cb(bContext *UNUSED(C), void *fcm_dv, void } /* draw settings for envelope modifier */ -static void draw_modifier__envelope(uiLayout *layout, - ID *fcurve_owner_id, - FModifier *fcm, - short UNUSED(width)) +static void envelope_panel_draw(const bContext *C, Panel *panel) { + uiLayout *row, *col; + uiLayout *layout = panel->layout; + + ID *owner_id; + PointerRNA *ptr = fmodifier_get_pointers(C, panel, &owner_id); + FModifier *fcm = (FModifier *)ptr->data; FMod_Envelope *env = (FMod_Envelope *)fcm->data; - FCM_EnvelopeData *fed; - uiLayout *col, *row; - uiBlock *block; - uiBut *but; - PointerRNA ptr; - int i; - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierEnvelope, fcm, &ptr); + uiLayoutSetPropSep(layout, true); - /* general settings */ + /* General settings. */ col = uiLayoutColumn(layout, true); - uiItemL(col, IFACE_("Envelope:"), ICON_NONE); - uiItemR(col, &ptr, "reference_value", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "reference_value", 0, IFACE_("Reference"), ICON_NONE); + uiItemR(col, ptr, "default_min", 0, IFACE_("Min"), ICON_NONE); + uiItemR(col, ptr, "default_max", 0, IFACE_("Max"), ICON_NONE); - row = uiLayoutRow(col, true); - uiItemR(row, &ptr, "default_min", 0, IFACE_("Min"), ICON_NONE); - uiItemR(row, &ptr, "default_max", 0, IFACE_("Max"), ICON_NONE); + /* Control points list. */ - /* control points header */ - /* TODO: move this control-point control stuff to using the new special widgets for lists - * the current way is far too cramped */ row = uiLayoutRow(layout, false); - block = uiLayoutGetBlock(row); + uiBlock *block = uiLayoutGetBlock(row); - uiDefBut(block, - UI_BTYPE_LABEL, - 1, - IFACE_("Control Points:"), - 0, - 0, - 7.5 * UI_UNIT_X, - UI_UNIT_Y, - NULL, - 0.0, - 0.0, - 0, - 0, - ""); - - but = uiDefBut(block, - UI_BTYPE_BUT, - B_FMODIFIER_REDRAW, - IFACE_("Add Point"), - 0, - 0, - 7.5 * UI_UNIT_X, - UI_UNIT_Y, - NULL, - 0, - 0, - 0, - 0, - TIP_("Add a new control-point to the envelope on the current frame")); + uiBut *but = uiDefBut(block, + UI_BTYPE_BUT, + B_FMODIFIER_REDRAW, + IFACE_("Add Control Point"), + 0, + 0, + 7.5 * UI_UNIT_X, + UI_UNIT_Y, + NULL, + 0, + 0, + 0, + 0, + TIP_("Add a new control-point to the envelope on the current frame")); UI_but_func_set(but, fmod_envelope_addpoint_cb, env, NULL); - /* control points list */ - for (i = 0, fed = env->data; i < env->totvert; i++, fed++) { + col = uiLayoutColumn(layout, false); + uiLayoutSetPropSep(col, false); + + FCM_EnvelopeData *fed = env->data; + for (int i = 0; i < env->totvert; i++, fed++) { PointerRNA ctrl_ptr; - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierEnvelopeControlPoint, fed, &ctrl_ptr); + RNA_pointer_create(owner_id, &RNA_FModifierEnvelopeControlPoint, fed, &ctrl_ptr); /* get a new row to operate on */ - row = uiLayoutRow(layout, true); + row = uiLayoutRow(col, true); block = uiLayoutGetBlock(row); - UI_block_align_begin(block); - but = uiDefButR(block, - UI_BTYPE_NUM, - B_FMODIFIER_REDRAW, - IFACE_("Fra:"), - 0, - 0, - 4.5 * UI_UNIT_X, - UI_UNIT_Y, - &ctrl_ptr, - "frame", - -1, - -MAXFRAMEF, - MAXFRAMEF, - 0, - 0, - NULL); - UI_but_number_step_size_set(but, 10); - UI_but_number_precision_set(but, 1); - but = uiDefButR(block, - UI_BTYPE_NUM, - B_FMODIFIER_REDRAW, - IFACE_("Min:"), - 0, - 0, - 5 * UI_UNIT_X, - UI_UNIT_Y, - &ctrl_ptr, - "min", - -1, - -UI_FLT_MAX, - UI_FLT_MAX, - 0, - 0, - NULL); - UI_but_number_step_size_set(but, 10); - UI_but_number_precision_set(but, 2); - but = uiDefButR(block, - UI_BTYPE_NUM, - B_FMODIFIER_REDRAW, - IFACE_("Max:"), - 0, - 0, - 5 * UI_UNIT_X, - UI_UNIT_Y, - &ctrl_ptr, - "max", - -1, - -UI_FLT_MAX, - UI_FLT_MAX, - 0, - 0, - NULL); - UI_but_number_step_size_set(but, 10); - UI_but_number_precision_set(but, 2); + uiItemR(row, &ctrl_ptr, "frame", 0, NULL, ICON_NONE); + uiItemR(row, &ctrl_ptr, "min", 0, IFACE_("Min"), ICON_NONE); + uiItemR(row, &ctrl_ptr, "max", 0, IFACE_("Max"), ICON_NONE); but = uiDefIconBut(block, UI_BTYPE_BUT, @@ -800,251 +759,210 @@ static void draw_modifier__envelope(uiLayout *layout, UI_but_func_set(but, fmod_envelope_deletepoint_cb, env, POINTER_FROM_INT(i)); UI_block_align_begin(block); } + + fmodifier_influence_draw(layout, ptr); } -/* --------------- */ - -/* draw settings for limits modifier */ -static void draw_modifier__limits(uiLayout *layout, - ID *fcurve_owner_id, - FModifier *fcm, - short UNUSED(width)) +static void panel_register_envelope(ARegionType *region_type, + const char *id_prefix, + PanelTypePollFn poll_fn) { - uiLayout *split, *col /* , *row */ /* UNUSED */; - PointerRNA ptr; - - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierLimits, fcm, &ptr); - - /* row 1: minimum */ - { - /* row = uiLayoutRow(layout, false); */ /* UNUSED */ - - /* split into 2 columns */ - split = uiLayoutSplit(layout, 0.5f, false); - - /* x-minimum */ - col = uiLayoutColumn(split, true); - uiItemR(col, &ptr, "use_min_x", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "min_x", 0, NULL, ICON_NONE); - - /* y-minimum*/ - col = uiLayoutColumn(split, true); - uiItemR(col, &ptr, "use_min_y", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "min_y", 0, NULL, ICON_NONE); - } - - /* row 2: maximum */ - { - /* row = uiLayoutRow(layout, false); */ /* UNUSED */ - - /* split into 2 columns */ - split = uiLayoutSplit(layout, 0.5f, false); - - /* x-minimum */ - col = uiLayoutColumn(split, true); - uiItemR(col, &ptr, "use_max_x", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "max_x", 0, NULL, ICON_NONE); - - /* y-minimum*/ - col = uiLayoutColumn(split, true); - uiItemR(col, &ptr, "use_max_y", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "max_y", 0, NULL, ICON_NONE); - } + PanelType *panel_type = fmodifier_panel_register( + region_type, FMODIFIER_TYPE_ENVELOPE, envelope_panel_draw, poll_fn, id_prefix); + fmodifier_subpanel_register(region_type, + "frame_range", + "", + fmodifier_frame_range_header_draw, + fmodifier_frame_range_draw, + poll_fn, + panel_type); } -/* --------------- */ +/** \} */ -/* draw settings for stepped interpolation modifier */ -static void draw_modifier__stepped(uiLayout *layout, - ID *fcurve_owner_id, - FModifier *fcm, - short UNUSED(width)) +/* -------------------------------------------------------------------- */ +/** \name Limits Modifier + * \{ */ + +static void limits_panel_draw(const bContext *C, Panel *panel) { - uiLayout *col, *sub; - PointerRNA ptr; + uiLayout *col, *row, *sub; + uiLayout *layout = panel->layout; - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierStepped, fcm, &ptr); + PointerRNA *ptr = fmodifier_get_pointers(C, panel, NULL); - /* block 1: "stepping" settings */ + uiLayoutSetPropSep(layout, true); + + /* Minimums. */ col = uiLayoutColumn(layout, false); - uiItemR(col, &ptr, "frame_step", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "frame_offset", 0, NULL, ICON_NONE); + row = uiLayoutRowWithHeading(col, true, IFACE_("Minimum X")); + uiItemR(row, ptr, "use_min_x", 0, "", ICON_NONE); + sub = uiLayoutColumn(row, true); + uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_min_x")); + uiItemR(sub, ptr, "min_x", 0, "", ICON_NONE); - /* block 2: start range settings */ - col = uiLayoutColumn(layout, true); - uiItemR(col, &ptr, "use_frame_start", 0, NULL, ICON_NONE); + row = uiLayoutRowWithHeading(col, true, IFACE_("Y")); + uiItemR(row, ptr, "use_min_y", 0, "", ICON_NONE); + sub = uiLayoutColumn(row, true); + uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_min_y")); + uiItemR(sub, ptr, "min_y", 0, "", ICON_NONE); - sub = uiLayoutColumn(col, true); - uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_frame_start")); - uiItemR(sub, &ptr, "frame_start", 0, NULL, ICON_NONE); + /* Maximums. */ + col = uiLayoutColumn(layout, false); + row = uiLayoutRowWithHeading(col, true, IFACE_("Maximum X")); + uiItemR(row, ptr, "use_max_x", 0, "", ICON_NONE); + sub = uiLayoutColumn(row, true); + uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_max_x")); + uiItemR(sub, ptr, "max_x", 0, "", ICON_NONE); - /* block 3: end range settings */ - col = uiLayoutColumn(layout, true); - uiItemR(col, &ptr, "use_frame_end", 0, NULL, ICON_NONE); + row = uiLayoutRowWithHeading(col, true, IFACE_("Y")); + uiItemR(row, ptr, "use_max_y", 0, "", ICON_NONE); + sub = uiLayoutColumn(row, true); + uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_max_y")); + uiItemR(sub, ptr, "max_y", 0, "", ICON_NONE); - sub = uiLayoutColumn(col, true); - uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_frame_end")); - uiItemR(sub, &ptr, "frame_end", 0, NULL, ICON_NONE); + fmodifier_influence_draw(layout, ptr); } -/* --------------- */ - -void ANIM_uiTemplate_fmodifier_draw(uiLayout *layout, - ID *fcurve_owner_id, - ListBase *modifiers, - FModifier *fcm) +static void panel_register_limits(ARegionType *region_type, + const char *id_prefix, + PanelTypePollFn poll_fn) { - const FModifierTypeInfo *fmi = fmodifier_get_typeinfo(fcm); - uiLayout *box, *row, *sub, *col; - uiBlock *block; - uiBut *but; - short width = 314; - PointerRNA ptr; + PanelType *panel_type = fmodifier_panel_register( + region_type, FMODIFIER_TYPE_LIMITS, limits_panel_draw, poll_fn, id_prefix); + fmodifier_subpanel_register(region_type, + "frame_range", + "", + fmodifier_frame_range_header_draw, + fmodifier_frame_range_draw, + poll_fn, + panel_type); +} - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifier, fcm, &ptr); +/** \} */ - /* draw header */ - { - /* get layout-row + UI-block for this */ - box = uiLayoutBox(layout); +/* -------------------------------------------------------------------- */ +/** \name Stepped Interpolation Modifier + * \{ */ - row = uiLayoutRow(box, false); - block = uiLayoutGetBlock(row); /* err... */ +static void stepped_panel_draw(const bContext *C, Panel *panel) +{ + uiLayout *col, *sub, *row; + uiLayout *layout = panel->layout; - /* left-align -------------------------------------------- */ - sub = uiLayoutRow(row, true); - uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_LEFT); + PointerRNA *ptr = fmodifier_get_pointers(C, panel, NULL); - UI_block_emboss_set(block, UI_EMBOSS_NONE); + uiLayoutSetPropSep(layout, true); - /* expand */ - uiItemR(sub, &ptr, "show_expanded", UI_ITEM_R_ICON_ONLY, "", ICON_NONE); + /* Stepping Settings. */ + col = uiLayoutColumn(layout, false); + uiItemR(col, ptr, "frame_step", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "frame_offset", 0, NULL, ICON_NONE); - /* checkbox for 'active' status (for now) */ - uiItemR(sub, &ptr, "active", UI_ITEM_R_ICON_ONLY, "", ICON_NONE); + /* Start range settings. */ + row = uiLayoutRowWithHeading(layout, true, IFACE_("Start Frame")); + uiItemR(row, ptr, "use_frame_start", 0, "", ICON_NONE); + sub = uiLayoutColumn(row, true); + uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_frame_start")); + uiItemR(sub, ptr, "frame_start", 0, "", ICON_NONE); - /* name */ - if (fmi) { - uiItemL(sub, IFACE_(fmi->name), ICON_NONE); + /* End range settings. */ + row = uiLayoutRowWithHeading(layout, true, IFACE_("End Frame")); + uiItemR(row, ptr, "use_frame_end", 0, "", ICON_NONE); + sub = uiLayoutColumn(row, true); + uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_frame_end")); + uiItemR(sub, ptr, "frame_end", 0, "", ICON_NONE); + + fmodifier_influence_draw(layout, ptr); +} + +static void panel_register_stepped(ARegionType *region_type, + const char *id_prefix, + PanelTypePollFn poll_fn) +{ + PanelType *panel_type = fmodifier_panel_register( + region_type, FMODIFIER_TYPE_STEPPED, stepped_panel_draw, poll_fn, id_prefix); + fmodifier_subpanel_register(region_type, + "frame_range", + "", + fmodifier_frame_range_header_draw, + fmodifier_frame_range_draw, + poll_fn, + panel_type); +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Panel Creation + * \{ */ + +/** + * Checks if the panels match the active strip / curve, rebuilds them if they don't. + */ +void ANIM_fmodifier_panels(const bContext *C, + ID *owner_id, + ListBase *fmodifiers, + uiListPanelIDFromDataFunc panel_id_fn) +{ + ARegion *region = CTX_wm_region(C); + + bool panels_match = UI_panel_list_matches_data(region, fmodifiers, panel_id_fn); + + if (!panels_match) { + UI_panels_free_instanced(C, region); + FModifier *fcm = fmodifiers->first; + for (int i = 0; fcm; i++, fcm = fcm->next) { + char panel_idname[MAX_NAME]; + panel_id_fn(fcm, panel_idname); + + PointerRNA *fcm_ptr = MEM_mallocN(sizeof(PointerRNA), "panel customdata"); + RNA_pointer_create(owner_id, &RNA_FModifier, fcm, fcm_ptr); + + UI_panel_add_instanced(C, region, ®ion->panels, panel_idname, fcm_ptr); } - else { - uiItemL(sub, IFACE_(""), ICON_NONE); - } - - /* right-align ------------------------------------------- */ - sub = uiLayoutRow(row, true); - uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_RIGHT); - - /* 'mute' button */ - uiItemR(sub, &ptr, "mute", UI_ITEM_R_ICON_ONLY, "", ICON_NONE); - - UI_block_emboss_set(block, UI_EMBOSS_NONE); - - /* delete button */ - but = uiDefIconBut(block, - UI_BTYPE_BUT, - B_REDR, - ICON_X, - 0, - 0, - UI_UNIT_X, - UI_UNIT_Y, - NULL, - 0.0, - 0.0, - 0.0, - 0.0, - TIP_("Delete F-Curve Modifier")); - FModifierDeleteContext *ctx = MEM_mallocN(sizeof(FModifierDeleteContext), "fmodifier ctx"); - ctx->fcurve_owner_id = fcurve_owner_id; - ctx->modifiers = modifiers; - UI_but_funcN_set(but, delete_fmodifier_cb, ctx, fcm); - - UI_block_emboss_set(block, UI_EMBOSS); } + else { + /* Assuming there's only one group of instanced panels, update the custom data pointers. */ + Panel *panel = region->panels.first; + LISTBASE_FOREACH (FModifier *, fcm, fmodifiers) { - /* when modifier is expanded, draw settings */ - if (fcm->flag & FMODIFIER_FLAG_EXPANDED) { - /* set up the flexible-box layout which acts as the backdrop for the modifier settings */ - box = uiLayoutBox(layout); - - /* draw settings for individual modifiers */ - switch (fcm->type) { - case FMODIFIER_TYPE_GENERATOR: /* Generator */ - draw_modifier__generator(box, fcurve_owner_id, fcm, width); - break; - - case FMODIFIER_TYPE_FN_GENERATOR: /* Built-In Function Generator */ - draw_modifier__fn_generator(box, fcurve_owner_id, fcm, width); - break; - - case FMODIFIER_TYPE_CYCLES: /* Cycles */ - draw_modifier__cycles(box, fcurve_owner_id, fcm, width); - break; - - case FMODIFIER_TYPE_ENVELOPE: /* Envelope */ - draw_modifier__envelope(box, fcurve_owner_id, fcm, width); - break; - - case FMODIFIER_TYPE_LIMITS: /* Limits */ - draw_modifier__limits(box, fcurve_owner_id, fcm, width); - break; - - case FMODIFIER_TYPE_NOISE: /* Noise */ - draw_modifier__noise(box, fcurve_owner_id, fcm, width); - break; - - case FMODIFIER_TYPE_STEPPED: /* Stepped */ - draw_modifier__stepped(box, fcurve_owner_id, fcm, width); - break; - - default: /* unknown type */ - break; - } - - /* one last panel below this: FModifier range */ - /* TODO: experiment with placement of this */ - { - box = uiLayoutBox(layout); - - /* restricted range ----------------------------------------------------- */ - col = uiLayoutColumn(box, true); - - /* top row: use restricted range */ - row = uiLayoutRow(col, true); - uiItemR(row, &ptr, "use_restricted_range", 0, NULL, ICON_NONE); - - if (fcm->flag & FMODIFIER_FLAG_RANGERESTRICT) { - /* second row: settings */ - row = uiLayoutRow(col, true); - - uiItemR(row, &ptr, "frame_start", 0, IFACE_("Start"), ICON_NONE); - uiItemR(row, &ptr, "frame_end", 0, IFACE_("End"), ICON_NONE); - - /* third row: blending influence */ - row = uiLayoutRow(col, true); - - uiItemR(row, &ptr, "blend_in", 0, IFACE_("In"), ICON_NONE); - uiItemR(row, &ptr, "blend_out", 0, IFACE_("Out"), ICON_NONE); + /* Move to the next instanced panel corresponding to the next modifier. */ + while ((panel->type == NULL) || !(panel->type->flag & PANEL_TYPE_INSTANCED)) { + panel = panel->next; + BLI_assert(panel != NULL); /* There shouldn't be fewer panels than modifiers with UIs. */ } - /* influence -------------------------------------------------------------- */ - col = uiLayoutColumn(box, true); + PointerRNA *fcm_ptr = MEM_mallocN(sizeof(PointerRNA), "panel customdata"); + RNA_pointer_create(owner_id, &RNA_FModifier, fcm, fcm_ptr); + UI_panel_custom_data_set(panel, fcm_ptr); - /* top row: use influence */ - uiItemR(col, &ptr, "use_influence", 0, NULL, ICON_NONE); - - if (fcm->flag & FMODIFIER_FLAG_USEINFLUENCE) { - /* second row: influence value */ - uiItemR(col, &ptr, "influence", 0, NULL, ICON_NONE); - } + panel = panel->next; } } } +void ANIM_modifier_panels_register_graph_and_NLA(ARegionType *region_type, + const char *modifier_panel_prefix, + PanelTypePollFn poll_function) +{ + panel_register_generator(region_type, modifier_panel_prefix, poll_function); + panel_register_fn_generator(region_type, modifier_panel_prefix, poll_function); + panel_register_noise(region_type, modifier_panel_prefix, poll_function); + panel_register_envelope(region_type, modifier_panel_prefix, poll_function); + panel_register_limits(region_type, modifier_panel_prefix, poll_function); + panel_register_stepped(region_type, modifier_panel_prefix, poll_function); +} + +void ANIM_modifier_panels_register_graph_only(ARegionType *region_type, + const char *modifier_panel_prefix, + PanelTypePollFn poll_function) +{ + panel_register_cycles(region_type, modifier_panel_prefix, poll_function); +} + +/** \} */ + /* -------------------------------------------------------------------- */ /** \name Copy / Paste Buffer Code * diff --git a/source/blender/editors/animation/keyframes_draw.c b/source/blender/editors/animation/keyframes_draw.c index 542a6d45db7..b9ef69cf8bd 100644 --- a/source/blender/editors/animation/keyframes_draw.c +++ b/source/blender/editors/animation/keyframes_draw.c @@ -258,6 +258,10 @@ static DLRBT_Node *nalloc_ak_gpframe(void *data) /* count keyframes in this column */ ak->totkey = 1; + /* Set as visible block. */ + ak->totblock = 1; + ak->block.sel = ak->sel; + ak->block.flag |= ACTKEYBLOCK_FLAG_GPENCIL; return (DLRBT_Node *)ak; } @@ -689,6 +693,7 @@ static void draw_keylist(View2D *v2d, { const float icon_sz = U.widget_unit * 0.5f * yscale_fac; const float half_icon_sz = 0.5f * icon_sz; + const float quarter_icon_sz = 0.25f * icon_sz; const float smaller_sz = 0.35f * icon_sz; const float ipo_sz = 0.1f * icon_sz; @@ -724,6 +729,7 @@ static void draw_keylist(View2D *v2d, ipo_color_mix[3] *= 0.5f; uint block_len = 0; + uint gpencil_len = 0; LISTBASE_FOREACH (ActKeyColumn *, ab, keys) { if (actkeyblock_get_valid_hold(ab)) { block_len++; @@ -731,50 +737,72 @@ static void draw_keylist(View2D *v2d, if (show_ipo && actkeyblock_is_valid(ab) && (ab->block.flag & ACTKEYBLOCK_FLAG_NON_BEZIER)) { block_len++; } + if ((ab->next != NULL) && (ab->block.flag & ACTKEYBLOCK_FLAG_GPENCIL)) { + gpencil_len++; + } } - if (block_len > 0) { + if ((block_len > 0) || (gpencil_len > 0)) { GPUVertFormat *format = immVertexFormat(); uint pos_id = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); uint color_id = GPU_vertformat_attr_add(format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT); immBindBuiltinProgram(GPU_SHADER_2D_FLAT_COLOR); - immBegin(GPU_PRIM_TRIS, 6 * block_len); - LISTBASE_FOREACH (ActKeyColumn *, ab, keys) { - int valid_hold = actkeyblock_get_valid_hold(ab); - if (valid_hold != 0) { - if ((valid_hold & ACTKEYBLOCK_FLAG_STATIC_HOLD) == 0) { - /* draw "moving hold" long-keyframe block - slightly smaller */ - immRectf_fast_with_color(pos_id, - color_id, - ab->cfra, - ypos - smaller_sz, - ab->next->cfra, - ypos + smaller_sz, - (ab->block.sel) ? sel_mhcol : unsel_mhcol); + /* Normal Dopesheet. */ + if (block_len > 0) { + immBegin(GPU_PRIM_TRIS, 6 * block_len); + LISTBASE_FOREACH (ActKeyColumn *, ab, keys) { + int valid_hold = actkeyblock_get_valid_hold(ab); + if (valid_hold != 0) { + if ((valid_hold & ACTKEYBLOCK_FLAG_STATIC_HOLD) == 0) { + /* draw "moving hold" long-keyframe block - slightly smaller */ + immRectf_fast_with_color(pos_id, + color_id, + ab->cfra, + ypos - smaller_sz, + ab->next->cfra, + ypos + smaller_sz, + (ab->block.sel) ? sel_mhcol : unsel_mhcol); + } + else { + /* draw standard long-keyframe block */ + immRectf_fast_with_color(pos_id, + color_id, + ab->cfra, + ypos - half_icon_sz, + ab->next->cfra, + ypos + half_icon_sz, + (ab->block.sel) ? sel_color : unsel_color); + } } - else { - /* draw standard long-keyframe block */ - immRectf_fast_with_color(pos_id, - color_id, - ab->cfra, - ypos - half_icon_sz, - ab->next->cfra, - ypos + half_icon_sz, - (ab->block.sel) ? sel_color : unsel_color); + if (show_ipo && actkeyblock_is_valid(ab) && + (ab->block.flag & ACTKEYBLOCK_FLAG_NON_BEZIER)) { + /* draw an interpolation line */ + immRectf_fast_with_color( + pos_id, + color_id, + ab->cfra, + ypos - ipo_sz, + ab->next->cfra, + ypos + ipo_sz, + (ab->block.conflict & ACTKEYBLOCK_FLAG_NON_BEZIER) ? ipo_color_mix : ipo_color); } } - if (show_ipo && actkeyblock_is_valid(ab) && - (ab->block.flag & ACTKEYBLOCK_FLAG_NON_BEZIER)) { - /* draw an interpolation line */ - immRectf_fast_with_color( - pos_id, - color_id, - ab->cfra, - ypos - ipo_sz, - ab->next->cfra, - ypos + ipo_sz, - (ab->block.conflict & ACTKEYBLOCK_FLAG_NON_BEZIER) ? ipo_color_mix : ipo_color); + } + /* Grease Pencil Dopesheet. */ + else { + immBegin(GPU_PRIM_TRIS, 6 * gpencil_len); + LISTBASE_FOREACH (ActKeyColumn *, ab, keys) { + if (ab->next == NULL) { + continue; + } + immRectf_fast_with_color(pos_id, + color_id, + ab->cfra, + ypos - quarter_icon_sz, + ab->next->cfra, + ypos + quarter_icon_sz, + (ab->block.sel) ? sel_mhcol : unsel_mhcol); } } immEnd(); diff --git a/source/blender/editors/animation/keyframes_edit.c b/source/blender/editors/animation/keyframes_edit.c index d5260cac0c9..636f0d3cbea 100644 --- a/source/blender/editors/animation/keyframes_edit.c +++ b/source/blender/editors/animation/keyframes_edit.c @@ -86,7 +86,7 @@ short ANIM_fcurve_keyframes_loop(KeyframeEditData *ked, return 0; } - /* set the F-Curve into the editdata so that it can be accessed */ + /* Set the F-Curve into the edit-data so that it can be accessed. */ if (ked) { ked->fcu = fcu; ked->curIndex = 0; diff --git a/source/blender/editors/animation/keyframes_general.c b/source/blender/editors/animation/keyframes_general.c index 6ed9803dbd3..72e65272f13 100644 --- a/source/blender/editors/animation/keyframes_general.c +++ b/source/blender/editors/animation/keyframes_general.c @@ -39,13 +39,11 @@ #include "BKE_action.h" #include "BKE_curve.h" -#include "BKE_deform.h" #include "BKE_fcurve.h" #include "BKE_main.h" #include "BKE_report.h" #include "RNA_access.h" -#include "RNA_enum_types.h" #include "ED_anim_api.h" #include "ED_keyframes_edit.h" diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c index 0d1633ab3a2..4cc0413be5b 100644 --- a/source/blender/editors/animation/keyframing.c +++ b/source/blender/editors/animation/keyframing.c @@ -639,7 +639,7 @@ int insert_vert_fcurve( /* don't recalculate handles if fast is set * - this is a hack to make importers faster - * - we may calculate twice (due to autohandle needing to be calculated twice) + * - we may calculate twice (due to auto-handle needing to be calculated twice) */ if ((flag & INSERTKEY_FAST) == 0) { calchandles_fcurve(fcu); diff --git a/source/blender/editors/armature/armature_edit.c b/source/blender/editors/armature/armature_edit.c index a07e73d6266..912aafbd6e3 100644 --- a/source/blender/editors/armature/armature_edit.c +++ b/source/blender/editors/armature/armature_edit.c @@ -126,12 +126,12 @@ void ED_armature_origin_set( bArmature *arm = ob->data; float cent[3]; - /* Put the armature into editmode */ + /* Put the armature into edit-mode. */ if (is_editmode == false) { ED_armature_to_edit(arm); } - /* Find the centerpoint */ + /* Find the center-point. */ if (centermode == 2) { copy_v3_v3(cent, cursor); invert_m4_m4(ob->imat, ob->obmat); @@ -173,7 +173,7 @@ void ED_armature_origin_set( ED_armature_edit_free(arm); } - /* Adjust object location for new centerpoint */ + /* Adjust object location for new center-point. */ if (centermode && (is_editmode == false)) { mul_mat3_m4_v3(ob->obmat, cent); /* omit translation part */ add_v3_v3(ob->loc, cent); diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c index da1b29307b1..a0face26bae 100644 --- a/source/blender/editors/armature/armature_ops.c +++ b/source/blender/editors/armature/armature_ops.c @@ -28,8 +28,6 @@ #include "ED_armature.h" #include "ED_screen.h" -#include "ED_select_utils.h" -#include "ED_transform.h" #include "armature_intern.h" diff --git a/source/blender/editors/armature/armature_skinning.c b/source/blender/editors/armature/armature_skinning.c index 6951ed6f305..f86ec545712 100644 --- a/source/blender/editors/armature/armature_skinning.c +++ b/source/blender/editors/armature/armature_skinning.c @@ -30,7 +30,6 @@ #include "MEM_guardedalloc.h" -#include "BLI_blenlib.h" #include "BLI_math.h" #include "BLI_string_utils.h" @@ -50,8 +49,6 @@ #include "ED_armature.h" #include "ED_mesh.h" -#include "eigen_capi.h" - #include "armature_intern.h" #include "meshlaplacian.h" diff --git a/source/blender/editors/armature/editarmature_undo.c b/source/blender/editors/armature/editarmature_undo.c index 337d1138b23..725945f8edc 100644 --- a/source/blender/editors/armature/editarmature_undo.c +++ b/source/blender/editors/armature/editarmature_undo.c @@ -37,6 +37,7 @@ #include "BKE_context.h" #include "BKE_layer.h" #include "BKE_main.h" +#include "BKE_object.h" #include "BKE_undo_system.h" #include "DEG_depsgraph.h" @@ -186,11 +187,10 @@ static void armature_undosys_step_decode(struct bContext *C, { ArmatureUndoStep *us = (ArmatureUndoStep *)us_p; - /* Load all our objects into edit-mode, clear everything else. */ ED_undo_object_editmode_restore_helper( C, &us->elems[0].obedit_ref.ptr, us->elems_len, sizeof(*us->elems)); - BLI_assert(armature_undosys_poll(C)); + BLI_assert(BKE_object_is_in_editmode(us->elems[0].obedit_ref.ptr)); for (uint i = 0; i < us->elems_len; i++) { ArmatureUndoStep_Elem *elem = &us->elems[i]; @@ -211,7 +211,10 @@ static void armature_undosys_step_decode(struct bContext *C, /* The first element is always active */ ED_undo_object_set_active_or_warn( - CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); + CTX_data_scene(C), CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); + + /* Check after setting active. */ + BLI_assert(armature_undosys_poll(C)); bmain->is_memfile_undo_flush_needed = true; diff --git a/source/blender/editors/armature/pose_select.c b/source/blender/editors/armature/pose_select.c index 6a03207b3b0..a3f97000509 100644 --- a/source/blender/editors/armature/pose_select.c +++ b/source/blender/editors/armature/pose_select.c @@ -138,8 +138,10 @@ void ED_pose_bone_select(Object *ob, bPoseChannel *pchan, bool select) } } -/* called from editview.c, for mode-less pose selection */ -/* assumes scene obact and basact is still on old situation */ +/** + * Called for mode-less pose selection. + * assumes the active object is still on old situation. + */ bool ED_armature_pose_select_pick_with_buffer(ViewLayer *view_layer, View3D *v3d, Base *base, diff --git a/source/blender/editors/armature/pose_utils.c b/source/blender/editors/armature/pose_utils.c index 7e6da7f96b0..c75e9c9ef69 100644 --- a/source/blender/editors/armature/pose_utils.c +++ b/source/blender/editors/armature/pose_utils.c @@ -33,7 +33,6 @@ #include "BKE_action.h" #include "BKE_anim_data.h" -#include "BKE_armature.h" #include "BKE_idprop.h" #include "BKE_layer.h" #include "BKE_object.h" diff --git a/source/blender/editors/asset/asset_edit.cc b/source/blender/editors/asset/asset_edit.cc index 7aee467286f..d20de4141cb 100644 --- a/source/blender/editors/asset/asset_edit.cc +++ b/source/blender/editors/asset/asset_edit.cc @@ -20,11 +20,9 @@ #include "BKE_asset.h" #include "BKE_context.h" -#include "BKE_idtype.h" #include "BKE_lib_id.h" #include "DNA_ID.h" -#include "DNA_asset_types.h" #include "UI_interface_icons.h" diff --git a/source/blender/editors/asset/asset_ops.cc b/source/blender/editors/asset/asset_ops.cc index 6c4ef8923a2..8ca1b488a1d 100644 --- a/source/blender/editors/asset/asset_ops.cc +++ b/source/blender/editors/asset/asset_ops.cc @@ -18,124 +18,128 @@ * \ingroup edasset */ -#include - -#include "BKE_asset.h" #include "BKE_context.h" #include "BKE_report.h" -#include "BLI_listbase.h" -#include "BLI_string_utils.h" -#include "BLI_utildefines.h" - -#include "DNA_asset_types.h" -#include "DNA_userdef_types.h" +#include "BLI_vector.hh" #include "ED_asset.h" -#include "MEM_guardedalloc.h" - #include "RNA_access.h" -#include "RNA_define.h" #include "WM_api.h" #include "WM_types.h" /* -------------------------------------------------------------------- */ -struct AssetMarkResultStats { - int tot_created; - int tot_already_asset; - ID *last_id; -}; +using PointerRNAVec = blender::Vector; -static bool asset_ops_poll(bContext *UNUSED(C)) +static bool asset_operation_poll(bContext * /*C*/) { return U.experimental.use_asset_browser; } /** - * Return the IDs to operate on as list of #CollectionPointerLink links. Needs freeing. + * Return the IDs to operate on as PointerRNA vector. Either a single one ("id" context member) or + * multiple ones ("selected_ids" context member). */ -static ListBase /* CollectionPointerLink */ asset_operation_get_ids_from_context(const bContext *C) +static PointerRNAVec asset_operation_get_ids_from_context(const bContext *C) { - ListBase list = {0}; + PointerRNAVec ids; PointerRNA idptr = CTX_data_pointer_get_type(C, "id", &RNA_ID); - if (idptr.data) { - CollectionPointerLink *ctx_link = (CollectionPointerLink *)MEM_callocN(sizeof(*ctx_link), - __func__); - ctx_link->ptr = idptr; - BLI_addtail(&list, ctx_link); + /* Single ID. */ + ids.append(idptr); } else { + ListBase list; CTX_data_selected_ids(C, &list); + LISTBASE_FOREACH (CollectionPointerLink *, link, &list) { + ids.append(link->ptr); + } + BLI_freelistN(&list); } - return list; + return ids; } -static void asset_mark_for_idptr_list(const bContext *C, - const ListBase /* CollectionPointerLink */ *ids, - struct AssetMarkResultStats *r_stats) +/* -------------------------------------------------------------------- */ + +class AssetMarkHelper { + public: + void operator()(const bContext &C, PointerRNAVec &ids); + + void reportResults(ReportList &reports) const; + bool wasSuccessful() const; + + private: + struct Stats { + int tot_created = 0; + int tot_already_asset = 0; + ID *last_id = nullptr; + }; + + Stats stats; +}; + +void AssetMarkHelper::operator()(const bContext &C, PointerRNAVec &ids) { - memset(r_stats, 0, sizeof(*r_stats)); + for (PointerRNA &ptr : ids) { + BLI_assert(RNA_struct_is_ID(ptr.type)); - LISTBASE_FOREACH (CollectionPointerLink *, ctx_id, ids) { - BLI_assert(RNA_struct_is_ID(ctx_id->ptr.type)); - - ID *id = (ID *)ctx_id->ptr.data; + ID *id = static_cast(ptr.data); if (id->asset_data) { - r_stats->tot_already_asset++; + stats.tot_already_asset++; continue; } - if (ED_asset_mark_id(C, id)) { - r_stats->last_id = id; - r_stats->tot_created++; + if (ED_asset_mark_id(&C, id)) { + stats.last_id = id; + stats.tot_created++; } } } -static bool asset_mark_results_report(const struct AssetMarkResultStats *stats, - ReportList *reports) +bool AssetMarkHelper::wasSuccessful() const +{ + return stats.tot_created > 0; +} + +void AssetMarkHelper::reportResults(ReportList &reports) const { /* User feedback on failure. */ - if ((stats->tot_created < 1) && (stats->tot_already_asset > 0)) { - BKE_report(reports, - RPT_ERROR, - "Selected data-blocks are already assets (or do not support use as assets)"); - return false; + if (!wasSuccessful()) { + if ((stats.tot_already_asset > 0)) { + BKE_report(&reports, + RPT_ERROR, + "Selected data-blocks are already assets (or do not support use as assets)"); + } + else { + BKE_report(&reports, + RPT_ERROR, + "No data-blocks to create assets for found (or do not support use as assets)"); + } } - if (stats->tot_created < 1) { - BKE_report(reports, - RPT_ERROR, - "No data-blocks to create assets for found (or do not support use as assets)"); - return false; - } - /* User feedback on success. */ - if (stats->tot_created == 1) { + else if (stats.tot_created == 1) { /* If only one data-block: Give more useful message by printing asset name. */ - BKE_reportf(reports, RPT_INFO, "Data-block '%s' is now an asset", stats->last_id->name + 2); + BKE_reportf(&reports, RPT_INFO, "Data-block '%s' is now an asset", stats.last_id->name + 2); } else { - BKE_reportf(reports, RPT_INFO, "%i data-blocks are now assets", stats->tot_created); + BKE_reportf(&reports, RPT_INFO, "%i data-blocks are now assets", stats.tot_created); } - - return true; } static int asset_mark_exec(bContext *C, wmOperator *op) { - ListBase ids = asset_operation_get_ids_from_context(C); + PointerRNAVec ids = asset_operation_get_ids_from_context(C); - struct AssetMarkResultStats stats; - asset_mark_for_idptr_list(C, &ids, &stats); - BLI_freelistN(&ids); + AssetMarkHelper mark_helper; + mark_helper(*C, ids); + mark_helper.reportResults(*op->reports); - if (!asset_mark_results_report(&stats, op->reports)) { + if (!mark_helper.wasSuccessful()) { return OPERATOR_CANCELLED; } @@ -154,67 +158,75 @@ static void ASSET_OT_mark(wmOperatorType *ot) ot->idname = "ASSET_OT_mark"; ot->exec = asset_mark_exec; - ot->poll = asset_ops_poll; + ot->poll = asset_operation_poll; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } /* -------------------------------------------------------------------- */ -struct AssetClearResultStats { - int tot_removed; - ID *last_id; +class AssetClearHelper { + public: + void operator()(PointerRNAVec &ids); + + void reportResults(ReportList &reports) const; + bool wasSuccessful() const; + + private: + struct Stats { + int tot_cleared = 0; + ID *last_id = nullptr; + }; + + Stats stats; }; -static void asset_clear_from_idptr_list(const ListBase /* CollectionPointerLink */ *ids, - AssetClearResultStats *r_stats) +void AssetClearHelper::operator()(PointerRNAVec &ids) { - memset(r_stats, 0, sizeof(*r_stats)); + for (PointerRNA &ptr : ids) { + BLI_assert(RNA_struct_is_ID(ptr.type)); - LISTBASE_FOREACH (CollectionPointerLink *, ctx_id, ids) { - BLI_assert(RNA_struct_is_ID(ctx_id->ptr.type)); - - ID *id = (ID *)ctx_id->ptr.data; + ID *id = static_cast(ptr.data); if (!id->asset_data) { continue; } if (ED_asset_clear_id(id)) { - r_stats->tot_removed++; - r_stats->last_id = id; + stats.tot_cleared++; + stats.last_id = id; } } } -static bool asset_clear_result_report(const AssetClearResultStats *stats, ReportList *reports) - +void AssetClearHelper::reportResults(ReportList &reports) const { - if (stats->tot_removed < 1) { - BKE_report(reports, RPT_ERROR, "No asset data-blocks selected/focused"); - return false; + if (!wasSuccessful()) { + BKE_report(&reports, RPT_ERROR, "No asset data-blocks selected/focused"); } - - if (stats->tot_removed == 1) { + else if (stats.tot_cleared == 1) { /* If only one data-block: Give more useful message by printing asset name. */ BKE_reportf( - reports, RPT_INFO, "Data-block '%s' is no asset anymore", stats->last_id->name + 2); + &reports, RPT_INFO, "Data-block '%s' is no asset anymore", stats.last_id->name + 2); } else { - BKE_reportf(reports, RPT_INFO, "%i data-blocks are no assets anymore", stats->tot_removed); + BKE_reportf(&reports, RPT_INFO, "%i data-blocks are no assets anymore", stats.tot_cleared); } +} - return true; +bool AssetClearHelper::wasSuccessful() const +{ + return stats.tot_cleared > 0; } static int asset_clear_exec(bContext *C, wmOperator *op) { - ListBase ids = asset_operation_get_ids_from_context(C); + PointerRNAVec ids = asset_operation_get_ids_from_context(C); - AssetClearResultStats stats; - asset_clear_from_idptr_list(&ids, &stats); - BLI_freelistN(&ids); + AssetClearHelper clear_helper; + clear_helper(ids); + clear_helper.reportResults(*op->reports); - if (!asset_clear_result_report(&stats, op->reports)) { + if (!clear_helper.wasSuccessful()) { return OPERATOR_CANCELLED; } @@ -233,7 +245,7 @@ static void ASSET_OT_clear(wmOperatorType *ot) ot->idname = "ASSET_OT_clear"; ot->exec = asset_clear_exec; - ot->poll = asset_ops_poll; + ot->poll = asset_operation_poll; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 8ebc2077619..0593cedb5a1 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -2474,7 +2474,7 @@ static void adduplicateflagNurb( memcpy(&newnu->bp[b * newu], &nu->bp[b * nu->pntsu], newu * sizeof(BPoint)); } - /* check for actvert in the unused cyclicuv selection */ + /* Check for `actvert` in the unused cyclic-UV selection. */ if (cu->actnu == i) { if (cu->actvert == -1) { calc_duplicate_actnurb(editnurb, newnurb, cu); @@ -3111,7 +3111,7 @@ void CURVE_OT_smooth_weight(wmOperatorType *ot) ot->description = "Interpolate weight of selected points"; ot->idname = "CURVE_OT_smooth_weight"; - /* api clastbacks */ + /* api callbacks */ ot->exec = curve_smooth_weight_exec; ot->poll = ED_operator_editsurfcurve; @@ -3154,7 +3154,7 @@ void CURVE_OT_smooth_radius(wmOperatorType *ot) ot->description = "Interpolate radii of selected points"; ot->idname = "CURVE_OT_smooth_radius"; - /* api clastbacks */ + /* api callbacks */ ot->exec = curve_smooth_radius_exec; ot->poll = ED_operator_editsurfcurve; @@ -3197,7 +3197,7 @@ void CURVE_OT_smooth_tilt(wmOperatorType *ot) ot->description = "Interpolate tilt of selected points"; ot->idname = "CURVE_OT_smooth_tilt"; - /* api clastbacks */ + /* api callbacks */ ot->exec = curve_smooth_tilt_exec; ot->poll = ED_operator_editsurfcurve; diff --git a/source/blender/editors/curve/editcurve_select.c b/source/blender/editors/curve/editcurve_select.c index 82f7b456284..d362ec23370 100644 --- a/source/blender/editors/curve/editcurve_select.c +++ b/source/blender/editors/curve/editcurve_select.c @@ -501,7 +501,7 @@ void CURVE_OT_de_select_first(wmOperatorType *ot) ot->idname = "CURVE_OT_de_select_first"; ot->description = "(De)select first of visible part of each NURBS"; - /* api cfirstbacks */ + /* api callbacks */ ot->exec = de_select_first_exec; ot->poll = ED_operator_editcurve; @@ -535,7 +535,7 @@ void CURVE_OT_de_select_last(wmOperatorType *ot) ot->idname = "CURVE_OT_de_select_last"; ot->description = "(De)select last of visible part of each NURBS"; - /* api clastbacks */ + /* api callbacks */ ot->exec = de_select_last_exec; ot->poll = ED_operator_editcurve; diff --git a/source/blender/editors/curve/editcurve_undo.c b/source/blender/editors/curve/editcurve_undo.c index 681f387e83e..b07c3c85f4a 100644 --- a/source/blender/editors/curve/editcurve_undo.c +++ b/source/blender/editors/curve/editcurve_undo.c @@ -36,6 +36,7 @@ #include "BKE_fcurve.h" #include "BKE_layer.h" #include "BKE_main.h" +#include "BKE_object.h" #include "BKE_undo_system.h" #include "DEG_depsgraph.h" @@ -173,7 +174,8 @@ static void undocurve_free_data(UndoCurve *uc) static Object *editcurve_object_from_context(bContext *C) { - Object *obedit = CTX_data_edit_object(C); + ViewLayer *view_layer = CTX_data_view_layer(C); + Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer); if (obedit && ELEM(obedit->type, OB_CURVE, OB_SURF)) { Curve *cu = obedit->data; if (BKE_curve_editNurbs_get(cu) != NULL) { @@ -246,11 +248,10 @@ static void curve_undosys_step_decode(struct bContext *C, { CurveUndoStep *us = (CurveUndoStep *)us_p; - /* Load all our objects into edit-mode, clear everything else. */ ED_undo_object_editmode_restore_helper( C, &us->elems[0].obedit_ref.ptr, us->elems_len, sizeof(*us->elems)); - BLI_assert(curve_undosys_poll(C)); + BLI_assert(BKE_object_is_in_editmode(us->elems[0].obedit_ref.ptr)); for (uint i = 0; i < us->elems_len; i++) { CurveUndoStep_Elem *elem = &us->elems[i]; @@ -271,7 +272,10 @@ static void curve_undosys_step_decode(struct bContext *C, /* The first element is always active */ ED_undo_object_set_active_or_warn( - CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); + CTX_data_scene(C), CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); + + /* Check after setting active. */ + BLI_assert(curve_undosys_poll(C)); bmain->is_memfile_undo_flush_needed = true; diff --git a/source/blender/editors/curve/editfont_undo.c b/source/blender/editors/curve/editfont_undo.c index 07f062e7a53..a305a997d50 100644 --- a/source/blender/editors/curve/editfont_undo.c +++ b/source/blender/editors/curve/editfont_undo.c @@ -23,11 +23,14 @@ #include "MEM_guardedalloc.h" +#include "CLG_log.h" + #include "BLI_array_utils.h" #include "BLI_utildefines.h" #include "DNA_curve_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "BKE_context.h" #include "BKE_font.h" @@ -38,6 +41,7 @@ #include "ED_curve.h" #include "ED_object.h" +#include "ED_undo.h" #include "WM_api.h" #include "WM_types.h" @@ -52,6 +56,9 @@ # define ARRAY_CHUNK_SIZE 32 #endif +/** Only needed this locally. */ +static CLG_LogRef LOG = {"ed.undo.font"}; + /* -------------------------------------------------------------------- */ /** \name Undo Conversion * \{ */ @@ -279,7 +286,7 @@ static void *undofont_from_editfont(UndoFont *uf, Curve *cu) ((LinkData *)uf_arraystore.local_links.last)->data : NULL; - /* add oursrlves */ + /* Add ourselves. */ BLI_addtail(&uf_arraystore.local_links, BLI_genericNodeN(uf)); uf_arraystore_compact_with_info(uf, uf_ref); @@ -314,7 +321,8 @@ static void undofont_free_data(UndoFont *uf) static Object *editfont_object_from_context(bContext *C) { - Object *obedit = CTX_data_edit_object(C); + ViewLayer *view_layer = CTX_data_view_layer(C); + Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer); if (obedit && obedit->type == OB_FONT) { Curve *cu = obedit->data; EditFont *ef = cu->editfont; @@ -362,15 +370,22 @@ static void font_undosys_step_decode(struct bContext *C, const eUndoStepDir UNUSED(dir), bool UNUSED(is_final)) { - /* TODO(campbell): undo_system: use low-level API to set mode. */ - ED_object_mode_set_ex(C, OB_MODE_EDIT, false, NULL); - BLI_assert(font_undosys_poll(C)); FontUndoStep *us = (FontUndoStep *)us_p; Object *obedit = us->obedit_ref.ptr; + + /* Pass in an array of 1 (typically used for multi-object edit-mode). */ + ED_undo_object_editmode_restore_helper(C, &obedit, 1, sizeof(Object *)); + Curve *cu = obedit->data; undofont_to_editfont(&us->data, cu); DEG_id_tag_update(&obedit->id, ID_RECALC_GEOMETRY); + + ED_undo_object_set_active_or_warn( + CTX_data_scene(C), CTX_data_view_layer(C), obedit, us_p->name, &LOG); + + BLI_assert(font_undosys_poll(C)); + cu->editfont->needs_flush_to_id = 1; bmain->is_memfile_undo_flush_needed = true; WM_event_add_notifier(C, NC_GEOM | ND_DATA, NULL); diff --git a/source/blender/editors/datafiles/CMakeLists.txt b/source/blender/editors/datafiles/CMakeLists.txt index 337fb18f835..8b4ded81b34 100644 --- a/source/blender/editors/datafiles/CMakeLists.txt +++ b/source/blender/editors/datafiles/CMakeLists.txt @@ -53,6 +53,9 @@ set(ICON_NAMES collapsemenu x duplicate + trash + collection_new + options node node_sel window @@ -65,6 +68,7 @@ set(ICON_NAMES panel_close copy_id eyedropper + checkmark auto checkbox_dehlt checkbox_hlt @@ -75,6 +79,10 @@ set(ICON_NAMES screen_back rightarrow downarrow_hlt + fcurve_snapshot + object_hidden + topbar + statusbar plugin help ghost_enabled @@ -101,6 +109,7 @@ set(ICON_NAMES three_dots fullscreen_enter fullscreen_exit + brushes_all light material texture @@ -125,6 +134,7 @@ set(ICON_NAMES info sequence text + spreadsheet sound action nla @@ -132,7 +142,7 @@ set(ICON_NAMES time nodetree console - clip + tracker asset_manager node_compositing node_texture @@ -140,6 +150,7 @@ set(ICON_NAMES object_datamode editmode_hlt uv + uv_data vpaint_hlt tpaint_hlt wpaint_hlt @@ -213,6 +224,7 @@ set(ICON_NAMES mouse_lmb_drag mouse_mmb_drag mouse_rmb_drag + memory preset_new decorate decorate_keyframe @@ -223,7 +235,8 @@ set(ICON_NAMES decorate_unlocked decorate_locked decorate_override - sealed + fund + tracker_data heart orphan_data user @@ -245,6 +258,7 @@ set(ICON_NAMES outliner_ob_greasepencil outliner_ob_lightprobe outliner_ob_image + outliner_collection restrict_color_off restrict_color_on hide_on @@ -253,6 +267,7 @@ set(ICON_NAMES restrict_select_off restrict_render_on restrict_render_off + restrict_instanced_off outliner_data_empty outliner_data_mesh outliner_data_curve @@ -264,17 +279,21 @@ set(ICON_NAMES outliner_data_font outliner_data_surface outliner_data_speaker + outliner_data_lightprobe + outliner_data_gp_layer outliner_data_greasepencil gp_select_points gp_select_strokes gp_multiframe_editing gp_only_selected + gp_select_between_strokes modifier_off modifier_on onionskin_off onionskin_on restrict_view_on restrict_view_off + restrict_instanced_on mesh_plane mesh_cube mesh_circle @@ -337,6 +356,8 @@ set(ICON_NAMES force_turbulence force_drag force_fluidflow + rigid_body + rigid_body_constraint image_plane image_background image_reference @@ -345,6 +366,16 @@ set(ICON_NAMES node_top node_side node_corner + anchor_top + anchor_bottom + anchor_left + anchor_right + anchor_center + select_set + select_extend + select_subtract + select_intersect + select_difference align_left align_center align_right @@ -358,6 +389,38 @@ set(ICON_NAMES underline small_caps modifier + con_action + holdout_off + holdout_on + indirect_only_off + indirect_only_on + con_camerasolver + con_followtrack + con_objectsolver + con_loclike + con_rotlike + con_sizelike + con_translike + con_distlimit + con_loclimit + con_rotlimit + con_sizelimit + con_samevol + con_transform + con_transform_cache + con_clampto + con_kinematic + con_locktrack + con_splineik + con_stretchto + con_trackto + con_armature + con_childof + con_floor + con_followpath + con_pivot + con_shrinkwrap + modifier_data mod_wave mod_build mod_decim @@ -385,6 +448,7 @@ set(ICON_NAMES mod_mask mod_cloth mod_explode + mod_fluidsim mod_multires mod_fluid mod_solidify @@ -415,6 +479,7 @@ set(ICON_NAMES pause prev_keyframe next_keyframe + play_sound play_reverse preview_range action_tweak @@ -456,6 +521,7 @@ set(ICON_NAMES vertexsel edgesel facesel + cursor pivot_boundbox pivot_cursor pivot_individual @@ -464,6 +530,7 @@ set(ICON_NAMES center_only smoothcurve spherecurve + inversesquarecurve rootcurve sharpcurve lincurve @@ -472,10 +539,13 @@ set(ICON_NAMES prop_off prop_on prop_con - sculpt_dyntopo + prop_projected particle_point particle_tip particle_path + snap_face_center + snap_perpendicular + snap_midpoint snap_off snap_on snap_normal @@ -513,6 +583,9 @@ set(ICON_NAMES uv_facesel uv_islandsel uv_sync_select + transform_origins + gizmo + orientation_cursor normals_vertex normals_face normals_vertex_face @@ -530,6 +603,18 @@ set(ICON_NAMES axis_top layer_used layer_active + outliner_ob_hair + outliner_data_hair + hair_data + outliner_ob_pointcloud + outliner_data_pointcloud + pointcloud_data + outliner_ob_volume + outliner_data_volume + volume_data + home + documents + temp sortalpha sortbyext sorttime @@ -541,6 +626,7 @@ set(ICON_NAMES fontpreview filter newfolder + folder_redirect file_parent file_refresh file_folder @@ -562,6 +648,7 @@ set(ICON_NAMES loop_forwards back forward + file_archive file_cache file_volume file_3d @@ -586,16 +673,27 @@ set(ICON_NAMES linenumbers_off linenumbers_on scriptplugins + disc + desktop + external_drive + network_drive seq_sequencer seq_preview seq_luma_waveform seq_chroma_scope seq_histogram seq_splitview + seq_strip_meta + seq_strip_duplicate image_rgb image_rgb_alpha image_alpha image_zdepth + handle_autoclamped + handle_auto + handle_aligned + handle_vector + handle_free view_perspective view_ortho view_camera diff --git a/source/blender/editors/geometry/geometry_attributes.c b/source/blender/editors/geometry/geometry_attributes.c index 4106c03f17d..2807e7c4392 100644 --- a/source/blender/editors/geometry/geometry_attributes.c +++ b/source/blender/editors/geometry/geometry_attributes.c @@ -23,7 +23,6 @@ #include "BKE_attribute.h" #include "BKE_context.h" -#include "BKE_report.h" #include "RNA_access.h" #include "RNA_define.h" @@ -34,7 +33,6 @@ #include "WM_api.h" #include "WM_types.h" -#include "ED_geometry.h" #include "ED_object.h" #include "geometry_intern.h" diff --git a/source/blender/editors/gizmo_library/gizmo_library_presets.c b/source/blender/editors/gizmo_library/gizmo_library_presets.c index 9039851da01..4e56ceb9fd4 100644 --- a/source/blender/editors/gizmo_library/gizmo_library_presets.c +++ b/source/blender/editors/gizmo_library/gizmo_library_presets.c @@ -22,12 +22,9 @@ * \brief Preset shapes that can be drawn from any gizmo type. */ -#include "MEM_guardedalloc.h" - #include "BLI_math.h" #include "DNA_object_types.h" -#include "DNA_view3d_types.h" #include "BKE_context.h" @@ -36,12 +33,8 @@ #include "DEG_depsgraph.h" -#include "RNA_access.h" - -#include "WM_api.h" #include "WM_types.h" -#include "ED_screen.h" #include "ED_view3d.h" /* own includes */ diff --git a/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.c index d4d9f9bf424..d506af4450a 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.c @@ -446,7 +446,6 @@ static void gizmo_arrow_exit(bContext *C, wmGizmo *gz, const bool cancel) /* -------------------------------------------------------------------- */ /** \name Arrow Gizmo API - * * \{ */ /** diff --git a/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c index 5617b6e125e..b1c8efcfafc 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c @@ -28,14 +28,11 @@ #include "BKE_context.h" #include "ED_gizmo_library.h" -#include "ED_view3d.h" #include "WM_api.h" #include "WM_types.h" /* own includes */ -#include "../gizmo_geometry.h" -#include "../gizmo_library_intern.h" static void gizmo_blank_draw(const bContext *UNUSED(C), wmGizmo *UNUSED(gz)) { @@ -58,7 +55,6 @@ static int gizmo_blank_test_select(bContext *UNUSED(C), /* -------------------------------------------------------------------- */ /** \name Blank Gizmo API - * * \{ */ static void GIZMO_GT_blank_3d(wmGizmoType *gzt) diff --git a/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c index cbca230da7e..f4c4e4eb2ac 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c @@ -343,7 +343,6 @@ static void gizmo_button2d_free(wmGizmo *gz) /* -------------------------------------------------------------------- */ /** \name Button Gizmo API - * * \{ */ static void GIZMO_GT_button_2d(wmGizmoType *gzt) diff --git a/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c index be5f488d759..deb89319f4f 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c @@ -1145,7 +1145,6 @@ static void gizmo_cage2d_exit(bContext *C, wmGizmo *gz, const bool cancel) /* -------------------------------------------------------------------- */ /** \name Cage Gizmo API - * * \{ */ static void GIZMO_GT_cage_2d(wmGizmoType *gzt) diff --git a/source/blender/editors/gizmo_library/gizmo_types/cage3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/cage3d_gizmo.c index f7ab1732457..07117c0153b 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/cage3d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/cage3d_gizmo.c @@ -635,7 +635,6 @@ static void gizmo_cage3d_exit(bContext *C, wmGizmo *gz, const bool cancel) /* -------------------------------------------------------------------- */ /** \name Cage Gizmo API - * * \{ */ static void GIZMO_GT_cage_3d(wmGizmoType *gzt) diff --git a/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c index e1860d5d0fd..6345cd3525a 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c @@ -595,7 +595,6 @@ static int gizmo_dial_invoke(bContext *UNUSED(C), wmGizmo *gz, const wmEvent *ev /* -------------------------------------------------------------------- */ /** \name Dial Gizmo API - * * \{ */ void ED_gizmotypes_dial_3d_draw_util(const float matrix_basis[4][4], diff --git a/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c index 011563eece5..364444f99ae 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c @@ -434,7 +434,6 @@ static int gizmo_move_cursor_get(wmGizmo *UNUSED(gz)) /* -------------------------------------------------------------------- */ /** \name Move Gizmo API - * * \{ */ static void GIZMO_GT_move_3d(wmGizmoType *gzt) diff --git a/source/blender/editors/gizmo_library/gizmo_types/primitive3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/primitive3d_gizmo.c index 177687b6afd..7e6a728ee80 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/primitive3d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/primitive3d_gizmo.c @@ -149,7 +149,6 @@ static int gizmo_primitive_invoke(bContext *UNUSED(C), wmGizmo *gz, const wmEven /* -------------------------------------------------------------------- */ /** \name Primitive Gizmo API - * * \{ */ static void GIZMO_GT_primitive_3d(wmGizmoType *gzt) diff --git a/source/blender/editors/gpencil/annotate_paint.c b/source/blender/editors/gpencil/annotate_paint.c index 1b53141294e..c8bd38d58fe 100644 --- a/source/blender/editors/gpencil/annotate_paint.c +++ b/source/blender/editors/gpencil/annotate_paint.c @@ -444,13 +444,13 @@ static void annotation_stroke_arrow_calc_points_segment(float stroke_points[8], const float ref_point[2], const float dir_cw[2], const float dir_ccw[2], - const float lenght, + const float length, const float sign) { - stroke_points[0] = ref_point[0] + dir_cw[0] * lenght * sign; - stroke_points[1] = ref_point[1] + dir_cw[1] * lenght * sign; - stroke_points[2] = ref_point[0] + dir_ccw[0] * lenght * sign; - stroke_points[3] = ref_point[1] + dir_ccw[1] * lenght * sign; + stroke_points[0] = ref_point[0] + dir_cw[0] * length * sign; + stroke_points[1] = ref_point[1] + dir_cw[1] * length * sign; + stroke_points[2] = ref_point[0] + dir_ccw[0] * length * sign; + stroke_points[3] = ref_point[1] + dir_ccw[1] * length * sign; } static void annotation_stroke_arrow_calc_points(tGPspoint *point, @@ -459,7 +459,7 @@ static void annotation_stroke_arrow_calc_points(tGPspoint *point, float stroke_points[8], const int arrow_style) { - const int arrow_lenght = 8; + const int arrow_length = 8; float norm_dir[2]; copy_v2_v2(norm_dir, stroke_dir); normalize_v2(norm_dir); @@ -468,22 +468,22 @@ static void annotation_stroke_arrow_calc_points(tGPspoint *point, switch (arrow_style) { case GP_STROKE_ARROWSTYLE_OPEN: - mul_v2_fl(norm_dir, arrow_lenght); - stroke_points[0] = corner[0] + inv_norm_dir_clockwise[0] * arrow_lenght + norm_dir[0]; - stroke_points[1] = corner[1] + inv_norm_dir_clockwise[1] * arrow_lenght + norm_dir[1]; - stroke_points[2] = corner[0] + inv_norm_dir_counterclockwise[0] * arrow_lenght + norm_dir[0]; - stroke_points[3] = corner[1] + inv_norm_dir_counterclockwise[1] * arrow_lenght + norm_dir[1]; + mul_v2_fl(norm_dir, arrow_length); + stroke_points[0] = corner[0] + inv_norm_dir_clockwise[0] * arrow_length + norm_dir[0]; + stroke_points[1] = corner[1] + inv_norm_dir_clockwise[1] * arrow_length + norm_dir[1]; + stroke_points[2] = corner[0] + inv_norm_dir_counterclockwise[0] * arrow_length + norm_dir[0]; + stroke_points[3] = corner[1] + inv_norm_dir_counterclockwise[1] * arrow_length + norm_dir[1]; break; case GP_STROKE_ARROWSTYLE_SEGMENT: annotation_stroke_arrow_calc_points_segment(stroke_points, corner, inv_norm_dir_clockwise, inv_norm_dir_counterclockwise, - arrow_lenght, + arrow_length, 1.0f); break; case GP_STROKE_ARROWSTYLE_CLOSED: - mul_v2_fl(norm_dir, arrow_lenght); + mul_v2_fl(norm_dir, arrow_length); if (point != NULL) { add_v2_v2(&point->x, norm_dir); copy_v2_v2(corner, &point->x); @@ -492,13 +492,13 @@ static void annotation_stroke_arrow_calc_points(tGPspoint *point, corner, inv_norm_dir_clockwise, inv_norm_dir_counterclockwise, - arrow_lenght, + arrow_length, -1.0f); stroke_points[4] = corner[0] - norm_dir[0]; stroke_points[5] = corner[1] - norm_dir[1]; break; case GP_STROKE_ARROWSTYLE_SQUARE: - mul_v2_fl(norm_dir, arrow_lenght * 1.5f); + mul_v2_fl(norm_dir, arrow_length * 1.5f); if (point != NULL) { add_v2_v2(&point->x, norm_dir); copy_v2_v2(corner, &point->x); @@ -507,7 +507,7 @@ static void annotation_stroke_arrow_calc_points(tGPspoint *point, corner, inv_norm_dir_clockwise, inv_norm_dir_counterclockwise, - arrow_lenght * 0.75f, + arrow_length * 0.75f, -1.0f); stroke_points[4] = stroke_points[0] - norm_dir[0]; stroke_points[5] = stroke_points[1] - norm_dir[1]; diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c index 4e2951c3571..751f8333aaa 100644 --- a/source/blender/editors/gpencil/drawgpencil.c +++ b/source/blender/editors/gpencil/drawgpencil.c @@ -171,7 +171,8 @@ static void gpencil_draw_stroke_3d(tGPDdraw *tgpw, int totpoints = tgpw->gps->totpoints; const float viewport[2] = {(float)tgpw->winx, (float)tgpw->winy}; - float curpressure = points[0].pressure; + const float min_thickness = 0.05f; + float fpt[3]; /* if cyclic needs more vertex */ @@ -205,7 +206,6 @@ static void gpencil_draw_stroke_3d(tGPDdraw *tgpw, immUniform1i("fill_stroke", (int)tgpw->is_fill_stroke); /* draw stroke curve */ - GPU_line_width(max_ff(curpressure * thickness, 1.0f)); immBeginAtMost(GPU_PRIM_LINE_STRIP_ADJ, totpoints + cyclic_add + 2); const bGPDspoint *pt = points; @@ -215,18 +215,19 @@ static void gpencil_draw_stroke_3d(tGPDdraw *tgpw, gpencil_set_point_varying_color(points, ink, attr_id.color, (bool)tgpw->is_fill_stroke); if ((cyclic) && (totpoints > 2)) { - immAttr1f(attr_id.thickness, max_ff((points + totpoints - 1)->pressure * thickness, 1.0f)); + immAttr1f(attr_id.thickness, + max_ff((points + totpoints - 1)->pressure * thickness, min_thickness)); mul_v3_m4v3(fpt, tgpw->diff_mat, &(points + totpoints - 1)->x); } else { - immAttr1f(attr_id.thickness, max_ff((points + 1)->pressure * thickness, 1.0f)); + immAttr1f(attr_id.thickness, max_ff((points + 1)->pressure * thickness, min_thickness)); mul_v3_m4v3(fpt, tgpw->diff_mat, &(points + 1)->x); } immVertex3fv(attr_id.pos, fpt); } /* set point */ gpencil_set_point_varying_color(pt, ink, attr_id.color, (bool)tgpw->is_fill_stroke); - immAttr1f(attr_id.thickness, max_ff(pt->pressure * thickness, 1.0f)); + immAttr1f(attr_id.thickness, max_ff(pt->pressure * thickness, min_thickness)); mul_v3_m4v3(fpt, tgpw->diff_mat, &pt->x); immVertex3fv(attr_id.pos, fpt); } diff --git a/source/blender/editors/gpencil/gpencil_add_monkey.c b/source/blender/editors/gpencil/gpencil_add_monkey.c index 65141442237..d86bad7ef3c 100644 --- a/source/blender/editors/gpencil/gpencil_add_monkey.c +++ b/source/blender/editors/gpencil/gpencil_add_monkey.c @@ -29,16 +29,13 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "BKE_brush.h" #include "BKE_context.h" #include "BKE_gpencil.h" #include "BKE_gpencil_geom.h" -#include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_material.h" #include "DEG_depsgraph.h" -#include "DEG_depsgraph_query.h" #include "ED_gpencil.h" diff --git a/source/blender/editors/gpencil/gpencil_add_stroke.c b/source/blender/editors/gpencil/gpencil_add_stroke.c index 0c8cc621a3b..1e1a70f9c1d 100644 --- a/source/blender/editors/gpencil/gpencil_add_stroke.c +++ b/source/blender/editors/gpencil/gpencil_add_stroke.c @@ -29,16 +29,13 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "BKE_brush.h" #include "BKE_context.h" #include "BKE_gpencil.h" #include "BKE_gpencil_geom.h" -#include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_material.h" #include "DEG_depsgraph.h" -#include "DEG_depsgraph_query.h" #include "ED_gpencil.h" diff --git a/source/blender/editors/gpencil/gpencil_armature.c b/source/blender/editors/gpencil/gpencil_armature.c index 5cc5e7ecdcd..3271096c433 100644 --- a/source/blender/editors/gpencil/gpencil_armature.c +++ b/source/blender/editors/gpencil/gpencil_armature.c @@ -31,12 +31,9 @@ #include "MEM_guardedalloc.h" -#include "BLI_blenlib.h" #include "BLI_math.h" #include "BLI_utildefines.h" -#include "BLT_translation.h" - #include "DNA_armature_types.h" #include "DNA_gpencil_types.h" #include "DNA_meshdata_types.h" diff --git a/source/blender/editors/gpencil/gpencil_data.c b/source/blender/editors/gpencil/gpencil_data.c index e297a806895..c76c2e55d2b 100644 --- a/source/blender/editors/gpencil/gpencil_data.c +++ b/source/blender/editors/gpencil/gpencil_data.c @@ -466,9 +466,15 @@ static int gpencil_layer_copy_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - /* make copy of layer, and add it immediately after the existing layer */ + /* Make copy of layer, and add it immediately after or before the existing layer. */ new_layer = BKE_gpencil_layer_duplicate(gpl, true, dup_strokes); - BLI_insertlinkafter(&gpd->layers, gpl, new_layer); + if (dup_strokes) { + BLI_insertlinkafter(&gpd->layers, gpl, new_layer); + } + else { + /* For empty strokes is better add below. */ + BLI_insertlinkbefore(&gpd->layers, gpl, new_layer); + } /* ensure new layer has a unique name, and is now the active layer */ BLI_uniquename(&gpd->layers, @@ -1583,7 +1589,7 @@ static int gpencil_stroke_arrange_exec(bContext *C, wmOperator *op) continue; } } - /* some stroke is already at botom */ + /* Some stroke is already at bottom. */ if (ELEM(direction, GP_STROKE_MOVE_BOTTOM, GP_STROKE_MOVE_DOWN)) { if (gps == gpf->strokes.first) { gpf_lock = true; @@ -2016,7 +2022,7 @@ static void gpencil_brush_delete_mode_brushes(Main *bmain, } } - /* Before delete, unpinn any material of the brush. */ + /* Before delete, un-pin any material of the brush. */ if ((brush->gpencil_settings) && (brush->gpencil_settings->material != NULL)) { brush->gpencil_settings->material = NULL; brush->gpencil_settings->flag &= ~GP_BRUSH_MATERIAL_PINNED; @@ -3412,9 +3418,11 @@ static int gpencil_material_select_exec(bContext *C, wmOperator *op) if (!deselected) { gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps); } else { gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); } for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { if (!deselected) { diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c index b5269bbfacf..b03d2c6e795 100644 --- a/source/blender/editors/gpencil/gpencil_edit.c +++ b/source/blender/editors/gpencil/gpencil_edit.c @@ -214,7 +214,7 @@ static int gpencil_editmode_toggle_exec(bContext *C, wmOperator *op) if (gpc->flag & GP_CURVE_NEEDS_STROKE_UPDATE) { BKE_gpencil_stroke_editcurve_update(gpd, gpl, gps); /* Update the selection from the stroke to the curve. */ - BKE_gpencil_editcurve_stroke_sync_selection(gps, gps->editcurve); + BKE_gpencil_editcurve_stroke_sync_selection(gpd, gps, gps->editcurve); gps->flag |= GP_STROKE_NEEDS_CURVE_UPDATE; BKE_gpencil_stroke_geometry_update(gpd, gps); @@ -992,6 +992,7 @@ static int gpencil_duplicate_exec(bContext *C, wmOperator *op) pt->flag &= ~GP_SPOINT_SELECT; } gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); changed = true; } @@ -1111,7 +1112,7 @@ static void gpencil_add_move_points(bGPdata *gpd, bGPDframe *gpf, bGPDstroke *gp BKE_gpencil_stroke_geometry_update(gpd, gps); BKE_gpencil_stroke_geometry_update(gpd, gps_new); - /* deselect orinal point */ + /* Deselect original point. */ pt->flag &= ~GP_SPOINT_SELECT; } } @@ -1193,6 +1194,7 @@ static void gpencil_add_move_points(bGPdata *gpd, bGPDframe *gpf, bGPDstroke *gp /* if the stroke is not reused, deselect */ if (!do_stroke) { gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); } } @@ -1241,7 +1243,7 @@ static void gpencil_curve_extrude_points(bGPdata *gpd, } } - /* Edgcase for single curve point. */ + /* Edge-case for single curve point. */ if (gpc->tot_curve_points == 1) { last_select = false; } @@ -1331,7 +1333,7 @@ static int gpencil_extrude_exec(bContext *C, wmOperator *op) changed = true; } - /* if not multiedit, exit loop*/ + /* If not multi-edit, exit loop. */ if (!is_multiedit) { break; } @@ -1379,8 +1381,11 @@ void GPENCIL_OT_extrude(wmOperatorType *ot) * from several different layers into a single layer. * \{ */ -/* list of bGPDstroke instances */ -/* NOTE: is exposed within the editors/gpencil module so that other tools can use it too */ +/** + * list of #bGPDstroke instances + * + * \note is exposed within the editors/gpencil module so that other tools can use it too. + */ ListBase gpencil_strokes_copypastebuf = {NULL, NULL}; /* Hash for hanging on to all the colors used by strokes in the buffer @@ -1706,6 +1711,7 @@ static int gpencil_strokes_paste_exec(bContext *C, wmOperator *op) } gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); } CTX_DATA_END; @@ -2545,6 +2551,7 @@ static bool gpencil_dissolve_selected_stroke_points(bContext *C, /* deselect the stroke, since none of its selected points will still be selected */ gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { pt->flag &= ~GP_SPOINT_SELECT; } @@ -2617,6 +2624,7 @@ static int gpencil_delete_selected_points(bContext *C) if (gps->flag & GP_STROKE_SELECT) { /* deselect old stroke, since it will be used as template for the new strokes */ gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); if (is_curve_edit) { bGPDcurve *gpc = gps->editcurve; @@ -3787,7 +3795,7 @@ static int gpencil_strokes_reproject_exec(bContext *C, wmOperator *op) if (is_curve_edit && gps->editcurve != NULL) { BKE_gpencil_stroke_editcurve_update(gpd, gpl, gps); /* Update the selection from the stroke to the curve. */ - BKE_gpencil_editcurve_stroke_sync_selection(gps, gps->editcurve); + BKE_gpencil_editcurve_stroke_sync_selection(gpd, gps, gps->editcurve); gps->flag |= GP_STROKE_NEEDS_CURVE_UPDATE; BKE_gpencil_stroke_geometry_update(gpd, gps); @@ -4571,6 +4579,7 @@ static int gpencil_stroke_separate_exec(bContext *C, wmOperator *op) else if (mode == GP_SEPARATE_STROKE) { /* deselect old stroke */ gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); /* unlink from source frame */ BLI_remlink(&gpf->strokes, gps); gps->prev = gps->next = NULL; @@ -4948,11 +4957,14 @@ static int gpencil_cutter_lasso_select(bContext *C, GPencilTestFn is_inside_fn, void *user_data) { + Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); + Object *obact = CTX_data_active_object(C); bGPdata *gpd = ED_gpencil_data_get_active(C); ScrArea *area = CTX_wm_area(C); ToolSettings *ts = CTX_data_tool_settings(C); const float scale = ts->gp_sculpt.isect_threshold; const bool flat_caps = RNA_boolean_get(op->ptr, "flat_caps"); + const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd); bGPDspoint *pt; GP_SpaceConversion gsc = {NULL}; @@ -4976,60 +4988,92 @@ static int gpencil_cutter_lasso_select(bContext *C, } gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); } CTX_DATA_END; - /* select points */ - GP_EDITABLE_STROKES_BEGIN (gpstroke_iter, C, gpl, gps) { - int tot_inside = 0; - const int oldtot = gps->totpoints; - for (int i = 0; i < gps->totpoints; i++) { - pt = &gps->points[i]; - if ((pt->flag & GP_SPOINT_SELECT) || (pt->flag & GP_SPOINT_TAG)) { - continue; - } - /* convert point coords to screen-space */ - const bool is_inside = is_inside_fn(gps, pt, &gsc, gpstroke_iter.diff_mat, user_data); - if (is_inside) { - tot_inside++; - changed = true; - pt->flag |= GP_SPOINT_SELECT; - gps->flag |= GP_STROKE_SELECT; - float r_hita[3], r_hitb[3]; - if (gps->totpoints > 1) { - ED_gpencil_select_stroke_segment(gpd, gpl, gps, pt, true, true, scale, r_hita, r_hitb); + /* Select points */ + LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { + if ((gpl->flag & GP_LAYER_LOCKED) || ((gpl->flag & GP_LAYER_HIDE))) { + continue; + } + + float diff_mat[4][4]; + BKE_gpencil_layer_transform_matrix_get(depsgraph, obact, gpl, diff_mat); + + bGPDframe *init_gpf = (is_multiedit) ? gpl->frames.first : gpl->actframe; + for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) { + if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) { + if (gpf == NULL) { + continue; } - /* avoid infinite loops */ - if (gps->totpoints > oldtot) { + + LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) { + if (ED_gpencil_stroke_can_use(C, gps) == false) { + continue; + } /* check if the color is editable */ + if (ED_gpencil_stroke_material_editable(obact, gpl, gps) == false) { + continue; + } + int tot_inside = 0; + const int oldtot = gps->totpoints; + for (int i = 0; i < gps->totpoints; i++) { + pt = &gps->points[i]; + if ((pt->flag & GP_SPOINT_SELECT) || (pt->flag & GP_SPOINT_TAG)) { + continue; + } + /* convert point coords to screen-space */ + const bool is_inside = is_inside_fn(gps, pt, &gsc, diff_mat, user_data); + if (is_inside) { + tot_inside++; + changed = true; + pt->flag |= GP_SPOINT_SELECT; + gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps); + float r_hita[3], r_hitb[3]; + if (gps->totpoints > 1) { + ED_gpencil_select_stroke_segment( + gpd, gpl, gps, pt, true, true, scale, r_hita, r_hitb); + } + /* avoid infinite loops */ + if (gps->totpoints > oldtot) { + break; + } + } + } + /* if mark all points inside lasso set to remove all stroke */ + if ((tot_inside == oldtot) || ((tot_inside == 1) && (oldtot == 2))) { + for (int i = 0; i < gps->totpoints; i++) { + pt = &gps->points[i]; + pt->flag |= GP_SPOINT_SELECT; + } + } + } + /* if not multiedit, exit loop. */ + if (!is_multiedit) { break; } } } - /* if mark all points inside lasso set to remove all stroke */ - if ((tot_inside == oldtot) || ((tot_inside == 1) && (oldtot == 2))) { - for (int i = 0; i < gps->totpoints; i++) { - pt = &gps->points[i]; - pt->flag |= GP_SPOINT_SELECT; - } - } } - GP_EDITABLE_STROKES_END(gpstroke_iter); - /* dissolve selected points */ + /* Dissolve selected points. */ LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { - if (gpl->flag & GP_LAYER_LOCKED) { - continue; - } - - bGPDframe *gpf = gpl->actframe; - if (gpf == NULL) { - continue; - } - LISTBASE_FOREACH_MUTABLE (bGPDstroke *, gps, &gpf->strokes) { - if (gps->flag & GP_STROKE_SELECT) { - gpencil_cutter_dissolve(gpd, gpl, gps, flat_caps); + bGPDframe *init_gpf = (is_multiedit) ? gpl->frames.first : gpl->actframe; + bGPDframe *gpf_act = gpl->actframe; + for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) { + gpl->actframe = gpf; + LISTBASE_FOREACH_MUTABLE (bGPDstroke *, gps, &gpf->strokes) { + if (gps->flag & GP_STROKE_SELECT) { + gpencil_cutter_dissolve(gpd, gpl, gps, flat_caps); + } + } + /* if not multiedit, exit loop. */ + if (!is_multiedit) { + break; } } + gpl->actframe = gpf_act; } /* updates */ diff --git a/source/blender/editors/gpencil/gpencil_edit_curve.c b/source/blender/editors/gpencil/gpencil_edit_curve.c index 60d1d2169b4..0f9a8c93df9 100644 --- a/source/blender/editors/gpencil/gpencil_edit_curve.c +++ b/source/blender/editors/gpencil/gpencil_edit_curve.c @@ -28,13 +28,10 @@ #include #include -#include "MEM_guardedalloc.h" - #include "DNA_gpencil_types.h" #include "DNA_view3d_types.h" #include "BKE_context.h" -#include "BKE_curve.h" #include "BKE_gpencil.h" #include "BKE_gpencil_curve.h" #include "BKE_gpencil_geom.h" @@ -91,7 +88,7 @@ static int gpencil_stroke_enter_editcurve_mode_exec(bContext *C, wmOperator *op) (gps->editcurve != NULL && gps->editcurve->flag & GP_CURVE_NEEDS_STROKE_UPDATE)) { BKE_gpencil_stroke_editcurve_update(gpd, gpl, gps); /* Update the selection from the stroke to the curve. */ - BKE_gpencil_editcurve_stroke_sync_selection(gps, gps->editcurve); + BKE_gpencil_editcurve_stroke_sync_selection(gpd, gps, gps->editcurve); gps->flag |= GP_STROKE_NEEDS_CURVE_UPDATE; BKE_gpencil_stroke_geometry_update(gpd, gps); } diff --git a/source/blender/editors/gpencil/gpencil_fill.c b/source/blender/editors/gpencil/gpencil_fill.c index e3e73d5deb5..406daf9f92e 100644 --- a/source/blender/editors/gpencil/gpencil_fill.c +++ b/source/blender/editors/gpencil/gpencil_fill.c @@ -26,6 +26,7 @@ #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" +#include "BLI_ghash.h" #include "BLI_math.h" #include "BLI_stack.h" #include "BLI_utildefines.h" @@ -83,7 +84,16 @@ #define LEAK_VERT 1 #define MIN_WINDOW_SIZE 128 -/* Temporary fill operation data (op->customdata) */ +/* Set to 1 to debug filling internal image. By default, the value must be 0. */ +#define FILL_DEBUG 0 + +/* Duplicated: etempFlags */ +enum { + GP_DRAWFILLS_NOSTATUS = (1 << 0), /* don't draw status info */ + GP_DRAWFILLS_ONLY3D = (1 << 1), /* only draw 3d-strokes */ +}; + +/* Temporary fill operation data `op->customdata`. */ typedef struct tGPDfill { bContext *C; struct Main *bmain; @@ -102,7 +112,7 @@ typedef struct tGPDfill { struct View3D *v3d; /** region where painting originated */ struct ARegion *region; - /** current GP datablock */ + /** Current GP data-block. */ struct bGPdata *gpd; /** current material */ struct Material *mat; @@ -112,16 +122,22 @@ typedef struct tGPDfill { struct bGPDlayer *gpl; /** frame */ struct bGPDframe *gpf; - + /** Temp mouse position stroke. */ + struct bGPDstroke *gps_mouse; + /** Pointer to report messages. */ + struct ReportList *reports; /** flags */ short flag; /** avoid too fast events */ short oldkey; /** send to back stroke */ bool on_back; - + /** Flag for render mode */ + bool is_render; + /** Flag to check something was done. */ + bool done; /** mouse fill center position */ - int center[2]; + int mouse[2]; /** windows width */ int sizex; /** window height */ @@ -157,14 +173,184 @@ typedef struct tGPDfill { /** handle for drawing strokes while operator is running 3d stuff */ void *draw_handle_3d; - /* tmp size x */ + /* Temporary size x. */ int bwinx; - /* tmp size y */ + /* Temporary size y. */ int bwiny; rcti brect; + /* Space Conversion Data */ + GP_SpaceConversion gsc; + + /** Zoom factor. */ + float zoom; + + /** Factor of extension. */ + float fill_extend_fac; + } tGPDfill; +bool skip_layer_check(short fill_layer_mode, int gpl_active_index, int gpl_index); +static void gpencil_draw_boundary_lines(const struct bContext *UNUSED(C), struct tGPDfill *tgpf); + +/* Delete any temporary stroke. */ +static void gpencil_delete_temp_stroke_extension(tGPDfill *tgpf, const bool all_frames) +{ + LISTBASE_FOREACH (bGPDlayer *, gpl, &tgpf->gpd->layers) { + if (gpl->flag & GP_LAYER_HIDE) { + continue; + } + + bGPDframe *init_gpf = (all_frames) ? gpl->frames.first : + BKE_gpencil_layer_frame_get( + gpl, tgpf->active_cfra, GP_GETFRAME_USE_PREV); + if (init_gpf == NULL) { + continue; + } + for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) { + LISTBASE_FOREACH_MUTABLE (bGPDstroke *, gps, &gpf->strokes) { + /* free stroke */ + if ((gps->flag & GP_STROKE_NOFILL) && (gps->flag & GP_STROKE_TAG)) { + BLI_remlink(&gpf->strokes, gps); + BKE_gpencil_free_stroke(gps); + } + } + if (!all_frames) { + break; + } + } + } +} + +static void extrapolate_points_by_length(bGPDspoint *a, + bGPDspoint *b, + float length, + float r_point[3]) +{ + float ab[3]; + sub_v3_v3v3(ab, &b->x, &a->x); + normalize_v3(ab); + mul_v3_fl(ab, length); + add_v3_v3v3(r_point, &b->x, ab); +} + +/* Loop all layers create stroke extensions. */ +static void gpencil_create_extensions(tGPDfill *tgpf) +{ + Object *ob = tgpf->ob; + bGPdata *gpd = tgpf->gpd; + Brush *brush = tgpf->brush; + BrushGpencilSettings *brush_settings = brush->gpencil_settings; + + bGPDlayer *gpl_active = BKE_gpencil_layer_active_get(gpd); + BLI_assert(gpl_active != NULL); + + const int gpl_active_index = BLI_findindex(&gpd->layers, gpl_active); + BLI_assert(gpl_active_index >= 0); + + LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { + if (gpl->flag & GP_LAYER_HIDE) { + continue; + } + + /* Decide if the strokes of layers are included or not depending on the layer mode. */ + const int gpl_index = BLI_findindex(&gpd->layers, gpl); + bool skip = skip_layer_check(brush_settings->fill_layer_mode, gpl_active_index, gpl_index); + if (skip) { + continue; + } + + bGPDframe *gpf = BKE_gpencil_layer_frame_get(gpl, tgpf->active_cfra, GP_GETFRAME_USE_PREV); + if (gpf == NULL) { + continue; + } + + LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) { + /* Check if stroke can be drawn. */ + if ((gps->points == NULL) || (gps->totpoints < 2)) { + continue; + } + if (gps->flag & (GP_STROKE_NOFILL | GP_STROKE_TAG)) { + continue; + } + /* Check if the color is visible. */ + MaterialGPencilStyle *gp_style = BKE_gpencil_material_settings(ob, gps->mat_nr + 1); + if ((gp_style == NULL) || (gp_style->flag & GP_MATERIAL_HIDE)) { + continue; + } + + /* Extend start. */ + bGPDspoint *pt0 = &gps->points[1]; + bGPDspoint *pt1 = &gps->points[0]; + bGPDstroke *gps_new = BKE_gpencil_stroke_new(gps->mat_nr, 2, gps->thickness); + gps_new->flag |= GP_STROKE_NOFILL | GP_STROKE_TAG; + BLI_addtail(&gpf->strokes, gps_new); + + bGPDspoint *pt = &gps_new->points[0]; + copy_v3_v3(&pt->x, &pt1->x); + pt->strength = 1.0f; + pt->pressure = 1.0f; + + pt = &gps_new->points[1]; + pt->strength = 1.0f; + pt->pressure = 1.0f; + extrapolate_points_by_length(pt0, pt1, tgpf->fill_extend_fac * 0.1f, &pt->x); + + /* Extend end. */ + pt0 = &gps->points[gps->totpoints - 2]; + pt1 = &gps->points[gps->totpoints - 1]; + gps_new = BKE_gpencil_stroke_new(gps->mat_nr, 2, gps->thickness); + gps_new->flag |= GP_STROKE_NOFILL | GP_STROKE_TAG; + BLI_addtail(&gpf->strokes, gps_new); + + pt = &gps_new->points[0]; + copy_v3_v3(&pt->x, &pt1->x); + pt->strength = 1.0f; + pt->pressure = 1.0f; + + pt = &gps_new->points[1]; + pt->strength = 1.0f; + pt->pressure = 1.0f; + extrapolate_points_by_length(pt0, pt1, tgpf->fill_extend_fac * 0.1f, &pt->x); + } + } +} + +static void gpencil_update_extend(tGPDfill *tgpf) +{ + gpencil_delete_temp_stroke_extension(tgpf, false); + + if (tgpf->fill_extend_fac > 0.0f) { + gpencil_create_extensions(tgpf); + } + WM_event_add_notifier(tgpf->C, NC_GPENCIL | NA_EDITED, NULL); +} + +static bool gpencil_stroke_is_drawable(tGPDfill *tgpf, bGPDstroke *gps) +{ + if (tgpf->is_render) { + return true; + } + + const bool show_help = (tgpf->flag & GP_BRUSH_FILL_SHOW_HELPLINES) != 0; + const bool show_extend = (tgpf->flag & GP_BRUSH_FILL_SHOW_EXTENDLINES) != 0; + const bool is_extend = (gps->flag & GP_STROKE_NOFILL) && (gps->flag & GP_STROKE_TAG); + + if ((!show_help) && (show_extend)) { + if (!is_extend) { + return false; + } + } + + if ((show_help) && (!show_extend)) { + if (is_extend) { + return false; + } + } + + return true; +} + /* draw a given stroke using same thickness and color for all points */ static void gpencil_draw_basic_stroke(tGPDfill *tgpf, bGPDstroke *gps, @@ -172,7 +358,8 @@ static void gpencil_draw_basic_stroke(tGPDfill *tgpf, const bool cyclic, const float ink[4], const int flag, - const float thershold) + const float thershold, + const float thickness) { bGPDspoint *points = gps->points; @@ -182,9 +369,19 @@ static void gpencil_draw_basic_stroke(tGPDfill *tgpf, int totpoints = gps->totpoints; float fpt[3]; float col[4]; + const float extend_col[4] = {0.0f, 1.0f, 1.0f, 1.0f}; + const bool is_extend = (gps->flag & GP_STROKE_NOFILL) && (gps->flag & GP_STROKE_TAG); - copy_v4_v4(col, ink); + if (!gpencil_stroke_is_drawable(tgpf, gps)) { + return; + } + if ((is_extend) && (!tgpf->is_render)) { + copy_v4_v4(col, extend_col); + } + else { + copy_v4_v4(col, ink); + } /* if cyclic needs more vertex */ int cyclic_add = (cyclic) ? 1 : 0; @@ -195,7 +392,7 @@ static void gpencil_draw_basic_stroke(tGPDfill *tgpf, immBindBuiltinProgram(GPU_SHADER_3D_FLAT_COLOR); /* draw stroke curve */ - GPU_line_width(1.0f); + GPU_line_width((!is_extend) ? thickness : thickness * 2.0f); immBeginAtMost(GPU_PRIM_LINE_STRIP, totpoints + cyclic_add); const bGPDspoint *pt = points; @@ -226,15 +423,77 @@ static void gpencil_draw_basic_stroke(tGPDfill *tgpf, immUnbindProgram(); } -/* loop all layers */ +static void draw_mouse_position(tGPDfill *tgpf) +{ + if (tgpf->gps_mouse == NULL) { + return; + } + uchar mouse_color[4] = {0, 0, 255, 255}; + + bGPDspoint *pt = &tgpf->gps_mouse->points[0]; + float point_size = (tgpf->zoom == 1.0f) ? 4.0f * tgpf->fill_factor : + (0.5f * tgpf->zoom) + tgpf->fill_factor; + GPUVertFormat *format = immVertexFormat(); + uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); + uint col = GPU_vertformat_attr_add(format, "color", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT); + + /* Draw mouse click position in Blue. */ + immBindBuiltinProgram(GPU_SHADER_3D_POINT_FIXED_SIZE_VARYING_COLOR); + GPU_point_size(point_size); + immBegin(GPU_PRIM_POINTS, 1); + immAttr4ubv(col, mouse_color); + immVertex3fv(pos, &pt->x); + immEnd(); + immUnbindProgram(); +} + +/* Helper: Check if must skip the layer */ +bool skip_layer_check(short fill_layer_mode, int gpl_active_index, int gpl_index) +{ + bool skip = false; + + switch (fill_layer_mode) { + case GP_FILL_GPLMODE_ACTIVE: { + if (gpl_index != gpl_active_index) { + skip = true; + } + break; + } + case GP_FILL_GPLMODE_ABOVE: { + if (gpl_index != gpl_active_index + 1) { + skip = true; + } + break; + } + case GP_FILL_GPLMODE_BELOW: { + if (gpl_index != gpl_active_index - 1) { + skip = true; + } + break; + } + case GP_FILL_GPLMODE_ALL_ABOVE: { + if (gpl_index <= gpl_active_index) { + skip = true; + } + break; + } + case GP_FILL_GPLMODE_ALL_BELOW: { + if (gpl_index >= gpl_active_index) { + skip = true; + } + break; + } + case GP_FILL_GPLMODE_VISIBLE: + default: + break; + } + + return skip; +} + +/* Loop all layers to draw strokes. */ static void gpencil_draw_datablock(tGPDfill *tgpf, const float ink[4]) { - /* duplicated: etempFlags */ - enum { - GP_DRAWFILLS_NOSTATUS = (1 << 0), /* don't draw status info */ - GP_DRAWFILLS_ONLY3D = (1 << 1), /* only draw 3d-strokes */ - }; - Object *ob = tgpf->ob; bGPdata *gpd = tgpf->gpd; Brush *brush = tgpf->brush; @@ -248,8 +507,8 @@ static void gpencil_draw_datablock(tGPDfill *tgpf, const float ink[4]) tgpw.gpd = gpd; tgpw.offsx = 0; tgpw.offsy = 0; - tgpw.winx = tgpf->region->winx; - tgpw.winy = tgpf->region->winy; + tgpw.winx = tgpf->sizex; + tgpw.winy = tgpf->sizey; tgpw.dflag = 0; tgpw.disable_fill = 1; tgpw.dflag |= (GP_DRAWFILLS_ONLY3D | GP_DRAWFILLS_NOSTATUS); @@ -262,6 +521,9 @@ static void gpencil_draw_datablock(tGPDfill *tgpf, const float ink[4]) const int gpl_active_index = BLI_findindex(&gpd->layers, gpl_active); BLI_assert(gpl_active_index >= 0); + /* Draw blue point where click with mouse. */ + draw_mouse_position(tgpf); + LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { /* do not draw layer if hidden */ if (gpl->flag & GP_LAYER_HIDE) { @@ -273,43 +535,8 @@ static void gpencil_draw_datablock(tGPDfill *tgpf, const float ink[4]) /* Decide if the strokes of layers are included or not depending on the layer mode. * Cannot skip the layer because it can use boundary strokes and must be used. */ - bool skip = false; const int gpl_index = BLI_findindex(&gpd->layers, gpl); - switch (brush_settings->fill_layer_mode) { - case GP_FILL_GPLMODE_ACTIVE: { - if (gpl_index != gpl_active_index) { - skip = true; - } - break; - } - case GP_FILL_GPLMODE_ABOVE: { - if (gpl_index != gpl_active_index + 1) { - skip = true; - } - break; - } - case GP_FILL_GPLMODE_BELOW: { - if (gpl_index != gpl_active_index - 1) { - skip = true; - } - break; - } - case GP_FILL_GPLMODE_ALL_ABOVE: { - if (gpl_index <= gpl_active_index) { - skip = true; - } - break; - } - case GP_FILL_GPLMODE_ALL_BELOW: { - if (gpl_index >= gpl_active_index) { - skip = true; - } - break; - } - case GP_FILL_GPLMODE_VISIBLE: - default: - break; - } + bool skip = skip_layer_check(brush_settings->fill_layer_mode, gpl_active_index, gpl_index); /* if active layer and no keyframe, create a new one */ if (gpl == tgpf->gpl) { @@ -352,17 +579,19 @@ static void gpencil_draw_datablock(tGPDfill *tgpf, const float ink[4]) tgpw.gpf = gpf; tgpw.t_gpf = gpf; - /* reduce thickness to avoid gaps */ tgpw.is_fill_stroke = (tgpf->fill_draw_mode == GP_FILL_DMODE_CONTROL) ? false : true; + /* Reduce thickness to avoid gaps. */ tgpw.lthick = gpl->line_change; tgpw.opacity = 1.0; copy_v4_v4(tgpw.tintcolor, ink); tgpw.onion = true; tgpw.custonion = true; - /* normal strokes */ + /* Normal strokes. */ if (ELEM(tgpf->fill_draw_mode, GP_FILL_DMODE_STROKE, GP_FILL_DMODE_BOTH)) { - ED_gpencil_draw_fill(&tgpw); + if (gpencil_stroke_is_drawable(tgpf, gps) && ((gps->flag & GP_STROKE_TAG) == 0)) { + ED_gpencil_draw_fill(&tgpw); + } } /* 3D Lines with basic shapes and invisible lines */ @@ -373,7 +602,8 @@ static void gpencil_draw_datablock(tGPDfill *tgpf, const float ink[4]) gps->flag & GP_STROKE_CYCLIC, ink, tgpf->flag, - tgpf->fill_threshold); + tgpf->fill_threshold, + 1.0f); } } } @@ -381,7 +611,7 @@ static void gpencil_draw_datablock(tGPDfill *tgpf, const float ink[4]) GPU_blend(GPU_BLEND_NONE); } -/* draw strokes in offscreen buffer */ +/* Draw strokes in off-screen buffer. */ static bool gpencil_render_offscreen(tGPDfill *tgpf) { bool is_ortho = false; @@ -408,12 +638,6 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf) tgpf->sizex = (int)tgpf->region->winx; tgpf->sizey = (int)tgpf->region->winy; - /* adjust center */ - float center[2]; - center[0] = (float)tgpf->center[0] * ((float)tgpf->region->winx / (float)tgpf->bwinx); - center[1] = (float)tgpf->center[1] * ((float)tgpf->region->winy / (float)tgpf->bwiny); - round_v2i_v2fl(tgpf->center, center); - char err_out[256] = "unknown"; GPUOffScreen *offscreen = GPU_offscreen_create(tgpf->sizex, tgpf->sizey, true, false, err_out); if (offscreen == NULL) { @@ -422,7 +646,7 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf) } GPU_offscreen_bind(offscreen, true); - uint flag = IB_rect | IB_rectfloat; + uint flag = IB_rectfloat; ImBuf *ibuf = IMB_allocImBuf(tgpf->sizex, tgpf->sizey, 32, flag); rctf viewplane; @@ -437,6 +661,21 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf) &clip_start, &clip_end, NULL); + + /* Rescale `viewplane` to fit all strokes. */ + float width = viewplane.xmax - viewplane.xmin; + float height = viewplane.ymax - viewplane.ymin; + + float width_new = width * tgpf->zoom; + float height_new = height * tgpf->zoom; + float scale_x = (width_new - width) / 2.0f; + float scale_y = (height_new - height) / 2.0f; + + viewplane.xmin -= scale_x; + viewplane.xmax += scale_x; + viewplane.ymin -= scale_y; + viewplane.ymax += scale_y; + if (is_ortho) { orthographic_m4(winmat, viewplane.xmin, @@ -485,7 +724,7 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf) GPU_offscreen_read_pixels(offscreen, GPU_DATA_FLOAT, ibuf->rect_float); } else if (ibuf->rect) { - GPU_offscreen_read_pixels(offscreen, GPU_DATA_UNSIGNED_BYTE, ibuf->rect); + GPU_offscreen_read_pixels(offscreen, GPU_DATA_UBYTE, ibuf->rect); } if (ibuf->rect_float && ibuf->rect) { IMB_rect_from_float(ibuf); @@ -496,45 +735,33 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf) BKE_image_release_ibuf(tgpf->ima, ibuf, NULL); - /* switch back to window-system-provided framebuffer */ + /* Switch back to window-system-provided frame-buffer. */ GPU_offscreen_unbind(offscreen, true); GPU_offscreen_free(offscreen); return true; } -/* return pixel data (rgba) at index */ +/* Return pixel data (RGBA) at index. */ static void get_pixel(const ImBuf *ibuf, const int idx, float r_col[4]) { - if (ibuf->rect_float) { - const float *frgba = &ibuf->rect_float[idx * 4]; - copy_v4_v4(r_col, frgba); - } - else { - /* XXX: This case probably doesn't happen, as we only write to the float buffer, - * but we get compiler warnings about uninitialized vars otherwise - */ - BLI_assert(!"gpencil_fill.c - get_pixel() non-float case is used!"); - zero_v4(r_col); - } + BLI_assert(ibuf->rect_float != NULL); + memcpy(r_col, &ibuf->rect_float[idx * 4], sizeof(float[4])); } -/* set pixel data (rgba) at index */ +/* Set pixel data (RGBA) at index. */ static void set_pixel(ImBuf *ibuf, int idx, const float col[4]) { - // BLI_assert(idx <= ibuf->x * ibuf->y); - if (ibuf->rect) { - uint *rrect = &ibuf->rect[idx]; - uchar ccol[4]; + BLI_assert(ibuf->rect_float != NULL); + float *rrectf = &ibuf->rect_float[idx * 4]; + copy_v4_v4(rrectf, col); +} - rgba_float_to_uchar(ccol, col); - *rrect = *((uint *)ccol); - } - - if (ibuf->rect_float) { - float *rrectf = &ibuf->rect_float[idx * 4]; - copy_v4_v4(rrectf, col); - } +/* Helper: Check if one image row is empty. */ +static bool is_row_filled(const ImBuf *ibuf, const int row_index) +{ + float *row = &ibuf->rect_float[ibuf->x * 4 * row_index]; + return (row[0] == 0.0f && memcmp(row, row + 1, ((ibuf->x * 4) - 1) * sizeof(float)) != 0); } /** @@ -542,6 +769,9 @@ static void set_pixel(ImBuf *ibuf, int idx, const float col[4]) * this is used for strokes with small gaps between them to get a full fill * and do not get a full screen fill. * + * This function assumes that if the furthest pixel is occupied, + * the other pixels are occupied. + * * \param ibuf: Image pixel data. * \param maxpixel: Maximum index. * \param limit: Limit of pixels to analyze. @@ -551,10 +781,10 @@ static void set_pixel(ImBuf *ibuf, int idx, const float col[4]) static bool is_leak_narrow(ImBuf *ibuf, const int maxpixel, int limit, int index, int type) { float rgba[4]; - int i; int pt; bool t_a = false; bool t_b = false; + const int extreme = limit - 1; /* Horizontal leak (check vertical pixels) * X @@ -565,37 +795,29 @@ static bool is_leak_narrow(ImBuf *ibuf, const int maxpixel, int limit, int index */ if (type == LEAK_HORZ) { /* pixels on top */ - for (i = 1; i <= limit; i++) { - pt = index + (ibuf->x * i); - if (pt <= maxpixel) { - get_pixel(ibuf, pt, rgba); - if (rgba[0] == 1.0f) { - t_a = true; - break; - } - } - else { - /* edge of image*/ + pt = index + (ibuf->x * extreme); + if (pt <= maxpixel) { + get_pixel(ibuf, pt, rgba); + if (rgba[0] == 1.0f) { t_a = true; - break; } } + else { + /* edge of image*/ + t_a = true; + } /* pixels on bottom */ - for (i = 1; i <= limit; i++) { - pt = index - (ibuf->x * i); - if (pt >= 0) { - get_pixel(ibuf, pt, rgba); - if (rgba[0] == 1.0f) { - t_b = true; - break; - } - } - else { - /* edge of image*/ + pt = index - (ibuf->x * extreme); + if (pt >= 0) { + get_pixel(ibuf, pt, rgba); + if (rgba[0] == 1.0f) { t_b = true; - break; } } + else { + /* edge of image*/ + t_b = true; + } } /* Vertical leak (check horizontal pixels) @@ -609,35 +831,27 @@ static bool is_leak_narrow(ImBuf *ibuf, const int maxpixel, int limit, int index int higpix = lowpix + ibuf->x - 1; /* pixels to right */ - for (i = 0; i < limit; i++) { - pt = index - (limit - i); - if (pt >= lowpix) { - get_pixel(ibuf, pt, rgba); - if (rgba[0] == 1.0f) { - t_a = true; - break; - } - } - else { - t_a = true; /* edge of image*/ - break; + pt = index - extreme; + if (pt >= lowpix) { + get_pixel(ibuf, pt, rgba); + if (rgba[0] == 1.0f) { + t_a = true; } } + else { + t_a = true; /* edge of image*/ + } /* pixels to left */ - for (i = 0; i < limit; i++) { - pt = index + (limit - i); - if (pt <= higpix) { - get_pixel(ibuf, pt, rgba); - if (rgba[0] == 1.0f) { - t_b = true; - break; - } - } - else { - t_b = true; /* edge of image */ - break; + pt = index + extreme; + if (pt <= higpix) { + get_pixel(ibuf, pt, rgba); + if (rgba[0] == 1.0f) { + t_b = true; } } + else { + t_b = true; /* edge of image */ + } } return (bool)(t_a && t_b); } @@ -649,7 +863,7 @@ static bool is_leak_narrow(ImBuf *ibuf, const int maxpixel, int limit, int index * * \param tgpf: Temporary fill data. */ -static void gpencil_boundaryfill_area(tGPDfill *tgpf) +static bool gpencil_boundaryfill_area(tGPDfill *tgpf) { ImBuf *ibuf; float rgba[4]; @@ -657,26 +871,41 @@ static void gpencil_boundaryfill_area(tGPDfill *tgpf) const float fill_col[4] = {0.0f, 1.0f, 0.0f, 1.0f}; ibuf = BKE_image_acquire_ibuf(tgpf->ima, NULL, &lock); const int maxpixel = (ibuf->x * ibuf->y) - 1; + bool border_contact = false; BLI_Stack *stack = BLI_stack_new(sizeof(int), __func__); - /* calculate index of the seed point using the position of the mouse */ - int index = (tgpf->sizex * tgpf->center[1]) + tgpf->center[0]; - if ((index >= 0) && (index <= maxpixel)) { - BLI_stack_push(stack, &index); + /* Calculate index of the seed point using the position of the mouse looking + * for a blue pixel. */ + int index = -1; + for (int i = 0; i < maxpixel; i++) { + get_pixel(ibuf, i, rgba); + if (rgba[2] == 1.0f) { + index = i; + break; + } } - /* the fill use a stack to save the pixel list instead of the common recursive + if ((index >= 0) && (index <= maxpixel)) { + if (!FILL_DEBUG) { + BLI_stack_push(stack, &index); + } + } + + /** + * The fill use a stack to save the pixel list instead of the common recursive * 4-contact point method. * The problem with recursive calls is that for big fill areas, we can get max limit * of recursive calls and STACK_OVERFLOW error. * * The 4-contact point analyze the pixels to the left, right, bottom and top - * ----------- - * | X | - * | XoX | - * | X | - * ----------- + *
+   * -----------
+   * |    X    |
+   * |   XoX   |
+   * |    X    |
+   * -----------
+   * 
*/ while (!BLI_stack_is_empty(stack)) { int v; @@ -685,6 +914,11 @@ static void gpencil_boundaryfill_area(tGPDfill *tgpf) get_pixel(ibuf, v, rgba); + /* Determine if the flood contacts with external borders. */ + if (rgba[3] == 0.5f) { + border_contact = true; + } + /* check if no border(red) or already filled color(green) */ if ((rgba[0] != 1.0f) && (rgba[1] != 1.0f)) { /* fill current pixel with green */ @@ -728,6 +962,8 @@ static void gpencil_boundaryfill_area(tGPDfill *tgpf) tgpf->ima->id.tag |= LIB_TAG_DOIT; /* free temp stack data */ BLI_stack_free(stack); + + return border_contact; } /* Set a border to create image limits. */ @@ -735,7 +971,7 @@ static void gpencil_set_borders(tGPDfill *tgpf, const bool transparent) { ImBuf *ibuf; void *lock; - const float fill_col[2][4] = {{1.0f, 0.0f, 0.0f, 1.0f}, {0.0f, 0.0f, 0.0f, 0.0f}}; + const float fill_col[2][4] = {{1.0f, 0.0f, 0.0f, 0.5f}, {0.0f, 0.0f, 0.0f, 0.0f}}; ibuf = BKE_image_acquire_ibuf(tgpf->ima, NULL, &lock); int idx; int pixel = 0; @@ -764,7 +1000,7 @@ static void gpencil_set_borders(tGPDfill *tgpf, const bool transparent) tgpf->ima->id.tag |= LIB_TAG_DOIT; } -/* Invert image to paint invese area. */ +/* Invert image to paint inverse area. */ static void gpencil_invert_image(tGPDfill *tgpf) { ImBuf *ibuf; @@ -774,18 +1010,24 @@ static void gpencil_invert_image(tGPDfill *tgpf) ibuf = BKE_image_acquire_ibuf(tgpf->ima, NULL, &lock); const int maxpixel = (ibuf->x * ibuf->y) - 1; + const int center = ibuf->x / 2; for (int v = maxpixel; v != 0; v--) { float color[4]; get_pixel(ibuf, v, color); - /* Green. */ + /* Green->Red. */ if (color[1] == 1.0f) { set_pixel(ibuf, v, fill_col[0]); } + /* Red->Green */ else if (color[0] == 1.0f) { set_pixel(ibuf, v, fill_col[1]); + /* Add thickness of 2 pixels to avoid too thin lines. */ + int offset = (v % ibuf->x < center) ? 1 : -1; + set_pixel(ibuf, v + offset, fill_col[1]); } else { + /* Set to Transparent. */ set_pixel(ibuf, v, fill_col[2]); } } @@ -822,21 +1064,37 @@ static void gpencil_erase_processed_area(tGPDfill *tgpf) float rgba[4]; for (int idy = 0; idy < ibuf->y; idy++) { - bool clear = false; + int init = -1; + int end = -1; for (int idx = 0; idx < ibuf->x; idx++) { int image_idx = ibuf->x * idy + idx; get_pixel(ibuf, image_idx, rgba); /* Blue. */ if (rgba[2] == 1.0f) { - clear = true; + if (init < 0) { + init = image_idx; + } + else { + end = image_idx; + } } /* Red. */ else if (rgba[0] == 1.0f) { - clear = false; + if (init > -1) { + for (int i = init; i <= max_ii(init, end); i++) { + set_pixel(ibuf, i, clear_col); + } + init = -1; + end = -1; + } } - if (clear) { - set_pixel(ibuf, image_idx, clear_col); + } + /* Check last segment. */ + if (init > -1) { + for (int i = init; i <= max_ii(init, end); i++) { + set_pixel(ibuf, i, clear_col); } + set_pixel(ibuf, init, clear_col); } } @@ -846,98 +1104,112 @@ static void gpencil_erase_processed_area(tGPDfill *tgpf) tgpf->ima->id.tag |= LIB_TAG_DOIT; } -/* Naive dilate +/** + * Naive dilate * * Expand green areas into enclosing red areas. * Using stack prevents creep when replacing colors directly. + *
  * -----------
  *  XXXXXXX
  *  XoooooX
  *  XXooXXX
  *   XXXX
  * -----------
+ * 
*/ -static void dilate_shape(ImBuf *ibuf) +static bool dilate_shape(ImBuf *ibuf) { + bool done = false; + BLI_Stack *stack = BLI_stack_new(sizeof(int), __func__); const float green[4] = {0.0f, 1.0f, 0.0f, 1.0f}; - const int maxpixel = (ibuf->x * ibuf->y) - 1; + // const int maxpixel = (ibuf->x * ibuf->y) - 1; /* detect pixels and expand into red areas */ - for (int v = maxpixel; v != 0; v--) { - float color[4]; - int index; - int tp = 0; - int bm = 0; - int lt = 0; - int rt = 0; - get_pixel(ibuf, v, color); - if (color[1] == 1.0f) { - /* pixel left */ - if (v - 1 >= 0) { - index = v - 1; - get_pixel(ibuf, index, color); - if (color[0] == 1.0f) { - BLI_stack_push(stack, &index); - lt = index; + for (int row = 0; row < ibuf->y; row++) { + if (!is_row_filled(ibuf, row)) { + continue; + } + int maxpixel = (ibuf->x * (row + 1)) - 1; + int minpixel = ibuf->x * row; + + for (int v = maxpixel; v != minpixel; v--) { + float color[4]; + int index; + get_pixel(ibuf, v, color); + if (color[1] == 1.0f) { + int tp = 0; + int bm = 0; + int lt = 0; + int rt = 0; + + /* pixel left */ + if (v - 1 >= 0) { + index = v - 1; + get_pixel(ibuf, index, color); + if (color[0] == 1.0f) { + BLI_stack_push(stack, &index); + lt = index; + } } - } - /* pixel right */ - if (v + 1 <= maxpixel) { - index = v + 1; - get_pixel(ibuf, index, color); - if (color[0] == 1.0f) { - BLI_stack_push(stack, &index); - rt = index; + /* pixel right */ + if (v + 1 <= maxpixel) { + index = v + 1; + get_pixel(ibuf, index, color); + if (color[0] == 1.0f) { + BLI_stack_push(stack, &index); + rt = index; + } } - } - /* pixel top */ - if (v + ibuf->x <= maxpixel) { - index = v + ibuf->x; - get_pixel(ibuf, index, color); - if (color[0] == 1.0f) { - BLI_stack_push(stack, &index); - tp = index; + /* pixel top */ + if (v + (ibuf->x * 1) <= maxpixel) { + index = v + (ibuf->x * 1); + get_pixel(ibuf, index, color); + if (color[0] == 1.0f) { + BLI_stack_push(stack, &index); + tp = index; + } } - } - /* pixel bottom */ - if (v - ibuf->x >= 0) { - index = v - ibuf->x; - get_pixel(ibuf, index, color); - if (color[0] == 1.0f) { - BLI_stack_push(stack, &index); - bm = index; + /* pixel bottom */ + if (v - (ibuf->x * 1) >= 0) { + index = v - (ibuf->x * 1); + get_pixel(ibuf, index, color); + if (color[0] == 1.0f) { + BLI_stack_push(stack, &index); + bm = index; + } } - } - /* pixel top-left */ - if (tp && lt) { - index = tp - 1; - get_pixel(ibuf, index, color); - if (color[0] == 1.0f) { - BLI_stack_push(stack, &index); + /* pixel top-left */ + if (tp && lt) { + index = tp - 1; + get_pixel(ibuf, index, color); + if (color[0] == 1.0f) { + BLI_stack_push(stack, &index); + } } - } - /* pixel top-right */ - if (tp && rt) { - index = tp + 1; - get_pixel(ibuf, index, color); - if (color[0] == 1.0f) { - BLI_stack_push(stack, &index); + /* pixel top-right */ + if (tp && rt) { + index = tp + 1; + get_pixel(ibuf, index, color); + if (color[0] == 1.0f) { + BLI_stack_push(stack, &index); + } } - } - /* pixel bottom-left */ - if (bm && lt) { - index = bm - 1; - get_pixel(ibuf, index, color); - if (color[0] == 1.0f) { - BLI_stack_push(stack, &index); + /* pixel bottom-left */ + if (bm && lt) { + index = bm - 1; + get_pixel(ibuf, index, color); + if (color[0] == 1.0f) { + BLI_stack_push(stack, &index); + } } - } - /* pixel bottom-right */ - if (bm && rt) { - index = bm + 1; - get_pixel(ibuf, index, color); - if (color[0] == 1.0f) { - BLI_stack_push(stack, &index); + /* pixel bottom-right */ + if (bm && rt) { + index = bm + 1; + get_pixel(ibuf, index, color); + if (color[0] == 1.0f) { + BLI_stack_push(stack, &index); + } } } } @@ -947,8 +1219,11 @@ static void dilate_shape(ImBuf *ibuf) int v; BLI_stack_pop(stack, &v); set_pixel(ibuf, v, green); + done = true; } BLI_stack_free(stack); + + return done; } /* Get the outline points of a shape using Moore Neighborhood algorithm @@ -964,11 +1239,12 @@ static void gpencil_get_outline_points(tGPDfill *tgpf, const bool dilate) int v[2]; int boundary_co[2]; int start_co[2]; + int first_co[2] = {-1, -1}; int backtracked_co[2]; int current_check_co[2]; int prev_check_co[2]; int backtracked_offset[1][2] = {{0, 0}}; - // bool boundary_found = false; + bool first_pixel = false; bool start_found = false; const int NEIGHBOR_COUNT = 8; @@ -993,7 +1269,6 @@ static void gpencil_get_outline_points(tGPDfill *tgpf, const bool dilate) dilate_shape(ibuf); } - /* find the initial point to start outline analysis */ for (int idx = imagesize - 1; idx != 0; idx--) { get_pixel(ibuf, idx, rgba); if (rgba[1] == 1.0f) { @@ -1016,7 +1291,7 @@ static void gpencil_get_outline_points(tGPDfill *tgpf, const bool dilate) int cur_back_offset = -1; for (int i = 0; i < NEIGHBOR_COUNT; i++) { if (backtracked_offset[0][0] == offset[i][0] && backtracked_offset[0][1] == offset[i][1]) { - /* Finding the bracktracked pixel offset index */ + /* Finding the back-tracked pixel offset index */ cur_back_offset = i; break; } @@ -1046,19 +1321,24 @@ static void gpencil_get_outline_points(tGPDfill *tgpf, const bool dilate) cur_back_offset++; loop++; } - /* current pixel is equal to starting pixel */ - if (boundary_co[0] == start_co[0] && boundary_co[1] == start_co[1]) { + /* Current pixel is equal to starting or first pixel. */ + if ((boundary_co[0] == start_co[0] && boundary_co[1] == start_co[1]) || + (boundary_co[0] == first_co[0] && boundary_co[1] == first_co[1])) { BLI_stack_pop(tgpf->stack, &v); - // boundary_found = true; break; } + + if (!first_pixel) { + first_pixel = true; + copy_v2_v2_int(first_co, boundary_co); + } } /* release ibuf */ BKE_image_release_ibuf(tgpf->ima, ibuf, lock); } -/* get z-depth array to reproject on surface */ +/* Get z-depth array to reproject on surface. */ static void gpencil_get_depth_array(tGPDfill *tgpf) { tGPspoint *ptc; @@ -1109,7 +1389,7 @@ static void gpencil_get_depth_array(tGPDfill *tgpf) } if (found_depth == false) { - /* eeh... not much we can do.. :/, ignore depth in this case */ + /* Sigh! not much we can do here. Ignore depth in this case. */ for (i = totpoints - 1; i >= 0; i--) { tgpf->depth_arr[i] = 0.9999f; } @@ -1172,6 +1452,9 @@ static void gpencil_stroke_from_buffer(tGPDfill *tgpf) return; } + /* Set as done. */ + tgpf->done = true; + /* Get frame or create a new one. */ tgpf->gpf = BKE_gpencil_layer_frame_get(tgpf->gpl, tgpf->active_cfra, GP_GETFRAME_ADD_NEW); @@ -1286,7 +1569,7 @@ static void gpencil_stroke_from_buffer(tGPDfill *tgpf) } /* If camera view or view projection, reproject flat to view to avoid perspective effect. */ - if (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera) { + if ((!is_depth) && (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || (is_camera))) { ED_gpencil_project_stroke_to_view(tgpf->C, tgpf->gpl, gps); } @@ -1327,7 +1610,6 @@ static void gpencil_fill_draw_3d(const bContext *C, ARegion *UNUSED(region), voi if (region != tgpf->region) { return; } - gpencil_draw_boundary_lines(C, tgpf); } @@ -1355,7 +1637,7 @@ static bool gpencil_fill_poll(bContext *C) } /* Allocate memory and initialize values */ -static tGPDfill *gpencil_session_init_fill(bContext *C, wmOperator *UNUSED(op)) +static tGPDfill *gpencil_session_init_fill(bContext *C, wmOperator *op) { tGPDfill *tgpf = MEM_callocN(sizeof(tGPDfill), "GPencil Fill Data"); @@ -1377,6 +1659,11 @@ static tGPDfill *gpencil_session_init_fill(bContext *C, wmOperator *UNUSED(op)) tgpf->depsgraph = CTX_data_ensure_evaluated_depsgraph(C); tgpf->win = CTX_wm_window(C); tgpf->active_cfra = CFRA; + tgpf->reports = op->reports; + + /* Setup space conversions. */ + gpencil_point_conversion_init(C, &tgpf->gsc); + tgpf->zoom = 1.0f; /* set GP datablock */ tgpf->gpd = gpd; @@ -1388,6 +1675,7 @@ static tGPDfill *gpencil_session_init_fill(bContext *C, wmOperator *UNUSED(op)) tgpf->lock_axis = ts->gp_sculpt.lock_axis; tgpf->oldkey = -1; + tgpf->is_render = false; tgpf->sbuffer_used = 0; tgpf->sbuffer = NULL; tgpf->depth_arr = NULL; @@ -1399,8 +1687,9 @@ static tGPDfill *gpencil_session_init_fill(bContext *C, wmOperator *UNUSED(op)) tgpf->fill_threshold = brush->gpencil_settings->fill_threshold; tgpf->fill_simplylvl = brush->gpencil_settings->fill_simplylvl; tgpf->fill_draw_mode = brush->gpencil_settings->fill_draw_mode; + tgpf->fill_extend_fac = brush->gpencil_settings->fill_extend_fac; tgpf->fill_factor = max_ff(GPENCIL_MIN_FILL_FAC, - min_ff(brush->gpencil_settings->fill_factor, 8.0f)); + min_ff(brush->gpencil_settings->fill_factor, GPENCIL_MAX_FILL_FAC)); tgpf->fill_leak = (int)ceil((float)brush->gpencil_settings->fill_leak * tgpf->fill_factor); int totcol = tgpf->ob->totcol; @@ -1426,7 +1715,6 @@ static tGPDfill *gpencil_session_init_fill(bContext *C, wmOperator *UNUSED(op)) /* end operator */ static void gpencil_fill_exit(bContext *C, wmOperator *op) { - Main *bmain = CTX_data_main(C); Object *ob = CTX_data_active_object(C); /* clear undo stack */ @@ -1445,16 +1733,14 @@ static void gpencil_fill_exit(bContext *C, wmOperator *op) MEM_SAFE_FREE(tgpf->sbuffer); MEM_SAFE_FREE(tgpf->depth_arr); + /* Remove any temp stroke. */ + gpencil_delete_temp_stroke_extension(tgpf, true); + /* remove drawing handler */ if (tgpf->draw_handle_3d) { ED_region_draw_cb_exit(tgpf->region->type, tgpf->draw_handle_3d); } - /* Delete temp image. */ - if (tgpf->ima) { - BKE_id_free(bmain, tgpf->ima); - } - /* finally, free memory used by temp data */ MEM_freeN(tgpf); } @@ -1538,7 +1824,11 @@ static int gpencil_fill_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSE tgpf = op->customdata; /* Enable custom drawing handlers to show help lines */ - if (tgpf->flag & GP_BRUSH_FILL_SHOW_HELPLINES) { + const bool do_extend = (tgpf->fill_extend_fac > 0.0f); + const bool help_lines = ((tgpf->flag & GP_BRUSH_FILL_SHOW_HELPLINES) || + ((tgpf->flag & GP_BRUSH_FILL_SHOW_EXTENDLINES) && (do_extend))); + + if (help_lines) { tgpf->draw_handle_3d = ED_region_draw_cb_activate( tgpf->region->type, gpencil_fill_draw_3d, tgpf, REGION_DRAW_POST_VIEW); } @@ -1556,17 +1846,217 @@ static int gpencil_fill_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSE return OPERATOR_RUNNING_MODAL; } +/* Helper: Calc the maximum bounding box size of strokes to get the zoom level of the viewport. + * For each stroke, the 2D projected bounding box is calculated and using this data, the total + * object bounding box (all strokes) is calculated. */ +static void gpencil_zoom_level_set(tGPDfill *tgpf) +{ + Brush *brush = tgpf->brush; + if (brush->gpencil_settings->flag & GP_BRUSH_FILL_FIT_DISABLE) { + tgpf->zoom = 1.0f; + return; + } + + Object *ob = tgpf->ob; + bGPdata *gpd = tgpf->gpd; + BrushGpencilSettings *brush_settings = tgpf->brush->gpencil_settings; + bGPDlayer *gpl_active = BKE_gpencil_layer_active_get(gpd); + BLI_assert(gpl_active != NULL); + + const int gpl_active_index = BLI_findindex(&gpd->layers, gpl_active); + BLI_assert(gpl_active_index >= 0); + + /* Init maximum boundbox size. */ + rctf rect_max; + const float winx_half = tgpf->region->winx / 2.0f; + const float winy_half = tgpf->region->winy / 2.0f; + BLI_rctf_init(&rect_max, + 0.0f - winx_half, + tgpf->region->winx + winx_half, + 0.0f - winy_half, + tgpf->region->winy + winy_half); + + float objectbox_min[2], objectbox_max[2]; + INIT_MINMAX2(objectbox_min, objectbox_max); + rctf rect_bound; + LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { + if (gpl->flag & GP_LAYER_HIDE) { + continue; + } + float diff_mat[4][4]; + /* calculate parent matrix */ + BKE_gpencil_layer_transform_matrix_get(tgpf->depsgraph, ob, gpl, diff_mat); + + /* Decide if the strokes of layers are included or not depending on the layer mode. + * Cannot skip the layer because it can use boundary strokes and must be used. */ + const int gpl_index = BLI_findindex(&gpd->layers, gpl); + bool skip = skip_layer_check(brush_settings->fill_layer_mode, gpl_active_index, gpl_index); + + /* Get frame to check. */ + bGPDframe *gpf = BKE_gpencil_layer_frame_get(gpl, tgpf->active_cfra, GP_GETFRAME_USE_PREV); + if (gpf == NULL) { + continue; + } + + /* Read all strokes. */ + LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) { + /* check if stroke can be drawn */ + if ((gps->points == NULL) || (gps->totpoints < 2)) { + continue; + } + /* check if the color is visible */ + MaterialGPencilStyle *gp_style = BKE_gpencil_material_settings(ob, gps->mat_nr + 1); + if ((gp_style == NULL) || (gp_style->flag & GP_MATERIAL_HIDE)) { + continue; + } + + /* If the layer must be skipped, but the stroke is not boundary, skip stroke. */ + if ((skip) && ((gps->flag & GP_STROKE_NOFILL) == 0)) { + continue; + } + + float boundbox_min[2]; + float boundbox_max[2]; + ED_gpencil_projected_2d_bound_box(&tgpf->gsc, gps, diff_mat, boundbox_min, boundbox_max); + minmax_v2v2_v2(objectbox_min, objectbox_max, boundbox_min); + minmax_v2v2_v2(objectbox_min, objectbox_max, boundbox_max); + } + } + /* Clamp max bound box. */ + BLI_rctf_init( + &rect_bound, objectbox_min[0], objectbox_max[0], objectbox_min[1], objectbox_max[1]); + float r_xy[2]; + BLI_rctf_clamp(&rect_bound, &rect_max, r_xy); + + /* Calculate total width used. */ + float width = tgpf->region->winx; + if (rect_bound.xmin < 0.0f) { + width -= rect_bound.xmin; + } + if (rect_bound.xmax > tgpf->region->winx) { + width += rect_bound.xmax - tgpf->region->winx; + } + /* Calculate total height used. */ + float height = tgpf->region->winy; + if (rect_bound.ymin < 0.0f) { + height -= rect_bound.ymin; + } + if (rect_bound.ymax > tgpf->region->winy) { + height += rect_bound.ymax - tgpf->region->winy; + } + + width = ceilf(width); + height = ceilf(height); + + float zoomx = (width > tgpf->region->winx) ? width / (float)tgpf->region->winx : 1.0f; + float zoomy = (height > tgpf->region->winy) ? height / (float)tgpf->region->winy : 1.0f; + if ((zoomx != 1.0f) || (zoomy != 1.0f)) { + tgpf->zoom = min_ff(max_ff(zoomx, zoomy) * 1.5f, 5.0f); + } +} + +static bool gpencil_do_frame_fill(tGPDfill *tgpf, const bool is_inverted) +{ + wmWindow *win = CTX_wm_window(tgpf->C); + + /* render screen to temp image */ + int totpoints = 1; + if (gpencil_render_offscreen(tgpf)) { + + /* Set red borders to create a external limit. */ + gpencil_set_borders(tgpf, true); + + /* apply boundary fill */ + const bool border_contact = gpencil_boundaryfill_area(tgpf); + + /* Fill only if it never comes in contact with an edge. It is better not to fill than + * to fill the entire area, as this is confusing for the artist. */ + if ((!border_contact) || (is_inverted)) { + /* Invert direction if press Ctrl. */ + if (is_inverted) { + gpencil_invert_image(tgpf); + } + + /* Clean borders to avoid infinite loops. */ + gpencil_set_borders(tgpf, false); + WM_cursor_time(win, 50); + int totpoints_prv = 0; + int loop_limit = 0; + while (totpoints > 0) { + /* analyze outline */ + gpencil_get_outline_points(tgpf, (totpoints == 1) ? true : false); + + /* create array of points from stack */ + totpoints = gpencil_points_from_stack(tgpf); + + /* create z-depth array for reproject */ + gpencil_get_depth_array(tgpf); + + /* create stroke and reproject */ + gpencil_stroke_from_buffer(tgpf); + + if (is_inverted) { + gpencil_erase_processed_area(tgpf); + } + else { + /* Exit of the loop. */ + totpoints = 0; + } + + /* free temp stack data */ + if (tgpf->stack) { + BLI_stack_free(tgpf->stack); + } + WM_cursor_time(win, 100); + + /* Free memory. */ + MEM_SAFE_FREE(tgpf->sbuffer); + MEM_SAFE_FREE(tgpf->depth_arr); + + /* Limit very small areas. */ + if (totpoints < 3) { + break; + } + /* Limit infinite loops is some corner cases. */ + if (totpoints_prv == totpoints) { + loop_limit++; + if (loop_limit > 3) { + break; + } + } + totpoints_prv = totpoints; + } + } + else { + BKE_report(tgpf->reports, RPT_INFO, "Unable to fill unclosed areas"); + } + + /* Delete temp image. */ + if ((tgpf->ima) && (!FILL_DEBUG)) { + BKE_id_free(tgpf->bmain, tgpf->ima); + } + + return true; + } + + return false; +} + /* events handling during interactive part of operator */ static int gpencil_fill_modal(bContext *C, wmOperator *op, const wmEvent *event) { tGPDfill *tgpf = op->customdata; - Scene *scene = tgpf->scene; Brush *brush = tgpf->brush; BrushGpencilSettings *brush_settings = brush->gpencil_settings; + tgpf->on_back = RNA_boolean_get(op->ptr, "on_back"); + const bool is_brush_inv = brush_settings->fill_direction == BRUSH_DIR_IN; const bool is_inverted = (is_brush_inv && !event->ctrl) || (!is_brush_inv && event->ctrl); - - int estate = OPERATOR_PASS_THROUGH; /* default exit state - pass through */ + const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(tgpf->gpd); + const bool do_extend = (tgpf->fill_extend_fac > 0.0f); + const bool help_lines = ((tgpf->flag & GP_BRUSH_FILL_SHOW_HELPLINES) || + ((tgpf->flag & GP_BRUSH_FILL_SHOW_EXTENDLINES) && (do_extend))); + int estate = OPERATOR_RUNNING_MODAL; switch (event->type) { case EVT_ESCKEY: @@ -1574,82 +2064,104 @@ static int gpencil_fill_modal(bContext *C, wmOperator *op, const wmEvent *event) estate = OPERATOR_CANCELLED; break; case LEFTMOUSE: - tgpf->on_back = RNA_boolean_get(op->ptr, "on_back"); /* first time the event is not enabled to show help lines. */ - if ((tgpf->oldkey != -1) || ((tgpf->flag & GP_BRUSH_FILL_SHOW_HELPLINES) == 0)) { + if ((tgpf->oldkey != -1) || (!help_lines)) { ARegion *region = BKE_area_find_region_xy( CTX_wm_area(C), RGN_TYPE_ANY, event->x, event->y); if (region) { bool in_bounds = false; - /* Perform bounds check */ in_bounds = BLI_rcti_isect_pt(®ion->winrct, event->x, event->y); if ((in_bounds) && (region->regiontype == RGN_TYPE_WINDOW)) { - tgpf->center[0] = event->mval[0]; - tgpf->center[1] = event->mval[1]; + tgpf->mouse[0] = event->mval[0]; + tgpf->mouse[1] = event->mval[1]; + tgpf->is_render = true; + /* Define Zoom level. */ + gpencil_zoom_level_set(tgpf); - /* Set active frame as current for filling. */ - tgpf->active_cfra = CFRA; + /* Create Temp stroke. */ + tgpf->gps_mouse = BKE_gpencil_stroke_new(0, 1, 10.0f); + tGPspoint point2D; + bGPDspoint *pt = &tgpf->gps_mouse->points[0]; + copy_v2fl_v2i(&point2D.x, tgpf->mouse); + gpencil_stroke_convertcoords_tpoint( + tgpf->scene, tgpf->region, tgpf->ob, &point2D, NULL, &pt->x); - /* render screen to temp image */ - int totpoints = 1; - if (gpencil_render_offscreen(tgpf)) { - - /* Set red borders to create a external limit. */ - gpencil_set_borders(tgpf, true); - - /* apply boundary fill */ - gpencil_boundaryfill_area(tgpf); - - /* Invert direction if press Ctrl. */ - if (is_inverted) { - gpencil_invert_image(tgpf); - } - - /* Clean borders to avoid infinite loops. */ - gpencil_set_borders(tgpf, false); - - while (totpoints > 0) { - /* analyze outline */ - gpencil_get_outline_points(tgpf, (totpoints == 1) ? true : false); - - /* create array of points from stack */ - totpoints = gpencil_points_from_stack(tgpf); - - /* create z-depth array for reproject */ - gpencil_get_depth_array(tgpf); - - /* create stroke and reproject */ - gpencil_stroke_from_buffer(tgpf); - - if (is_inverted) { - gpencil_erase_processed_area(tgpf); - } - else { - /* Exit of the loop. */ - totpoints = 0; - } - - /* free temp stack data */ - if (tgpf->stack) { - BLI_stack_free(tgpf->stack); - } - - /* Free memory. */ - MEM_SAFE_FREE(tgpf->sbuffer); - MEM_SAFE_FREE(tgpf->depth_arr); - } + /* If not multiframe and there is no frame in CFRA for the active layer, create + * a new frame before to make the hash function can find something. */ + if (!is_multiedit) { + tgpf->gpf = BKE_gpencil_layer_frame_get( + tgpf->gpl, tgpf->active_cfra, GP_GETFRAME_ADD_NEW); + tgpf->gpf->flag |= GP_FRAME_SELECT; } - /* restore size */ - tgpf->region->winx = (short)tgpf->bwinx; - tgpf->region->winy = (short)tgpf->bwiny; - tgpf->region->winrct = tgpf->brect; + /* Hash of selected frames.*/ + GHash *frame_list = BLI_ghash_int_new_ex(__func__, 64); + BKE_gpencil_frame_selected_hash(tgpf->gpd, frame_list); + + /* Loop all frames. */ + wmWindow *win = CTX_wm_window(C); + + GHashIterator gh_iter; + int total = BLI_ghash_len(frame_list); + int i = 1; + GHASH_ITER (gh_iter, frame_list) { + /* Set active frame as current for filling. */ + tgpf->active_cfra = POINTER_AS_INT(BLI_ghashIterator_getKey(&gh_iter)); + int step = ((float)i / (float)total) * 100.0f; + WM_cursor_time(win, step); + + if (do_extend) { + gpencil_update_extend(tgpf); + } + + /* Repeat loop until get something. */ + tgpf->done = false; + int loop_limit = 0; + while ((!tgpf->done) && (loop_limit < 2)) { + WM_cursor_time(win, loop_limit + 1); + /* Render screen to temp image and do fill. */ + gpencil_do_frame_fill(tgpf, is_inverted); + + /* restore size */ + tgpf->region->winx = (short)tgpf->bwinx; + tgpf->region->winy = (short)tgpf->bwiny; + tgpf->region->winrct = tgpf->brect; + if (!tgpf->done) { + /* If the zoom was not set before, avoid a loop. */ + if (tgpf->zoom == 1.0f) { + loop_limit++; + } + else { + tgpf->zoom = 1.0f; + tgpf->fill_factor = max_ff( + GPENCIL_MIN_FILL_FAC, + min_ff(brush->gpencil_settings->fill_factor, GPENCIL_MAX_FILL_FAC)); + } + } + loop_limit++; + } + + if (do_extend) { + gpencil_delete_temp_stroke_extension(tgpf, true); + } + + i++; + } + WM_cursor_modal_restore(win); + /* Free hash table. */ + BLI_ghash_free(frame_list, NULL, NULL); + + /* Free temp stroke. */ + BKE_gpencil_free_stroke(tgpf->gps_mouse); /* push undo data */ gpencil_undo_push(tgpf->gpd); + /* Save extend value for next operation. */ + brush_settings->fill_extend_fac = tgpf->fill_extend_fac; + estate = OPERATOR_FINISHED; } else { @@ -1660,8 +2172,29 @@ static int gpencil_fill_modal(bContext *C, wmOperator *op, const wmEvent *event) estate = OPERATOR_CANCELLED; } } + else if (do_extend) { + gpencil_update_extend(tgpf); + } tgpf->oldkey = event->type; break; + case EVT_PAGEUPKEY: + case WHEELUPMOUSE: + if (tgpf->oldkey == 1) { + tgpf->fill_extend_fac -= (event->shift) ? 0.01f : 0.1f; + CLAMP_MIN(tgpf->fill_extend_fac, 0.0f); + gpencil_update_extend(tgpf); + } + break; + case EVT_PAGEDOWNKEY: + case WHEELDOWNMOUSE: + if (tgpf->oldkey == 1) { + tgpf->fill_extend_fac += (event->shift) ? 0.01f : 0.1f; + CLAMP_MAX(tgpf->fill_extend_fac, 100.0f); + gpencil_update_extend(tgpf); + } + break; + default: + break; } /* process last operations before exiting */ switch (estate) { @@ -1674,7 +2207,7 @@ static int gpencil_fill_modal(bContext *C, wmOperator *op, const wmEvent *event) gpencil_fill_exit(C, op); break; - case OPERATOR_RUNNING_MODAL | OPERATOR_PASS_THROUGH: + default: break; } diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h index 5fea46626d5..c6f74c39beb 100644 --- a/source/blender/editors/gpencil/gpencil_intern.h +++ b/source/blender/editors/gpencil/gpencil_intern.h @@ -103,55 +103,6 @@ typedef struct tGPDdraw { float diff_mat[4][4]; /* matrix */ } tGPDdraw; -/* Temporary interpolate operation data */ -typedef struct tGPDinterpolate_layer { - struct tGPDinterpolate_layer *next, *prev; - - /** layer */ - struct bGPDlayer *gpl; - /** frame before current frame (interpolate-from) */ - struct bGPDframe *prevFrame; - /** frame after current frame (interpolate-to) */ - struct bGPDframe *nextFrame; - /** interpolated frame */ - struct bGPDframe *interFrame; - /** interpolate factor */ - float factor; - -} tGPDinterpolate_layer; - -typedef struct tGPDinterpolate { - /** Current depsgraph from context */ - struct Depsgraph *depsgraph; - /** current scene from context */ - struct Scene *scene; - /** area where painting originated */ - struct ScrArea *area; - /** region where painting originated */ - struct ARegion *region; - /** current GP datablock */ - struct bGPdata *gpd; - /** current material */ - struct Material *mat; - - /** current frame number */ - int cframe; - /** (tGPDinterpolate_layer) layers to be interpolated */ - ListBase ilayers; - /** value for determining the displacement influence */ - float shift; - /** initial interpolation factor for active layer */ - float init_factor; - /** shift low limit (-100%) */ - float low_limit; - /** shift upper limit (200%) */ - float high_limit; - /** flag from toolsettings */ - int flag; - - NumInput num; /* numeric input */ -} tGPDinterpolate; - /* Modal Operator Drawing Callbacks ------------------------ */ void ED_gpencil_draw_fill(struct tGPDdraw *tgpw); @@ -341,7 +292,7 @@ bool gpencil_brush_create_presets_poll(bContext *C); extern ListBase gpencil_strokes_copypastebuf; -/* Build a map for converting between old colornames and destination-color-refs */ +/* Build a map for converting between old color-names and destination-color-refs. */ struct GHash *gpencil_copybuf_validate_colormap(struct bContext *C); /* Stroke Editing ------------------------------------ */ @@ -611,7 +562,7 @@ typedef struct bActListElem { struct bActionGroup *grp; /* action group that owns the channel */ - void *owner; /* will either be an action channel or fake ipo-channel (for keys) */ + void *owner; /* will either be an action channel or fake IPO-channel (for keys) */ short ownertype; /* type of owner */ } bActListElem; @@ -624,7 +575,7 @@ typedef enum ACTFILTER_FLAGS { ACTFILTER_SEL = (1 << 1), /* should channels be selected */ ACTFILTER_FOREDIT = (1 << 2), /* does editable status matter */ ACTFILTER_CHANNELS = (1 << 3), /* do we only care that it is a channel */ - ACTFILTER_IPOKEYS = (1 << 4), /* only channels referencing ipo's */ + ACTFILTER_IPOKEYS = (1 << 4), /* only channels referencing IPO's */ ACTFILTER_ONLYICU = (1 << 5), /* only reference ipo-curves */ ACTFILTER_FORDRAWING = (1 << 6), /* make list for interface drawing */ ACTFILTER_ACTGROUPED = (1 << 7), /* belongs to the active group */ diff --git a/source/blender/editors/gpencil/gpencil_interpolate.c b/source/blender/editors/gpencil/gpencil_interpolate.c index 2e756cf9c8d..7c541f61d75 100644 --- a/source/blender/editors/gpencil/gpencil_interpolate.c +++ b/source/blender/editors/gpencil/gpencil_interpolate.c @@ -32,6 +32,7 @@ #include "BLI_blenlib.h" #include "BLI_easing.h" +#include "BLI_ghash.h" #include "BLI_math.h" #include "BLI_utildefines.h" @@ -48,7 +49,6 @@ #include "BKE_colortools.h" #include "BKE_context.h" -#include "BKE_deform.h" #include "BKE_gpencil.h" #include "BKE_gpencil_geom.h" #include "BKE_report.h" @@ -61,21 +61,86 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_enum_types.h" - -#include "UI_view2d.h" #include "ED_gpencil.h" -#include "ED_object.h" #include "ED_screen.h" -#include "ED_space_api.h" -#include "ED_view3d.h" #include "DEG_depsgraph.h" -#include "DEG_depsgraph_query.h" #include "gpencil_intern.h" +/* Temporary interpolate operation data */ +typedef struct tGPDinterpolate_layer { + struct tGPDinterpolate_layer *next, *prev; + + /** layer */ + struct bGPDlayer *gpl; + /** frame before current frame (interpolate-from) */ + struct bGPDframe *prevFrame; + /** frame after current frame (interpolate-to) */ + struct bGPDframe *nextFrame; + /** interpolated frame */ + struct bGPDframe *interFrame; + /** interpolate factor */ + float factor; + + /* Hash tablets to create temp relationship between strokes. */ + struct GHash *used_strokes; + struct GHash *pair_strokes; + +} tGPDinterpolate_layer; + +typedef struct tGPDinterpolate { + /** Current depsgraph from context */ + struct Depsgraph *depsgraph; + /** current scene from context */ + struct Scene *scene; + /** area where painting originated */ + struct ScrArea *area; + /** region where painting originated */ + struct ARegion *region; + /** current object */ + struct Object *ob; + /** current GP datablock */ + struct bGPdata *gpd; + /** current material */ + struct Material *mat; + /* Space Conversion Data */ + struct GP_SpaceConversion gsc; + + /** current frame number */ + int cframe; + /** (tGPDinterpolate_layer) layers to be interpolated */ + ListBase ilayers; + /** value for determining the displacement influence */ + float shift; + /** initial interpolation factor for active layer */ + float init_factor; + /** shift low limit (-100%) */ + float low_limit; + /** shift upper limit (200%) */ + float high_limit; + /** flag from toolsettings */ + int flag; + /** Flip mode. */ + int flipmode; + /** smooth factor */ + float smooth_factor; + /** smooth iterations */ + int smooth_steps; + + NumInput num; /* numeric input */ +} tGPDinterpolate; + +typedef enum eGP_InterpolateFlipMode { + /* No flip. */ + GP_INTERPOLATE_NOFLIP = 0, + /* Flip always. */ + GP_INTERPOLATE_FLIP = 1, + /* Flip if needed. */ + GP_INTERPOLATE_FLIPAUTO = 2, +} eGP_InterpolateFlipMode; + /* ************************************************ */ /* Core/Shared Utilities */ @@ -88,17 +153,190 @@ static bool gpencil_view3d_poll(bContext *C) /* only 3D view */ ScrArea *area = CTX_wm_area(C); if (area && area->spacetype != SPACE_VIEW3D) { - return 0; + return false; } /* need data to interpolate */ if (ELEM(NULL, gpd, gpl)) { - return 0; + return false; } - return 1; + return true; } +/* Return if the stroke must be flipped or not. The logic of the calculation + * is to check if the lines from extremes crossed. All is done in 2D. */ +static bool gpencil_stroke_need_flip(Depsgraph *depsgraph, + Object *ob, + bGPDlayer *gpl, + GP_SpaceConversion *gsc, + bGPDstroke *gps_from, + bGPDstroke *gps_to) +{ + float diff_mat[4][4]; + /* calculate parent matrix */ + BKE_gpencil_layer_transform_matrix_get(depsgraph, ob, gpl, diff_mat); + bGPDspoint *pt, pt_dummy_ps; + float v_from_start[2], v_to_start[2], v_from_end[2], v_to_end[2]; + + /* Line from start of strokes. */ + pt = &gps_from->points[0]; + gpencil_point_to_parent_space(pt, diff_mat, &pt_dummy_ps); + gpencil_point_to_xy_fl(gsc, gps_from, &pt_dummy_ps, &v_from_start[0], &v_from_start[1]); + + pt = &gps_to->points[0]; + gpencil_point_to_parent_space(pt, diff_mat, &pt_dummy_ps); + gpencil_point_to_xy_fl(gsc, gps_from, &pt_dummy_ps, &v_to_start[0], &v_to_start[1]); + + /* Line from end of strokes. */ + pt = &gps_from->points[gps_from->totpoints - 1]; + gpencil_point_to_parent_space(pt, diff_mat, &pt_dummy_ps); + gpencil_point_to_xy_fl(gsc, gps_from, &pt_dummy_ps, &v_from_end[0], &v_from_end[1]); + + pt = &gps_to->points[gps_to->totpoints - 1]; + gpencil_point_to_parent_space(pt, diff_mat, &pt_dummy_ps); + gpencil_point_to_xy_fl(gsc, gps_from, &pt_dummy_ps, &v_to_end[0], &v_to_end[1]); + + const bool isect_lines = (isect_seg_seg_v2(v_from_start, v_to_start, v_from_end, v_to_end) == + ISECT_LINE_LINE_CROSS); + + /* If the vectors intersect. */ + if (isect_lines) { + /* For sharp angles, check distance between extremes. */ + float v1[2], v2[2]; + sub_v2_v2v2(v1, v_to_start, v_from_start); + sub_v2_v2v2(v2, v_to_end, v_from_end); + float angle = angle_v2v2(v1, v2); + if (angle < DEG2RADF(15.0f)) { + /* Check the original stroke orientation using a point of destination stroke + * `(S)<--??-->(E) <--->`. */ + float dist_start = len_squared_v2v2(v_from_start, v_to_start); + float dist_end = len_squared_v2v2(v_from_end, v_to_start); + /* Oriented with end nearer of destination stroke. + * `(S)--->(E) <--->` */ + if (dist_start >= dist_end) { + dist_start = len_squared_v2v2(v_from_end, v_to_start); + dist_end = len_squared_v2v2(v_from_end, v_to_end); + /* `(S)--->(E) (E)<---(S)` */ + return (dist_start >= dist_end); + } + + /* Oriented inversed with original stroke start near of destination stroke. + * `(E)<----(S) <--->` */ + dist_start = len_squared_v2v2(v_from_start, v_to_start); + dist_end = len_squared_v2v2(v_from_start, v_to_end); + /* `(E)<---(S) (S)--->(E)` */ + return (dist_start < dist_end); + } + + return true; + } + + /* Check that both vectors have the same direction. */ + float v1[2], v2[2]; + sub_v2_v2v2(v1, v_from_end, v_from_start); + sub_v2_v2v2(v2, v_to_end, v_to_start); + mul_v2_v2v2(v1, v1, v2); + if ((v1[0] < 0.0f) && (v1[1] < 0.0f)) { + return true; + } + + return false; +} + +/* Return the stroke related to the selection index, returning the stroke with + * the smallest selection index greater than reference index. */ +static bGPDstroke *gpencil_stroke_get_related(GHash *used_strokes, + bGPDframe *gpf, + const int reference_index) +{ + bGPDstroke *gps_found = NULL; + int lower_index = INT_MAX; + LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) { + if (gps->select_index > reference_index) { + if (!BLI_ghash_haskey(used_strokes, gps)) { + if (gps->select_index < lower_index) { + lower_index = gps->select_index; + gps_found = gps; + } + } + } + } + + /* Set as used. */ + if (gps_found) { + BLI_ghash_insert(used_strokes, gps_found, gps_found); + } + + return gps_found; +} + +/* Load a Hash with the relationship between strokes. */ +static void gpencil_stroke_pair_table(bContext *C, + tGPDinterpolate *tgpi, + tGPDinterpolate_layer *tgpil) +{ + bGPdata *gpd = tgpi->gpd; + const bool only_selected = ((GPENCIL_EDIT_MODE(gpd)) && + ((tgpi->flag & GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED) != 0)); + const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd); + + /* Create hash tablets with relationship between strokes. */ + tgpil->used_strokes = BLI_ghash_ptr_new(__func__); + tgpil->pair_strokes = BLI_ghash_ptr_new(__func__); + + /* Create a table with source and target pair of strokes. */ + LISTBASE_FOREACH (bGPDstroke *, gps_from, &tgpil->prevFrame->strokes) { + bGPDstroke *gps_to = NULL; + /* only selected */ + if ((GPENCIL_EDIT_MODE(gpd)) && (only_selected) && + ((gps_from->flag & GP_STROKE_SELECT) == 0)) { + continue; + } + /* skip strokes that are invalid for current view */ + if (ED_gpencil_stroke_can_use(C, gps_from) == false) { + continue; + } + /* Check if the material is editable. */ + if (ED_gpencil_stroke_material_editable(tgpi->ob, tgpil->gpl, gps_from) == false) { + continue; + } + /* Try to get the related stroke. */ + if ((is_multiedit) && (gps_from->select_index > 0)) { + gps_to = gpencil_stroke_get_related( + tgpil->used_strokes, tgpil->nextFrame, gps_from->select_index); + } + /* If not found, get final stroke to interpolate using position in the array. */ + if (gps_to == NULL) { + int fFrame = BLI_findindex(&tgpil->prevFrame->strokes, gps_from); + gps_to = BLI_findlink(&tgpil->nextFrame->strokes, fFrame); + } + + if (ELEM(NULL, gps_from, gps_to)) { + continue; + } + /* Insert the pair entry in the hash table. */ + BLI_ghash_insert(tgpil->pair_strokes, gps_from, gps_to); + } +} + +static void gpencil_interpolate_smooth_stroke(bGPDstroke *gps, + float smooth_factor, + int smooth_steps) +{ + if (smooth_factor == 0.0f) { + return; + } + + float reduce = 0.0f; + for (int r = 0; r < smooth_steps; r++) { + for (int i = 0; i < gps->totpoints - 1; i++) { + BKE_gpencil_stroke_smooth(gps, i, smooth_factor - reduce); + BKE_gpencil_stroke_smooth_strength(gps, i, smooth_factor); + } + reduce += 0.25f; /* reduce the factor */ + } +} /* Perform interpolation */ static void gpencil_interpolate_update_points(const bGPDstroke *gps_from, const bGPDstroke *gps_to, @@ -121,7 +359,7 @@ static void gpencil_interpolate_update_points(const bGPDstroke *gps_from, /* ****************** Interpolate Interactive *********************** */ /* Helper: free all temp strokes for display. */ -static void gpencil_interpolate_free_temp_strokes(bGPDframe *gpf) +static void gpencil_interpolate_free_tagged_strokes(bGPDframe *gpf) { if (gpf == NULL) { return; @@ -161,33 +399,34 @@ static void gpencil_interpolate_update_strokes(bContext *C, tGPDinterpolate *tgp const float factor = tgpil->factor + shift; bGPDframe *gpf = tgpil->gpl->actframe; - /* Free temp strokes. */ - gpencil_interpolate_free_temp_strokes(gpf); + /* Free temp strokes used for display. */ + gpencil_interpolate_free_tagged_strokes(gpf); - LISTBASE_FOREACH (bGPDstroke *, new_stroke, &tgpil->interFrame->strokes) { - bGPDstroke *gps_from, *gps_to; - int stroke_idx; + /* Clear previous interpolations. */ + gpencil_interpolate_free_tagged_strokes(tgpil->interFrame); - if (new_stroke->totpoints == 0) { - continue; - } + GHashIterator gh_iter; + GHASH_ITER (gh_iter, tgpil->pair_strokes) { + bGPDstroke *gps_from = (bGPDstroke *)BLI_ghashIterator_getKey(&gh_iter); + bGPDstroke *gps_to = (bGPDstroke *)BLI_ghashIterator_getValue(&gh_iter); + /* Create new stroke. */ + bGPDstroke *new_stroke = BKE_gpencil_stroke_duplicate(gps_from, true, true); + new_stroke->flag |= GP_STROKE_TAG; + new_stroke->select_index = 0; - /* get strokes to interpolate */ - stroke_idx = BLI_findindex(&tgpil->interFrame->strokes, new_stroke); + /* Update points position. */ + gpencil_interpolate_update_points(gps_from, gps_to, new_stroke, factor); - gps_from = BLI_findlink(&tgpil->prevFrame->strokes, stroke_idx); - gps_to = BLI_findlink(&tgpil->nextFrame->strokes, stroke_idx); + /* Calc geometry data. */ + BKE_gpencil_stroke_geometry_update(gpd, new_stroke); + /* Add to strokes. */ + BLI_addtail(&tgpil->interFrame->strokes, new_stroke); - /* update points position */ - if ((gps_from) && (gps_to)) { - gpencil_interpolate_update_points(gps_from, gps_to, new_stroke, factor); - - /* Add temp strokes. */ - if (gpf) { - bGPDstroke *gps_eval = BKE_gpencil_stroke_duplicate(new_stroke, true, true); - gps_eval->flag |= GP_STROKE_TAG; - BLI_addtail(&gpf->strokes, gps_eval); - } + /* Add temp strokes to display. */ + if (gpf) { + bGPDstroke *gps_eval = BKE_gpencil_stroke_duplicate(new_stroke, true, true); + gps_eval->flag |= GP_STROKE_TAG; + BLI_addtail(&gpf->strokes, gps_eval); } } } @@ -196,65 +435,50 @@ static void gpencil_interpolate_update_strokes(bContext *C, tGPDinterpolate *tgp WM_event_add_notifier(C, NC_GPENCIL | NA_EDITED, NULL); } -/* Helper: Verify valid strokes for interpolation */ -static bool gpencil_interpolate_check_todo(bContext *C, bGPdata *gpd) +/* Helper: Get previous keyframe. */ +static bGPDframe *gpencil_get_previous_keyframe(bGPDlayer *gpl, int cfra) { - Object *ob = CTX_data_active_object(C); - ToolSettings *ts = CTX_data_tool_settings(C); - eGP_Interpolate_SettingsFlag flag = ts->gp_interpolate.flag; - - /* get layers */ - LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { - /* all layers or only active */ - if (!(flag & GP_TOOLFLAG_INTERPOLATE_ALL_LAYERS) && !(gpl->flag & GP_LAYER_ACTIVE)) { - continue; - } - /* only editable and visible layers are considered */ - if (!BKE_gpencil_layer_is_editable(gpl) || (gpl->actframe == NULL)) { - continue; - } - - /* read strokes */ - LISTBASE_FOREACH (bGPDstroke *, gps_from, &gpl->actframe->strokes) { - bGPDstroke *gps_to; - int fFrame; - - /* only selected */ - if ((GPENCIL_EDIT_MODE(gpd)) && (flag & GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED) && - ((gps_from->flag & GP_STROKE_SELECT) == 0)) { - continue; - } - /* skip strokes that are invalid for current view */ - if (ED_gpencil_stroke_can_use(C, gps_from) == false) { - continue; - } - /* check if the color is editable */ - if (ED_gpencil_stroke_material_editable(ob, gpl, gps_from) == false) { - continue; - } - - /* get final stroke to interpolate */ - fFrame = BLI_findindex(&gpl->actframe->strokes, gps_from); - gps_to = (gpl->actframe->next != NULL) ? - BLI_findlink(&gpl->actframe->next->strokes, fFrame) : - NULL; - if (gps_to == NULL) { - continue; - } - - return true; - } + if (gpl->actframe != NULL && gpl->actframe->framenum < cfra && + gpl->actframe->key_type == BEZT_KEYTYPE_KEYFRAME) { + return gpl->actframe; } - return false; + + LISTBASE_FOREACH_BACKWARD (bGPDframe *, gpf, &gpl->frames) { + if (gpf->key_type != BEZT_KEYTYPE_KEYFRAME) { + continue; + } + if (gpf->framenum >= cfra) { + continue; + } + return gpf; + } + + return NULL; +} + +/* Helper: Get next keyframe. */ +static bGPDframe *gpencil_get_next_keyframe(bGPDlayer *gpl, int cfra) +{ + LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) { + if (gpf->key_type != BEZT_KEYTYPE_KEYFRAME) { + continue; + } + if (gpf->framenum <= cfra) { + continue; + } + return gpf; + } + + return NULL; } /* Helper: Create internal strokes interpolated */ static void gpencil_interpolate_set_points(bContext *C, tGPDinterpolate *tgpi) { + Scene *scene = tgpi->scene; bGPdata *gpd = tgpi->gpd; bGPDlayer *active_gpl = CTX_data_active_gpencil_layer(C); bGPDframe *actframe = active_gpl->actframe; - Object *ob = CTX_data_active_object(C); /* save initial factor for active layer to define shift limits */ tgpi->init_factor = (float)(tgpi->cframe - actframe->framenum) / @@ -283,12 +507,15 @@ static void gpencil_interpolate_set_points(bContext *C, tGPDinterpolate *tgpi) tgpil = MEM_callocN(sizeof(tGPDinterpolate_layer), "GPencil Interpolate Layer"); tgpil->gpl = gpl; - tgpil->prevFrame = BKE_gpencil_frame_duplicate(gpl->actframe, true); - tgpil->nextFrame = BKE_gpencil_frame_duplicate(gpl->actframe->next, true); + bGPDframe *gpf = gpencil_get_previous_keyframe(gpl, CFRA); + tgpil->prevFrame = BKE_gpencil_frame_duplicate(gpf, true); + + gpf = gpencil_get_next_keyframe(gpl, CFRA); + tgpil->nextFrame = BKE_gpencil_frame_duplicate(gpf, true); BLI_addtail(&tgpi->ilayers, tgpil); - /* create a new temporary frame */ + /* Create a new temporary frame. */ tgpil->interFrame = MEM_callocN(sizeof(bGPDframe), "bGPDframe"); tgpil->interFrame->framenum = tgpi->cframe; @@ -296,63 +523,43 @@ static void gpencil_interpolate_set_points(bContext *C, tGPDinterpolate *tgpi) tgpil->factor = (float)(tgpi->cframe - tgpil->prevFrame->framenum) / (tgpil->nextFrame->framenum - tgpil->prevFrame->framenum + 1); - /* create new strokes data with interpolated points reading original stroke */ - LISTBASE_FOREACH (bGPDstroke *, gps_from, &tgpil->prevFrame->strokes) { - bGPDstroke *gps_to; - int fFrame; + /* Load the relationship between frames. */ + gpencil_stroke_pair_table(C, tgpi, tgpil); - bGPDstroke *new_stroke = NULL; - bool valid = true; + /* Create new strokes data with interpolated points reading original stroke. */ + GHashIterator gh_iter; + GHASH_ITER (gh_iter, tgpil->pair_strokes) { + bGPDstroke *gps_from = (bGPDstroke *)BLI_ghashIterator_getKey(&gh_iter); + bGPDstroke *gps_to = (bGPDstroke *)BLI_ghashIterator_getValue(&gh_iter); - /* only selected */ - if ((GPENCIL_EDIT_MODE(gpd)) && (tgpi->flag & GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED) && - ((gps_from->flag & GP_STROKE_SELECT) == 0)) { - valid = false; + /* If destination stroke is smaller, resize new_stroke to size of gps_to stroke. */ + if (gps_from->totpoints > gps_to->totpoints) { + BKE_gpencil_stroke_uniform_subdivide(gpd, gps_to, gps_from->totpoints, true); } - /* skip strokes that are invalid for current view */ - if (ED_gpencil_stroke_can_use(C, gps_from) == false) { - valid = false; + if (gps_to->totpoints > gps_from->totpoints) { + BKE_gpencil_stroke_uniform_subdivide(gpd, gps_from, gps_to->totpoints, true); } - /* check if the color is editable */ - if (ED_gpencil_stroke_material_editable(ob, tgpil->gpl, gps_from) == false) { - valid = false; + /* Flip stroke. */ + if (tgpi->flipmode == GP_INTERPOLATE_FLIP) { + BKE_gpencil_stroke_flip(gps_to); } - - /* get final stroke to interpolate */ - fFrame = BLI_findindex(&tgpil->prevFrame->strokes, gps_from); - gps_to = BLI_findlink(&tgpil->nextFrame->strokes, fFrame); - if (gps_to == NULL) { - valid = false; - } - - if (valid) { - /* if destination stroke is smaller, resize new_stroke to size of gps_to stroke */ - if (gps_from->totpoints > gps_to->totpoints) { - BKE_gpencil_stroke_uniform_subdivide(gpd, gps_to, gps_from->totpoints, true); - } - if (gps_to->totpoints > gps_from->totpoints) { - BKE_gpencil_stroke_uniform_subdivide(gpd, gps_from, gps_to->totpoints, true); - } - - /* Create new stroke. */ - new_stroke = BKE_gpencil_stroke_duplicate(gps_from, true, true); - - /* Update points position. */ - gpencil_interpolate_update_points(gps_from, gps_to, new_stroke, tgpil->factor); - } - else { - /* Create new stroke. */ - new_stroke = BKE_gpencil_stroke_duplicate(gps_from, true, true); - - /* need an empty stroke to keep index correct for lookup, but resize to smallest size */ - new_stroke->totpoints = 0; - new_stroke->points = MEM_recallocN(new_stroke->points, sizeof(*new_stroke->points)); - if (new_stroke->dvert != NULL) { - new_stroke->dvert = MEM_recallocN(new_stroke->dvert, sizeof(*new_stroke->dvert)); + else if (tgpi->flipmode == GP_INTERPOLATE_FLIPAUTO) { + if (gpencil_stroke_need_flip( + tgpi->depsgraph, tgpi->ob, gpl, &tgpi->gsc, gps_from, gps_to)) { + BKE_gpencil_stroke_flip(gps_to); } } + /* Create new stroke. */ + bGPDstroke *new_stroke = BKE_gpencil_stroke_duplicate(gps_from, true, true); + new_stroke->flag |= GP_STROKE_TAG; + new_stroke->select_index = 0; + + /* Update points position. */ + gpencil_interpolate_update_points(gps_from, gps_to, new_stroke, tgpil->factor); + gpencil_interpolate_smooth_stroke(new_stroke, tgpi->smooth_factor, tgpi->smooth_steps); + /* Calc geometry data. */ BKE_gpencil_stroke_geometry_update(gpd, new_stroke); /* add to strokes */ @@ -438,7 +645,7 @@ static void gpencil_interpolate_exit(bContext *C, wmOperator *op) /* Clear any temp stroke. */ LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) { - gpencil_interpolate_free_temp_strokes(gpf); + gpencil_interpolate_free_tagged_strokes(gpf); } } @@ -450,9 +657,18 @@ static void gpencil_interpolate_exit(bContext *C, wmOperator *op) MEM_SAFE_FREE(tgpil->prevFrame); MEM_SAFE_FREE(tgpil->nextFrame); MEM_SAFE_FREE(tgpil->interFrame); + + /* Free Hash tablets. */ + if (tgpil->used_strokes != NULL) { + BLI_ghash_free(tgpil->used_strokes, NULL, NULL); + } + if (tgpil->pair_strokes != NULL) { + BLI_ghash_free(tgpil->pair_strokes, NULL, NULL); + } } BLI_freelistN(&tgpi->ilayers); + MEM_SAFE_FREE(tgpi); } DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); @@ -465,24 +681,33 @@ static void gpencil_interpolate_exit(bContext *C, wmOperator *op) /* Init new temporary interpolation data */ static bool gpencil_interpolate_set_init_values(bContext *C, wmOperator *op, tGPDinterpolate *tgpi) { - ToolSettings *ts = CTX_data_tool_settings(C); - bGPdata *gpd = CTX_data_gpencil_data(C); - /* set current scene and window */ tgpi->depsgraph = CTX_data_ensure_evaluated_depsgraph(C); tgpi->scene = CTX_data_scene(C); tgpi->area = CTX_wm_area(C); tgpi->region = CTX_wm_region(C); - tgpi->flag = ts->gp_interpolate.flag; + tgpi->ob = CTX_data_active_object(C); + /* Setup space conversions. */ + gpencil_point_conversion_init(C, &tgpi->gsc); /* set current frame number */ tgpi->cframe = tgpi->scene->r.cfra; /* set GP datablock */ - tgpi->gpd = gpd; - + tgpi->gpd = tgpi->ob->data; /* set interpolation weight */ tgpi->shift = RNA_float_get(op->ptr, "shift"); + SET_FLAG_FROM_TEST( + tgpi->flag, (RNA_enum_get(op->ptr, "layers") == 1), GP_TOOLFLAG_INTERPOLATE_ALL_LAYERS); + SET_FLAG_FROM_TEST( + tgpi->flag, + ((GPENCIL_EDIT_MODE(tgpi->gpd)) && (RNA_boolean_get(op->ptr, "interpolate_selected_only"))), + GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED); + + tgpi->flipmode = RNA_enum_get(op->ptr, "flip"); + + tgpi->smooth_factor = RNA_float_get(op->ptr, "smooth_factor"); + tgpi->smooth_steps = RNA_int_get(op->ptr, "smooth_steps"); /* Untag strokes to be sure nothing is pending due any canceled process. */ LISTBASE_FOREACH (bGPDlayer *, gpl, &tgpi->gpd->layers) { @@ -533,12 +758,13 @@ static int gpencil_interpolate_invoke(bContext *C, wmOperator *op, const wmEvent bGPdata *gpd = CTX_data_gpencil_data(C); bGPDlayer *gpl = CTX_data_active_gpencil_layer(C); Scene *scene = CTX_data_scene(C); - int cfra = CFRA; - bGPDframe *actframe = gpl->actframe; tGPDinterpolate *tgpi = NULL; /* cannot interpolate if not between 2 frames */ - if (ELEM(NULL, actframe, actframe->next)) { + int cfra = CFRA; + bGPDframe *gpf_prv = gpencil_get_previous_keyframe(gpl, cfra); + bGPDframe *gpf_next = gpencil_get_next_keyframe(gpl, cfra); + if (ELEM(NULL, gpf_prv, gpf_next)) { BKE_report( op->reports, RPT_ERROR, @@ -546,25 +772,10 @@ static int gpencil_interpolate_invoke(bContext *C, wmOperator *op, const wmEvent return OPERATOR_CANCELLED; } - /* cannot interpolate in extremes */ - if (ELEM(cfra, actframe->framenum, actframe->next->framenum)) { - BKE_report(op->reports, - RPT_ERROR, - "Cannot interpolate as current frame already has existing grease pencil frames"); - return OPERATOR_CANCELLED; - } - if (GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd)) { BKE_report(op->reports, RPT_ERROR, "Cannot interpolate in curve edit mode"); return OPERATOR_CANCELLED; } - - /* need editable strokes */ - if (!gpencil_interpolate_check_todo(C, gpd)) { - BKE_report(op->reports, RPT_ERROR, "Interpolation requires some editable strokes"); - return OPERATOR_CANCELLED; - } - /* try to initialize context data needed */ if (!gpencil_interpolate_init(C, op)) { if (op->customdata) { @@ -611,8 +822,7 @@ static int gpencil_interpolate_modal(bContext *C, wmOperator *op, const wmEvent gpf_dst = BKE_gpencil_layer_frame_get(tgpil->gpl, tgpi->cframe, GP_GETFRAME_ADD_NEW); gpf_dst->key_type = BEZT_KEYTYPE_BREAKDOWN; - /* copy strokes */ - BLI_listbase_clear(&gpf_dst->strokes); + /* Copy strokes. */ LISTBASE_FOREACH (bGPDstroke *, gps_src, &tgpil->interFrame->strokes) { if (gps_src->totpoints == 0) { continue; @@ -719,6 +929,15 @@ static void gpencil_interpolate_cancel(bContext *C, wmOperator *op) void GPENCIL_OT_interpolate(wmOperatorType *ot) { + static const EnumPropertyItem flip_modes[] = { + {GP_INTERPOLATE_NOFLIP, "NOFLIP", 0, "No Flip", ""}, + {GP_INTERPOLATE_FLIP, "FLIP", 0, "Flip", ""}, + {GP_INTERPOLATE_FLIPAUTO, "AUTO", 0, "Automatic", ""}, + {0, NULL, 0, NULL, NULL}, + }; + + PropertyRNA *prop; + /* identifiers */ ot->name = "Grease Pencil Interpolation"; ot->idname = "GPENCIL_OT_interpolate"; @@ -733,6 +952,12 @@ void GPENCIL_OT_interpolate(wmOperatorType *ot) /* flags */ ot->flag = OPTYPE_UNDO | OPTYPE_BLOCKING; + static const EnumPropertyItem gpencil_interpolation_layer_items[] = { + {0, "ACTIVE", 0, "Active", ""}, + {1, "ALL", 0, "All Layers", ""}, + {0, NULL, 0, NULL, NULL}, + }; + /* properties */ RNA_def_float_factor( ot->srna, @@ -744,25 +969,68 @@ void GPENCIL_OT_interpolate(wmOperatorType *ot) "Bias factor for which frame has more influence on the interpolated strokes", -0.9f, 0.9f); + + RNA_def_enum(ot->srna, + "layers", + gpencil_interpolation_layer_items, + 0, + "Layer", + "Layers included in the interpolation"); + + RNA_def_boolean(ot->srna, + "interpolate_selected_only", + 0, + "Only Selected", + "Interpolate only selected strokes"); + + RNA_def_enum(ot->srna, + "flip", + flip_modes, + GP_INTERPOLATE_FLIPAUTO, + "Flip Mode", + "Invert destination stroke to match start and end with source stroke"); + + RNA_def_int(ot->srna, + "smooth_steps", + 1, + 1, + 3, + "Iterations", + "Number of times to smooth newly created strokes", + 1, + 3); + + RNA_def_float(ot->srna, + "smooth_factor", + 0.0f, + 0.0f, + 2.0f, + "Smooth", + "Amount of smoothing to apply to interpolated strokes, to reduce jitter/noise", + 0.0f, + 2.0f); + + prop = RNA_def_boolean(ot->srna, "release_confirm", 0, "Confirm on Release", ""); + RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); } /* ****************** Interpolate Sequence *********************** */ /* Helper: Perform easing equation calculations for GP interpolation operator */ -static float gpencil_interpolate_seq_easing_calc(GP_Interpolate_Settings *ipo_settings, float time) +static float gpencil_interpolate_seq_easing_calc(wmOperator *op, float time) { const float begin = 0.0f; const float change = 1.0f; const float duration = 1.0f; - const float back = ipo_settings->back; - const float amplitude = ipo_settings->amplitude; - const float period = ipo_settings->period; - - eBezTriple_Easing easing = ipo_settings->easing; + const float back = RNA_float_get(op->ptr, "back"); + const float amplitude = RNA_float_get(op->ptr, "amplitude"); + const float period = RNA_float_get(op->ptr, "period"); + const eBezTriple_Easing easing = RNA_enum_get(op->ptr, "easing"); + const eGP_Interpolate_Type type = RNA_enum_get(op->ptr, "type"); float result = time; - switch (ipo_settings->type) { + switch (type) { case GP_IPO_BACK: switch (easing) { case BEZT_IPO_EASE_IN: @@ -945,7 +1213,7 @@ static float gpencil_interpolate_seq_easing_calc(GP_Interpolate_Settings *ipo_se break; default: - printf("%s: Unknown interpolation type - %d\n", __func__, ipo_settings->type); + printf("%s: Unknown interpolation type\n", __func__); break; } @@ -954,34 +1222,47 @@ static float gpencil_interpolate_seq_easing_calc(GP_Interpolate_Settings *ipo_se static int gpencil_interpolate_seq_exec(bContext *C, wmOperator *op) { - bGPdata *gpd = CTX_data_gpencil_data(C); - bGPDlayer *active_gpl = CTX_data_active_gpencil_layer(C); - bGPDframe *actframe = active_gpl->actframe; - - Object *ob = CTX_data_active_object(C); - ToolSettings *ts = CTX_data_tool_settings(C); + Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); Scene *scene = CTX_data_scene(C); + ToolSettings *ts = CTX_data_tool_settings(C); + Object *ob = CTX_data_active_object(C); + bGPdata *gpd = ob->data; + bGPDlayer *active_gpl = CTX_data_active_gpencil_layer(C); + /* Setup space conversions. */ + GP_SpaceConversion gsc; + gpencil_point_conversion_init(C, &gsc); + int cfra = CFRA; GP_Interpolate_Settings *ipo_settings = &ts->gp_interpolate; - eGP_Interpolate_SettingsFlag flag = ipo_settings->flag; - const int step = ipo_settings->step; + const int step = RNA_int_get(op->ptr, "step"); + const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd); + const bool all_layers = (bool)(RNA_enum_get(op->ptr, "layers") == 1); + const bool only_selected = ((GPENCIL_EDIT_MODE(gpd)) && + (RNA_boolean_get(op->ptr, "interpolate_selected_only") != 0)); - /* cannot interpolate if not between 2 frames */ - if (ELEM(NULL, actframe, actframe->next)) { + eGP_InterpolateFlipMode flipmode = RNA_enum_get(op->ptr, "flip"); + + const float smooth_factor = RNA_float_get(op->ptr, "smooth_factor"); + const int smooth_steps = RNA_int_get(op->ptr, "smooth_steps"); + + const eGP_Interpolate_Type type = RNA_enum_get(op->ptr, "type"); + + if (ipo_settings->custom_ipo == NULL) { + ipo_settings->custom_ipo = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f); + } + BKE_curvemapping_init(ipo_settings->custom_ipo); + + /* Cannot interpolate if not between 2 frames. */ + bGPDframe *gpf_prv = gpencil_get_previous_keyframe(active_gpl, cfra); + bGPDframe *gpf_next = gpencil_get_next_keyframe(active_gpl, cfra); + if (ELEM(NULL, gpf_prv, gpf_next)) { BKE_report( op->reports, RPT_ERROR, "Cannot find a pair of grease pencil frames to interpolate between in active layer"); return OPERATOR_CANCELLED; } - /* cannot interpolate in extremes */ - if (ELEM(cfra, actframe->framenum, actframe->next->framenum)) { - BKE_report(op->reports, - RPT_ERROR, - "Cannot interpolate as current frame already has existing grease pencil frames"); - return OPERATOR_CANCELLED; - } if (GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd)) { BKE_report(op->reports, RPT_ERROR, "Cannot interpolate in curve edit mode"); @@ -990,103 +1271,137 @@ static int gpencil_interpolate_seq_exec(bContext *C, wmOperator *op) /* loop all layer to check if need interpolation */ LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { - bGPDframe *prevFrame, *nextFrame; - bGPDstroke *gps_from, *gps_to; - int cframe, fFrame; - - /* Need a set of frames to interpolate. */ - if ((gpl->actframe == NULL) || (gpl->actframe->next == NULL)) { - continue; - } /* all layers or only active */ - if (((flag & GP_TOOLFLAG_INTERPOLATE_ALL_LAYERS) == 0) && (gpl != active_gpl)) { + if ((!all_layers) && (gpl != active_gpl)) { continue; } /* only editable and visible layers are considered */ if (!BKE_gpencil_layer_is_editable(gpl)) { continue; } + gpf_prv = gpencil_get_previous_keyframe(gpl, cfra); + gpf_next = gpencil_get_next_keyframe(gpl, cfra); - /* store extremes */ - prevFrame = BKE_gpencil_frame_duplicate(gpl->actframe, true); - nextFrame = BKE_gpencil_frame_duplicate(gpl->actframe->next, true); + /* Need a set of frames to interpolate. */ + if ((gpf_prv == NULL) || (gpf_next == NULL)) { + continue; + } - /* Loop over intermediary frames and create the interpolation */ - for (cframe = prevFrame->framenum + step; cframe < nextFrame->framenum; cframe += step) { - bGPDframe *interFrame = NULL; - float factor; + /* Store extremes. */ + bGPDframe *prevFrame = BKE_gpencil_frame_duplicate(gpf_prv, true); + bGPDframe *nextFrame = BKE_gpencil_frame_duplicate(gpf_next, true); - /* get interpolation factor */ + /* Create a table with source and target pair of strokes. */ + GHash *used_strokes = BLI_ghash_ptr_new(__func__); + GHash *pair_strokes = BLI_ghash_ptr_new(__func__); + + LISTBASE_FOREACH (bGPDstroke *, gps_from, &prevFrame->strokes) { + bGPDstroke *gps_to = NULL; + /* Only selected. */ + if ((GPENCIL_EDIT_MODE(gpd)) && (only_selected) && + ((gps_from->flag & GP_STROKE_SELECT) == 0)) { + continue; + } + /* Skip strokes that are invalid for current view. */ + if (ED_gpencil_stroke_can_use(C, gps_from) == false) { + continue; + } + /* Check if the material is editable. */ + if (ED_gpencil_stroke_material_editable(ob, gpl, gps_from) == false) { + continue; + } + /* Try to get the related stroke. */ + if ((is_multiedit) && (gps_from->select_index > 0)) { + gps_to = gpencil_stroke_get_related(used_strokes, nextFrame, gps_from->select_index); + } + /* If not found, get final stroke to interpolate using position in the array. */ + if (gps_to == NULL) { + int fFrame = BLI_findindex(&prevFrame->strokes, gps_from); + gps_to = BLI_findlink(&nextFrame->strokes, fFrame); + } + + if (ELEM(NULL, gps_from, gps_to)) { + continue; + } + + /* if destination stroke is smaller, resize new_stroke to size of gps_to stroke */ + if (gps_from->totpoints > gps_to->totpoints) { + BKE_gpencil_stroke_uniform_subdivide(gpd, gps_to, gps_from->totpoints, true); + } + if (gps_to->totpoints > gps_from->totpoints) { + BKE_gpencil_stroke_uniform_subdivide(gpd, gps_from, gps_to->totpoints, true); + } + + /* Flip stroke. */ + if (flipmode == GP_INTERPOLATE_FLIP) { + BKE_gpencil_stroke_flip(gps_to); + } + else if (flipmode == GP_INTERPOLATE_FLIPAUTO) { + if (gpencil_stroke_need_flip(depsgraph, ob, gpl, &gsc, gps_from, gps_to)) { + BKE_gpencil_stroke_flip(gps_to); + } + } + + /* Insert the pair entry in the hash table. */ + BLI_ghash_insert(pair_strokes, gps_from, gps_to); + } + + /* Loop over intermediary frames and create the interpolation. */ + for (int cframe = prevFrame->framenum + step; cframe < nextFrame->framenum; cframe += step) { + /* Get interpolation factor. */ float framerange = nextFrame->framenum - prevFrame->framenum; CLAMP_MIN(framerange, 1.0f); - factor = (float)(cframe - prevFrame->framenum) / framerange; + float factor = (float)(cframe - prevFrame->framenum) / framerange; - if (ipo_settings->type == GP_IPO_CURVEMAP) { + if (type == GP_IPO_CURVEMAP) { /* custom curvemap */ if (ipo_settings->custom_ipo) { factor = BKE_curvemapping_evaluateF(ipo_settings->custom_ipo, 0, factor); } else { BKE_report(op->reports, RPT_ERROR, "Custom interpolation curve does not exist"); + continue; } } - else if (ipo_settings->type >= GP_IPO_BACK) { + else if (type >= GP_IPO_BACK) { /* easing equation... */ - factor = gpencil_interpolate_seq_easing_calc(ipo_settings, factor); + factor = gpencil_interpolate_seq_easing_calc(op, factor); } - /* create new strokes data with interpolated points reading original stroke */ - for (gps_from = prevFrame->strokes.first; gps_from; gps_from = gps_from->next) { + /* Apply the factor to all pair of strokes. */ + GHashIterator gh_iter; + GHASH_ITER (gh_iter, pair_strokes) { + bGPDstroke *gps_from = (bGPDstroke *)BLI_ghashIterator_getKey(&gh_iter); + bGPDstroke *gps_to = (bGPDstroke *)BLI_ghashIterator_getValue(&gh_iter); - /* only selected */ - if ((GPENCIL_EDIT_MODE(gpd)) && (flag & GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED) && - ((gps_from->flag & GP_STROKE_SELECT) == 0)) { - continue; - } - /* skip strokes that are invalid for current view */ - if (ED_gpencil_stroke_can_use(C, gps_from) == false) { - continue; - } - /* check if the color is editable */ - if (ED_gpencil_stroke_material_editable(ob, gpl, gps_from) == false) { - continue; - } - - /* get final stroke to interpolate */ - fFrame = BLI_findindex(&prevFrame->strokes, gps_from); - gps_to = BLI_findlink(&nextFrame->strokes, fFrame); - if (gps_to == NULL) { - continue; - } - - /* create a new frame if needed */ - if (interFrame == NULL) { - interFrame = BKE_gpencil_layer_frame_get(gpl, cframe, GP_GETFRAME_ADD_NEW); - interFrame->key_type = BEZT_KEYTYPE_BREAKDOWN; - } - - /* if destination stroke is smaller, resize new_stroke to size of gps_to stroke */ - if (gps_from->totpoints > gps_to->totpoints) { - BKE_gpencil_stroke_uniform_subdivide(gpd, gps_to, gps_from->totpoints, true); - } - if (gps_to->totpoints > gps_from->totpoints) { - BKE_gpencil_stroke_uniform_subdivide(gpd, gps_from, gps_to->totpoints, true); - } - - /* create new stroke */ + /* Create new stroke. */ bGPDstroke *new_stroke = BKE_gpencil_stroke_duplicate(gps_from, true, true); + new_stroke->flag |= GP_STROKE_TAG; + new_stroke->select_index = 0; - /* update points position */ + /* Update points position. */ gpencil_interpolate_update_points(gps_from, gps_to, new_stroke, factor); + gpencil_interpolate_smooth_stroke(new_stroke, smooth_factor, smooth_steps); /* Calc geometry data. */ BKE_gpencil_stroke_geometry_update(gpd, new_stroke); - /* add to strokes */ + /* Add strokes to frame. */ + bGPDframe *interFrame = BKE_gpencil_layer_frame_get(gpl, cframe, GP_GETFRAME_ADD_NEW); + interFrame->key_type = BEZT_KEYTYPE_BREAKDOWN; + BLI_addtail(&interFrame->strokes, new_stroke); } } + /* Free Hash tablets. */ + if (used_strokes != NULL) { + BLI_ghash_free(used_strokes, NULL, NULL); + } + if (pair_strokes != NULL) { + BLI_ghash_free(pair_strokes, NULL, NULL); + } + BKE_gpencil_free_strokes(prevFrame); BKE_gpencil_free_strokes(nextFrame); MEM_SAFE_FREE(prevFrame); @@ -1100,8 +1415,152 @@ static int gpencil_interpolate_seq_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static void gpencil_interpolate_seq_ui(bContext *C, wmOperator *op) +{ + uiLayout *layout = op->layout; + uiLayout *col, *row; + PointerRNA ptr; + + RNA_pointer_create(NULL, op->type->srna, op->properties, &ptr); + + const eGP_Interpolate_Type type = RNA_enum_get(op->ptr, "type"); + + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + + col = uiLayoutColumn(layout, true); + uiItemR(col, &ptr, "step", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "layers", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "interpolate_selected_only", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "flip", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "smooth_factor", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "smooth_steps", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "type", 0, NULL, ICON_NONE); + + if (type == GP_IPO_CURVEMAP) { + /* Get an RNA pointer to ToolSettings to give to the custom curve. */ + Scene *scene = CTX_data_scene(C); + ToolSettings *ts = scene->toolsettings; + PointerRNA gpsettings_ptr; + RNA_pointer_create( + &scene->id, &RNA_GPencilInterpolateSettings, &ts->gp_interpolate, &gpsettings_ptr); + uiTemplateCurveMapping( + layout, &gpsettings_ptr, "interpolation_curve", 0, false, true, true, false); + } + else if (type != GP_IPO_LINEAR) { + row = uiLayoutRow(layout, false); + uiItemR(row, &ptr, "easing", 0, NULL, ICON_NONE); + if (type == GP_IPO_BACK) { + row = uiLayoutRow(layout, false); + uiItemR(row, &ptr, "back", 0, NULL, ICON_NONE); + } + else if (type == GP_IPO_ELASTIC) { + row = uiLayoutRow(layout, false); + uiItemR(row, &ptr, "amplitude", 0, NULL, ICON_NONE); + row = uiLayoutRow(layout, false); + uiItemR(row, &ptr, "period", 0, NULL, ICON_NONE); + } + } +} + void GPENCIL_OT_interpolate_sequence(wmOperatorType *ot) { + static const EnumPropertyItem gpencil_interpolation_layer_items[] = { + {0, "ACTIVE", 0, "Active", ""}, + {1, "ALL", 0, "All Layers", ""}, + {0, NULL, 0, NULL, NULL}, + }; + + /** + * \note this is a near exact duplicate of #rna_enum_beztriple_interpolation_mode_items, + * Changes here will likely apply there too. + */ + static const EnumPropertyItem gpencil_interpolation_type_items[] = { + /* interpolation */ + {0, "", 0, N_("Interpolation"), "Standard transitions between keyframes"}, + {GP_IPO_LINEAR, + "LINEAR", + ICON_IPO_LINEAR, + "Linear", + "Straight-line interpolation between A and B (i.e. no ease in/out)"}, + {GP_IPO_CURVEMAP, + "CUSTOM", + ICON_IPO_BEZIER, + "Custom", + "Custom interpolation defined using a curve map"}, + + /* easing */ + {0, + "", + 0, + N_("Easing (by strength)"), + "Predefined inertial transitions, useful for motion graphics (from least to most " + "''dramatic'')"}, + {GP_IPO_SINE, + "SINE", + ICON_IPO_SINE, + "Sinusoidal", + "Sinusoidal easing (weakest, almost linear but with a slight curvature)"}, + {GP_IPO_QUAD, "QUAD", ICON_IPO_QUAD, "Quadratic", "Quadratic easing"}, + {GP_IPO_CUBIC, "CUBIC", ICON_IPO_CUBIC, "Cubic", "Cubic easing"}, + {GP_IPO_QUART, "QUART", ICON_IPO_QUART, "Quartic", "Quartic easing"}, + {GP_IPO_QUINT, "QUINT", ICON_IPO_QUINT, "Quintic", "Quintic easing"}, + {GP_IPO_EXPO, "EXPO", ICON_IPO_EXPO, "Exponential", "Exponential easing (dramatic)"}, + {GP_IPO_CIRC, + "CIRC", + ICON_IPO_CIRC, + "Circular", + "Circular easing (strongest and most dynamic)"}, + + {0, "", 0, N_("Dynamic Effects"), "Simple physics-inspired easing effects"}, + {GP_IPO_BACK, "BACK", ICON_IPO_BACK, "Back", "Cubic easing with overshoot and settle"}, + {GP_IPO_BOUNCE, + "BOUNCE", + ICON_IPO_BOUNCE, + "Bounce", + "Exponentially decaying parabolic bounce, like when objects collide"}, + {GP_IPO_ELASTIC, + "ELASTIC", + ICON_IPO_ELASTIC, + "Elastic", + "Exponentially decaying sine wave, like an elastic band"}, + + {0, NULL, 0, NULL, NULL}, + }; + + static const EnumPropertyItem gpencil_interpolation_easing_items[] = { + {BEZT_IPO_EASE_AUTO, + "AUTO", + ICON_IPO_EASE_IN_OUT, + "Automatic Easing", + "Easing type is chosen automatically based on what the type of interpolation used " + "(e.g. 'Ease In' for transitional types, and 'Ease Out' for dynamic effects)"}, + + {BEZT_IPO_EASE_IN, + "EASE_IN", + ICON_IPO_EASE_IN, + "Ease In", + "Only on the end closest to the next keyframe"}, + {BEZT_IPO_EASE_OUT, + "EASE_OUT", + ICON_IPO_EASE_OUT, + "Ease Out", + "Only on the end closest to the first keyframe"}, + {BEZT_IPO_EASE_IN_OUT, + "EASE_IN_OUT", + ICON_IPO_EASE_IN_OUT, + "Ease In and Out", + "Segment between both keyframes"}, + {0, NULL, 0, NULL, NULL}, + }; + + static const EnumPropertyItem flip_modes[] = { + {GP_INTERPOLATE_NOFLIP, "NOFLIP", 0, "No Flip", ""}, + {GP_INTERPOLATE_FLIP, "FLIP", 0, "Flip", ""}, + {GP_INTERPOLATE_FLIPAUTO, "AUTO", 0, "Automatic", ""}, + {0, NULL, 0, NULL, NULL}, + }; + /* identifiers */ ot->name = "Interpolate Sequence"; ot->idname = "GPENCIL_OT_interpolate_sequence"; @@ -1110,6 +1569,103 @@ void GPENCIL_OT_interpolate_sequence(wmOperatorType *ot) /* api callbacks */ ot->exec = gpencil_interpolate_seq_exec; ot->poll = gpencil_view3d_poll; + ot->ui = gpencil_interpolate_seq_ui; + + RNA_def_int(ot->srna, + "step", + 1, + 1, + MAXFRAME, + "Step", + "Number of frames between generated interpolated frames", + 1, + MAXFRAME); + + RNA_def_enum(ot->srna, + "layers", + gpencil_interpolation_layer_items, + 0, + "Layer", + "Layers included in the interpolation"); + + RNA_def_boolean(ot->srna, + "interpolate_selected_only", + 0, + "Only Selected", + "Interpolate only selected strokes"); + + RNA_def_enum(ot->srna, + "flip", + flip_modes, + GP_INTERPOLATE_FLIPAUTO, + "Flip Mode", + "Invert destination stroke to match start and end with source stroke"); + + RNA_def_int(ot->srna, + "smooth_steps", + 1, + 1, + 3, + "Iterations", + "Number of times to smooth newly created strokes", + 1, + 3); + + RNA_def_float(ot->srna, + "smooth_factor", + 0.0f, + 0.0f, + 2.0f, + "Smooth", + "Amount of smoothing to apply to interpolated strokes, to reduce jitter/noise", + 0.0f, + 2.0f); + + RNA_def_enum(ot->srna, + "type", + gpencil_interpolation_type_items, + 0, + "Type", + "Interpolation method to use the next time 'Interpolate Sequence' is run"); + + RNA_def_enum( + ot->srna, + "easing", + gpencil_interpolation_easing_items, + 0, + "Easing", + "Which ends of the segment between the preceding and following grease pencil frames " + "easing interpolation is applied to"); + + RNA_def_float(ot->srna, + "back", + 1.702f, + 0.0f, + FLT_MAX, + "Back", + "Amount of overshoot for 'back' easing", + 0.0f, + FLT_MAX); + + RNA_def_float(ot->srna, + "amplitude", + 0.15f, + 0.0f, + FLT_MAX, + "Amplitude", + "Amount to boost elastic bounces for 'elastic' easing", + 0.0f, + FLT_MAX); + + RNA_def_float(ot->srna, + "period", + 0.15f, + -FLT_MAX, + FLT_MAX, + "Period", + "Time between bounces for elastic easing", + -FLT_MAX, + FLT_MAX); /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; @@ -1119,19 +1675,30 @@ void GPENCIL_OT_interpolate_sequence(wmOperatorType *ot) static bool gpencil_interpolate_reverse_poll(bContext *C) { - if (!gpencil_view3d_poll(C)) { - return 0; + ScrArea *area = CTX_wm_area(C); + if (area == NULL) { + return false; + } + if ((area->spacetype != SPACE_VIEW3D) && (area->spacetype != SPACE_ACTION)) { + return false; } - bGPDlayer *gpl = CTX_data_active_gpencil_layer(C); + bGPdata *gpd = ED_gpencil_data_get_active(C); + if (gpd == NULL) { + return false; + } + bGPDlayer *gpl = BKE_gpencil_layer_active_get(gpd); + if (gpl == NULL) { + return false; + } /* need to be on a breakdown frame */ if ((gpl->actframe == NULL) || (gpl->actframe->key_type != BEZT_KEYTYPE_BREAKDOWN)) { CTX_wm_operator_poll_msg_set(C, "Expected current frame to be a breakdown"); - return 0; + return false; } - return 1; + return true; } static int gpencil_interpolate_reverse_exec(bContext *C, wmOperator *UNUSED(op)) @@ -1141,7 +1708,11 @@ static int gpencil_interpolate_reverse_exec(bContext *C, wmOperator *UNUSED(op)) /* Go through each layer, deleting the breakdowns around the current frame, * but only if there is a keyframe nearby to stop at */ - CTX_DATA_BEGIN (C, bGPDlayer *, gpl, editable_gpencil_layers) { + LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { + /* only editable and visible layers are considered */ + if (!BKE_gpencil_layer_is_editable(gpl) || (gpl->actframe == NULL)) { + continue; + } bGPDframe *start_key = NULL; bGPDframe *end_key = NULL; bGPDframe *gpf, *gpfn; @@ -1202,7 +1773,6 @@ static int gpencil_interpolate_reverse_exec(bContext *C, wmOperator *UNUSED(op)) BLI_freelinkN(&gpl->frames, end_key); } } - CTX_DATA_END; /* notifiers */ DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); @@ -1214,7 +1784,7 @@ static int gpencil_interpolate_reverse_exec(bContext *C, wmOperator *UNUSED(op)) void GPENCIL_OT_interpolate_reverse(wmOperatorType *ot) { /* identifiers */ - ot->name = "Remove Breakdowns"; + ot->name = "Delete Breakdowns"; ot->idname = "GPENCIL_OT_interpolate_reverse"; ot->description = "Remove breakdown frames generated by interpolating between two Grease Pencil frames"; @@ -1226,5 +1796,3 @@ void GPENCIL_OT_interpolate_reverse(wmOperatorType *ot) /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } - -/* *************************************************************** */ diff --git a/source/blender/editors/gpencil/gpencil_merge.c b/source/blender/editors/gpencil/gpencil_merge.c index 272dff56291..259b2882589 100644 --- a/source/blender/editors/gpencil/gpencil_merge.c +++ b/source/blender/editors/gpencil/gpencil_merge.c @@ -48,12 +48,9 @@ #include "RNA_define.h" #include "ED_gpencil.h" -#include "ED_object.h" #include "ED_screen.h" -#include "ED_view3d.h" #include "DEG_depsgraph.h" -#include "DEG_depsgraph_query.h" #include "gpencil_intern.h" @@ -107,6 +104,7 @@ static bGPDstroke *gpencil_prepare_stroke(bContext *C, wmOperator *op, int totpo Main *bmain = CTX_data_main(C); ToolSettings *ts = CTX_data_tool_settings(C); Object *ob = CTX_data_active_object(C); + bGPdata *gpd = ob->data; bGPDlayer *gpl = CTX_data_active_gpencil_layer(C); Scene *scene = CTX_data_scene(C); @@ -136,6 +134,7 @@ static bGPDstroke *gpencil_prepare_stroke(bContext *C, wmOperator *op, int totpo /* stroke */ bGPDstroke *gps = BKE_gpencil_stroke_new(MAX2(ob->actcol - 1, 0), totpoints, brush->size); gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps); if (cyclic) { gps->flag |= GP_STROKE_CYCLIC; @@ -244,6 +243,7 @@ static void gpencil_calc_points_factor(bContext *C, } } gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); } } } diff --git a/source/blender/editors/gpencil/gpencil_mesh.c b/source/blender/editors/gpencil/gpencil_mesh.c index 53beaeaa6a0..7e6b42f284b 100644 --- a/source/blender/editors/gpencil/gpencil_mesh.c +++ b/source/blender/editors/gpencil/gpencil_mesh.c @@ -36,8 +36,6 @@ #include "BKE_anim_data.h" #include "BKE_context.h" #include "BKE_duplilist.h" -#include "BKE_global.h" -#include "BKE_gpencil.h" #include "BKE_gpencil_geom.h" #include "BKE_layer.h" #include "BKE_main.h" @@ -320,7 +318,7 @@ static int gpencil_bake_mesh_animation_exec(bContext *C, wmOperator *op) use_seams, use_faces); - /* Reproject all untaged created strokes. */ + /* Reproject all un-tagged created strokes. */ if (project_type != GP_REPROJECT_KEEP) { LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { bGPDframe *gpf = gpl->actframe; diff --git a/source/blender/editors/gpencil/gpencil_ops.c b/source/blender/editors/gpencil/gpencil_ops.c index 0a29b83bc4f..1a6cb5670c4 100644 --- a/source/blender/editors/gpencil/gpencil_ops.c +++ b/source/blender/editors/gpencil/gpencil_ops.c @@ -27,9 +27,7 @@ #include "BLI_sys_types.h" -#include "BKE_brush.h" #include "BKE_context.h" -#include "BKE_gpencil.h" #include "BKE_paint.h" #include "DNA_brush_types.h" @@ -45,9 +43,6 @@ #include "RNA_access.h" #include "ED_gpencil.h" -#include "ED_object.h" -#include "ED_select_utils.h" -#include "ED_transform.h" #include "gpencil_intern.h" diff --git a/source/blender/editors/gpencil/gpencil_ops_versioning.c b/source/blender/editors/gpencil/gpencil_ops_versioning.c index 815bbbaa254..45842c28dff 100644 --- a/source/blender/editors/gpencil/gpencil_ops_versioning.c +++ b/source/blender/editors/gpencil/gpencil_ops_versioning.c @@ -34,16 +34,12 @@ #include "DNA_gpencil_types.h" #include "DNA_material_types.h" -#include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "BKE_brush.h" #include "BKE_context.h" -#include "BKE_deform.h" #include "BKE_gpencil.h" #include "BKE_main.h" -#include "BKE_material.h" #include "BKE_object.h" #include "WM_api.h" @@ -53,7 +49,6 @@ #include "RNA_define.h" #include "ED_gpencil.h" -#include "ED_object.h" #include "DEG_depsgraph.h" #include "DEG_depsgraph_query.h" diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c index 2d5491e7569..974f51ff90b 100644 --- a/source/blender/editors/gpencil/gpencil_paint.c +++ b/source/blender/editors/gpencil/gpencil_paint.c @@ -149,9 +149,9 @@ typedef struct tGPsdata { Scene *scene; struct Depsgraph *depsgraph; - /** current object. */ + /** Current object. */ Object *ob; - /** Obeject eval. */ + /** Evaluated object. */ Object *ob_eval; /** window where painting originated. */ wmWindow *win; @@ -1087,7 +1087,8 @@ static void gpencil_stroke_newfrombuffer(tGPsdata *p) } /* If camera view or view projection, reproject flat to view to avoid perspective effect. */ - if (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera) { + if ((!is_depth) && + (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || (is_camera))) { ED_gpencil_project_stroke_to_view(p->C, p->gpl, gps); } } @@ -1236,7 +1237,7 @@ static void gpencil_stroke_newfrombuffer(tGPsdata *p) /* change position relative to parent object */ gpencil_apply_parent(depsgraph, obact, gpl, gps); /* If camera view or view projection, reproject flat to view to avoid perspective effect. */ - if (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera) { + if ((!is_depth) && (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera)) { ED_gpencil_project_stroke_to_view(p->C, p->gpl, gps); } @@ -1306,6 +1307,12 @@ static void gpencil_stroke_newfrombuffer(tGPsdata *p) /* Calc geometry data. */ BKE_gpencil_stroke_geometry_update(gpd, gps); + /* In Multiframe mode, duplicate the stroke in other frames. */ + if (GPENCIL_MULTIEDIT_SESSIONS_ON(p->gpd)) { + const bool tail = (ts->gpencil_flags & GP_TOOL_FLAG_PAINT_ONBACK); + BKE_gpencil_stroke_copy_to_keyframes(gpd, gpl, p->gpf, gps, tail); + } + gpencil_stroke_added_enable(p); } @@ -1323,10 +1330,8 @@ static float view3d_point_depth(const RegionView3D *rv3d, const float co[3]) } /* only erase stroke points that are visible */ -static bool gpencil_stroke_eraser_is_occluded(tGPsdata *p, - const bGPDspoint *pt, - const int x, - const int y) +static bool gpencil_stroke_eraser_is_occluded( + tGPsdata *p, bGPDlayer *gpl, const bGPDspoint *pt, const int x, const int y) { Object *obact = (Object *)p->ownerPtr.data; Brush *brush = p->brush; @@ -1343,7 +1348,6 @@ static bool gpencil_stroke_eraser_is_occluded(tGPsdata *p, if ((gp_settings != NULL) && (p->area->spacetype == SPACE_VIEW3D) && (gp_settings->flag & GP_BRUSH_OCCLUDE_ERASER)) { RegionView3D *rv3d = p->region->regiondata; - bGPDlayer *gpl = p->gpl; const int mval_i[2] = {x, y}; float mval_3d[3]; @@ -1454,6 +1458,7 @@ static void gpencil_stroke_soft_refine(bGPDstroke *gps) /* eraser tool - evaluation per stroke */ static void gpencil_stroke_eraser_dostroke(tGPsdata *p, + bGPDlayer *gpl, bGPDframe *gpf, bGPDstroke *gps, const float mval[2], @@ -1579,9 +1584,9 @@ static void gpencil_stroke_eraser_dostroke(tGPsdata *p, * - this assumes that linewidth is irrelevant */ if (gpencil_stroke_inside_circle(mval, radius, pc0[0], pc0[1], pc2[0], pc2[1])) { - if ((gpencil_stroke_eraser_is_occluded(p, pt0, pc0[0], pc0[1]) == false) || - (gpencil_stroke_eraser_is_occluded(p, pt1, pc1[0], pc1[1]) == false) || - (gpencil_stroke_eraser_is_occluded(p, pt2, pc2[0], pc2[1]) == false)) { + if ((gpencil_stroke_eraser_is_occluded(p, gpl, pt0, pc0[0], pc0[1]) == false) || + (gpencil_stroke_eraser_is_occluded(p, gpl, pt1, pc1[0], pc1[1]) == false) || + (gpencil_stroke_eraser_is_occluded(p, gpl, pt2, pc2[0], pc2[1]) == false)) { /* Point is affected: */ /* Adjust thickness * - Influence of eraser falls off with distance from the middle of the eraser @@ -1683,6 +1688,8 @@ static void gpencil_stroke_eraser_dostroke(tGPsdata *p, /* erase strokes which fall under the eraser strokes */ static void gpencil_stroke_doeraser(tGPsdata *p) { + const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(p->gpd); + rcti rect; Brush *brush = p->brush; Brush *eraser = p->eraser; @@ -1723,40 +1730,53 @@ static void gpencil_stroke_doeraser(tGPsdata *p) * on multiple layers... */ LISTBASE_FOREACH (bGPDlayer *, gpl, &p->gpd->layers) { - bGPDframe *gpf = gpl->actframe; - /* only affect layer if it's editable (and visible) */ if (BKE_gpencil_layer_is_editable(gpl) == false) { continue; } - if (gpf == NULL) { + + bGPDframe *init_gpf = (is_multiedit) ? gpl->frames.first : gpl->actframe; + if (init_gpf == NULL) { continue; } - /* calculate difference matrix */ - BKE_gpencil_layer_transform_matrix_get(p->depsgraph, p->ob, gpl, p->diff_mat); - /* loop over strokes, checking segments for intersections */ - LISTBASE_FOREACH_MUTABLE (bGPDstroke *, gps, &gpf->strokes) { - /* check if the color is editable */ - if (ED_gpencil_stroke_material_editable(p->ob, gpl, gps) == false) { - continue; - } + for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) { + if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) { + if (gpf == NULL) { + continue; + } + /* calculate difference matrix */ + BKE_gpencil_layer_transform_matrix_get(p->depsgraph, p->ob, gpl, p->diff_mat); - /* Check if the stroke collide with mouse. */ - if (!ED_gpencil_stroke_check_collision(&p->gsc, gps, p->mval, calc_radius, p->diff_mat)) { - continue; - } + /* loop over strokes, checking segments for intersections */ + LISTBASE_FOREACH_MUTABLE (bGPDstroke *, gps, &gpf->strokes) { + /* check if the color is editable */ + if (ED_gpencil_stroke_material_editable(p->ob, gpl, gps) == false) { + continue; + } - /* Not all strokes in the datablock may be valid in the current editor/context - * (e.g. 2D space strokes in the 3D view, if the same datablock is shared) - */ - if (ED_gpencil_stroke_can_use_direct(p->area, gps)) { - gpencil_stroke_eraser_dostroke(p, gpf, gps, p->mval, calc_radius, &rect); + /* Check if the stroke collide with mouse. */ + if (!ED_gpencil_stroke_check_collision( + &p->gsc, gps, p->mval, calc_radius, p->diff_mat)) { + continue; + } + + /* Not all strokes in the datablock may be valid in the current editor/context + * (e.g. 2D space strokes in the 3D view, if the same datablock is shared) + */ + if (ED_gpencil_stroke_can_use_direct(p->area, gps)) { + gpencil_stroke_eraser_dostroke(p, gpl, gpf, gps, p->mval, calc_radius, &rect); + } + } + + /* if not multiedit, exit loop*/ + if (!is_multiedit) { + break; + } } } } } - /* ******************************************* */ /* Sketching Operator */ @@ -1857,7 +1877,7 @@ static void gpencil_init_drawing_brush(bContext *C, tGPsdata *p) BKE_brush_gpencil_paint_presets(bmain, ts, true); changed = true; } - /* Be sure curves are initializated. */ + /* Be sure curves are initialized. */ BKE_curvemapping_init(paint->brush->gpencil_settings->curve_sensitivity); BKE_curvemapping_init(paint->brush->gpencil_settings->curve_strength); BKE_curvemapping_init(paint->brush->gpencil_settings->curve_jitter); @@ -1868,7 +1888,7 @@ static void gpencil_init_drawing_brush(bContext *C, tGPsdata *p) BKE_curvemapping_init(paint->brush->gpencil_settings->curve_rand_saturation); BKE_curvemapping_init(paint->brush->gpencil_settings->curve_rand_value); - /* assign to temp tGPsdata */ + /* Assign to temp #tGPsdata */ p->brush = paint->brush; if (paint->brush->gpencil_tool != GPAINT_TOOL_ERASE) { p->eraser = gpencil_get_default_eraser(p->bmain, ts); diff --git a/source/blender/editors/gpencil/gpencil_primitive.c b/source/blender/editors/gpencil/gpencil_primitive.c index d94a02204a2..12d399f32ca 100644 --- a/source/blender/editors/gpencil/gpencil_primitive.c +++ b/source/blender/editors/gpencil/gpencil_primitive.c @@ -338,6 +338,7 @@ static void gpencil_primitive_set_initdata(bContext *C, tGPDprimitive *tgpi) ED_gpencil_fill_vertex_color_set(ts, brush, gps); gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); /* the polygon must be closed, so enabled cyclic */ if (ELEM(tgpi->type, GP_STROKE_BOX, GP_STROKE_CIRCLE)) { gps->flag |= GP_STROKE_CYCLIC; @@ -1082,7 +1083,7 @@ static void gpencil_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi) } /* If camera view or view projection, reproject flat to view to avoid perspective effect. */ - if (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera) { + if ((!is_depth) && (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || (is_camera))) { ED_gpencil_project_stroke_to_view(C, tgpi->gpl, gps); } @@ -1276,7 +1277,7 @@ static int gpencil_primitive_invoke(bContext *C, wmOperator *op, const wmEvent * /* set cursor to indicate modal */ WM_cursor_modal_set(win, WM_CURSOR_CROSS); - /* update sindicator in header */ + /* Updates indicator in header. */ gpencil_primitive_status_indicators(C, tgpi); DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); WM_event_add_notifier(C, NC_GPENCIL | NA_EDITED, NULL); @@ -1377,6 +1378,12 @@ static void gpencil_primitive_interaction_end(bContext *C, BKE_gpencil_stroke_geometry_update(tgpi->gpd, gps); } + /* In Multiframe mode, duplicate the stroke in other frames. */ + if (GPENCIL_MULTIEDIT_SESSIONS_ON(tgpi->gpd)) { + const bool tail = (ts->gpencil_flags & GP_TOOL_FLAG_PAINT_ONBACK); + BKE_gpencil_stroke_copy_to_keyframes(tgpi->gpd, tgpi->gpl, gpf, gps, tail); + } + DEG_id_tag_update(&tgpi->gpd->id, ID_RECALC_COPY_ON_WRITE); DEG_id_tag_update(&tgpi->gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); diff --git a/source/blender/editors/gpencil/gpencil_select.c b/source/blender/editors/gpencil/gpencil_select.c index a00d21bf88a..aab08e9c8c4 100644 --- a/source/blender/editors/gpencil/gpencil_select.c +++ b/source/blender/editors/gpencil/gpencil_select.c @@ -120,7 +120,8 @@ static bool gpencil_select_poll(bContext *C) } } - /* we just need some visible strokes, and to be in editmode or other modes only to catch event */ + /* We just need some visible strokes, + * and to be in edit-mode or other modes only to catch event. */ if (GPENCIL_ANY_MODE(gpd)) { /* TODO: include a check for visible strokes? */ if (gpd->layers.first) { @@ -155,6 +156,11 @@ static bool gpencil_3d_point_to_screen_space(ARegion *region, /* helper to deselect all selected strokes/points */ static void deselect_all_selected(bContext *C) { + /* Set selection index to 0. */ + Object *ob = CTX_data_active_object(C); + bGPdata *gpd = ob->data; + gpd->select_last_index = 0; + CTX_DATA_BEGIN (C, bGPDstroke *, gps, editable_gpencil_strokes) { /* deselect stroke and its points if selected */ if (gps->flag & GP_STROKE_SELECT) { @@ -168,6 +174,7 @@ static void deselect_all_selected(bContext *C) /* deselect stroke itself too */ gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); } /* deselect curve and curve points */ @@ -186,7 +193,7 @@ static void deselect_all_selected(bContext *C) CTX_DATA_END; } -static void select_all_curve_points(bGPDstroke *gps, bGPDcurve *gpc, bool deselect) +static void select_all_curve_points(bGPdata *gpd, bGPDstroke *gps, bGPDcurve *gpc, bool deselect) { for (int i = 0; i < gpc->tot_curve_points; i++) { bGPDcurve_point *gpc_pt = &gpc->curve_points[i]; @@ -204,10 +211,12 @@ static void select_all_curve_points(bGPDstroke *gps, bGPDcurve *gpc, bool desele if (deselect == false) { gpc->flag |= GP_CURVE_SELECT; gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps); } else { gpc->flag &= ~GP_CURVE_SELECT; gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); } } @@ -220,7 +229,8 @@ static bool gpencil_select_all_poll(bContext *C) { bGPdata *gpd = ED_gpencil_data_get_active(C); - /* we just need some visible strokes, and to be in editmode or other modes only to catch event */ + /* We just need some visible strokes, + * and to be in edit-mode or other modes only to catch event. */ if (GPENCIL_ANY_MODE(gpd)) { if (gpd->layers.first) { return true; @@ -241,7 +251,7 @@ static int gpencil_select_all_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - /* if not edit/sculpt mode, the event is catched but not processed */ + /* If not edit/sculpt mode, the event has been caught but not processed. */ if (GPENCIL_NONE_EDIT_MODE(gpd)) { return OPERATOR_CANCELLED; } @@ -305,7 +315,7 @@ static int gpencil_select_linked_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - /* if not edit/sculpt mode, the event is catched but not processed */ + /* If not edit/sculpt mode, the event has been caught but not processed. */ if (GPENCIL_NONE_EDIT_MODE(gpd)) { return OPERATOR_CANCELLED; } @@ -382,7 +392,7 @@ static int gpencil_select_alternate_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - /* if not edit/sculpt mode, the event is catched but not processed */ + /* If not edit/sculpt mode, the event has been caught but not processed. */ if (GPENCIL_NONE_EDIT_MODE(gpd)) { return OPERATOR_CANCELLED; } @@ -421,7 +431,7 @@ static int gpencil_select_alternate_exec(bContext *C, wmOperator *op) BEZT_DESEL_ALL(&gpc_pt->bezt); } - BKE_gpencil_curve_sync_selection(gps); + BKE_gpencil_curve_sync_selection(gpd, gps); changed = true; } } @@ -560,6 +570,7 @@ static bool gpencil_select_same_layer(bContext *C) } gpc->flag |= GP_CURVE_SELECT; gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps); changed = true; } @@ -576,6 +587,7 @@ static bool gpencil_select_same_layer(bContext *C) } gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps); changed = true; } @@ -620,6 +632,7 @@ static bool gpencil_select_same_material(bContext *C) } gpc->flag |= GP_CURVE_SELECT; gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps); changed = true; } @@ -638,6 +651,7 @@ static bool gpencil_select_same_material(bContext *C) } gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps); changed = true; } @@ -645,7 +659,7 @@ static bool gpencil_select_same_material(bContext *C) CTX_DATA_END; } - /* free memomy */ + /* Free memory. */ if (selected_colors != NULL) { BLI_gset_free(selected_colors, NULL); } @@ -659,7 +673,7 @@ static int gpencil_select_grouped_exec(bContext *C, wmOperator *op) { eGP_SelectGrouped mode = RNA_enum_get(op->ptr, "type"); bGPdata *gpd = ED_gpencil_data_get_active(C); - /* if not edit/sculpt mode, the event is catched but not processed */ + /* If not edit/sculpt mode, the event has been caught but not processed. */ if (GPENCIL_NONE_EDIT_MODE(gpd)) { return OPERATOR_CANCELLED; } @@ -729,7 +743,7 @@ static int gpencil_select_first_exec(bContext *C, wmOperator *op) bGPdata *gpd = ED_gpencil_data_get_active(C); const bool is_curve_edit = (bool)GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd); - /* if not edit/sculpt mode, the event is catched but not processed */ + /* If not edit/sculpt mode, the event has been caught but not processed. */ if (GPENCIL_NONE_EDIT_MODE(gpd)) { return OPERATOR_CANCELLED; } @@ -754,6 +768,8 @@ static int gpencil_select_first_exec(bContext *C, wmOperator *op) BEZT_SEL_ALL(&gpc->curve_points[0].bezt); gpc->flag |= GP_CURVE_SELECT; gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps); + if ((extend == false) && (gps->totpoints > 1)) { for (int i = 1; i < gpc->tot_curve_points; i++) { bGPDcurve_point *gpc_pt = &gpc->curve_points[i]; @@ -767,6 +783,7 @@ static int gpencil_select_first_exec(bContext *C, wmOperator *op) else { gps->points->flag |= GP_SPOINT_SELECT; gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps); /* deselect rest? */ if ((extend == false) && (gps->totpoints > 1)) { @@ -836,7 +853,7 @@ static int gpencil_select_last_exec(bContext *C, wmOperator *op) bGPdata *gpd = ED_gpencil_data_get_active(C); const bool is_curve_edit = (bool)GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd); - /* if not edit/sculpt mode, the event is catched but not processed */ + /* If not edit/sculpt mode, the event has been caught but not processed. */ if (GPENCIL_NONE_EDIT_MODE(gpd)) { return OPERATOR_CANCELLED; } @@ -861,6 +878,7 @@ static int gpencil_select_last_exec(bContext *C, wmOperator *op) BEZT_SEL_ALL(&gpc->curve_points[gpc->tot_curve_points - 1].bezt); gpc->flag |= GP_CURVE_SELECT; gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps); if ((extend == false) && (gps->totpoints > 1)) { for (int i = 0; i < gpc->tot_curve_points - 1; i++) { bGPDcurve_point *gpc_pt = &gpc->curve_points[i]; @@ -874,6 +892,7 @@ static int gpencil_select_last_exec(bContext *C, wmOperator *op) else { gps->points[gps->totpoints - 1].flag |= GP_SPOINT_SELECT; gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps); /* deselect rest? */ if ((extend == false) && (gps->totpoints > 1)) { @@ -943,7 +962,7 @@ static int gpencil_select_more_exec(bContext *C, wmOperator *UNUSED(op)) { bGPdata *gpd = ED_gpencil_data_get_active(C); const bool is_curve_edit = (bool)GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd); - /* if not edit/sculpt mode, the event is catched but not processed */ + /* If not edit/sculpt mode, the event has been caught but not processed. */ if (GPENCIL_NONE_EDIT_MODE(gpd)) { return OPERATOR_CANCELLED; } @@ -1083,7 +1102,7 @@ static int gpencil_select_less_exec(bContext *C, wmOperator *UNUSED(op)) bGPdata *gpd = ED_gpencil_data_get_active(C); const bool is_curve_edit = (bool)GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd); - /* if not edit/sculpt mode, the event is catched but not processed */ + /* If not edit/sculpt mode, the event has been caught but not processed. */ if (GPENCIL_NONE_EDIT_MODE(gpd)) { return OPERATOR_CANCELLED; } @@ -1270,10 +1289,12 @@ static bool gpencil_stroke_do_circle_sel(bGPdata *gpd, if (select) { pt_active->flag |= GP_SPOINT_SELECT; gps_active->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps_active); } else { pt_active->flag &= ~GP_SPOINT_SELECT; gps_active->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps_active); } changed = true; /* if stroke mode, don't check more points */ @@ -1312,13 +1333,13 @@ static bool gpencil_stroke_do_circle_sel(bGPdata *gpd, BKE_gpencil_stroke_editcurve_update(gpd, gpl, gps_active); gps_active->flag |= GP_STROKE_NEEDS_CURVE_UPDATE; /* Select all curve points. */ - select_all_curve_points(gps_active, gps_active->editcurve, false); + select_all_curve_points(gpd, gps_active, gps_active->editcurve, false); BKE_gpencil_stroke_geometry_update(gpd, gps_active); changed = true; } /* Ensure that stroke selection is in sync with its points. */ - BKE_gpencil_stroke_sync_selection(gps_active); + BKE_gpencil_stroke_sync_selection(gpd, gps_active); return changed; } @@ -1336,6 +1357,9 @@ static bool gpencil_do_curve_circle_sel(bContext *C, { ARegion *region = CTX_wm_region(C); View3D *v3d = CTX_wm_view3d(C); + Object *ob = CTX_data_active_object(C); + bGPdata *gpd = ob->data; + const bool only_selected = (v3d->overlay.handle_display == CURVE_HANDLE_SELECTED); bool hit = false; @@ -1409,7 +1433,7 @@ static bool gpencil_do_curve_circle_sel(bContext *C, } } - BKE_gpencil_curve_sync_selection(gps); + BKE_gpencil_curve_sync_selection(gpd, gps); return hit; } @@ -1434,7 +1458,7 @@ static int gpencil_circle_select_exec(bContext *C, wmOperator *op) const float scale = ts->gp_sculpt.isect_threshold; - /* if not edit/sculpt mode, the event is catched but not processed */ + /* If not edit/sculpt mode, the event has been caught but not processed. */ if (GPENCIL_NONE_EDIT_MODE(gpd)) { return OPERATOR_CANCELLED; } @@ -1629,7 +1653,7 @@ static bool gpencil_stroke_fill_isect_rect(ARegion *region, #endif static bool gpencil_generic_curve_select(bContext *C, - Object *UNUSED(ob), + Object *ob, GPencilTestFn is_inside_fn, rcti UNUSED(box), GP_SelectUserData *user_data, @@ -1638,6 +1662,7 @@ static bool gpencil_generic_curve_select(bContext *C, { ARegion *region = CTX_wm_region(C); View3D *v3d = CTX_wm_view3d(C); + bGPdata *gpd = ob->data; const bool handle_only_selected = (v3d->overlay.handle_display == CURVE_HANDLE_SELECTED); const bool handle_all = (v3d->overlay.handle_display == CURVE_HANDLE_ALL); @@ -1769,7 +1794,7 @@ static bool gpencil_generic_curve_select(bContext *C, } } - BKE_gpencil_curve_sync_selection(gps); + BKE_gpencil_curve_sync_selection(gpd, gps); } GP_EDITABLE_CURVES_END(gps_iter); @@ -1795,6 +1820,8 @@ static bool gpencil_generic_stroke_select(bContext *C, /* deselect all strokes first? */ if (SEL_OP_USE_PRE_DESELECT(sel_op) || (GPENCIL_PAINT_MODE(gpd))) { + /* Set selection index to 0. */ + gpd->select_last_index = 0; CTX_DATA_BEGIN (C, bGPDstroke *, gps, editable_gpencil_strokes) { bGPDspoint *pt; @@ -1805,6 +1832,7 @@ static bool gpencil_generic_stroke_select(bContext *C, } gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); } CTX_DATA_END; @@ -1819,7 +1847,7 @@ static bool gpencil_generic_stroke_select(bContext *C, bGPDspoint *pt; int i; bool hit = false; - for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { + for (i = 0, pt = gps_active->points; i < gps_active->totpoints; i++, pt++) { bGPDspoint *pt_active = (pt->runtime.pt_orig) ? pt->runtime.pt_orig : pt; /* convert point coords to screenspace */ @@ -1889,13 +1917,13 @@ static bool gpencil_generic_stroke_select(bContext *C, BKE_gpencil_stroke_editcurve_update(gpd, gpl, gps_active); gps_active->flag |= GP_STROKE_NEEDS_CURVE_UPDATE; /* Select all curve points. */ - select_all_curve_points(gps_active, gps_active->editcurve, false); + select_all_curve_points(gpd, gps_active, gps_active->editcurve, false); BKE_gpencil_stroke_geometry_update(gpd, gps_active); changed = true; } /* Ensure that stroke selection is in sync with its points */ - BKE_gpencil_stroke_sync_selection(gps_active); + BKE_gpencil_stroke_sync_selection(gpd, gps_active); } GP_EVALUATED_STROKES_END(gpstroke_iter); @@ -2224,12 +2252,12 @@ static int gpencil_select_exec(bContext *C, wmOperator *op) int i; /* firstly, check for hit-point */ - for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { + for (i = 0, pt = gps_active->points; i < gps_active->totpoints; i++, pt++) { int xy[2]; bGPDspoint pt2; gpencil_point_to_parent_space(pt, gpstroke_iter.diff_mat, &pt2); - gpencil_point_to_xy(&gsc, gps, &pt2, &xy[0], &xy[1]); + gpencil_point_to_xy(&gsc, gps_active, &pt2, &xy[0], &xy[1]); /* do boundbox check first */ if (!ELEM(V2D_IS_CLIPPED, xy[0], xy[1])) { @@ -2311,7 +2339,7 @@ static int gpencil_select_exec(bContext *C, wmOperator *op) } /* select all curve points */ if (hit_curve != NULL) { - select_all_curve_points(hit_stroke, hit_curve, deselect); + select_all_curve_points(gpd, hit_stroke, hit_curve, deselect); } else { bGPDspoint *pt; @@ -2330,9 +2358,11 @@ static int gpencil_select_exec(bContext *C, wmOperator *op) /* stroke too... */ if (deselect == false) { hit_stroke->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, hit_stroke); } else { hit_stroke->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(hit_stroke); } } } @@ -2344,11 +2374,13 @@ static int gpencil_select_exec(bContext *C, wmOperator *op) BEZT_SEL_IDX(&hit_curve_point->bezt, hit_curve_handle); hit_curve->flag |= GP_CURVE_SELECT; hit_stroke->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, hit_stroke); } else { /* we're adding selection, so selection must be true */ hit_point->flag |= GP_SPOINT_SELECT; hit_stroke->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, hit_stroke); /* expand selection to segment */ int selectmode; @@ -2376,14 +2408,14 @@ static int gpencil_select_exec(bContext *C, wmOperator *op) if (!BEZT_ISSEL_ANY(&hit_curve_point->bezt)) { hit_curve_point->flag &= ~GP_CURVE_POINT_SELECT; } - BKE_gpencil_curve_sync_selection(hit_stroke); + BKE_gpencil_curve_sync_selection(gpd, hit_stroke); } else { /* deselect point */ hit_point->flag &= ~GP_SPOINT_SELECT; /* ensure that stroke is selected correctly */ - BKE_gpencil_stroke_sync_selection(hit_stroke); + BKE_gpencil_stroke_sync_selection(gpd, hit_stroke); } } } @@ -2570,6 +2602,7 @@ static int gpencil_select_vertex_color_exec(bContext *C, wmOperator *op) if (gps_selected) { gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps); /* Extend stroke selection. */ if (selectmode == GP_SELECTMODE_STROKE) { diff --git a/source/blender/editors/gpencil/gpencil_trace_ops.c b/source/blender/editors/gpencil/gpencil_trace_ops.c index 8d3ae9567cf..0f344909692 100644 --- a/source/blender/editors/gpencil/gpencil_trace_ops.c +++ b/source/blender/editors/gpencil/gpencil_trace_ops.c @@ -23,7 +23,6 @@ #include "MEM_guardedalloc.h" -#include "BLI_blenlib.h" #include "BLI_math.h" #include "BLT_translation.h" @@ -31,34 +30,26 @@ #include "DNA_gpencil_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" -#include "DNA_space_types.h" #include "BKE_context.h" -#include "BKE_duplilist.h" #include "BKE_global.h" #include "BKE_gpencil.h" #include "BKE_image.h" #include "BKE_layer.h" #include "BKE_lib_id.h" #include "BKE_main.h" -#include "BKE_material.h" #include "BKE_object.h" #include "BKE_report.h" #include "DEG_depsgraph.h" #include "DEG_depsgraph_query.h" -#include "UI_interface.h" -#include "UI_resources.h" - #include "WM_api.h" #include "WM_types.h" #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_enum_types.h" -#include "IMB_imbuf.h" #include "IMB_imbuf_types.h" #include "ED_gpencil.h" @@ -66,7 +57,6 @@ #include "gpencil_intern.h" #include "gpencil_trace.h" -#include "potracelib.h" typedef struct TraceJob { /* from wmJob */ diff --git a/source/blender/editors/gpencil/gpencil_undo.c b/source/blender/editors/gpencil/gpencil_undo.c index 4e172104ce7..ede1d3eefaa 100644 --- a/source/blender/editors/gpencil/gpencil_undo.c +++ b/source/blender/editors/gpencil/gpencil_undo.c @@ -62,19 +62,23 @@ int ED_gpencil_session_active(void) return (BLI_listbase_is_empty(&undo_nodes) == false); } -int ED_undo_gpencil_step(bContext *C, const eUndoStepDir step) +/** + * \param step: eUndoStepDir. + */ +int ED_undo_gpencil_step(bContext *C, const int step) { bGPdata **gpd_ptr = NULL, *new_gpd = NULL; gpd_ptr = ED_gpencil_data_get_pointers(C, NULL); - if (step == STEP_UNDO) { + const eUndoStepDir undo_step = (eUndoStepDir)step; + if (undo_step == STEP_UNDO) { if (cur_node->prev) { cur_node = cur_node->prev; new_gpd = cur_node->gpd; } } - else if (step == STEP_REDO) { + else if (undo_step == STEP_REDO) { if (cur_node->next) { cur_node = cur_node->next; new_gpd = cur_node->gpd; @@ -132,7 +136,7 @@ void gpencil_undo_push(bGPdata *gpd) // printf("\t\tGP - undo push\n"); if (cur_node) { - /* remove all un-done nodes from stack */ + /* Remove all undone nodes from stack. */ undo_node = cur_node->next; while (undo_node) { diff --git a/source/blender/editors/gpencil/gpencil_utils.c b/source/blender/editors/gpencil/gpencil_utils.c index 42e3055ef65..5c041134a74 100644 --- a/source/blender/editors/gpencil/gpencil_utils.c +++ b/source/blender/editors/gpencil/gpencil_utils.c @@ -1167,6 +1167,7 @@ void ED_gpencil_stroke_reproject(Depsgraph *depsgraph, if (keep_original) { gps_active = BKE_gpencil_stroke_duplicate(gps, true, true); gps_active->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps_active); for (i = 0, pt = gps_active->points; i < gps_active->totpoints; i++, pt++) { pt->flag &= ~GP_SPOINT_SELECT; } @@ -1689,6 +1690,10 @@ void ED_gpencil_vgroup_select(bContext *C, Object *ob) gps->flag |= GP_STROKE_SELECT; } } + + if (gps->flag & GP_STROKE_SELECT) { + BKE_gpencil_stroke_select_index_set(gpd, gps); + } } } @@ -2564,6 +2569,9 @@ int ED_gpencil_select_stroke_segment(bGPdata *gpd, void ED_gpencil_select_toggle_all(bContext *C, int action) { + Object *ob = CTX_data_active_object(C); + bGPdata *gpd = ob->data; + /* for "toggle", test for existing selected strokes */ if (action == SEL_TOGGLE) { action = SEL_SELECT; @@ -2588,6 +2596,9 @@ void ED_gpencil_select_toggle_all(bContext *C, int action) * NOTE: we limit ourselves to editable layers, since once a layer is "locked/hidden * nothing should be able to touch it */ + /* Set selection index to 0. */ + gpd->select_last_index = 0; + CTX_DATA_BEGIN (C, bGPDlayer *, gpl, editable_gpencil_layers) { /* deselect all strokes on all frames */ @@ -2605,6 +2616,7 @@ void ED_gpencil_select_toggle_all(bContext *C, int action) } gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); } } } @@ -2642,9 +2654,11 @@ void ED_gpencil_select_toggle_all(bContext *C, int action) /* Change status of stroke */ if (selected) { gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps); } else { gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); } } CTX_DATA_END; @@ -2666,6 +2680,11 @@ void ED_gpencil_select_curve_toggle_all(bContext *C, int action) } if (action == SEL_DESELECT) { + /* Set selection index to 0. */ + Object *ob = CTX_data_active_object(C); + bGPdata *gpd = ob->data; + gpd->select_last_index = 0; + GP_EDITABLE_CURVES_BEGIN(gps_iter, C, gpl, gps, gpc) { for (int i = 0; i < gpc->tot_curve_points; i++) { @@ -2676,6 +2695,7 @@ void ED_gpencil_select_curve_toggle_all(bContext *C, int action) } gpc->flag &= ~GP_CURVE_SELECT; gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); } GP_EDITABLE_CURVES_END(gps_iter); } @@ -2717,10 +2737,12 @@ void ED_gpencil_select_curve_toggle_all(bContext *C, int action) if (selected) { gpc->flag |= GP_CURVE_SELECT; gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps); } else { gpc->flag &= ~GP_CURVE_SELECT; gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); } } GP_EDITABLE_STROKES_END(gps_iter); @@ -3032,12 +3054,12 @@ void ED_gpencil_sbuffer_vertex_color_set(Depsgraph *depsgraph, } } -/* Helper to get the bigger 2D bound box points. */ -static void gpencil_projected_2d_bound_box(GP_SpaceConversion *gsc, - bGPDstroke *gps, - const float diff_mat[4][4], - float r_min[2], - float r_max[2]) +/* Get the bigger 2D bound box points. */ +void ED_gpencil_projected_2d_bound_box(GP_SpaceConversion *gsc, + bGPDstroke *gps, + const float diff_mat[4][4], + float r_min[2], + float r_max[2]) { float bounds[8][2]; BoundBox bb; @@ -3082,7 +3104,7 @@ bool ED_gpencil_stroke_check_collision(GP_SpaceConversion *gsc, BKE_gpencil_stroke_boundingbox_calc(gps); } - gpencil_projected_2d_bound_box(gsc, gps, diff_mat, boundbox_min, boundbox_max); + ED_gpencil_projected_2d_bound_box(gsc, gps, diff_mat, boundbox_min, boundbox_max); rcti rect_stroke = {boundbox_min[0], boundbox_max[0], boundbox_min[1], boundbox_max[1]}; diff --git a/source/blender/editors/gpencil/gpencil_uv.c b/source/blender/editors/gpencil/gpencil_uv.c index ec2ccabddfe..677451eaabc 100644 --- a/source/blender/editors/gpencil/gpencil_uv.c +++ b/source/blender/editors/gpencil/gpencil_uv.c @@ -31,7 +31,6 @@ #include "BKE_context.h" #include "BKE_gpencil.h" #include "BKE_gpencil_geom.h" -#include "BKE_unit.h" #include "RNA_access.h" #include "RNA_define.h" diff --git a/source/blender/editors/gpencil/gpencil_vertex_ops.c b/source/blender/editors/gpencil/gpencil_vertex_ops.c index 49f45acdb11..bf46fa2544f 100644 --- a/source/blender/editors/gpencil/gpencil_vertex_ops.c +++ b/source/blender/editors/gpencil/gpencil_vertex_ops.c @@ -28,16 +28,11 @@ #include "BLI_ghash.h" #include "BLI_math.h" -#include "BLT_translation.h" - #include "DNA_brush_types.h" #include "DNA_gpencil_types.h" #include "DNA_material_types.h" -#include "BKE_colortools.h" #include "BKE_context.h" -#include "BKE_gpencil.h" -#include "BKE_gpencil_modifier.h" #include "BKE_main.h" #include "BKE_material.h" #include "BKE_paint.h" @@ -48,16 +43,11 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_enum_types.h" - -#include "UI_view2d.h" #include "ED_gpencil.h" #include "ED_screen.h" -#include "ED_view3d.h" #include "DEG_depsgraph.h" -#include "DEG_depsgraph_query.h" #include "gpencil_intern.h" diff --git a/source/blender/editors/include/ED_anim_api.h b/source/blender/editors/include/ED_anim_api.h index 9cf67816df2..2415c85e299 100644 --- a/source/blender/editors/include/ED_anim_api.h +++ b/source/blender/editors/include/ED_anim_api.h @@ -33,7 +33,11 @@ struct ID; struct ListBase; struct ARegion; +struct ARegionType; struct Main; +struct NlaStrip; +struct FModifier; +struct PanelType; struct ReportList; struct ScrArea; struct SpaceLink; @@ -675,11 +679,25 @@ void ANIM_draw_framerange(struct Scene *scene, struct View2D *v2d); /* ------------- UI Panel Drawing -------------- */ -/* draw a given F-Modifier for some layout/UI-Block */ -void ANIM_uiTemplate_fmodifier_draw(struct uiLayout *layout, - struct ID *fcurve_owner_id, - ListBase *modifiers, - struct FModifier *fcm); +struct NlaStrip *ANIM_nla_context_strip(const struct bContext *C); +struct FCurve *ANIM_graph_context_fcurve(const struct bContext *C); + +/* Needed for abstraction between the graph editor and the NLA editor. */ +typedef bool (*PanelTypePollFn)(const struct bContext *C, struct PanelType *pt); +/* Avoid including "UI_interface.h" here. */ +typedef void (*uiListPanelIDFromDataFunc)(void *data_link, char *r_idname); + +void ANIM_fmodifier_panels(const struct bContext *C, + struct ID *owner_id, + struct ListBase *fmodifiers, + uiListPanelIDFromDataFunc panel_id_fn); + +void ANIM_modifier_panels_register_graph_and_NLA(struct ARegionType *region_type, + const char *modifier_panel_prefix, + PanelTypePollFn poll_function); +void ANIM_modifier_panels_register_graph_only(struct ARegionType *region_type, + const char *modifier_panel_prefix, + PanelTypePollFn poll_function); /* ------------- Copy/Paste Buffer -------------- */ diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h index 0136d599e8a..2fbf280475b 100644 --- a/source/blender/editors/include/ED_gpencil.h +++ b/source/blender/editors/include/ED_gpencil.h @@ -62,8 +62,6 @@ struct bAnimContext; struct wmKeyConfig; struct wmOperator; -enum eUndoStepDir; - #define GPENCIL_MINIMUM_JOIN_DIST 20.0f /* Reproject stroke modes. */ @@ -215,7 +213,7 @@ bool ED_gpencil_anim_copybuf_paste(struct bAnimContext *ac, const short copy_mod /* ------------ Grease-Pencil Undo System ------------------ */ int ED_gpencil_session_active(void); -int ED_undo_gpencil_step(struct bContext *C, const enum eUndoStepDir step); +int ED_undo_gpencil_step(struct bContext *C, const int step); /* eUndoStepDir. */ /* ------------ Grease-Pencil Armature ------------------ */ bool ED_gpencil_add_armature(const struct bContext *C, @@ -370,6 +368,11 @@ bool ED_gpencil_stroke_point_is_inside(struct bGPDstroke *gps, struct GP_SpaceConversion *gsc, int mouse[2], const float diff_mat[4][4]); +void ED_gpencil_projected_2d_bound_box(struct GP_SpaceConversion *gsc, + struct bGPDstroke *gps, + const float diff_mat[4][4], + float r_min[2], + float r_max[2]); struct bGPDstroke *ED_gpencil_stroke_nearest_to_ends(struct bContext *C, struct GP_SpaceConversion *gsc, diff --git a/source/blender/editors/include/ED_keyframes_draw.h b/source/blender/editors/include/ED_keyframes_draw.h index 3cc77887b1a..2f8faf1b2bd 100644 --- a/source/blender/editors/include/ED_keyframes_draw.h +++ b/source/blender/editors/include/ED_keyframes_draw.h @@ -95,6 +95,8 @@ typedef enum eActKeyBlock_Hold { ACTKEYBLOCK_FLAG_ANY_HOLD = (1 << 2), /* The curve segment uses non-bezier interpolation */ ACTKEYBLOCK_FLAG_NON_BEZIER = (1 << 3), + /* The block is grease pencil */ + ACTKEYBLOCK_FLAG_GPENCIL = (1 << 4), } eActKeyBlock_Flag; /* *********************** Keyframe Drawing ****************************** */ diff --git a/source/blender/editors/include/ED_keyframes_edit.h b/source/blender/editors/include/ED_keyframes_edit.h index 63f124798aa..cf90a21f799 100644 --- a/source/blender/editors/include/ED_keyframes_edit.h +++ b/source/blender/editors/include/ED_keyframes_edit.h @@ -300,7 +300,7 @@ short bezt_to_cfraelem(KeyframeEditData *ked, struct BezTriple *bezt); */ void bezt_remap_times(KeyframeEditData *ked, struct BezTriple *bezt); -/* ------ 1.5-D Region Testing Uitls (Lasso/Circle Select) ------- */ +/* ------ 1.5-D Region Testing Utilities (Lasso/Circle Select) ------- */ /* XXX: These are temporary, * until we can unify GP/Mask Keyframe handling and standard FCurve Keyframe handling */ diff --git a/source/blender/editors/include/ED_mask.h b/source/blender/editors/include/ED_mask.h index b20dae694fc..247911bdc55 100644 --- a/source/blender/editors/include/ED_mask.h +++ b/source/blender/editors/include/ED_mask.h @@ -66,7 +66,7 @@ void ED_mask_cursor_location_get(struct ScrArea *area, float cursor[2]); bool ED_mask_selected_minmax(const struct bContext *C, float min[2], float max[2], - bool include_handles); + bool handles_as_control_point); /* mask_draw.c */ void ED_mask_draw(const struct bContext *C, const char draw_flag, const char draw_type); diff --git a/source/blender/editors/include/ED_node.h b/source/blender/editors/include/ED_node.h index 78f354a300d..ea2383457c2 100644 --- a/source/blender/editors/include/ED_node.h +++ b/source/blender/editors/include/ED_node.h @@ -80,7 +80,7 @@ void ED_node_sample_set(const float col[4]); void ED_node_draw_snap( struct View2D *v2d, const float cent[2], float size, NodeBorder border, unsigned int pos); -/* node_draw.c */ +/* node_draw.cc */ void ED_node_socket_draw(struct bNodeSocket *sock, const struct rcti *rect, const float color[4], diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h index 73326a2d5f2..5dfce6071f0 100644 --- a/source/blender/editors/include/ED_object.h +++ b/source/blender/editors/include/ED_object.h @@ -462,25 +462,25 @@ bool ED_object_gpencil_modifier_remove(struct ReportList *reports, struct Object *ob, struct GpencilModifierData *md); void ED_object_gpencil_modifier_clear(struct Main *bmain, struct Object *ob); -int ED_object_gpencil_modifier_move_down(struct ReportList *reports, - struct Object *ob, - struct GpencilModifierData *md); -int ED_object_gpencil_modifier_move_up(struct ReportList *reports, - struct Object *ob, - struct GpencilModifierData *md); +bool ED_object_gpencil_modifier_move_down(struct ReportList *reports, + struct Object *ob, + struct GpencilModifierData *md); +bool ED_object_gpencil_modifier_move_up(struct ReportList *reports, + struct Object *ob, + struct GpencilModifierData *md); bool ED_object_gpencil_modifier_move_to_index(struct ReportList *reports, struct Object *ob, struct GpencilModifierData *md, const int index); -int ED_object_gpencil_modifier_apply(struct Main *bmain, - struct ReportList *reports, - struct Depsgraph *depsgraph, +bool ED_object_gpencil_modifier_apply(struct Main *bmain, + struct ReportList *reports, + struct Depsgraph *depsgraph, + struct Object *ob, + struct GpencilModifierData *md, + int mode); +bool ED_object_gpencil_modifier_copy(struct ReportList *reports, struct Object *ob, - struct GpencilModifierData *md, - int mode); -int ED_object_gpencil_modifier_copy(struct ReportList *reports, - struct Object *ob, - struct GpencilModifierData *md); + struct GpencilModifierData *md); void ED_object_gpencil_modifier_copy_to_object(struct Object *ob_dst, struct GpencilModifierData *md); diff --git a/source/blender/editors/include/ED_render.h b/source/blender/editors/include/ED_render.h index 9cdecc444c8..ed35b9138f3 100644 --- a/source/blender/editors/include/ED_render.h +++ b/source/blender/editors/include/ED_render.h @@ -29,16 +29,16 @@ extern "C" { #endif -struct bContext; -struct bScreen; struct DEGEditorUpdateContext; struct Depsgraph; struct ID; -struct Main; struct MTex; +struct Main; struct Render; struct Scene; struct ScrArea; +struct bContext; +struct bScreen; struct wmWindow; struct wmWindowManager; @@ -92,6 +92,7 @@ void ED_preview_shader_job(const struct bContext *C, int sizey, int method); void ED_preview_icon_render(struct Main *bmain, + struct Depsgraph *depsgraph, struct Scene *scene, struct ID *id, unsigned int *rect, diff --git a/source/blender/editors/include/ED_sculpt.h b/source/blender/editors/include/ED_sculpt.h index 1175d08399e..348ea503372 100644 --- a/source/blender/editors/include/ED_sculpt.h +++ b/source/blender/editors/include/ED_sculpt.h @@ -43,9 +43,9 @@ bool ED_sculpt_mask_box_select(struct bContext *C, bool select); /* transform */ -void ED_sculpt_update_modal_transform(struct bContext *C); -void ED_sculpt_init_transform(struct bContext *C); -void ED_sculpt_end_transform(struct bContext *C); +void ED_sculpt_update_modal_transform(struct bContext *C, struct Object *ob); +void ED_sculpt_init_transform(struct bContext *C, struct Object *ob); +void ED_sculpt_end_transform(struct bContext *C, struct Object *ob); /* sculpt_undo.c */ void ED_sculpt_undosys_type(struct UndoType *ut); diff --git a/source/blender/editors/include/ED_space_api.h b/source/blender/editors/include/ED_space_api.h index 47c2d4f790c..c50bbc2f1e9 100644 --- a/source/blender/editors/include/ED_space_api.h +++ b/source/blender/editors/include/ED_space_api.h @@ -73,6 +73,9 @@ void *ED_region_draw_cb_activate(struct ARegionType *art, int type); void ED_region_draw_cb_draw(const struct bContext *, struct ARegion *, int); void ED_region_draw_cb_exit(struct ARegionType *, void *); +void ED_region_draw_cb_remove_by_type(struct ARegionType *art, + void *draw_fn, + void (*free)(void *)); /* generic callbacks */ /* ed_util.c */ void ED_region_draw_mouse_line_cb(const struct bContext *C, diff --git a/source/blender/editors/include/ED_transform.h b/source/blender/editors/include/ED_transform.h index 2ab062a718c..8f1be847e2b 100644 --- a/source/blender/editors/include/ED_transform.h +++ b/source/blender/editors/include/ED_transform.h @@ -40,7 +40,7 @@ void transform_operatortypes(void); /* ******************** Macros & Prototypes *********************** */ /* MODE AND NUMINPUT FLAGS */ -enum TfmMode { +typedef enum { TFM_INIT = -1, TFM_DUMMY, TFM_TRANSLATION, @@ -77,24 +77,7 @@ enum TfmMode { TFM_BONE_ENVELOPE_DIST, TFM_NORMAL_ROTATION, TFM_GPENCIL_OPACITY, -}; - -/* TRANSFORM CONTEXTS */ -#define CTX_NONE 0 -#define CTX_TEXTURE (1 << 0) -#define CTX_EDGE (1 << 1) -#define CTX_NO_PET (1 << 2) -#define CTX_NO_MIRROR (1 << 3) -#define CTX_AUTOCONFIRM (1 << 4) -#define CTX_MOVIECLIP (1 << 6) -#define CTX_MASK (1 << 7) -#define CTX_PAINT_CURVE (1 << 8) -#define CTX_GPENCIL_STROKES (1 << 9) -#define CTX_CURSOR (1 << 10) -/** When transforming object's, adjust the object data so it stays in the same place. */ -#define CTX_OBMODE_XFORM_OBDATA (1 << 11) -/** Transform object parents without moving their children. */ -#define CTX_OBMODE_XFORM_SKIP_CHILDREN (1 << 12) +} eTfmMode; /* Standalone call to get the transformation center corresponding to the current situation * returns 1 if successful, 0 otherwise (usually means there's no selection) diff --git a/source/blender/editors/include/ED_undo.h b/source/blender/editors/include/ED_undo.h index 7b643e7c764..ed1ec96a13f 100644 --- a/source/blender/editors/include/ED_undo.h +++ b/source/blender/editors/include/ED_undo.h @@ -76,7 +76,8 @@ struct Base **ED_undo_editmode_bases_from_view_layer(struct ViewLayer *view_laye struct UndoStack *ED_undo_stack_get(void); /* helpers */ -void ED_undo_object_set_active_or_warn(struct ViewLayer *view_layer, +void ED_undo_object_set_active_or_warn(struct Scene *scene, + struct ViewLayer *view_layer, struct Object *ob, const char *info, struct CLG_LogRef *log); diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h index a4856845a65..a63b133cc22 100644 --- a/source/blender/editors/include/ED_view3d.h +++ b/source/blender/editors/include/ED_view3d.h @@ -465,7 +465,7 @@ float ED_view3d_radius_to_dist(const struct View3D *v3d, void imm_drawcircball(const float cent[3], float rad, const float tmat[4][4], unsigned int pos); -/* backbuffer select and draw support */ +/* Back-buffer select and draw support. */ void ED_view3d_backbuf_depth_validate(struct ViewContext *vc); int ED_view3d_backbuf_sample_size_clamp(struct ARegion *region, const float dist); @@ -479,7 +479,7 @@ bool ED_view3d_autodist(struct Depsgraph *depsgraph, const bool alphaoverride, const float fallback_depth_pt[3]); -/* only draw so ED_view3d_autodist_simple can be called many times after */ +/* Only draw so #ED_view3d_autodist_simple can be called many times after. */ void ED_view3d_autodist_init(struct Depsgraph *depsgraph, struct ARegion *region, struct View3D *v3d, diff --git a/source/blender/editors/include/ED_view3d_offscreen.h b/source/blender/editors/include/ED_view3d_offscreen.h index e854982c796..c490e96031f 100644 --- a/source/blender/editors/include/ED_view3d_offscreen.h +++ b/source/blender/editors/include/ED_view3d_offscreen.h @@ -54,6 +54,7 @@ void ED_view3d_draw_offscreen(struct Depsgraph *depsgraph, bool draw_background, const char *viewname, const bool do_color_management, + const bool restore_rv3d_mats, struct GPUOffScreen *ofs, struct GPUViewport *viewport); void ED_view3d_draw_offscreen_simple(struct Depsgraph *depsgraph, @@ -84,6 +85,7 @@ struct ImBuf *ED_view3d_draw_offscreen_imbuf(struct Depsgraph *depsgraph, eImBufFlags imbuf_flag, int alpha_mode, const char *viewname, + const bool restore_rv3d_mats, struct GPUOffScreen *ofs, char err_out[256]); struct ImBuf *ED_view3d_draw_offscreen_imbuf_simple(struct Depsgraph *depsgraph, diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h index 79311042274..f5c501b8cff 100644 --- a/source/blender/editors/include/UI_icons.h +++ b/source/blender/editors/include/UI_icons.h @@ -173,7 +173,7 @@ DEF_ICON(IMAGE) DEF_ICON(INFO) DEF_ICON(SEQUENCE) DEF_ICON_OBJECT_DATA(TEXT) -DEF_ICON_BLANK(174) +DEF_ICON(SPREADSHEET) DEF_ICON(SOUND) DEF_ICON(ACTION) DEF_ICON(NLA) diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index bc053f60ca3..81641239c6a 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -106,7 +106,7 @@ typedef struct uiPopupBlockHandle uiPopupBlockHandle; typedef enum eUIEmbossType { UI_EMBOSS = 0, /* use widget style for drawing */ UI_EMBOSS_NONE = 1, /* Nothing, only icon and/or text */ - UI_EMBOSS_PULLDOWN = 2, /* Pulldown menu style */ + UI_EMBOSS_PULLDOWN = 2, /* Pull-down menu style */ UI_EMBOSS_RADIAL = 3, /* Pie Menu */ /** * The same as #UI_EMBOSS_NONE, unless the button has @@ -166,6 +166,8 @@ enum { /** The block is only used during the search process and will not be drawn. * Currently just for the case of a closed panel's sub-panel (and its sub-panels). */ UI_BLOCK_SEARCH_ONLY = 1 << 25, + /** Hack for quick setup (splash screen) to draw text centered. */ + UI_BLOCK_QUICK_SETUP = 1 << 26, }; /** #uiPopupBlockHandle.menuretval */ @@ -1411,8 +1413,10 @@ enum { UI_TEMPLATE_ID_FILTER_AVAILABLE = 1, }; -int UI_icon_from_id(struct ID *id); +int UI_icon_from_id(const struct ID *id); int UI_icon_from_report_type(int type); +int UI_icon_colorid_from_report_type(int type); +int UI_text_colorid_from_report_type(int type); int UI_icon_from_event_type(short event_type, short event_value); int UI_icon_from_keymap_item(const struct wmKeyMapItem *kmi, int r_icon_mod[4]); @@ -2543,6 +2547,7 @@ void UI_template_fix_linking(void); /* UI_OT_editsource helpers */ bool UI_editsource_enable_check(void); void UI_editsource_active_but_test(uiBut *but); +void UI_editsource_but_replace(const uiBut *old_but, uiBut *new_but); /* UI_butstore_ helpers */ typedef struct uiButStore uiButStore; diff --git a/source/blender/editors/include/UI_interface_icons.h b/source/blender/editors/include/UI_interface_icons.h index d77a87e7200..266a538b6c3 100644 --- a/source/blender/editors/include/UI_interface_icons.h +++ b/source/blender/editors/include/UI_interface_icons.h @@ -23,6 +23,9 @@ #pragma once +/* Required for #eIconSizes which can't be forward declared if this file is included in C++. */ +#include "DNA_ID_enums.h" + #ifdef __cplusplus extern "C" { #endif @@ -34,8 +37,6 @@ struct PreviewImage; struct Scene; struct bContext; -enum eIconSizes; - typedef struct IconFile { struct IconFile *next, *prev; char filename[256]; /* FILE_MAXFILE size */ diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 10cbc2dc5fa..6e25ec9d275 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -988,10 +988,9 @@ bool UI_but_active_only(const bContext *C, ARegion *region, uiBlock *block, uiBu */ bool UI_block_active_only_flagged_buttons(const bContext *C, ARegion *region, uiBlock *block) { - /* Running this command before end-block has run, means buttons that open menus * wont have those menus correctly positioned, see T83539. */ - BLI_assert(block->endblock != 0); + BLI_assert(block->endblock); bool done = false; LISTBASE_FOREACH (uiBut *, but, &block->buttons) { @@ -1914,7 +1913,7 @@ void UI_block_end_ex(const bContext *C, uiBlock *block, const int xy[2], int r_x ui_update_flexible_spacing(region, block); - block->endblock = 1; + block->endblock = true; } void UI_block_end(const bContext *C, uiBlock *block) @@ -3429,12 +3428,12 @@ void UI_blocklist_free_inactive(const bContext *C, ListBase *lb) { LISTBASE_FOREACH_MUTABLE (uiBlock *, block, lb) { if (!block->handle) { - if (!block->active) { - BLI_remlink(lb, block); - UI_block_free(C, block); + if (block->active) { + block->active = false; } else { - block->active = 0; + BLI_remlink(lb, block); + UI_block_free(C, block); } } } @@ -3451,7 +3450,7 @@ void UI_block_region_set(uiBlock *block, ARegion *region) oldblock = BLI_findstring(lb, block->name, offsetof(uiBlock, name)); if (oldblock) { - oldblock->active = 0; + oldblock->active = false; oldblock->panel = NULL; oldblock->handle = NULL; } @@ -3469,7 +3468,7 @@ uiBlock *UI_block_begin(const bContext *C, ARegion *region, const char *name, eU Scene *scene = CTX_data_scene(C); uiBlock *block = MEM_callocN(sizeof(uiBlock), "uiBlock"); - block->active = 1; + block->active = true; block->emboss = emboss; block->evil_C = (void *)C; /* XXX */ @@ -3948,6 +3947,9 @@ uiBut *ui_but_change_type(uiBut *but, eButType new_type) UNUSED_VARS_NDEBUG(found_layout); ui_button_group_replace_but_ptr(uiLayoutGetBlock(but->layout), old_but_ptr, but); } + if (UI_editsource_enable_check()) { + UI_editsource_but_replace(old_but_ptr, but); + } } return but; @@ -4057,7 +4059,8 @@ static uiBut *ui_def_but(uiBlock *block, but->drawflag |= UI_BUT_ICON_LEFT; } } - else if (((block->flag & UI_BLOCK_LOOP) && !ui_block_is_popover(block)) || + else if (((block->flag & UI_BLOCK_LOOP) && !ui_block_is_popover(block) && + !(block->flag & UI_BLOCK_QUICK_SETUP)) || ELEM(but->type, UI_BTYPE_MENU, UI_BTYPE_TEXT, @@ -4077,11 +4080,6 @@ static uiBut *ui_def_but(uiBlock *block, } #endif - /* Always keep text in radio-buttons (expanded enums) center aligned. */ - if (ELEM(but->type, UI_BTYPE_ROW)) { - but->drawflag &= ~UI_BUT_TEXT_LEFT; - } - but->drawflag |= (block->flag & UI_BUT_ALIGN); if (block->lock == true) { diff --git a/source/blender/editors/interface/interface_eyedropper.c b/source/blender/editors/interface/interface_eyedropper.c index 4d0e1584156..de39484bc1e 100644 --- a/source/blender/editors/interface/interface_eyedropper.c +++ b/source/blender/editors/interface/interface_eyedropper.c @@ -24,8 +24,6 @@ #include "DNA_screen_types.h" #include "DNA_space_types.h" -#include "BLI_blenlib.h" - #include "BKE_context.h" #include "BKE_screen.h" diff --git a/source/blender/editors/interface/interface_eyedropper_depth.c b/source/blender/editors/interface/interface_eyedropper_depth.c index e71a0b9196c..a4adbef0b94 100644 --- a/source/blender/editors/interface/interface_eyedropper_depth.c +++ b/source/blender/editors/interface/interface_eyedropper_depth.c @@ -41,8 +41,6 @@ #include "BKE_screen.h" #include "BKE_unit.h" -#include "DEG_depsgraph.h" - #include "RNA_access.h" #include "UI_interface.h" diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 1bfd84a7046..5de330d7136 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -665,7 +665,6 @@ static void ui_afterfunc_update_preferences_dirty(uiAfterFunc *after) /* -------------------------------------------------------------------- */ /** \name Button Snap Values - * * \{ */ enum eSnapType { @@ -7492,7 +7491,7 @@ static bool ui_numedit_but_TRACKPREVIEW( if (!scopes->track_locked) { const MovieClip *clip = CTX_data_edit_movieclip(C); - const int clip_framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, scopes->framenr); + const int clip_framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, scopes->scene_framenr); if (scopes->marker->framenr != clip_framenr) { scopes->marker = BKE_tracking_marker_ensure(scopes->track, clip_framenr); } @@ -7928,7 +7927,7 @@ static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState s button_tooltip_timer_reset(C, but); - /* automatic open pulldown block timer */ + /* Automatic open pull-down block timer. */ if (ELEM(but->type, UI_BTYPE_BLOCK, UI_BTYPE_PULLDOWN, UI_BTYPE_POPOVER) || /* Menu button types may draw as popovers, check for this case * ignoring other kinds of menus (mainly enums). (see T66538). */ @@ -8268,7 +8267,7 @@ static void button_activate_exit( bt->flag &= ~UI_BUT_LAST_ACTIVE; } - block_iter->tooltipdisabled = 1; + block_iter->tooltipdisabled = true; } ui_blocks_set_tooltips(data->region, false); diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c index 26f0f6ca98a..c16c3d2c49a 100644 --- a/source/blender/editors/interface/interface_icons.c +++ b/source/blender/editors/interface/interface_icons.c @@ -889,15 +889,15 @@ void UI_icons_reload_internal_textures(void) icongltex.invh = 1.0f / b32buf->y; icongltex.tex[0] = GPU_texture_create_2d("icons", b32buf->x, b32buf->y, 2, GPU_RGBA8, NULL); - GPU_texture_update_mipmap(icongltex.tex[0], 0, GPU_DATA_UNSIGNED_BYTE, b32buf->rect); - GPU_texture_update_mipmap(icongltex.tex[0], 1, GPU_DATA_UNSIGNED_BYTE, b16buf->rect); + GPU_texture_update_mipmap(icongltex.tex[0], 0, GPU_DATA_UBYTE, b32buf->rect); + GPU_texture_update_mipmap(icongltex.tex[0], 1, GPU_DATA_UBYTE, b16buf->rect); } if (need_icons_with_border && icongltex.tex[1] == NULL) { icongltex.tex[1] = GPU_texture_create_2d( "icons_border", b32buf_border->x, b32buf_border->y, 2, GPU_RGBA8, NULL); - GPU_texture_update_mipmap(icongltex.tex[1], 0, GPU_DATA_UNSIGNED_BYTE, b32buf_border->rect); - GPU_texture_update_mipmap(icongltex.tex[1], 1, GPU_DATA_UNSIGNED_BYTE, b16buf_border->rect); + GPU_texture_update_mipmap(icongltex.tex[1], 0, GPU_DATA_UBYTE, b32buf_border->rect); + GPU_texture_update_mipmap(icongltex.tex[1], 1, GPU_DATA_UBYTE, b16buf_border->rect); } } @@ -1426,8 +1426,13 @@ static void icon_set_image(const bContext *C, scene = CTX_data_scene(C); } /* Immediate version */ - ED_preview_icon_render( - CTX_data_main(C), scene, id, prv_img->rect[size], prv_img->w[size], prv_img->h[size]); + ED_preview_icon_render(CTX_data_main(C), + CTX_data_ensure_evaluated_depsgraph(C), + scene, + id, + prv_img->rect[size], + prv_img->w[size], + prv_img->h[size]); } } diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index 6a921f3f541..3da66d45abd 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -510,13 +510,13 @@ struct uiBlock { const char *lockstr; - char lock; + bool lock; /** to keep blocks while drawing and free them afterwards */ - char active; + bool active; /** to avoid tooltip after click */ - char tooltipdisabled; + bool tooltipdisabled; /** UI_block_end done? */ - char endblock; + bool endblock; /** for doing delayed */ eBlockBoundsCalc bounds_type; diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index fef243d7193..8f90dc7f801 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -3057,7 +3057,8 @@ void uiItemPopoverPanel_ptr( }; pt->draw_header(C, &panel); } - uiBut *but = ui_item_menu(layout, name, icon, ui_item_paneltype_func, pt, NULL, NULL, true); + uiBut *but = ui_item_menu( + layout, name, icon, ui_item_paneltype_func, pt, NULL, pt->description, true); but->type = UI_BTYPE_POPOVER; if (!ok) { but->flag |= UI_BUT_DISABLED; diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c index 05a2a6ef29b..540e98f542e 100644 --- a/source/blender/editors/interface/interface_ops.c +++ b/source/blender/editors/interface/interface_ops.c @@ -1296,6 +1296,19 @@ void UI_editsource_active_but_test(uiBut *but) BLI_ghash_insert(ui_editsource_info->hash, but, but_store); } +/** + * Remove the editsource data for \a old_but and reinsert it for \a new_but. Use when the button + * was reallocated, e.g. to have a new type (#ui_but_change_type()). + */ +void UI_editsource_but_replace(const uiBut *old_but, uiBut *new_but) +{ + uiEditSourceButStore *but_store = BLI_ghash_lookup(ui_editsource_info->hash, old_but); + if (but_store) { + BLI_ghash_remove(ui_editsource_info->hash, old_but, NULL, NULL); + BLI_ghash_insert(ui_editsource_info->hash, new_but, but_store); + } +} + static int editsource_text_edit(bContext *C, wmOperator *op, const char filepath[FILE_MAX], diff --git a/source/blender/editors/interface/interface_region_color_picker.c b/source/blender/editors/interface/interface_region_color_picker.c index 82028d4e595..e68705e4321 100644 --- a/source/blender/editors/interface/interface_region_color_picker.c +++ b/source/blender/editors/interface/interface_region_color_picker.c @@ -565,6 +565,7 @@ static void ui_block_colorpicker(uiBlock *block, 0, ""); UI_but_flag_disable(bt, UI_BUT_UNDO); + UI_but_drawflag_disable(bt, UI_BUT_TEXT_LEFT); UI_but_func_set(bt, ui_colorpicker_create_mode_cb, bt, NULL); bt->custom_data = cpicker; bt = uiDefButC(block, @@ -582,6 +583,7 @@ static void ui_block_colorpicker(uiBlock *block, 0, ""); UI_but_flag_disable(bt, UI_BUT_UNDO); + UI_but_drawflag_disable(bt, UI_BUT_TEXT_LEFT); UI_but_func_set(bt, ui_colorpicker_create_mode_cb, bt, NULL); bt->custom_data = cpicker; bt = uiDefButC(block, @@ -599,6 +601,7 @@ static void ui_block_colorpicker(uiBlock *block, 0, ""); UI_but_flag_disable(bt, UI_BUT_UNDO); + UI_but_drawflag_disable(bt, UI_BUT_TEXT_LEFT); UI_but_func_set(bt, ui_colorpicker_create_mode_cb, bt, NULL); bt->custom_data = cpicker; UI_block_align_end(block); diff --git a/source/blender/editors/interface/interface_region_menu_popup.c b/source/blender/editors/interface/interface_region_menu_popup.c index 1789af2d2ce..f234f0fbbf5 100644 --- a/source/blender/editors/interface/interface_region_menu_popup.c +++ b/source/blender/editors/interface/interface_region_menu_popup.c @@ -188,7 +188,7 @@ static uiBlock *ui_block_func_POPUP(bContext *C, uiPopupBlockHandle *handle, voi minwidth = uiLayoutGetUnitsX(pup->layout) * UI_UNIT_X; } else if (pup->but) { - /* minimum width to enforece */ + /* Minimum width to enforce. */ if (pup->but->drawstr[0]) { minwidth = BLI_rctf_size_x(&pup->but->rect); } diff --git a/source/blender/editors/interface/interface_region_popup.c b/source/blender/editors/interface/interface_region_popup.c index 3228e9741bb..8135f5a203e 100644 --- a/source/blender/editors/interface/interface_region_popup.c +++ b/source/blender/editors/interface/interface_region_popup.c @@ -353,7 +353,7 @@ static void ui_popup_block_position(wmWindow *window, block->direction = dir1; } - /* keep a list of these, needed for pulldown menus */ + /* Keep a list of these, needed for pull-down menus. */ uiSafetyRct *saferct = MEM_callocN(sizeof(uiSafetyRct), "uiSafetyRct"); saferct->parent = butrct; saferct->safety = block->safety; @@ -632,7 +632,7 @@ uiBlock *ui_popup_block_refresh(bContext *C, } else { uiSafetyRct *saferct; - /* keep a list of these, needed for pulldown menus */ + /* Keep a list of these, needed for pull-down menus. */ saferct = MEM_callocN(sizeof(uiSafetyRct), "uiSafetyRct"); saferct->safety = block->safety; BLI_addhead(&block->saferct, saferct); diff --git a/source/blender/editors/interface/interface_region_search.c b/source/blender/editors/interface/interface_region_search.c index d1d4290bd11..2c07f5c3c03 100644 --- a/source/blender/editors/interface/interface_region_search.c +++ b/source/blender/editors/interface/interface_region_search.c @@ -724,19 +724,13 @@ ARegion *ui_searchbox_create_generic(bContext *C, ARegion *butregion, uiButSearc wmWindow *win = CTX_wm_window(C); const uiStyle *style = UI_style_get(); uiBut *but = &search_but->but; - static ARegionType type; - ARegion *region; - uiSearchboxData *data; const float aspect = but->block->aspect; - rctf rect_fl; - rcti rect_i; const int margin = UI_POPUP_MARGIN; - int winx /*, winy */, ofsx, ofsy; - int i; /* create area region */ - region = ui_region_temp_add(CTX_wm_screen(C)); + ARegion *region = ui_region_temp_add(CTX_wm_screen(C)); + static ARegionType type; memset(&type, 0, sizeof(ARegionType)); type.draw = ui_searchbox_region_draw_cb; type.free = ui_searchbox_region_free_cb; @@ -744,7 +738,7 @@ ARegion *ui_searchbox_create_generic(bContext *C, ARegion *butregion, uiButSearc region->type = &type; /* create searchbox data */ - data = MEM_callocN(sizeof(uiSearchboxData), "uiSearchboxData"); + uiSearchboxData *data = MEM_callocN(sizeof(uiSearchboxData), "uiSearchboxData"); /* set font, get bb */ data->fstyle = style->widget; /* copy struct */ @@ -799,13 +793,14 @@ ARegion *ui_searchbox_create_generic(bContext *C, ARegion *butregion, uiButSearc else { const int searchbox_width = UI_searchbox_size_x(); + rctf rect_fl; rect_fl.xmin = but->rect.xmin - 5; /* align text with button */ rect_fl.xmax = but->rect.xmax + 5; /* symmetrical */ rect_fl.ymax = but->rect.ymin; rect_fl.ymin = rect_fl.ymax - UI_searchbox_size_y(); - ofsx = (but->block->panel) ? but->block->panel->ofsx : 0; - ofsy = (but->block->panel) ? but->block->panel->ofsy : 0; + const int ofsx = (but->block->panel) ? but->block->panel->ofsx : 0; + const int ofsy = (but->block->panel) ? but->block->panel->ofsy : 0; BLI_rctf_translate(&rect_fl, ofsx, ofsy); @@ -815,6 +810,7 @@ ARegion *ui_searchbox_create_generic(bContext *C, ARegion *butregion, uiButSearc } /* copy to int, gets projected if possible too */ + rcti rect_i; BLI_rcti_rctf_copy(&rect_i, &rect_fl); if (butregion->v2d.cur.xmin != butregion->v2d.cur.xmax) { @@ -823,7 +819,7 @@ ARegion *ui_searchbox_create_generic(bContext *C, ARegion *butregion, uiButSearc BLI_rcti_translate(&rect_i, butregion->winrct.xmin, butregion->winrct.ymin); - winx = WM_window_pixels_x(win); + int winx = WM_window_pixels_x(win); // winy = WM_window_pixels_y(win); /* UNUSED */ // wm_window_get_size(win, &winx, &winy); @@ -885,7 +881,7 @@ ARegion *ui_searchbox_create_generic(bContext *C, ARegion *butregion, uiButSearc data->items.icons = MEM_callocN(data->items.maxitem * sizeof(int), "search icons"); data->items.states = MEM_callocN(data->items.maxitem * sizeof(int), "search flags"); data->items.name_prefix_offsets = NULL; /* Lazy initialized as needed. */ - for (i = 0; i < data->items.maxitem; i++) { + for (int i = 0; i < data->items.maxitem; i++) { data->items.names[i] = MEM_callocN(but->hardmax + 1, "search pointers"); } @@ -1000,10 +996,8 @@ static void ui_searchbox_region_draw_cb__operator(const bContext *UNUSED(C), ARe ARegion *ui_searchbox_create_operator(bContext *C, ARegion *butregion, uiButSearch *search_but) { - ARegion *region; - UI_but_drawflag_enable(&search_but->but, UI_BUT_HAS_SHORTCUT); - region = ui_searchbox_create_generic(C, butregion, search_but); + ARegion *region = ui_searchbox_create_generic(C, butregion, search_but); region->type->draw = ui_searchbox_region_draw_cb__operator; @@ -1022,10 +1016,8 @@ static void ui_searchbox_region_draw_cb__menu(const bContext *UNUSED(C), ARegion ARegion *ui_searchbox_create_menu(bContext *C, ARegion *butregion, uiButSearch *search_but) { - ARegion *region; - UI_but_drawflag_enable(&search_but->but, UI_BUT_HAS_SHORTCUT); - region = ui_searchbox_create_generic(C, butregion, search_but); + ARegion *region = ui_searchbox_create_generic(C, butregion, search_but); if (false) { region->type->draw = ui_searchbox_region_draw_cb__menu; diff --git a/source/blender/editors/interface/interface_template_search_operator.c b/source/blender/editors/interface/interface_template_search_operator.c index 21529a97c01..ff0f9a2e5cd 100644 --- a/source/blender/editors/interface/interface_template_search_operator.c +++ b/source/blender/editors/interface/interface_template_search_operator.c @@ -23,11 +23,8 @@ #include -#include "DNA_gpencil_modifier_types.h" -#include "DNA_node_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_shader_fx_types.h" #include "DNA_texture_types.h" #include "BLI_alloca.h" diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index cf0c1444d4d..67446ca681f 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -558,14 +558,13 @@ void UI_context_active_but_prop_get_templateID(bContext *C, PointerRNA *r_ptr, PropertyRNA **r_prop) { - TemplateID *template_ui; uiBut *but = UI_context_active_but_get(C); memset(r_ptr, 0, sizeof(*r_ptr)); *r_prop = NULL; if (but && but->func_argN) { - template_ui = but->func_argN; + TemplateID *template_ui = but->func_argN; *r_ptr = template_ui->ptr; *r_prop = template_ui->prop; } @@ -911,22 +910,18 @@ static void template_ID(const bContext *C, const bool hide_buttons) { uiBut *but; - uiBlock *block; - PointerRNA idptr; - // ListBase *lb; // UNUSED - ID *id, *idfrom; const bool editable = RNA_property_editable(&template_ui->ptr, template_ui->prop); const bool use_previews = template_ui->preview = (flag & UI_ID_PREVIEWS) != 0; - idptr = RNA_property_pointer_get(&template_ui->ptr, template_ui->prop); - id = idptr.data; - idfrom = template_ui->ptr.owner_id; + PointerRNA idptr = RNA_property_pointer_get(&template_ui->ptr, template_ui->prop); + ID *id = idptr.data; + ID *idfrom = template_ui->ptr.owner_id; // lb = template_ui->idlb; /* Allow operators to take the ID from context. */ uiLayoutSetContextPointer(layout, "id", &idptr); - block = uiLayoutGetBlock(layout); + uiBlock *block = uiLayoutGetBlock(layout); UI_block_align_begin(block); if (idptr.type) { @@ -1330,19 +1325,14 @@ static void ui_template_id(uiLayout *layout, const bool live_icon, const bool hide_buttons) { - TemplateID *template_ui; - PropertyRNA *prop; - StructRNA *type; - short idcode; - - prop = RNA_struct_find_property(ptr, propname); + PropertyRNA *prop = RNA_struct_find_property(ptr, propname); if (!prop || RNA_property_type(prop) != PROP_POINTER) { RNA_warning("pointer property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); return; } - template_ui = MEM_callocN(sizeof(TemplateID), "TemplateID"); + TemplateID *template_ui = MEM_callocN(sizeof(TemplateID), "TemplateID"); template_ui->ptr = *ptr; template_ui->prop = prop; template_ui->prv_rows = prv_rows; @@ -1363,8 +1353,8 @@ static void ui_template_id(uiLayout *layout, flag |= UI_ID_OPEN; } - type = RNA_property_pointer_type(ptr, prop); - idcode = RNA_type_to_ID_code(type); + StructRNA *type = RNA_property_pointer_type(ptr, prop); + short idcode = RNA_type_to_ID_code(type); template_ui->idcode = idcode; template_ui->idlb = which_libbase(CTX_data_main(C), idcode); @@ -1563,12 +1553,9 @@ void uiTemplateAnyID(uiLayout *layout, const char *proptypename, const char *text) { - PropertyRNA *propID, *propType; - uiLayout *split, *row, *sub; - /* get properties... */ - propID = RNA_struct_find_property(ptr, propname); - propType = RNA_struct_find_property(ptr, proptypename); + PropertyRNA *propID = RNA_struct_find_property(ptr, propname); + PropertyRNA *propType = RNA_struct_find_property(ptr, proptypename); if (!propID || RNA_property_type(propID) != PROP_POINTER) { RNA_warning("pointer property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); @@ -1583,10 +1570,10 @@ void uiTemplateAnyID(uiLayout *layout, /* Start drawing UI Elements using standard defines */ /* NOTE: split amount here needs to be synced with normal labels */ - split = uiLayoutSplit(layout, 0.33f, false); + uiLayout *split = uiLayoutSplit(layout, 0.33f, false); /* FIRST PART ................................................ */ - row = uiLayoutRow(split, false); + uiLayout *row = uiLayoutRow(split, false); /* Label - either use the provided text, or will become "ID-Block:" */ if (text) { @@ -1605,7 +1592,7 @@ void uiTemplateAnyID(uiLayout *layout, /* HACK: special group just for the enum, * otherwise we get ugly layout with text included too... */ - sub = uiLayoutRow(row, true); + uiLayout *sub = uiLayoutRow(row, true); uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_LEFT); uiItemFullR(sub, ptr, propType, 0, 0, UI_ITEM_R_ICON_ONLY, "", ICON_NONE); @@ -1804,18 +1791,15 @@ static TemplateSearch *template_search_setup(PointerRNA *ptr, PointerRNA *searchptr, const char *const searchpropname) { - TemplateSearch *template_search; - PropertyRNA *prop, *searchprop; - - prop = RNA_struct_find_property(ptr, propname); + PropertyRNA *prop = RNA_struct_find_property(ptr, propname); if (!prop || RNA_property_type(prop) != PROP_POINTER) { RNA_warning("pointer property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); return NULL; } - searchprop = template_search_get_searchprop(ptr, prop, searchptr, searchpropname); + PropertyRNA *searchprop = template_search_get_searchprop(ptr, prop, searchptr, searchpropname); - template_search = MEM_callocN(sizeof(*template_search), __func__); + TemplateSearch *template_search = MEM_callocN(sizeof(*template_search), __func__); template_search->search_data.target_ptr = *ptr; template_search->search_data.target_prop = prop; template_search->search_data.search_ptr = *searchptr; @@ -1891,18 +1875,15 @@ void uiTemplatePathBuilder(uiLayout *layout, PointerRNA *UNUSED(root_ptr), const char *text) { - PropertyRNA *propPath; - uiLayout *row; - /* check that properties are valid */ - propPath = RNA_struct_find_property(ptr, propname); + PropertyRNA *propPath = RNA_struct_find_property(ptr, propname); if (!propPath || RNA_property_type(propPath) != PROP_STRING) { RNA_warning("path property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); return; } /* Start drawing UI Elements using standard defines */ - row = uiLayoutRow(layout, true); + uiLayout *row = uiLayoutRow(layout, true); /* Path (existing string) Widget */ uiItemR(row, ptr, propname, 0, text, ICON_RNA); @@ -6831,18 +6812,32 @@ void uiTemplateReportsBanner(uiLayout *layout, bContext *C) width = min_ii((int)(rti->widthfac * width), width); width = max_ii(width, 10 * UI_DPI_FAC); - /* make a box around the report to make it stand out */ UI_block_align_begin(block); - but = uiDefBut( - block, UI_BTYPE_ROUNDBOX, 0, "", 0, 0, UI_UNIT_X + 5, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, ""); - /* set the report's bg color in but->col - UI_BTYPE_ROUNDBOX feature */ - rgba_float_to_uchar(but->col, rti->col); + /* Background for icon. */ but = uiDefBut(block, UI_BTYPE_ROUNDBOX, 0, "", - UI_UNIT_X + 5, + 0, + 0, + UI_UNIT_X + (6 * UI_DPI_FAC), + UI_UNIT_Y, + NULL, + 0.0f, + 0.0f, + 0, + 0, + ""); + /* UI_BTYPE_ROUNDBOX's bg color is set in but->col. */ + UI_GetThemeColorType4ubv(UI_icon_colorid_from_report_type(report->type), SPACE_INFO, but->col); + + /* Background for the rest of the message. */ + but = uiDefBut(block, + UI_BTYPE_ROUNDBOX, + 0, + "", + UI_UNIT_X + (6 * UI_DPI_FAC), 0, UI_UNIT_X + width, UI_UNIT_Y, @@ -6852,46 +6847,39 @@ void uiTemplateReportsBanner(uiLayout *layout, bContext *C) 0, 0, ""); - rgba_float_to_uchar(but->col, rti->col); + + /* Use icon background at low opacity to highlight, but still contrasting with area TH_TEXT. */ + UI_GetThemeColorType4ubv(UI_icon_colorid_from_report_type(report->type), SPACE_INFO, but->col); + but->col[3] = 64; UI_block_align_end(block); - - /* icon and report message on top */ - const int icon = UI_icon_from_report_type(report->type); - - /* XXX: temporary operator to dump all reports to a text block, but only if more than 1 report - * to be shown instead of icon when appropriate... - */ UI_block_emboss_set(block, UI_EMBOSS_NONE); - if (reports->list.first != reports->list.last) { - uiDefIconButO(block, - UI_BTYPE_BUT, - "SCREEN_OT_info_log_show", - WM_OP_INVOKE_REGION_WIN, - icon, - 2, - 0, - UI_UNIT_X, - UI_UNIT_Y, - TIP_("Click to see the remaining reports in text block: 'Recent Reports'")); - } - else { - uiDefIconBut( - block, UI_BTYPE_LABEL, 0, icon, 2, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, ""); - } + /* The report icon itself. */ + but = uiDefIconButO(block, + UI_BTYPE_BUT, + "SCREEN_OT_info_log_show", + WM_OP_INVOKE_REGION_WIN, + UI_icon_from_report_type(report->type), + (3 * UI_DPI_FAC), + 0, + UI_UNIT_X, + UI_UNIT_Y, + TIP_("Click to see the remaining reports in text block: 'Recent Reports'")); + UI_GetThemeColorType4ubv(UI_text_colorid_from_report_type(report->type), SPACE_INFO, but->col); + but->col[3] = 255; /* This theme color is RBG only, so have to set alpha here. */ + /* The report message. */ but = uiDefButO(block, UI_BTYPE_BUT, "SCREEN_OT_info_log_show", WM_OP_INVOKE_REGION_WIN, report->message, - UI_UNIT_X + 5, + UI_UNIT_X, 0, - UI_UNIT_X + width, + width + UI_UNIT_X, UI_UNIT_Y, "Show in Info Log"); - rgba_float_to_uchar(but->col, rti->col); } void uiTemplateInputStatus(uiLayout *layout, struct bContext *C) @@ -7028,7 +7016,6 @@ void uiTemplateKeymapItemProperties(uiLayout *layout, PointerRNA *ptr) /* -------------------------------------------------------------------- */ /** \name Event Icon Template - * * \{ */ bool uiTemplateEventFromKeymapItem(struct uiLayout *layout, diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c index 958a0bc03cd..5311bb57da9 100644 --- a/source/blender/editors/interface/interface_utils.c +++ b/source/blender/editors/interface/interface_utils.c @@ -33,6 +33,7 @@ #include "BLI_listbase.h" #include "BLI_math.h" #include "BLI_string.h" +#include "BLI_string_search.h" #include "BLI_utildefines.h" #include "BLT_translation.h" @@ -374,15 +375,31 @@ typedef struct CollItemSearch { uint has_sep_char : 1; } CollItemSearch; -static int sort_search_items_list(const void *a, const void *b) +static bool add_collection_search_item(CollItemSearch *cis, + const bool requires_exact_data_name, + const bool has_id_icon, + uiSearchItems *items) { - const CollItemSearch *cis1 = a; - const CollItemSearch *cis2 = b; + char name_buf[UI_MAX_DRAW_STR]; - if (BLI_strcasecmp(cis1->name, cis2->name) > 0) { - return 1; + /* If no item has an own icon to display, libraries can use the library icons rather than the + * name prefix for showing the library status. */ + int name_prefix_offset = cis->name_prefix_offset; + if (!has_id_icon && cis->is_id && !requires_exact_data_name) { + cis->iconid = UI_icon_from_library(cis->data); + /* No need to re-allocate, string should be shorter than before (lib status prefix is + * removed). */ + BKE_id_full_name_ui_prefix_get(name_buf, cis->data, false, UI_SEP_CHAR, &name_prefix_offset); + BLI_assert(strlen(name_buf) <= MEM_allocN_len(cis->name)); + strcpy(cis->name, name_buf); } - return 0; + + return UI_search_item_add(items, + cis->name, + cis->data, + cis->iconid, + cis->has_sep_char ? UI_BUT_HAS_SEP_CHAR : 0, + name_prefix_offset); } void ui_rna_collection_search_update_fn(const struct bContext *C, @@ -392,9 +409,7 @@ void ui_rna_collection_search_update_fn(const struct bContext *C, { uiRNACollectionSearch *data = arg; const int flag = RNA_property_flag(data->target_prop); - int i = 0; ListBase *items_list = MEM_callocN(sizeof(ListBase), "items_list"); - CollItemSearch *cis; const bool is_ptr_target = (RNA_property_type(data->target_prop) == PROP_POINTER); /* For non-pointer properties, UI code acts entirely based on the item's name. So the name has to * match the RNA name exactly. So only for pointer properties, the name can be modified to add @@ -405,13 +420,10 @@ void ui_rna_collection_search_update_fn(const struct bContext *C, char *name; bool has_id_icon = false; - /* Prepare matching all words. */ - const size_t str_len = strlen(str); - const int words_max = BLI_string_max_possible_word_count(str_len); - int(*words)[2] = BLI_array_alloca(words, words_max); - const int words_len = BLI_string_find_split_words(str, str_len, ' ', words, words_max); + StringSearch *search = skip_filter ? NULL : BLI_string_search_new(); /* build a temporary list of relevant items first */ + int item_index = 0; RNA_PROP_BEGIN (&data->search_ptr, itemptr, data->search_prop) { if (flag & PROP_ID_SELF_CHECK) { @@ -456,54 +468,50 @@ void ui_rna_collection_search_update_fn(const struct bContext *C, } if (name) { - if (skip_filter || - BLI_string_all_words_matched(name + name_prefix_offset, str, words, words_len)) { - cis = MEM_callocN(sizeof(CollItemSearch), "CollectionItemSearch"); - cis->data = itemptr.data; - cis->name = BLI_strdup(name); - cis->index = i; - cis->iconid = iconid; - cis->is_id = is_id; - cis->name_prefix_offset = name_prefix_offset; - cis->has_sep_char = has_sep_char; - BLI_addtail(items_list, cis); + CollItemSearch *cis = MEM_callocN(sizeof(CollItemSearch), "CollectionItemSearch"); + cis->data = itemptr.data; + cis->name = BLI_strdup(name); + cis->index = item_index; + cis->iconid = iconid; + cis->is_id = is_id; + cis->name_prefix_offset = name_prefix_offset; + cis->has_sep_char = has_sep_char; + if (!skip_filter) { + BLI_string_search_add(search, name, cis); } + BLI_addtail(items_list, cis); if (name != name_buf) { MEM_freeN(name); } } - i++; + item_index++; } RNA_PROP_END; - BLI_listbase_sort(items_list, sort_search_items_list); - - /* add search items from temporary list */ - for (cis = items_list->first; cis; cis = cis->next) { - /* If no item has an own icon to display, libraries can use the library icons rather than the - * name prefix for showing the library status. */ - int name_prefix_offset = cis->name_prefix_offset; - if (!has_id_icon && cis->is_id && !requires_exact_data_name) { - cis->iconid = UI_icon_from_library(cis->data); - /* No need to re-allocate, string should be shorter than before (lib status prefix is - * removed). */ - BKE_id_full_name_ui_prefix_get(name_buf, cis->data, false, UI_SEP_CHAR, &name_prefix_offset); - BLI_assert(strlen(name_buf) <= MEM_allocN_len(cis->name)); - strcpy(cis->name, name_buf); - } - - if (!UI_search_item_add(items, - cis->name, - cis->data, - cis->iconid, - cis->has_sep_char ? UI_BUT_HAS_SEP_CHAR : 0, - name_prefix_offset)) { - break; + if (skip_filter) { + LISTBASE_FOREACH (CollItemSearch *, cis, items_list) { + if (!add_collection_search_item(cis, requires_exact_data_name, has_id_icon, items)) { + break; + } } } + else { + CollItemSearch **filtered_items; + int filtered_amount = BLI_string_search_query(search, str, (void ***)&filtered_items); - for (cis = items_list->first; cis; cis = cis->next) { + for (int i = 0; i < filtered_amount; i++) { + CollItemSearch *cis = filtered_items[i]; + if (!add_collection_search_item(cis, requires_exact_data_name, has_id_icon, items)) { + break; + } + } + + MEM_freeN(filtered_items); + BLI_string_search_free(search); + } + + LISTBASE_FOREACH (CollItemSearch *, cis, items_list) { MEM_freeN(cis->name); } BLI_freelistN(items_list); @@ -511,21 +519,15 @@ void ui_rna_collection_search_update_fn(const struct bContext *C, } /***************************** ID Utilities *******************************/ -int UI_icon_from_id(ID *id) +int UI_icon_from_id(const ID *id) { - Object *ob; - PointerRNA ptr; - short idcode; - if (id == NULL) { return ICON_NONE; } - idcode = GS(id->name); - /* exception for objects */ - if (idcode == ID_OB) { - ob = (Object *)id; + if (GS(id->name) == ID_OB) { + Object *ob = (Object *)id; if (ob->type == OB_EMPTY) { return ICON_EMPTY_DATA; @@ -535,7 +537,8 @@ int UI_icon_from_id(ID *id) /* otherwise get it through RNA, creating the pointer * will set the right type, also with subclassing */ - RNA_id_pointer_create(id, &ptr); + PointerRNA ptr; + RNA_id_pointer_create((ID *)id, &ptr); return (ptr.type) ? RNA_struct_ui_icon(ptr.type) : ICON_NONE; } @@ -544,7 +547,7 @@ int UI_icon_from_id(ID *id) int UI_icon_from_report_type(int type) { if (type & RPT_ERROR_ALL) { - return ICON_ERROR; + return ICON_CANCEL; } if (type & RPT_WARNING_ALL) { return ICON_ERROR; @@ -552,7 +555,62 @@ int UI_icon_from_report_type(int type) if (type & RPT_INFO_ALL) { return ICON_INFO; } - return ICON_NONE; + if (type & RPT_DEBUG_ALL) { + return ICON_SYSTEM; + } + if (type & RPT_PROPERTY) { + return ICON_OPTIONS; + } + if (type & RPT_OPERATOR) { + return ICON_CHECKMARK; + } + return ICON_INFO; +} + +int UI_icon_colorid_from_report_type(int type) +{ + if (type & RPT_ERROR_ALL) { + return TH_INFO_ERROR; + } + if (type & RPT_WARNING_ALL) { + return TH_INFO_WARNING; + } + if (type & RPT_INFO_ALL) { + return TH_INFO_INFO; + } + if (type & RPT_DEBUG_ALL) { + return TH_INFO_DEBUG; + } + if (type & RPT_PROPERTY) { + return TH_INFO_PROPERTY; + } + if (type & RPT_OPERATOR) { + return TH_INFO_OPERATOR; + } + return TH_INFO_WARNING; +} + +int UI_text_colorid_from_report_type(int type) +{ + if (type & RPT_ERROR_ALL) { + return TH_INFO_ERROR_TEXT; + } + if (type & RPT_WARNING_ALL) { + return TH_INFO_WARNING_TEXT; + } + if (type & RPT_INFO_ALL) { + return TH_INFO_INFO_TEXT; + } + if (type & RPT_DEBUG_ALL) { + return TH_INFO_DEBUG_TEXT; + } + if (type & RPT_PROPERTY) { + return TH_INFO_PROPERTY_TEXT; + } + if (type & RPT_OPERATOR) { + return TH_INFO_OPERATOR_TEXT; + } + return TH_INFO_WARNING_TEXT; } /********************************** Misc **************************************/ diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index 8b185f5dc20..0fa5999976b 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -2410,7 +2410,9 @@ static void widget_draw_text_icon(const uiFontStyle *fstyle, rect->xmin += 0.2f * U.widget_unit; } - widget_draw_icon(but, icon, alpha, rect, wcol->text); + /* By default icon is the color of text, but can optionally override with but->col. */ + widget_draw_icon(but, icon, alpha, rect, (but->col[3] != 0) ? but->col : wcol->text); + if (show_menu_icon) { BLI_assert(but->block->content_hints & UI_BLOCK_CONTAINS_SUBMENU_BUT); widget_draw_submenu_tria(but, rect, wcol); @@ -5235,8 +5237,9 @@ void ui_draw_menu_item(const uiFontStyle *fstyle, { uiWidgetType *wt = widget_type(UI_WTYPE_MENU_ITEM); const rcti _rect = *rect; + const int row_height = BLI_rcti_size_y(rect); int max_hint_width = INT_MAX; - int padding = 0.25f * UI_UNIT_X; + int padding = 0.25f * row_height; char *cpoin = NULL; wt->state(wt, state, 0, UI_EMBOSS_UNDEFINED); @@ -5247,7 +5250,7 @@ void ui_draw_menu_item(const uiFontStyle *fstyle, /* text location offset */ rect->xmin += padding; if (iconid) { - rect->xmin += UI_DPI_ICON_SIZE; + rect->xmin += row_height; /* Use square area for icon. */ } /* cut string in 2 parts? */ diff --git a/source/blender/editors/interface/view2d.c b/source/blender/editors/interface/view2d.c index 59aee0fde29..e4dad0f1a53 100644 --- a/source/blender/editors/interface/view2d.c +++ b/source/blender/editors/interface/view2d.c @@ -616,7 +616,7 @@ static void ui_view2d_curRect_validate_resize(View2D *v2d, bool resize) if ((width != curwidth) || (height != curheight)) { float temp, dh; - /* resize from centerpoint, unless otherwise specified */ + /* Resize from center-point, unless otherwise specified. */ if (width != curwidth) { if (v2d->keepofs & V2D_LOCKOFS_X) { cur->xmax += width - BLI_rctf_size_x(cur); @@ -1058,7 +1058,7 @@ void UI_view2d_zoom_cache_reset(void) /* While scaling we can accumulate fonts at many sizes (~20 or so). * Not an issue with embedded font, but can use over 500Mb with i18n ones! See T38244. */ - /* note: only some views draw text, we could check for this case to avoid clearning cache */ + /* Note: only some views draw text, we could check for this case to avoid cleaning cache. */ BLF_cache_clear(); } diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c index e234ab5dcdc..7453cd17868 100644 --- a/source/blender/editors/interface/view2d_ops.c +++ b/source/blender/editors/interface/view2d_ops.c @@ -1746,8 +1746,7 @@ void UI_view2d_smooth_view(bContext *C, ARegion *region, const rctf *cur, const if (v2d->smooth_timer) { WM_event_remove_timer(wm, win, v2d->smooth_timer); } - /* TIMER1 is hardcoded in keymap */ - /* max 30 frs/sec */ + /* TIMER1 is hard-coded in key-map. */ v2d->smooth_timer = WM_event_add_timer(wm, win, TIMER1, 1.0 / 100.0); ok = true; diff --git a/source/blender/editors/io/io_alembic.c b/source/blender/editors/io/io_alembic.c index 636e6688971..a66f53ea839 100644 --- a/source/blender/editors/io/io_alembic.c +++ b/source/blender/editors/io/io_alembic.c @@ -35,19 +35,16 @@ # include "MEM_guardedalloc.h" -# include "DNA_mesh_types.h" # include "DNA_modifier_types.h" # include "DNA_object_types.h" # include "DNA_scene_types.h" # include "DNA_space_types.h" # include "BKE_context.h" -# include "BKE_global.h" # include "BKE_main.h" # include "BKE_report.h" # include "BLI_listbase.h" -# include "BLI_math_vector.h" # include "BLI_path_util.h" # include "BLI_string.h" # include "BLI_utildefines.h" diff --git a/source/blender/editors/io/io_cache.c b/source/blender/editors/io/io_cache.c index b73b8abccfe..1e66a86c8fd 100644 --- a/source/blender/editors/io/io_cache.c +++ b/source/blender/editors/io/io_cache.c @@ -26,7 +26,6 @@ #include "DNA_cachefile_types.h" #include "DNA_space_types.h" -#include "BLI_listbase.h" #include "BLI_path_util.h" #include "BLI_string.h" diff --git a/source/blender/editors/io/io_collada.c b/source/blender/editors/io/io_collada.c index 200786ca99d..2bf975cc4f5 100644 --- a/source/blender/editors/io/io_collada.c +++ b/source/blender/editors/io/io_collada.c @@ -29,7 +29,6 @@ # include "BLI_utildefines.h" # include "BKE_context.h" -# include "BKE_global.h" # include "BKE_main.h" # include "BKE_object.h" # include "BKE_report.h" @@ -37,7 +36,6 @@ # include "DEG_depsgraph.h" # include "ED_object.h" -# include "ED_screen.h" # include "RNA_access.h" # include "RNA_define.h" diff --git a/source/blender/editors/lattice/editlattice_undo.c b/source/blender/editors/lattice/editlattice_undo.c index 3ffbc3712fc..d92a81179cc 100644 --- a/source/blender/editors/lattice/editlattice_undo.c +++ b/source/blender/editors/lattice/editlattice_undo.c @@ -40,6 +40,7 @@ #include "BKE_context.h" #include "BKE_layer.h" #include "BKE_main.h" +#include "BKE_object.h" #include "BKE_undo_system.h" #include "DEG_depsgraph.h" @@ -220,11 +221,10 @@ static void lattice_undosys_step_decode(struct bContext *C, { LatticeUndoStep *us = (LatticeUndoStep *)us_p; - /* Load all our objects into edit-mode, clear everything else. */ ED_undo_object_editmode_restore_helper( C, &us->elems[0].obedit_ref.ptr, us->elems_len, sizeof(*us->elems)); - BLI_assert(lattice_undosys_poll(C)); + BLI_assert(BKE_object_is_in_editmode(us->elems[0].obedit_ref.ptr)); for (uint i = 0; i < us->elems_len; i++) { LatticeUndoStep_Elem *elem = &us->elems[i]; @@ -245,7 +245,10 @@ static void lattice_undosys_step_decode(struct bContext *C, /* The first element is always active */ ED_undo_object_set_active_or_warn( - CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); + CTX_data_scene(C), CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); + + /* Check after setting active. */ + BLI_assert(lattice_undosys_poll(C)); bmain->is_memfile_undo_flush_needed = true; diff --git a/source/blender/editors/lattice/lattice_ops.c b/source/blender/editors/lattice/lattice_ops.c index d5505c00132..3f96b8a303b 100644 --- a/source/blender/editors/lattice/lattice_ops.c +++ b/source/blender/editors/lattice/lattice_ops.c @@ -23,15 +23,10 @@ #include "DNA_scene_types.h" -#include "RNA_access.h" - #include "WM_api.h" -#include "WM_types.h" #include "ED_lattice.h" -#include "ED_object.h" #include "ED_screen.h" -#include "ED_select_utils.h" #include "lattice_intern.h" diff --git a/source/blender/editors/mask/mask_query.c b/source/blender/editors/mask/mask_query.c index eace146dbe9..401b6eac4f2 100644 --- a/source/blender/editors/mask/mask_query.c +++ b/source/blender/editors/mask/mask_query.c @@ -604,7 +604,22 @@ void ED_mask_point_pos__reverse( *yr = co[1]; } -bool ED_mask_selected_minmax(const bContext *C, float min[2], float max[2], bool include_handles) +static void handle_position_for_minmax(const MaskSplinePoint *point, + eMaskWhichHandle which_handle, + bool handles_as_control_point, + float r_handle[2]) +{ + if (handles_as_control_point) { + copy_v2_v2(r_handle, point->bezt.vec[1]); + return; + } + BKE_mask_point_handle(point, which_handle, r_handle); +} + +bool ED_mask_selected_minmax(const bContext *C, + float min[2], + float max[2], + bool handles_as_control_point) { Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); Mask *mask = CTX_data_edit_mask(C); @@ -641,22 +656,22 @@ bool ED_mask_selected_minmax(const bContext *C, float min[2], float max[2], bool ok = true; } - if (!include_handles) { - /* Ignore handles. */ - } - else if (BKE_mask_point_handles_mode_get(point) == MASK_HANDLE_MODE_STICK) { - BKE_mask_point_handle(deform_point, MASK_WHICH_HANDLE_STICK, handle); + if (BKE_mask_point_handles_mode_get(point) == MASK_HANDLE_MODE_STICK) { + handle_position_for_minmax( + deform_point, MASK_WHICH_HANDLE_STICK, handles_as_control_point, handle); minmax_v2v2_v2(min, max, handle); ok = true; } else { if ((bezt->f1 & SELECT) && (bezt->h1 != HD_VECT)) { - BKE_mask_point_handle(deform_point, MASK_WHICH_HANDLE_LEFT, handle); + handle_position_for_minmax( + deform_point, MASK_WHICH_HANDLE_LEFT, handles_as_control_point, handle); minmax_v2v2_v2(min, max, handle); ok = true; } if ((bezt->f3 & SELECT) && (bezt->h2 != HD_VECT)) { - BKE_mask_point_handle(deform_point, MASK_WHICH_HANDLE_RIGHT, handle); + handle_position_for_minmax( + deform_point, MASK_WHICH_HANDLE_RIGHT, handles_as_control_point, handle); minmax_v2v2_v2(min, max, handle); ok = true; } diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c index a5dd29c9d73..d60d83850a5 100644 --- a/source/blender/editors/mesh/editmesh_add.c +++ b/source/blender/editors/mesh/editmesh_add.c @@ -24,7 +24,6 @@ #include "BLI_math.h" #include "BLI_sys_types.h" -#include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" @@ -42,7 +41,6 @@ #include "ED_mesh.h" #include "ED_object.h" #include "ED_screen.h" -#include "ED_uvedit.h" #include "mesh_intern.h" /* own include */ diff --git a/source/blender/editors/mesh/editmesh_automerge.c b/source/blender/editors/mesh/editmesh_automerge.c index f9910f01f47..2bd5b9b26ca 100644 --- a/source/blender/editors/mesh/editmesh_automerge.c +++ b/source/blender/editors/mesh/editmesh_automerge.c @@ -26,12 +26,9 @@ * - #EDBM_automerge_and_split */ -#include "MEM_guardedalloc.h" - #include "BKE_editmesh.h" #include "DNA_object_types.h" -#include "DNA_scene_types.h" #include "ED_mesh.h" diff --git a/source/blender/editors/mesh/editmesh_bevel.c b/source/blender/editors/mesh/editmesh_bevel.c index 644aa3903f6..66a7b97b440 100644 --- a/source/blender/editors/mesh/editmesh_bevel.c +++ b/source/blender/editors/mesh/editmesh_bevel.c @@ -28,11 +28,9 @@ #include "BLT_translation.h" #include "BKE_context.h" -#include "BKE_curveprofile.h" #include "BKE_editmesh.h" #include "BKE_global.h" #include "BKE_layer.h" -#include "BKE_mesh.h" #include "BKE_unit.h" #include "DNA_curveprofile_types.h" diff --git a/source/blender/editors/mesh/editmesh_extrude_spin.c b/source/blender/editors/mesh/editmesh_extrude_spin.c index 7b3fabf07fc..187652ae00f 100644 --- a/source/blender/editors/mesh/editmesh_extrude_spin.c +++ b/source/blender/editors/mesh/editmesh_extrude_spin.c @@ -33,17 +33,13 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_enum_types.h" -#include "WM_api.h" #include "WM_types.h" #include "ED_mesh.h" #include "ED_screen.h" #include "ED_view3d.h" -#include "UI_resources.h" - #include "MEM_guardedalloc.h" #include "mesh_intern.h" /* own include */ diff --git a/source/blender/editors/mesh/editmesh_inset.c b/source/blender/editors/mesh/editmesh_inset.c index 8427458d9cc..9000a942e50 100644 --- a/source/blender/editors/mesh/editmesh_inset.c +++ b/source/blender/editors/mesh/editmesh_inset.c @@ -97,9 +97,20 @@ static void edbm_inset_update_header(wmOperator *op, bContext *C) outputNumInput(&opdata->num_input, flts_str, &sce->unit); } else { - BLI_snprintf(flts_str, NUM_STR_REP_LEN, "%f", RNA_float_get(op->ptr, "thickness")); - BLI_snprintf( - flts_str + NUM_STR_REP_LEN, NUM_STR_REP_LEN, "%f", RNA_float_get(op->ptr, "depth")); + BKE_unit_value_as_string(flts_str, + NUM_STR_REP_LEN, + RNA_float_get(op->ptr, "thickness"), + 4, + B_UNIT_LENGTH, + &sce->unit, + true); + BKE_unit_value_as_string(flts_str + NUM_STR_REP_LEN, + NUM_STR_REP_LEN, + RNA_float_get(op->ptr, "depth"), + 4, + B_UNIT_LENGTH, + &sce->unit, + true); } BLI_snprintf(msg, sizeof(msg), diff --git a/source/blender/editors/mesh/editmesh_loopcut.c b/source/blender/editors/mesh/editmesh_loopcut.c index 373d82883d1..2057738221b 100644 --- a/source/blender/editors/mesh/editmesh_loopcut.c +++ b/source/blender/editors/mesh/editmesh_loopcut.c @@ -189,8 +189,8 @@ static void ringsel_finish(bContext *C, wmOperator *op) const int seltype = is_edge_wire ? SUBDIV_SELECT_INNER : is_single ? SUBDIV_SELECT_NONE : SUBDIV_SELECT_LOOPCUT; - /* Enable gridfill, so that intersecting loopcut works as one would expect. - * Note though that it will break edgeslide in this specific case. + /* Enable grid-fill, so that intersecting loop-cut works as one would expect. + * Note though that it will break edge-slide in this specific case. * See T31939. */ BM_mesh_esubdivide(em->bm, BM_ELEM_SELECT, diff --git a/source/blender/editors/mesh/editmesh_polybuild.c b/source/blender/editors/mesh/editmesh_polybuild.c index da3d16ba04f..4d37b78c9b7 100644 --- a/source/blender/editors/mesh/editmesh_polybuild.c +++ b/source/blender/editors/mesh/editmesh_polybuild.c @@ -523,7 +523,6 @@ void MESH_OT_polybuild_split_at_cursor(wmOperatorType *ot) /* -------------------------------------------------------------------- */ /** \name Dissolve at Cursor - * * \{ */ static int edbm_polybuild_dissolve_at_cursor_invoke(bContext *C, diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c index c8449644dd0..903e50bf668 100644 --- a/source/blender/editors/mesh/editmesh_select.c +++ b/source/blender/editors/mesh/editmesh_select.c @@ -995,7 +995,7 @@ bool EDBM_unified_findnearest(ViewContext *vc, /* -------------------------------------------------------------------- */ /** \name Alternate Find Nearest Vert/Edge (optional boundary) * - * \note This uses ray-cast method instead of backbuffer, + * \note This uses ray-cast method instead of back-buffer, * currently used for poly-build. * \{ */ diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index a4c6f9790a5..334afdfb2d9 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -3101,7 +3101,8 @@ static bool merge_firstlast(BMEditMesh *em, * so do extra check for data here */ - /* do sanity check in mergemenu in edit.c ?*/ + /* While #merge_type_itemf does a sanity check, this operation runs on all edit-mode objects. + * Some of them may not have the expected selection state. */ if (use_first == false) { if (!em->bm->selected.last || ((BMEditSelection *)em->bm->selected.last)->htype != BM_VERT) { return false; @@ -3260,11 +3261,11 @@ static int edbm_merge_exec(bContext *C, wmOperator *op) } static const EnumPropertyItem merge_type_items[] = { - {MESH_MERGE_FIRST, "FIRST", 0, "At First", ""}, - {MESH_MERGE_LAST, "LAST", 0, "At Last", ""}, {MESH_MERGE_CENTER, "CENTER", 0, "At Center", ""}, {MESH_MERGE_CURSOR, "CURSOR", 0, "At Cursor", ""}, {MESH_MERGE_COLLAPSE, "COLLAPSE", 0, "Collapse", ""}, + {MESH_MERGE_FIRST, "FIRST", 0, "At First", ""}, + {MESH_MERGE_LAST, "LAST", 0, "At Last", ""}, {0, NULL, 0, NULL, NULL}, }; @@ -3283,6 +3284,11 @@ static const EnumPropertyItem *merge_type_itemf(bContext *C, int totitem = 0; BMEditMesh *em = BKE_editmesh_from_object(obedit); + /* Keep these first so that their automatic shortcuts don't change. */ + RNA_enum_items_add_value(&item, &totitem, merge_type_items, MESH_MERGE_CENTER); + RNA_enum_items_add_value(&item, &totitem, merge_type_items, MESH_MERGE_CURSOR); + RNA_enum_items_add_value(&item, &totitem, merge_type_items, MESH_MERGE_COLLAPSE); + /* Only active object supported: * In practice it doesn't make sense to run this operation on non-active meshes * since selecting will activate - we could have own code-path for these but it's a hassle @@ -3304,9 +3310,6 @@ static const EnumPropertyItem *merge_type_itemf(bContext *C, } } - RNA_enum_items_add_value(&item, &totitem, merge_type_items, MESH_MERGE_CENTER); - RNA_enum_items_add_value(&item, &totitem, merge_type_items, MESH_MERGE_CURSOR); - RNA_enum_items_add_value(&item, &totitem, merge_type_items, MESH_MERGE_COLLAPSE); RNA_enum_item_end(&item, &totitem); *r_free = true; @@ -6994,7 +6997,7 @@ void MESH_OT_sort_elements(wmOperatorType *ot) "MATERIAL", 0, "Material", - "Sort selected elements from smallest to greatest material index (faces only!)"}, + "Sort selected faces from smallest to greatest material index"}, {SRT_SELECTED, "SELECTED", 0, diff --git a/source/blender/editors/mesh/editmesh_undo.c b/source/blender/editors/mesh/editmesh_undo.c index 1b6a79108b0..d40bd790122 100644 --- a/source/blender/editors/mesh/editmesh_undo.c +++ b/source/blender/editors/mesh/editmesh_undo.c @@ -39,6 +39,7 @@ #include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_mesh.h" +#include "BKE_object.h" #include "BKE_undo_system.h" #include "DEG_depsgraph.h" @@ -153,6 +154,23 @@ static void um_arraystore_cd_compact(struct CustomData *cdata, for (int layer_start = 0, layer_end; layer_start < cdata->totlayer; layer_start = layer_end) { const CustomDataType type = cdata->layers[layer_start].type; + /* Perform a full copy on dynamic layers. + * + * Unfortunately we can't compare dynamic layer types as they contain allocated pointers, + * which burns CPU cycles looking for duplicate data that doesn't exist. + * The array data isn't comparable once copied from the mesh, + * this bottlenecks on high poly meshes, see T84114. + * + * Notes: + * + * - Ideally the data would be expanded into a format that could be de-duplicated effectively, + * this would require a flat representation of each dynamic custom-data layer. + * + * - The data in the layer could be kept as-is to save on the extra copy, + * it would complicate logic in this function. + */ + const bool layer_type_is_dynamic = CustomData_layertype_is_dynamic(type); + layer_end = layer_start + 1; while ((layer_end < cdata->totlayer) && (type == cdata->layers[layer_end].type)) { layer_end++; @@ -209,6 +227,11 @@ static void um_arraystore_cd_compact(struct CustomData *cdata, i < bcd_reference_current->states_len) ? bcd_reference_current->states[i] : NULL; + /* See comment on `layer_type_is_dynamic` above. */ + if (layer_type_is_dynamic) { + state_reference = NULL; + } + bcd->states[i] = BLI_array_store_state_add( bs, layer->data, (size_t)data_len * stride, state_reference); } @@ -543,7 +566,7 @@ static void *undomesh_from_editmesh(UndoMesh *um, BMEditMesh *em, Key *key) ((LinkData *)um_arraystore.local_links.last)->data : NULL; - /* add oursrlves */ + /* Add ourselves. */ BLI_addtail(&um_arraystore.local_links, BLI_genericNodeN(um)); # ifdef USE_ARRAY_STORE_THREAD @@ -752,11 +775,10 @@ static void mesh_undosys_step_decode(struct bContext *C, { MeshUndoStep *us = (MeshUndoStep *)us_p; - /* Load all our objects into edit-mode, clear everything else. */ ED_undo_object_editmode_restore_helper( C, &us->elems[0].obedit_ref.ptr, us->elems_len, sizeof(*us->elems)); - BLI_assert(mesh_undosys_poll(C)); + BLI_assert(BKE_object_is_in_editmode(us->elems[0].obedit_ref.ptr)); for (uint i = 0; i < us->elems_len; i++) { MeshUndoStep_Elem *elem = &us->elems[i]; @@ -778,7 +800,10 @@ static void mesh_undosys_step_decode(struct bContext *C, /* The first element is always active */ ED_undo_object_set_active_or_warn( - CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); + CTX_data_scene(C), CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); + + /* Check after setting active. */ + BLI_assert(mesh_undosys_poll(C)); Scene *scene = CTX_data_scene(C); scene->toolsettings->selectmode = us->elems[0].data.selectmode; diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c index 54d540845cf..46c744085cc 100644 --- a/source/blender/editors/mesh/mesh_ops.c +++ b/source/blender/editors/mesh/mesh_ops.c @@ -21,7 +21,6 @@ * \ingroup edmesh */ -#include "DNA_modifier_types.h" #include "DNA_scene_types.h" #include "RNA_access.h" @@ -30,9 +29,7 @@ #include "WM_types.h" #include "ED_mesh.h" -#include "ED_object.h" #include "ED_screen.h" -#include "ED_select_utils.h" #include "mesh_intern.h" /* own include */ diff --git a/source/blender/editors/metaball/editmball_undo.c b/source/blender/editors/metaball/editmball_undo.c index b817bc3a718..a8b471a7c92 100644 --- a/source/blender/editors/metaball/editmball_undo.c +++ b/source/blender/editors/metaball/editmball_undo.c @@ -38,6 +38,7 @@ #include "BKE_context.h" #include "BKE_layer.h" #include "BKE_main.h" +#include "BKE_object.h" #include "BKE_undo_system.h" #include "DEG_depsgraph.h" @@ -195,11 +196,10 @@ static void mball_undosys_step_decode(struct bContext *C, { MBallUndoStep *us = (MBallUndoStep *)us_p; - /* Load all our objects into edit-mode, clear everything else. */ ED_undo_object_editmode_restore_helper( C, &us->elems[0].obedit_ref.ptr, us->elems_len, sizeof(*us->elems)); - BLI_assert(mball_undosys_poll(C)); + BLI_assert(BKE_object_is_in_editmode(us->elems[0].obedit_ref.ptr)); for (uint i = 0; i < us->elems_len; i++) { MBallUndoStep_Elem *elem = &us->elems[i]; @@ -220,7 +220,10 @@ static void mball_undosys_step_decode(struct bContext *C, /* The first element is always active */ ED_undo_object_set_active_or_warn( - CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); + CTX_data_scene(C), CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); + + /* Check after setting active. */ + BLI_assert(mball_undosys_poll(C)); bmain->is_memfile_undo_flush_needed = true; diff --git a/source/blender/editors/metaball/mball_edit.c b/source/blender/editors/metaball/mball_edit.c index cf453bf0c32..292052b778a 100644 --- a/source/blender/editors/metaball/mball_edit.c +++ b/source/blender/editors/metaball/mball_edit.c @@ -205,7 +205,7 @@ void MBALL_OT_select_all(wmOperatorType *ot) { /* identifiers */ ot->name = "(De)select All"; - ot->description = "Change selection of all meta elements"; + ot->description = "Change selection of all metaball elements"; ot->idname = "MBALL_OT_select_all"; /* callback functions */ @@ -529,7 +529,7 @@ void MBALL_OT_select_random_metaelems(struct wmOperatorType *ot) { /* identifiers */ ot->name = "Select Random"; - ot->description = "Randomly select metaelements"; + ot->description = "Randomly select metaball elements"; ot->idname = "MBALL_OT_select_random_metaelems"; /* callback functions */ @@ -587,8 +587,8 @@ static int duplicate_metaelems_exec(bContext *C, wmOperator *UNUSED(op)) void MBALL_OT_duplicate_metaelems(wmOperatorType *ot) { /* identifiers */ - ot->name = "Duplicate Metaelements"; - ot->description = "Duplicate selected metaelement(s)"; + ot->name = "Duplicate Metaball Elements"; + ot->description = "Duplicate selected metaball element(s)"; ot->idname = "MBALL_OT_duplicate_metaelems"; /* callback functions */ @@ -647,7 +647,7 @@ void MBALL_OT_delete_metaelems(wmOperatorType *ot) { /* identifiers */ ot->name = "Delete"; - ot->description = "Delete selected metaelement(s)"; + ot->description = "Delete selected metaball element(s)"; ot->idname = "MBALL_OT_delete_metaelems"; /* callback functions */ @@ -692,7 +692,7 @@ void MBALL_OT_hide_metaelems(wmOperatorType *ot) { /* identifiers */ ot->name = "Hide Selected"; - ot->description = "Hide (un)selected metaelement(s)"; + ot->description = "Hide (un)selected metaball element(s)"; ot->idname = "MBALL_OT_hide_metaelems"; /* callback functions */ @@ -739,7 +739,7 @@ void MBALL_OT_reveal_metaelems(wmOperatorType *ot) { /* identifiers */ ot->name = "Reveal Hidden"; - ot->description = "Reveal all hidden metaelements"; + ot->description = "Reveal all hidden metaball elements"; ot->idname = "MBALL_OT_reveal_metaelems"; /* callback functions */ diff --git a/source/blender/editors/metaball/mball_ops.c b/source/blender/editors/metaball/mball_ops.c index 100ca4691ca..e57161928b0 100644 --- a/source/blender/editors/metaball/mball_ops.c +++ b/source/blender/editors/metaball/mball_ops.c @@ -29,9 +29,7 @@ #include "WM_types.h" #include "ED_mball.h" -#include "ED_object.h" #include "ED_screen.h" -#include "ED_select_utils.h" #include "mball_intern.h" @@ -55,7 +53,7 @@ void ED_operatormacros_metaball(void) ot = WM_operatortype_append_macro("MBALL_OT_duplicate_move", "Duplicate", - "Make copies of the selected metaelements and move them", + "Make copies of the selected metaball elements and move them", OPTYPE_UNDO | OPTYPE_REGISTER); WM_operatortype_macro_define(ot, "MBALL_OT_duplicate_metaelems"); otmacro = WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 2d3505fa9d0..dc941f12eba 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -265,7 +265,6 @@ static int object_add_drop_xy_generic_invoke(bContext *C, wmOperator *op, const /* -------------------------------------------------------------------- */ /** \name Public Add Object API - * * \{ */ void ED_object_location_from_view(bContext *C, float loc[3]) @@ -516,7 +515,7 @@ bool ED_object_add_generic_get_opts(bContext *C, if (RNA_struct_property_is_set(op->ptr, "rotation")) { /* If rotation is set, always use it. Alignment (and corresponding user preference) * can be ignored since this is in world space anyways. - * To not confuse (e.g. on redo), dont set it to ALIGN_WORLD in the op UI though. */ + * To not confuse (e.g. on redo), don't set it to #ALIGN_WORLD in the op UI though. */ *is_view_aligned = false; RNA_float_get_array(op->ptr, "rotation", rot); } @@ -1854,7 +1853,7 @@ void ED_object_base_free_and_unlink(Main *bmain, Scene *scene, Object *ob) ID_EXTRA_USERS(ob) == 0) { /* We cannot delete indirectly used object... */ printf( - "WARNING, undeletable object '%s', should have been catched before reaching this " + "WARNING, undeletable object '%s', should have been caught before reaching this " "function!", ob->id.name + 2); return; @@ -2300,7 +2299,7 @@ static void make_object_duplilist_real(bContext *C, /* OK to keep most of the members uninitialized, * they won't be read, this is simply for a hash lookup. */ DupliObject dob_key; - /* We are looking one step upper in hierarchy, so we need to 'shift' the persitent_id, + /* We are looking one step upper in hierarchy, so we need to 'shift' the `persistent_id`, * ignoring the first item. * We only check on persistent_id here, since we have no idea what object it might be. */ memcpy(&dob_key.persistent_id[0], @@ -2405,7 +2404,7 @@ void OBJECT_OT_duplicates_make_real(wmOperatorType *ot) "use_base_parent", 0, "Parent", - "Parent newly created objects to the original duplicator"); + "Parent newly created objects to the original instancer"); RNA_def_boolean( ot->srna, "use_hierarchy", 0, "Keep Hierarchy", "Maintain parent child relationships"); } @@ -3411,7 +3410,6 @@ void OBJECT_OT_add_named(wmOperatorType *ot) /* -------------------------------------------------------------------- */ /** \name Join Object Operator - * * \{ */ static bool object_join_poll(bContext *C) diff --git a/source/blender/editors/object/object_bake_api.c b/source/blender/editors/object/object_bake_api.c index b1ba856ff0f..9ec0c625f71 100644 --- a/source/blender/editors/object/object_bake_api.c +++ b/source/blender/editors/object/object_bake_api.c @@ -44,6 +44,7 @@ #include "BKE_main.h" #include "BKE_material.h" #include "BKE_mesh.h" +#include "BKE_mesh_mapping.h" #include "BKE_modifier.h" #include "BKE_node.h" #include "BKE_object.h" @@ -946,7 +947,7 @@ static bool bake_targets_init_vertex_colors(BakeTargets *targets, Object *ob, Re targets->num_materials = ob->totcol; BakeImage *bk_image = &targets->images[0]; - bk_image->width = me->totvert; + bk_image->width = me->totloop; bk_image->height = 1; bk_image->offset = 0; bk_image->image = NULL; @@ -968,6 +969,7 @@ static void bake_targets_populate_pixels_vertex_colors(BakeTargets *targets, pixel->primitive_id = -1; pixel->object_id = 0; + pixel->seed = 0; pixel->du_dx = 0.0f; pixel->du_dy = 0.0f; pixel->dv_dx = 0.0f; @@ -986,8 +988,8 @@ static void bake_targets_populate_pixels_vertex_colors(BakeTargets *targets, const MLoopTri *lt = &looptri[i]; for (int j = 0; j < 3; j++) { - const unsigned int v = me->mloop[lt->tri[j]].v; - BakePixel *pixel = &pixel_array[v]; + const unsigned int l = lt->tri[j]; + BakePixel *pixel = &pixel_array[l]; if (pixel->primitive_id != -1) { continue; @@ -995,6 +997,11 @@ static void bake_targets_populate_pixels_vertex_colors(BakeTargets *targets, pixel->primitive_id = i; + /* Seed is the vertex, so that sampling noise is coherent for the same + * vertex, but different corners can still have different normals, + * materials and UVs. */ + pixel->seed = me->mloop[l].v; + /* Barycentric coordinates, nudged a bit to avoid precision issues that * may happen when exactly at the vertex coordinate. */ if (j == 0) { @@ -1015,24 +1022,24 @@ static void bake_targets_populate_pixels_vertex_colors(BakeTargets *targets, MEM_freeN(looptri); } -static void bake_result_to_rgba(float rgba[4], const float *result, const int num_channels) +static void bake_result_add_to_rgba(float rgba[4], const float *result, const int num_channels) { if (num_channels == 4) { - copy_v4_v4(rgba, result); + add_v4_v4(rgba, result); } else if (num_channels == 3) { - copy_v3_v3(rgba, result); - rgba[3] = 1.0f; + add_v3_v3(rgba, result); + rgba[3] += 1.0f; } else { - rgba[0] = result[0]; - rgba[1] = result[0]; - rgba[2] = result[0]; - rgba[3] = 1.0f; + rgba[0] += result[0]; + rgba[1] += result[0]; + rgba[2] += result[0]; + rgba[3] += 1.0f; } } -static bool bake_targets_output_vertex_colors(BakeTargets *targets, Object *ob) +static bool bake_targets_output_vertex_colors(BakeTargets *targets, Object *ob, Mesh *me_split) { Mesh *me = ob->data; MPropCol *mcol = CustomData_get_layer(&me->vdata, CD_PROP_COLOR); @@ -1040,26 +1047,45 @@ static bool bake_targets_output_vertex_colors(BakeTargets *targets, Object *ob) const int num_channels = targets->num_channels; const float *result = targets->result; + /* We bake using a mesh with additional vertices for split normals, but the + * number of loops must match to be able to transfer the vertex colors. */ + BLI_assert(me->totloop == me_split->totloop); + UNUSED_VARS_NDEBUG(me_split); + if (mcol) { - /* Float vertex colors in scene linear color space. */ const int totvert = me->totvert; - for (int i = 0; i < totvert; i++, mcol++) { - bake_result_to_rgba(mcol->color, &result[i * num_channels], num_channels); + const int totloop = me->totloop; + + /* Accumulate float vertex colors in scene linear color space. */ + int *num_loops_for_vertex = MEM_callocN(sizeof(int) * me->totvert, "num_loops_for_vertex"); + memset(mcol, 0, sizeof(MPropCol) * me->totvert); + + MLoop *mloop = me->mloop; + for (int i = 0; i < totloop; i++, mloop++) { + const int v = mloop->v; + bake_result_add_to_rgba(mcol[v].color, &result[i * num_channels], num_channels); + num_loops_for_vertex[v]++; } + + /* Normalize for number of loops. */ + for (int i = 0; i < totvert; i++) { + if (num_loops_for_vertex[i] > 0) { + mul_v4_fl(mcol[i].color, 1.0f / num_loops_for_vertex[i]); + } + } + + MEM_SAFE_FREE(num_loops_for_vertex); } else { - /* Byte loop colors in sRGB colors space. - * - * Note that colors have been baked per vertex and not per corner, which - * could be useful to preserve material discontinuities. However this also - * leads to unintended discontinuities due to sampling noise. */ + /* Byte loop colors in sRGB colors space. */ MLoop *mloop = me->mloop; const int totloop = me->totloop; const bool is_noncolor = targets->is_noncolor; for (int i = 0; i < totloop; i++, mloop++, mloopcol++) { float rgba[4]; - bake_result_to_rgba(rgba, &result[mloop->v * num_channels], num_channels); + zero_v4(rgba); + bake_result_add_to_rgba(rgba, &result[i * num_channels], num_channels); if (is_noncolor) { unit_float_to_uchar_clamp_v4(&mloopcol->r, rgba); @@ -1142,7 +1168,7 @@ static bool bake_targets_output(const BakeAPIRender *bkr, } } else if (bkr->target == R_BAKE_TARGET_VERTEX_COLORS) { - return bake_targets_output_vertex_colors(targets, ob); + return bake_targets_output_vertex_colors(targets, ob, me); } return false; @@ -1212,10 +1238,6 @@ static int bake(const BakeAPIRender *bkr, } } - if (!bake_targets_init(bkr, &targets, ob_low, reports)) { - goto cleanup; - } - if (bkr->is_selected_to_active) { CollectionPointerLink *link; tot_highpoly = 0; @@ -1245,9 +1267,6 @@ static int bake(const BakeAPIRender *bkr, } } - pixel_array_low = MEM_mallocN(sizeof(BakePixel) * targets.num_pixels, "bake pixels low poly"); - pixel_array_high = MEM_mallocN(sizeof(BakePixel) * targets.num_pixels, "bake pixels high poly"); - /* for multires bake, use linear UV subdivision to match low res UVs */ if (bkr->pass_type == SCE_PASS_NORMAL && bkr->normal_space == R_BAKE_SPACE_TANGENT && !bkr->is_selected_to_active) { @@ -1265,11 +1284,17 @@ static int bake(const BakeAPIRender *bkr, /* get the mesh as it arrives in the renderer */ me_low = bake_mesh_new_from_object(ob_low_eval); - /* populate the pixel array with the face data */ + /* Initialize bake targets. */ + if (!bake_targets_init(bkr, &targets, ob_low_eval, reports)) { + goto cleanup; + } + + /* Populate the pixel array with the face data. Except if we use a cage, then + * it is populated later with the cage mesh (smoothed version of the mesh). */ + pixel_array_low = MEM_mallocN(sizeof(BakePixel) * targets.num_pixels, "bake pixels low poly"); if ((bkr->is_selected_to_active && (ob_cage == NULL) && bkr->is_cage) == false) { bake_targets_populate_pixels(bkr, &targets, me_low, pixel_array_low); } - /* else populate the pixel array with the 'cage' mesh (the smooth version of the mesh) */ if (bkr->is_selected_to_active) { CollectionPointerLink *link; @@ -1358,6 +1383,9 @@ static int bake(const BakeAPIRender *bkr, ob_low_eval->base_flag &= ~(BASE_VISIBLE_DEPSGRAPH | BASE_ENABLED_RENDER); /* populate the pixel arrays with the corresponding face data for each high poly object */ + pixel_array_high = MEM_mallocN(sizeof(BakePixel) * targets.num_pixels, + "bake pixels high poly"); + if (!RE_bake_pixels_populate_from_objects(me_low, pixel_array_low, pixel_array_high, diff --git a/source/blender/editors/object/object_data_transfer.c b/source/blender/editors/object/object_data_transfer.c index a80810cc734..72ef72403cf 100644 --- a/source/blender/editors/object/object_data_transfer.c +++ b/source/blender/editors/object/object_data_transfer.c @@ -51,8 +51,6 @@ #include "ED_object.h" -#include "UI_interface.h" - #include "object_intern.h" /* All possible data to transfer. @@ -617,7 +615,7 @@ void OBJECT_OT_data_transfer(wmOperatorType *ot) ot->name = "Transfer Mesh Data"; ot->idname = "OBJECT_OT_data_transfer"; ot->description = - "Transfer data layer(s) (weights, edge sharp, ...) from active to selected meshes"; + "Transfer data layer(s) (weights, edge sharp, etc.) from active to selected meshes"; /* API callbacks.*/ ot->poll = data_transfer_poll; diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 4cf49d262ca..da14d4ef52a 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -718,20 +718,26 @@ bool ED_object_editmode_enter_ex(Main *bmain, Scene *scene, Object *ob, int flag return false; } - /* this checks actual object->data, for cases when other scenes have it in editmode context */ - if (BKE_object_is_in_editmode(ob)) { - return true; - } - if (BKE_object_obdata_is_libdata(ob)) { /* Ideally the caller should check this. */ CLOG_WARN(&LOG, "Unable to enter edit-mode on library data for object '%s'", ob->id.name + 2); return false; } - ob->restore_mode = ob->mode; + if ((ob->mode & OB_MODE_EDIT) == 0) { + ob->restore_mode = ob->mode; - ob->mode = OB_MODE_EDIT; + ob->mode = OB_MODE_EDIT; + } + + /* This checks actual `object->data`, + * for cases when other scenes have it in edit-mode context. + * + * It's important to run this after setting the object's mode (above), since in rare cases + * the object may have the edit-data but not it's object-mode set. See T85974. */ + if (BKE_object_is_in_editmode(ob)) { + return true; + } if (ob->type == OB_MESH) { ok = true; diff --git a/source/blender/editors/object/object_gpencil_modifier.c b/source/blender/editors/object/object_gpencil_modifier.c index f70e86bcb05..3995728c428 100644 --- a/source/blender/editors/object/object_gpencil_modifier.c +++ b/source/blender/editors/object/object_gpencil_modifier.c @@ -173,28 +173,28 @@ void ED_object_gpencil_modifier_clear(Main *bmain, Object *ob) DEG_relations_tag_update(bmain); } -int ED_object_gpencil_modifier_move_up(ReportList *UNUSED(reports), - Object *ob, - GpencilModifierData *md) +bool ED_object_gpencil_modifier_move_up(ReportList *UNUSED(reports), + Object *ob, + GpencilModifierData *md) { if (md->prev) { BLI_remlink(&ob->greasepencil_modifiers, md); BLI_insertlinkbefore(&ob->greasepencil_modifiers, md->prev, md); } - return 1; + return true; } -int ED_object_gpencil_modifier_move_down(ReportList *UNUSED(reports), - Object *ob, - GpencilModifierData *md) +bool ED_object_gpencil_modifier_move_down(ReportList *UNUSED(reports), + Object *ob, + GpencilModifierData *md) { if (md->next) { BLI_remlink(&ob->greasepencil_modifiers, md); BLI_insertlinkafter(&ob->greasepencil_modifiers, md->next, md); } - return 1; + return true; } bool ED_object_gpencil_modifier_move_to_index(ReportList *reports, @@ -234,57 +234,57 @@ bool ED_object_gpencil_modifier_move_to_index(ReportList *reports, return true; } -static int gpencil_modifier_apply_obdata( +static bool gpencil_modifier_apply_obdata( ReportList *reports, Main *bmain, Depsgraph *depsgraph, Object *ob, GpencilModifierData *md) { const GpencilModifierTypeInfo *mti = BKE_gpencil_modifier_get_info(md->type); if (mti->isDisabled && mti->isDisabled(md, 0)) { BKE_report(reports, RPT_ERROR, "Modifier is disabled, skipping apply"); - return 0; + return false; } if (ob->type == OB_GPENCIL) { if (ELEM(NULL, ob, ob->data)) { - return 0; + return false; } if (mti->bakeModifier == NULL) { BKE_report(reports, RPT_ERROR, "Not implemented"); - return 0; + return false; } mti->bakeModifier(bmain, depsgraph, md, ob); DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); } else { BKE_report(reports, RPT_ERROR, "Cannot apply modifier for this object type"); - return 0; + return false; } - return 1; + return true; } -int ED_object_gpencil_modifier_apply(Main *bmain, - ReportList *reports, - Depsgraph *depsgraph, - Object *ob, - GpencilModifierData *md, - int UNUSED(mode)) +bool ED_object_gpencil_modifier_apply(Main *bmain, + ReportList *reports, + Depsgraph *depsgraph, + Object *ob, + GpencilModifierData *md, + int UNUSED(mode)) { if (ob->type == OB_GPENCIL) { if (ob->mode != OB_MODE_OBJECT) { BKE_report(reports, RPT_ERROR, "Modifiers cannot be applied in paint, sculpt or edit mode"); - return 0; + return false; } if (((ID *)ob->data)->us > 1) { BKE_report(reports, RPT_ERROR, "Modifiers cannot be applied to multi-user data"); - return 0; + return false; } } else if (((ID *)ob->data)->us > 1) { BKE_report(reports, RPT_ERROR, "Modifiers cannot be applied to multi-user data"); - return 0; + return false; } if (md != ob->greasepencil_modifiers.first) { @@ -292,16 +292,16 @@ int ED_object_gpencil_modifier_apply(Main *bmain, } if (!gpencil_modifier_apply_obdata(reports, bmain, depsgraph, ob, md)) { - return 0; + return false; } BLI_remlink(&ob->greasepencil_modifiers, md); BKE_gpencil_modifier_free(md); - return 1; + return true; } -int ED_object_gpencil_modifier_copy(ReportList *reports, Object *ob, GpencilModifierData *md) +bool ED_object_gpencil_modifier_copy(ReportList *reports, Object *ob, GpencilModifierData *md) { GpencilModifierData *nmd; const GpencilModifierTypeInfo *mti = BKE_gpencil_modifier_get_info(md->type); @@ -310,7 +310,7 @@ int ED_object_gpencil_modifier_copy(ReportList *reports, Object *ob, GpencilModi if (mti->flags & eGpencilModifierTypeFlag_Single) { if (BKE_gpencil_modifiers_findby_type(ob, type)) { BKE_report(reports, RPT_WARNING, "Only one modifier of this type is allowed"); - return 0; + return false; } } @@ -321,7 +321,7 @@ int ED_object_gpencil_modifier_copy(ReportList *reports, Object *ob, GpencilModi nmd->flag |= eGpencilModifierFlag_OverrideLibrary_Local; - return 1; + return true; } void ED_object_gpencil_modifier_copy_to_object(Object *ob_dst, GpencilModifierData *md) @@ -730,14 +730,18 @@ static int gpencil_modifier_apply_exec(bContext *C, wmOperator *op) Object *ob = ED_object_active_context(C); GpencilModifierData *md = gpencil_edit_modifier_property_get(op, ob, 0); int apply_as = RNA_enum_get(op->ptr, "apply_as"); + const bool do_report = RNA_boolean_get(op->ptr, "report"); if (md == NULL) { return OPERATOR_CANCELLED; } - /* Store name temporarily for report. */ + int reports_len; char name[MAX_NAME]; - strcpy(name, md->name); + if (do_report) { + reports_len = BLI_listbase_count(&op->reports->list); + strcpy(name, md->name); /* Store name temporarily since the modifier is removed. */ + } if (!ED_object_gpencil_modifier_apply(bmain, op->reports, depsgraph, ob, md, apply_as)) { return OPERATOR_CANCELLED; @@ -746,8 +750,12 @@ static int gpencil_modifier_apply_exec(bContext *C, wmOperator *op) DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); - if (RNA_boolean_get(op->ptr, "report")) { - BKE_reportf(op->reports, RPT_INFO, "Applied modifier: %s", name); + if (do_report) { + /* Only add this report if the operator didn't cause another one. The purpose here is + * to alert that something happened, and the previous report will do that anyway. */ + if (BLI_listbase_count(&op->reports->list) == reports_len) { + BKE_reportf(op->reports, RPT_INFO, "Applied modifier: %s", name); + } } return OPERATOR_FINISHED; diff --git a/source/blender/editors/object/object_modes.c b/source/blender/editors/object/object_modes.c index 5a6fa2b8e3e..99103cf10c7 100644 --- a/source/blender/editors/object/object_modes.c +++ b/source/blender/editors/object/object_modes.c @@ -62,7 +62,6 @@ /* -------------------------------------------------------------------- */ /** \name High Level Mode Operations - * * \{ */ static const char *object_mode_op_string(eObjectMode mode) diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 7e0e52d3874..7673649c261 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -1383,14 +1383,18 @@ static int modifier_apply_exec_ex(bContext *C, wmOperator *op, int apply_as, boo Scene *scene = CTX_data_scene(C); Object *ob = ED_object_active_context(C); ModifierData *md = edit_modifier_property_get(op, ob, 0); + const bool do_report = RNA_boolean_get(op->ptr, "report"); if (md == NULL) { return OPERATOR_CANCELLED; } - /* Store name temporarily for report. */ + int reports_len; char name[MAX_NAME]; - strcpy(name, md->name); + if (do_report) { + reports_len = BLI_listbase_count(&op->reports->list); + strcpy(name, md->name); /* Store name temporarily since the modifier is removed. */ + } if (!ED_object_modifier_apply( bmain, op->reports, depsgraph, scene, ob, md, apply_as, keep_modifier)) { @@ -1401,8 +1405,12 @@ static int modifier_apply_exec_ex(bContext *C, wmOperator *op, int apply_as, boo DEG_relations_tag_update(bmain); WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); - if (RNA_boolean_get(op->ptr, "report")) { - BKE_reportf(op->reports, RPT_INFO, "Applied modifier: %s", name); + if (do_report) { + /* Only add this report if the operator didn't cause another one. The purpose here is + * to alert that something happened, and the previous report will do that anyway. */ + if (BLI_listbase_count(&op->reports->list) == reports_len) { + BKE_reportf(op->reports, RPT_INFO, "Applied modifier: %s", name); + } } return OPERATOR_FINISHED; diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index 964d9898ac0..57676cf5c76 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -25,23 +25,15 @@ #include #include "DNA_object_types.h" -#include "DNA_scene_types.h" - -#include "BLI_utildefines.h" #include "BKE_context.h" #include "RNA_access.h" -#include "RNA_enum_types.h" #include "WM_api.h" #include "WM_types.h" #include "ED_object.h" -#include "ED_screen.h" -#include "ED_select_utils.h" - -#include "DEG_depsgraph.h" #include "object_intern.h" @@ -162,7 +154,7 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_gpencil_modifier_copy); WM_operatortype_append(OBJECT_OT_gpencil_modifier_copy_to_selected); - /* shader fx */ + /* Shader FX. */ WM_operatortype_append(OBJECT_OT_shaderfx_add); WM_operatortype_append(OBJECT_OT_shaderfx_remove); WM_operatortype_append(OBJECT_OT_shaderfx_move_up); diff --git a/source/blender/editors/object/object_remesh.c b/source/blender/editors/object/object_remesh.c index edb65b96e14..2faa1a7d401 100644 --- a/source/blender/editors/object/object_remesh.c +++ b/source/blender/editors/object/object_remesh.c @@ -467,7 +467,7 @@ static int voxel_size_edit_invoke(bContext *C, wmOperator *op, const wmEvent *ev cd->voxel_size = mesh->remesh_voxel_size; op->customdata = cd; - /* Select the front facing face of the mesh boundig box. */ + /* Select the front facing face of the mesh bounding box. */ BoundBox *bb = BKE_mesh_boundbox_get(cd->active_object); /* Indices of the Bounding Box faces. */ diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c index 1e6a7b9f14e..9160190764c 100644 --- a/source/blender/editors/object/object_select.c +++ b/source/blender/editors/object/object_select.c @@ -1311,7 +1311,8 @@ void OBJECT_OT_select_mirror(wmOperatorType *ot) /* identifiers */ ot->name = "Select Mirror"; - ot->description = "Select the Mirror objects of the selected object eg. L.sword -> R.sword"; + ot->description = + "Select the mirror objects of the selected object e.g. \"L.sword\" and \"R.sword\""; ot->idname = "OBJECT_OT_select_mirror"; /* api callbacks */ diff --git a/source/blender/editors/object/object_shapekey.c b/source/blender/editors/object/object_shapekey.c index 1bb0246deb5..fd649854d8f 100644 --- a/source/blender/editors/object/object_shapekey.c +++ b/source/blender/editors/object/object_shapekey.c @@ -36,7 +36,6 @@ #include "BLI_math.h" #include "BLI_utildefines.h" -#include "DNA_curve_types.h" #include "DNA_key_types.h" #include "DNA_lattice_types.h" #include "DNA_mesh_types.h" @@ -44,7 +43,6 @@ #include "DNA_object_types.h" #include "BKE_context.h" -#include "BKE_curve.h" #include "BKE_key.h" #include "BKE_lattice.h" #include "BKE_main.h" diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index 6362662c4e7..2296e158cc8 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -2422,7 +2422,7 @@ void ED_vgroup_mirror(Object *ob, BM_mesh_elem_hflag_disable_all(em->bm, BM_VERT, BM_ELEM_TAG, false); - /* Go through the list of editverts and assign them */ + /* Go through the list of edit-vertices and assign them. */ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) { if (!BM_elem_flag_test(eve, BM_ELEM_TAG)) { if ((eve_mirr = EDBM_verts_mirror_get(em, eve))) { @@ -2602,7 +2602,7 @@ static void vgroup_assign_verts(Object *ob, const float weight) cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT); - /* Go through the list of editverts and assign them */ + /* Go through the list of edit-vertices and assign them. */ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) { if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) { MDeformVert *dv; diff --git a/source/blender/editors/object/object_volume.c b/source/blender/editors/object/object_volume.c index 6b46d43e5bf..fbdee00c29c 100644 --- a/source/blender/editors/object/object_volume.c +++ b/source/blender/editors/object/object_volume.c @@ -23,9 +23,6 @@ #include -#include "MEM_guardedalloc.h" - -#include "BLI_fileops.h" #include "BLI_listbase.h" #include "BLI_math_base.h" #include "BLI_path_util.h" diff --git a/source/blender/editors/object/object_warp.c b/source/blender/editors/object/object_warp.c index 8f5a60ace2e..4b15385b537 100644 --- a/source/blender/editors/object/object_warp.c +++ b/source/blender/editors/object/object_warp.c @@ -36,7 +36,6 @@ #include "WM_types.h" #include "ED_transverts.h" -#include "ED_view3d.h" #include "object_intern.h" diff --git a/source/blender/editors/physics/CMakeLists.txt b/source/blender/editors/physics/CMakeLists.txt index 2b9d9aaa0e1..a607663763e 100644 --- a/source/blender/editors/physics/CMakeLists.txt +++ b/source/blender/editors/physics/CMakeLists.txt @@ -25,6 +25,7 @@ set(INC ../../makesdna ../../makesrna ../../windowmanager + ../../../../intern/clog ../../../../intern/glew-mx ../../../../intern/guardedalloc ../../../../intern/mantaflow/extern diff --git a/source/blender/editors/physics/particle_boids.c b/source/blender/editors/physics/particle_boids.c index 22cfa50aee9..9b8622e6eac 100644 --- a/source/blender/editors/physics/particle_boids.c +++ b/source/blender/editors/physics/particle_boids.c @@ -33,7 +33,6 @@ #include "BKE_boids.h" #include "BKE_context.h" #include "BKE_main.h" -#include "BKE_particle.h" #include "DEG_depsgraph.h" #include "DEG_depsgraph_build.h" diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c index d7e30f2b65c..1ee17d0e4b0 100644 --- a/source/blender/editors/physics/particle_edit.c +++ b/source/blender/editors/physics/particle_edit.c @@ -88,7 +88,9 @@ #include "particle_edit_utildefines.h" -/**************************** utilities *******************************/ +/* -------------------------------------------------------------------- */ +/** \name Public Utilities + * \{ */ bool PE_poll(bContext *C) { @@ -178,9 +180,56 @@ void PE_free_ptcache_edit(PTCacheEdit *edit) MEM_freeN(edit); } -/************************************************/ -/* Edit Mode Helpers */ -/************************************************/ +int PE_minmax( + Depsgraph *depsgraph, Scene *scene, ViewLayer *view_layer, float min[3], float max[3]) +{ + Object *ob = OBACT(view_layer); + PTCacheEdit *edit = PE_get_current(depsgraph, scene, ob); + ParticleSystem *psys; + ParticleSystemModifierData *psmd_eval = NULL; + POINT_P; + KEY_K; + float co[3], mat[4][4]; + int ok = 0; + + if (!edit) { + return ok; + } + + if ((psys = edit->psys)) { + psmd_eval = edit->psmd_eval; + } + else { + unit_m4(mat); + } + + LOOP_VISIBLE_POINTS { + if (psys) { + psys_mat_hair_to_global( + ob, psmd_eval->mesh_final, psys->part->from, psys->particles + p, mat); + } + + LOOP_SELECTED_KEYS { + copy_v3_v3(co, key->co); + mul_m4_v3(mat, co); + DO_MINMAX(co, min, max); + ok = 1; + } + } + + if (!ok) { + BKE_object_minmax(ob, min, max, true); + ok = 1; + } + + return ok; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Edit Mode Helpers + * \{ */ int PE_start_edit(PTCacheEdit *edit) { @@ -253,7 +302,7 @@ static void pe_update_hair_particle_edit_pointers(PTCacheEdit *edit) * * note: this function runs on poll, therefore it can runs many times a second * keep it fast! */ -static PTCacheEdit *pe_get_current(Depsgraph *depsgraph, Scene *scene, Object *ob, int create) +static PTCacheEdit *pe_get_current(Depsgraph *depsgraph, Scene *scene, Object *ob, bool create) { ParticleEditSettings *pset = PE_settings(scene); PTCacheEdit *edit = NULL; @@ -357,12 +406,12 @@ static PTCacheEdit *pe_get_current(Depsgraph *depsgraph, Scene *scene, Object *o PTCacheEdit *PE_get_current(Depsgraph *depsgraph, Scene *scene, Object *ob) { - return pe_get_current(depsgraph, scene, ob, 0); + return pe_get_current(depsgraph, scene, ob, false); } PTCacheEdit *PE_create_current(Depsgraph *depsgraph, Scene *scene, Object *ob) { - return pe_get_current(depsgraph, scene, ob, 1); + return pe_get_current(depsgraph, scene, ob, true); } void PE_current_changed(Depsgraph *depsgraph, Scene *scene, Object *ob) @@ -409,7 +458,11 @@ static int pe_x_mirror(Object *ob) return 0; } -/****************** common struct passed to callbacks ******************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Common Struct Passed to Callbacks + * \{ */ typedef struct PEData { ViewContext vc; @@ -519,7 +572,11 @@ static void PE_free_random_generator(PEData *data) } } -/*************************** selection utilities *******************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Selection Utilities + * \{ */ static bool key_test_depth(const PEData *data, const float co[3], const int screen_co[2]) { @@ -632,7 +689,11 @@ static bool point_is_selected(PTCacheEditPoint *point) return 0; } -/*************************** iterators *******************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Iterators + * \{ */ typedef void (*ForPointFunc)(PEData *data, int point_index); typedef void (*ForHitPointFunc)(PEData *data, int point_index, float mouse_distance); @@ -905,9 +966,11 @@ static int count_selected_keys(Scene *scene, PTCacheEdit *edit) return sel; } -/************************************************/ -/* Particle Edit Mirroring */ -/************************************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Particle Edit Mirroring + * \{ */ static void PE_update_mirror_cache(Object *ob, ParticleSystem *psys) { @@ -1115,9 +1178,11 @@ static void PE_apply_mirror(Object *ob, ParticleSystem *psys) } } -/************************************************/ -/* Edit Calculation */ -/************************************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Edit Calculation + * \{ */ typedef struct DeflectEmitterIter { Object *object; @@ -1605,9 +1670,11 @@ void PE_update_object(Depsgraph *depsgraph, Scene *scene, Object *ob, int usefla } } -/************************************************/ -/* Edit Selections */ -/************************************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Edit Selections + * \{ */ /*-----selection callbacks-----*/ @@ -1703,7 +1770,11 @@ static void toggle_key_select(PEData *data, int point_index, int key_index, bool data->is_changed = true; } -/************************ de select all operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name De-Select All Operator + * \{ */ static bool select_action_apply(PTCacheEditPoint *point, PTCacheEditKey *key, int action) { @@ -1794,7 +1865,11 @@ void PARTICLE_OT_select_all(wmOperatorType *ot) WM_operator_properties_select_all(ot); } -/************************ pick select operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Pick Select Operator + * \{ */ bool PE_mouse_particles(bContext *C, const int mval[2], bool extend, bool deselect, bool toggle) { @@ -1843,7 +1918,11 @@ bool PE_mouse_particles(bContext *C, const int mval[2], bool extend, bool desele return true; } -/************************ select root operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Select Root Operator + * \{ */ static void select_root(PEData *data, int point_index) { @@ -1906,7 +1985,11 @@ void PARTICLE_OT_select_roots(wmOperatorType *ot) WM_operator_properties_select_action(ot, SEL_SELECT, false); } -/************************ select tip operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Select Tip Operator + * \{ */ static void select_tip(PEData *data, int point_index) { @@ -1977,7 +2060,11 @@ void PARTICLE_OT_select_tips(wmOperatorType *ot) WM_operator_properties_select_action(ot, SEL_SELECT, false); } -/*********************** select random operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Select Random Operator + * \{ */ enum { RAN_HAIR, RAN_POINTS }; @@ -2064,7 +2151,11 @@ void PARTICLE_OT_select_random(wmOperatorType *ot) "Select either hair or points"); } -/************************ select linked operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Select Linked operator + * \{ */ static int select_linked_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -2146,7 +2237,12 @@ void PARTICLE_OT_select_linked_pick(wmOperatorType *ot) RNA_def_int_vector(ot->srna, "location", 2, NULL, 0, INT_MAX, "Location", "", 0, 16384); } -/************************ box select operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Box Select Operator + * \{ */ + bool PE_deselect_all_visible_ex(PTCacheEdit *edit) { bool changed = false; @@ -2211,7 +2307,11 @@ bool PE_box_select(bContext *C, const rcti *rect, const int sel_op) return data.is_changed; } -/************************ circle select operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Circle Select Operator + * \{ */ bool PE_circle_select(bContext *C, const int sel_op, const int mval[2], float rad) { @@ -2244,7 +2344,11 @@ bool PE_circle_select(bContext *C, const int sel_op, const int mval[2], float ra return data.is_changed; } -/************************ lasso select operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Lasso Select Operator + * \{ */ int PE_lasso_select(bContext *C, const int mcoords[][2], const int mcoords_len, const int sel_op) { @@ -2331,7 +2435,11 @@ int PE_lasso_select(bContext *C, const int mcoords[][2], const int mcoords_len, return OPERATOR_CANCELLED; } -/*************************** hide operator **************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Hide Operator + * \{ */ static int hide_exec(bContext *C, wmOperator *op) { @@ -2388,7 +2496,11 @@ void PARTICLE_OT_hide(wmOperatorType *ot) RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "Hide unselected rather than selected"); } -/*************************** reveal operator **************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Reveal Operator + * \{ */ static int reveal_exec(bContext *C, wmOperator *op) { @@ -2435,7 +2547,11 @@ void PARTICLE_OT_reveal(wmOperatorType *ot) RNA_def_boolean(ot->srna, "select", true, "Select", ""); } -/************************ select less operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Select Less Operator + * \{ */ static void select_less_keys(PEData *data, int point_index) { @@ -2498,7 +2614,11 @@ void PARTICLE_OT_select_less(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/************************ select more operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Select More Operator + * \{ */ static void select_more_keys(PEData *data, int point_index) { @@ -2566,7 +2686,11 @@ void PARTICLE_OT_select_more(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/************************ rekey operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Re-Key Operator + * \{ */ static void rekey_particle(PEData *data, int pa_index) { @@ -2723,7 +2847,11 @@ static void rekey_particle_to_time( pa->flag &= ~PARS_REKEY; } -/************************* utilities **************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Internal Utilities + * \{ */ static int remove_tagged_particles(Object *ob, ParticleSystem *psys, int mirror) { @@ -2905,7 +3033,11 @@ static void remove_tagged_keys(Depsgraph *depsgraph, Object *ob, ParticleSystem } } -/************************ subdivide operator *********************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Subdivide Operator + * \{ */ /* works like normal edit mode subdivide, inserts keys between neighboring selected keys */ static void subdivide_particle(PEData *data, int pa_index) @@ -3029,7 +3161,11 @@ void PARTICLE_OT_subdivide(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/************************ remove doubles operator *********************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Remove Doubles Operator + * \{ */ static int remove_doubles_exec(bContext *C, wmOperator *op) { @@ -3192,7 +3328,11 @@ void PARTICLE_OT_weight_set(wmOperatorType *ot) 1); } -/************************ cursor drawing *******************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Cursor Drawing + * \{ */ static void brush_drawcursor(bContext *C, int x, int y, void *UNUSED(customdata)) { @@ -3238,7 +3378,11 @@ static void toggle_particle_cursor(Scene *scene, bool enable) } } -/*************************** delete operator **************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Delete Operator + * \{ */ enum { DEL_PARTICLE, DEL_KEY }; @@ -3314,7 +3458,11 @@ void PARTICLE_OT_delete(wmOperatorType *ot) "Delete a full particle or only keys"); } -/*************************** mirror operator **************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Mirror Operator + * \{ */ static void PE_mirror_x(Depsgraph *depsgraph, Scene *scene, Object *ob, int tagged) { @@ -3526,7 +3674,11 @@ void PARTICLE_OT_mirror(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/************************* brush edit callbacks ********************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Brush Edit Callbacks + * \{ */ static void brush_comb(PEData *data, float UNUSED(mat[4][4]), @@ -4474,7 +4626,11 @@ static int brush_add(const bContext *C, PEData *data, short number) return n; } -/************************* brush edit operator ********************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Brush Edit Operator + * \{ */ typedef struct BrushEdit { Scene *scene; @@ -4864,7 +5020,11 @@ void PARTICLE_OT_brush_edit(wmOperatorType *ot) RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); } -/*********************** cut shape ***************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Cut Shape + * \{ */ static bool shape_cut_poll(bContext *C) { @@ -5070,54 +5230,11 @@ void PARTICLE_OT_shape_cut(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/************************ utilities ******************************/ +/** \} */ -int PE_minmax( - Depsgraph *depsgraph, Scene *scene, ViewLayer *view_layer, float min[3], float max[3]) -{ - Object *ob = OBACT(view_layer); - PTCacheEdit *edit = PE_get_current(depsgraph, scene, ob); - ParticleSystem *psys; - ParticleSystemModifierData *psmd_eval = NULL; - POINT_P; - KEY_K; - float co[3], mat[4][4]; - int ok = 0; - - if (!edit) { - return ok; - } - - if ((psys = edit->psys)) { - psmd_eval = edit->psmd_eval; - } - else { - unit_m4(mat); - } - - LOOP_VISIBLE_POINTS { - if (psys) { - psys_mat_hair_to_global( - ob, psmd_eval->mesh_final, psys->part->from, psys->particles + p, mat); - } - - LOOP_SELECTED_KEYS { - copy_v3_v3(co, key->co); - mul_m4_v3(mat, co); - DO_MINMAX(co, min, max); - ok = 1; - } - } - - if (!ok) { - BKE_object_minmax(ob, min, max, true); - ok = 1; - } - - return ok; -} - -/************************ particle edit toggle operator ************************/ +/* -------------------------------------------------------------------- */ +/** \name Particle Edit Toggle Operator + * \{ */ /* initialize needed data for bake edit */ void PE_create_particle_edit( @@ -5278,6 +5395,9 @@ static void free_all_psys_edit(Object *object) void ED_object_particle_edit_mode_enter_ex(Depsgraph *depsgraph, Scene *scene, Object *ob) { + /* Needed so #ParticleSystemModifierData.mesh_final is set. */ + BKE_scene_graph_evaluated_ensure(depsgraph, G_MAIN); + PTCacheEdit *edit; ob->mode |= OB_MODE_PARTICLE_EDIT; @@ -5371,7 +5491,11 @@ void PARTICLE_OT_particle_edit_toggle(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/************************ set editable operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Set Editable Operator + * \{ */ static int clear_edited_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -5421,7 +5545,11 @@ void PARTICLE_OT_edited_clear(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/************************ Unify length operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Unify length operator + * \{ */ static float calculate_point_length(PTCacheEditPoint *point) { @@ -5533,3 +5661,5 @@ void PARTICLE_OT_unify_length(struct wmOperatorType *ot) /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } + +/** \} */ diff --git a/source/blender/editors/physics/particle_edit_undo.c b/source/blender/editors/physics/particle_edit_undo.c index 5d2e0e5b6ef..2c7b5c0de6a 100644 --- a/source/blender/editors/physics/particle_edit_undo.c +++ b/source/blender/editors/physics/particle_edit_undo.c @@ -27,6 +27,8 @@ #include "MEM_guardedalloc.h" +#include "CLG_log.h" + #include "DNA_meshdata_types.h" #include "DNA_scene_types.h" #include "DNA_windowmanager_types.h" @@ -44,11 +46,15 @@ #include "ED_object.h" #include "ED_particle.h" #include "ED_physics.h" +#include "ED_undo.h" #include "particle_edit_utildefines.h" #include "physics_intern.h" +/** Only needed this locally. */ +static CLG_LogRef LOG = {"ed.undo.particle_edit"}; + /* -------------------------------------------------------------------- */ /** \name Undo Conversion * \{ */ @@ -251,26 +257,33 @@ static void particle_undosys_step_decode(struct bContext *C, bool UNUSED(is_final)) { Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); - /* TODO(campbell): undo_system: use low-level API to set mode. */ - ED_object_mode_set_ex(C, OB_MODE_PARTICLE_EDIT, false, NULL); - BLI_assert(particle_undosys_poll(C)); ParticleUndoStep *us = (ParticleUndoStep *)us_p; Scene *scene = us->scene_ref.ptr; Object *ob = us->object_ref.ptr; + + ED_object_particle_edit_mode_enter_ex(depsgraph, scene, ob); + PTCacheEdit *edit = PE_get_current(depsgraph, scene, ob); - if (edit) { - undoptcache_to_editcache(&us->data, edit); - ParticleEditSettings *pset = &scene->toolsettings->particle; - if ((pset->flag & PE_DRAW_PART) != 0) { - psys_free_path_cache(NULL, edit); - BKE_particle_batch_cache_dirty_tag(edit->psys, BKE_PARTICLE_BATCH_DIRTY_ALL); - } - DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); - } - else { + + /* While this shouldn't happen, entering particle edit-mode uses a more complex + * setup compared to most other modes which we can't ensure succeeds. */ + if (UNLIKELY(edit == NULL)) { BLI_assert(0); + return; } + + undoptcache_to_editcache(&us->data, edit); + ParticleEditSettings *pset = &scene->toolsettings->particle; + if ((pset->flag & PE_DRAW_PART) != 0) { + psys_free_path_cache(NULL, edit); + BKE_particle_batch_cache_dirty_tag(edit->psys, BKE_PARTICLE_BATCH_DIRTY_ALL); + } + DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); + + ED_undo_object_set_active_or_warn(scene, CTX_data_view_layer(C), ob, us_p->name, &LOG); + + BLI_assert(particle_undosys_poll(C)); } static void particle_undosys_step_free(UndoStep *us_p) diff --git a/source/blender/editors/physics/particle_object.c b/source/blender/editors/physics/particle_object.c index f5c3fc17552..6bcc9df16bf 100644 --- a/source/blender/editors/physics/particle_object.c +++ b/source/blender/editors/physics/particle_object.c @@ -416,9 +416,9 @@ static int dupliob_refresh_exec(bContext *C, wmOperator *UNUSED(op)) void PARTICLE_OT_dupliob_refresh(wmOperatorType *ot) { - ot->name = "Refresh Dupli Objects"; + ot->name = "Refresh Instance Objects"; ot->idname = "PARTICLE_OT_dupliob_refresh"; - ot->description = "Refresh list of dupli objects and their weights"; + ot->description = "Refresh list of instance objects and their weights"; ot->exec = dupliob_refresh_exec; @@ -456,9 +456,9 @@ static int dupliob_move_up_exec(bContext *C, wmOperator *UNUSED(op)) void PARTICLE_OT_dupliob_move_up(wmOperatorType *ot) { - ot->name = "Move Up Dupli Object"; + ot->name = "Move Up Instance Object"; ot->idname = "PARTICLE_OT_dupliob_move_up"; - ot->description = "Move dupli object up in the list"; + ot->description = "Move instance object up in the list"; ot->exec = dupliob_move_up_exec; @@ -498,9 +498,9 @@ static int copy_particle_dupliob_exec(bContext *C, wmOperator *UNUSED(op)) void PARTICLE_OT_dupliob_copy(wmOperatorType *ot) { /* identifiers */ - ot->name = "Copy Particle Dupliob"; + ot->name = "Copy Particle Instance Object"; ot->idname = "PARTICLE_OT_dupliob_copy"; - ot->description = "Duplicate the current dupliobject"; + ot->description = "Duplicate the current instance object"; /* api callbacks */ ot->exec = copy_particle_dupliob_exec; @@ -543,9 +543,9 @@ static int remove_particle_dupliob_exec(bContext *C, wmOperator *UNUSED(op)) void PARTICLE_OT_dupliob_remove(wmOperatorType *ot) { /* identifiers */ - ot->name = "Remove Particle Dupliobject"; + ot->name = "Remove Particle Instance Object"; ot->idname = "PARTICLE_OT_dupliob_remove"; - ot->description = "Remove the selected dupliobject"; + ot->description = "Remove the selected instance object"; /* api callbacks */ ot->exec = remove_particle_dupliob_exec; @@ -584,9 +584,9 @@ static int dupliob_move_down_exec(bContext *C, wmOperator *UNUSED(op)) void PARTICLE_OT_dupliob_move_down(wmOperatorType *ot) { - ot->name = "Move Down Dupli Object"; + ot->name = "Move Down Instance Object"; ot->idname = "PARTICLE_OT_dupliob_move_down"; - ot->description = "Move dupli object down in the list"; + ot->description = "Move instance object down in the list"; ot->exec = dupliob_move_down_exec; diff --git a/source/blender/editors/physics/physics_fluid.c b/source/blender/editors/physics/physics_fluid.c index 32d2e39d6f6..a94a2b9b764 100644 --- a/source/blender/editors/physics/physics_fluid.c +++ b/source/blender/editors/physics/physics_fluid.c @@ -33,21 +33,17 @@ #include "DNA_object_types.h" #include "BLI_blenlib.h" -#include "BLI_math.h" #include "BLI_path_util.h" #include "BLI_utildefines.h" #include "BLT_translation.h" #include "BKE_context.h" -#include "BKE_customdata.h" #include "BKE_fluid.h" #include "BKE_global.h" #include "BKE_main.h" #include "BKE_modifier.h" -#include "BKE_object.h" #include "BKE_report.h" -#include "BKE_scene.h" #include "BKE_screen.h" #include "DEG_depsgraph.h" @@ -59,11 +55,9 @@ #include "WM_api.h" #include "WM_types.h" -#include "manta_fluid_API.h" #include "physics_intern.h" /* own include */ #include "DNA_fluid_types.h" -#include "DNA_mesh_types.h" #include "DNA_scene_types.h" #define FLUID_JOB_BAKE_ALL "FLUID_OT_bake_all" diff --git a/source/blender/editors/physics/physics_ops.c b/source/blender/editors/physics/physics_ops.c index eb154b97eb0..f5b80679689 100644 --- a/source/blender/editors/physics/physics_ops.c +++ b/source/blender/editors/physics/physics_ops.c @@ -23,14 +23,9 @@ #include -#include "RNA_access.h" - #include "WM_api.h" -#include "WM_types.h" -#include "ED_object.h" #include "ED_physics.h" -#include "ED_select_utils.h" #include "physics_intern.h" /* own include */ diff --git a/source/blender/editors/physics/physics_pointcache.c b/source/blender/editors/physics/physics_pointcache.c index 1d5903bf417..ea8a4ce2a79 100644 --- a/source/blender/editors/physics/physics_pointcache.c +++ b/source/blender/editors/physics/physics_pointcache.c @@ -34,7 +34,6 @@ #include "BKE_context.h" #include "BKE_global.h" #include "BKE_layer.h" -#include "BKE_particle.h" #include "BKE_pointcache.h" #include "DEG_depsgraph.h" diff --git a/source/blender/editors/physics/rigidbody_object.c b/source/blender/editors/physics/rigidbody_object.c index 4fd304ea71d..81a8b57776b 100644 --- a/source/blender/editors/physics/rigidbody_object.c +++ b/source/blender/editors/physics/rigidbody_object.c @@ -34,9 +34,7 @@ #include "BLT_translation.h" -#include "BKE_collection.h" #include "BKE_context.h" -#include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_report.h" #include "BKE_rigidbody.h" diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index 4b84894c23d..b525d8a373e 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -43,14 +43,10 @@ #include "DNA_userdef_types.h" #include "DNA_view3d_types.h" -#include "BKE_blender_undo.h" -#include "BKE_blender_version.h" -#include "BKE_camera.h" #include "BKE_colortools.h" #include "BKE_context.h" #include "BKE_global.h" #include "BKE_image.h" -#include "BKE_layer.h" #include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_node.h" @@ -58,19 +54,15 @@ #include "BKE_report.h" #include "BKE_scene.h" #include "BKE_screen.h" -#include "BKE_undo_system.h" #include "DEG_depsgraph.h" #include "WM_api.h" #include "WM_types.h" -#include "ED_object.h" #include "ED_render.h" #include "ED_screen.h" -#include "ED_undo.h" #include "ED_util.h" -#include "ED_view3d.h" #include "BIF_glutil.h" @@ -85,8 +77,6 @@ #include "SEQ_relations.h" -#include "BLO_undofile.h" - #include "render_intern.h" /* Render Callbacks */ @@ -810,7 +800,7 @@ static int render_break(void *UNUSED(rjv)) /* runs in thread, no cursor setting here works. careful with notifiers too (malloc conflicts) */ /* maybe need a way to get job send notifier? */ -static void render_drawlock(void *rjv, int lock) +static void render_drawlock(void *rjv, bool lock) { RenderJob *rj = rjv; diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c index 5ae952738c9..48f937fb4ec 100644 --- a/source/blender/editors/render/render_opengl.c +++ b/source/blender/editors/render/render_opengl.c @@ -351,7 +351,7 @@ static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, R G.f &= ~G_FLAG_RENDER_VIEWPORT; gp_rect = MEM_mallocN(sizeof(uchar[4]) * sizex * sizey, "offscreen rect"); - GPU_offscreen_read_pixels(oglrender->ofs, GPU_DATA_UNSIGNED_BYTE, gp_rect); + GPU_offscreen_read_pixels(oglrender->ofs, GPU_DATA_UBYTE, gp_rect); for (i = 0; i < sizex * sizey * 4; i += 4) { blend_color_mix_byte(&render_rect[i], &render_rect[i], &gp_rect[i]); @@ -367,9 +367,6 @@ static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, R char err_out[256] = "unknown"; ImBuf *ibuf_view; const int alpha_mode = (draw_sky) ? R_ADDSKY : R_ALPHAPREMUL; - eImBufFlags imbuf_flags = oglrender->color_depth <= R_IMF_CHAN_DEPTH_8 ? IB_rect : - IB_rectfloat; - if (view_context) { ibuf_view = ED_view3d_draw_offscreen_imbuf(depsgraph, scene, @@ -378,9 +375,10 @@ static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, R region, sizex, sizey, - imbuf_flags, + IB_rectfloat, alpha_mode, viewname, + true, oglrender->ofs, err_out); @@ -397,7 +395,7 @@ static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, R scene->camera, oglrender->sizex, oglrender->sizey, - imbuf_flags, + IB_rectfloat, V3D_OFSDRAW_SHOW_ANNOTATION, alpha_mode, viewname, diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c index 4e766841c24..9811b7caa38 100644 --- a/source/blender/editors/render/render_preview.c +++ b/source/blender/editors/render/render_preview.c @@ -145,6 +145,7 @@ typedef struct IconPreviewSize { typedef struct IconPreview { Main *bmain; + Depsgraph *depsgraph; /* May be NULL (see #WM_OT_previews_ensure). */ Scene *scene; void *owner; ID *id, *id_copy; /* May be NULL! (see ICON_TYPE_PREVIEW case in #ui_icon_ensure_deferred()) */ @@ -807,6 +808,59 @@ static void object_preview_render(IconPreview *preview, IconPreviewSize *preview /** \} */ +/* -------------------------------------------------------------------- */ +/** \name Action Preview + * \{ */ + +/* Render a pose. It is assumed that the pose has already been applied and that the scene camera is + * capturing the pose. In other words, this function just renders from the scene camera without + * evaluating the Action stored in preview->id. */ +static void action_preview_render(IconPreview *preview, IconPreviewSize *preview_sized) +{ + char err_out[256] = ""; + + Depsgraph *depsgraph = preview->depsgraph; + /* Not all code paths that lead to this function actually provide a depsgraph. + * The "Refresh Asset Preview" button (ED_OT_lib_id_generate_preview) does, + * but WM_OT_previews_ensure does not. */ + BLI_assert(depsgraph != NULL); + BLI_assert(preview->scene == DEG_get_input_scene(depsgraph)); + + Scene *scene_eval = DEG_get_evaluated_scene(depsgraph); + Object *camera_eval = scene_eval->camera; + if (camera_eval == NULL) { + printf("Scene has no camera, unable to render preview of %s without it.\n", + preview->id->name + 2); + return; + } + + /* This renders with the Workbench engine settings stored on the Scene. */ + ImBuf *ibuf = ED_view3d_draw_offscreen_imbuf_simple(depsgraph, + scene_eval, + NULL, + OB_SOLID, + camera_eval, + preview_sized->sizex, + preview_sized->sizey, + IB_rect, + V3D_OFSDRAW_NONE, + R_ALPHAPREMUL, + NULL, + NULL, + err_out); + + if (err_out[0] != '\0') { + printf("Error rendering Action %s preview: %s\n", preview->id->name + 2, err_out); + } + + if (ibuf) { + icon_copy_rect(ibuf, preview_sized->sizex, preview_sized->sizey, preview_sized->rect); + IMB_freeImBuf(ibuf); + } +} + +/** \} */ + /* -------------------------------------------------------------------- */ /** \name New Shader Preview System * \{ */ @@ -1440,7 +1494,15 @@ static void icon_preview_startjob_all_sizes(void *customdata, continue; } - if (preview_method_is_render(pr_method) && !check_engine_supports_preview(ip->scene)) { + /* check_engine_supports_preview() checks whether the engine supports "preview mode" (think: + * Material Preview). This check is only relevant when the render function called below is + * going to use such a mode. Object and Action render functions use Solid mode, though, so they + * can skip this test. */ + /* TODO: Decouple the ID-type-specific render functions from this function, so that it's not + * necessary to know here what happens inside lower-level functions. */ + const bool use_solid_render_mode = (ip->id != NULL) && ELEM(GS(ip->id->name), ID_OB, ID_AC); + if (!use_solid_render_mode && preview_method_is_render(pr_method) && + !check_engine_supports_preview(ip->scene)) { continue; } @@ -1451,13 +1513,21 @@ static void icon_preview_startjob_all_sizes(void *customdata, } #endif - if (ip->id && ELEM(GS(ip->id->name), ID_OB)) { - /* Much simpler than the ShaderPreview mess used for other ID types. */ - object_preview_render(ip, cur_size); - } - else { - other_id_types_preview_render(ip, cur_size, pr_method, stop, do_update, progress); + if (ip->id != NULL) { + switch (GS(ip->id->name)) { + case ID_OB: + /* Much simpler than the ShaderPreview mess used for other ID types. */ + object_preview_render(ip, cur_size); + continue; + case ID_AC: + action_preview_render(ip, cur_size); + continue; + default: + /* Fall through to the same code as the `ip->id == NULL` case. */ + break; + } } + other_id_types_preview_render(ip, cur_size, pr_method, stop, do_update, progress); } } @@ -1537,7 +1607,8 @@ static void icon_preview_free(void *customdata) MEM_freeN(ip); } -void ED_preview_icon_render(Main *bmain, Scene *scene, ID *id, uint *rect, int sizex, int sizey) +void ED_preview_icon_render( + Main *bmain, Depsgraph *depsgraph, Scene *scene, ID *id, uint *rect, int sizex, int sizey) { IconPreview ip = {NULL}; short stop = false, update = false; @@ -1547,6 +1618,7 @@ void ED_preview_icon_render(Main *bmain, Scene *scene, ID *id, uint *rect, int s ip.bmain = bmain; ip.scene = scene; + ip.depsgraph = depsgraph; ip.owner = BKE_previewimg_id_ensure(id); ip.id = id; /* Control isn't given back to the caller until the preview is done. So we don't need to copy @@ -1591,7 +1663,8 @@ void ED_preview_icon_job( /* customdata for preview thread */ ip->bmain = CTX_data_main(C); - ip->scene = CTX_data_scene(C); + ip->depsgraph = CTX_data_ensure_evaluated_depsgraph(C); + ip->scene = DEG_get_input_scene(ip->depsgraph); ip->owner = owner; ip->id = id; ip->id_copy = duplicate_ids(id, false); diff --git a/source/blender/editors/render/render_update.c b/source/blender/editors/render/render_update.c index 499ffac6028..4ed1cbd60a5 100644 --- a/source/blender/editors/render/render_update.c +++ b/source/blender/editors/render/render_update.c @@ -25,7 +25,6 @@ #include "DNA_light_types.h" #include "DNA_material_types.h" -#include "DNA_meshdata_types.h" #include "DNA_node_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" @@ -33,7 +32,6 @@ #include "DNA_space_types.h" #include "DNA_view3d_types.h" #include "DNA_windowmanager_types.h" -#include "DNA_workspace_types.h" #include "DNA_world_types.h" #include "DRW_engine.h" @@ -44,13 +42,11 @@ #include "BKE_context.h" #include "BKE_icons.h" -#include "BKE_layer.h" #include "BKE_main.h" #include "BKE_material.h" #include "BKE_node.h" #include "BKE_paint.h" #include "BKE_scene.h" -#include "BKE_workspace.h" #include "RE_engine.h" #include "RE_pipeline.h" @@ -65,8 +61,6 @@ #include "WM_api.h" -#include "render_intern.h" /* own include */ - #include /***************************** Render Engines ********************************/ diff --git a/source/blender/editors/render/render_view.c b/source/blender/editors/render/render_view.c index fd5963b217b..465438f814a 100644 --- a/source/blender/editors/render/render_view.c +++ b/source/blender/editors/render/render_view.c @@ -157,8 +157,16 @@ ScrArea *render_view_open(bContext *C, int mx, int my, ReportList *reports) } /* changes context! */ - if (WM_window_open_temp( - C, IFACE_("Blender Render"), mx, my, sizex, sizey, SPACE_IMAGE, false) == NULL) { + if (WM_window_open(C, + IFACE_("Blender Render"), + mx, + my, + sizex, + sizey, + SPACE_IMAGE, + false, + true, + WIN_ALIGN_LOCATION_CENTER) == NULL) { BKE_report(reports, RPT_ERROR, "Failed to open window!"); return NULL; } diff --git a/source/blender/editors/screen/area_utils.c b/source/blender/editors/screen/area_utils.c index b784a4b0056..30553bb7f07 100644 --- a/source/blender/editors/screen/area_utils.c +++ b/source/blender/editors/screen/area_utils.c @@ -34,7 +34,6 @@ #include "ED_screen.h" -#include "UI_interface.h" #include "UI_interface_icons.h" /* -------------------------------------------------------------------- */ diff --git a/source/blender/editors/screen/glutil.c b/source/blender/editors/screen/glutil.c index a88afecd064..e366760a55d 100644 --- a/source/blender/editors/screen/glutil.c +++ b/source/blender/editors/screen/glutil.c @@ -131,7 +131,7 @@ void immDrawPixelsTexScaled_clipping(IMMDrawPixelsTexState *state, } const bool use_float_data = ELEM(gpu_format, GPU_RGBA16F, GPU_RGB16F, GPU_R16F); - eGPUDataFormat gpu_data = (use_float_data) ? GPU_DATA_FLOAT : GPU_DATA_UNSIGNED_BYTE; + eGPUDataFormat gpu_data = (use_float_data) ? GPU_DATA_FLOAT : GPU_DATA_UBYTE; size_t stride = components * ((use_float_data) ? sizeof(float) : sizeof(uchar)); GPUTexture *tex = GPU_texture_create_2d("immDrawPixels", tex_w, tex_h, 1, gpu_format, NULL); diff --git a/source/blender/editors/screen/screen_draw.c b/source/blender/editors/screen/screen_draw.c index 1ea64c542f5..2ba7ef8f972 100644 --- a/source/blender/editors/screen/screen_draw.c +++ b/source/blender/editors/screen/screen_draw.c @@ -610,7 +610,7 @@ void ED_screen_preview_render(const bScreen *screen, int size_x, int size_y, uin screen_preview_draw(screen, size_x, size_y); - GPU_offscreen_read_pixels(offscreen, GPU_DATA_UNSIGNED_BYTE, r_rect); + GPU_offscreen_read_pixels(offscreen, GPU_DATA_UBYTE, r_rect); GPU_offscreen_unbind(offscreen, true); GPU_offscreen_free(offscreen); diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index c25b572d200..3e498522071 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -1441,7 +1441,16 @@ ScrArea *ED_screen_temp_space_open(bContext *C, switch (display_type) { case USER_TEMP_SPACE_DISPLAY_WINDOW: - if (WM_window_open_temp(C, title, x, y, sizex, sizey, (int)space_type, dialog)) { + if (WM_window_open(C, + title, + x, + y, + sizex, + sizey, + (int)space_type, + dialog, + true, + WIN_ALIGN_LOCATION_CENTER)) { area = CTX_wm_area(C); } break; @@ -1556,7 +1565,7 @@ void ED_screen_animation_timer(bContext *C, int redraws, int sync, int enable) /* Seek audio to ensure playback in preview range with AV sync. */ DEG_id_tag_update(&scene->id, ID_RECALC_AUDIO_SEEK); - /* notifier catched by top header, for button */ + /* Notifier caught by top header, for button. */ WM_event_add_notifier(C, NC_SCREEN | ND_ANIMPLAY, NULL); } diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 244d8c10e4e..8a53154cc85 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -1332,67 +1332,46 @@ static void SCREEN_OT_area_swap(wmOperatorType *ot) /* operator callback */ static int area_dupli_invoke(bContext *C, wmOperator *op, const wmEvent *event) { - Main *bmain = CTX_data_main(C); - wmWindow *win = CTX_wm_window(C); - WorkSpace *workspace = WM_window_get_active_workspace(win); - WorkSpaceLayout *layout_old = WM_window_get_active_layout(win); - - Scene *scene = CTX_data_scene(C); ScrArea *area = CTX_wm_area(C); - /* XXX hrmf! */ - if (event->type == EVT_ACTIONZONE_AREA) { + if (event && event->customdata) { sActionzoneData *sad = event->customdata; - if (sad == NULL) { return OPERATOR_PASS_THROUGH; } - area = sad->sa1; } - /* adds window to WM */ - rcti rect = area->totrct; - BLI_rcti_translate(&rect, win->posx, win->posy); - rect.xmax = rect.xmin + BLI_rcti_size_x(&rect); - rect.ymax = rect.ymin + BLI_rcti_size_y(&rect); + /* Create new window. No need to set space_type since it will be copied over. */ + wmWindow *newwin = WM_window_open(C, + "Blender", + area->totrct.xmin, + area->totrct.ymin, + area->winx, + area->winy, + SPACE_EMPTY, + true, + false, + WIN_ALIGN_ABSOLUTE); - wmWindow *newwin = WM_window_open(C, &rect); - if (newwin == NULL) { + if (newwin) { + /* copy area to new screen */ + bScreen *newsc = WM_window_get_active_screen(newwin); + ED_area_data_copy((ScrArea *)newsc->areabase.first, area, true); + ED_area_tag_redraw((ScrArea *)newsc->areabase.first); + + /* screen, areas init */ + WM_event_add_notifier(C, NC_SCREEN | NA_EDITED, NULL); + } + else { BKE_report(op->reports, RPT_ERROR, "Failed to open window!"); - goto finally; } - *newwin->stereo3d_format = *win->stereo3d_format; - - newwin->scene = scene; - - STRNCPY(newwin->view_layer_name, win->view_layer_name); - - BKE_workspace_active_set(newwin->workspace_hook, workspace); - /* allocs new screen and adds to newly created window, using window size */ - WorkSpaceLayout *layout_new = ED_workspace_layout_add( - bmain, workspace, newwin, BKE_workspace_layout_name_get(layout_old)); - bScreen *newsc = BKE_workspace_layout_screen_get(layout_new); - WM_window_set_active_layout(newwin, workspace, layout_new); - - /* copy area to new screen */ - ED_area_data_copy((ScrArea *)newsc->areabase.first, area, true); - - ED_area_tag_redraw((ScrArea *)newsc->areabase.first); - - /* screen, areas init */ - WM_event_add_notifier(C, NC_SCREEN | NA_EDITED, NULL); - -finally: - if (event->type == EVT_ACTIONZONE_AREA) { + if (event && event->customdata) { actionzone_exit(op); } - if (newwin) { - return OPERATOR_FINISHED; - } - return OPERATOR_CANCELLED; + return newwin ? OPERATOR_FINISHED : OPERATOR_CANCELLED; } static void SCREEN_OT_area_dupli(wmOperatorType *ot) @@ -4866,14 +4845,16 @@ static int userpref_show_exec(bContext *C, wmOperator *op) int sizey = 520 * UI_DPI_FAC; /* changes context! */ - if (WM_window_open_temp(C, - IFACE_("Blender Preferences"), - event->x, - event->y, - sizex, - sizey, - SPACE_USERPREF, - false) != NULL) { + if (WM_window_open(C, + IFACE_("Blender Preferences"), + event->x, + event->y, + sizex, + sizey, + SPACE_USERPREF, + false, + true, + WIN_ALIGN_LOCATION_CENTER) != NULL) { /* The header only contains the editor switcher and looks empty. * So hiding in the temp window makes sense. */ ScrArea *area = CTX_wm_area(C); @@ -4925,14 +4906,16 @@ static int drivers_editor_show_exec(bContext *C, wmOperator *op) uiBut *but = UI_context_active_but_prop_get(C, &ptr, &prop, &index); /* changes context! */ - if (WM_window_open_temp(C, - IFACE_("Blender Drivers Editor"), - event->x, - event->y, - sizex, - sizey, - SPACE_GRAPH, - false) != NULL) { + if (WM_window_open(C, + IFACE_("Blender Drivers Editor"), + event->x, + event->y, + sizex, + sizey, + SPACE_GRAPH, + false, + true, + WIN_ALIGN_LOCATION_CENTER) != NULL) { ED_drivers_editor_init(C, CTX_wm_area(C)); /* activate driver F-Curve for the property under the cursor */ @@ -4991,14 +4974,16 @@ static int info_log_show_exec(bContext *C, wmOperator *op) int shift_y = 480; /* changes context! */ - if (WM_window_open_temp(C, - IFACE_("Blender Info Log"), - event->x, - event->y + shift_y, - sizex, - sizey, - SPACE_INFO, - false) != NULL) { + if (WM_window_open(C, + IFACE_("Blender Info Log"), + event->x, + event->y + shift_y, + sizex, + sizey, + SPACE_INFO, + false, + true, + WIN_ALIGN_LOCATION_CENTER) != NULL) { return OPERATOR_FINISHED; } BKE_report(op->reports, RPT_ERROR, "Failed to open window!"); @@ -5083,7 +5068,7 @@ static void SCREEN_OT_delete(wmOperatorType *ot) /** \name Region Alpha Blending Operator * * Implementation note: a disappearing region needs at least 1 last draw with - * 100% backbuffer texture over it - then triple buffer will clear it entirely. + * 100% back-buffer texture over it - then triple buffer will clear it entirely. * This because flag #RGN_FLAG_HIDDEN is set in end - region doesn't draw at all then. * * \{ */ @@ -5567,8 +5552,8 @@ void ED_keymap_screen(wmKeyConfig *keyconf) /* dropbox for entire window */ ListBase *lb = WM_dropboxmap_find("Window", 0, 0); - WM_dropbox_add(lb, "WM_OT_drop_blend_file", blend_file_drop_poll, blend_file_drop_copy); - WM_dropbox_add(lb, "UI_OT_drop_color", UI_drop_color_poll, UI_drop_color_copy); + WM_dropbox_add(lb, "WM_OT_drop_blend_file", blend_file_drop_poll, blend_file_drop_copy, NULL); + WM_dropbox_add(lb, "UI_OT_drop_color", UI_drop_color_poll, UI_drop_color_copy, NULL); keymap_modal_set(keyconf); } diff --git a/source/blender/editors/screen/screendump.c b/source/blender/editors/screen/screendump.c index 7d7a3340dc3..ff0dab7f1c7 100644 --- a/source/blender/editors/screen/screendump.c +++ b/source/blender/editors/screen/screendump.c @@ -229,7 +229,6 @@ static bool screenshot_poll(bContext *C) void SCREEN_OT_screenshot(wmOperatorType *ot) { - /* weak: opname starting with 'save' makes filewindow give save-over */ ot->name = "Save Screenshot"; ot->idname = "SCREEN_OT_screenshot"; ot->description = "Capture a picture of the active area or whole Blender window"; diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c index 5430137f5ca..b99cb831bee 100644 --- a/source/blender/editors/screen/workspace_edit.c +++ b/source/blender/editors/screen/workspace_edit.c @@ -234,7 +234,6 @@ void ED_workspace_scene_data_sync(WorkSpaceInstanceHook *hook, Scene *scene) /* -------------------------------------------------------------------- */ /** \name Workspace Operators - * * \{ */ static WorkSpace *workspace_context_get(bContext *C) diff --git a/source/blender/editors/sculpt_paint/paint_cursor.c b/source/blender/editors/sculpt_paint/paint_cursor.c index 768126699ca..38810d6e131 100644 --- a/source/blender/editors/sculpt_paint/paint_cursor.c +++ b/source/blender/editors/sculpt_paint/paint_cursor.c @@ -350,7 +350,7 @@ static int load_tex(Brush *br, ViewContext *vc, float zoom, bool col, bool prima eGPUTextureFormat format = col ? GPU_RGBA8 : GPU_R8; target->overlay_texture = GPU_texture_create_2d( "paint_cursor_overlay", size, size, 1, format, NULL); - GPU_texture_update(target->overlay_texture, GPU_DATA_UNSIGNED_BYTE, buffer); + GPU_texture_update(target->overlay_texture, GPU_DATA_UBYTE, buffer); if (!col) { GPU_texture_swizzle_set(target->overlay_texture, "rrrr"); @@ -358,7 +358,7 @@ static int load_tex(Brush *br, ViewContext *vc, float zoom, bool col, bool prima } if (init) { - GPU_texture_update(target->overlay_texture, GPU_DATA_UNSIGNED_BYTE, buffer); + GPU_texture_update(target->overlay_texture, GPU_DATA_UBYTE, buffer); } if (buffer) { @@ -469,13 +469,13 @@ static int load_tex_cursor(Brush *br, ViewContext *vc, float zoom) if (!cursor_snap.overlay_texture) { cursor_snap.overlay_texture = GPU_texture_create_2d( "cursor_snap_overaly", size, size, 1, GPU_R8, NULL); - GPU_texture_update(cursor_snap.overlay_texture, GPU_DATA_UNSIGNED_BYTE, buffer); + GPU_texture_update(cursor_snap.overlay_texture, GPU_DATA_UBYTE, buffer); GPU_texture_swizzle_set(cursor_snap.overlay_texture, "rrrr"); } if (init) { - GPU_texture_update(cursor_snap.overlay_texture, GPU_DATA_UNSIGNED_BYTE, buffer); + GPU_texture_update(cursor_snap.overlay_texture, GPU_DATA_UBYTE, buffer); } if (buffer) { diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.c b/source/blender/editors/sculpt_paint/paint_image_proj.c index 7c13355c618..f7c0f7718bb 100644 --- a/source/blender/editors/sculpt_paint/paint_image_proj.c +++ b/source/blender/editors/sculpt_paint/paint_image_proj.c @@ -6250,6 +6250,7 @@ static int texture_paint_image_from_view_exec(bContext *C, wmOperator *op) IB_rect, R_ALPHAPREMUL, NULL, + false, NULL, err_out); diff --git a/source/blender/editors/sculpt_paint/paint_mask.c b/source/blender/editors/sculpt_paint/paint_mask.c index 052753dfefe..91c8f9fb969 100644 --- a/source/blender/editors/sculpt_paint/paint_mask.c +++ b/source/blender/editors/sculpt_paint/paint_mask.c @@ -1016,12 +1016,15 @@ static void sculpt_gesture_trim_shape_origin_normal_get(SculptGestureContext *sg break; case SCULPT_GESTURE_TRIM_ORIENTATION_SURFACE: mul_v3_m4v3(r_origin, sgcontext->vc.obact->obmat, sgcontext->ss->gesture_initial_location); - mul_v3_m4v3(r_normal, sgcontext->vc.obact->obmat, sgcontext->ss->gesture_initial_normal); + /* Transforming the normal does not take non uniform scaling into account. Sculpt mode is not + * expected to work on object with non uniform scaling. */ + copy_v3_v3(r_normal, sgcontext->ss->gesture_initial_normal); + mul_mat3_m4_v3(sgcontext->vc.obact->obmat, r_normal); break; } } -static void sculpt_gesture_trim_calculate_depth(bContext *C, SculptGestureContext *sgcontext) +static void sculpt_gesture_trim_calculate_depth(SculptGestureContext *sgcontext) { SculptGestureTrimOperation *trim_operation = (SculptGestureTrimOperation *)sgcontext->operation; @@ -1072,11 +1075,7 @@ static void sculpt_gesture_trim_calculate_depth(bContext *C, SculptGestureContex (trim_operation->depth_back + trim_operation->depth_front) * 0.5f; } - Sculpt *sd = CTX_data_tool_settings(C)->sculpt; - Brush *brush = BKE_paint_brush(&sd->paint); - Scene *scene = CTX_data_scene(C); - const float depth_radius = BKE_brush_unprojected_radius_get(scene, brush); - + const float depth_radius = ss->cursor_radius; trim_operation->depth_front = mid_point_depth - depth_radius; trim_operation->depth_back = mid_point_depth + depth_radius; } @@ -1314,7 +1313,7 @@ static void sculpt_gesture_apply_trim(SculptGestureContext *sgcontext) static void sculpt_gesture_trim_begin(bContext *C, SculptGestureContext *sgcontext) { Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); - sculpt_gesture_trim_calculate_depth(C, sgcontext); + sculpt_gesture_trim_calculate_depth(sgcontext); sculpt_gesture_trim_geometry_generate(sgcontext); BKE_sculpt_update_object_for_edit(depsgraph, sgcontext->vc.obact, true, false, false); SCULPT_undo_push_node(sgcontext->vc.obact, NULL, SCULPT_UNDO_GEOMETRY); diff --git a/source/blender/editors/sculpt_paint/paint_vertex_color_utils.c b/source/blender/editors/sculpt_paint/paint_vertex_color_utils.c index 7120f6a8748..dbc6044d2d8 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex_color_utils.c +++ b/source/blender/editors/sculpt_paint/paint_vertex_color_utils.c @@ -610,7 +610,9 @@ BLI_INLINE uint mcol_alpha_sub(uint col_src, int fac) return col_mix; } -/* wpaint has 'ED_wpaint_blend_tool' */ +/** + * \note weight-paint has an equivalent function: #ED_wpaint_blend_tool + */ uint ED_vpaint_blend_tool(const int tool, const uint col, const uint paintcol, const int alpha_i) { switch ((IMB_BlendMode)tool) { diff --git a/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c b/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c index 8fd5759d695..8277b485578 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c +++ b/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c @@ -573,6 +573,7 @@ typedef struct WPGradient_vertStore { enum { VGRAD_STORE_NOP = 0, VGRAD_STORE_DW_EXIST = (1 << 0), + VGRAD_STORE_IS_MODIFIED = (1 << 1) } flag; } WPGradient_vertStore; @@ -609,6 +610,8 @@ static void gradientVert_update(WPGradient_userData *grad_data, int index) /* Optionally restrict to assigned vertices only. */ if (grad_data->use_vgroup_restrict && ((vs->flag & VGRAD_STORE_DW_EXIST) == 0)) { + /* In this case the vertex will never have been touched. */ + BLI_assert((vs->flag & VGRAD_STORE_IS_MODIFIED) == 0); return; } @@ -637,6 +640,7 @@ static void gradientVert_update(WPGradient_userData *grad_data, int index) tool, vs->weight_orig, grad_data->weightpaint, alpha * grad_data->brush->alpha); CLAMP(testw, 0.0f, 1.0f); dw->weight = testw; + vs->flag |= VGRAD_STORE_IS_MODIFIED; } else { MDeformVert *dv = &me->dvert[index]; @@ -652,6 +656,7 @@ static void gradientVert_update(WPGradient_userData *grad_data, int index) BKE_defvert_remove_group(dv, dw); } } + vs->flag &= ~VGRAD_STORE_IS_MODIFIED; } } @@ -856,6 +861,20 @@ static int paint_weight_gradient_exec(bContext *C, wmOperator *op) MEM_freeN(vert_cache); } + if (scene->toolsettings->auto_normalize) { + const int vgroup_num = BLI_listbase_count(&ob->defbase); + bool *vgroup_validmap = BKE_object_defgroup_validmap_get(ob, vgroup_num); + if (vgroup_validmap != NULL) { + MDeformVert *dvert = me->dvert; + for (int i = 0; i < me->totvert; i++) { + if ((data.vert_cache->elem[i].flag & VGRAD_STORE_IS_MODIFIED) != 0) { + BKE_defvert_normalize_lock_single(&dvert[i], vgroup_validmap, vgroup_num, data.def_nr); + } + } + MEM_freeN(vgroup_validmap); + } + } + return OPERATOR_FINISHED; } diff --git a/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c b/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c index dc777572858..a8ba87ac483 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c +++ b/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c @@ -273,10 +273,15 @@ BLI_INLINE float wval_exclusion(float weight, float paintval, float fac) return temp * fac + weight * mfac; } -/* vpaint has 'vpaint_blend_tool' */ -/* result is not clamped from [0-1] */ +/** + * \param weight: Typically the current weight: #MDeformWeight.weight + * + * \return The final weight, note that this is _not_ clamped from [0-1]. + * Clamping must be done on the final #MDeformWeight.weight + * + * \note vertex-paint has an equivalent function: #ED_vpaint_blend_tool + */ float ED_wpaint_blend_tool(const int tool, - /* dw->weight */ const float weight, const float paintval, const float alpha) diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index 8a461cf4925..5deb13885ed 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -413,13 +413,14 @@ void SCULPT_face_set_visibility_set(SculptSession *ss, int face_set, bool visibl case PBVH_FACES: case PBVH_GRIDS: for (int i = 0; i < ss->totfaces; i++) { - if (abs(ss->face_sets[i]) == face_set) { - if (visible) { - ss->face_sets[i] = abs(ss->face_sets[i]); - } - else { - ss->face_sets[i] = -abs(ss->face_sets[i]); - } + if (abs(ss->face_sets[i]) != face_set) { + continue; + } + if (visible) { + ss->face_sets[i] = abs(ss->face_sets[i]); + } + else { + ss->face_sets[i] = -abs(ss->face_sets[i]); } } break; @@ -1357,12 +1358,13 @@ bool SCULPT_is_vertex_inside_brush_radius_symm(const float vertex[3], char symm) { for (char i = 0; i <= symm; ++i) { - if (SCULPT_is_symmetry_iteration_valid(i, symm)) { - float location[3]; - flip_v3_v3(location, br_co, (char)i); - if (len_squared_v3v3(location, vertex) < radius * radius) { - return true; - } + if (!SCULPT_is_symmetry_iteration_valid(i, symm)) { + continue; + } + float location[3]; + flip_v3_v3(location, br_co, (char)i); + if (len_squared_v3v3(location, vertex) < radius * radius) { + return true; } } return false; @@ -1405,26 +1407,28 @@ void SCULPT_floodfill_add_initial_with_symmetry(Sculpt *sd, Object *ob, SculptSession *ss, SculptFloodFill *flood, - SculptVertRef index, + SculptVertRef vertex, float radius) { /* Add active vertex and symmetric vertices to the queue. */ const char symm = SCULPT_mesh_symmetry_xyz_get(ob); for (char i = 0; i <= symm; ++i) { - if (SCULPT_is_symmetry_iteration_valid(i, symm)) { - SculptVertRef v = BKE_pbvh_make_vref(-1); - if (i == 0) { - v = index; - } - else if (radius > 0.0f) { - float radius_squared = (radius == FLT_MAX) ? FLT_MAX : radius * radius; - float location[3]; - flip_v3_v3(location, SCULPT_vertex_co_get(ss, index), i); - v = SCULPT_nearest_vertex_get(sd, ob, location, radius_squared, false); - } - if (v.i != -1) { - SCULPT_floodfill_add_initial(flood, v); - } + if (!SCULPT_is_symmetry_iteration_valid(i, symm)) { + continue; + } + SculptVertRef v = {-1}; + if (i == 0) { + v = vertex; + } + else if (radius > 0.0f) { + float radius_squared = (radius == FLT_MAX) ? FLT_MAX : radius * radius; + float location[3]; + flip_v3_v3(location, SCULPT_vertex_co_get(ss, vertex), i); + v = SCULPT_nearest_vertex_get(sd, ob, location, radius_squared, false); + } + + if (v.i != -1) { + SCULPT_floodfill_add_initial(flood, v); } } } @@ -1435,20 +1439,24 @@ void SCULPT_floodfill_add_active( /* Add active vertex and symmetric vertices to the queue. */ const char symm = SCULPT_mesh_symmetry_xyz_get(ob); for (char i = 0; i <= symm; ++i) { - if (SCULPT_is_symmetry_iteration_valid(i, symm)) { - SculptVertRef v = BKE_pbvh_make_vref(-1); - if (i == 0) { - v = SCULPT_active_vertex_get(ss); - } - else if (radius > 0.0f) { - float radius_squared = (radius == FLT_MAX) ? FLT_MAX : radius * radius; - float location[3]; - flip_v3_v3(location, SCULPT_active_vertex_co_get(ss), i); - v = SCULPT_nearest_vertex_get(sd, ob, location, radius_squared, false); - } - if (v.i != -1) { - SCULPT_floodfill_add_initial(flood, v); - } + if (!SCULPT_is_symmetry_iteration_valid(i, symm)) { + continue; + } + + SculptVertRef v = {-1}; + + if (i == 0) { + v = SCULPT_active_vertex_get(ss); + } + else if (radius > 0.0f) { + float radius_squared = (radius == FLT_MAX) ? FLT_MAX : radius * radius; + float location[3]; + flip_v3_v3(location, SCULPT_active_vertex_co_get(ss), i); + v = SCULPT_nearest_vertex_get(sd, ob, location, radius_squared, false); + } + + if (v.i != -1) { + SCULPT_floodfill_add_initial(flood, v); } } } @@ -1468,15 +1476,20 @@ void SCULPT_floodfill_execute(SculptSession *ss, SculptVertexNeighborIter ni; SCULPT_VERTEX_DUPLICATES_AND_NEIGHBORS_ITER_BEGIN (ss, from_v, ni) { const SculptVertRef to_v = ni.vertex; - const int to_v_i = ni.index; + const int to_index = BKE_pbvh_vertex_index_to_table(ss->pbvh, to_v); - if (!BLI_BITMAP_TEST(flood->visited_vertices, to_v_i) && - SCULPT_vertex_visible_get(ss, to_v)) { - BLI_BITMAP_ENABLE(flood->visited_vertices, to_v_i); + if (BLI_BITMAP_TEST(flood->visited_vertices, to_index)) { + continue; + } - if (func(ss, from_v, to_v, ni.is_duplicate, userdata)) { - BLI_gsqueue_push(flood->queue, &to_v); - } + if (!SCULPT_vertex_visible_get(ss, to_v)) { + continue; + } + + BLI_BITMAP_ENABLE(flood->visited_vertices, to_index); + + if (func(ss, from_v, to_v, ni.is_duplicate, userdata)) { + BLI_gsqueue_push(flood->queue, &to_v); } } SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); @@ -1803,40 +1816,42 @@ static void paint_mesh_restore_co_task_cb(void *__restrict userdata, unode = SCULPT_undo_get_node(data->nodes[n], type); } - if (unode) { - PBVHVertexIter vd; - SculptOrigVertData orig_data; + if (!unode) { + return; + } - SCULPT_orig_vert_data_unode_init(&orig_data, data->ob, unode); + PBVHVertexIter vd; + SculptOrigVertData orig_data; - BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) - { - SCULPT_orig_vert_data_update(&orig_data, &vd); + SCULPT_orig_vert_data_unode_init(&orig_data, data->ob, unode); - if (orig_data.unode->type == SCULPT_UNDO_COORDS) { - copy_v3_v3(vd.co, orig_data.co); - if (vd.no) { - copy_v3_v3_short(vd.no, orig_data.no); - } - else { - normal_short_to_float_v3(vd.fno, orig_data.no); - } + BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) + { + SCULPT_orig_vert_data_update(&orig_data, &vd); + + if (orig_data.unode->type == SCULPT_UNDO_COORDS) { + copy_v3_v3(vd.co, orig_data.co); + if (vd.no) { + copy_v3_v3_short(vd.no, orig_data.no); } - else if (orig_data.unode->type == SCULPT_UNDO_MASK) { - *vd.mask = orig_data.mask; - } - else if (orig_data.unode->type == SCULPT_UNDO_COLOR) { - copy_v4_v4(vd.col, orig_data.col); - } - - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; + else { + normal_short_to_float_v3(vd.fno, orig_data.no); } } - BKE_pbvh_vertex_iter_end; + else if (orig_data.unode->type == SCULPT_UNDO_MASK) { + *vd.mask = orig_data.mask; + } + else if (orig_data.unode->type == SCULPT_UNDO_COLOR) { + copy_v4_v4(vd.col, orig_data.col); + } - BKE_pbvh_node_mark_update(data->nodes[n]); + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; + } } + BKE_pbvh_vertex_iter_end; + + BKE_pbvh_node_mark_update(data->nodes[n]); } static void paint_mesh_restore_co(Sculpt *sd, Object *ob) @@ -1882,11 +1897,15 @@ static void sculpt_extend_redraw_rect_previous(Object *ob, rcti *rect) * mesh parts could disappear from screen (sergey). */ SculptSession *ss = ob->sculpt; - if (ss->cache) { - if (!BLI_rcti_is_empty(&ss->cache->previous_r)) { - BLI_rcti_union(rect, &ss->cache->previous_r); - } + if (!ss->cache) { + return; } + + if (BLI_rcti_is_empty(&ss->cache->previous_r)) { + return; + } + + BLI_rcti_union(rect, &ss->cache->previous_r); } /* Get a screen-space rectangle of the modified area. */ @@ -1988,28 +2007,30 @@ bool SCULPT_brush_test_sphere(SculptBrushTest *test, const float co[3]) { float distsq = len_squared_v3v3(co, test->location); - if (distsq <= test->radius_squared) { - if (sculpt_brush_test_clipping(test, co)) { - return false; - } - test->dist = sqrtf(distsq); - return true; + if (distsq > test->radius_squared) { + return false; } - return false; + + if (sculpt_brush_test_clipping(test, co)) { + return false; + } + + test->dist = sqrtf(distsq); + return true; } bool SCULPT_brush_test_sphere_sq(SculptBrushTest *test, const float co[3]) { float distsq = len_squared_v3v3(co, test->location); - if (distsq <= test->radius_squared) { - if (sculpt_brush_test_clipping(test, co)) { - return false; - } - test->dist = distsq; - return true; + if (distsq > test->radius_squared) { + return false; } - return false; + if (sculpt_brush_test_clipping(test, co)) { + return false; + } + test->dist = distsq; + return true; } bool SCULPT_brush_test_sphere_fast(const SculptBrushTest *test, const float co[3]) @@ -2026,14 +2047,16 @@ bool SCULPT_brush_test_circle_sq(SculptBrushTest *test, const float co[3]) closest_to_plane_normalized_v3(co_proj, test->plane_view, co); float distsq = len_squared_v3v3(co_proj, test->location); - if (distsq <= test->radius_squared) { - if (sculpt_brush_test_clipping(test, co)) { - return false; - } - test->dist = distsq; - return true; + if (distsq > test->radius_squared) { + return false; } - return false; + + if (sculpt_brush_test_clipping(test, co)) { + return false; + } + + test->dist = distsq; + return true; } bool SCULPT_brush_test_cube(SculptBrushTest *test, @@ -2061,25 +2084,26 @@ bool SCULPT_brush_test_cube(SculptBrushTest *test, const float constant_side = hardness * side; const float falloff_side = roundness * side; - if (local_co[0] <= side && local_co[1] <= side && local_co[2] <= side) { + if (!(local_co[0] <= side && local_co[1] <= side && local_co[2] <= side)) { + /* Outside the square. */ + return false; + } + if (min_ff(local_co[0], local_co[1]) > constant_side) { /* Corner, distance to the center of the corner circle. */ - if (min_ff(local_co[0], local_co[1]) > constant_side) { - float r_point[3]; - copy_v3_fl(r_point, constant_side); - test->dist = len_v2v2(r_point, local_co) / falloff_side; - return true; - } - /* Side, distance to the square XY axis. */ - if (max_ff(local_co[0], local_co[1]) > constant_side) { - test->dist = (max_ff(local_co[0], local_co[1]) - constant_side) / falloff_side; - return true; - } - /* Inside the square, constant distance. */ - test->dist = 0.0f; + float r_point[3]; + copy_v3_fl(r_point, constant_side); + test->dist = len_v2v2(r_point, local_co) / falloff_side; return true; } - /* Outside the square. */ - return false; + if (max_ff(local_co[0], local_co[1]) > constant_side) { + /* Side, distance to the square XY axis. */ + test->dist = (max_ff(local_co[0], local_co[1]) - constant_side) / falloff_side; + return true; + } + + /* Inside the square, constant distance. */ + test->dist = 0.0f; + return true; } SculptBrushTestFn SCULPT_brush_test_init_with_falloff_shape(SculptSession *ss, @@ -2114,21 +2138,21 @@ static float frontface(const Brush *br, const short no[3], const float fno[3]) { - if (br->flag & BRUSH_FRONTFACE) { - float dot; - - if (no) { - float tmp[3]; - - normal_short_to_float_v3(tmp, no); - dot = dot_v3v3(tmp, sculpt_normal); - } - else { - dot = dot_v3v3(fno, sculpt_normal); - } - return dot > 0.0f ? dot : 0.0f; + if (!(br->flag & BRUSH_FRONTFACE)) { + return 1.0f; } - return 1.0f; + + float dot; + if (no) { + float tmp[3]; + + normal_short_to_float_v3(tmp, no); + dot = dot_v3v3(tmp, sculpt_normal); + } + else { + dot = dot_v3v3(fno, sculpt_normal); + } + return dot > 0.0f ? dot : 0.0f; } #if 0 @@ -2208,25 +2232,25 @@ static float calc_radial_symmetry_feather(Sculpt *sd, static float calc_symmetry_feather(Sculpt *sd, StrokeCache *cache) { - if (sd->paint.symmetry_flags & PAINT_SYMMETRY_FEATHER) { - float overlap; - const int symm = cache->symmetry; + if (!(sd->paint.symmetry_flags & PAINT_SYMMETRY_FEATHER)) { + return 1.0f; + } + float overlap; + const int symm = cache->symmetry; - overlap = 0.0f; - for (int i = 0; i <= symm; i++) { - if (i == 0 || (symm & i && (symm != 5 || i != 3) && (symm != 6 || (i != 3 && i != 5)))) { - - overlap += calc_overlap(cache, i, 0, 0); - - overlap += calc_radial_symmetry_feather(sd, cache, i, 'X'); - overlap += calc_radial_symmetry_feather(sd, cache, i, 'Y'); - overlap += calc_radial_symmetry_feather(sd, cache, i, 'Z'); - } + overlap = 0.0f; + for (int i = 0; i <= symm; i++) { + if (!SCULPT_is_symmetry_iteration_valid(i, symm)) { + continue; } - return 1.0f / overlap; + overlap += calc_overlap(cache, i, 0, 0); + + overlap += calc_radial_symmetry_feather(sd, cache, i, 'X'); + overlap += calc_radial_symmetry_feather(sd, cache, i, 'Y'); + overlap += calc_radial_symmetry_feather(sd, cache, i, 'Z'); } - return 1.0f; + return 1.0f / overlap; } /* -------------------------------------------------------------------- */ @@ -2328,35 +2352,37 @@ static void calc_area_normal_and_center_task_cb(void *__restrict userdata, normal_test_r = sculpt_brush_normal_test_sq_fn(&normal_test, co); area_test_r = sculpt_brush_area_test_sq_fn(&area_test, co); - if (normal_test_r || area_test_r) { - float no[3]; - int flip_index; + if (!normal_test_r && !area_test_r) { + continue; + } - normal_tri_v3(no, UNPACK3(co_tri)); + float no[3]; + int flip_index; - flip_index = (dot_v3v3(ss->cache->view_normal, no) <= 0.0f); - if (use_area_cos && area_test_r) { - /* Weight the coordinates towards the center. */ - float p = 1.0f - (sqrtf(area_test.dist) / area_test.radius); - const float afactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f); + normal_tri_v3(no, UNPACK3(co_tri)); - float disp[3]; - sub_v3_v3v3(disp, co, area_test.location); - mul_v3_fl(disp, 1.0f - afactor); - add_v3_v3v3(co, area_test.location, disp); - add_v3_v3(anctd->area_cos[flip_index], co); + flip_index = (dot_v3v3(ss->cache->view_normal, no) <= 0.0f); + if (use_area_cos && area_test_r) { + /* Weight the coordinates towards the center. */ + float p = 1.0f - (sqrtf(area_test.dist) / area_test.radius); + const float afactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f); - anctd->count_co[flip_index] += 1; - } - if (use_area_nos && normal_test_r) { - /* Weight the normals towards the center. */ - float p = 1.0f - (sqrtf(normal_test.dist) / normal_test.radius); - const float nfactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f); - mul_v3_fl(no, nfactor); + float disp[3]; + sub_v3_v3v3(disp, co, area_test.location); + mul_v3_fl(disp, 1.0f - afactor); + add_v3_v3v3(co, area_test.location, disp); + add_v3_v3(anctd->area_cos[flip_index], co); - add_v3_v3(anctd->area_nos[flip_index], no); - anctd->count_no[flip_index] += 1; - } + anctd->count_co[flip_index] += 1; + } + if (use_area_nos && normal_test_r) { + /* Weight the normals towards the center. */ + float p = 1.0f - (sqrtf(normal_test.dist) / normal_test.radius); + const float nfactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f); + mul_v3_fl(no, nfactor); + + add_v3_v3(anctd->area_nos[flip_index], no); + anctd->count_no[flip_index] += 1; } } } @@ -2392,49 +2418,51 @@ static void calc_area_normal_and_center_task_cb(void *__restrict userdata, normal_test_r = sculpt_brush_normal_test_sq_fn(&normal_test, co); area_test_r = sculpt_brush_area_test_sq_fn(&area_test, co); - if (normal_test_r || area_test_r) { - float no[3]; - int flip_index; + if (!normal_test_r && !area_test_r) { + continue; + } - data->any_vertex_sampled = true; + float no[3]; + int flip_index; - if (use_original) { - normal_short_to_float_v3(no, no_s); + data->any_vertex_sampled = true; + + if (use_original) { + normal_short_to_float_v3(no, no_s); + } + else { + if (vd.no) { + normal_short_to_float_v3(no, vd.no); } else { - if (vd.no) { - normal_short_to_float_v3(no, vd.no); - } - else { - copy_v3_v3(no, vd.fno); - } + copy_v3_v3(no, vd.fno); } + } - flip_index = (dot_v3v3(ss->cache ? ss->cache->view_normal : ss->cursor_view_normal, no) <= - 0.0f); + flip_index = (dot_v3v3(ss->cache ? ss->cache->view_normal : ss->cursor_view_normal, no) <= + 0.0f); - if (use_area_cos && area_test_r) { - /* Weight the coordinates towards the center. */ - float p = 1.0f - (sqrtf(area_test.dist) / area_test.radius); - const float afactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f); + if (use_area_cos && area_test_r) { + /* Weight the coordinates towards the center. */ + float p = 1.0f - (sqrtf(area_test.dist) / area_test.radius); + const float afactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f); - float disp[3]; - sub_v3_v3v3(disp, co, area_test.location); - mul_v3_fl(disp, 1.0f - afactor); - add_v3_v3v3(co, area_test.location, disp); + float disp[3]; + sub_v3_v3v3(disp, co, area_test.location); + mul_v3_fl(disp, 1.0f - afactor); + add_v3_v3v3(co, area_test.location, disp); - add_v3_v3(anctd->area_cos[flip_index], co); - anctd->count_co[flip_index] += 1; - } - if (use_area_nos && normal_test_r) { - /* Weight the normals towards the center. */ - float p = 1.0f - (sqrtf(normal_test.dist) / normal_test.radius); - const float nfactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f); - mul_v3_fl(no, nfactor); + add_v3_v3(anctd->area_cos[flip_index], co); + anctd->count_co[flip_index] += 1; + } + if (use_area_nos && normal_test_r) { + /* Weight the normals towards the center. */ + float p = 1.0f - (sqrtf(normal_test.dist) / normal_test.radius); + const float nfactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f); + mul_v3_fl(no, nfactor); - add_v3_v3(anctd->area_nos[flip_index], no); - anctd->count_no[flip_index] += 1; - } + add_v3_v3(anctd->area_nos[flip_index], no); + anctd->count_no[flip_index] += 1; } } BKE_pbvh_vertex_iter_end; @@ -2491,10 +2519,12 @@ static void calc_area_center( /* For flatten center. */ for (n = 0; n < ARRAY_SIZE(anctd.area_cos); n++) { - if (anctd.count_co[n] != 0) { - mul_v3_v3fl(r_area_co, anctd.area_cos[n], 1.0f / anctd.count_co[n]); - break; + if (anctd.count_co[n] == 0) { + continue; } + + mul_v3_v3fl(r_area_co, anctd.area_cos[n], 1.0f / anctd.count_co[n]); + break; } if (n == 2) { @@ -2590,10 +2620,12 @@ static void calc_area_normal_and_center( /* For flatten center. */ for (n = 0; n < ARRAY_SIZE(anctd.area_cos); n++) { - if (anctd.count_co[n] != 0) { - mul_v3_v3fl(r_area_co, anctd.area_cos[n], 1.0f / anctd.count_co[n]); - break; + if (anctd.count_co[n] == 0) { + continue; } + + mul_v3_v3fl(r_area_co, anctd.area_cos[n], 1.0f / anctd.count_co[n]); + break; } if (n == 2) { @@ -3064,11 +3096,11 @@ static void update_sculpt_normal(Sculpt *sd, Object *ob, PBVHNode **nodes, int t const Brush *brush = BKE_paint_brush(&sd->paint); StrokeCache *cache = ob->sculpt->cache; /* Grab brush does not update the sculpt normal during a stroke. */ - const bool update_normal = !(brush->flag & BRUSH_ORIGINAL_NORMAL) && - !(brush->sculpt_tool == SCULPT_TOOL_GRAB) && - !(brush->sculpt_tool == SCULPT_TOOL_ELASTIC_DEFORM) && - !(brush->sculpt_tool == SCULPT_TOOL_SNAKE_HOOK && - cache->normal_weight > 0.0f); + const bool update_normal = + !(brush->flag & BRUSH_ORIGINAL_NORMAL) && !(brush->sculpt_tool == SCULPT_TOOL_GRAB) && + !(brush->sculpt_tool == SCULPT_TOOL_THUMB && !(brush->flag & BRUSH_ANCHORED)) && + !(brush->sculpt_tool == SCULPT_TOOL_ELASTIC_DEFORM) && + !(brush->sculpt_tool == SCULPT_TOOL_SNAKE_HOOK && cache->normal_weight > 0.0f); if (cache->mirror_symmetry_pass == 0 && cache->radial_symmetry_pass == 0 && (SCULPT_stroke_is_first_brush_step_of_symmetry_pass(cache) || update_normal)) { @@ -3235,26 +3267,27 @@ static void do_topology_rake_bmesh_task_cb_ex(void *__restrict userdata, PBVHVertexIter vd; BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = - bstrength * - SCULPT_brush_strength_factor( - ss, brush, vd.co, sqrtf(test.dist), vd.no, vd.fno, *vd.mask, vd.vertex, thread_id) * - ss->cache->pressure; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = + bstrength * + SCULPT_brush_strength_factor( + ss, brush, vd.co, sqrtf(test.dist), vd.no, vd.fno, *vd.mask, vd.vertex, thread_id) * + ss->cache->pressure; - float avg[3], val[3]; + float avg[3], val[3]; - SCULPT_bmesh_four_neighbor_average(avg, direction, vd.bm_vert); + SCULPT_bmesh_four_neighbor_average(avg, direction, vd.bm_vert); - sub_v3_v3v3(val, avg, vd.co); + sub_v3_v3v3(val, avg, vd.co); - madd_v3_v3v3fl(val, vd.co, val, fade); + madd_v3_v3v3fl(val, vd.co, val, fade); - SCULPT_clip(sd, ss, vd.co, val); + SCULPT_clip(sd, ss, vd.co, val); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -3307,21 +3340,23 @@ static void do_mask_brush_draw_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = SCULPT_brush_strength_factor( - ss, brush, vd.co, sqrtf(test.dist), vd.no, vd.fno, 0.0f, vd.vertex, thread_id); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } - if (bstrength > 0.0f) { - (*vd.mask) += fade * bstrength * (1.0f - *vd.mask); - } - else { - (*vd.mask) += fade * bstrength * (*vd.mask); - } - *vd.mask = clamp_f(*vd.mask, 0.0f, 1.0f); + const float fade = SCULPT_brush_strength_factor( + ss, brush, vd.co, sqrtf(test.dist), vd.no, vd.fno, 0.0f, vd.vertex, thread_id); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (bstrength > 0.0f) { + (*vd.mask) += fade * bstrength * (1.0f - *vd.mask); + } + else { + (*vd.mask) += fade * bstrength * (*vd.mask); + } + *vd.mask = clamp_f(*vd.mask, 0.0f, 1.0f); + + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } BKE_pbvh_vertex_iter_end; } @@ -3382,26 +3417,27 @@ static void do_displacement_eraser_brush_task_cb_ex(void *__restrict userdata, PBVHVertexIter vd; BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); - float limit_co[3]; - float disp[3]; - SCULPT_vertex_limit_surface_get(ss, vd.vertex, limit_co); - sub_v3_v3v3(disp, limit_co, vd.co); - mul_v3_v3fl(proxy[vd.i], disp, fade); + float limit_co[3]; + float disp[3]; + SCULPT_vertex_limit_surface_get(ss, vd.vertex, limit_co); + sub_v3_v3v3(disp, limit_co, vd.co); + mul_v3_v3fl(proxy[vd.i], disp, fade); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -3494,12 +3530,15 @@ static void do_displacement_smear_brush_task_cb_ex(void *__restrict userdata, ss->cache->limit_surface_co[vd.index]); const float *neighbor_limit_surface_disp = ss->cache->prev_displacement[ni.index]; normalize_v3_v3(vertex_disp_norm, vertex_disp); - if (dot_v3v3(current_disp_norm, vertex_disp_norm) < 0.0f) { - const float disp_interp = clamp_f( - -dot_v3v3(current_disp_norm, vertex_disp_norm), 0.0f, 1.0f); - madd_v3_v3fl(interp_limit_surface_disp, neighbor_limit_surface_disp, disp_interp); - weights_accum += disp_interp; + + if (dot_v3v3(current_disp_norm, vertex_disp_norm) >= 0.0f) { + continue; } + + const float disp_interp = clamp_f( + -dot_v3v3(current_disp_norm, vertex_disp_norm), 0.0f, 1.0f); + madd_v3_v3fl(interp_limit_surface_disp, neighbor_limit_surface_disp, disp_interp); + weights_accum += disp_interp; } SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); @@ -3593,23 +3632,24 @@ static void do_draw_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - /* Offset vertex. */ - const float fade = SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + /* Offset vertex. */ + const float fade = SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); - mul_v3_v3fl(proxy[vd.i], offset, fade); + mul_v3_v3fl(proxy[vd.i], offset, fade); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -3672,23 +3712,25 @@ static void do_draw_sharp_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { SCULPT_orig_vert_data_update(&orig_data, &vd); - if (sculpt_brush_test_sq_fn(&test, orig_data.co)) { - /* Offset vertex. */ - const float fade = SCULPT_brush_strength_factor(ss, - brush, - orig_data.co, - sqrtf(test.dist), - orig_data.no, - NULL, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); - mul_v3_v3fl(proxy[vd.i], offset, fade); + if (!sculpt_brush_test_sq_fn(&test, orig_data.co)) { + continue; + } + /* Offset vertex. */ + const float fade = SCULPT_brush_strength_factor(ss, + brush, + orig_data.co, + sqrtf(test.dist), + orig_data.no, + NULL, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + mul_v3_v3fl(proxy[vd.i], offset, fade); + + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -3754,52 +3796,54 @@ static void do_topology_slide_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { SCULPT_orig_vert_data_update(&orig_data, &vd); - if (sculpt_brush_test_sq_fn(&test, orig_data.co)) { - const float fade = SCULPT_brush_strength_factor(ss, - brush, - orig_data.co, - sqrtf(test.dist), - orig_data.no, - NULL, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); - float current_disp[3]; - float current_disp_norm[3]; - float final_disp[3] = {0.0f, 0.0f, 0.0f}; - switch (brush->slide_deform_type) { - case BRUSH_SLIDE_DEFORM_DRAG: - sub_v3_v3v3(current_disp, ss->cache->location, ss->cache->last_location); - break; - case BRUSH_SLIDE_DEFORM_PINCH: - sub_v3_v3v3(current_disp, ss->cache->location, vd.co); - break; - case BRUSH_SLIDE_DEFORM_EXPAND: - sub_v3_v3v3(current_disp, vd.co, ss->cache->location); - break; + if (!sculpt_brush_test_sq_fn(&test, orig_data.co)) { + continue; + } + const float fade = SCULPT_brush_strength_factor(ss, + brush, + orig_data.co, + sqrtf(test.dist), + orig_data.no, + NULL, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); + float current_disp[3]; + float current_disp_norm[3]; + float final_disp[3] = {0.0f, 0.0f, 0.0f}; + + switch (brush->slide_deform_type) { + case BRUSH_SLIDE_DEFORM_DRAG: + sub_v3_v3v3(current_disp, ss->cache->location, ss->cache->last_location); + break; + case BRUSH_SLIDE_DEFORM_PINCH: + sub_v3_v3v3(current_disp, ss->cache->location, vd.co); + break; + case BRUSH_SLIDE_DEFORM_EXPAND: + sub_v3_v3v3(current_disp, vd.co, ss->cache->location); + break; + } + + normalize_v3_v3(current_disp_norm, current_disp); + mul_v3_v3fl(current_disp, current_disp_norm, ss->cache->bstrength); + + SculptVertexNeighborIter ni; + SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vd.vertex, ni) { + float vertex_disp[3]; + float vertex_disp_norm[3]; + sub_v3_v3v3(vertex_disp, SCULPT_vertex_co_get(ss, ni.vertex), vd.co); + normalize_v3_v3(vertex_disp_norm, vertex_disp); + if (dot_v3v3(current_disp_norm, vertex_disp_norm) > 0.0f) { + madd_v3_v3fl(final_disp, vertex_disp_norm, dot_v3v3(current_disp, vertex_disp)); } + } + SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); - normalize_v3_v3(current_disp_norm, current_disp); - mul_v3_v3fl(current_disp, current_disp_norm, ss->cache->bstrength); + mul_v3_v3fl(proxy[vd.i], final_disp, fade); - SculptVertexNeighborIter ni; - SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vd.vertex, ni) { - float vertex_disp[3]; - float vertex_disp_norm[3]; - sub_v3_v3v3(vertex_disp, SCULPT_vertex_co_get(ss, ni.vertex), vd.co); - normalize_v3_v3(vertex_disp_norm, vertex_disp); - if (dot_v3v3(current_disp_norm, vertex_disp_norm) > 0.0f) { - madd_v3_v3fl(final_disp, vertex_disp_norm, dot_v3v3(current_disp, vertex_disp)); - } - } - SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); - - mul_v3_v3fl(proxy[vd.i], final_disp, fade); - - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -3829,16 +3873,17 @@ void SCULPT_relax_vertex(SculptSession *ss, /* When the vertex to relax is boundary, use only connected boundary vertices for the average * position. */ if (is_boundary) { - if (SCULPT_vertex_is_boundary(ss, ni.vertex)) { - add_v3_v3(smooth_pos, SCULPT_vertex_co_get(ss, ni.vertex)); - avg_count++; - - /* Calculate a normal for the constraint plane using the edges of the boundary. */ - float to_neighbor[3]; - sub_v3_v3v3(to_neighbor, SCULPT_vertex_co_get(ss, ni.vertex), vd->co); - normalize_v3(to_neighbor); - add_v3_v3(boundary_normal, to_neighbor); + if (!SCULPT_vertex_is_boundary(ss, ni.vertex)) { + continue; } + add_v3_v3(smooth_pos, SCULPT_vertex_co_get(ss, ni.vertex)); + avg_count++; + + /* Calculate a normal for the constraint plane using the edges of the boundary. */ + float to_neighbor[3]; + sub_v3_v3v3(to_neighbor, SCULPT_vertex_co_get(ss, ni.vertex), vd->co); + normalize_v3(to_neighbor); + add_v3_v3(boundary_normal, to_neighbor); } else { add_v3_v3(smooth_pos, SCULPT_vertex_co_get(ss, ni.vertex)); @@ -3910,21 +3955,23 @@ static void do_topology_relax_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { SCULPT_orig_vert_data_update(&orig_data, &vd); - if (sculpt_brush_test_sq_fn(&test, orig_data.co)) { - const float fade = SCULPT_brush_strength_factor(ss, - brush, - orig_data.co, - sqrtf(test.dist), - orig_data.no, - NULL, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); - SCULPT_relax_vertex(ss, &vd, fade * bstrength, false, vd.co); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (!sculpt_brush_test_sq_fn(&test, orig_data.co)) { + continue; + } + const float fade = SCULPT_brush_strength_factor(ss, + brush, + orig_data.co, + sqrtf(test.dist), + orig_data.no, + NULL, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); + + SCULPT_relax_vertex(ss, &vd, fade * bstrength, false, vd.co); + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -4075,38 +4122,41 @@ static void do_crease_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - /* Offset vertex. */ - const float fade = SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); - float val1[3]; - float val2[3]; - /* First we pinch. */ - sub_v3_v3v3(val1, test.location, vd.co); - if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) { - project_plane_v3_v3v3(val1, val1, ss->cache->view_normal); - } + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } - mul_v3_fl(val1, fade * flippedbstrength); + /* Offset vertex. */ + const float fade = SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); + float val1[3]; + float val2[3]; - sculpt_project_v3(spvc, val1, val1); + /* First we pinch. */ + sub_v3_v3v3(val1, test.location, vd.co); + if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) { + project_plane_v3_v3v3(val1, val1, ss->cache->view_normal); + } - /* Then we draw. */ - mul_v3_v3fl(val2, offset, fade); + mul_v3_fl(val1, fade * flippedbstrength); - add_v3_v3v3(proxy[vd.i], val1, val2); + sculpt_project_v3(spvc, val1, val1); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + /* Then we draw. */ + mul_v3_v3fl(val2, offset, fade); + + add_v3_v3v3(proxy[vd.i], val1, val2); + + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -4192,40 +4242,42 @@ static void do_pinch_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); - float disp_center[3]; - float x_disp[3]; - float z_disp[3]; - /* Calculate displacement from the vertex to the brush center. */ - sub_v3_v3v3(disp_center, test.location, vd.co); - /* Project the displacement into the X vector (aligned to the stroke). */ - mul_v3_v3fl(x_disp, x_object_space, dot_v3v3(disp_center, x_object_space)); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); + float disp_center[3]; + float x_disp[3]; + float z_disp[3]; + /* Calculate displacement from the vertex to the brush center. */ + sub_v3_v3v3(disp_center, test.location, vd.co); - /* Project the displacement into the Z vector (aligned to the surface normal). */ - mul_v3_v3fl(z_disp, z_object_space, dot_v3v3(disp_center, z_object_space)); + /* Project the displacement into the X vector (aligned to the stroke). */ + mul_v3_v3fl(x_disp, x_object_space, dot_v3v3(disp_center, x_object_space)); - /* Add the two projected vectors to calculate the final displacement. - * The Y component is removed. */ - add_v3_v3v3(disp_center, x_disp, z_disp); + /* Project the displacement into the Z vector (aligned to the surface normal). */ + mul_v3_v3fl(z_disp, z_object_space, dot_v3v3(disp_center, z_object_space)); - if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) { - project_plane_v3_v3v3(disp_center, disp_center, ss->cache->view_normal); - } - mul_v3_v3fl(proxy[vd.i], disp_center, fade); + /* Add the two projected vectors to calculate the final displacement. + * The Y component is removed. */ + add_v3_v3v3(disp_center, x_disp, z_disp); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) { + project_plane_v3_v3v3(disp_center, disp_center, ss->cache->view_normal); + } + mul_v3_v3fl(proxy[vd.i], disp_center, fade); + + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -4308,33 +4360,34 @@ static void do_grab_brush_task_cb_ex(void *__restrict userdata, { SCULPT_orig_vert_data_update(&orig_data, &vd); - if (sculpt_brush_test_sq_fn(&test, orig_data.co)) { - float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - orig_data.co, - sqrtf(test.dist), - orig_data.no, - NULL, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, orig_data.co)) { + continue; + } + float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + orig_data.co, + sqrtf(test.dist), + orig_data.no, + NULL, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); - if (grab_silhouette) { - float silhouette_test_dir[3]; - normalize_v3_v3(silhouette_test_dir, grab_delta); - if (dot_v3v3(ss->cache->initial_normal, ss->cache->grab_delta_symmetry) < 0.0f) { - mul_v3_fl(silhouette_test_dir, -1.0f); - } - float vno[3]; - normal_short_to_float_v3(vno, orig_data.no); - fade *= max_ff(dot_v3v3(vno, silhouette_test_dir), 0.0f); + if (grab_silhouette) { + float silhouette_test_dir[3]; + normalize_v3_v3(silhouette_test_dir, grab_delta); + if (dot_v3v3(ss->cache->initial_normal, ss->cache->grab_delta_symmetry) < 0.0f) { + mul_v3_fl(silhouette_test_dir, -1.0f); } + float vno[3]; + normal_short_to_float_v3(vno, orig_data.no); + fade *= max_ff(dot_v3v3(vno, silhouette_test_dir), 0.0f); + } - mul_v3_v3fl(proxy[vd.i], grab_delta, fade); + mul_v3_v3fl(proxy[vd.i], grab_delta, fade); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -4499,13 +4552,14 @@ void SCULPT_flip_v3_by_symm_area(float v[3], { for (int i = 0; i < 3; i++) { ePaintSymmetryFlags symm_it = 1 << i; - if (symm & symm_it) { - if (symmarea & symm_it) { - flip_v3(v, symm_it); - } - if (pivot[i] < 0.0f) { - flip_v3(v, symm_it); - } + if (!(symm & symm_it)) { + continue; + } + if (symmarea & symm_it) { + flip_v3(v, symm_it); + } + if (pivot[i] < 0.0f) { + flip_v3(v, symm_it); } } } @@ -4517,13 +4571,14 @@ void SCULPT_flip_quat_by_symm_area(float quat[3], { for (int i = 0; i < 3; i++) { ePaintSymmetryFlags symm_it = 1 << i; - if (symm & symm_it) { - if (symmarea & symm_it) { - flip_qt(quat, symm_it); - } - if (pivot[i] < 0.0f) { - flip_qt(quat, symm_it); - } + if (!(symm & symm_it)) { + continue; + } + if (symmarea & symm_it) { + flip_qt(quat, symm_it); + } + if (pivot[i] < 0.0f) { + flip_qt(quat, symm_it); } } } @@ -4639,22 +4694,23 @@ static void do_nudge_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); - mul_v3_v3fl(proxy[vd.i], cono, fade); + mul_v3_v3fl(proxy[vd.i], cono, fade); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -4718,75 +4774,76 @@ static void do_snake_hook_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (do_elastic || sculpt_brush_test_sq_fn(&test, vd.co)) { + if (!do_elastic && !sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } - float fade; - if (do_elastic) { - fade = 1.0f; - } - else { - fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); + float fade; + if (do_elastic) { + fade = 1.0f; + } + else { + fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); + } + + mul_v3_v3fl(proxy[vd.i], grab_delta, fade); + + /* Negative pinch will inflate, helps maintain volume. */ + if (do_pinch) { + float delta_pinch_init[3], delta_pinch[3]; + + sub_v3_v3v3(delta_pinch, vd.co, test.location); + if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) { + project_plane_v3_v3v3(delta_pinch, delta_pinch, ss->cache->true_view_normal); } - mul_v3_v3fl(proxy[vd.i], grab_delta, fade); + /* Important to calculate based on the grabbed location + * (intentionally ignore fade here). */ + add_v3_v3(delta_pinch, grab_delta); - /* Negative pinch will inflate, helps maintain volume. */ - if (do_pinch) { - float delta_pinch_init[3], delta_pinch[3]; + sculpt_project_v3(spvc, delta_pinch, delta_pinch); - sub_v3_v3v3(delta_pinch, vd.co, test.location); - if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) { - project_plane_v3_v3v3(delta_pinch, delta_pinch, ss->cache->true_view_normal); - } + copy_v3_v3(delta_pinch_init, delta_pinch); - /* Important to calculate based on the grabbed location - * (intentionally ignore fade here). */ - add_v3_v3(delta_pinch, grab_delta); - - sculpt_project_v3(spvc, delta_pinch, delta_pinch); - - copy_v3_v3(delta_pinch_init, delta_pinch); - - float pinch_fade = pinch * fade; - /* When reducing, scale reduction back by how close to the center we are, - * so we don't pinch into nothingness. */ - if (pinch > 0.0f) { - /* Square to have even less impact for close vertices. */ - pinch_fade *= pow2f(min_ff(1.0f, len_v3(delta_pinch) / ss->cache->radius)); - } - mul_v3_fl(delta_pinch, 1.0f + pinch_fade); - sub_v3_v3v3(delta_pinch, delta_pinch_init, delta_pinch); - add_v3_v3(proxy[vd.i], delta_pinch); + float pinch_fade = pinch * fade; + /* When reducing, scale reduction back by how close to the center we are, + * so we don't pinch into nothingness. */ + if (pinch > 0.0f) { + /* Square to have even less impact for close vertices. */ + pinch_fade *= pow2f(min_ff(1.0f, len_v3(delta_pinch) / ss->cache->radius)); } + mul_v3_fl(delta_pinch, 1.0f + pinch_fade); + sub_v3_v3v3(delta_pinch, delta_pinch_init, delta_pinch); + add_v3_v3(proxy[vd.i], delta_pinch); + } - if (do_rake_rotation) { - float delta_rotate[3]; - sculpt_rake_rotate(ss, test.location, vd.co, fade, delta_rotate); - add_v3_v3(proxy[vd.i], delta_rotate); - } + if (do_rake_rotation) { + float delta_rotate[3]; + sculpt_rake_rotate(ss, test.location, vd.co, fade, delta_rotate); + add_v3_v3(proxy[vd.i], delta_rotate); + } - if (do_elastic) { - float disp[3]; - BKE_kelvinlet_grab_triscale(disp, ¶ms, vd.co, ss->cache->location, proxy[vd.i]); - mul_v3_fl(disp, bstrength * 20.0f); - if (vd.mask) { - mul_v3_fl(disp, 1.0f - *vd.mask); - } - mul_v3_fl(disp, SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.vertex)); - copy_v3_v3(proxy[vd.i], disp); + if (do_elastic) { + float disp[3]; + BKE_kelvinlet_grab_triscale(disp, ¶ms, vd.co, ss->cache->location, proxy[vd.i]); + mul_v3_fl(disp, bstrength * 20.0f); + if (vd.mask) { + mul_v3_fl(disp, 1.0f - *vd.mask); } + mul_v3_fl(disp, SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.vertex)); + copy_v3_v3(proxy[vd.i], disp); + } - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -4857,22 +4914,23 @@ static void do_thumb_brush_task_cb_ex(void *__restrict userdata, { SCULPT_orig_vert_data_update(&orig_data, &vd); - if (sculpt_brush_test_sq_fn(&test, orig_data.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - orig_data.co, - sqrtf(test.dist), - orig_data.no, - NULL, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, orig_data.co)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + orig_data.co, + sqrtf(test.dist), + orig_data.no, + NULL, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); - mul_v3_v3fl(proxy[vd.i], cono, fade); + mul_v3_v3fl(proxy[vd.i], cono, fade); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -4930,27 +4988,28 @@ static void do_rotate_brush_task_cb_ex(void *__restrict userdata, { SCULPT_orig_vert_data_update(&orig_data, &vd); - if (sculpt_brush_test_sq_fn(&test, orig_data.co)) { - float vec[3], rot[3][3]; - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - orig_data.co, - sqrtf(test.dist), - orig_data.no, - NULL, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, orig_data.co)) { + continue; + } + float vec[3], rot[3][3]; + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + orig_data.co, + sqrtf(test.dist), + orig_data.no, + NULL, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); - sub_v3_v3v3(vec, orig_data.co, ss->cache->location); - axis_angle_normalized_to_mat3(rot, ss->cache->sculpt_normal_symm, angle * fade); - mul_v3_m3v3(proxy[vd.i], rot, vec); - add_v3_v3(proxy[vd.i], ss->cache->location); - sub_v3_v3(proxy[vd.i], orig_data.co); + sub_v3_v3v3(vec, orig_data.co, ss->cache->location); + axis_angle_normalized_to_mat3(rot, ss->cache->sculpt_normal_symm, angle * fade); + mul_v3_m3v3(proxy[vd.i], rot, vec); + add_v3_v3(proxy[vd.i], ss->cache->location); + sub_v3_v3(proxy[vd.i], orig_data.co); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -5008,72 +5067,72 @@ static void do_layer_brush_task_cb_ex(void *__restrict userdata, { SCULPT_orig_vert_data_update(&orig_data, &vd); - if (sculpt_brush_test_sq_fn(&test, orig_data.co)) { - const float fade = SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, orig_data.co)) { + continue; + } + const float fade = SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); - const int vi = vd.index; + const int vi = vd.index; + float *disp_factor; + if (use_persistent_base) { + disp_factor = &ss->persistent_base[vi].disp; + } + else { + disp_factor = &ss->cache->layer_displacement_factor[vi]; + } - float *disp_factor; - if (use_persistent_base) { - disp_factor = &ss->persistent_base[vi].disp; - } - else { - disp_factor = &ss->cache->layer_displacement_factor[vi]; - } + /* When using persistent base, the layer brush (holding Control) invert mode resets the + * height of the layer to 0. This makes possible to clean edges of previously added layers + * on top of the base. */ + /* The main direction of the layers is inverted using the regular brush strength with the + * brush direction property. */ + if (use_persistent_base && ss->cache->invert) { + (*disp_factor) += fabsf(fade * bstrength * (*disp_factor)) * + ((*disp_factor) > 0.0f ? -1.0f : 1.0f); + } + else { + (*disp_factor) += fade * bstrength * (1.05f - fabsf(*disp_factor)); + } + if (vd.mask) { + const float clamp_mask = 1.0f - *vd.mask; + *disp_factor = clamp_f(*disp_factor, -clamp_mask, clamp_mask); + } + else { + *disp_factor = clamp_f(*disp_factor, -1.0f, 1.0f); + } - /* When using persistent base, the layer brush (holding Control) invert mode resets the - * height of the layer to 0. This makes possible to clean edges of previously added layers - * on top of the base. */ - /* The main direction of the layers is inverted using the regular brush strength with the - * brush direction property. */ - if (use_persistent_base && ss->cache->invert) { - (*disp_factor) += fabsf(fade * bstrength * (*disp_factor)) * - ((*disp_factor) > 0.0f ? -1.0f : 1.0f); - } - else { - (*disp_factor) += fade * bstrength * (1.05f - fabsf(*disp_factor)); - } - if (vd.mask) { - const float clamp_mask = 1.0f - *vd.mask; - *disp_factor = clamp_f(*disp_factor, -clamp_mask, clamp_mask); - } - else { - *disp_factor = clamp_f(*disp_factor, -1.0f, 1.0f); - } + float final_co[3]; + float normal[3]; - float final_co[3]; - float normal[3]; + if (use_persistent_base) { + SCULPT_vertex_persistent_normal_get(ss, vd.vertex, normal); + mul_v3_fl(normal, brush->height); + madd_v3_v3v3fl( + final_co, SCULPT_vertex_persistent_co_get(ss, vd.vertex), normal, *disp_factor); + } + else { + normal_short_to_float_v3(normal, orig_data.no); + mul_v3_fl(normal, brush->height); + madd_v3_v3v3fl(final_co, orig_data.co, normal, *disp_factor); + } - if (use_persistent_base) { - SCULPT_vertex_persistent_normal_get(ss, vd.vertex, normal); - mul_v3_fl(normal, brush->height); - madd_v3_v3v3fl( - final_co, SCULPT_vertex_persistent_co_get(ss, vd.vertex), normal, *disp_factor); - } - else { - normal_short_to_float_v3(normal, orig_data.no); - mul_v3_fl(normal, brush->height); - madd_v3_v3v3fl(final_co, orig_data.co, normal, *disp_factor); - } + float vdisp[3]; + sub_v3_v3v3(vdisp, final_co, vd.co); + mul_v3_fl(vdisp, fabsf(fade)); + add_v3_v3v3(final_co, vd.co, vdisp); - float vdisp[3]; - sub_v3_v3v3(vdisp, final_co, vd.co); - mul_v3_fl(vdisp, fabsf(fade)); - add_v3_v3v3(final_co, vd.co, vdisp); + SCULPT_clip(sd, ss, vd.co, final_co); - SCULPT_clip(sd, ss, vd.co, final_co); - - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -5122,31 +5181,32 @@ static void do_inflate_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); - float val[3]; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); + float val[3]; - if (vd.fno) { - copy_v3_v3(val, vd.fno); - } - else { - normal_short_to_float_v3(val, vd.no); - } + if (vd.fno) { + copy_v3_v3(val, vd.fno); + } + else { + normal_short_to_float_v3(val, vd.no); + } - mul_v3_fl(val, fade * ss->cache->radius); - mul_v3_v3v3(proxy[vd.i], val, ss->cache->scale); + mul_v3_fl(val, fade * ss->cache->radius); + mul_v3_v3v3(proxy[vd.i], val, ss->cache->scale); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -5227,30 +5287,30 @@ static void do_flatten_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - float intr[3]; - float val[3]; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + float intr[3]; + float val[3]; - closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); + closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); - sub_v3_v3v3(val, intr, vd.co); + sub_v3_v3v3(val, intr, vd.co); - if (SCULPT_plane_trim(ss->cache, brush, val)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); + if (SCULPT_plane_trim(ss->cache, brush, val)) { + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); + mul_v3_v3fl(proxy[vd.i], val, fade); - mul_v3_v3fl(proxy[vd.i], val, fade); - - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } } @@ -5333,16 +5393,17 @@ static void calc_clay_surface_task_cb(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - float plane_dist = dist_signed_to_plane_v3(vd.co, plane); - float plane_dist_abs = fabsf(plane_dist); - if (plane_dist > 0.0f) { - csd->plane_dist[0] = MIN2(csd->plane_dist[0], plane_dist_abs); - } - else { - csd->plane_dist[1] = MIN2(csd->plane_dist[1], plane_dist_abs); - } + float plane_dist = dist_signed_to_plane_v3(vd.co, plane); + float plane_dist_abs = fabsf(plane_dist); + if (plane_dist > 0.0f) { + csd->plane_dist[0] = MIN2(csd->plane_dist[0], plane_dist_abs); + } + else { + csd->plane_dist[1] = MIN2(csd->plane_dist[1], plane_dist_abs); } BKE_pbvh_vertex_iter_end; } @@ -5383,28 +5444,30 @@ static void do_clay_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - float intr[3]; - float val[3]; - closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } - sub_v3_v3v3(val, intr, vd.co); + float intr[3]; + float val[3]; + closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); + sub_v3_v3v3(val, intr, vd.co); - mul_v3_v3fl(proxy[vd.i], val, fade); + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + mul_v3_v3fl(proxy[vd.i], val, fade); + + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -5501,35 +5564,36 @@ static void do_clay_strips_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (SCULPT_brush_test_cube(&test, vd.co, mat, brush->tip_roundness)) { - if (plane_point_side_flip(vd.co, test.plane_tool, flip)) { - float intr[3]; - float val[3]; + if (!SCULPT_brush_test_cube(&test, vd.co, mat, brush->tip_roundness)) { + continue; + } - closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); + if (!plane_point_side_flip(vd.co, test.plane_tool, flip)) { + continue; + } - sub_v3_v3v3(val, intr, vd.co); + float intr[3]; + float val[3]; + closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); + sub_v3_v3v3(val, intr, vd.co); - if (SCULPT_plane_trim(ss->cache, brush, val)) { - /* The normal from the vertices is ignored, it causes glitch with planes, see: T44390. */ - const float fade = bstrength * - SCULPT_brush_strength_factor(ss, - brush, - vd.co, - ss->cache->radius * test.dist, - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); + if (!SCULPT_plane_trim(ss->cache, brush, val)) { + continue; + } + /* The normal from the vertices is ignored, it causes glitch with planes, see: T44390. */ + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + ss->cache->radius * test.dist, + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); + mul_v3_v3fl(proxy[vd.i], val, fade); - mul_v3_v3fl(proxy[vd.i], val, fade); - - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } - } - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -5653,33 +5717,37 @@ static void do_fill_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - if (SCULPT_plane_point_side(vd.co, test.plane_tool)) { - float intr[3]; - float val[3]; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } - closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); + if (!SCULPT_plane_point_side(vd.co, test.plane_tool)) { + continue; + } - sub_v3_v3v3(val, intr, vd.co); + float intr[3]; + float val[3]; + closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); + sub_v3_v3v3(val, intr, vd.co); - if (SCULPT_plane_trim(ss->cache, brush, val)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); + if (!SCULPT_plane_trim(ss->cache, brush, val)) { + continue; + } - mul_v3_v3fl(proxy[vd.i], val, fade); + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } - } - } + mul_v3_v3fl(proxy[vd.i], val, fade); + + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -5748,33 +5816,37 @@ static void do_scrape_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - if (!SCULPT_plane_point_side(vd.co, test.plane_tool)) { - float intr[3]; - float val[3]; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } - closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); + if (SCULPT_plane_point_side(vd.co, test.plane_tool)) { + continue; + } - sub_v3_v3v3(val, intr, vd.co); + float intr[3]; + float val[3]; + closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); + sub_v3_v3v3(val, intr, vd.co); - if (SCULPT_plane_trim(ss->cache, brush, val)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); + if (!SCULPT_plane_trim(ss->cache, brush, val)) { + continue; + } - mul_v3_v3fl(proxy[vd.i], val, fade); + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } - } - } + mul_v3_v3fl(proxy[vd.i], val, fade); + + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -5859,38 +5931,39 @@ static void do_clay_thumb_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - float local_co[3]; - mul_v3_m4v3(local_co, mat, vd.co); - float intr[3], intr_tilt[3]; - float val[3]; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + float local_co[3]; + mul_v3_m4v3(local_co, mat, vd.co); + float intr[3], intr_tilt[3]; + float val[3]; - closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); - closest_to_plane_normalized_v3(intr_tilt, plane_tilt, vd.co); + closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); + closest_to_plane_normalized_v3(intr_tilt, plane_tilt, vd.co); - /* Mix the deformation of the aligned and the tilted plane based on the brush space vertex - * coordinates. */ - /* We can also control the mix with a curve if it produces noticeable artifacts in the center - * of the brush. */ - const float tilt_mix = local_co[1] > 0.0f ? 0.0f : 1.0f; - interp_v3_v3v3(intr, intr, intr_tilt, tilt_mix); - sub_v3_v3v3(val, intr_tilt, vd.co); + /* Mix the deformation of the aligned and the tilted plane based on the brush space vertex + * coordinates. */ + /* We can also control the mix with a curve if it produces noticeable artifacts in the center + * of the brush. */ + const float tilt_mix = local_co[1] > 0.0f ? 0.0f : 1.0f; + interp_v3_v3v3(intr, intr, intr_tilt, tilt_mix); + sub_v3_v3v3(val, intr_tilt, vd.co); - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); - mul_v3_v3fl(proxy[vd.i], val, fade); + mul_v3_v3fl(proxy[vd.i], val, fade); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -6014,22 +6087,23 @@ static void do_gravity_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); - mul_v3_v3fl(proxy[vd.i], offset, fade); + mul_v3_v3fl(proxy[vd.i], offset, fade); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -6124,38 +6198,34 @@ static void sculpt_topology_update(Sculpt *sd, ob, sd, brush, use_original, radius_scale, &totnode); /* Only act if some verts are inside the brush area. */ - if (totnode) { - PBVHTopologyUpdateMode mode = 0; - float location[3]; + if (totnode == 0) { + return; + } - if (!(sd->flags & SCULPT_DYNTOPO_DETAIL_MANUAL)) { - if (sd->flags & SCULPT_DYNTOPO_SUBDIVIDE) { - mode |= PBVH_Subdivide; - } + /* Free index based vertex info as it will become invalid after modifying the topology during the + * stroke. */ + MEM_SAFE_FREE(ss->vertex_info.boundary); + MEM_SAFE_FREE(ss->vertex_info.connected_component); - if ((sd->flags & SCULPT_DYNTOPO_COLLAPSE) || (brush->sculpt_tool == SCULPT_TOOL_SIMPLIFY)) { - mode |= PBVH_Collapse; - } + PBVHTopologyUpdateMode mode = 0; + float location[3]; + + if (!(sd->flags & SCULPT_DYNTOPO_DETAIL_MANUAL)) { + if (sd->flags & SCULPT_DYNTOPO_SUBDIVIDE) { + mode |= PBVH_Subdivide; } - bool undo_push = !use_original || - SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache); - - for (n = 0; n < totnode; n++) { - if (undo_push) { - SCULPT_undo_push_node(ob, - nodes[n], - brush->sculpt_tool == SCULPT_TOOL_MASK ? SCULPT_UNDO_MASK : - SCULPT_UNDO_COORDS); - } - - BKE_pbvh_node_mark_update(nodes[n]); - - if (BKE_pbvh_type(ss->pbvh) == PBVH_BMESH) { - BKE_pbvh_node_mark_topology_update(nodes[n]); - BKE_pbvh_bmesh_node_save_ortri(ss->bm, nodes[n]); - } + if ((sd->flags & SCULPT_DYNTOPO_COLLAPSE) || (brush->sculpt_tool == SCULPT_TOOL_SIMPLIFY)) { + mode |= PBVH_Collapse; } + } + + for (n = 0; n < totnode; n++) { + SCULPT_undo_push_node(ob, + nodes[n], + brush->sculpt_tool == SCULPT_TOOL_MASK ? SCULPT_UNDO_MASK : + SCULPT_UNDO_COORDS); + BKE_pbvh_node_mark_update(nodes[n]); if (BKE_pbvh_type(ss->pbvh) == PBVH_BMESH) { int symidx = ss->cache->mirror_symmetry_pass + (ss->cache->radial_symmetry_pass * 8); @@ -6172,18 +6242,22 @@ static void sculpt_topology_update(Sculpt *sd, (brush->falloff_shape != PAINT_FALLOFF_SHAPE_SPHERE), symidx, brush->sculpt_tool != SCULPT_TOOL_DRAW_SHARP); + + BKE_pbvh_node_mark_topology_update(nodes[n]); + BKE_pbvh_bmesh_node_save_orig(ss->bm, nodes[n]); } - - MEM_SAFE_FREE(nodes); - - /* Update average stroke position. */ - copy_v3_v3(location, ss->cache->true_location); - mul_m4_v3(ob->obmat, location); } + + MEM_SAFE_FREE(nodes); + + /* Update average stroke position. */ + copy_v3_v3(location, ss->cache->true_location); + mul_m4_v3(ob->obmat, location); } -static void do_brush_action_task_cb( - void *__restrict userdata, const int n, const TaskParallelTLS *__restrict UNUSED(tls)) +static void do_brush_action_task_cb(void *__restrict userdata, + const int n, + const TaskParallelTLS *__restrict UNUSED(tls)) { SculptThreadedTaskData *data = userdata; SculptSession *ss = data->ob->sculpt; @@ -6288,245 +6362,241 @@ static void do_brush_action(Sculpt *sd, Object *ob, Brush *brush, UnifiedPaintSe } /* Only act if some verts are inside the brush area. */ - if (totnode) { - float location[3]; + if (totnode == 0) { + return; + } + float location[3]; - // dyntopo can't push undo nodes inside a thread - if (ss->bm) { - if (ELEM(brush->sculpt_tool, SCULPT_TOOL_PAINT, SCULPT_TOOL_SMEAR)) { - for (int i = 0; i < totnode; i++) { - int other = brush->vcol_boundary_factor > 0.0f ? SCULPT_UNDO_COORDS : -1; + // dyntopo can't push undo nodes inside a thread + if (ss->bm) { + if (ELEM(brush->sculpt_tool, SCULPT_TOOL_PAINT, SCULPT_TOOL_SMEAR)) { + for (int i = 0; i < totnode; i++) { + int other = brush->vcol_boundary_factor > 0.0f ? SCULPT_UNDO_COORDS : -1; - if (SCULPT_ensure_dyntopo_node_undo(ob, nodes[i], SCULPT_UNDO_COLOR, other)) { - BKE_pbvh_update_origcolor_bmesh(ss->pbvh, nodes[i]); + if (SCULPT_ensure_dyntopo_node_undo(ob, nodes[i], SCULPT_UNDO_COLOR, other)) { + BKE_pbvh_update_origcolor_bmesh(ss->pbvh, nodes[i]); - if (other != -1) { - BKE_pbvh_update_origco_bmesh(ss->pbvh, nodes[i]); - } + if (other != -1) { + BKE_pbvh_update_origco_bmesh(ss->pbvh, nodes[i]); } - - BKE_pbvh_node_mark_update_color(nodes[i]); - // SCULPT_undo_push_node(ob, nodes[i], SCULPT_UNDO_COLOR); } + + BKE_pbvh_node_mark_update_color(nodes[i]); + // SCULPT_undo_push_node(ob, nodes[i], SCULPT_UNDO_COLOR); } - else if (brush->sculpt_tool == SCULPT_TOOL_DRAW_FACE_SETS) { - for (int i = 0; i < totnode; i++) { - if (ss->cache->alt_smooth) { - SCULPT_ensure_dyntopo_node_undo( - ob, nodes[i], SCULPT_UNDO_FACE_SETS, SCULPT_UNDO_COORDS); - } - else { - SCULPT_ensure_dyntopo_node_undo(ob, nodes[i], SCULPT_UNDO_FACE_SETS, -1); - } + } + else if (brush->sculpt_tool == SCULPT_TOOL_DRAW_FACE_SETS) { + for (int i = 0; i < totnode; i++) { + if (ss->cache->alt_smooth) { + SCULPT_ensure_dyntopo_node_undo(ob, nodes[i], SCULPT_UNDO_FACE_SETS, SCULPT_UNDO_COORDS); + } + else { + SCULPT_ensure_dyntopo_node_undo(ob, nodes[i], SCULPT_UNDO_FACE_SETS, -1); + } - BKE_pbvh_node_mark_update(nodes[i]); - } - } - else { - for (int i = 0; i < totnode; i++) { - SCULPT_ensure_dyntopo_node_undo(ob, nodes[i], SCULPT_UNDO_COORDS, -1); - BKE_pbvh_node_mark_update(nodes[i]); - } + BKE_pbvh_node_mark_update(nodes[i]); } } else { - SculptThreadedTaskData task_data = { - .sd = sd, - .ob = ob, - .brush = brush, - .nodes = nodes, - }; - - TaskParallelSettings settings; - BKE_pbvh_parallel_range_settings(&settings, true, totnode); - BLI_task_parallel_range(0, totnode, &task_data, do_brush_action_task_cb, &settings); - } - - if (sculpt_brush_needs_normal(ss, brush)) { - update_sculpt_normal(sd, ob, nodes, totnode); - } - - if (brush->mtex.brush_map_mode == MTEX_MAP_MODE_AREA) { - update_brush_local_mat(sd, ob); - } - - if (brush->sculpt_tool == SCULPT_TOOL_POSE && SCULPT_stroke_is_first_brush_step(ss->cache)) { - SCULPT_pose_brush_init(sd, ob, ss, brush); - } - - if (brush->deform_target == BRUSH_DEFORM_TARGET_CLOTH_SIM) { - if (!ss->cache->cloth_sim) { - ss->cache->cloth_sim = SCULPT_cloth_brush_simulation_create( - ss, 1.0f, 0.0f, 0.0f, false, true); - SCULPT_cloth_brush_simulation_init(ss, ss->cache->cloth_sim); + for (int i = 0; i < totnode; i++) { + SCULPT_ensure_dyntopo_node_undo(ob, nodes[i], SCULPT_UNDO_COORDS, -1); + BKE_pbvh_node_mark_update(nodes[i]); } - SCULPT_cloth_brush_store_simulation_state(ss, ss->cache->cloth_sim); - SCULPT_cloth_brush_ensure_nodes_constraints( - sd, ob, nodes, totnode, ss->cache->cloth_sim, ss->cache->location, FLT_MAX); } + } + else { + SculptThreadedTaskData task_data = { + .sd = sd, + .ob = ob, + .brush = brush, + .nodes = nodes, + }; - bool invert = ss->cache->pen_flip || ss->cache->invert || brush->flag & BRUSH_DIR_IN; + TaskParallelSettings settings; + BKE_pbvh_parallel_range_settings(&settings, true, totnode); + BLI_task_parallel_range(0, totnode, &task_data, do_brush_action_task_cb, &settings); + } - /* Apply one type of brush action. */ - switch (brush->sculpt_tool) { - case SCULPT_TOOL_DRAW: - do_draw_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_SMOOTH: - if (brush->smooth_deform_type == BRUSH_SMOOTH_DEFORM_LAPLACIAN) { - SCULPT_do_smooth_brush(sd, ob, nodes, totnode); - } - else if (brush->smooth_deform_type == BRUSH_SMOOTH_DEFORM_SURFACE) { - SCULPT_do_surface_smooth_brush(sd, ob, nodes, totnode); - } - break; - case SCULPT_TOOL_CREASE: - do_crease_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_BLOB: - do_crease_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_PINCH: - do_pinch_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_INFLATE: - do_inflate_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_GRAB: - do_grab_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_ROTATE: - do_rotate_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_SNAKE_HOOK: - do_snake_hook_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_NUDGE: - do_nudge_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_THUMB: - do_thumb_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_LAYER: - do_layer_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_FLATTEN: - do_flatten_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_CLAY: - do_clay_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_CLAY_STRIPS: - do_clay_strips_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_MULTIPLANE_SCRAPE: - SCULPT_do_multiplane_scrape_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_CLAY_THUMB: - do_clay_thumb_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_FILL: - if (invert && brush->flag & BRUSH_INVERT_TO_SCRAPE_FILL) { - do_scrape_brush(sd, ob, nodes, totnode); - } - else { - do_fill_brush(sd, ob, nodes, totnode); - } - break; - case SCULPT_TOOL_SCRAPE: - if (invert && brush->flag & BRUSH_INVERT_TO_SCRAPE_FILL) { - do_fill_brush(sd, ob, nodes, totnode); - } - else { - do_scrape_brush(sd, ob, nodes, totnode); - } - break; - case SCULPT_TOOL_MASK: - do_mask_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_POSE: - SCULPT_do_pose_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_DRAW_SHARP: - do_draw_sharp_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_ELASTIC_DEFORM: - do_elastic_deform_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_SLIDE_RELAX: - do_slide_relax_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_BOUNDARY: - SCULPT_do_boundary_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_CLOTH: - SCULPT_do_cloth_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_DRAW_FACE_SETS: - SCULPT_do_draw_face_sets_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_DISPLACEMENT_ERASER: - do_displacement_eraser_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_DISPLACEMENT_SMEAR: - do_displacement_smear_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_PAINT: - SCULPT_do_paint_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_VCOL_BOUNDARY: - SCULPT_smooth_vcol_boundary(sd, ob, nodes, totnode, ss->cache->bstrength); - break; - case SCULPT_TOOL_SMEAR: - SCULPT_do_smear_brush(sd, ob, nodes, totnode); - break; + if (sculpt_brush_needs_normal(ss, brush)) { + update_sculpt_normal(sd, ob, nodes, totnode); + } + + if (brush->mtex.brush_map_mode == MTEX_MAP_MODE_AREA) { + update_brush_local_mat(sd, ob); + } + + if (brush->sculpt_tool == SCULPT_TOOL_POSE && SCULPT_stroke_is_first_brush_step(ss->cache)) { + SCULPT_pose_brush_init(sd, ob, ss, brush); + } + + if (brush->deform_target == BRUSH_DEFORM_TARGET_CLOTH_SIM) { + if (!ss->cache->cloth_sim) { + ss->cache->cloth_sim = SCULPT_cloth_brush_simulation_create( + ss, 1.0f, 0.0f, 0.0f, false, true); + SCULPT_cloth_brush_simulation_init(ss, ss->cache->cloth_sim); } + SCULPT_cloth_brush_store_simulation_state(ss, ss->cache->cloth_sim); + SCULPT_cloth_brush_ensure_nodes_constraints( + sd, ob, nodes, totnode, ss->cache->cloth_sim, ss->cache->location, FLT_MAX); + } - if (!ELEM(brush->sculpt_tool, SCULPT_TOOL_SMOOTH, SCULPT_TOOL_MASK) && - brush->autosmooth_factor > 0) { - if (brush->flag & BRUSH_INVERSE_SMOOTH_PRESSURE) { - SCULPT_smooth(sd, - ob, - nodes, - totnode, - brush->autosmooth_factor * (1.0f - ss->cache->pressure), - false); + bool invert = ss->cache->pen_flip || ss->cache->invert || brush->flag & BRUSH_DIR_IN; + + /* Apply one type of brush action. */ + switch (brush->sculpt_tool) { + case SCULPT_TOOL_DRAW: + do_draw_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_SMOOTH: + if (brush->smooth_deform_type == BRUSH_SMOOTH_DEFORM_LAPLACIAN) { + SCULPT_do_smooth_brush(sd, ob, nodes, totnode); + } + else if (brush->smooth_deform_type == BRUSH_SMOOTH_DEFORM_SURFACE) { + SCULPT_do_surface_smooth_brush(sd, ob, nodes, totnode); + } + break; + case SCULPT_TOOL_CREASE: + do_crease_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_BLOB: + do_crease_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_PINCH: + do_pinch_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_INFLATE: + do_inflate_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_GRAB: + do_grab_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_ROTATE: + do_rotate_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_SNAKE_HOOK: + do_snake_hook_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_NUDGE: + do_nudge_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_THUMB: + do_thumb_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_LAYER: + do_layer_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_FLATTEN: + do_flatten_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_CLAY: + do_clay_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_CLAY_STRIPS: + do_clay_strips_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_MULTIPLANE_SCRAPE: + SCULPT_do_multiplane_scrape_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_CLAY_THUMB: + do_clay_thumb_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_FILL: + if (invert && brush->flag & BRUSH_INVERT_TO_SCRAPE_FILL) { + do_scrape_brush(sd, ob, nodes, totnode); } else { - SCULPT_smooth(sd, ob, nodes, totnode, brush->autosmooth_factor, false); + do_fill_brush(sd, ob, nodes, totnode); } - } - - if (sculpt_brush_use_topology_rake(ss, brush)) { - bmesh_topology_rake(sd, ob, nodes, totnode, brush->topology_rake_factor); - } - - /* The cloth brush adds the gravity as a regular force and it is processed in the solver. */ - if (ss->cache->supports_gravity && !ELEM(brush->sculpt_tool, - SCULPT_TOOL_CLOTH, - SCULPT_TOOL_DRAW_FACE_SETS, - SCULPT_TOOL_BOUNDARY)) { - do_gravity(sd, ob, nodes, totnode, sd->gravity_factor); - } - - if (brush->deform_target == BRUSH_DEFORM_TARGET_CLOTH_SIM) { - if (SCULPT_stroke_is_main_symmetry_pass(ss->cache)) { - SCULPT_cloth_sim_activate_nodes(ss->cache->cloth_sim, nodes, totnode); - SCULPT_cloth_brush_do_simulation_step(sd, ob, ss->cache->cloth_sim, nodes, totnode); + break; + case SCULPT_TOOL_SCRAPE: + if (invert && brush->flag & BRUSH_INVERT_TO_SCRAPE_FILL) { + do_fill_brush(sd, ob, nodes, totnode); } - } - - MEM_SAFE_FREE(nodes); - - /* Update average stroke position. */ - copy_v3_v3(location, ss->cache->true_location); - mul_m4_v3(ob->obmat, location); - - add_v3_v3(ups->average_stroke_accum, location); - ups->average_stroke_counter++; - /* Update last stroke position. */ - ups->last_stroke_valid = true; + else { + do_scrape_brush(sd, ob, nodes, totnode); + } + break; + case SCULPT_TOOL_MASK: + do_mask_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_POSE: + SCULPT_do_pose_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_DRAW_SHARP: + do_draw_sharp_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_ELASTIC_DEFORM: + do_elastic_deform_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_SLIDE_RELAX: + do_slide_relax_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_BOUNDARY: + SCULPT_do_boundary_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_CLOTH: + SCULPT_do_cloth_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_DRAW_FACE_SETS: + SCULPT_do_draw_face_sets_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_DISPLACEMENT_ERASER: + do_displacement_eraser_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_DISPLACEMENT_SMEAR: + do_displacement_smear_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_PAINT: + SCULPT_do_paint_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_SMEAR: + SCULPT_do_smear_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_VCOL_BOUNDARY: + SCULPT_smooth_vcol_boundary(sd, ob, nodes, totnode, ss->cache->bstrength); + break; } + + if (!ELEM(brush->sculpt_tool, SCULPT_TOOL_SMOOTH, SCULPT_TOOL_MASK) && + brush->autosmooth_factor > 0) { + if (brush->flag & BRUSH_INVERSE_SMOOTH_PRESSURE) { + SCULPT_smooth( + sd, ob, nodes, totnode, brush->autosmooth_factor * (1.0f - ss->cache->pressure), false); + } + else { + SCULPT_smooth(sd, ob, nodes, totnode, brush->autosmooth_factor, false); + } + } + + if (sculpt_brush_use_topology_rake(ss, brush)) { + bmesh_topology_rake(sd, ob, nodes, totnode, brush->topology_rake_factor); + } + + /* The cloth brush adds the gravity as a regular force and it is processed in the solver. */ + if (ss->cache->supports_gravity && !ELEM(brush->sculpt_tool, + SCULPT_TOOL_CLOTH, + SCULPT_TOOL_DRAW_FACE_SETS, + SCULPT_TOOL_BOUNDARY)) { + do_gravity(sd, ob, nodes, totnode, sd->gravity_factor); + } + + if (brush->deform_target == BRUSH_DEFORM_TARGET_CLOTH_SIM) { + if (SCULPT_stroke_is_main_symmetry_pass(ss->cache)) { + SCULPT_cloth_sim_activate_nodes(ss->cache->cloth_sim, nodes, totnode); + SCULPT_cloth_brush_do_simulation_step(sd, ob, ss->cache->cloth_sim, nodes, totnode); + } + } + + MEM_SAFE_FREE(nodes); + + /* Update average stroke position. */ + copy_v3_v3(location, ss->cache->true_location); + mul_m4_v3(ob->obmat, location); + + add_v3_v3(ups->average_stroke_accum, location); + ups->average_stroke_counter++; + /* Update last stroke position. */ + ups->last_stroke_valid = true; } /* Flush displacement from deformed PBVH vertex to original mesh. */ @@ -6618,22 +6688,22 @@ static void sculpt_combine_proxies(Sculpt *sd, Object *ob) PBVHNode **nodes; int totnode; - BKE_pbvh_gather_proxies(ss->pbvh, &nodes, &totnode); - - /* First line is tools that don't support proxies. */ - if (ss->cache->supports_gravity || (sculpt_tool_is_proxy_used(brush->sculpt_tool) == false)) { - SculptThreadedTaskData data = { - .sd = sd, - .ob = ob, - .brush = brush, - .nodes = nodes, - }; - - TaskParallelSettings settings; - BKE_pbvh_parallel_range_settings(&settings, true, totnode); - BLI_task_parallel_range(0, totnode, &data, sculpt_combine_proxies_task_cb, &settings); + if (!ss->cache->supports_gravity && sculpt_tool_is_proxy_used(brush->sculpt_tool)) { + /* First line is tools that don't support proxies. */ + return; } + BKE_pbvh_gather_proxies(ss->pbvh, &nodes, &totnode); + SculptThreadedTaskData data = { + .sd = sd, + .ob = ob, + .brush = brush, + .nodes = nodes, + }; + + TaskParallelSettings settings; + BKE_pbvh_parallel_range_settings(&settings, true, totnode); + BLI_task_parallel_range(0, totnode, &data, sculpt_combine_proxies_task_cb, &settings); MEM_SAFE_FREE(nodes); } @@ -6654,12 +6724,14 @@ static void sculpt_update_keyblock(Object *ob) vertCos = BKE_pbvh_vert_coords_alloc(ss->pbvh); } - if (vertCos) { - SCULPT_vertcos_to_key(ob, ss->shapekey_active, vertCos); + if (!vertCos) { + return; + } - if (vertCos != ss->orig_cos) { - MEM_freeN(vertCos); - } + SCULPT_vertcos_to_key(ob, ss->shapekey_active, vertCos); + + if (vertCos != ss->orig_cos) { + MEM_freeN(vertCos); } } @@ -6682,9 +6754,12 @@ static void SCULPT_flush_stroke_deform_task_cb(void *__restrict userdata, { sculpt_flush_pbvhvert_deform(ob, &vd); - if (vertCos) { - copy_v3_v3(vertCos[vd.index], ss->orig_cos[vd.index]); + if (!vertCos) { + continue; } + + int index = vd.vert_indices[vd.i]; + copy_v3_v3(vertCos[index], ss->orig_cos[index]); } BKE_pbvh_vertex_iter_end; } @@ -6833,7 +6908,7 @@ static void do_tiled( } } - /* First do the "untiled" position to initialize the stroke for this location. */ + /* First do the "un-tiled" position to initialize the stroke for this location. */ cache->tile_pass = 0; action(sd, ob, brush, ups); @@ -6912,17 +6987,18 @@ static void do_symmetrical_brush_actions(Sculpt *sd, /* `symm` is a bit combination of XYZ - * 1 is mirror X; 2 is Y; 3 is XY; 4 is Z; 5 is XZ; 6 is YZ; 7 is XYZ */ for (int i = 0; i <= symm; i++) { - if (i == 0 || (symm & i && (symm != 5 || i != 3) && (symm != 6 || (i != 3 && i != 5)))) { - cache->mirror_symmetry_pass = i; - cache->radial_symmetry_pass = 0; - - SCULPT_cache_calc_brushdata_symm(cache, i, 0, 0); - do_tiled(sd, ob, brush, ups, action); - - do_radial_symmetry(sd, ob, brush, ups, action, i, 'X', feather); - do_radial_symmetry(sd, ob, brush, ups, action, i, 'Y', feather); - do_radial_symmetry(sd, ob, brush, ups, action, i, 'Z', feather); + if (!SCULPT_is_symmetry_iteration_valid(i, symm)) { + continue; } + cache->mirror_symmetry_pass = i; + cache->radial_symmetry_pass = 0; + + SCULPT_cache_calc_brushdata_symm(cache, i, 0, 0); + do_tiled(sd, ob, brush, ups, action); + + do_radial_symmetry(sd, ob, brush, ups, action, i, 'X', feather); + do_radial_symmetry(sd, ob, brush, ups, action, i, 'Y', feather); + do_radial_symmetry(sd, ob, brush, ups, action, i, 'Z', feather); } } @@ -7110,22 +7186,25 @@ static void sculpt_init_mirror_clipping(Object *ob, SculptSession *ss) ModifierData *md; for (md = ob->modifiers.first; md; md = md->next) { - if (md->type == eModifierType_Mirror && (md->mode & eModifierMode_Realtime)) { - MirrorModifierData *mmd = (MirrorModifierData *)md; + if (!(md->type == eModifierType_Mirror && (md->mode & eModifierMode_Realtime))) { + continue; + } + MirrorModifierData *mmd = (MirrorModifierData *)md; - if (mmd->flag & MOD_MIR_CLIPPING) { - /* Check each axis for mirroring. */ - for (int i = 0; i < 3; i++) { - if (mmd->flag & (MOD_MIR_AXIS_X << i)) { - /* Enable sculpt clipping. */ - ss->cache->flag |= CLIP_X << i; + if (!(mmd->flag & MOD_MIR_CLIPPING)) { + continue; + } + /* Check each axis for mirroring. */ + for (int i = 0; i < 3; i++) { + if (!(mmd->flag & (MOD_MIR_AXIS_X << i))) { + continue; + } + /* Enable sculpt clipping. */ + ss->cache->flag |= CLIP_X << i; - /* Update the clip tolerance. */ - if (mmd->tolerance > ss->cache->clip_tolerance[i]) { - ss->cache->clip_tolerance[i] = mmd->tolerance; - } - } - } + /* Update the clip tolerance. */ + if (mmd->tolerance > ss->cache->clip_tolerance[i]) { + ss->cache->clip_tolerance[i] = mmd->tolerance; } } } @@ -7368,150 +7447,151 @@ static void sculpt_update_brush_delta(UnifiedPaintSettings *ups, Object *ob, Bru }; int tool = brush->sculpt_tool; - if (ELEM(tool, - SCULPT_TOOL_PAINT, - SCULPT_TOOL_GRAB, - SCULPT_TOOL_ELASTIC_DEFORM, - SCULPT_TOOL_CLOTH, - SCULPT_TOOL_NUDGE, - SCULPT_TOOL_CLAY_STRIPS, - SCULPT_TOOL_PINCH, - SCULPT_TOOL_MULTIPLANE_SCRAPE, - SCULPT_TOOL_CLAY_THUMB, - SCULPT_TOOL_SNAKE_HOOK, - SCULPT_TOOL_POSE, - SCULPT_TOOL_BOUNDARY, - SCULPT_TOOL_THUMB) || - sculpt_brush_use_topology_rake(ss, brush)) { - float grab_location[3], imat[4][4], delta[3], loc[3]; + if (!ELEM(tool, + SCULPT_TOOL_PAINT, + SCULPT_TOOL_GRAB, + SCULPT_TOOL_ELASTIC_DEFORM, + SCULPT_TOOL_CLOTH, + SCULPT_TOOL_NUDGE, + SCULPT_TOOL_CLAY_STRIPS, + SCULPT_TOOL_PINCH, + SCULPT_TOOL_MULTIPLANE_SCRAPE, + SCULPT_TOOL_CLAY_THUMB, + SCULPT_TOOL_SNAKE_HOOK, + SCULPT_TOOL_POSE, + SCULPT_TOOL_BOUNDARY, + SCULPT_TOOL_THUMB) && + !sculpt_brush_use_topology_rake(ss, brush)) { + return; + } + float grab_location[3], imat[4][4], delta[3], loc[3]; - if (SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) { - if (tool == SCULPT_TOOL_GRAB && brush->flag & BRUSH_GRAB_ACTIVE_VERTEX) { - copy_v3_v3(cache->orig_grab_location, - SCULPT_vertex_co_for_grab_active_get(ss, SCULPT_active_vertex_get(ss))); - } - else { - copy_v3_v3(cache->orig_grab_location, cache->true_location); - } - } - else if (tool == SCULPT_TOOL_SNAKE_HOOK || - (tool == SCULPT_TOOL_CLOTH && - brush->cloth_deform_type == BRUSH_CLOTH_DEFORM_SNAKE_HOOK)) { - add_v3_v3(cache->true_location, cache->grab_delta); - } - - /* Compute 3d coordinate at same z from original location + mouse. */ - mul_v3_m4v3(loc, ob->obmat, cache->orig_grab_location); - ED_view3d_win_to_3d(cache->vc->v3d, cache->vc->region, loc, mouse, grab_location); - - /* Compute delta to move verts by. */ - if (!SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) { - if (sculpt_needs_delta_from_anchored_origin(brush)) { - sub_v3_v3v3(delta, grab_location, cache->old_grab_location); - invert_m4_m4(imat, ob->obmat); - mul_mat3_m4_v3(imat, delta); - add_v3_v3(cache->grab_delta, delta); - } - else if (sculpt_needs_delta_for_tip_orientation(brush)) { - if (brush->flag & BRUSH_ANCHORED) { - float orig[3]; - mul_v3_m4v3(orig, ob->obmat, cache->orig_grab_location); - sub_v3_v3v3(cache->grab_delta, grab_location, orig); - } - else { - sub_v3_v3v3(cache->grab_delta, grab_location, cache->old_grab_location); - } - invert_m4_m4(imat, ob->obmat); - mul_mat3_m4_v3(imat, cache->grab_delta); - } - else { - /* Use for 'Brush.topology_rake_factor'. */ - sub_v3_v3v3(cache->grab_delta, grab_location, cache->old_grab_location); - } + if (SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) { + if (tool == SCULPT_TOOL_GRAB && brush->flag & BRUSH_GRAB_ACTIVE_VERTEX) { + copy_v3_v3(cache->orig_grab_location, + SCULPT_vertex_co_for_grab_active_get(ss, SCULPT_active_vertex_get(ss))); } else { - zero_v3(cache->grab_delta); - } - - if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) { - project_plane_v3_v3v3(cache->grab_delta, cache->grab_delta, ss->cache->true_view_normal); - } - - copy_v3_v3(cache->old_grab_location, grab_location); - - if (tool == SCULPT_TOOL_GRAB) { - if (brush->flag & BRUSH_GRAB_ACTIVE_VERTEX) { - copy_v3_v3(cache->anchored_location, cache->orig_grab_location); - } - else { - copy_v3_v3(cache->anchored_location, cache->true_location); - } - } - else if (tool == SCULPT_TOOL_ELASTIC_DEFORM || SCULPT_is_cloth_deform_brush(brush)) { - copy_v3_v3(cache->anchored_location, cache->true_location); - } - else if (tool == SCULPT_TOOL_THUMB) { - copy_v3_v3(cache->anchored_location, cache->orig_grab_location); - } - - if (sculpt_needs_delta_from_anchored_origin(brush)) { - /* Location stays the same for finding vertices in brush radius. */ - copy_v3_v3(cache->true_location, cache->orig_grab_location); - - ups->draw_anchored = true; - copy_v2_v2(ups->anchored_initial_mouse, cache->initial_mouse); - ups->anchored_size = ups->pixel_radius; - } - - /* Handle 'rake' */ - cache->is_rake_rotation_valid = false; - - invert_m4_m4(imat, ob->obmat); - mul_mat3_m4_v3(imat, grab_location); - - if (SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) { - copy_v3_v3(cache->rake_data.follow_co, grab_location); - } - - if (sculpt_brush_needs_rake_rotation(brush)) { - cache->rake_data.follow_dist = cache->radius * SCULPT_RAKE_BRUSH_FACTOR; - - if (!is_zero_v3(cache->grab_delta)) { - const float eps = 0.00001f; - - float v1[3], v2[3]; - - copy_v3_v3(v1, cache->rake_data.follow_co); - copy_v3_v3(v2, cache->rake_data.follow_co); - sub_v3_v3(v2, cache->grab_delta); - - sub_v3_v3(v1, grab_location); - sub_v3_v3(v2, grab_location); - - if ((normalize_v3(v2) > eps) && (normalize_v3(v1) > eps) && - (len_squared_v3v3(v1, v2) > eps)) { - const float rake_dist_sq = len_squared_v3v3(cache->rake_data.follow_co, grab_location); - const float rake_fade = (rake_dist_sq > square_f(cache->rake_data.follow_dist)) ? - 1.0f : - sqrtf(rake_dist_sq) / cache->rake_data.follow_dist; - - float axis[3], angle; - float tquat[4]; - - rotation_between_vecs_to_quat(tquat, v1, v2); - - /* Use axis-angle to scale rotation since the factor may be above 1. */ - quat_to_axis_angle(axis, &angle, tquat); - normalize_v3(axis); - - angle *= brush->rake_factor * rake_fade; - axis_angle_normalized_to_quat(cache->rake_rotation, axis, angle); - cache->is_rake_rotation_valid = true; - } - } - sculpt_rake_data_update(&cache->rake_data, grab_location); + copy_v3_v3(cache->orig_grab_location, cache->true_location); } } + else if (tool == SCULPT_TOOL_SNAKE_HOOK || + (tool == SCULPT_TOOL_CLOTH && + brush->cloth_deform_type == BRUSH_CLOTH_DEFORM_SNAKE_HOOK)) { + add_v3_v3(cache->true_location, cache->grab_delta); + } + + /* Compute 3d coordinate at same z from original location + mouse. */ + mul_v3_m4v3(loc, ob->obmat, cache->orig_grab_location); + ED_view3d_win_to_3d(cache->vc->v3d, cache->vc->region, loc, mouse, grab_location); + + /* Compute delta to move verts by. */ + if (!SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) { + if (sculpt_needs_delta_from_anchored_origin(brush)) { + sub_v3_v3v3(delta, grab_location, cache->old_grab_location); + invert_m4_m4(imat, ob->obmat); + mul_mat3_m4_v3(imat, delta); + add_v3_v3(cache->grab_delta, delta); + } + else if (sculpt_needs_delta_for_tip_orientation(brush)) { + if (brush->flag & BRUSH_ANCHORED) { + float orig[3]; + mul_v3_m4v3(orig, ob->obmat, cache->orig_grab_location); + sub_v3_v3v3(cache->grab_delta, grab_location, orig); + } + else { + sub_v3_v3v3(cache->grab_delta, grab_location, cache->old_grab_location); + } + invert_m4_m4(imat, ob->obmat); + mul_mat3_m4_v3(imat, cache->grab_delta); + } + else { + /* Use for 'Brush.topology_rake_factor'. */ + sub_v3_v3v3(cache->grab_delta, grab_location, cache->old_grab_location); + } + } + else { + zero_v3(cache->grab_delta); + } + + if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) { + project_plane_v3_v3v3(cache->grab_delta, cache->grab_delta, ss->cache->true_view_normal); + } + + copy_v3_v3(cache->old_grab_location, grab_location); + + if (tool == SCULPT_TOOL_GRAB) { + if (brush->flag & BRUSH_GRAB_ACTIVE_VERTEX) { + copy_v3_v3(cache->anchored_location, cache->orig_grab_location); + } + else { + copy_v3_v3(cache->anchored_location, cache->true_location); + } + } + else if (tool == SCULPT_TOOL_ELASTIC_DEFORM || SCULPT_is_cloth_deform_brush(brush)) { + copy_v3_v3(cache->anchored_location, cache->true_location); + } + else if (tool == SCULPT_TOOL_THUMB) { + copy_v3_v3(cache->anchored_location, cache->orig_grab_location); + } + + if (sculpt_needs_delta_from_anchored_origin(brush)) { + /* Location stays the same for finding vertices in brush radius. */ + copy_v3_v3(cache->true_location, cache->orig_grab_location); + + ups->draw_anchored = true; + copy_v2_v2(ups->anchored_initial_mouse, cache->initial_mouse); + ups->anchored_size = ups->pixel_radius; + } + + /* Handle 'rake' */ + cache->is_rake_rotation_valid = false; + + invert_m4_m4(imat, ob->obmat); + mul_mat3_m4_v3(imat, grab_location); + + if (SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) { + copy_v3_v3(cache->rake_data.follow_co, grab_location); + } + + if (!sculpt_brush_needs_rake_rotation(brush)) { + return; + } + cache->rake_data.follow_dist = cache->radius * SCULPT_RAKE_BRUSH_FACTOR; + + if (!is_zero_v3(cache->grab_delta)) { + const float eps = 0.00001f; + + float v1[3], v2[3]; + + copy_v3_v3(v1, cache->rake_data.follow_co); + copy_v3_v3(v2, cache->rake_data.follow_co); + sub_v3_v3(v2, cache->grab_delta); + + sub_v3_v3(v1, grab_location); + sub_v3_v3(v2, grab_location); + + if ((normalize_v3(v2) > eps) && (normalize_v3(v1) > eps) && (len_squared_v3v3(v1, v2) > eps)) { + const float rake_dist_sq = len_squared_v3v3(cache->rake_data.follow_co, grab_location); + const float rake_fade = (rake_dist_sq > square_f(cache->rake_data.follow_dist)) ? + 1.0f : + sqrtf(rake_dist_sq) / cache->rake_data.follow_dist; + + float axis[3], angle; + float tquat[4]; + + rotation_between_vecs_to_quat(tquat, v1, v2); + + /* Use axis-angle to scale rotation since the factor may be above 1. */ + quat_to_axis_angle(axis, &angle, tquat); + normalize_v3(axis); + + angle *= brush->rake_factor * rake_fade; + axis_angle_normalized_to_quat(cache->rake_rotation, axis, angle); + cache->is_rake_rotation_valid = true; + } + } + sculpt_rake_data_update(&cache->rake_data, grab_location); } static void sculpt_update_cache_paint_variants(StrokeCache *cache, const Brush *brush) @@ -7701,70 +7781,72 @@ void SCULPT_stroke_modifiers_check(const bContext *C, Object *ob, const Brush *b static void sculpt_raycast_cb(PBVHNode *node, void *data_v, float *tmin) { - if (BKE_pbvh_node_get_tmin(node) < *tmin) { - SculptRaycastData *srd = data_v; - float(*origco)[3] = NULL; - bool use_origco = false; + if (BKE_pbvh_node_get_tmin(node) >= *tmin) { + return; + } + SculptRaycastData *srd = data_v; + float(*origco)[3] = NULL; + bool use_origco = false; - if (srd->original && srd->ss->cache) { - if (BKE_pbvh_type(srd->ss->pbvh) == PBVH_BMESH) { - use_origco = true; - } - else { - /* Intersect with coordinates from before we started stroke. */ - SculptUndoNode *unode = SCULPT_undo_get_node(node, -1); - origco = (unode) ? unode->co : NULL; - use_origco = origco ? true : false; - } + if (srd->original && srd->ss->cache) { + if (BKE_pbvh_type(srd->ss->pbvh) == PBVH_BMESH) { + use_origco = true; } + else { + /* Intersect with coordinates from before we started stroke. */ + SculptUndoNode *unode = SCULPT_undo_get_node(node); + origco = (unode) ? unode->co : NULL; + use_origco = origco ? true : false; + } + } - if (BKE_pbvh_node_raycast(srd->ss->pbvh, - node, - origco, - use_origco, - srd->ray_start, - srd->ray_normal, - &srd->isect_precalc, - &srd->depth, - &srd->active_vertex_index, - &srd->active_face_grid_index, - srd->face_normal)) { - srd->hit = true; - *tmin = srd->depth; - } + if (BKE_pbvh_node_raycast(srd->ss->pbvh, + node, + origco, + use_origco, + srd->ray_start, + srd->ray_normal, + &srd->isect_precalc, + &srd->depth, + &srd->active_vertex_index, + &srd->active_face_grid_index, + srd->face_normal)) { + srd->hit = true; + *tmin = srd->depth; } } static void sculpt_find_nearest_to_ray_cb(PBVHNode *node, void *data_v, float *tmin) { - if (BKE_pbvh_node_get_tmin(node) < *tmin) { - SculptFindNearestToRayData *srd = data_v; - float(*origco)[3] = NULL; - bool use_origco = false; + if (BKE_pbvh_node_get_tmin(node) >= *tmin) { + return; + } + SculptFindNearestToRayData *srd = data_v; + float(*origco)[3] = NULL; + bool use_origco = false; - if (srd->original && srd->ss->cache) { - if (BKE_pbvh_type(srd->ss->pbvh) == PBVH_BMESH) { - use_origco = true; - } - else { - /* Intersect with coordinates from before we started stroke. */ - SculptUndoNode *unode = SCULPT_undo_get_node(node, -1); - origco = (unode) ? unode->co : NULL; - use_origco = origco ? true : false; - } + if (srd->original && srd->ss->cache) { + if (BKE_pbvh_type(srd->ss->pbvh) == PBVH_BMESH) { + use_origco = true; } + else { + /* Intersect with coordinates from before we started stroke. */ + SculptUndoNode *unode = SCULPT_undo_get_node(node); + origco = (unode) ? unode->co : NULL; + use_origco = origco ? true : false; + } + } - if (BKE_pbvh_node_find_nearest_to_ray(srd->ss->pbvh, - node, - origco, - use_origco, - srd->ray_start, - srd->ray_normal, - &srd->depth, - &srd->dist_sq_to_ray)) { - srd->hit = true; - *tmin = srd->dist_sq_to_ray; - } + if (BKE_pbvh_node_find_nearest_to_ray(srd->ss->pbvh, + node, + origco, + use_origco, + srd->ray_start, + srd->ray_normal, + &srd->depth, + &srd->dist_sq_to_ray)) { + srd->hit = true; + *tmin = srd->dist_sq_to_ray; } } @@ -7988,26 +8070,30 @@ bool SCULPT_stroke_get_location(bContext *C, float out[3], const float mouse[2]) } } - if (!hit) { - if (ELEM(brush->falloff_shape, PAINT_FALLOFF_SHAPE_TUBE)) { - SculptFindNearestToRayData srd = { - .original = original, - .ss = ob->sculpt, - .hit = false, - .ray_start = ray_start, - .ray_normal = ray_normal, - .depth = FLT_MAX, - .dist_sq_to_ray = FLT_MAX, - }; - BKE_pbvh_find_nearest_to_ray( - ss->pbvh, sculpt_find_nearest_to_ray_cb, &srd, ray_start, ray_normal, srd.original); - if (srd.hit) { - hit = true; - copy_v3_v3(out, ray_normal); - mul_v3_fl(out, srd.depth); - add_v3_v3(out, ray_start); - } - } + if (hit) { + return hit; + } + + if (!ELEM(brush->falloff_shape, PAINT_FALLOFF_SHAPE_TUBE)) { + return hit; + } + + SculptFindNearestToRayData srd = { + .original = original, + .ss = ob->sculpt, + .hit = false, + .ray_start = ray_start, + .ray_normal = ray_normal, + .depth = FLT_MAX, + .dist_sq_to_ray = FLT_MAX, + }; + BKE_pbvh_find_nearest_to_ray( + ss->pbvh, sculpt_find_nearest_to_ray_cb, &srd, ray_start, ray_normal, srd.original); + if (srd.hit) { + hit = true; + copy_v3_v3(out, ray_normal); + mul_v3_fl(out, srd.depth); + add_v3_v3(out, ray_start); } return hit; @@ -8197,19 +8283,20 @@ void SCULPT_flush_update_done(const bContext *C, Object *ob, SculptUpdateType up bScreen *screen = WM_window_get_active_screen(win); LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { SpaceLink *sl = area->spacedata.first; - if (sl->spacetype == SPACE_VIEW3D) { - View3D *v3d = (View3D *)sl; - if (v3d != current_v3d) { - need_tag |= !BKE_sculptsession_use_pbvh_draw(ob, v3d); - } + if (sl->spacetype != SPACE_VIEW3D) { + continue; + } + View3D *v3d = (View3D *)sl; + if (v3d != current_v3d) { + need_tag |= !BKE_sculptsession_use_pbvh_draw(ob, v3d); + } - /* Tag all 3D viewports for redraw now that we are done. Others - * viewports did not get a full redraw, and anti-aliasing for the - * current viewport was deactivated. */ - LISTBASE_FOREACH (ARegion *, region, &area->regionbase) { - if (region->regiontype == RGN_TYPE_WINDOW) { - ED_region_tag_redraw(region); - } + /* Tag all 3D viewports for redraw now that we are done. Others + * viewports did not get a full redraw, and anti-aliasing for the + * current viewport was deactivated. */ + LISTBASE_FOREACH (ARegion *, region, &area->regionbase) { + if (region->regiontype == RGN_TYPE_WINDOW) { + ED_region_tag_redraw(region); } } } @@ -8388,58 +8475,56 @@ static void sculpt_stroke_done(const bContext *C, struct PaintStroke *UNUSED(str Sculpt *sd = CTX_data_tool_settings(C)->sculpt; /* Finished. */ - if (ss->cache) { - UnifiedPaintSettings *ups = &CTX_data_tool_settings(C)->unified_paint_settings; - Brush *brush = BKE_paint_brush(&sd->paint); - BLI_assert(brush == ss->cache->brush); /* const, so we shouldn't change. */ - ups->draw_inverted = false; + if (!ss->cache) { + sculpt_brush_exit_tex(sd); + return; + } + UnifiedPaintSettings *ups = &CTX_data_tool_settings(C)->unified_paint_settings; + Brush *brush = BKE_paint_brush(&sd->paint); + BLI_assert(brush == ss->cache->brush); /* const, so we shouldn't change. */ + ups->draw_inverted = false; - SCULPT_stroke_modifiers_check(C, ob, brush); + SCULPT_stroke_modifiers_check(C, ob, brush); - /* Alt-Smooth. */ - if (ss->cache->alt_smooth) { - if (brush->sculpt_tool == SCULPT_TOOL_MASK) { - brush->mask_tool = ss->cache->saved_mask_brush_tool; - } - else if (ELEM(brush->sculpt_tool, - SCULPT_TOOL_SLIDE_RELAX, - SCULPT_TOOL_DRAW_FACE_SETS, - SCULPT_TOOL_PAINT, - SCULPT_TOOL_SMEAR)) { - /* Do nothing. */ - } - else { - BKE_brush_size_set(scene, brush, ss->cache->saved_smooth_size); - brush = (Brush *)BKE_libblock_find_name(bmain, ID_BR, ss->cache->saved_active_brush_name); - if (brush) { - BKE_paint_brush_set(&sd->paint, brush); - } - } + /* Alt-Smooth. */ + if (ss->cache->alt_smooth) { + if (brush->sculpt_tool == SCULPT_TOOL_MASK) { + brush->mask_tool = ss->cache->saved_mask_brush_tool; } - - if (SCULPT_is_automasking_enabled(sd, ss, brush)) { - SCULPT_automasking_cache_free(ss->cache->automasking); - } - - BKE_pbvh_node_color_buffer_free(ss->pbvh); - SCULPT_cache_free(ss->cache); - ss->cache = NULL; - - SCULPT_undo_push_end(); - - if (brush->sculpt_tool == SCULPT_TOOL_PAINT || brush->sculpt_tool == SCULPT_TOOL_SMEAR) { - SCULPT_flush_update_done(C, ob, SCULPT_UPDATE_COORDS | SCULPT_UPDATE_COLOR); - } - else if (brush->sculpt_tool == SCULPT_TOOL_MASK) { - SCULPT_flush_update_done(C, ob, SCULPT_UPDATE_MASK); + else if (ELEM(brush->sculpt_tool, + SCULPT_TOOL_SLIDE_RELAX, + SCULPT_TOOL_DRAW_FACE_SETS, + SCULPT_TOOL_PAINT, + SCULPT_TOOL_SMEAR)) { + /* Do nothing. */ } else { - SCULPT_flush_update_done(C, ob, SCULPT_UPDATE_COORDS); + BKE_brush_size_set(scene, brush, ss->cache->saved_smooth_size); + brush = (Brush *)BKE_libblock_find_name(bmain, ID_BR, ss->cache->saved_active_brush_name); + if (brush) { + BKE_paint_brush_set(&sd->paint, brush); + } } - - WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob); } + if (SCULPT_is_automasking_enabled(sd, ss, brush)) { + SCULPT_automasking_cache_free(ss->cache->automasking); + } + + BKE_pbvh_node_color_buffer_free(ss->pbvh); + SCULPT_cache_free(ss->cache); + ss->cache = NULL; + + SCULPT_undo_push_end(); + + if (brush->sculpt_tool == SCULPT_TOOL_MASK) { + SCULPT_flush_update_done(C, ob, SCULPT_UPDATE_MASK); + } + else { + SCULPT_flush_update_done(C, ob, SCULPT_UPDATE_COORDS); + } + + WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob); sculpt_brush_exit_tex(sd); } @@ -8561,23 +8646,24 @@ static int sculpt_set_persistent_base_exec(bContext *C, wmOperator *UNUSED(op)) Object *ob = CTX_data_active_object(C); SculptSession *ss = ob->sculpt; - if (ss) { - SCULPT_vertex_random_access_ensure(ss); - BKE_sculpt_update_object_for_edit(depsgraph, ob, false, false, false); + if (!ss) { + return OPERATOR_FINISHED; + } + SCULPT_vertex_random_access_ensure(ss); + BKE_sculpt_update_object_for_edit(depsgraph, ob, false, false, false); - MEM_SAFE_FREE(ss->persistent_base); + MEM_SAFE_FREE(ss->persistent_base); - const int totvert = SCULPT_vertex_count_get(ss); - ss->persistent_base = MEM_mallocN(sizeof(SculptPersistentBase) * totvert, - "layer persistent base"); + const int totvert = SCULPT_vertex_count_get(ss); + ss->persistent_base = MEM_mallocN(sizeof(SculptPersistentBase) * totvert, + "layer persistent base"); - for (int i = 0; i < totvert; i++) { - SculptVertRef vertex = BKE_pbvh_table_index_to_vertex(ss->pbvh, i); + for (int i = 0; i < totvert; i++) { + SculptVertRef vertex = BKE_pbvh_table_index_to_vertex(ss->pbvh, i); - copy_v3_v3(ss->persistent_base[i].co, SCULPT_vertex_co_get(ss, vertex)); - SCULPT_vertex_normal_get(ss, vertex, ss->persistent_base[i].no); - ss->persistent_base[i].disp = 0.0f; - } + copy_v3_v3(ss->persistent_base[i].co, SCULPT_vertex_co_get(ss, vertex)); + SCULPT_vertex_normal_get(ss, vertex, ss->persistent_base[i].no); + ss->persistent_base[i].disp = 0.0f; } return OPERATOR_FINISHED; @@ -9058,12 +9144,17 @@ void SCULPT_geometry_preview_lines_update(bContext *C, SculptSession *ss, float totpoints++; ss->preview_vert_index_list[totpoints] = to_v; totpoints++; - if (!BLI_BITMAP_TEST(visited_vertices, to_v_i)) { - BLI_BITMAP_ENABLE(visited_vertices, to_v_i); - const float *co = SCULPT_vertex_co_for_grab_active_get(ss, to_v); - if (len_squared_v3v3(brush_co, co) < radius * radius) { - BLI_gsqueue_push(not_visited_vertices, &to_v); - } + + if (BLI_BITMAP_TEST(visited_vertices, to_v_i)) { + continue; + } + + BLI_BITMAP_ENABLE(visited_vertices, to_v_i); + + const float *co = SCULPT_vertex_co_for_grab_active_get(ss, to_v); + + if (len_squared_v3v3(brush_co, co) < radius * radius) { + BLI_gsqueue_push(not_visited_vertices, &to_v); } } } @@ -9629,11 +9720,12 @@ static void do_mask_by_color_contiguous_update_nodes_cb( const float current_mask = *vd.mask; const float new_mask = data->mask_by_color_floodfill[vd.index]; *vd.mask = sculpt_mask_by_color_final_mask_get(current_mask, new_mask, invert, preserve_mask); - if (current_mask != *vd.mask) { - update_node = true; - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (current_mask == *vd.mask) { + continue; + } + update_node = true; + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -9739,11 +9831,12 @@ static void do_mask_by_color_task_cb(void *__restrict userdata, const float new_mask = sculpt_mask_by_color_delta_get(active_color, vd.col, threshold, invert); *vd.mask = sculpt_mask_by_color_final_mask_get(current_mask, new_mask, invert, preserve_mask); - if (current_mask != *vd.mask) { - update_node = true; - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (current_mask == *vd.mask) { + continue; + } + update_node = true; + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -10148,7 +10241,7 @@ static int dyntopo_detail_size_edit_invoke(bContext *C, wmOperator *op, const wm copy_m4_m4(cd->gizmo_mat, cursor_trans); mul_m4_m4_post(cd->gizmo_mat, cursor_rot); - /* Initize the position of the triangle vertices. */ + /* Initialize the position of the triangle vertices. */ const float y_axis[3] = {0.0f, cd->radius, 0.0f}; for (int i = 0; i < 3; i++) { zero_v3(cd->preview_tri[i]); diff --git a/source/blender/editors/sculpt_paint/sculpt_automasking.c b/source/blender/editors/sculpt_paint/sculpt_automasking.c index e3bfdff90d1..408e0b42f46 100644 --- a/source/blender/editors/sculpt_paint/sculpt_automasking.c +++ b/source/blender/editors/sculpt_paint/sculpt_automasking.c @@ -338,26 +338,28 @@ float *SCULPT_boundary_automasking_init(Object *ob, for (int propagation_it = 0; propagation_it < propagation_steps; propagation_it++) { for (int i = 0; i < totvert; i++) { - SculptVertRef vertex = BKE_pbvh_table_index_to_vertex(ss->pbvh, i); + ScultVertRef vref = BKE_pbvh_table_index_to_vertex(ss->pbvh, i); - if (edge_distance[i] == EDGE_DISTANCE_INF) { - SculptVertexNeighborIter ni; - SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vertex, ni) { - if (edge_distance[ni.index] == propagation_it) { - edge_distance[i] = propagation_it + 1; - } - } - SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); + if (edge_distance[i] != EDGE_DISTANCE_INF) { + continue; } + SculptVertexNeighborIter ni; + SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vref, ni) { + if (edge_distance[ni.index] == propagation_it) { + edge_distance[i] = propagation_it + 1; + } + } + SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); } } for (int i = 0; i < totvert; i++) { - if (edge_distance[i] != EDGE_DISTANCE_INF) { - const float p = 1.0f - ((float)edge_distance[i] / (float)propagation_steps); - const float edge_boundary_automask = pow2f(p); - automask_factor[i] *= (1.0f - edge_boundary_automask); + if (edge_distance[i] == EDGE_DISTANCE_INF) { + continue; } + const float p = 1.0f - ((float)edge_distance[i] / (float)propagation_steps); + const float edge_boundary_automask = pow2f(p); + automask_factor[i] *= (1.0f - edge_boundary_automask); } MEM_SAFE_FREE(edge_distance); diff --git a/source/blender/editors/sculpt_paint/sculpt_boundary.c b/source/blender/editors/sculpt_paint/sculpt_boundary.c index b4eda68d003..069dcff4009 100644 --- a/source/blender/editors/sculpt_paint/sculpt_boundary.c +++ b/source/blender/editors/sculpt_paint/sculpt_boundary.c @@ -248,6 +248,7 @@ static bool boundary_floodfill_cb( { BoundaryFloodFillData *data = userdata; SculptBoundary *boundary = data->boundary; +<<<<<<< HEAD const int from_v_i = BKE_pbvh_vertex_index_to_table(ss->pbvh, from_v); if (SCULPT_vertex_is_boundary(ss, to_v)) { @@ -262,8 +263,21 @@ static bool boundary_floodfill_cb( sculpt_boundary_preview_edge_add(boundary, from_v, to_v); } return sculpt_boundary_is_vertex_in_editable_boundary(ss, to_v); +======= + if (!SCULPT_vertex_is_boundary(ss, to_v)) { + return false; } - return false; + const float edge_len = len_v3v3(SCULPT_vertex_co_get(ss, from_v), + SCULPT_vertex_co_get(ss, to_v)); + const float distance_boundary_to_dst = boundary->distance ? + boundary->distance[from_v] + edge_len : + 0.0f; + sculpt_boundary_index_add(boundary, to_v, distance_boundary_to_dst, data->included_vertices); + if (!is_duplicate) { + sculpt_boundary_preview_edge_add(boundary, from_v, to_v); +>>>>>>> master + } + return sculpt_boundary_is_vertex_in_editable_boundary(ss, to_v); } static void sculpt_boundary_indices_init(SculptSession *ss, @@ -394,6 +408,7 @@ static void sculpt_boundary_edit_data_init(SculptSession *ss, SculptVertexNeighborIter ni; SCULPT_VERTEX_DUPLICATES_AND_NEIGHBORS_ITER_BEGIN (ss, from_v, ni) { +<<<<<<< HEAD const int index = ni.index; const bool is_visible = SCULPT_vertex_visible_get(ss, ni.vertex); @@ -434,10 +449,47 @@ static void sculpt_boundary_edit_data_init(SculptSession *ss, boundary->edit_info[index].num_propagation_steps = boundary->edit_info[from_v_i].num_propagation_steps + 1; } - } - SCULPT_VERTEX_NEIGHBORS_ITER_END(ni_duplis); - } +======= + const bool is_visible = SCULPT_vertex_visible_get(ss, ni.index); + if (!is_visible || + boundary->edit_info[ni.index].num_propagation_steps != BOUNDARY_STEPS_NONE) { + continue; + } + boundary->edit_info[ni.index].original_vertex = + boundary->edit_info[from_v].original_vertex; + BLI_BITMAP_ENABLE(visited_vertices, ni.index); + + if (ni.is_duplicate) { + /* Grids duplicates handling. */ + boundary->edit_info[ni.index].num_propagation_steps = + boundary->edit_info[from_v].num_propagation_steps; + } + else { + boundary->edit_info[ni.index].num_propagation_steps = + boundary->edit_info[from_v].num_propagation_steps + 1; + + BLI_gsqueue_push(next_iteration, &ni.index); + + /* When copying the data to the neighbor for the next iteration, it has to be copied to + * all its duplicates too. This is because it is not possible to know if the updated + * neighbor or one if its uninitialized duplicates is going to come first in order to + * copy the data in the from_v neighbor iterator. */ + if (has_duplicates) { + SculptVertexNeighborIter ni_duplis; + SCULPT_VERTEX_DUPLICATES_AND_NEIGHBORS_ITER_BEGIN (ss, ni.index, ni_duplis) { + if (ni_duplis.is_duplicate) { + boundary->edit_info[ni_duplis.index].original_vertex = + boundary->edit_info[from_v].original_vertex; + boundary->edit_info[ni_duplis.index].num_propagation_steps = + boundary->edit_info[from_v].num_propagation_steps + 1; +>>>>>>> master + } + } + SCULPT_VERTEX_NEIGHBORS_ITER_END(ni_duplis); + } + +<<<<<<< HEAD /* Check the distance using the vertex that was propagated from the initial vertex that * was used to initialize the boundary. */ if (boundary->edit_info[from_v_i].original_vertex.i == initial_vertex.i) { @@ -446,6 +498,15 @@ static void sculpt_boundary_edit_data_init(SculptSession *ss, accum_distance += len_v3v3(SCULPT_vertex_co_get(ss, from_v), SCULPT_vertex_co_get(ss, ni.vertex)); } +======= + /* Check the distance using the vertex that was propagated from the initial vertex that + * was used to initialize the boundary. */ + if (boundary->edit_info[from_v].original_vertex == initial_vertex) { + boundary->pivot_vertex = ni.index; + copy_v3_v3(boundary->initial_pivot_position, SCULPT_vertex_co_get(ss, ni.index)); + accum_distance += len_v3v3(SCULPT_vertex_co_get(ss, from_v), + SCULPT_vertex_co_get(ss, ni.index)); +>>>>>>> master } } } @@ -596,6 +657,7 @@ static void sculpt_boundary_bend_data_init(SculptSession *ss, SculptBoundary *bo totvert, 3 * sizeof(float), "pivot positions"); for (int i = 0; i < totvert; i++) { +<<<<<<< HEAD if (boundary->edit_info[i].num_propagation_steps == boundary->max_propagation_steps) { float dir[3]; float normal[3]; @@ -611,16 +673,40 @@ static void sculpt_boundary_bend_data_init(SculptSession *ss, SculptBoundary *bo normalize_v3(boundary->bend.pivot_rotation_axis[boundary->edit_info[i].original_vertex_i]); copy_v3_v3(boundary->bend.pivot_positions[boundary->edit_info[i].original_vertex_i], SCULPT_vertex_co_get(ss, vertex)); +======= + if (boundary->edit_info[i].num_propagation_steps != boundary->max_propagation_steps) { + continue; +>>>>>>> master } + float dir[3]; + float normal[3]; + SCULPT_vertex_normal_get(ss, i, normal); + sub_v3_v3v3(dir, + SCULPT_vertex_co_get(ss, boundary->edit_info[i].original_vertex), + SCULPT_vertex_co_get(ss, i)); + cross_v3_v3v3( + boundary->bend.pivot_rotation_axis[boundary->edit_info[i].original_vertex], dir, normal); + normalize_v3(boundary->bend.pivot_rotation_axis[boundary->edit_info[i].original_vertex]); + copy_v3_v3(boundary->bend.pivot_positions[boundary->edit_info[i].original_vertex], + SCULPT_vertex_co_get(ss, i)); } for (int i = 0; i < totvert; i++) { +<<<<<<< HEAD if (boundary->edit_info[i].num_propagation_steps != BOUNDARY_STEPS_NONE) { copy_v3_v3(boundary->bend.pivot_positions[i], boundary->bend.pivot_positions[boundary->edit_info[i].original_vertex_i]); copy_v3_v3(boundary->bend.pivot_rotation_axis[i], boundary->bend.pivot_rotation_axis[boundary->edit_info[i].original_vertex_i]); +======= + if (boundary->edit_info[i].num_propagation_steps == BOUNDARY_STEPS_NONE) { + continue; +>>>>>>> master } + copy_v3_v3(boundary->bend.pivot_positions[i], + boundary->bend.pivot_positions[boundary->edit_info[i].original_vertex]); + copy_v3_v3(boundary->bend.pivot_rotation_axis[i], + boundary->bend.pivot_rotation_axis[boundary->edit_info[i].original_vertex]); } } @@ -630,6 +716,7 @@ static void sculpt_boundary_slide_data_init(SculptSession *ss, SculptBoundary *b boundary->slide.directions = MEM_calloc_arrayN(totvert, 3 * sizeof(float), "slide directions"); for (int i = 0; i < totvert; i++) { +<<<<<<< HEAD if (boundary->edit_info[i].num_propagation_steps == boundary->max_propagation_steps) { const int index = boundary->edit_info[i].original_vertex_i; @@ -637,15 +724,29 @@ static void sculpt_boundary_slide_data_init(SculptSession *ss, SculptBoundary *b SCULPT_vertex_co_get(ss, boundary->edit_info[i].original_vertex), SCULPT_vertex_co_get(ss, BKE_pbvh_table_index_to_vertex(ss->pbvh, i))); normalize_v3(boundary->slide.directions[index]); +======= + if (boundary->edit_info[i].num_propagation_steps != boundary->max_propagation_steps) { +>>>>>>> master } + sub_v3_v3v3(boundary->slide.directions[boundary->edit_info[i].original_vertex], + SCULPT_vertex_co_get(ss, boundary->edit_info[i].original_vertex), + SCULPT_vertex_co_get(ss, i)); + normalize_v3(boundary->slide.directions[boundary->edit_info[i].original_vertex]); } for (int i = 0; i < totvert; i++) { +<<<<<<< HEAD if (boundary->edit_info[i].num_propagation_steps != BOUNDARY_STEPS_NONE) { copy_v3_v3(boundary->slide.directions[i], boundary->slide.directions[BKE_pbvh_vertex_index_to_table( ss->pbvh, boundary->edit_info[i].original_vertex)]); +======= + if (boundary->edit_info[i].num_propagation_steps == BOUNDARY_STEPS_NONE) { + continue; +>>>>>>> master } + copy_v3_v3(boundary->slide.directions[i], + boundary->slide.directions[boundary->edit_info[i].original_vertex]); } } @@ -712,7 +813,11 @@ static void do_boundary_brush_bend_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { + if (boundary->edit_info[vd.index].num_propagation_steps == -1) { + continue; + } +<<<<<<< HEAD if (boundary->edit_info[vd.index].num_propagation_steps != -1) { SCULPT_orig_vert_data_update(&orig_data, &vd); if (SCULPT_check_vertex_pivot_symmetry( @@ -731,8 +836,25 @@ static void do_boundary_brush_bend_task_cb_ex(void *__restrict userdata, angle * boundary->edit_info[vd.index].strength_factor * mask * automask); add_v3_v3(target_co, boundary->bend.pivot_positions[vd.index]); } +======= + SCULPT_orig_vert_data_update(&orig_data, &vd); + if (!SCULPT_check_vertex_pivot_symmetry( + orig_data.co, boundary->initial_vertex_position, symm)) { + continue; +>>>>>>> master } + const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f; + const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index); + float t_orig_co[3]; + float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd); + sub_v3_v3v3(t_orig_co, orig_data.co, boundary->bend.pivot_positions[vd.index]); + rotate_v3_v3v3fl(target_co, + t_orig_co, + boundary->bend.pivot_rotation_axis[vd.index], + angle * boundary->edit_info[vd.index].strength_factor * mask * automask); + add_v3_v3(target_co, boundary->bend.pivot_positions[vd.index]); + if (vd.mvert) { vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } @@ -761,7 +883,11 @@ static void do_boundary_brush_slide_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { + if (boundary->edit_info[vd.index].num_propagation_steps == -1) { + continue; + } +<<<<<<< HEAD if (boundary->edit_info[vd.index].num_propagation_steps != -1) { SCULPT_orig_vert_data_update(&orig_data, &vd); if (SCULPT_check_vertex_pivot_symmetry( @@ -776,8 +902,23 @@ static void do_boundary_brush_slide_task_cb_ex(void *__restrict userdata, boundary->edit_info[vd.index].strength_factor * disp * mask * automask * strength); } +======= + SCULPT_orig_vert_data_update(&orig_data, &vd); + if (!SCULPT_check_vertex_pivot_symmetry( + orig_data.co, boundary->initial_vertex_position, symm)) { + continue; +>>>>>>> master } + const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f; + const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index); + float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd); + madd_v3_v3v3fl(target_co, + orig_data.co, + boundary->slide.directions[vd.index], + boundary->edit_info[vd.index].strength_factor * disp * mask * automask * + strength); + if (vd.mvert) { vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } @@ -806,25 +947,27 @@ static void do_boundary_brush_inflate_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - - if (boundary->edit_info[vd.index].num_propagation_steps != -1) { - SCULPT_orig_vert_data_update(&orig_data, &vd); - if (SCULPT_check_vertex_pivot_symmetry( - orig_data.co, boundary->initial_vertex_position, symm)) { - const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f; - const float automask = SCULPT_automasking_factor_get( - ss->cache->automasking, ss, vd.vertex); - float normal[3]; - normal_short_to_float_v3(normal, orig_data.no); - float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd); - madd_v3_v3v3fl(target_co, - orig_data.co, - normal, - boundary->edit_info[vd.index].strength_factor * disp * mask * automask * - strength); - } + if (boundary->edit_info[vd.index].num_propagation_steps == -1) { + continue; } + SCULPT_orig_vert_data_update(&orig_data, &vd); + if (!SCULPT_check_vertex_pivot_symmetry( + orig_data.co, boundary->initial_vertex_position, symm)) { + continue; + } + + const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f; + const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.vertex); + float normal[3]; + normal_short_to_float_v3(normal, orig_data.no); + float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd); + madd_v3_v3v3fl(target_co, + orig_data.co, + normal, + boundary->edit_info[vd.index].strength_factor * disp * mask * automask * + strength); + if (vd.mvert) { vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } @@ -851,7 +994,11 @@ static void do_boundary_brush_grab_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { + if (boundary->edit_info[vd.index].num_propagation_steps == -1) { + continue; + } +<<<<<<< HEAD if (boundary->edit_info[vd.index].num_propagation_steps != -1) { SCULPT_orig_vert_data_update(&orig_data, &vd); if (SCULPT_check_vertex_pivot_symmetry( @@ -865,8 +1012,22 @@ static void do_boundary_brush_grab_task_cb_ex(void *__restrict userdata, ss->cache->grab_delta_symmetry, boundary->edit_info[vd.index].strength_factor * mask * automask * strength); } +======= + SCULPT_orig_vert_data_update(&orig_data, &vd); + if (!SCULPT_check_vertex_pivot_symmetry( + orig_data.co, boundary->initial_vertex_position, symm)) { + continue; +>>>>>>> master } + const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f; + const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index); + float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd); + madd_v3_v3v3fl(target_co, + orig_data.co, + ss->cache->grab_delta_symmetry, + boundary->edit_info[vd.index].strength_factor * mask * automask * strength); + if (vd.mvert) { vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } @@ -901,7 +1062,11 @@ static void do_boundary_brush_twist_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { + if (boundary->edit_info[vd.index].num_propagation_steps == -1) { + continue; + } +<<<<<<< HEAD if (boundary->edit_info[vd.index].num_propagation_steps != -1) { SCULPT_orig_vert_data_update(&orig_data, &vd); if (SCULPT_check_vertex_pivot_symmetry( @@ -918,8 +1083,25 @@ static void do_boundary_brush_twist_task_cb_ex(void *__restrict userdata, angle * mask * automask * boundary->edit_info[vd.index].strength_factor); add_v3_v3(target_co, boundary->twist.pivot_position); } +======= + SCULPT_orig_vert_data_update(&orig_data, &vd); + if (!SCULPT_check_vertex_pivot_symmetry( + orig_data.co, boundary->initial_vertex_position, symm)) { + continue; +>>>>>>> master } + const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f; + const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index); + float t_orig_co[3]; + float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd); + sub_v3_v3v3(t_orig_co, orig_data.co, boundary->twist.pivot_position); + rotate_v3_v3v3fl(target_co, + t_orig_co, + boundary->twist.rotation_axis, + angle * mask * automask * boundary->edit_info[vd.index].strength_factor); + add_v3_v3(target_co, boundary->twist.pivot_position); + if (vd.mvert) { vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } diff --git a/source/blender/editors/sculpt_paint/sculpt_cloth.c b/source/blender/editors/sculpt_paint/sculpt_cloth.c index e18f88a7294..5760e4e9e10 100644 --- a/source/blender/editors/sculpt_paint/sculpt_cloth.c +++ b/source/blender/editors/sculpt_paint/sculpt_cloth.c @@ -545,97 +545,98 @@ static void do_cloth_brush_apply_forces_task_cb_ex(void *__restrict userdata, cloth_brush_apply_force_to_vertex(ss, ss->cache->cloth_sim, vertex_gravity, vd.index); /* When using the plane falloff mode the falloff is not constrained by the brush radius. */ - if (sculpt_brush_test_sq_fn(&test, current_vertex_location) || use_falloff_plane) { - - float dist = sqrtf(test.dist); - - if (use_falloff_plane) { - dist = dist_to_plane_v3(current_vertex_location, deform_plane); - } - - const float fade = sim_factor * bstrength * - SCULPT_brush_strength_factor(ss, - brush, - current_vertex_location, - dist, - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); - - float brush_disp[3]; - float normal[3]; - if (vd.no) { - normal_short_to_float_v3(normal, vd.no); - } - else { - copy_v3_v3(normal, vd.fno); - } - - switch (brush->cloth_deform_type) { - case BRUSH_CLOTH_DEFORM_DRAG: - sub_v3_v3v3(brush_disp, ss->cache->location, ss->cache->last_location); - normalize_v3(brush_disp); - mul_v3_v3fl(force, brush_disp, fade); - break; - case BRUSH_CLOTH_DEFORM_PUSH: - /* Invert the fade to push inwards. */ - mul_v3_v3fl(force, offset, -fade); - break; - case BRUSH_CLOTH_DEFORM_GRAB: - madd_v3_v3v3fl(cloth_sim->deformation_pos[vd.index], - cloth_sim->init_pos[vd.index], - ss->cache->grab_delta_symmetry, - fade); - if (use_falloff_plane) { - cloth_sim->deformation_strength[vd.index] = clamp_f(fade, 0.0f, 1.0f); - } - else { - cloth_sim->deformation_strength[vd.index] = 1.0f; - } - zero_v3(force); - break; - case BRUSH_CLOTH_DEFORM_SNAKE_HOOK: - copy_v3_v3(cloth_sim->deformation_pos[vd.index], cloth_sim->pos[vd.index]); - madd_v3_v3fl(cloth_sim->deformation_pos[vd.index], ss->cache->grab_delta_symmetry, fade); - cloth_sim->deformation_strength[vd.index] = fade; - zero_v3(force); - break; - case BRUSH_CLOTH_DEFORM_PINCH_POINT: - if (use_falloff_plane) { - float distance = dist_signed_to_plane_v3(vd.co, deform_plane); - copy_v3_v3(brush_disp, plane_normal); - mul_v3_fl(brush_disp, -distance); - } - else { - sub_v3_v3v3(brush_disp, ss->cache->location, vd.co); - } - normalize_v3(brush_disp); - mul_v3_v3fl(force, brush_disp, fade); - break; - case BRUSH_CLOTH_DEFORM_PINCH_PERPENDICULAR: { - float disp_center[3]; - float x_disp[3]; - float z_disp[3]; - sub_v3_v3v3(disp_center, ss->cache->location, vd.co); - normalize_v3(disp_center); - mul_v3_v3fl(x_disp, x_object_space, dot_v3v3(disp_center, x_object_space)); - mul_v3_v3fl(z_disp, z_object_space, dot_v3v3(disp_center, z_object_space)); - add_v3_v3v3(disp_center, x_disp, z_disp); - mul_v3_v3fl(force, disp_center, fade); - } break; - case BRUSH_CLOTH_DEFORM_INFLATE: - mul_v3_v3fl(force, normal, fade); - break; - case BRUSH_CLOTH_DEFORM_EXPAND: - cloth_sim->length_constraint_tweak[vd.index] += fade * 0.1f; - zero_v3(force); - break; - } - - cloth_brush_apply_force_to_vertex(ss, ss->cache->cloth_sim, force, vd.index); + if (!sculpt_brush_test_sq_fn(&test, current_vertex_location) && !use_falloff_plane) { + continue; } + + float dist = sqrtf(test.dist); + + if (use_falloff_plane) { + dist = dist_to_plane_v3(current_vertex_location, deform_plane); + } + + const float fade = sim_factor * bstrength * + SCULPT_brush_strength_factor(ss, + brush, + current_vertex_location, + dist, + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); + + float brush_disp[3]; + float normal[3]; + if (vd.no) { + normal_short_to_float_v3(normal, vd.no); + } + else { + copy_v3_v3(normal, vd.fno); + } + + switch (brush->cloth_deform_type) { + case BRUSH_CLOTH_DEFORM_DRAG: + sub_v3_v3v3(brush_disp, ss->cache->location, ss->cache->last_location); + normalize_v3(brush_disp); + mul_v3_v3fl(force, brush_disp, fade); + break; + case BRUSH_CLOTH_DEFORM_PUSH: + /* Invert the fade to push inwards. */ + mul_v3_v3fl(force, offset, -fade); + break; + case BRUSH_CLOTH_DEFORM_GRAB: + madd_v3_v3v3fl(cloth_sim->deformation_pos[vd.index], + cloth_sim->init_pos[vd.index], + ss->cache->grab_delta_symmetry, + fade); + if (use_falloff_plane) { + cloth_sim->deformation_strength[vd.index] = clamp_f(fade, 0.0f, 1.0f); + } + else { + cloth_sim->deformation_strength[vd.index] = 1.0f; + } + zero_v3(force); + break; + case BRUSH_CLOTH_DEFORM_SNAKE_HOOK: + copy_v3_v3(cloth_sim->deformation_pos[vd.index], cloth_sim->pos[vd.index]); + madd_v3_v3fl(cloth_sim->deformation_pos[vd.index], ss->cache->grab_delta_symmetry, fade); + cloth_sim->deformation_strength[vd.index] = fade; + zero_v3(force); + break; + case BRUSH_CLOTH_DEFORM_PINCH_POINT: + if (use_falloff_plane) { + float distance = dist_signed_to_plane_v3(vd.co, deform_plane); + copy_v3_v3(brush_disp, plane_normal); + mul_v3_fl(brush_disp, -distance); + } + else { + sub_v3_v3v3(brush_disp, ss->cache->location, vd.co); + } + normalize_v3(brush_disp); + mul_v3_v3fl(force, brush_disp, fade); + break; + case BRUSH_CLOTH_DEFORM_PINCH_PERPENDICULAR: { + float disp_center[3]; + float x_disp[3]; + float z_disp[3]; + sub_v3_v3v3(disp_center, ss->cache->location, vd.co); + normalize_v3(disp_center); + mul_v3_v3fl(x_disp, x_object_space, dot_v3v3(disp_center, x_object_space)); + mul_v3_v3fl(z_disp, z_object_space, dot_v3v3(disp_center, z_object_space)); + add_v3_v3v3(disp_center, x_disp, z_disp); + mul_v3_v3fl(force, disp_center, fade); + } break; + case BRUSH_CLOTH_DEFORM_INFLATE: + mul_v3_v3fl(force, normal, fade); + break; + case BRUSH_CLOTH_DEFORM_EXPAND: + cloth_sim->length_constraint_tweak[vd.index] += fade * 0.1f; + zero_v3(force); + break; + } + + cloth_brush_apply_force_to_vertex(ss, ss->cache->cloth_sim, force, vd.index); } BKE_pbvh_vertex_iter_end; } @@ -649,17 +650,22 @@ static ListBase *cloth_brush_collider_cache_create(Depsgraph *depsgraph) DEG_ITER_OBJECT_FLAG_DUPLI) { CollisionModifierData *cmd = (CollisionModifierData *)BKE_modifiers_findby_type( ob, eModifierType_Collision); - if (cmd && cmd->bvhtree) { - if (cache == NULL) { - cache = MEM_callocN(sizeof(ListBase), "ColliderCache array"); - } - - ColliderCache *col = MEM_callocN(sizeof(ColliderCache), "ColliderCache"); - col->ob = ob; - col->collmd = cmd; - collision_move_object(cmd, 1.0, 0.0, true); - BLI_addtail(cache, col); + if (!cmd) { + continue; } + + if (!cmd->bvhtree) { + continue; + } + if (cache == NULL) { + cache = MEM_callocN(sizeof(ListBase), "ColliderCache array"); + } + + ColliderCache *col = MEM_callocN(sizeof(ColliderCache), "ColliderCache"); + col->ob = ob; + col->collmd = cmd; + collision_move_object(cmd, 1.0, 0.0, true); + BLI_addtail(cache, col); } DEG_OBJECT_ITER_END; return cache; @@ -739,26 +745,27 @@ static void cloth_brush_solve_collision(Object *object, &col, raycast_flag); - if (hit.index != -1) { - - float collision_disp[3]; - float movement_disp[3]; - mul_v3_v3fl(collision_disp, hit.no, 0.005f); - sub_v3_v3v3(movement_disp, pos_world_space, prev_pos_world_space); - float friction_plane[4]; - float pos_on_friction_plane[3]; - plane_from_point_normal_v3(friction_plane, hit.co, hit.no); - closest_to_plane_v3(pos_on_friction_plane, friction_plane, pos_world_space); - sub_v3_v3v3(movement_disp, pos_on_friction_plane, hit.co); - - /* TODO(pablodp606): This can be exposed in a brush/filter property as friction. */ - mul_v3_fl(movement_disp, 0.35f); - - copy_v3_v3(cloth_sim->pos[i], hit.co); - add_v3_v3(cloth_sim->pos[i], movement_disp); - add_v3_v3(cloth_sim->pos[i], collision_disp); - mul_v3_m4v3(cloth_sim->pos[i], obmat_inv, cloth_sim->pos[i]); + if (hit.index == -1) { + continue; } + + float collision_disp[3]; + float movement_disp[3]; + mul_v3_v3fl(collision_disp, hit.no, 0.005f); + sub_v3_v3v3(movement_disp, pos_world_space, prev_pos_world_space); + float friction_plane[4]; + float pos_on_friction_plane[3]; + plane_from_point_normal_v3(friction_plane, hit.co, hit.no); + closest_to_plane_v3(pos_on_friction_plane, friction_plane, pos_world_space); + sub_v3_v3v3(movement_disp, pos_on_friction_plane, hit.co); + + /* TODO(pablodp606): This can be exposed in a brush/filter property as friction. */ + mul_v3_fl(movement_disp, 0.35f); + + copy_v3_v3(cloth_sim->pos[i], hit.co); + add_v3_v3(cloth_sim->pos[i], movement_disp); + add_v3_v3(cloth_sim->pos[i], collision_disp); + mul_v3_m4v3(cloth_sim->pos[i], obmat_inv, cloth_sim->pos[i]); } } @@ -789,38 +796,40 @@ static void do_cloth_brush_solve_simulation_task_cb_ex( ss->cache ? cloth_brush_simulation_falloff_get( brush, ss->cache->radius, sim_location, cloth_sim->init_pos[vd.index]) : 1.0f; - if (sim_factor > 0.0f) { - int i = vd.index; - float temp[3]; - copy_v3_v3(temp, cloth_sim->pos[i]); + if (sim_factor <= 0.0f) { + continue; + } - mul_v3_fl(cloth_sim->acceleration[i], time_step); + int i = vd.index; + float temp[3]; + copy_v3_v3(temp, cloth_sim->pos[i]); - float pos_diff[3]; - sub_v3_v3v3(pos_diff, cloth_sim->pos[i], cloth_sim->prev_pos[i]); - mul_v3_fl(pos_diff, (1.0f - cloth_sim->damping) * sim_factor); + mul_v3_fl(cloth_sim->acceleration[i], time_step); - const float mask_v = (1.0f - (vd.mask ? *vd.mask : 0.0f)) * - SCULPT_automasking_factor_get(automasking, ss, vd.vertex); + float pos_diff[3]; + sub_v3_v3v3(pos_diff, cloth_sim->pos[i], cloth_sim->prev_pos[i]); + mul_v3_fl(pos_diff, (1.0f - cloth_sim->damping) * sim_factor); - madd_v3_v3fl(cloth_sim->pos[i], pos_diff, mask_v); - madd_v3_v3fl(cloth_sim->pos[i], cloth_sim->acceleration[i], mask_v); + const float mask_v = (1.0f - (vd.mask ? *vd.mask : 0.0f)) * + SCULPT_automasking_factor_get(automasking, ss, vd.vertex); - if (cloth_sim->collider_list != NULL) { - cloth_brush_solve_collision(data->ob, cloth_sim, i); - } + madd_v3_v3fl(cloth_sim->pos[i], pos_diff, mask_v); + madd_v3_v3fl(cloth_sim->pos[i], cloth_sim->acceleration[i], mask_v); - copy_v3_v3(cloth_sim->last_iteration_pos[i], cloth_sim->pos[i]); + if (cloth_sim->collider_list != NULL) { + cloth_brush_solve_collision(data->ob, cloth_sim, i); + } - copy_v3_v3(cloth_sim->prev_pos[i], temp); - copy_v3_v3(cloth_sim->last_iteration_pos[i], cloth_sim->pos[i]); - copy_v3_fl(cloth_sim->acceleration[i], 0.0f); + copy_v3_v3(cloth_sim->last_iteration_pos[i], cloth_sim->pos[i]); - copy_v3_v3(vd.co, cloth_sim->pos[vd.index]); + copy_v3_v3(cloth_sim->prev_pos[i], temp); + copy_v3_v3(cloth_sim->last_iteration_pos[i], cloth_sim->pos[i]); + copy_v3_fl(cloth_sim->acceleration[i], 0.0f); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + copy_v3_v3(vd.co, cloth_sim->pos[vd.index]); + + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; diff --git a/source/blender/editors/sculpt_paint/sculpt_detail.c b/source/blender/editors/sculpt_paint/sculpt_detail.c index 0ee8114aba2..27414a92401 100644 --- a/source/blender/editors/sculpt_paint/sculpt_detail.c +++ b/source/blender/editors/sculpt_paint/sculpt_detail.c @@ -24,46 +24,29 @@ #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" -#include "BLI_hash.h" #include "BLI_math.h" -#include "BLI_task.h" #include "BLT_translation.h" #include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" -#include "BKE_brush.h" #include "BKE_context.h" -#include "BKE_mesh.h" -#include "BKE_mesh_mapping.h" -#include "BKE_object.h" #include "BKE_paint.h" #include "BKE_pbvh.h" -#include "BKE_scene.h" #include "BKE_screen.h" #include "DEG_depsgraph.h" #include "WM_api.h" -#include "WM_message.h" -#include "WM_toolsystem.h" #include "WM_types.h" -#include "ED_object.h" #include "ED_screen.h" -#include "ED_sculpt.h" #include "ED_view3d.h" -#include "paint_intern.h" #include "sculpt_intern.h" #include "RNA_access.h" #include "RNA_define.h" -#include "UI_interface.h" - -#include "bmesh.h" - #include #include diff --git a/source/blender/editors/sculpt_paint/sculpt_face_set.c b/source/blender/editors/sculpt_paint/sculpt_face_set.c index 6e44f9a53ab..7356b0ba071 100644 --- a/source/blender/editors/sculpt_paint/sculpt_face_set.c +++ b/source/blender/editors/sculpt_paint/sculpt_face_set.c @@ -150,20 +150,21 @@ static void do_draw_face_sets_brush_task_cb_ex(void *__restrict userdata, float poly_center[3]; BKE_mesh_calc_poly_center(p, &ss->mloop[p->loopstart], mvert, poly_center); - if (sculpt_brush_test_sq_fn(&test, poly_center)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, poly_center)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); - if (fade > 0.05f && ss->face_sets[vert_map->indices[j]] > 0) { - ss->face_sets[vert_map->indices[j]] = abs(ss->cache->paint_face_set); - } + if (fade > 0.05f && ss->face_sets[vert_map->indices[j]] > 0) { + ss->face_sets[vert_map->indices[j]] = abs(ss->cache->paint_face_set); } } } @@ -197,20 +198,21 @@ static void do_draw_face_sets_brush_task_cb_ex(void *__restrict userdata, } else if (BKE_pbvh_type(ss->pbvh) == PBVH_GRIDS) { { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); - if (fade > 0.05f) { - SCULPT_vertex_face_set_set(ss, vd.vertex, ss->cache->paint_face_set); - } + if (fade > 0.05f) { + SCULPT_vertex_face_set_set(ss, vd.vertex, ss->cache->paint_face_set); } } } @@ -243,23 +245,26 @@ static void do_relax_face_sets_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - if (relax_face_sets != SCULPT_vertex_has_unique_face_set(ss, vd.vertex)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + if (relax_face_sets == SCULPT_vertex_has_unique_face_set(ss, vd.vertex)) { + continue; + } - SCULPT_relax_vertex(ss, &vd, fade * bstrength, relax_face_sets, vd.co); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } - } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); + + SCULPT_relax_vertex(ss, &vd, fade * bstrength, relax_face_sets, vd.co); + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -622,44 +627,49 @@ static void sculpt_face_sets_init_flood_fill(Object *ob, int next_face_set = 1; for (int i = 0; i < totfaces; i++) { - if (!BLI_BITMAP_TEST(visited_faces, i)) { - GSQueue *queue; - queue = BLI_gsqueue_new(sizeof(int)); + if (BLI_BITMAP_TEST(visited_faces, i)) { + continue; + } + GSQueue *queue; + queue = BLI_gsqueue_new(sizeof(int)); - face_sets[i] = next_face_set; - BLI_BITMAP_ENABLE(visited_faces, i); - BLI_gsqueue_push(queue, &i); + face_sets[i] = next_face_set; + BLI_BITMAP_ENABLE(visited_faces, i); + BLI_gsqueue_push(queue, &i); - while (!BLI_gsqueue_is_empty(queue)) { - int from_f; - BLI_gsqueue_pop(queue, &from_f); + while (!BLI_gsqueue_is_empty(queue)) { + int from_f; + BLI_gsqueue_pop(queue, &from_f); - BMFace *f, *f_neighbor; - BMEdge *ed; - BMIter iter_a, iter_b; + BMFace *f, *f_neighbor; + BMEdge *ed; + BMIter iter_a, iter_b; - f = BM_face_at_index(bm, from_f); + f = BM_face_at_index(bm, from_f); - BM_ITER_ELEM (ed, &iter_a, f, BM_EDGES_OF_FACE) { - BM_ITER_ELEM (f_neighbor, &iter_b, ed, BM_FACES_OF_EDGE) { - if (f_neighbor != f) { - int neighbor_face_index = BM_elem_index_get(f_neighbor); - if (!BLI_BITMAP_TEST(visited_faces, neighbor_face_index)) { - if (test(bm, f, ed, f_neighbor, threshold)) { - face_sets[neighbor_face_index] = next_face_set; - BLI_BITMAP_ENABLE(visited_faces, neighbor_face_index); - BLI_gsqueue_push(queue, &neighbor_face_index); - } - } - } + BM_ITER_ELEM (ed, &iter_a, f, BM_EDGES_OF_FACE) { + BM_ITER_ELEM (f_neighbor, &iter_b, ed, BM_FACES_OF_EDGE) { + if (f_neighbor == f) { + continue; } + int neighbor_face_index = BM_elem_index_get(f_neighbor); + if (BLI_BITMAP_TEST(visited_faces, neighbor_face_index)) { + continue; + } + if (!test(bm, f, ed, f_neighbor, threshold)) { + continue; + } + + face_sets[neighbor_face_index] = next_face_set; + BLI_BITMAP_ENABLE(visited_faces, neighbor_face_index); + BLI_gsqueue_push(queue, &neighbor_face_index); } } - - next_face_set += 1; - - BLI_gsqueue_free(queue); } + + next_face_set += 1; + + BLI_gsqueue_free(queue); } MEM_SAFE_FREE(visited_faces); diff --git a/source/blender/editors/sculpt_paint/sculpt_filter_color.c b/source/blender/editors/sculpt_paint/sculpt_filter_color.c index 38d2904e98a..6f1fcfd8ea5 100644 --- a/source/blender/editors/sculpt_paint/sculpt_filter_color.c +++ b/source/blender/editors/sculpt_paint/sculpt_filter_color.c @@ -86,7 +86,7 @@ static EnumPropertyItem prop_color_filter_types[] = { {COLOR_FILTER_SATURATION, "SATURATION", 0, "Saturation", "Change saturation"}, {COLOR_FILTER_VALUE, "VALUE", 0, "Value", "Change value"}, - {COLOR_FILTER_BRIGHTNESS, "BRIGTHNESS", 0, "Brightness", "Change brightness"}, + {COLOR_FILTER_BRIGHTNESS, "BRIGHTNESS", 0, "Brightness", "Change brightness"}, {COLOR_FILTER_CONTRAST, "CONTRAST", 0, "Contrast", "Change contrast"}, {COLOR_FILTER_SMOOTH, "SMOOTH", 0, "Smooth", "Smooth colors"}, diff --git a/source/blender/editors/sculpt_paint/sculpt_multiplane_scrape.c b/source/blender/editors/sculpt_paint/sculpt_multiplane_scrape.c index b217223c57c..a3216c856bc 100644 --- a/source/blender/editors/sculpt_paint/sculpt_multiplane_scrape.c +++ b/source/blender/editors/sculpt_paint/sculpt_multiplane_scrape.c @@ -87,39 +87,39 @@ static void calc_multiplane_scrape_surface_task_cb(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + float local_co[3]; + float normal[3]; + if (vd.no) { + normal_short_to_float_v3(normal, vd.no); + } + else { + copy_v3_v3(normal, vd.fno); + } + mul_v3_m4v3(local_co, mat, vd.co); + /* Use the brush falloff to weight the sampled normals. */ + const float fade = SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - float local_co[3]; - float normal[3]; - if (vd.no) { - normal_short_to_float_v3(normal, vd.no); - } - else { - copy_v3_v3(normal, vd.fno); - } - mul_v3_m4v3(local_co, mat, vd.co); - /* Use the brush falloff to weight the sampled normals. */ - const float fade = SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); - - /* Sample the normal and area of the +X and -X axis individually. */ - if (local_co[0] > 0.0f) { - madd_v3_v3fl(mssd->area_nos[0], normal, fade); - add_v3_v3(mssd->area_cos[0], vd.co); - mssd->area_count[0]++; - } - else { - madd_v3_v3fl(mssd->area_nos[1], normal, fade); - add_v3_v3(mssd->area_cos[1], vd.co); - mssd->area_count[1]++; - } + /* Sample the normal and area of the +X and -X axis individually. */ + if (local_co[0] > 0.0f) { + madd_v3_v3fl(mssd->area_nos[0], normal, fade); + add_v3_v3(mssd->area_cos[0], vd.co); + mssd->area_count[0]++; + } + else { + madd_v3_v3fl(mssd->area_nos[1], normal, fade); + add_v3_v3(mssd->area_cos[1], vd.co); + mssd->area_count[1]++; } BKE_pbvh_vertex_iter_end; } @@ -167,57 +167,61 @@ static void do_multiplane_scrape_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - float local_co[3]; - bool deform = false; + float local_co[3]; + bool deform = false; - mul_v3_m4v3(local_co, mat, vd.co); + mul_v3_m4v3(local_co, mat, vd.co); - if (local_co[0] > 0.0f) { - deform = !SCULPT_plane_point_side(vd.co, scrape_planes[0]); - } - else { - deform = !SCULPT_plane_point_side(vd.co, scrape_planes[1]); - } + if (local_co[0] > 0.0f) { + deform = !SCULPT_plane_point_side(vd.co, scrape_planes[0]); + } + else { + deform = !SCULPT_plane_point_side(vd.co, scrape_planes[1]); + } - if (angle < 0.0f) { - deform = true; - } + if (angle < 0.0f) { + deform = true; + } - if (deform) { - float intr[3]; - float val[3]; + if (!deform) { + continue; + } - if (local_co[0] > 0.0f) { - closest_to_plane_normalized_v3(intr, scrape_planes[0], vd.co); - } - else { - closest_to_plane_normalized_v3(intr, scrape_planes[1], vd.co); - } + float intr[3]; + float val[3]; - sub_v3_v3v3(val, intr, vd.co); - if (SCULPT_plane_trim(ss->cache, brush, val)) { - /* Deform the local space along the Y axis to avoid artifacts on curved strokes. */ - /* This produces a not round brush tip. */ - local_co[1] *= 2.0f; - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - len_v3(local_co), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); + if (local_co[0] > 0.0f) { + closest_to_plane_normalized_v3(intr, scrape_planes[0], vd.co); + } + else { + closest_to_plane_normalized_v3(intr, scrape_planes[1], vd.co); + } - mul_v3_v3fl(proxy[vd.i], val, fade); + sub_v3_v3v3(val, intr, vd.co); + if (!SCULPT_plane_trim(ss->cache, brush, val)) { + continue; + } + /* Deform the local space along the Y axis to avoid artifacts on curved strokes. */ + /* This produces a not round brush tip. */ + local_co[1] *= 2.0f; + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + len_v3(local_co), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } - } - } + mul_v3_v3fl(proxy[vd.i], val, fade); + + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; diff --git a/source/blender/editors/sculpt_paint/sculpt_paint_color.c b/source/blender/editors/sculpt_paint/sculpt_paint_color.c index bb8acd92b11..1780d5db8fc 100644 --- a/source/blender/editors/sculpt_paint/sculpt_paint_color.c +++ b/source/blender/editors/sculpt_paint/sculpt_paint_color.c @@ -87,24 +87,25 @@ static void do_color_smooth_task_cb_exec(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); - float smooth_color[4]; - SCULPT_neighbor_color_average(ss, smooth_color, vd.vertex); - blend_color_interpolate_float(vd.col, vd.col, smooth_color, fade); + float smooth_color[4]; + SCULPT_neighbor_color_average(ss, smooth_color, vd.vertex); + blend_color_interpolate_float(vd.col, vd.col, smooth_color, fade); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -154,46 +155,49 @@ static void do_paint_brush_task_cb_ex(void *__restrict userdata, distance_to_stroke_location = sqrtf(test.dist); } - if (affect_vertex) { - float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - distance_to_stroke_location, - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); - - /* Density. */ - float noise = 1.0f; - const float density = ss->cache->paint_brush.density; - if (density < 1.0f) { - const float hash_noise = BLI_hash_int_01(ss->cache->density_seed * 1000 * vd.index); - if (hash_noise > density) { - noise = density * hash_noise; - fade = fade * noise; - } - } - - /* Brush paint color, brush test falloff and flow. */ - float paint_color[4]; - float wet_mix_color[4]; - float buffer_color[4]; - - mul_v4_v4fl(paint_color, brush_color, fade * ss->cache->paint_brush.flow); - mul_v4_v4fl(wet_mix_color, data->wet_mix_sampled_color, fade * ss->cache->paint_brush.flow); - - /* Interpolate with the wet_mix color for wet paint mixing. */ - blend_color_interpolate_float( - paint_color, paint_color, wet_mix_color, ss->cache->paint_brush.wet_mix); - blend_color_mix_float(color_buffer->color[vd.i], color_buffer->color[vd.i], paint_color); - - /* Final mix over the original color using brush alpha. */ - mul_v4_v4fl(buffer_color, color_buffer->color[vd.i], brush->alpha); - - IMB_blend_color_float(vd.col, orig_data.col, buffer_color, brush->blend); + if (!affect_vertex) { + continue; } + + float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + distance_to_stroke_location, + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); + + /* Density. */ + float noise = 1.0f; + const float density = ss->cache->paint_brush.density; + if (density < 1.0f) { + const float hash_noise = BLI_hash_int_01(ss->cache->density_seed * 1000 * vd.index); + if (hash_noise > density) { + noise = density * hash_noise; + fade = fade * noise; + } + } + + /* Brush paint color, brush test falloff and flow. */ + float paint_color[4]; + float wet_mix_color[4]; + float buffer_color[4]; + + mul_v4_v4fl(paint_color, brush_color, fade * ss->cache->paint_brush.flow); + mul_v4_v4fl(wet_mix_color, data->wet_mix_sampled_color, fade * ss->cache->paint_brush.flow); + + /* Interpolate with the wet_mix color for wet paint mixing. */ + blend_color_interpolate_float( + paint_color, paint_color, wet_mix_color, ss->cache->paint_brush.wet_mix); + blend_color_mix_float(color_buffer->color[vd.i], color_buffer->color[vd.i], paint_color); + + /* Final mix over the original color using brush alpha. */ + mul_v4_v4fl(buffer_color, color_buffer->color[vd.i], brush->alpha); + + IMB_blend_color_float(vd.col, orig_data.col, buffer_color, brush->blend); + CLAMP4(vd.col, 0.0f, 1.0f); if (vd.mvert) { @@ -226,10 +230,12 @@ static void do_sample_wet_paint_task_cb(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - add_v4_v4(swptd->color, vd.col); - swptd->tot_samples++; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; } + + add_v4_v4(swptd->color, vd.col); + swptd->tot_samples++; } BKE_pbvh_vertex_iter_end; } @@ -385,59 +391,61 @@ static void do_smear_brush_task_cb_exec(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); - float current_disp[3]; - float current_disp_norm[3]; - float interp_color[4]; - copy_v4_v4(interp_color, ss->cache->prev_colors[vd.index]); + float current_disp[3]; + float current_disp_norm[3]; + float interp_color[4]; + copy_v4_v4(interp_color, ss->cache->prev_colors[vd.index]); - switch (brush->smear_deform_type) { - case BRUSH_SMEAR_DEFORM_DRAG: - sub_v3_v3v3(current_disp, ss->cache->location, ss->cache->last_location); - break; - case BRUSH_SMEAR_DEFORM_PINCH: - sub_v3_v3v3(current_disp, ss->cache->location, vd.co); - break; - case BRUSH_SMEAR_DEFORM_EXPAND: - sub_v3_v3v3(current_disp, vd.co, ss->cache->location); - break; + switch (brush->smear_deform_type) { + case BRUSH_SMEAR_DEFORM_DRAG: + sub_v3_v3v3(current_disp, ss->cache->location, ss->cache->last_location); + break; + case BRUSH_SMEAR_DEFORM_PINCH: + sub_v3_v3v3(current_disp, ss->cache->location, vd.co); + break; + case BRUSH_SMEAR_DEFORM_EXPAND: + sub_v3_v3v3(current_disp, vd.co, ss->cache->location); + break; + } + normalize_v3_v3(current_disp_norm, current_disp); + mul_v3_v3fl(current_disp, current_disp_norm, ss->cache->bstrength); + + SculptVertexNeighborIter ni; + SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vd.vertex, ni) { + float vertex_disp[3]; + float vertex_disp_norm[3]; + sub_v3_v3v3(vertex_disp, SCULPT_vertex_co_get(ss, ni.vertex), vd.co); + const float *neighbor_color = ss->cache->prev_colors[ni.index]; + normalize_v3_v3(vertex_disp_norm, vertex_disp); + if (dot_v3v3(current_disp_norm, vertex_disp_norm) >= 0.0f) { + continue; } - normalize_v3_v3(current_disp_norm, current_disp); - mul_v3_v3fl(current_disp, current_disp_norm, ss->cache->bstrength); + const float color_interp = clamp_f( + -dot_v3v3(current_disp_norm, vertex_disp_norm), 0.0f, 1.0f); + float color_mix[4]; + copy_v4_v4(color_mix, neighbor_color); + mul_v4_fl(color_mix, color_interp * fade); + blend_color_mix_float(interp_color, interp_color, color_mix); + } + SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); - SculptVertexNeighborIter ni; - SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vd.vertex, ni) { - float vertex_disp[3]; - float vertex_disp_norm[3]; - sub_v3_v3v3(vertex_disp, SCULPT_vertex_co_get(ss, ni.vertex), vd.co); - const float *neighbor_color = ss->cache->prev_colors[ni.index]; - normalize_v3_v3(vertex_disp_norm, vertex_disp); - if (dot_v3v3(current_disp_norm, vertex_disp_norm) < 0.0f) { - const float color_interp = clamp_f( - -dot_v3v3(current_disp_norm, vertex_disp_norm), 0.0f, 1.0f); - float color_mix[4]; - copy_v4_v4(color_mix, neighbor_color); - mul_v4_fl(color_mix, color_interp * fade); - blend_color_mix_float(interp_color, interp_color, color_mix); - } - } - SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); + blend_color_interpolate_float(vd.col, ss->cache->prev_colors[vd.index], interp_color, fade); - blend_color_interpolate_float(vd.col, ss->cache->prev_colors[vd.index], interp_color, fade); - - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; diff --git a/source/blender/editors/sculpt_paint/sculpt_pose.c b/source/blender/editors/sculpt_paint/sculpt_pose.c index 86acb3e6675..923c838f895 100644 --- a/source/blender/editors/sculpt_paint/sculpt_pose.c +++ b/source/blender/editors/sculpt_paint/sculpt_pose.c @@ -493,51 +493,52 @@ static bool pose_face_sets_floodfill_cb( is_vertex_valid = SCULPT_vertex_has_face_set(ss, to_v, data->current_face_set); } - if (is_vertex_valid) { + if (!is_vertex_valid) { + return visit_next; + } - if (!BLI_BITMAP_TEST(data->is_weighted, index)) { - data->pose_factor[index] = 1.0f; - BLI_BITMAP_ENABLE(data->is_weighted, index); - visit_next = true; - } + if (!BLI_BITMAP_TEST(data->is_weighted, index)) { + data->pose_factor[index] = 1.0f; + BLI_BITMAP_ENABLE(data->is_weighted, index); + visit_next = true; + } - /* Fallback origin accumulation. */ - if (symmetry_check) { - add_v3_v3(data->fallback_origin, SCULPT_vertex_co_get(ss, to_v)); - data->fallback_count++; - } + /* Fallback origin accumulation. */ + if (symmetry_check) { + add_v3_v3(data->fallback_origin, SCULPT_vertex_co_get(ss, to_v)); + data->fallback_count++; + } - if (symmetry_check && !SCULPT_vertex_has_unique_face_set(ss, to_v)) { + if (!symmetry_check || SCULPT_vertex_has_unique_face_set(ss, to_v)) { + return visit_next; + } - /* We only add coordinates for calculating the origin when it is possible to go from this - * vertex to another vertex in a valid face set for the next iteration. */ - bool count_as_boundary = false; + /* We only add coordinates for calculating the origin when it is possible to go from this + * vertex to another vertex in a valid face set for the next iteration. */ + bool count_as_boundary = false; - SculptVertexNeighborIter ni; - SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, to_v, ni) { - int next_face_set_candidate = SCULPT_vertex_face_set_get(ss, ni.vertex); + SculptVertexNeighborIter ni; + SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, to_v, ni) { + int next_face_set_candidate = SCULPT_vertex_face_set_get(ss, ni.vertex); - /* Check if we can get a valid face set for the next iteration from this neighbor. */ - if (SCULPT_vertex_has_unique_face_set(ss, ni.vertex) && - !BLI_gset_haskey(data->visited_face_sets, POINTER_FROM_INT(next_face_set_candidate))) { - if (!data->next_face_set_found) { - data->next_face_set = next_face_set_candidate; - data->next_vertex_index = ni.index; - data->next_vertex = ni.vertex; - data->next_face_set_found = true; - } - count_as_boundary = true; - } - } - SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); - - /* Origin accumulation. */ - if (count_as_boundary) { - add_v3_v3(data->pose_origin, SCULPT_vertex_co_get(ss, to_v)); - data->tot_co++; + /* Check if we can get a valid face set for the next iteration from this neighbor. */ + if (SCULPT_vertex_has_unique_face_set(ss, ni.vertex) && + !BLI_gset_haskey(data->visited_face_sets, POINTER_FROM_INT(next_face_set_candidate))) { + if (!data->next_face_set_found) { + data->next_face_set = next_face_set_candidate; + data->next_vertex = ni.vertex; + data->next_face_set_found = true; } + count_as_boundary = true; } } + SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); + + /* Origin accumulation. */ + if (count_as_boundary) { + add_v3_v3(data->pose_origin, SCULPT_vertex_co_get(ss, to_v)); + data->tot_co++; + } return visit_next; } diff --git a/source/blender/editors/sculpt_paint/sculpt_smooth.c b/source/blender/editors/sculpt_paint/sculpt_smooth.c index 894efa3c30a..bd591ff9ace 100644 --- a/source/blender/editors/sculpt_paint/sculpt_smooth.c +++ b/source/blender/editors/sculpt_paint/sculpt_smooth.c @@ -238,24 +238,27 @@ static void do_enhance_details_brush_task_cb_ex(void *__restrict userdata, const int thread_id = BLI_task_parallel_thread_id(tls); BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); - float disp[3]; - madd_v3_v3v3fl(disp, vd.co, ss->cache->detail_directions[vd.index], fade); - SCULPT_clip(sd, ss, vd.co, disp); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); + + float disp[3]; + madd_v3_v3v3fl(disp, vd.co, ss->cache->detail_directions[vd.index], fade); + SCULPT_clip(sd, ss, vd.co, disp); + + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -403,33 +406,34 @@ static void do_smooth_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor( - ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - smooth_mask ? 0.0f : (vd.mask ? *vd.mask : 0.0f), - vd.vertex, - thread_id); - if (smooth_mask) { - float val = SCULPT_neighbor_mask_average(ss, vd.vertex) - *vd.mask; - val *= fade * bstrength; - *vd.mask += val; - CLAMP(*vd.mask, 0.0f, 1.0f); - } - else { - float avg[3], val[3]; - SCULPT_neighbor_coords_average_interior(ss, avg, vd.vertex); - sub_v3_v3v3(val, avg, vd.co); - madd_v3_v3v3fl(val, vd.co, val, fade); - SCULPT_clip(sd, ss, vd.co, val); - } - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor( + ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + smooth_mask ? 0.0f : (vd.mask ? *vd.mask : 0.0f), + vd.vertex, + thread_id); + if (smooth_mask) { + float val = SCULPT_neighbor_mask_average(ss, vd.vertex) - *vd.mask; + val *= fade * bstrength; + *vd.mask += val; + CLAMP(*vd.mask, 0.0f, 1.0f); + } + else { + float avg[3], val[3]; + SCULPT_neighbor_coords_average_interior(ss, avg, vd.vertex); + sub_v3_v3v3(val, avg, vd.co); + madd_v3_v3v3fl(val, vd.co, val, fade); + SCULPT_clip(sd, ss, vd.co, val); + } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -583,32 +587,29 @@ static void SCULPT_do_surface_smooth_brush_laplacian_task_cb_ex( BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { SCULPT_orig_vert_data_update(&orig_data, &vd); - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); - float disp[3]; - SCULPT_surface_smooth_laplacian_step(ss, - disp, - vd.co, - ss->cache->surface_smooth_laplacian_disp, - vd.vertex, - orig_data.co, - alpha); - madd_v3_v3fl(vd.co, disp, clamp_f(fade, 0.0f, 1.0f)); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); + + float disp[3]; + SCULPT_surface_smooth_laplacian_step( + ss, disp, vd.co, ss->cache->surface_smooth_laplacian_disp, vd.vertex, orig_data.co, alpha); + madd_v3_v3fl(vd.co, disp, clamp_f(fade, 0.0f, 1.0f)); + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } - BKE_pbvh_vertex_iter_end; } + BKE_pbvh_vertex_iter_end; } static void SCULPT_do_surface_smooth_brush_displace_task_cb_ex( @@ -629,19 +630,20 @@ static void SCULPT_do_surface_smooth_brush_displace_task_cb_ex( BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.vertex, - thread_id); - SCULPT_surface_smooth_displace_step( - ss, vd.co, ss->cache->surface_smooth_laplacian_disp, vd.vertex, beta, fade); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.vertex, + thread_id); + SCULPT_surface_smooth_displace_step( + ss, vd.co, ss->cache->surface_smooth_laplacian_disp, vd.vertex, beta, fade); } BKE_pbvh_vertex_iter_end; } diff --git a/source/blender/editors/sculpt_paint/sculpt_transform.c b/source/blender/editors/sculpt_paint/sculpt_transform.c index 44c6bd2b9e8..934c0432633 100644 --- a/source/blender/editors/sculpt_paint/sculpt_transform.c +++ b/source/blender/editors/sculpt_paint/sculpt_transform.c @@ -60,10 +60,9 @@ #include #include -void ED_sculpt_init_transform(struct bContext *C) +void ED_sculpt_init_transform(struct bContext *C, Object *ob) { Sculpt *sd = CTX_data_tool_settings(C)->sculpt; - Object *ob = CTX_data_active_object(C); SculptSession *ss = ob->sculpt; Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); @@ -220,10 +219,9 @@ static void sculpt_transform_all_vertices(Sculpt *sd, Object *ob) 0, ss->filter_cache->totnode, &data, sculpt_transform_task_cb, &settings); } -void ED_sculpt_update_modal_transform(struct bContext *C) +void ED_sculpt_update_modal_transform(struct bContext *C, Object *ob) { Sculpt *sd = CTX_data_tool_settings(C)->sculpt; - Object *ob = CTX_data_active_object(C); SculptSession *ss = ob->sculpt; Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); @@ -243,9 +241,8 @@ void ED_sculpt_update_modal_transform(struct bContext *C) SCULPT_flush_update_step(C, SCULPT_UPDATE_COORDS); } -void ED_sculpt_end_transform(struct bContext *C) +void ED_sculpt_end_transform(struct bContext *C, Object *ob) { - Object *ob = CTX_data_active_object(C); SculptSession *ss = ob->sculpt; if (ss->filter_cache) { SCULPT_filter_cache_free(ss); diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c index 391bc5dab45..85616f6356d 100644 --- a/source/blender/editors/sound/sound_ops.c +++ b/source/blender/editors/sound/sound_ops.c @@ -31,7 +31,6 @@ #include "BLI_blenlib.h" #include "BLI_utildefines.h" -#include "DNA_packedFile_types.h" #include "DNA_scene_types.h" #include "DNA_sequence_types.h" #include "DNA_sound_types.h" diff --git a/source/blender/editors/space_action/action_buttons.c b/source/blender/editors/space_action/action_buttons.c index 5e1c205f1d4..dfc3789a26c 100644 --- a/source/blender/editors/space_action/action_buttons.c +++ b/source/blender/editors/space_action/action_buttons.c @@ -26,33 +26,10 @@ #include #include -#include "DNA_anim_types.h" -#include "DNA_object_types.h" -#include "DNA_scene_types.h" - -#include "MEM_guardedalloc.h" - #include "BLI_utildefines.h" -#include "BLT_translation.h" - #include "BKE_context.h" -#include "BKE_curve.h" -#include "BKE_fcurve.h" #include "BKE_screen.h" -#include "BKE_unit.h" - -#include "WM_api.h" -#include "WM_types.h" - -#include "RNA_access.h" - -#include "ED_anim_api.h" -#include "ED_keyframing.h" -#include "ED_screen.h" - -#include "UI_interface.h" -#include "UI_resources.h" #include "action_intern.h" /* own include */ diff --git a/source/blender/editors/space_action/action_edit.c b/source/blender/editors/space_action/action_edit.c index f8389d40831..5c061518570 100644 --- a/source/blender/editors/space_action/action_edit.c +++ b/source/blender/editors/space_action/action_edit.c @@ -312,11 +312,11 @@ void ACTION_OT_previewrange_set(wmOperatorType *ot) /** * Find the extents of the active channel * - * \param[out] min: Bottom y-extent of channel - * \param[out] max: Top y-extent of channel - * \return Success of finding a selected channel + * \param r_min: Bottom y-extent of channel. + * \param r_max: Top y-extent of channel. + * \return Success of finding a selected channel. */ -static bool actkeys_channels_get_selected_extents(bAnimContext *ac, float *min, float *max) +static bool actkeys_channels_get_selected_extents(bAnimContext *ac, float *r_min, float *r_max) { ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; @@ -339,8 +339,8 @@ static bool actkeys_channels_get_selected_extents(bAnimContext *ac, float *min, if (acf && acf->has_setting(ac, ale, ACHANNEL_SETTING_SELECT) && ANIM_channel_setting_get(ac, ale, ACHANNEL_SETTING_SELECT)) { /* update best estimate */ - *min = ymax - ACHANNEL_HEIGHT(ac); - *max = ymax; + *r_min = ymax - ACHANNEL_HEIGHT(ac); + *r_max = ymax; /* is this high enough priority yet? */ found = acf->channel_role; diff --git a/source/blender/editors/space_action/action_ops.c b/source/blender/editors/space_action/action_ops.c index 7422c05511c..7821458d1e5 100644 --- a/source/blender/editors/space_action/action_ops.c +++ b/source/blender/editors/space_action/action_ops.c @@ -27,9 +27,6 @@ #include "DNA_space_types.h" #include "ED_anim_api.h" -#include "ED_markers.h" -#include "ED_object.h" -#include "ED_select_utils.h" #include "ED_transform.h" #include "action_intern.h" diff --git a/source/blender/editors/space_action/space_action.c b/source/blender/editors/space_action/space_action.c index 691287a543f..722005235d3 100644 --- a/source/blender/editors/space_action/space_action.c +++ b/source/blender/editors/space_action/space_action.c @@ -55,7 +55,6 @@ #include "ED_space_api.h" #include "ED_time_scrub_ui.h" -#include "GPU_framebuffer.h" #include "action_intern.h" /* own include */ /* ******************** default callbacks for action space ***************** */ diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c index 817760615df..c112c678a09 100644 --- a/source/blender/editors/space_api/spacetypes.c +++ b/source/blender/editors/space_api/spacetypes.c @@ -272,6 +272,22 @@ void ED_region_draw_cb_draw(const bContext *C, ARegion *region, int type) } } +void ED_region_draw_cb_remove_by_type(ARegionType *art, void *draw_fn, void (*free)(void *)) +{ + RegionDrawCB *rdc = art->drawcalls.first; + while (rdc) { + RegionDrawCB *rdc_next = rdc->next; + if (rdc->draw == draw_fn) { + if (free) { + free(rdc->customdata); + } + BLI_remlink(&art->drawcalls, rdc); + MEM_freeN(rdc); + } + rdc = rdc_next; + } +} + /* ********************* space template *********************** */ /* forward declare */ void ED_spacetype_xxx(void); diff --git a/source/blender/editors/space_buttons/buttons_context.c b/source/blender/editors/space_buttons/buttons_context.c index e2b889bece1..3efaff72637 100644 --- a/source/blender/editors/space_buttons/buttons_context.c +++ b/source/blender/editors/space_buttons/buttons_context.c @@ -33,8 +33,6 @@ #include "DNA_armature_types.h" #include "DNA_brush_types.h" -#include "DNA_collection_types.h" -#include "DNA_light_types.h" #include "DNA_linestyle_types.h" #include "DNA_material_types.h" #include "DNA_node_types.h" @@ -53,7 +51,6 @@ #include "BKE_paint.h" #include "BKE_particle.h" #include "BKE_screen.h" -#include "BKE_texture.h" #include "RNA_access.h" @@ -759,7 +756,7 @@ bool ED_buttons_should_sync_with_outliner(const bContext *C, ScrArea *active_area = CTX_wm_area(C); const bool auto_sync = ED_area_has_shared_border(active_area, area) && sbuts->outliner_sync == PROPERTIES_SYNC_AUTO; - return auto_sync || sbuts->outliner_sync == PROPERTIES_SYNC_ON; + return auto_sync || sbuts->outliner_sync == PROPERTIES_SYNC_ALWAYS; } void ED_buttons_set_context(const bContext *C, diff --git a/source/blender/editors/space_buttons/buttons_texture.c b/source/blender/editors/space_buttons/buttons_texture.c index 6f743eb1a6b..4847e8738df 100644 --- a/source/blender/editors/space_buttons/buttons_texture.c +++ b/source/blender/editors/space_buttons/buttons_texture.c @@ -52,10 +52,7 @@ #include "BKE_node.h" #include "BKE_paint.h" #include "BKE_particle.h" -#include "BKE_scene.h" -#include "BKE_workspace.h" #ifdef WITH_FREESTYLE -# include "BKE_freestyle.h" #endif #include "RNA_access.h" diff --git a/source/blender/editors/space_clip/clip_buttons.c b/source/blender/editors/space_clip/clip_buttons.c index 81bae26efeb..d555238e949 100644 --- a/source/blender/editors/space_clip/clip_buttons.c +++ b/source/blender/editors/space_clip/clip_buttons.c @@ -46,7 +46,6 @@ #include "DEG_depsgraph.h" #include "ED_clip.h" -#include "ED_gpencil.h" #include "ED_screen.h" #include "UI_interface.h" @@ -805,7 +804,7 @@ void uiTemplateMovieclipInformation(uiLayout *layout, ImBuf *ibuf = BKE_movieclip_get_ibuf_flag(clip, user, clip->flag, MOVIECLIP_CACHE_SKIP); int width, height; - /* Display frame dimensions, channels number and byffer type. */ + /* Display frame dimensions, channels number and buffer type. */ BKE_movieclip_get_size(clip, user, &width, &height); char str[1024]; diff --git a/source/blender/editors/space_clip/clip_draw.c b/source/blender/editors/space_clip/clip_draw.c index 93c30c9a4ba..cbe8ec4ba00 100644 --- a/source/blender/editors/space_clip/clip_draw.c +++ b/source/blender/editors/space_clip/clip_draw.c @@ -1207,7 +1207,7 @@ static void draw_plane_marker_image(Scene *scene, GPUTexture *texture = GPU_texture_create_2d( "plane_marker_image", ibuf->x, ibuf->y, 1, GPU_RGBA8, NULL); - GPU_texture_update(texture, GPU_DATA_UNSIGNED_BYTE, display_buffer); + GPU_texture_update(texture, GPU_DATA_UBYTE, display_buffer); GPU_texture_filter_mode(texture, false); GPU_matrix_push(); diff --git a/source/blender/editors/space_clip/clip_editor.c b/source/blender/editors/space_clip/clip_editor.c index af1d082d317..e1172458f67 100644 --- a/source/blender/editors/space_clip/clip_editor.c +++ b/source/blender/editors/space_clip/clip_editor.c @@ -67,7 +67,9 @@ #include "clip_intern.h" /* own include */ -/* ******** operactor poll functions ******** */ +/* -------------------------------------------------------------------- */ +/** \name Operator Poll Functions + * \{ */ bool ED_space_clip_poll(bContext *C) { @@ -128,7 +130,11 @@ bool ED_space_clip_maskedit_mask_poll(bContext *C) return false; } -/* ******** common editing functions ******** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Common Editing Functions + * \{ */ void ED_space_clip_get_size(SpaceClip *sc, int *width, int *height) { @@ -538,7 +544,11 @@ bool ED_space_clip_check_show_maskedit(SpaceClip *sc) return false; } -/* ******** clip editing functions ******** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Clip Editing Functions + * \{ */ MovieClip *ED_space_clip_get_clip(SpaceClip *sc) { @@ -595,7 +605,11 @@ void ED_space_clip_set_clip(bContext *C, bScreen *screen, SpaceClip *sc, MovieCl } } -/* ******** masking editing functions ******** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Masking Editing Functions + * \{ */ Mask *ED_space_clip_get_mask(SpaceClip *sc) { @@ -613,7 +627,11 @@ void ED_space_clip_set_mask(bContext *C, SpaceClip *sc, Mask *mask) } } -/* ******** pre-fetching functions ******** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Pre-Fetching Functions + * \{ */ typedef struct PrefetchJob { MovieClip *clip; @@ -1121,3 +1139,5 @@ void ED_clip_view_lock_state_restore_no_jump(const bContext *C, const ClipViewLo space_clip->xlockof = state->offset_x + state->lock_offset_x - offset_x; space_clip->ylockof = state->offset_y + state->lock_offset_y - offset_y; } + +/** \} */ diff --git a/source/blender/editors/space_clip/clip_ops.c b/source/blender/editors/space_clip/clip_ops.c index 38a05eef6e3..0c54a042a1a 100644 --- a/source/blender/editors/space_clip/clip_ops.c +++ b/source/blender/editors/space_clip/clip_ops.c @@ -1837,7 +1837,7 @@ void CLIP_OT_cursor_set(wmOperatorType *ot) /** \name Toggle Lock To Selection Operator * \{ */ -static int lock_selection_togglee_exec(bContext *C, wmOperator *UNUSED(op)) +static int lock_selection_toggle_exec(bContext *C, wmOperator *UNUSED(op)) { SpaceClip *space_clip = CTX_wm_space_clip(C); @@ -1862,7 +1862,7 @@ void CLIP_OT_lock_selection_toggle(wmOperatorType *ot) /* api callbacks */ ot->poll = ED_space_clip_poll; - ot->exec = lock_selection_togglee_exec; + ot->exec = lock_selection_toggle_exec; /* flags */ ot->flag = OPTYPE_LOCK_BYPASS; diff --git a/source/blender/editors/space_clip/clip_toolbar.c b/source/blender/editors/space_clip/clip_toolbar.c index b02f3fe16f6..da9e82043f0 100644 --- a/source/blender/editors/space_clip/clip_toolbar.c +++ b/source/blender/editors/space_clip/clip_toolbar.c @@ -23,29 +23,17 @@ #include -#include "DNA_windowmanager_types.h" -#include "DNA_workspace_types.h" - #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" #include "BLI_utildefines.h" -#include "BLT_translation.h" - #include "BKE_context.h" #include "BKE_screen.h" -#include "RNA_access.h" - -#include "WM_api.h" #include "WM_types.h" #include "ED_screen.h" -#include "ED_undo.h" - -#include "UI_interface.h" -#include "UI_resources.h" #include "clip_intern.h" /* own include */ diff --git a/source/blender/editors/space_clip/clip_utils.c b/source/blender/editors/space_clip/clip_utils.c index 271ec219809..dbf733413e5 100644 --- a/source/blender/editors/space_clip/clip_utils.c +++ b/source/blender/editors/space_clip/clip_utils.c @@ -484,7 +484,7 @@ static bool tracking_has_selection(SpaceClip *space_clip) return false; } -static bool mask_has_selection(const bContext *C, bool include_handles) +static bool mask_has_selection(const bContext *C) { Mask *mask = CTX_data_edit_mask(C); if (mask == NULL) { @@ -506,19 +506,15 @@ static bool mask_has_selection(const bContext *C, bool include_handles) return true; } - if (!include_handles) { - /* Ignore handles. */ - } - else if (BKE_mask_point_handles_mode_get(point) == MASK_HANDLE_MODE_STICK) { + if (BKE_mask_point_handles_mode_get(point) == MASK_HANDLE_MODE_STICK) { return true; } - else { - if ((bezt->f1 & SELECT) && (bezt->h1 != HD_VECT)) { - return true; - } - if ((bezt->f3 & SELECT) && (bezt->h2 != HD_VECT)) { - return true; - } + + if ((bezt->f1 & SELECT) && (bezt->h1 != HD_VECT)) { + return true; + } + if ((bezt->f3 & SELECT) && (bezt->h2 != HD_VECT)) { + return true; } } } @@ -527,14 +523,17 @@ static bool mask_has_selection(const bContext *C, bool include_handles) return false; } -static bool selected_boundbox(const bContext *C, float min[2], float max[2], bool include_handles) +static bool selected_boundbox(const bContext *C, + float min[2], + float max[2], + bool handles_as_control_point) { SpaceClip *sc = CTX_wm_space_clip(C); if (sc->mode == SC_MODE_TRACKING) { return selected_tracking_boundbox(sc, min, max); } - if (ED_mask_selected_minmax(C, min, max, include_handles)) { + if (ED_mask_selected_minmax(C, min, max, handles_as_control_point)) { MovieClip *clip = ED_space_clip_get_clip(sc); int width, height; ED_space_clip_get_size(sc, &width, &height); @@ -563,12 +562,13 @@ bool clip_view_calculate_view_selection( /* NOTE: The `fit` argument is set to truth when doing "View to Selected" operator, and it set to * false when this function is used for Lock-to-Selection functionality. When locking to - * selection the handles are to be ignored. So we can derive the `include_handles` from `fit`. + * selection the handles are to use control point position. So we can derive the + * `handles_as_control_point` from `fit`. * * TODO(sergey): Make such decision more explicit. Maybe pass use-case for the calculation to * tell operator from lock-to-selection apart. */ float min[2], max[2]; - if (!selected_boundbox(C, min, max, fit)) { + if (!selected_boundbox(C, min, max, !fit)) { return false; } @@ -622,7 +622,7 @@ bool clip_view_has_locked_selection(const bContext *C) return tracking_has_selection(space_clip); } - return mask_has_selection(C, false); + return mask_has_selection(C); } void clip_draw_sfra_efra(View2D *v2d, Scene *scene) diff --git a/source/blender/editors/space_clip/space_clip.c b/source/blender/editors/space_clip/space_clip.c index 33783f19a79..e0a524a79c1 100644 --- a/source/blender/editors/space_clip/space_clip.c +++ b/source/blender/editors/space_clip/space_clip.c @@ -47,15 +47,12 @@ #include "ED_clip.h" #include "ED_mask.h" #include "ED_screen.h" -#include "ED_select_utils.h" #include "ED_space_api.h" #include "ED_time_scrub_ui.h" -#include "ED_transform.h" #include "ED_uvedit.h" /* just for ED_image_draw_cursor */ #include "IMB_imbuf.h" -#include "GPU_framebuffer.h" #include "GPU_matrix.h" #include "WM_api.h" @@ -642,7 +639,7 @@ static void clip_dropboxes(void) { ListBase *lb = WM_dropboxmap_find("Clip", SPACE_CLIP, 0); - WM_dropbox_add(lb, "CLIP_OT_open", clip_drop_poll, clip_drop_copy); + WM_dropbox_add(lb, "CLIP_OT_open", clip_drop_poll, clip_drop_copy, NULL); } static void clip_refresh(const bContext *C, ScrArea *area) diff --git a/source/blender/editors/space_clip/tracking_ops.c b/source/blender/editors/space_clip/tracking_ops.c index a903aeed380..bcac4d94bf0 100644 --- a/source/blender/editors/space_clip/tracking_ops.c +++ b/source/blender/editors/space_clip/tracking_ops.c @@ -110,7 +110,7 @@ static int add_marker_invoke(bContext *C, wmOperator *op, const wmEvent *event) ARegion *region = CTX_wm_region(C); if (!RNA_struct_property_is_set(op->ptr, "location")) { - /* If location is not set, use mouse positio nas default. */ + /* If location is not set, use mouse position as default. */ float co[2]; ED_clip_mouse_pos(sc, region, event->mval, co); RNA_float_set_array(op->ptr, "location", co); diff --git a/source/blender/editors/space_clip/tracking_ops_detect.c b/source/blender/editors/space_clip/tracking_ops_detect.c index 54ec439471d..86ee94df731 100644 --- a/source/blender/editors/space_clip/tracking_ops_detect.c +++ b/source/blender/editors/space_clip/tracking_ops_detect.c @@ -21,14 +21,10 @@ * \ingroup spclip */ -#include "MEM_guardedalloc.h" - #include "DNA_gpencil_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" -#include "BLI_utildefines.h" - #include "BKE_context.h" #include "BKE_movieclip.h" #include "BKE_report.h" diff --git a/source/blender/editors/space_clip/tracking_ops_stabilize.c b/source/blender/editors/space_clip/tracking_ops_stabilize.c index 5e43b7c7ec6..d0b4d18c6d9 100644 --- a/source/blender/editors/space_clip/tracking_ops_stabilize.c +++ b/source/blender/editors/space_clip/tracking_ops_stabilize.c @@ -21,8 +21,6 @@ * \ingroup spclip */ -#include "MEM_guardedalloc.h" - #include "DNA_screen_types.h" #include "DNA_space_types.h" diff --git a/source/blender/editors/space_clip/tracking_ops_track.c b/source/blender/editors/space_clip/tracking_ops_track.c index 585b13b426e..e480ec2db05 100644 --- a/source/blender/editors/space_clip/tracking_ops_track.c +++ b/source/blender/editors/space_clip/tracking_ops_track.c @@ -30,7 +30,6 @@ #include "BKE_global.h" #include "BKE_main.h" #include "BKE_movieclip.h" -#include "BKE_report.h" #include "BKE_tracking.h" #include "WM_api.h" diff --git a/source/blender/editors/space_clip/tracking_ops_utils.c b/source/blender/editors/space_clip/tracking_ops_utils.c index 1f959e94309..0f6bd6e039a 100644 --- a/source/blender/editors/space_clip/tracking_ops_utils.c +++ b/source/blender/editors/space_clip/tracking_ops_utils.c @@ -21,12 +21,8 @@ * \ingroup spclip */ -#include "MEM_guardedalloc.h" - #include "DNA_space_types.h" -#include "BLI_utildefines.h" - #include "BKE_context.h" #include "BKE_tracking.h" diff --git a/source/blender/editors/space_console/space_console.c b/source/blender/editors/space_console/space_console.c index 790ea379e54..56a6204b385 100644 --- a/source/blender/editors/space_console/space_console.c +++ b/source/blender/editors/space_console/space_console.c @@ -41,7 +41,6 @@ #include "UI_resources.h" #include "UI_view2d.h" -#include "GPU_framebuffer.h" #include "console_intern.h" /* own include */ /* ******************** default callbacks for console space ***************** */ @@ -197,8 +196,8 @@ static void console_dropboxes(void) { ListBase *lb = WM_dropboxmap_find("Console", SPACE_CONSOLE, RGN_TYPE_WINDOW); - WM_dropbox_add(lb, "CONSOLE_OT_insert", id_drop_poll, id_drop_copy); - WM_dropbox_add(lb, "CONSOLE_OT_insert", path_drop_poll, path_drop_copy); + WM_dropbox_add(lb, "CONSOLE_OT_insert", id_drop_poll, id_drop_copy, NULL); + WM_dropbox_add(lb, "CONSOLE_OT_insert", path_drop_poll, path_drop_copy, NULL); } /* ************* end drop *********** */ diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c index 1ba9716a194..985c92f19b6 100644 --- a/source/blender/editors/space_file/file_ops.c +++ b/source/blender/editors/space_file/file_ops.c @@ -2230,8 +2230,7 @@ static int file_directory_new_exec(bContext *C, wmOperator *op) params->rename_flag = FILE_PARAMS_RENAME_PENDING; } - /* set timer to smoothly view newly generated file */ - /* max 30 frs/sec */ + /* Set timer to smoothly view newly generated file. */ if (sfile->smoothscroll_timer != NULL) { WM_event_remove_timer(wm, CTX_wm_window(C), sfile->smoothscroll_timer); } diff --git a/source/blender/editors/space_file/file_utils.c b/source/blender/editors/space_file/file_utils.c index 9d85996c559..186bc04fafe 100644 --- a/source/blender/editors/space_file/file_utils.c +++ b/source/blender/editors/space_file/file_utils.c @@ -19,7 +19,6 @@ */ #include "BLI_fileops.h" -#include "BLI_listbase.h" #include "BLI_path_util.h" #include "BLI_rect.h" #include "BLI_string.h" diff --git a/source/blender/editors/space_file/filesel.c b/source/blender/editors/space_file/filesel.c index 6e5791cad52..6917893ab5f 100644 --- a/source/blender/editors/space_file/filesel.c +++ b/source/blender/editors/space_file/filesel.c @@ -280,7 +280,7 @@ static FileSelectParams *fileselect_ensure_updated_file_params(SpaceFile *sfile) params->filter |= RNA_property_boolean_get(op->ptr, prop) ? FILE_TYPE_VOLUME : 0; } if ((prop = RNA_struct_find_property(op->ptr, "filter_glob"))) { - /* Protection against pyscripts not setting proper size limit... */ + /* Protection against Python scripts not setting proper size limit. */ char *tmp = RNA_property_string_get_alloc( op->ptr, prop, params->filter_glob, sizeof(params->filter_glob), NULL); if (tmp != params->filter_glob) { @@ -418,7 +418,7 @@ static void fileselect_refresh_asset_params(FileAssetSelectParams *asset_params) FileSelectParams *base_params = &asset_params->base_params; bUserAssetLibrary *user_library = NULL; - /* Ensure valid repo, or fall-back to local one. */ + /* Ensure valid repository, or fall-back to local one. */ if (library->type == FILE_ASSET_LIBRARY_CUSTOM) { BLI_assert(library->custom_library_index >= 0); diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c index d4cd888c662..b175844a710 100644 --- a/source/blender/editors/space_file/space_file.c +++ b/source/blender/editors/space_file/space_file.c @@ -261,7 +261,7 @@ static void file_ensure_valid_region_state(bContext *C, } } /* If there's an file-operation, ensure we have the option and execute region */ - else if (sfile->op) { + else if (sfile->op && !BKE_area_find_region_type(area, RGN_TYPE_TOOL_PROPS)) { ARegion *region_ui = file_ui_region_ensure(area, region_tools); ARegion *region_execute = file_execute_region_ensure(area, region_ui); ARegion *region_props = file_tool_props_region_ensure(area, region_execute); @@ -276,7 +276,7 @@ static void file_ensure_valid_region_state(bContext *C, needs_init = true; } /* If there's _no_ file-operation, ensure we _don't_ have the option and execute region */ - else { + else if (!sfile->op) { ARegion *region_props = BKE_area_find_region_type(area, RGN_TYPE_TOOL_PROPS); ARegion *region_execute = BKE_area_find_region_type(area, RGN_TYPE_EXECUTE); ARegion *region_ui = file_ui_region_ensure(area, region_tools); @@ -558,7 +558,7 @@ static void file_main_region_draw(const bContext *C, ARegion *region) v2d->keepofs |= V2D_LOCKOFS_Y; /* XXX this happens on scaling down Screen (like from startup.blend) */ - /* view2d has no type specific for filewindow case, which doesn't scroll vertically */ + /* view2d has no type specific for file-window case, which doesn't scroll vertically. */ if (v2d->cur.ymax < 0) { v2d->cur.ymin -= v2d->cur.ymax; v2d->cur.ymax = 0; @@ -766,7 +766,7 @@ static void file_dropboxes(void) { ListBase *lb = WM_dropboxmap_find("Window", SPACE_EMPTY, RGN_TYPE_WINDOW); - WM_dropbox_add(lb, "FILE_OT_filepath_drop", filepath_drop_poll, filepath_drop_copy); + WM_dropbox_add(lb, "FILE_OT_filepath_drop", filepath_drop_poll, filepath_drop_copy, NULL); } static int file_space_subtype_get(ScrArea *area) diff --git a/source/blender/editors/space_graph/graph_buttons.c b/source/blender/editors/space_graph/graph_buttons.c index 51be5afafe5..d88bf8750c2 100644 --- a/source/blender/editors/space_graph/graph_buttons.c +++ b/source/blender/editors/space_graph/graph_buttons.c @@ -105,6 +105,16 @@ static bool graph_panel_context(const bContext *C, bAnimListElem **ale, FCurve * return true; } +FCurve *ANIM_graph_context_fcurve(const bContext *C) +{ + FCurve *fcu; + if (!graph_panel_context(C, NULL, &fcu)) { + return NULL; + } + + return fcu; +} + static bool graph_panel_poll(const bContext *C, PanelType *UNUSED(pt)) { return graph_panel_context(C, NULL, NULL); @@ -1312,6 +1322,16 @@ static void graph_panel_drivers_popover(const bContext *C, Panel *panel) /* All the drawing code is in editors/animation/fmodifier_ui.c */ #define B_FMODIFIER_REDRAW 20 +/** The start of FModifier panels registered for the graph editor. */ +#define GRAPH_FMODIFIER_PANEL_PREFIX "GRAPH" + +static void graph_fmodifier_panel_id(void *fcm_link, char *r_name) +{ + FModifier *fcm = (FModifier *)fcm_link; + eFModifier_Types type = fcm->type; + const FModifierTypeInfo *fmi = get_fmodifier_typeinfo(type); + BLI_snprintf(r_name, BKE_ST_MAXNAME, "%s_PT_%s", GRAPH_FMODIFIER_PANEL_PREFIX, fmi->name); +} static void do_graph_region_modifier_buttons(bContext *C, void *UNUSED(arg), int event) { @@ -1327,10 +1347,8 @@ static void graph_panel_modifiers(const bContext *C, Panel *panel) { bAnimListElem *ale; FCurve *fcu; - FModifier *fcm; - uiLayout *col, *row; + uiLayout *row; uiBlock *block; - bool active; if (!graph_panel_context(C, &ale, &fcu)) { return; @@ -1355,14 +1373,7 @@ static void graph_panel_modifiers(const bContext *C, Panel *panel) uiItemO(row, "", ICON_PASTEDOWN, "GRAPH_OT_fmodifier_paste"); } - active = !(fcu->flag & FCURVE_MOD_OFF); - /* draw each modifier */ - for (fcm = fcu->modifiers.first; fcm; fcm = fcm->next) { - col = uiLayoutColumn(panel->layout, true); - uiLayoutSetActive(col, active); - - ANIM_uiTemplate_fmodifier_draw(col, ale->fcurve_owner_id, &fcu->modifiers, fcm); - } + ANIM_fmodifier_panels(C, ale->fcurve_owner_id, &fcu->modifiers, graph_fmodifier_panel_id); MEM_freeN(ale); } @@ -1426,10 +1437,14 @@ void graph_buttons_register(ARegionType *art) strcpy(pt->label, N_("Modifiers")); strcpy(pt->category, "Modifiers"); strcpy(pt->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA); + pt->flag = PANEL_TYPE_NO_HEADER; pt->draw = graph_panel_modifiers; pt->poll = graph_panel_poll; BLI_addtail(&art->paneltypes, pt); + ANIM_modifier_panels_register_graph_and_NLA(art, GRAPH_FMODIFIER_PANEL_PREFIX, graph_panel_poll); + ANIM_modifier_panels_register_graph_only(art, GRAPH_FMODIFIER_PANEL_PREFIX, graph_panel_poll); + pt = MEM_callocN(sizeof(PanelType), "spacetype graph panel view"); strcpy(pt->idname, "GRAPH_PT_view"); strcpy(pt->label, N_("Show Cursor")); diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c index 33e724459a9..4752f62b58c 100644 --- a/source/blender/editors/space_graph/graph_draw.c +++ b/source/blender/editors/space_graph/graph_draw.c @@ -57,7 +57,6 @@ static void graph_draw_driver_debug(bAnimContext *ac, ID *id, FCurve *fcu); /* -------------------------------------------------------------------- */ /** \name Utility Drawing Defines - * * \{ */ /* determine the alpha value that should be used when @@ -73,7 +72,6 @@ static float fcurve_display_alpha(FCurve *fcu) /* -------------------------------------------------------------------- */ /** \name FCurve Modifier Drawing - * * \{ */ /* Envelope -------------- */ @@ -153,7 +151,6 @@ static void draw_fcurve_modifier_controls_envelope(FModifier *fcm, /* -------------------------------------------------------------------- */ /** \name FCurve Modifier Drawing - * * \{ */ /* Points ---------------- */ @@ -1343,7 +1340,6 @@ void graph_draw_curves(bAnimContext *ac, SpaceGraph *sipo, ARegion *region, shor /* -------------------------------------------------------------------- */ /** \name Channel List - * * \{ */ /* left hand part */ diff --git a/source/blender/editors/space_graph/graph_ops.c b/source/blender/editors/space_graph/graph_ops.c index 63acc2a1774..32396a70cce 100644 --- a/source/blender/editors/space_graph/graph_ops.c +++ b/source/blender/editors/space_graph/graph_ops.c @@ -32,15 +32,11 @@ #include "BKE_context.h" #include "BKE_global.h" -#include "BKE_main.h" #include "UI_view2d.h" #include "ED_anim_api.h" -#include "ED_markers.h" -#include "ED_object.h" #include "ED_screen.h" -#include "ED_select_utils.h" #include "ED_transform.h" #include "graph_intern.h" diff --git a/source/blender/editors/space_graph/graph_utils.c b/source/blender/editors/space_graph/graph_utils.c index 8463c21b1ad..c37d9f42c12 100644 --- a/source/blender/editors/space_graph/graph_utils.c +++ b/source/blender/editors/space_graph/graph_utils.c @@ -38,8 +38,6 @@ #include "BKE_fcurve.h" #include "BKE_screen.h" -#include "WM_api.h" - #include "ED_anim_api.h" #include "ED_screen.h" #include "UI_interface.h" diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index e7f468f2f26..4008ca228ac 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -36,9 +36,7 @@ #include "BLI_blenlib.h" #include "BLI_fileops.h" -#include "BLI_fileops_types.h" #include "BLI_ghash.h" -#include "BLI_linklist.h" #include "BLI_math.h" #include "BLI_string.h" #include "BLI_utildefines.h" @@ -48,7 +46,6 @@ #include "DNA_camera_types.h" #include "DNA_node_types.h" #include "DNA_object_types.h" -#include "DNA_packedFile_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" @@ -62,14 +59,10 @@ #include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_packedFile.h" -#include "BKE_paint.h" #include "BKE_report.h" -#include "BKE_scene.h" -#include "BKE_screen.h" #include "DEG_depsgraph.h" -#include "GPU_immediate.h" #include "GPU_state.h" #include "IMB_colormanagement.h" @@ -898,7 +891,7 @@ static int image_view_selected_exec(bContext *C, wmOperator *UNUSED(op)) } } else if (ED_space_image_check_show_maskedit(sima, obedit)) { - if (!ED_mask_selected_minmax(C, min, max, true)) { + if (!ED_mask_selected_minmax(C, min, max, false)) { return OPERATOR_CANCELLED; } } @@ -2744,7 +2737,7 @@ static int image_flip_exec(bContext *C, wmOperator *op) ED_image_undo_push_end(); - /* force GPU reupload, all image is invalid. */ + /* force GPU re-upload, all image is invalid. */ BKE_image_free_gputextures(ima); WM_event_add_notifier(C, NC_IMAGE | NA_EDITED, ima); diff --git a/source/blender/editors/space_image/image_sequence.c b/source/blender/editors/space_image/image_sequence.c index 81f2ced7dee..02546e3e3b3 100644 --- a/source/blender/editors/space_image/image_sequence.c +++ b/source/blender/editors/space_image/image_sequence.c @@ -27,7 +27,6 @@ #include "BLI_fileops.h" #include "BLI_fileops_types.h" -#include "BLI_linklist.h" #include "BLI_listbase.h" #include "BLI_math_base.h" #include "BLI_path_util.h" @@ -35,7 +34,6 @@ #include "BLI_utildefines.h" #include "DNA_image_types.h" -#include "DNA_space_types.h" #include "DNA_windowmanager_types.h" #include "RNA_access.h" @@ -45,8 +43,6 @@ #include "ED_image.h" -#include "WM_types.h" - typedef struct ImageFrame { struct ImageFrame *next, *prev; int framenr; diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c index 0dd99824dcd..95ca8aba399 100644 --- a/source/blender/editors/space_image/space_image.c +++ b/source/blender/editors/space_image/space_image.c @@ -24,8 +24,6 @@ #include "DNA_gpencil_types.h" #include "DNA_image_types.h" #include "DNA_mask_types.h" -#include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" @@ -37,14 +35,9 @@ #include "BKE_colortools.h" #include "BKE_context.h" -#include "BKE_editmesh.h" #include "BKE_image.h" -#include "BKE_layer.h" #include "BKE_lib_id.h" -#include "BKE_material.h" -#include "BKE_scene.h" #include "BKE_screen.h" -#include "BKE_workspace.h" #include "RNA_access.h" #include "RNA_define.h" @@ -56,7 +49,6 @@ #include "ED_image.h" #include "ED_mask.h" -#include "ED_mesh.h" #include "ED_node.h" #include "ED_render.h" #include "ED_screen.h" @@ -65,19 +57,13 @@ #include "ED_uvedit.h" #include "WM_api.h" -#include "WM_message.h" #include "WM_types.h" #include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" -#include "GPU_batch_presets.h" -#include "GPU_framebuffer.h" -#include "GPU_viewport.h" - #include "DRW_engine.h" -#include "DRW_engine_types.h" #include "image_intern.h" @@ -131,7 +117,7 @@ static SpaceLink *image_create(const ScrArea *UNUSED(area), const Scene *UNUSED( simage->overlay.flag = SI_OVERLAY_SHOW_OVERLAYS; BKE_imageuser_default(&simage->iuser); - simage->iuser.flag = IMA_SHOW_STEREO | IMA_ANIM_ALWAYS; + simage->iuser.flag = IMA_SHOW_STEREO | IMA_ANIM_ALWAYS | IMA_SHOW_MAX_RESOLUTION; BKE_scopes_new(&simage->scopes); simage->sample_line_hist.height = 100; @@ -294,7 +280,7 @@ static void image_dropboxes(void) { ListBase *lb = WM_dropboxmap_find("Image", SPACE_IMAGE, 0); - WM_dropbox_add(lb, "IMAGE_OT_open", image_drop_poll, image_drop_copy); + WM_dropbox_add(lb, "IMAGE_OT_open", image_drop_poll, image_drop_copy, NULL); } /** diff --git a/source/blender/editors/space_info/info_draw.c b/source/blender/editors/space_info/info_draw.c index dc926587367..be3b60d581b 100644 --- a/source/blender/editors/space_info/info_draw.c +++ b/source/blender/editors/space_info/info_draw.c @@ -35,7 +35,6 @@ #include "UI_resources.h" #include "UI_view2d.h" -#include "GPU_framebuffer.h" #include "info_intern.h" #include "textview.h" @@ -56,47 +55,11 @@ static enum eTextViewContext_LineFlag report_line_data(TextViewContext *tvc, int shade = (tvc->iter_tmp % 2) ? 4 : -4; UI_GetThemeColorShade4ubv(bg_id, shade, bg); - /* Icon color and background depend of report type. */ + /* Don't show icon on subsequent rows of multi-row report. */ + *r_icon = (tvc->iter_char_begin != 0) ? ICON_NONE : UI_icon_from_report_type(report->type); - int icon_fg_id; - int icon_bg_id; - - if (tvc->iter_char_begin != 0) { - *r_icon = ICON_NONE; - } - else if (report->type & RPT_ERROR_ALL) { - icon_fg_id = TH_INFO_ERROR_TEXT; - icon_bg_id = TH_INFO_ERROR; - *r_icon = ICON_CANCEL; - } - else if (report->type & RPT_WARNING_ALL) { - icon_fg_id = TH_INFO_WARNING_TEXT; - icon_bg_id = TH_INFO_WARNING; - *r_icon = ICON_ERROR; - } - else if (report->type & RPT_INFO_ALL) { - icon_fg_id = TH_INFO_INFO_TEXT; - icon_bg_id = TH_INFO_INFO; - *r_icon = ICON_INFO; - } - else if (report->type & RPT_DEBUG_ALL) { - icon_fg_id = TH_INFO_DEBUG_TEXT; - icon_bg_id = TH_INFO_DEBUG; - *r_icon = ICON_SYSTEM; - } - else if (report->type & RPT_PROPERTY) { - icon_fg_id = TH_INFO_PROPERTY_TEXT; - icon_bg_id = TH_INFO_PROPERTY; - *r_icon = ICON_OPTIONS; - } - else if (report->type & RPT_OPERATOR) { - icon_fg_id = TH_INFO_OPERATOR_TEXT; - icon_bg_id = TH_INFO_OPERATOR; - *r_icon = ICON_CHECKMARK; - } - else { - *r_icon = ICON_NONE; - } + int icon_fg_id = UI_text_colorid_from_report_type(report->type); + int icon_bg_id = UI_icon_colorid_from_report_type(report->type); if (report->flag & SELECT) { icon_fg_id = TH_INFO_SELECTED; @@ -105,6 +68,8 @@ static enum eTextViewContext_LineFlag report_line_data(TextViewContext *tvc, if (*r_icon != ICON_NONE) { UI_GetThemeColor4ubv(icon_fg_id, r_icon_fg); + /* This theme color is RGB only, so set alpha. */ + r_icon_fg[3] = 255; UI_GetThemeColor4ubv(icon_bg_id, r_icon_bg); return TVC_LINE_FG | TVC_LINE_BG | TVC_LINE_ICON | TVC_LINE_ICON_FG | TVC_LINE_ICON_BG; } diff --git a/source/blender/editors/space_info/info_ops.c b/source/blender/editors/space_info/info_ops.c index 3bd23eab836..0583628be43 100644 --- a/source/blender/editors/space_info/info_ops.c +++ b/source/blender/editors/space_info/info_ops.c @@ -24,7 +24,6 @@ #include #include -#include "DNA_packedFile_types.h" #include "DNA_space_types.h" #include "DNA_windowmanager_types.h" @@ -52,8 +51,6 @@ #include "UI_interface.h" #include "UI_resources.h" -#include "IMB_imbuf_types.h" - #include "RNA_access.h" #include "RNA_define.h" @@ -567,15 +564,7 @@ static int update_reports_display_invoke(bContext *C, wmOperator *UNUSED(op), co } /* set target color based on report type */ - if (report->type & RPT_ERROR_ALL) { - UI_GetThemeColorType3fv(TH_INFO_ERROR, SPACE_INFO, target_col); - } - else if (report->type & RPT_WARNING_ALL) { - UI_GetThemeColorType3fv(TH_INFO_WARNING, SPACE_INFO, target_col); - } - else if (report->type & RPT_INFO_ALL) { - UI_GetThemeColorType3fv(TH_INFO_INFO, SPACE_INFO, target_col); - } + UI_GetThemeColorType3fv(UI_icon_colorid_from_report_type(report->type), SPACE_INFO, target_col); target_col[3] = 0.65f; if (rti->widthfac == 0.0f) { diff --git a/source/blender/editors/space_info/space_info.c b/source/blender/editors/space_info/space_info.c index e2ab139aa07..dfc0abee704 100644 --- a/source/blender/editors/space_info/space_info.c +++ b/source/blender/editors/space_info/space_info.c @@ -29,8 +29,6 @@ #include "BLI_blenlib.h" #include "BLI_utildefines.h" -#include "BLT_translation.h" - #include "BKE_context.h" #include "BKE_screen.h" @@ -43,12 +41,9 @@ #include "RNA_access.h" -#include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" -#include "BLO_readfile.h" -#include "GPU_framebuffer.h" #include "info_intern.h" /* own include */ /* ******************** default callbacks for info space ***************** */ diff --git a/source/blender/editors/space_info/textview.c b/source/blender/editors/space_info/textview.c index ef5d9c0aab0..aef59e89325 100644 --- a/source/blender/editors/space_info/textview.c +++ b/source/blender/editors/space_info/textview.c @@ -225,7 +225,7 @@ static bool textview_draw_string(TextViewDrawState *tds, rgba_uchar_to_float(col, icon_bg); UI_draw_roundbox_corner_set(UI_CNR_ALL); - UI_draw_roundbox_aa( + UI_draw_roundbox_4fv( &(const rctf){ .xmin = hpadding, .xmax = bg_size + hpadding, diff --git a/source/blender/editors/space_nla/nla_buttons.c b/source/blender/editors/space_nla/nla_buttons.c index b82fcf3db47..d019573bf93 100644 --- a/source/blender/editors/space_nla/nla_buttons.c +++ b/source/blender/editors/space_nla/nla_buttons.c @@ -37,6 +37,7 @@ #include "BLT_translation.h" #include "BKE_context.h" +#include "BKE_fcurve.h" #include "BKE_nla.h" #include "BKE_screen.h" @@ -184,6 +185,17 @@ bool nla_panel_context(const bContext *C, return (found != 0); } +NlaStrip *ANIM_nla_context_strip(const bContext *C) +{ + PointerRNA strip_ptr; + if (!nla_panel_context(C, NULL, NULL, &strip_ptr)) { + return NULL; + } + NlaStrip *strip = strip_ptr.data; + + return strip; +} + #if 0 static bool nla_panel_poll(const bContext *C, PanelType *pt) { @@ -535,13 +547,23 @@ static void nla_panel_animated_strip_time(const bContext *C, Panel *panel) uiItemR(layout, &strip_ptr, "strip_time", 0, NULL, ICON_NONE); } +#define NLA_FMODIFIER_PANEL_PREFIX "NLA" + +static void nla_fmodifier_panel_id(void *fcm_link, char *r_name) +{ + FModifier *fcm = (FModifier *)fcm_link; + eFModifier_Types type = fcm->type; + snprintf(r_name, BKE_ST_MAXNAME, "%s_PT_", NLA_FMODIFIER_PANEL_PREFIX); + const FModifierTypeInfo *fmi = get_fmodifier_typeinfo(type); + BLI_snprintf(r_name, BKE_ST_MAXNAME, "%s_PT_%s", NLA_FMODIFIER_PANEL_PREFIX, fmi->name); +} + /* F-Modifiers for active NLA-Strip */ static void nla_panel_modifiers(const bContext *C, Panel *panel) { PointerRNA strip_ptr; NlaStrip *strip; - FModifier *fcm; - uiLayout *col, *row; + uiLayout *row; uiBlock *block; /* check context and also validity of pointer */ @@ -569,12 +591,7 @@ static void nla_panel_modifiers(const bContext *C, Panel *panel) uiItemO(row, "", ICON_PASTEDOWN, "NLA_OT_fmodifier_paste"); } - /* draw each modifier */ - for (fcm = strip->modifiers.first; fcm; fcm = fcm->next) { - col = uiLayoutColumn(panel->layout, true); - - ANIM_uiTemplate_fmodifier_draw(col, strip_ptr.owner_id, &strip->modifiers, fcm); - } + ANIM_fmodifier_panels(C, strip_ptr.owner_id, &strip->modifiers, nla_fmodifier_panel_id); } /* ******************* general ******************************** */ @@ -657,5 +674,9 @@ void nla_buttons_register(ARegionType *art) strcpy(pt->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA); pt->draw = nla_panel_modifiers; pt->poll = nla_strip_eval_panel_poll; + pt->flag = PANEL_TYPE_NO_HEADER; BLI_addtail(&art->paneltypes, pt); + + ANIM_modifier_panels_register_graph_and_NLA( + art, NLA_FMODIFIER_PANEL_PREFIX, nla_strip_eval_panel_poll); } diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c index 031cf7c6376..dd381cc92fb 100644 --- a/source/blender/editors/space_nla/nla_edit.c +++ b/source/blender/editors/space_nla/nla_edit.c @@ -62,14 +62,14 @@ #include "DEG_depsgraph_build.h" #include "UI_interface.h" -#include "UI_resources.h" #include "UI_view2d.h" #include "nla_intern.h" /* own include */ #include "nla_private.h" /* FIXME... maybe this shouldn't be included? */ -/* *********************************************** */ -/* Utilities exported to other places... */ +/* -------------------------------------------------------------------- */ +/** \name Public Utilities + * \{ */ /* Perform validation for blending/extend settings */ void ED_nla_postop_refresh(bAnimContext *ac) @@ -93,14 +93,18 @@ void ED_nla_postop_refresh(bAnimContext *ac) ANIM_animdata_freelist(&anim_data); } -/* *********************************************** */ +/** \} */ + /* 'Special' Editing */ -/* ******************** Tweak-Mode Operators ***************************** */ /* 'Tweak mode' allows the action referenced by the active NLA-strip to be edited * as if it were the normal Active-Action of its AnimData block. */ +/* -------------------------------------------------------------------- */ +/** \name Enable Tweak-Mode Operator + * \{ */ + static int nlaedit_enable_tweakmode_exec(bContext *C, wmOperator *op) { bAnimContext ac; @@ -196,7 +200,11 @@ void NLA_OT_tweakmode_enter(wmOperatorType *ot) RNA_def_property_flag(prop, PROP_SKIP_SAVE); } -/* ------------- */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Disable Tweak-Mode Operator + * \{ */ /* NLA Editor internal API function for exiting tweakmode */ bool nlaedit_disable_tweakmode(bAnimContext *ac, bool do_solo) @@ -298,10 +306,13 @@ void NLA_OT_tweakmode_exit(wmOperatorType *ot) RNA_def_property_flag(prop, PROP_SKIP_SAVE); } -/* *********************************************** */ +/** \} */ + /* NLA Strips Range Stuff */ -/* *************************** Calculate Range ************************** */ +/* -------------------------------------------------------------------- */ +/** \name Calculate NLA Strip Range + * \{ */ /* Get the min/max strip extents */ static void get_nlastrip_extents(bAnimContext *ac, float *min, float *max, const bool only_sel) @@ -355,7 +366,11 @@ static void get_nlastrip_extents(bAnimContext *ac, float *min, float *max, const } } -/* ****************** Automatic Preview-Range Operator ****************** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Automatic Preview-Range Operator + * \{ */ static int nlaedit_previewrange_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -402,16 +417,20 @@ void NLA_OT_previewrange_set(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ****************** View-All Operator ****************** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name View-All Operator + * \{ */ /** * Find the extents of the active channel * - * \param[out] min: Bottom y-extent of channel. - * \param[out] max: Top y-extent of channel. - * \return Success of finding a selected channel + * \param r_min: Bottom y-extent of channel. + * \param r_max: Top y-extent of channel. + * \return Success of finding a selected channel. */ -static bool nla_channels_get_selected_extents(bAnimContext *ac, float *min, float *max) +static bool nla_channels_get_selected_extents(bAnimContext *ac, float *r_min, float *r_max) { ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; @@ -435,8 +454,8 @@ static bool nla_channels_get_selected_extents(bAnimContext *ac, float *min, floa if (acf && acf->has_setting(ac, ale, ACHANNEL_SETTING_SELECT) && ANIM_channel_setting_get(ac, ale, ACHANNEL_SETTING_SELECT)) { /* update best estimate */ - *min = ymax - NLACHANNEL_HEIGHT(snla); - *max = ymax; + *r_min = ymax - NLACHANNEL_HEIGHT(snla); + *r_max = ymax; /* is this high enough priority yet? */ found = acf->channel_role; @@ -550,7 +569,11 @@ void NLA_OT_view_selected(wmOperatorType *ot) ot->flag = 0; } -/* *********************************************** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name View-Frame Operator + * \{ */ static int nlaedit_viewframe_exec(bContext *C, wmOperator *op) { @@ -574,12 +597,16 @@ void NLA_OT_view_frame(wmOperatorType *ot) ot->flag = 0; } -/* *********************************************** */ +/** \} */ + /* NLA Editing Operations (Constructive/Destructive) */ -/* ******************** Add Action-Clip Operator ***************************** */ -/* Add a new Action-Clip strip to the active track - * (or the active block if no space in the track) */ +/* -------------------------------------------------------------------- */ +/** \name Add Action-Clip Operator + * + * Add a new Action-Clip strip to the active track + * (or the active block if no space in the track). + * \{ */ /* add the specified action as new strip */ static int nlaedit_add_actionclip_exec(bContext *C, wmOperator *op) @@ -725,8 +752,13 @@ void NLA_OT_actionclip_add(wmOperatorType *ot) ot->prop = prop; } -/* ******************** Add Transition Operator ***************************** */ -/* Add a new transition strip between selected strips */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Add Transition Operator + * + * Add a new transition strip between selected strips. + * \{ */ static int nlaedit_add_transition_exec(bContext *C, wmOperator *op) { @@ -850,8 +882,11 @@ void NLA_OT_transition_add(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Add Sound Clip Operator ***************************** */ -/* Add a new sound clip */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Add Sound Clip Operator + * \{ */ static int nlaedit_add_sound_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -941,8 +976,13 @@ void NLA_OT_soundclip_add(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Add Meta-Strip Operator ***************************** */ -/* Add new meta-strips incorporating the selected strips */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Add Meta-Strip Operator + * + * Add new meta-strips incorporating the selected strips. + * \{ */ /* add the specified action as new strip */ static int nlaedit_add_meta_exec(bContext *C, wmOperator *UNUSED(op)) @@ -1013,8 +1053,13 @@ void NLA_OT_meta_add(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Remove Meta-Strip Operator ***************************** */ -/* Separate out the strips held by the selected meta-strips */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Remove Meta-Strip Operator + * + * Separate out the strips held by the selected meta-strips. + * \{ */ static int nlaedit_remove_meta_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -1074,10 +1119,14 @@ void NLA_OT_meta_remove(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Duplicate Strips Operator ************************** */ -/* Duplicates the selected NLA-Strips, putting them on new tracks above the one - * the originals were housed in. - */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Duplicate Strips Operator + * + * Duplicates the selected NLA-Strips, + * putting them on new tracks above the one the originals were housed in. + * \{ */ static int nlaedit_duplicate_exec(bContext *C, wmOperator *op) { @@ -1201,8 +1250,13 @@ void NLA_OT_duplicate(wmOperatorType *ot) RNA_def_enum(ot->srna, "mode", rna_enum_transform_mode_types, TFM_TRANSLATION, "Mode", ""); } -/* ******************** Delete Strips Operator ***************************** */ -/* Deletes the selected NLA-Strips */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Delete Strips Operator + * + * Deletes the selected NLA-Strips. + * \{ */ static int nlaedit_delete_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -1281,11 +1335,17 @@ void NLA_OT_delete(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Split Strips Operator ***************************** */ -/* Splits the selected NLA-Strips into two strips at the midpoint of the strip */ -/* TODO's? - * - multiple splits - * - variable-length splits? */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Split Strips Operator + * + * Splits the selected NLA-Strips into two strips at the midpoint of the strip. + * + * TODO's? + * - multiple splits + * - variable-length splits? + * \{ */ /* split a given Action-Clip strip */ static void nlaedit_split_strip_actclip( @@ -1436,11 +1496,15 @@ void NLA_OT_split(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* *********************************************** */ +/** \} */ + /* NLA Editing Operations (Modifying) */ -/* ******************** Toggle Muting Operator ************************** */ -/* Toggles whether strips are muted or not */ +/* -------------------------------------------------------------------- */ +/** \name Toggle Muting Operator + * + * Toggles whether strips are muted or not. + * \{ */ static int nlaedit_toggle_mute_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -1503,8 +1567,13 @@ void NLA_OT_mute_toggle(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Swap Strips Operator ************************** */ -/* Tries to exchange strips within their owner tracks */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Swap Strips Operator + * + * Tries to exchange strips within their owner tracks. + * \{ */ static int nlaedit_swap_exec(bContext *C, wmOperator *op) { @@ -1680,8 +1749,13 @@ void NLA_OT_swap(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Move Strips Up Operator ************************** */ -/* Tries to move the selected strips into the track above if possible. */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Move Strips Up Operator + * + * Tries to move the selected strips into the track above if possible. + * \{ */ static int nlaedit_move_up_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -1766,8 +1840,13 @@ void NLA_OT_move_up(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Move Strips Down Operator ************************** */ -/* Tries to move the selected strips into the track above if possible. */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Move Strips Down Operator + * + * Tries to move the selected strips into the track above if possible. + * \{ */ static int nlaedit_move_down_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -1852,8 +1931,13 @@ void NLA_OT_move_down(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Sync Action Length Operator ***************************** */ -/* Recalculate the extents of the action ranges used for the selected strips */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Sync Action Length Operator + * + * Recalculate the extents of the action ranges used for the selected strips. + * \{ */ static int nlaedit_sync_actlen_exec(bContext *C, wmOperator *op) { @@ -1941,8 +2025,13 @@ void NLA_OT_action_sync_length(wmOperatorType *ot) "Only sync the active length for the active strip"); } -/* ******************** Make Single User ********************************* */ -/* Ensure that each strip has its own action */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Make Single User + * + * Ensure that each strip has its own action. + * \{ */ static int nlaedit_make_single_user_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -2027,8 +2116,13 @@ void NLA_OT_make_single_user(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Apply Scale Operator ***************************** */ -/* Reset the scaling of the selected strips to 1.0f */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Apply Scale Operator + * + * Reset the scaling of the selected strips to 1.0f. + * \{ */ /* apply scaling to keyframe */ static short bezt_apply_nlamapping(KeyframeEditData *ked, BezTriple *bezt) @@ -2140,8 +2234,13 @@ void NLA_OT_apply_scale(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Clear Scale Operator ***************************** */ -/* Reset the scaling of the selected strips to 1.0f */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Clear Scale Operator + * + * Reset the scaling of the selected strips to 1.0f. + * \{ */ static int nlaedit_clear_scale_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -2205,8 +2304,13 @@ void NLA_OT_clear_scale(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Snap Strips Operator ************************** */ -/* Moves the start-point of the selected strips to the specified places */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Snap Strips Operator + * + * Moves the start-point of the selected strips to the specified places. + * \{ */ /* defines for snap keyframes tool */ static const EnumPropertyItem prop_nlaedit_snap_types[] = { @@ -2367,10 +2471,13 @@ void NLA_OT_snap(wmOperatorType *ot) ot->prop = RNA_def_enum(ot->srna, "type", prop_nlaedit_snap_types, 0, "Type", ""); } -/* *********************************************** */ +/** \} */ + /* NLA Modifiers */ -/* ******************** Add F-Modifier Operator *********************** */ +/* -------------------------------------------------------------------- */ +/** \name Add F-Modifier Operator + * \{ */ static const EnumPropertyItem *nla_fmodifier_itemf(bContext *C, PointerRNA *UNUSED(ptr), @@ -2516,7 +2623,11 @@ void NLA_OT_fmodifier_add(wmOperatorType *ot) "Only add a F-Modifier of the specified type to the active strip"); } -/* ******************** Copy F-Modifiers Operator *********************** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Copy F-Modifiers Operator + * \{ */ static int nla_fmodifier_copy_exec(bContext *C, wmOperator *op) { @@ -2591,7 +2702,11 @@ void NLA_OT_fmodifier_copy(wmOperatorType *ot) #endif } -/* ******************** Paste F-Modifiers Operator *********************** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Paste F-Modifiers Operator + * \{ */ static int nla_fmodifier_paste_exec(bContext *C, wmOperator *op) { @@ -2683,4 +2798,4 @@ void NLA_OT_fmodifier_paste(wmOperatorType *ot) "Replace existing F-Modifiers, instead of just appending to the end of the existing list"); } -/* *********************************************** */ +/** \} */ diff --git a/source/blender/editors/space_nla/nla_ops.c b/source/blender/editors/space_nla/nla_ops.c index 2e32c496170..631dc2e550c 100644 --- a/source/blender/editors/space_nla/nla_ops.c +++ b/source/blender/editors/space_nla/nla_ops.c @@ -30,16 +30,11 @@ #include "BKE_screen.h" #include "ED_anim_api.h" -#include "ED_markers.h" #include "ED_screen.h" -#include "ED_select_utils.h" -#include "ED_transform.h" #include "WM_api.h" #include "WM_types.h" -#include "RNA_access.h" - #include "nla_intern.h" /* own include */ /* ************************** poll callbacks for operators **********************************/ diff --git a/source/blender/editors/space_nla/space_nla.c b/source/blender/editors/space_nla/space_nla.c index efe851c64ed..011cd7e2651 100644 --- a/source/blender/editors/space_nla/space_nla.c +++ b/source/blender/editors/space_nla/space_nla.c @@ -24,7 +24,6 @@ #include #include -#include "DNA_anim_types.h" #include "DNA_collection_types.h" #include "DNA_scene_types.h" @@ -52,7 +51,6 @@ #include "UI_resources.h" #include "UI_view2d.h" -#include "GPU_framebuffer.h" #include "nla_intern.h" /* own include */ /* ******************** default callbacks for nla space ***************** */ diff --git a/source/blender/editors/space_node/CMakeLists.txt b/source/blender/editors/space_node/CMakeLists.txt index f4a3bb96aeb..c640b076ba4 100644 --- a/source/blender/editors/space_node/CMakeLists.txt +++ b/source/blender/editors/space_node/CMakeLists.txt @@ -40,7 +40,7 @@ set(SRC drawnode.c node_add.c node_buttons.c - node_draw.c + node_draw.cc node_edit.c node_gizmo.c node_group.c diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 132dcd8a9fb..82a1cd818c9 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -3126,393 +3126,6 @@ static void node_texture_set_butfunc(bNodeType *ntype) } } -/* ****************** BUTTON CALLBACKS FOR GEOMETRY NODES ***************** */ - -static void node_geometry_buts_boolean_math(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) -{ - uiItemR(layout, ptr, "operation", DEFAULT_FLAGS, "", ICON_NONE); -} - -static void node_geometry_buts_attribute_compare(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "operation", DEFAULT_FLAGS, "", ICON_NONE); - uiItemR(layout, ptr, "input_type_a", DEFAULT_FLAGS, IFACE_("Type A"), ICON_NONE); - uiItemR(layout, ptr, "input_type_b", DEFAULT_FLAGS, IFACE_("Type B"), ICON_NONE); -} - -static void node_geometry_buts_subdivision_surface(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *UNUSED(ptr)) -{ -#ifndef WITH_OPENSUBDIV - uiItemL(layout, IFACE_("Disabled, built without OpenSubdiv"), ICON_ERROR); -#else - UNUSED_VARS(layout); -#endif -} - -static void node_geometry_buts_triangulate(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) -{ - uiItemR(layout, ptr, "quad_method", DEFAULT_FLAGS, "", ICON_NONE); - uiItemR(layout, ptr, "ngon_method", DEFAULT_FLAGS, "", ICON_NONE); -} - -static void node_geometry_buts_random_attribute(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "data_type", DEFAULT_FLAGS, "", ICON_NONE); -} - -static bool node_attribute_math_operation_use_input_b(const NodeMathOperation operation) -{ - switch (operation) { - case NODE_MATH_ADD: - case NODE_MATH_SUBTRACT: - case NODE_MATH_MULTIPLY: - case NODE_MATH_DIVIDE: - case NODE_MATH_POWER: - case NODE_MATH_LOGARITHM: - case NODE_MATH_MINIMUM: - case NODE_MATH_MAXIMUM: - case NODE_MATH_LESS_THAN: - case NODE_MATH_GREATER_THAN: - case NODE_MATH_MODULO: - case NODE_MATH_ARCTAN2: - case NODE_MATH_SNAP: - case NODE_MATH_WRAP: - case NODE_MATH_COMPARE: - case NODE_MATH_MULTIPLY_ADD: - case NODE_MATH_PINGPONG: - case NODE_MATH_SMOOTH_MIN: - case NODE_MATH_SMOOTH_MAX: - return true; - case NODE_MATH_SINE: - case NODE_MATH_COSINE: - case NODE_MATH_TANGENT: - case NODE_MATH_ARCSINE: - case NODE_MATH_ARCCOSINE: - case NODE_MATH_ARCTANGENT: - case NODE_MATH_ROUND: - case NODE_MATH_ABSOLUTE: - case NODE_MATH_FLOOR: - case NODE_MATH_CEIL: - case NODE_MATH_FRACTION: - case NODE_MATH_SQRT: - case NODE_MATH_INV_SQRT: - case NODE_MATH_SIGN: - case NODE_MATH_EXPONENT: - case NODE_MATH_RADIANS: - case NODE_MATH_DEGREES: - case NODE_MATH_SINH: - case NODE_MATH_COSH: - case NODE_MATH_TANH: - case NODE_MATH_TRUNC: - return false; - } - BLI_assert(false); - return false; -} - -static void node_geometry_buts_attribute_math(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - bNode *node = (bNode *)ptr->data; - NodeAttributeMath *node_storage = (NodeAttributeMath *)node->storage; - NodeMathOperation operation = (NodeMathOperation)node_storage->operation; - - uiItemR(layout, ptr, "operation", DEFAULT_FLAGS, "", ICON_NONE); - uiItemR(layout, ptr, "input_type_a", DEFAULT_FLAGS, IFACE_("Type A"), ICON_NONE); - - /* These "use input b / c" checks are copied from the node's code. - * They could be de-duplicated if the drawing code was moved to the node's file. */ - if (node_attribute_math_operation_use_input_b(operation)) { - uiItemR(layout, ptr, "input_type_b", DEFAULT_FLAGS, IFACE_("Type B"), ICON_NONE); - } - if (ELEM(operation, - NODE_MATH_MULTIPLY_ADD, - NODE_MATH_SMOOTH_MIN, - NODE_MATH_SMOOTH_MAX, - NODE_MATH_WRAP, - NODE_MATH_COMPARE)) { - uiItemR(layout, ptr, "input_type_c", DEFAULT_FLAGS, IFACE_("Type C"), ICON_NONE); - } -} - -static void node_geometry_buts_attribute_vector_math(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - bNode *node = (bNode *)ptr->data; - NodeAttributeVectorMath *node_storage = (NodeAttributeVectorMath *)node->storage; - - uiItemR(layout, ptr, "operation", DEFAULT_FLAGS, "", ICON_NONE); - uiItemR(layout, ptr, "input_type_a", DEFAULT_FLAGS, IFACE_("Type A"), ICON_NONE); - - /* These "use input b / c" checks are copied from the node's code. - * They could be de-duplicated if the drawing code was moved to the node's file. */ - if (!ELEM(node_storage->operation, - NODE_VECTOR_MATH_NORMALIZE, - NODE_VECTOR_MATH_FLOOR, - NODE_VECTOR_MATH_CEIL, - NODE_VECTOR_MATH_FRACTION, - NODE_VECTOR_MATH_ABSOLUTE, - NODE_VECTOR_MATH_SINE, - NODE_VECTOR_MATH_COSINE, - NODE_VECTOR_MATH_TANGENT, - NODE_VECTOR_MATH_LENGTH)) { - uiItemR(layout, ptr, "input_type_b", DEFAULT_FLAGS, IFACE_("Type B"), ICON_NONE); - } - if (ELEM(node_storage->operation, NODE_VECTOR_MATH_WRAP)) { - uiItemR(layout, ptr, "input_type_c", DEFAULT_FLAGS, IFACE_("Type C"), ICON_NONE); - } -} - -static void node_geometry_buts_point_instance(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "instance_type", DEFAULT_FLAGS | UI_ITEM_R_EXPAND, NULL, ICON_NONE); - if (RNA_enum_get(ptr, "instance_type") == GEO_NODE_POINT_INSTANCE_TYPE_COLLECTION) { - uiItemR(layout, ptr, "use_whole_collection", DEFAULT_FLAGS, NULL, ICON_NONE); - } -} - -static void node_geometry_buts_attribute_fill(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "data_type", DEFAULT_FLAGS, "", ICON_NONE); - // uiItemR(layout, ptr, "domain", DEFAULT_FLAGS, "", ICON_NONE); -} - -static void node_geometry_buts_attribute_mix(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "blend_type", DEFAULT_FLAGS, "", ICON_NONE); - uiLayout *col = uiLayoutColumn(layout, false); - uiItemR(col, ptr, "input_type_factor", DEFAULT_FLAGS, IFACE_("Factor"), ICON_NONE); - uiItemR(col, ptr, "input_type_a", DEFAULT_FLAGS, IFACE_("A"), ICON_NONE); - uiItemR(col, ptr, "input_type_b", DEFAULT_FLAGS, IFACE_("B"), ICON_NONE); -} - -static void node_geometry_buts_attribute_point_distribute(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "distribute_method", DEFAULT_FLAGS, "", ICON_NONE); -} - -static void node_geometry_buts_attribute_color_ramp(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiTemplateColorRamp(layout, ptr, "color_ramp", 0); -} - -static void node_geometry_buts_point_rotate(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) -{ - NodeGeometryRotatePoints *storage = (NodeGeometryRotatePoints *)((bNode *)ptr->data)->storage; - - uiItemR(layout, ptr, "type", DEFAULT_FLAGS | UI_ITEM_R_EXPAND, NULL, ICON_NONE); - uiItemR(layout, ptr, "space", DEFAULT_FLAGS | UI_ITEM_R_EXPAND, NULL, ICON_NONE); - - uiLayout *col = uiLayoutColumn(layout, false); - if (storage->type == GEO_NODE_POINT_ROTATE_TYPE_AXIS_ANGLE) { - uiItemR(col, ptr, "input_type_axis", DEFAULT_FLAGS, IFACE_("Axis"), ICON_NONE); - uiItemR(col, ptr, "input_type_angle", DEFAULT_FLAGS, IFACE_("Angle"), ICON_NONE); - } - else { - uiItemR(col, ptr, "input_type_rotation", DEFAULT_FLAGS, IFACE_("Rotation"), ICON_NONE); - } -} - -static void node_geometry_buts_align_rotation_to_vector(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "axis", DEFAULT_FLAGS | UI_ITEM_R_EXPAND, NULL, ICON_NONE); - uiItemR(layout, ptr, "pivot_axis", DEFAULT_FLAGS, IFACE_("Pivot"), ICON_NONE); - uiLayout *col = uiLayoutColumn(layout, false); - uiItemR(col, ptr, "input_type_factor", DEFAULT_FLAGS, IFACE_("Factor"), ICON_NONE); - uiItemR(col, ptr, "input_type_vector", DEFAULT_FLAGS, IFACE_("Vector"), ICON_NONE); -} -static void node_geometry_buts_point_translate(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "input_type", DEFAULT_FLAGS, IFACE_("Type"), ICON_NONE); -} - -static void node_geometry_buts_point_scale(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) -{ - uiItemR(layout, ptr, "input_type", DEFAULT_FLAGS, IFACE_("Type"), ICON_NONE); -} - -static void node_geometry_buts_object_info(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) -{ - uiItemR(layout, ptr, "transform_space", UI_ITEM_R_EXPAND, NULL, ICON_NONE); -} - -static void node_geometry_buts_attribute_sample_texture(uiLayout *layout, - bContext *C, - PointerRNA *ptr) -{ - uiTemplateID(layout, C, ptr, "texture", "texture.new", NULL, NULL, 0, ICON_NONE, NULL); -} - -static void node_geometry_buts_points_to_volume(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiLayoutSetPropSep(layout, true); - uiLayoutSetPropDecorate(layout, false); - uiItemR(layout, ptr, "resolution_mode", DEFAULT_FLAGS, IFACE_("Resolution"), ICON_NONE); - uiItemR(layout, ptr, "input_type_radius", DEFAULT_FLAGS, IFACE_("Radius"), ICON_NONE); -} - -static void node_geometry_buts_collection_info(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "transform_space", UI_ITEM_R_EXPAND, NULL, ICON_NONE); -} - -static void node_geometry_buts_attribute_proximity(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "target_geometry_element", DEFAULT_FLAGS, "", ICON_NONE); -} - -static void node_geometry_buts_volume_to_mesh(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiLayoutSetPropSep(layout, true); - uiLayoutSetPropDecorate(layout, false); - uiItemR(layout, ptr, "resolution_mode", DEFAULT_FLAGS, IFACE_("Resolution"), ICON_NONE); -} - -static void node_geometry_set_butfunc(bNodeType *ntype) -{ - switch (ntype->type) { - case GEO_NODE_BOOLEAN: - ntype->draw_buttons = node_geometry_buts_boolean_math; - break; - case GEO_NODE_SUBDIVISION_SURFACE: - ntype->draw_buttons = node_geometry_buts_subdivision_surface; - break; - case GEO_NODE_TRIANGULATE: - ntype->draw_buttons = node_geometry_buts_triangulate; - break; - case GEO_NODE_ATTRIBUTE_RANDOMIZE: - ntype->draw_buttons = node_geometry_buts_random_attribute; - break; - case GEO_NODE_ATTRIBUTE_MATH: - ntype->draw_buttons = node_geometry_buts_attribute_math; - break; - case GEO_NODE_ATTRIBUTE_COMPARE: - ntype->draw_buttons = node_geometry_buts_attribute_compare; - break; - case GEO_NODE_POINT_INSTANCE: - ntype->draw_buttons = node_geometry_buts_point_instance; - break; - case GEO_NODE_ATTRIBUTE_FILL: - ntype->draw_buttons = node_geometry_buts_attribute_fill; - break; - case GEO_NODE_ATTRIBUTE_MIX: - ntype->draw_buttons = node_geometry_buts_attribute_mix; - break; - case GEO_NODE_ATTRIBUTE_VECTOR_MATH: - ntype->draw_buttons = node_geometry_buts_attribute_vector_math; - break; - case GEO_NODE_POINT_DISTRIBUTE: - ntype->draw_buttons = node_geometry_buts_attribute_point_distribute; - break; - case GEO_NODE_ATTRIBUTE_COLOR_RAMP: - ntype->draw_buttons = node_geometry_buts_attribute_color_ramp; - break; - case GEO_NODE_POINT_ROTATE: - ntype->draw_buttons = node_geometry_buts_point_rotate; - break; - case GEO_NODE_ALIGN_ROTATION_TO_VECTOR: - ntype->draw_buttons = node_geometry_buts_align_rotation_to_vector; - break; - case GEO_NODE_POINT_TRANSLATE: - ntype->draw_buttons = node_geometry_buts_point_translate; - break; - case GEO_NODE_POINT_SCALE: - ntype->draw_buttons = node_geometry_buts_point_scale; - break; - case GEO_NODE_OBJECT_INFO: - ntype->draw_buttons = node_geometry_buts_object_info; - break; - case GEO_NODE_ATTRIBUTE_SAMPLE_TEXTURE: - ntype->draw_buttons = node_geometry_buts_attribute_sample_texture; - break; - case GEO_NODE_POINTS_TO_VOLUME: - ntype->draw_buttons = node_geometry_buts_points_to_volume; - break; - case GEO_NODE_COLLECTION_INFO: - ntype->draw_buttons = node_geometry_buts_collection_info; - break; - case GEO_NODE_ATTRIBUTE_PROXIMITY: - ntype->draw_buttons = node_geometry_buts_attribute_proximity; - break; - case GEO_NODE_VOLUME_TO_MESH: - ntype->draw_buttons = node_geometry_buts_volume_to_mesh; - break; - } -} - -/* ****************** BUTTON CALLBACKS FOR FUNCTION NODES ***************** */ - -static void node_function_buts_boolean_math(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) -{ - uiItemR(layout, ptr, "operation", DEFAULT_FLAGS, "", ICON_NONE); -} - -static void node_function_buts_float_compare(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "operation", DEFAULT_FLAGS, "", ICON_NONE); -} - -static void node_function_buts_switch(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) -{ - uiItemR(layout, ptr, "data_type", DEFAULT_FLAGS, "", ICON_NONE); -} - -static void node_function_buts_input_vector(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) -{ - uiLayout *col = uiLayoutColumn(layout, true); - uiItemR(col, ptr, "vector", UI_ITEM_R_EXPAND, "", ICON_NONE); -} - -static void node_function_set_butfunc(bNodeType *ntype) -{ - switch (ntype->type) { - case FN_NODE_BOOLEAN_MATH: - ntype->draw_buttons = node_function_buts_boolean_math; - break; - case FN_NODE_FLOAT_COMPARE: - ntype->draw_buttons = node_function_buts_float_compare; - break; - case FN_NODE_SWITCH: - ntype->draw_buttons = node_function_buts_switch; - break; - case FN_NODE_INPUT_VECTOR: - ntype->draw_buttons = node_function_buts_input_vector; - break; - } -} - /* ****** init draw callbacks for all tree types, only called in usiblender.c, once ************ */ static void node_property_update_default(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr) @@ -3612,8 +3225,6 @@ void ED_node_init_butfuncs(void) ntype->draw_nodetype_prepare = node_update_default; ntype->select_area_func = node_select_area_default; ntype->tweak_area_func = node_tweak_area_default; - ntype->draw_buttons = NULL; - ntype->draw_buttons_ex = NULL; ntype->resize_area_func = node_resize_area_default; node_common_set_butfunc(ntype); @@ -3621,8 +3232,6 @@ void ED_node_init_butfuncs(void) node_composit_set_butfunc(ntype); node_shader_set_butfunc(ntype); node_texture_set_butfunc(ntype); - node_geometry_set_butfunc(ntype); - node_function_set_butfunc(ntype); /* define update callbacks for socket properties */ node_template_properties_update(ntype); @@ -3652,6 +3261,8 @@ void ED_init_custom_node_socket_type(bNodeSocketType *stype) stype->draw = node_socket_button_label; } +static const float virtual_node_socket_color[4] = {0.2, 0.2, 0.2, 1.0}; + /* maps standard socket integer type to a color */ static const float std_node_socket_colors[][4] = { {0.63, 0.63, 0.63, 1.0}, /* SOCK_FLOAT */ @@ -3852,8 +3463,7 @@ static void node_socket_virtual_draw_color(bContext *UNUSED(C), PointerRNA *UNUSED(node_ptr), float *r_color) { - /* alpha = 0, empty circle */ - zero_v4(r_color); + copy_v4_v4(r_color, virtual_node_socket_color); } void ED_init_node_socket_type_virtual(bNodeSocketType *stype) @@ -3951,10 +3561,10 @@ void draw_nodespace_back_pix(const bContext *C, } /* return quadratic beziers points for a given nodelink and clip if v2d is not NULL. */ -static bool node_link_bezier_handles(const View2D *v2d, - const SpaceNode *snode, - const bNodeLink *link, - float vec[4][2]) +bool node_link_bezier_handles(const View2D *v2d, + const SpaceNode *snode, + const bNodeLink *link, + float vec[4][2]) { float cursor[2] = {0.0f, 0.0f}; @@ -3982,6 +3592,9 @@ static bool node_link_bezier_handles(const View2D *v2d, if (link->tosock) { vec[3][0] = link->tosock->locx; vec[3][1] = link->tosock->locy; + if (!(link->tonode->flag & NODE_HIDDEN) && link->tosock->flag & SOCK_MULTI_INPUT) { + node_link_calculate_multi_input_position(link, vec[3]); + } toreroute = (link->tonode && link->tonode->type == NODE_REROUTE); } else { @@ -4293,7 +3906,7 @@ void node_draw_link_bezier(const View2D *v2d, int th_col3) { float vec[4][2]; - + const bool highlighted = link->flag & NODE_LINK_TEMP_HIGHLIGHT; if (node_link_bezier_handles(v2d, snode, link, vec)) { int drawarrow = ((link->tonode && (link->tonode->type == NODE_REROUTE)) && (link->fromnode && (link->fromnode->type == NODE_REROUTE))); @@ -4302,7 +3915,7 @@ void node_draw_link_bezier(const View2D *v2d, nodelink_batch_init(); } - if (g_batch_link.enabled) { + if (g_batch_link.enabled && !highlighted) { /* Add link to batch. */ nodelink_batch_add_link( snode, vec[0], vec[1], vec[2], vec[3], th_col1, th_col2, th_col3, drawarrow); @@ -4316,6 +3929,12 @@ void node_draw_link_bezier(const View2D *v2d, UI_GetThemeColor4fv(th_col1, colors[1]); UI_GetThemeColor4fv(th_col2, colors[2]); + if (highlighted) { + float link_preselection_highlight_color[4]; + UI_GetThemeColor4fv(TH_SELECT, link_preselection_highlight_color); + copy_v4_v4(colors[2], link_preselection_highlight_color); + } + GPUBatch *batch = g_batch_link.batch_single; GPU_batch_program_set_builtin(batch, GPU_SHADER_2D_NODELINK); GPU_batch_uniform_2fv_array(batch, "bezierPts", 4, vec); diff --git a/source/blender/editors/space_node/node_add.c b/source/blender/editors/space_node/node_add.c index e665f7b1d52..e0de2393917 100644 --- a/source/blender/editors/space_node/node_add.c +++ b/source/blender/editors/space_node/node_add.c @@ -54,6 +54,10 @@ #include "node_intern.h" /* own include */ +/* -------------------------------------------------------------------- */ +/** \name Utilities + * \{ */ + /** * XXX Does some additional initialization on top of #nodeAddNode * Can be used with both custom and static nodes, @@ -93,7 +97,12 @@ bNode *node_add_node(const bContext *C, const char *idname, int type, float locx return node; } -/* ********************** Add reroute operator ***************** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Add Reroute Operator + * \{ */ + static bool add_reroute_intersect_check(bNodeLink *link, float mcoords[][2], int tot, @@ -309,7 +318,108 @@ void NODE_OT_add_reroute(wmOperatorType *ot) RNA_def_int(ot->srna, "cursor", WM_CURSOR_CROSS, 0, INT_MAX, "Cursor", "", 0, INT_MAX); } -/* ****************** Add File Node Operator ******************* */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Add Node Group Operator + * \{ */ + +static bNodeTree *node_add_group_get_and_poll_group_node_tree(Main *bmain, + wmOperator *op, + bNodeTree *ntree) +{ + char name[MAX_ID_NAME - 2]; + RNA_string_get(op->ptr, "name", name); + + bNodeTree *node_group = (bNodeTree *)BKE_libblock_find_name(bmain, ID_NT, name); + if (!node_group) { + return NULL; + } + if ((node_group->type != ntree->type) || !nodeGroupPoll(ntree, node_group)) { + return NULL; + } + + return node_group; +} + +static int node_add_group_exec(bContext *C, wmOperator *op) +{ + Main *bmain = CTX_data_main(C); + SpaceNode *snode = CTX_wm_space_node(C); + bNodeTree *ntree = snode->edittree; + bNodeTree *node_group; + + if (!(node_group = node_add_group_get_and_poll_group_node_tree(bmain, op, ntree))) { + return OPERATOR_CANCELLED; + } + + ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C)); + + bNode *group_node = node_add_node(C, + node_group_idname(C), + (node_group->type == NTREE_CUSTOM) ? NODE_CUSTOM_GROUP : + NODE_GROUP, + snode->runtime->cursor[0], + snode->runtime->cursor[1]); + if (!group_node) { + BKE_report(op->reports, RPT_WARNING, "Could not add node group"); + return OPERATOR_CANCELLED; + } + + group_node->id = &node_group->id; + id_us_plus(group_node->id); + + nodeSetActive(ntree, group_node); + ntreeUpdateTree(bmain, node_group); + ntreeUpdateTree(bmain, ntree); + + snode_notify(C, snode); + snode_dag_update(C, snode); + + return OPERATOR_FINISHED; +} + +static int node_add_group_invoke(bContext *C, wmOperator *op, const wmEvent *event) +{ + ARegion *region = CTX_wm_region(C); + SpaceNode *snode = CTX_wm_space_node(C); + + /* Convert mouse coordinates to v2d space. */ + UI_view2d_region_to_view(®ion->v2d, + event->mval[0], + event->mval[1], + &snode->runtime->cursor[0], + &snode->runtime->cursor[1]); + + snode->runtime->cursor[0] /= UI_DPI_FAC; + snode->runtime->cursor[1] /= UI_DPI_FAC; + + return node_add_group_exec(C, op); +} + +void NODE_OT_add_group(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Add Node Group"; + ot->description = "Add an existing node group to the current node editor"; + ot->idname = "NODE_OT_add_group"; + + /* callbacks */ + ot->exec = node_add_group_exec; + ot->invoke = node_add_group_invoke; + ot->poll = ED_operator_node_editable; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; + + RNA_def_string(ot->srna, "name", "Mask", MAX_ID_NAME - 2, "Name", "Data-block name to assign"); +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Add File Node Operator + * \{ */ static bool node_add_file_poll(bContext *C) { @@ -417,7 +527,11 @@ void NODE_OT_add_file(wmOperatorType *ot) RNA_def_string(ot->srna, "name", "Image", MAX_ID_NAME - 2, "Name", "Data-block name to assign"); } -/* ****************** Add Mask Node Operator ******************* */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Add Mask Node Operator + * \{ */ static bool node_add_mask_poll(bContext *C) { @@ -478,7 +592,11 @@ void NODE_OT_add_mask(wmOperatorType *ot) RNA_def_string(ot->srna, "name", "Mask", MAX_ID_NAME - 2, "Name", "Data-block name to assign"); } -/********************** New node tree operator *********************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name New Node Tree Operator + * \{ */ static int new_node_tree_exec(bContext *C, wmOperator *op) { @@ -566,3 +684,5 @@ void NODE_OT_new_node_tree(wmOperatorType *ot) RNA_def_enum_funcs(prop, new_node_tree_type_itemf); RNA_def_string(ot->srna, "name", "NodeTree", MAX_ID_NAME - 2, "Name", ""); } + +/** \} */ diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c index c9a0c827a09..fa4d6997c83 100644 --- a/source/blender/editors/space_node/node_buttons.c +++ b/source/blender/editors/space_node/node_buttons.c @@ -40,7 +40,6 @@ #include "RNA_access.h" -#include "ED_gpencil.h" #include "ED_screen.h" #include "UI_resources.h" diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.cc similarity index 73% rename from source/blender/editors/space_node/node_draw.c rename to source/blender/editors/space_node/node_draw.cc index 4dd945c4cf1..162f3878f7e 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.cc @@ -22,9 +22,12 @@ * \brief higher level node drawing for the node editor. */ +#include "MEM_guardedalloc.h" + #include "DNA_light_types.h" #include "DNA_linestyle_types.h" #include "DNA_material_types.h" +#include "DNA_modifier_types.h" #include "DNA_node_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" @@ -32,7 +35,11 @@ #include "DNA_world_types.h" #include "BLI_blenlib.h" +#include "BLI_map.hh" #include "BLI_math.h" +#include "BLI_span.hh" +#include "BLI_string_ref.hh" +#include "BLI_vector.hh" #include "BLT_translation.h" @@ -40,6 +47,8 @@ #include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_node.h" +#include "BKE_node_ui_storage.hh" +#include "BKE_object.h" #include "DEG_depsgraph.h" @@ -72,9 +81,14 @@ # include "COM_compositor.h" #endif +using blender::Span; +using blender::Vector; + +extern "C" { /* XXX interface.h */ extern void ui_draw_dropshadow( const rctf *rct, float radius, float aspect, float alpha, int select); +} float ED_node_grid_size(void) { @@ -101,21 +115,18 @@ static bNodeTree *node_tree_from_ID(ID *id) return ntreeFromID(id); } - return NULL; + return nullptr; } void ED_node_tag_update_id(ID *id) { bNodeTree *ntree = node_tree_from_ID(id); - if (id == NULL || ntree == NULL) { + if (id == nullptr || ntree == nullptr) { return; } - /* TODO(sergey): With the new dependency graph it - * should be just enough to only tag ntree itself, - * all the users of this tree will have update - * flushed from the tree, - */ + /* TODO(sergey): With the new dependency graph it should be just enough to only tag ntree itself. + * All the users of this tree will have update flushed from the tree. */ DEG_id_tag_update(&ntree->id, 0); if (ntree->type == NTREE_SHADER) { @@ -142,7 +153,7 @@ void ED_node_tag_update_id(ID *id) WM_main_add_notifier(NC_OBJECT | ND_MODIFIER, id); } else if (id == &ntree->id) { - /* node groups */ + /* Node groups. */ DEG_id_tag_update(id, 0); } } @@ -154,16 +165,16 @@ void ED_node_tag_update_nodetree(Main *bmain, bNodeTree *ntree, bNode *node) } bool do_tag_update = true; - if (node != NULL) { + if (node != nullptr) { if (!node_connected_to_output(bmain, ntree, node)) { do_tag_update = false; } } - /* look through all datablocks, to support groups */ + /* Look through all datablocks to support groups. */ if (do_tag_update) { FOREACH_NODETREE_BEGIN (bmain, tntree, id) { - /* check if nodetree uses the group */ + /* Check if nodetree uses the group. */ if (ntreeHasTree(tntree, ntree)) { ED_node_tag_update_id(id); } @@ -179,42 +190,41 @@ void ED_node_tag_update_nodetree(Main *bmain, bNodeTree *ntree, bNode *node) static bool compare_nodes(const bNode *a, const bNode *b) { /* These tell if either the node or any of the parent nodes is selected. - * A selected parent means an unselected node is also in foreground! - */ + * A selected parent means an unselected node is also in foreground! */ bool a_select = (a->flag & NODE_SELECT) != 0, b_select = (b->flag & NODE_SELECT) != 0; bool a_active = (a->flag & NODE_ACTIVE) != 0, b_active = (b->flag & NODE_ACTIVE) != 0; - /* if one is an ancestor of the other */ + /* If one is an ancestor of the other. */ /* XXX there might be a better sorting algorithm for stable topological sort, - * this is O(n^2) worst case */ + * this is O(n^2) worst case. */ for (bNode *parent = a->parent; parent; parent = parent->parent) { - /* if b is an ancestor, it is always behind a */ + /* If B is an ancestor, it is always behind A. */ if (parent == b) { return true; } - /* any selected ancestor moves the node forward */ + /* Any selected ancestor moves the node forward. */ if (parent->flag & NODE_ACTIVE) { - a_active = 1; + a_active = true; } if (parent->flag & NODE_SELECT) { - a_select = 1; + a_select = true; } } for (bNode *parent = b->parent; parent; parent = parent->parent) { - /* if a is an ancestor, it is always behind b */ + /* If A is an ancestor, it is always behind B. */ if (parent == a) { return false; } - /* any selected ancestor moves the node forward */ + /* Any selected ancestor moves the node forward. */ if (parent->flag & NODE_ACTIVE) { - b_active = 1; + b_active = true; } if (parent->flag & NODE_SELECT) { - b_select = 1; + b_select = true; } } - /* if one of the nodes is in the background and the other not */ + /* One of the nodes is in the background and the other not. */ if ((a->flag & NODE_BACKGROUND) && !(b->flag & NODE_BACKGROUND)) { return false; } @@ -222,7 +232,7 @@ static bool compare_nodes(const bNode *a, const bNode *b) return true; } - /* if one has a higher selection state (active > selected > nothing) */ + /* One has a higher selection state (active > selected > nothing). */ if (!b_active && a_active) { return true; } @@ -233,30 +243,31 @@ static bool compare_nodes(const bNode *a, const bNode *b) return false; } -/* Sorts nodes by selection: unselected nodes first, then selected, - * then the active node at the very end. Relative order is kept intact! +/** + * Sort nodes by selection: unselected nodes first, then selected, + * then the active node at the very end. Relative order is kept intact. */ void ED_node_sort(bNodeTree *ntree) { - /* merge sort is the algorithm of choice here */ + /* Merge sort is the algorithm of choice here. */ int totnodes = BLI_listbase_count(&ntree->nodes); int k = 1; while (k < totnodes) { - bNode *first_a = ntree->nodes.first; + bNode *first_a = (bNode *)ntree->nodes.first; bNode *first_b = first_a; do { - /* setup first_b pointer */ + /* Set up first_b pointer. */ for (int b = 0; b < k && first_b; b++) { first_b = first_b->next; } - /* all batches merged? */ - if (first_b == NULL) { + /* All batches merged? */ + if (first_b == nullptr) { break; } - /* merge batches */ + /* Merge batches. */ bNode *node_a = first_a; bNode *node_b = first_b; int a = 0; @@ -275,11 +286,11 @@ void ED_node_sort(bNodeTree *ntree) } } - /* setup first pointers for next batch */ + /* Set up first pointers for next batch. */ first_b = node_b; for (; b < k; b++) { - /* all nodes sorted? */ - if (first_b == NULL) { + /* All nodes sorted? */ + if (first_b == nullptr) { break; } first_b = first_b->next; @@ -291,26 +302,15 @@ void ED_node_sort(bNodeTree *ntree) } } -static void do_node_internal_buttons(bContext *C, void *UNUSED(node_v), int event) -{ - if (event == B_NODE_EXEC) { - SpaceNode *snode = CTX_wm_space_node(C); - if (snode && snode->id) { - ED_node_tag_update_id(snode->id); - } - } -} - static void node_uiblocks_init(const bContext *C, bNodeTree *ntree) { - /* add node uiBlocks in drawing order - prevents events going to overlapping nodes */ + /* Add node uiBlocks in drawing order - prevents events going to overlapping nodes. */ LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { /* ui block */ char uiblockstr[32]; BLI_snprintf(uiblockstr, sizeof(uiblockstr), "node buttons %p", (void *)node); node->block = UI_block_begin(C, CTX_wm_region(C), uiblockstr, UI_EMBOSS); - UI_block_func_handle_set(node->block, do_node_internal_buttons, node); /* this cancels events for background nodes */ UI_block_flag_enable(node->block, UI_BLOCK_CLIP_EVENTS); @@ -341,26 +341,28 @@ void node_from_view(const bNode *node, float x, float y, float *rx, float *ry) nodeFromView(node, x, y, rx, ry); } -/* based on settings in node, sets drawing rect info. each redraw! */ +/** + * Based on settings and sockets in node, set drawing rect info. + */ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) { PointerRNA nodeptr; RNA_pointer_create(&ntree->id, &RNA_Node, node, &nodeptr); - /* get "global" coords */ + /* Get "global" coordinates. */ float locx, locy; node_to_view(node, 0.0f, 0.0f, &locx, &locy); float dy = locy; - /* header */ + /* Header. */ dy -= NODE_DY; - /* little bit space in top */ + /* Little bit of space in top. */ if (node->outputs.first) { dy -= NODE_DYS / 2; } - /* output sockets */ + /* Output sockets. */ bool add_output_space = false; int buty; @@ -386,24 +388,24 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) uiLayoutSetActive(layout, false); } - /* context pointers for current node and socket */ + /* Context pointers for current node and socket. */ uiLayoutSetContextPointer(layout, "node", &nodeptr); uiLayoutSetContextPointer(layout, "socket", &sockptr); - /* align output buttons to the right */ + /* Align output buttons to the right. */ uiLayout *row = uiLayoutRow(layout, true); uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_RIGHT); const char *socket_label = nodeSocketLabel(nsock); nsock->typeinfo->draw((bContext *)C, row, &sockptr, &nodeptr, IFACE_(socket_label)); UI_block_align_end(node->block); - UI_block_layout_resolve(node->block, NULL, &buty); + UI_block_layout_resolve(node->block, nullptr, &buty); - /* ensure minimum socket height in case layout is empty */ + /* Ensure minimum socket height in case layout is empty. */ buty = min_ii(buty, dy - NODE_DY); nsock->locx = locx + NODE_WIDTH(node); - /* place the socket circle in the middle of the layout */ + /* Place the socket circle in the middle of the layout. */ nsock->locy = 0.5f * (dy + buty); dy = buty; @@ -436,8 +438,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) node->prvr.ymin = dy - aspect * (NODE_WIDTH(node) - NODE_DY); } else { - /* width correction of image */ - /* XXX huh? (ton) */ + /* Width correction of image. XXX huh? (ton) */ float dx = (NODE_WIDTH(node) - NODE_DYS) - (NODE_WIDTH(node) - NODE_DYS) / aspect; node->prvr.ymin = dy - (NODE_WIDTH(node) - NODE_DY); @@ -448,7 +449,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) dy = node->prvr.ymin - NODE_DYS / 2; - /* make sure that maximums are bigger or equal to minimums */ + /* Make sure that maximums are bigger or equal to minimums. */ if (node->prvr.xmax < node->prvr.xmin) { SWAP(float, node->prvr.xmax, node->prvr.xmin); } @@ -457,11 +458,11 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) } } - /* buttons rect? */ + /* Buttons rect? */ if (node->typeinfo->draw_buttons && (node->flag & NODE_OPTIONS)) { dy -= NODE_DYS / 2; - /* set this for uifunc() that don't use layout engine yet */ + /* Set this for `uifunc()` that don't use layout engine yet. */ node->butr.xmin = 0; node->butr.xmax = NODE_WIDTH(node) - 2 * NODE_DYS; node->butr.ymin = 0; @@ -486,12 +487,12 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) node->typeinfo->draw_buttons(layout, (bContext *)C, &nodeptr); UI_block_align_end(node->block); - UI_block_layout_resolve(node->block, NULL, &buty); + UI_block_layout_resolve(node->block, nullptr, &buty); dy = buty - NODE_DYS / 2; } - /* input sockets */ + /* Input sockets. */ LISTBASE_FOREACH (bNodeSocket *, nsock, &node->inputs) { if (nodeSocketIsHidden(nsock)) { continue; @@ -500,6 +501,16 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) PointerRNA sockptr; RNA_pointer_create(&ntree->id, &RNA_NodeSocket, nsock, &sockptr); + /* Add the half the height of a multi-input socket to cursor Y + * to account for the increased height of the taller sockets. */ + float multi_input_socket_offset = 0.0f; + if (nsock->flag & SOCK_MULTI_INPUT) { + if (nsock->total_inputs > 2) { + multi_input_socket_offset = (nsock->total_inputs - 2) * NODE_MULTI_INPUT_LINK_GAP; + } + } + dy -= multi_input_socket_offset * 0.5f; + uiLayout *layout = UI_block_layout(node->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, @@ -514,7 +525,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) uiLayoutSetActive(layout, false); } - /* context pointers for current node and socket */ + /* Context pointers for current node and socket. */ uiLayoutSetContextPointer(layout, "node", &nodeptr); uiLayoutSetContextPointer(layout, "socket", &sockptr); @@ -524,22 +535,22 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) nsock->typeinfo->draw((bContext *)C, row, &sockptr, &nodeptr, IFACE_(socket_label)); UI_block_align_end(node->block); - UI_block_layout_resolve(node->block, NULL, &buty); + UI_block_layout_resolve(node->block, nullptr, &buty); - /* ensure minimum socket height in case layout is empty */ + /* Ensure minimum socket height in case layout is empty. */ buty = min_ii(buty, dy - NODE_DY); nsock->locx = locx; - /* place the socket circle in the middle of the layout */ + /* Place the socket circle in the middle of the layout. */ nsock->locy = 0.5f * (dy + buty); - dy = buty; + dy = buty - multi_input_socket_offset * 0.5; if (nsock->next) { dy -= NODE_SOCKDY; } } - /* little bit space in end */ + /* Little bit of space in end. */ if (node->inputs.first || (node->flag & (NODE_OPTIONS | NODE_PREVIEW)) == 0) { dy -= NODE_DYS / 2; } @@ -550,8 +561,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) node->totr.ymin = min_ff(dy, locy - 2 * NODE_DY); /* Set the block bounds to clip mouse events from underlying nodes. - * Add a margin for sockets on each side. - */ + * Add a margin for sockets on each side. */ UI_block_bounds_set_explicit(node->block, node->totr.xmin - NODE_SOCKSIZE, node->totr.ymin, @@ -559,16 +569,18 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) node->totr.ymax); } -/* based on settings in node, sets drawing rect info. each redraw! */ +/** + * Based on settings in node, sets drawing rect info. + */ static void node_update_hidden(bNode *node) { int totin = 0, totout = 0; - /* get "global" coords */ + /* Get "global" coords. */ float locx, locy; node_to_view(node, 0.0f, 0.0f, &locx, &locy); - /* calculate minimal radius */ + /* Calculate minimal radius. */ LISTBASE_FOREACH (bNodeSocket *, nsock, &node->inputs) { if (!nodeSocketIsHidden(nsock)) { totin++; @@ -591,7 +603,7 @@ static void node_update_hidden(bNode *node) node->totr.ymax = locy + (hiddenrad - 0.5f * NODE_DY); node->totr.ymin = node->totr.ymax - 2 * hiddenrad; - /* output sockets */ + /* Output sockets. */ float rad = (float)M_PI / (1.0f + (float)totout); float drad = rad; @@ -603,7 +615,7 @@ static void node_update_hidden(bNode *node) } } - /* input sockets */ + /* Input sockets. */ rad = drad = -(float)M_PI / (1.0f + (float)totin); LISTBASE_FOREACH (bNodeSocket *, nsock, &node->inputs) { @@ -615,8 +627,7 @@ static void node_update_hidden(bNode *node) } /* Set the block bounds to clip mouse events from underlying nodes. - * Add a margin for sockets on each side. - */ + * Add a margin for sockets on each side. */ UI_block_bounds_set_explicit(node->block, node->totr.xmin - NODE_SOCKSIZE, node->totr.ymin, @@ -686,9 +697,6 @@ int node_get_colorid(bNode *node) } } -/* note: in cmp_util.c is similar code, for node_compo_pass_on() - * the same goes for shader and texture nodes. */ -/* note: in node_edit.c is similar code, for untangle node */ static void node_draw_mute_line(const View2D *v2d, const SpaceNode *snode, const bNode *node) { GPU_blend(GPU_BLEND_ALPHA); @@ -700,7 +708,7 @@ static void node_draw_mute_line(const View2D *v2d, const SpaceNode *snode, const GPU_blend(GPU_BLEND_NONE); } -/* flags used in gpu_shader_keyframe_diamond_frag.glsl */ +/* Flags used in gpu_shader_keyframe_diamond_frag.glsl. */ #define MARKER_SHAPE_DIAMOND 0x1 #define MARKER_SHAPE_SQUARE 0xC #define MARKER_SHAPE_CIRCLE 0x2 @@ -720,7 +728,7 @@ static void node_socket_draw(const bNodeSocket *sock, { int flags; - /* sets shape flags */ + /* Set shape flags. */ switch (sock->display_shape) { case SOCK_DISPLAY_SHAPE_DIAMOND: case SOCK_DISPLAY_SHAPE_DIAMOND_DOT: @@ -751,7 +759,32 @@ static void node_socket_draw(const bNodeSocket *sock, immVertex2f(pos_id, locx, locy); } -static void node_socket_outline_color_get(bool selected, float r_outline_color[4]) +static void node_socket_draw_multi_input(const float color[4], + const float color_outline[4], + const float width, + const float height, + const int locx, + const int locy) +{ + const float outline_width = 1.0f; + /* UI_draw_roundbox draws the outline on the outer side, so compensate for the outline width. */ + const rctf rect = { + locx - width + outline_width * 0.5f, + locx + width - outline_width * 0.5f, + locy - height + outline_width * 0.5f, + locy + height - outline_width * 0.5f, + }; + + UI_draw_roundbox_corner_set(UI_CNR_ALL); + UI_draw_roundbox_4fv_ex( + &rect, color, nullptr, 1.0f, color_outline, outline_width, width - outline_width * 0.5f); +} + +static const float virtual_node_socket_outline_color[4] = {0.5, 0.5, 0.5, 1.0}; + +static void node_socket_outline_color_get(const bool selected, + const int socket_type, + float r_outline_color[4]) { if (selected) { UI_GetThemeColor4fv(TH_TEXT_HI, r_outline_color); @@ -761,6 +794,12 @@ static void node_socket_outline_color_get(bool selected, float r_outline_color[4 copy_v4_fl(r_outline_color, 0.0f); r_outline_color[3] = 0.6f; } + + /* Until there is a better place for per socket color, + * the outline color for virtual sockets is set here. */ + if (socket_type == SOCK_CUSTOM) { + copy_v4_v4(r_outline_color, virtual_node_socket_outline_color); + } } /* Usual convention here would be node_socket_get_color(), but that's already used (for setting a @@ -774,7 +813,7 @@ void node_socket_color_get( sock->typeinfo->draw_color(C, &ptr, node_ptr, r_color); - bNode *node = node_ptr->data; + bNode *node = (bNode *)node_ptr->data; if (node->flag & NODE_MUTED) { r_color[3] *= 0.25f; } @@ -796,7 +835,7 @@ static void node_socket_draw_nested(const bContext *C, float outline_color[4]; node_socket_color_get((bContext *)C, ntree, node_ptr, sock, color); - node_socket_outline_color_get(selected, outline_color); + node_socket_outline_color_get(selected, sock->type, outline_color); node_socket_draw(sock, color, @@ -822,7 +861,7 @@ void ED_node_socket_draw(bNodeSocket *sock, const rcti *rect, const float color[ rcti draw_rect = *rect; float outline_color[4] = {0}; - node_socket_outline_color_get(sock->flag & SELECT, outline_color); + node_socket_outline_color_get(sock->flag & SELECT, sock->type, outline_color); BLI_rcti_resize(&draw_rect, size, size); @@ -842,7 +881,7 @@ void ED_node_socket_draw(bNodeSocket *sock, const rcti *rect, const float color[ immUniform1f("outline_scale", 0.7f); immUniform2f("ViewportSize", -1.0f, -1.0f); - /* Single point */ + /* Single point. */ immBegin(GPU_PRIM_POINTS, 1); node_socket_draw(sock, color, @@ -883,7 +922,7 @@ static void node_draw_preview_background(rctf *rect) immUnbindProgram(); } -/* not a callback */ +/* Not a callback. */ static void node_draw_preview(bNodePreview *preview, rctf *prv) { float xrect = BLI_rctf_size_x(prv); @@ -892,7 +931,7 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv) float yscale = yrect / ((float)preview->ysize); float scale; - /* uniform scale and offset */ + /* Uniform scale and offset. */ rctf draw_rect = *prv; if (xscale < yscale) { float offset = 0.5f * (yrect - ((float)preview->ysize) * xscale); @@ -910,7 +949,7 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv) node_draw_preview_background(&draw_rect); GPU_blend(GPU_BLEND_ALPHA); - /* premul graphics */ + /* Premul graphics. */ GPU_blend(GPU_BLEND_ALPHA); IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_COLOR); @@ -924,7 +963,7 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv) preview->rect, scale, scale, - NULL); + nullptr); GPU_blend(GPU_BLEND_NONE); @@ -935,16 +974,16 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv) immUnbindProgram(); } -/* common handle function for operator buttons that need to select the node first */ +/* Common handle function for operator buttons that need to select the node first. */ static void node_toggle_button_cb(struct bContext *C, void *node_argv, void *op_argv) { bNode *node = (bNode *)node_argv; const char *opname = (const char *)op_argv; - /* select & activate only the button's node */ + /* Select & activate only the button's node. */ node_select_single(C, node); - WM_operator_name_call(C, opname, WM_OP_INVOKE_DEFAULT, NULL); + WM_operator_name_call(C, opname, WM_OP_INVOKE_DEFAULT, nullptr); } void node_draw_shadow(const SpaceNode *snode, const bNode *node, float radius, float alpha) @@ -987,16 +1026,16 @@ void node_draw_sockets(const View2D *v2d, immUniform1f("outline_scale", 0.7f); immUniform2f("ViewportSize", -1.0f, -1.0f); - /* set handle size */ + /* Set handle size. */ float scale; - UI_view2d_scale_get(v2d, &scale, NULL); + UI_view2d_scale_get(v2d, &scale, nullptr); scale *= 2.25f * NODE_SOCKSIZE; if (!select_all) { immBeginAtMost(GPU_PRIM_POINTS, total_input_len + total_output_len); } - /* socket inputs */ + /* Socket inputs. */ short selected_input_len = 0; LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) { if (nodeSocketIsHidden(sock)) { @@ -1006,6 +1045,10 @@ void node_draw_sockets(const View2D *v2d, selected_input_len++; continue; } + /* Don't draw multi-input sockets here since they are drawn in a different batch. */ + if (sock->flag & SOCK_MULTI_INPUT) { + continue; + } node_socket_draw_nested(C, ntree, @@ -1020,7 +1063,7 @@ void node_draw_sockets(const View2D *v2d, selected); } - /* socket outputs */ + /* Socket outputs. */ short selected_output_len = 0; if (draw_outputs) { LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) { @@ -1050,16 +1093,16 @@ void node_draw_sockets(const View2D *v2d, immEnd(); } - /* go back and draw selected sockets */ + /* Go back and draw selected sockets. */ if (selected_input_len + selected_output_len > 0) { - /* outline for selected sockets */ + /* Outline for selected sockets. */ selected = true; immBegin(GPU_PRIM_POINTS, selected_input_len + selected_output_len); if (selected_input_len) { - /* socket inputs */ + /* Socket inputs. */ LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) { if (nodeSocketIsHidden(sock)) { continue; @@ -1077,14 +1120,14 @@ void node_draw_sockets(const View2D *v2d, scale, selected); if (--selected_input_len == 0) { - break; /* stop as soon as last one is drawn */ + break; /* Stop as soon as last one is drawn. */ } } } } if (selected_output_len) { - /* socket outputs */ + /* Socket outputs. */ LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) { if (nodeSocketIsHidden(sock)) { continue; @@ -1102,7 +1145,7 @@ void node_draw_sockets(const View2D *v2d, scale, selected); if (--selected_output_len == 0) { - break; /* stop as soon as last one is drawn */ + break; /* Stop as soon as last one is drawn. */ } } } @@ -1115,6 +1158,133 @@ void node_draw_sockets(const View2D *v2d, GPU_program_point_size(false); GPU_blend(GPU_BLEND_NONE); + + /* Draw multi-input sockets after the others because they are drawn with `UI_draw_roundbox` + * rather than with `GL_POINT`. */ + LISTBASE_FOREACH (bNodeSocket *, socket, &node->inputs) { + if (nodeSocketIsHidden(socket)) { + continue; + } + if (!(socket->flag & SOCK_MULTI_INPUT)) { + continue; + } + + const bool is_node_hidden = (node->flag & NODE_HIDDEN); + const float width = NODE_SOCKSIZE; + float height = is_node_hidden ? width : node_socket_calculate_height(socket) - width; + + float color[4]; + float outline_color[4]; + node_socket_color_get((bContext *)C, ntree, &node_ptr, socket, color); + node_socket_outline_color_get(selected, socket->type, outline_color); + + node_socket_draw_multi_input(color, outline_color, width, height, socket->locx, socket->locy); + } +} + +static int node_error_type_to_icon(const NodeWarningType type) +{ + switch (type) { + case NodeWarningType::Error: + return ICON_ERROR; + case NodeWarningType::Warning: + return ICON_ERROR; + case NodeWarningType::Info: + return ICON_INFO; + } + + BLI_assert(false); + return ICON_ERROR; +} + +static uint8_t node_error_type_priority(const NodeWarningType type) +{ + switch (type) { + case NodeWarningType::Error: + return 3; + case NodeWarningType::Warning: + return 2; + case NodeWarningType::Info: + return 1; + } + + BLI_assert(false); + return 0; +} + +static NodeWarningType node_error_highest_priority(Span warnings) +{ + uint8_t highest_priority = 0; + NodeWarningType highest_priority_type = NodeWarningType::Info; + for (const NodeWarning &warning : warnings) { + const uint8_t priority = node_error_type_priority(warning.type); + if (priority > highest_priority) { + highest_priority = priority; + highest_priority_type = warning.type; + } + } + return highest_priority_type; +} + +static char *node_errors_tooltip_fn(bContext *UNUSED(C), void *argN, const char *UNUSED(tip)) +{ + const NodeUIStorage **storage_pointer_alloc = static_cast(argN); + const NodeUIStorage *node_ui_storage = *storage_pointer_alloc; + Span warnings = node_ui_storage->warnings; + + std::string complete_string; + + for (const NodeWarning &warning : warnings.drop_back(1)) { + complete_string += warning.message; + complete_string += '\n'; + } + + complete_string += warnings.last().message; + + /* Remove the last period-- the tooltip system adds this automatically. */ + if (complete_string.back() == '.') { + complete_string.pop_back(); + } + + return BLI_strdupn(complete_string.c_str(), complete_string.size()); +} + +#define NODE_HEADER_ICON_SIZE (0.8f * U.widget_unit) + +static void node_add_error_message_button( + const bContext *C, bNodeTree &ntree, bNode &node, const rctf &rect, float &icon_offset) +{ + const NodeUIStorage *node_ui_storage = BKE_node_tree_ui_storage_get_from_context(C, ntree, node); + if (node_ui_storage == nullptr || node_ui_storage->warnings.is_empty()) { + return; + } + + /* The UI API forces us to allocate memory for each error button, because the + * ownership of #UI_but_func_tooltip_set's argument is transferred to the button. */ + const NodeUIStorage **storage_pointer_alloc = (const NodeUIStorage **)MEM_mallocN( + sizeof(NodeUIStorage *), __func__); + *storage_pointer_alloc = node_ui_storage; + + const NodeWarningType display_type = node_error_highest_priority(node_ui_storage->warnings); + + icon_offset -= NODE_HEADER_ICON_SIZE; + UI_block_emboss_set(node.block, UI_EMBOSS_NONE); + uiBut *but = uiDefIconBut(node.block, + UI_BTYPE_BUT, + 0, + node_error_type_to_icon(display_type), + icon_offset, + rect.ymax - NODE_DY, + NODE_HEADER_ICON_SIZE, + UI_UNIT_Y, + nullptr, + 0, + 0, + 0, + 0, + nullptr); + UI_but_func_tooltip_set(but, node_errors_tooltip_fn, storage_pointer_alloc); + UI_block_emboss_set(node.block, UI_EMBOSS); } static void node_draw_basis(const bContext *C, @@ -1124,17 +1294,16 @@ static void node_draw_basis(const bContext *C, bNode *node, bNodeInstanceKey key) { - /* float socket_size = NODE_SOCKSIZE*U.dpi/72; */ /* UNUSED */ - float iconbutw = 0.8f * UI_UNIT_X; + const float iconbutw = NODE_HEADER_ICON_SIZE; - /* skip if out of view */ - if (BLI_rctf_isect(&node->totr, &v2d->cur, NULL) == false) { + /* Skip if out of view. */ + if (BLI_rctf_isect(&node->totr, &v2d->cur, nullptr) == false) { UI_block_end(C, node->block); - node->block = NULL; + node->block = nullptr; return; } - /* shadow */ + /* Shadow. */ node_draw_shadow(snode, node, BASIS_RAD, 1.0f); float color[4]; @@ -1154,33 +1323,33 @@ static void node_draw_basis(const bContext *C, rctf *rct = &node->totr; UI_draw_roundbox_corner_set(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT); - UI_draw_roundbox_aa( - &(const rctf){ - .xmin = rct->xmin, - .xmax = rct->xmax, - .ymin = rct->ymax - NODE_DY, - .ymax = rct->ymax, - }, - true, - BASIS_RAD, - color); - /* show/hide icons */ + { + const rctf rect = { + rct->xmin, + rct->xmax, + rct->ymax - NODE_DY, + rct->ymax, + }; + UI_draw_roundbox_aa(&rect, true, BASIS_RAD, color); + } + + /* Show/hide icons. */ float iconofs = rct->xmax - 0.35f * U.widget_unit; - /* preview */ + /* Preview. */ if (node->typeinfo->flag & NODE_PREVIEW) { iconofs -= iconbutw; UI_block_emboss_set(node->block, UI_EMBOSS_NONE); uiBut *but = uiDefIconBut(node->block, UI_BTYPE_BUT_TOGGLE, - B_REDR, + 0, ICON_MATERIAL, iconofs, rct->ymax - NODE_DY, iconbutw, UI_UNIT_Y, - NULL, + nullptr, 0, 0, 0, @@ -1189,25 +1358,24 @@ static void node_draw_basis(const bContext *C, UI_but_func_set(but, node_toggle_button_cb, node, (void *)"NODE_OT_preview_toggle"); /* XXX this does not work when node is activated and the operator called right afterwards, * since active ID is not updated yet (needs to process the notifier). - * This can only work as visual indicator! - */ + * This can only work as visual indicator! */ // if (!(node->flag & (NODE_ACTIVE_ID|NODE_DO_OUTPUT))) // UI_but_flag_enable(but, UI_BUT_DISABLED); UI_block_emboss_set(node->block, UI_EMBOSS); } - /* group edit */ + /* Group edit. */ if (node->type == NODE_GROUP) { iconofs -= iconbutw; UI_block_emboss_set(node->block, UI_EMBOSS_NONE); uiBut *but = uiDefIconBut(node->block, UI_BTYPE_BUT_TOGGLE, - B_REDR, + 0, ICON_NODETREE, iconofs, rct->ymax - NODE_DY, iconbutw, UI_UNIT_Y, - NULL, + nullptr, 0, 0, 0, @@ -1227,7 +1395,7 @@ static void node_draw_basis(const bContext *C, rct->ymax - NODE_DY, iconbutw, UI_UNIT_Y, - NULL, + nullptr, 0, 0, 0, @@ -1236,7 +1404,9 @@ static void node_draw_basis(const bContext *C, UI_block_emboss_set(node->block, UI_EMBOSS); } - /* title */ + node_add_error_message_button(C, *ntree, *node, *rct, iconofs); + + /* Title. */ if (node->flag & SELECT) { UI_GetThemeColor4fv(TH_SELECT, color); } @@ -1244,20 +1414,20 @@ static void node_draw_basis(const bContext *C, UI_GetThemeColorBlendShade4fv(TH_SELECT, color_id, 0.4f, 10, color); } - /* open/close entirely? */ + /* Open/close entirely. */ { int but_size = U.widget_unit * 0.8f; - /* XXX button uses a custom triangle draw below, so make it invisible without icon */ + /* XXX button uses a custom triangle draw below, so make it invisible without icon. */ UI_block_emboss_set(node->block, UI_EMBOSS_NONE); uiBut *but = uiDefBut(node->block, UI_BTYPE_BUT_TOGGLE, - B_REDR, + 0, "", rct->xmin + 0.35f * U.widget_unit, rct->ymax - NODE_DY / 2.2f - but_size / 2, but_size, but_size, - NULL, + nullptr, 0, 0, 0, @@ -1267,11 +1437,11 @@ static void node_draw_basis(const bContext *C, UI_block_emboss_set(node->block, UI_EMBOSS); UI_GetThemeColor4fv(TH_TEXT, color); - /* custom draw function for this button */ + /* Custom draw function for this button. */ UI_draw_icon_tri(rct->xmin + 0.65f * U.widget_unit, rct->ymax - NODE_DY / 2.2f, 'v', color); } - char showname[128]; /* 128 used below */ + char showname[128]; nodeLabel(ntree, node, showname, sizeof(showname)); uiBut *but = uiDefBut(node->block, @@ -1282,7 +1452,7 @@ static void node_draw_basis(const bContext *C, (int)(rct->ymax - NODE_DY), (short)(iconofs - rct->xmin - (18.0f * U.dpi_fac)), (short)NODE_DY, - NULL, + nullptr, 0, 0, 0, @@ -1292,9 +1462,9 @@ static void node_draw_basis(const bContext *C, UI_but_flag_enable(but, UI_BUT_INACTIVE); } - /* body */ + /* Body. */ if (nodeTypeUndefined(node)) { - /* use warning color to indicate undefined types */ + /* Use warning color to indicate undefined types. */ UI_GetThemeColor4fv(TH_REDALERT, color); } else if (node->flag & NODE_MUTED) { @@ -1312,47 +1482,37 @@ static void node_draw_basis(const bContext *C, color[3] = 0.5f; } - UI_draw_roundbox_corner_set(UI_CNR_BOTTOM_LEFT | UI_CNR_BOTTOM_RIGHT); - UI_draw_roundbox_aa( - &(const rctf){ - .xmin = rct->xmin, - .xmax = rct->xmax, - .ymin = rct->ymin, - .ymax = rct->ymax - NODE_DY, - }, - true, - BASIS_RAD, - color); + { + UI_draw_roundbox_corner_set(UI_CNR_BOTTOM_LEFT | UI_CNR_BOTTOM_RIGHT); + const rctf rect = { + rct->xmin, + rct->xmax, + rct->ymin, + rct->ymax - NODE_DY, + }; + UI_draw_roundbox_aa(&rect, true, BASIS_RAD, color); + } - /* outline active and selected emphasis */ + /* Outline active and selected emphasis. */ if (node->flag & SELECT) { UI_GetThemeColorShadeAlpha4fv( (node->flag & NODE_ACTIVE) ? TH_ACTIVE : TH_SELECT, 0, -40, color); UI_draw_roundbox_corner_set(UI_CNR_ALL); - UI_draw_roundbox_aa( - &(const rctf){ - .xmin = rct->xmin, - .xmax = rct->xmax, - .ymin = rct->ymin, - .ymax = rct->ymax, - }, - false, - BASIS_RAD, - color); + UI_draw_roundbox_aa(rct, false, BASIS_RAD, color); } - /* disable lines */ + /* Disable lines. */ if (node->flag & NODE_MUTED) { node_draw_mute_line(v2d, snode, node); } node_draw_sockets(v2d, C, ntree, node, true, false); - /* preview */ - bNodeInstanceHash *previews = CTX_data_pointer_get(C, "node_previews").data; + /* Preview. */ + bNodeInstanceHash *previews = (bNodeInstanceHash *)CTX_data_pointer_get(C, "node_previews").data; if (node->flag & NODE_PREVIEW && previews) { - bNodePreview *preview = BKE_node_instance_hash_lookup(previews, key); + bNodePreview *preview = (bNodePreview *)BKE_node_instance_hash_lookup(previews, key); if (preview && (preview->xsize && preview->ysize)) { if (preview->rect && !BLI_rctf_is_empty(&node->prvr)) { node_draw_preview(preview, &node->prvr); @@ -1362,7 +1522,7 @@ static void node_draw_basis(const bContext *C, UI_block_end(C, node->block); UI_block_draw(C, node->block); - node->block = NULL; + node->block = nullptr; } static void node_draw_hidden(const bContext *C, @@ -1377,12 +1537,12 @@ static void node_draw_hidden(const bContext *C, float hiddenrad = BLI_rctf_size_y(rct) / 2.0f; float scale; - UI_view2d_scale_get(v2d, &scale, NULL); + UI_view2d_scale_get(v2d, &scale, nullptr); - /* shadow */ + /* Shadow. */ node_draw_shadow(snode, node, hiddenrad, 1.0f); - /* body */ + /* Body. */ float color[4]; int color_id = node_get_colorid(node); if (node->flag & NODE_MUTED) { @@ -1396,7 +1556,7 @@ static void node_draw_hidden(const bContext *C, UI_draw_roundbox_aa(rct, true, hiddenrad, color); - /* outline active and selected emphasis */ + /* Outline active and selected emphasis. */ if (node->flag & SELECT) { UI_GetThemeColorShadeAlpha4fv( (node->flag & NODE_ACTIVE) ? TH_ACTIVE : TH_SELECT, 0, -40, color); @@ -1404,28 +1564,24 @@ static void node_draw_hidden(const bContext *C, UI_draw_roundbox_aa(rct, false, hiddenrad, color); } - /* custom color inline */ + /* Custom color inline. */ if (node->flag & NODE_CUSTOM_COLOR) { GPU_blend(GPU_BLEND_ALPHA); GPU_line_smooth(true); - UI_draw_roundbox_3fv_alpha( - &(const rctf){ - .xmin = rct->xmin + 1, - .xmax = rct->xmax - 1, - .ymin = rct->ymin + 1, - .ymax = rct->ymax - 1, - }, - false, - hiddenrad, - node->color, - 1.0f); + const rctf rect = { + rct->xmin + 1, + rct->xmax - 1, + rct->ymin + 1, + rct->ymax - 1, + }; + UI_draw_roundbox_3fv_alpha(&rect, false, hiddenrad, node->color, 1.0f); GPU_line_smooth(false); GPU_blend(GPU_BLEND_NONE); } - /* title */ + /* Title. */ if (node->flag & SELECT) { UI_GetThemeColor4fv(TH_SELECT, color); } @@ -1433,20 +1589,20 @@ static void node_draw_hidden(const bContext *C, UI_GetThemeColorBlendShade4fv(TH_SELECT, color_id, 0.4f, 10, color); } - /* open entirely icon */ + /* Open / collapse icon. */ { int but_size = U.widget_unit * 0.8f; /* XXX button uses a custom triangle draw below, so make it invisible without icon */ UI_block_emboss_set(node->block, UI_EMBOSS_NONE); uiBut *but = uiDefBut(node->block, UI_BTYPE_BUT_TOGGLE, - B_REDR, + 0, "", rct->xmin + 0.35f * U.widget_unit, centy - but_size / 2, but_size, but_size, - NULL, + nullptr, 0, 0, 0, @@ -1456,22 +1612,18 @@ static void node_draw_hidden(const bContext *C, UI_block_emboss_set(node->block, UI_EMBOSS); UI_GetThemeColor4fv(TH_TEXT, color); - /* custom draw function for this button */ + /* Custom draw function for this button. */ UI_draw_icon_tri(rct->xmin + 0.65f * U.widget_unit, centy, 'h', color); } - /* disable lines */ + /* Disable lines. */ if (node->flag & NODE_MUTED) { node_draw_mute_line(v2d, snode, node); } - char showname[128]; /* 128 is used below */ + char showname[128]; nodeLabel(ntree, node, showname, sizeof(showname)); - /* XXX - don't print into self! */ - // if (node->flag & NODE_MUTED) - // BLI_snprintf(showname, sizeof(showname), "[%s]", showname); - uiBut *but = uiDefBut(node->block, UI_BTYPE_LABEL, 0, @@ -1480,7 +1632,7 @@ static void node_draw_hidden(const bContext *C, round_fl_to_int(centy - NODE_DY * 0.5f), (short)(BLI_rctf_size_x(rct) - ((18.0f + 12.0f) * U.dpi_fac)), (short)NODE_DY, - NULL, + nullptr, 0, 0, 0, @@ -1490,7 +1642,7 @@ static void node_draw_hidden(const bContext *C, UI_but_flag_enable(but, UI_BUT_INACTIVE); } - /* scale widget thing */ + /* Scale widget thing. */ uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); @@ -1522,7 +1674,7 @@ static void node_draw_hidden(const bContext *C, UI_block_end(C, node->block); UI_block_draw(C, node->block); - node->block = NULL; + node->block = nullptr; } int node_get_resize_cursor(int directions) @@ -1548,13 +1700,13 @@ void node_set_cursor(wmWindow *win, SpaceNode *snode, float cursor[2]) if (ntree) { if (node_find_indicated_socket(snode, &node, &sock, cursor, SOCK_IN | SOCK_OUT)) { - /* pass */ + /* Pass. */ } else { - /* check nodes front to back */ - for (node = ntree->nodes.last; node; node = node->prev) { + /* Check nodes front to back. */ + for (node = (bNode *)ntree->nodes.last; node; node = node->prev) { if (BLI_rctf_isect_pt(&node->totr, cursor[0], cursor[1])) { - break; /* first hit on node stops */ + break; /* First hit on node stops. */ } } if (node) { @@ -1590,17 +1742,64 @@ static void node_update(const bContext *C, bNodeTree *ntree, bNode *node) } } +static void count_mutli_input_socket_links(bNodeTree *ntree, SpaceNode *snode) +{ + LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { + LISTBASE_FOREACH (struct bNodeSocket *, socket, &node->inputs) { + if (socket->flag & SOCK_MULTI_INPUT) { + socket->total_inputs = 0; + LISTBASE_FOREACH (bNodeLink *, link, &ntree->links) { + if (link->tosock == socket) { + socket->total_inputs++; + } + } + /* Count temporary links going into this socket. */ + LISTBASE_FOREACH (bNodeLinkDrag *, nldrag, &snode->runtime->linkdrag) { + LISTBASE_FOREACH (LinkData *, linkdata, &nldrag->links) { + bNodeLink *link = (bNodeLink *)linkdata->data; + if (link->tosock == socket) { + socket->total_inputs++; + } + } + } + } + } + } +} + void node_update_nodetree(const bContext *C, bNodeTree *ntree) { - /* make sure socket "used" tags are correct, for displaying value buttons */ + /* Make sure socket "used" tags are correct, for displaying value buttons. */ + SpaceNode *snode = CTX_wm_space_node(C); ntreeTagUsedSockets(ntree); - /* update nodes front to back, so children sizes get updated before parents */ + count_mutli_input_socket_links(ntree, snode); + + /* Update nodes front to back, so children sizes get updated before parents. */ LISTBASE_FOREACH_BACKWARD (bNode *, node, &ntree->nodes) { node_update(C, ntree, node); } } +static bool compare_link_by_angle_to_node(const bNodeLink *link_a, const bNodeLink *link_b) +{ + BLI_assert(link_a->tosock == link_b->tosock); + const float socket_location[2] = {link_a->tosock->locx, link_a->tosock->locy}; + const float up_direction[2] = {0.0f, 1.0f}; + + float delta_a[2] = {link_a->fromsock->locx - socket_location[0], + link_a->fromsock->locy - socket_location[1]}; + normalize_v2(delta_a); + const float angle_a = angle_normalized_v2v2(up_direction, delta_a); + + float delta_b[2] = {link_b->fromsock->locx - socket_location[0], + link_b->fromsock->locy - socket_location[1]}; + normalize_v2(delta_b); + const float angle_b = angle_normalized_v2v2(up_direction, delta_b); + + return angle_a > angle_b; +} + static void node_draw(const bContext *C, ARegion *region, SpaceNode *snode, @@ -1615,14 +1814,50 @@ static void node_draw(const bContext *C, #define USE_DRAW_TOT_UPDATE +/** + * Automatically sort the input links to multi-input sockets to avoid crossing noodles. + */ +static void sort_multi_input_socket_links(bNodeTree *ntree, SpaceNode *snode) +{ + LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { + LISTBASE_FOREACH (bNodeSocket *, socket, &node->inputs) { + if (socket->flag & SOCK_MULTI_INPUT) { + /* The total is calculated in #node_update_nodetree, which runs before this draw step. */ + const int total_inputs = socket->total_inputs; + Vector input_links; + input_links.reserve(total_inputs); + + LISTBASE_FOREACH (bNodeLink *, link, &ntree->links) { + if (link->tosock == socket) { + input_links.append(link); + } + } + LISTBASE_FOREACH (bNodeLinkDrag *, nldrag, &snode->runtime->linkdrag) { + LISTBASE_FOREACH (LinkData *, linkdata, &nldrag->links) { + bNodeLink *link = (bNodeLink *)linkdata->data; + if (link->tosock == socket) { + input_links.append(link); + } + } + } + + std::sort(input_links.begin(), input_links.end(), compare_link_by_angle_to_node); + for (const int i : input_links.index_range()) { + input_links[i]->multi_input_socket_index = i; + } + } + } + } +} + void node_draw_nodetree(const bContext *C, ARegion *region, SpaceNode *snode, bNodeTree *ntree, bNodeInstanceKey parent_key) { - if (ntree == NULL) { - return; /* groups... */ + if (ntree == nullptr) { + return; /* Groups. */ } #ifdef USE_DRAW_TOT_UPDATE @@ -1631,11 +1866,11 @@ void node_draw_nodetree(const bContext *C, } #endif - /* draw background nodes, last nodes in front */ + /* Draw background nodes, last nodes in front. */ LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { #ifdef USE_DRAW_TOT_UPDATE - /* unrelated to background nodes, update the v2d->tot, - * can be anywhere before we draw the scroll bars */ + /* Unrelated to background nodes, update the v2d->tot, + * can be anywhere before we draw the scroll bars. */ BLI_rctf_union(®ion->v2d.tot, &node->totr); #endif @@ -1647,9 +1882,12 @@ void node_draw_nodetree(const bContext *C, node_draw(C, region, snode, ntree, node, key); } - /* node lines */ + /* Node lines. */ GPU_blend(GPU_BLEND_ALPHA); nodelink_batch_start(snode); + + sort_multi_input_socket_links(ntree, snode); + LISTBASE_FOREACH (bNodeLink *, link, &ntree->links) { if (!nodeLinkIsHidden(link)) { node_draw_link(®ion->v2d, snode, link); @@ -1658,7 +1896,7 @@ void node_draw_nodetree(const bContext *C, nodelink_batch_end(snode); GPU_blend(GPU_BLEND_NONE); - /* draw foreground nodes, last nodes in front */ + /* Draw foreground nodes, last nodes in front. */ LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { if (node->flag & NODE_BACKGROUND) { continue; @@ -1669,7 +1907,7 @@ void node_draw_nodetree(const bContext *C, } } -/* draw tree path info in lower left corner */ +/* Draw tree path info in lower left corner. */ static void draw_tree_path(SpaceNode *snode) { char info[256]; @@ -1684,11 +1922,11 @@ static void snode_setup_v2d(SpaceNode *snode, ARegion *region, const float cente { View2D *v2d = ®ion->v2d; - /* shift view to node tree center */ + /* Shift view to node tree center. */ UI_view2d_center_set(v2d, center[0], center[1]); UI_view2d_view_ortho(v2d); - /* aspect+font, set each time */ + /* Aspect + font, set each time. */ snode->runtime->aspect = BLI_rctf_size_x(&v2d->cur) / (float)region->winx; // XXX snode->curfont = uiSetCurFont_ext(snode->aspect); } @@ -1706,14 +1944,14 @@ static void draw_nodetree(const bContext *C, node_draw_nodetree(C, region, snode, ntree, parent_key); } -/* shade the parent node group and add a uiBlock to clip mouse events */ +/* Shade the parent node group and add a `uiBlock` to clip mouse events. */ static void draw_group_overlay(const bContext *C, ARegion *region) { const View2D *v2d = ®ion->v2d; const rctf rect = v2d->cur; float color[4]; - /* shade node groups to separate them visually */ + /* Shade node groups to separate them visually. */ GPU_blend(GPU_BLEND_ALPHA); UI_GetThemeColorShadeAlpha4fv(TH_NODE_GROUP, 0, 0, color); @@ -1721,7 +1959,7 @@ static void draw_group_overlay(const bContext *C, ARegion *region) UI_draw_roundbox_4fv(&rect, true, 0, color); GPU_blend(GPU_BLEND_NONE); - /* set the block bounds to clip mouse events from underlying nodes */ + /* Set the block bounds to clip mouse events from underlying nodes. */ uiBlock *block = UI_block_begin(C, region, "node tree bounds block", UI_EMBOSS); UI_block_bounds_set_explicit(block, rect.xmin, rect.ymin, rect.xmax, rect.ymax); UI_block_flag_enable(block, UI_BLOCK_CLIP_EVENTS); @@ -1745,8 +1983,8 @@ void node_draw_space(const bContext *C, ARegion *region) GPU_depth_test(GPU_DEPTH_NONE); GPU_scissor_test(true); - /* XXX snode->runtime->cursor set in coordspace for placing new nodes, used for drawing noodles - * too */ + /* XXX `snode->runtime->cursor` set in coordinate-space for placing new nodes, + * used for drawing noodles too. */ UI_view2d_region_to_view(®ion->v2d, win->eventstate->x - region->winrct.xmin, win->eventstate->y - region->winrct.ymin, @@ -1759,19 +1997,19 @@ void node_draw_space(const bContext *C, ARegion *region) ED_region_draw_cb_draw(C, region, REGION_DRAW_PRE_VIEW); - /* only set once */ + /* Only set once. */ GPU_blend(GPU_BLEND_ALPHA); - /* nodes */ + /* Nodes. */ snode_set_context(C); - /* draw parent node trees */ + /* Draw parent node trees. */ if (snode->treepath.last) { static const int max_depth = 2; - bNodeTreePath *path = snode->treepath.last; + bNodeTreePath *path = (bNodeTreePath *)snode->treepath.last; - /* update tree path name (drawn in the bottom left) */ + /* Update tree path name (drawn in the bottom left). */ ID *name_id = (path->nodetree && path->nodetree != snode->nodetree) ? &path->nodetree->id : snode->id; @@ -1779,11 +2017,11 @@ void node_draw_space(const bContext *C, ARegion *region) BLI_strncpy(path->node_name, name_id->name + 2, sizeof(path->node_name)); } - /* current View2D center, will be set temporarily for parent node trees */ + /* Current View2D center, will be set temporarily for parent node trees. */ float center[2]; UI_view2d_center_get(v2d, ¢er[0], ¢er[1]); - /* store new view center in path and current edittree */ + /* Store new view center in path and current edit tree. */ copy_v2_v2(path->view_center, center); if (snode->edittree) { copy_v2_v2(snode->edittree->view_center, center); @@ -1795,7 +2033,7 @@ void node_draw_space(const bContext *C, ARegion *region) depth++; } - /* parent node trees in the background */ + /* Parent node trees in the background. */ for (int curdepth = depth; curdepth > 0; path = path->next, curdepth--) { bNodeTree *ntree = path->nodetree; if (ntree) { @@ -1807,19 +2045,19 @@ void node_draw_space(const bContext *C, ARegion *region) } } - /* top-level edit tree */ + /* Top-level edit tree. */ bNodeTree *ntree = path->nodetree; if (ntree) { snode_setup_v2d(snode, region, center); - /* grid, uses theme color based on node path depth */ + /* Grid, uses theme color based on node path depth. */ UI_view2d_multi_grid_draw(v2d, (depth > 0 ? TH_NODE_GROUP : TH_GRID), ED_node_grid_size(), NODE_GRID_STEPS, grid_levels); - /* backdrop */ + /* Backdrop. */ draw_nodespace_back_pix(C, region, snode, path->parent_key); { @@ -1840,7 +2078,7 @@ void node_draw_space(const bContext *C, ARegion *region) draw_nodetree(C, region, ntree, path->parent_key); } - /* temporary links */ + /* Temporary links. */ GPU_blend(GPU_BLEND_ALPHA); GPU_line_smooth(true); LISTBASE_FOREACH (bNodeLinkDrag *, nldrag, &snode->runtime->linkdrag) { @@ -1852,21 +2090,21 @@ void node_draw_space(const bContext *C, ARegion *region) GPU_blend(GPU_BLEND_NONE); if (snode->flag & SNODE_SHOW_GPENCIL) { - /* draw grease-pencil ('canvas' strokes) */ + /* Draw grease-pencil annotations. */ ED_annotation_draw_view2d(C, true); } } else { - /* default grid */ + /* Default grid. */ UI_view2d_multi_grid_draw(v2d, TH_GRID, ED_node_grid_size(), NODE_GRID_STEPS, grid_levels); - /* backdrop */ + /* Backdrop. */ draw_nodespace_back_pix(C, region, snode, NODE_INSTANCE_KEY_NONE); } ED_region_draw_cb_draw(C, region, REGION_DRAW_POST_VIEW); - /* reset view matrix */ + /* Reset view matrix. */ UI_view2d_view_restore(C); if (snode->treepath.last) { @@ -1876,9 +2114,9 @@ void node_draw_space(const bContext *C, ARegion *region) } } - /* tree path info */ + /* Tree path info. */ draw_tree_path(snode); - /* scrollers */ - UI_view2d_scrollers_draw(v2d, NULL); + /* Scrollers. */ + UI_view2d_scrollers_draw(v2d, nullptr); } diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index c006889f0f7..4826b6c72ba 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -98,6 +98,25 @@ typedef struct CompoJob { float *progress; } CompoJob; +float node_socket_calculate_height(const bNodeSocket *socket) +{ + float sock_height = NODE_SOCKSIZE * 2.0f; + if (socket->flag & SOCK_MULTI_INPUT) { + sock_height += max_ii(NODE_MULTI_INPUT_LINK_GAP * 0.5f * socket->total_inputs, NODE_SOCKSIZE); + } + return sock_height; +} + +void node_link_calculate_multi_input_position(const bNodeLink *link, float r[2]) +{ + float offset = (link->tosock->total_inputs * NODE_MULTI_INPUT_LINK_GAP - + NODE_MULTI_INPUT_LINK_GAP) * + 0.5; + r[0] = link->tosock->locx - NODE_SOCKSIZE * 0.5f; + r[1] = link->tosock->locy - offset + + (link->multi_input_socket_index * NODE_MULTI_INPUT_LINK_GAP); +} + static void compo_tag_output_nodes(bNodeTree *nodetree, int recalc_flags) { LISTBASE_FOREACH (bNode *, node, &nodetree->nodes) { @@ -703,7 +722,7 @@ void ED_node_set_active(Main *bmain, bNodeTree *ntree, bNode *node, bool *r_acti } } - LISTBASE_FOREACH (World *, wo, &bmain->materials) { + LISTBASE_FOREACH (World *, wo, &bmain->worlds) { if (wo->nodetree && wo->use_nodes && ntreeHasTree(wo->nodetree, ntree)) { GPU_material_free(&wo->gpumaterial); } @@ -1104,6 +1123,21 @@ void node_set_hidden_sockets(SpaceNode *snode, bNode *node, int set) } /* checks snode->mouse position, and returns found node/socket */ +static bool cursor_isect_multi_input_socket(const float cursor[2], const bNodeSocket *socket) +{ + const float node_socket_height = node_socket_calculate_height(socket); + const rctf multi_socket_rect = { + .xmin = socket->locx - NODE_SOCKSIZE * 4, + .xmax = socket->locx + NODE_SOCKSIZE, + .ymin = socket->locy - node_socket_height * 0.5 - NODE_SOCKSIZE * 2.0f, + .ymax = socket->locy + node_socket_height * 0.5 + NODE_SOCKSIZE * 2.0f, + }; + if (BLI_rctf_isect_pt(&multi_socket_rect, cursor[0], cursor[1])) { + return true; + } + return false; +} + /* type is SOCK_IN and/or SOCK_OUT */ int node_find_indicated_socket( SpaceNode *snode, bNode **nodep, bNodeSocket **sockp, float cursor[2], int in_out) @@ -1132,7 +1166,16 @@ int node_find_indicated_socket( if (in_out & SOCK_IN) { LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) { if (!nodeSocketIsHidden(sock)) { - if (BLI_rctf_isect_pt(&rect, sock->locx, sock->locy)) { + if (sock->flag & SOCK_MULTI_INPUT && !(node->flag & NODE_HIDDEN)) { + if (cursor_isect_multi_input_socket(cursor, sock)) { + if (node == visible_node(snode, &rect)) { + *nodep = node; + *sockp = sock; + return 1; + } + } + } + else if (BLI_rctf_isect_pt(&rect, sock->locx, sock->locy)) { if (node == visible_node(snode, &rect)) { *nodep = node; *sockp = sock; diff --git a/source/blender/editors/space_node/node_group.c b/source/blender/editors/space_node/node_group.c index 7f530408ec7..b3ae336aadf 100644 --- a/source/blender/editors/space_node/node_group.c +++ b/source/blender/editors/space_node/node_group.c @@ -107,7 +107,7 @@ static const char *group_ntree_idname(bContext *C) return snode->tree_idname; } -static const char *group_node_idname(bContext *C) +const char *node_group_idname(bContext *C) { SpaceNode *snode = CTX_wm_space_node(C); @@ -147,7 +147,7 @@ static bNode *node_group_get_active(bContext *C, const char *node_idname) static int node_group_edit_exec(bContext *C, wmOperator *op) { SpaceNode *snode = CTX_wm_space_node(C); - const char *node_idname = group_node_idname(C); + const char *node_idname = node_group_idname(C); const bool exit = RNA_boolean_get(op->ptr, "exit"); ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C)); @@ -400,7 +400,7 @@ static int node_group_ungroup_exec(bContext *C, wmOperator *op) { Main *bmain = CTX_data_main(C); SpaceNode *snode = CTX_wm_space_node(C); - const char *node_idname = group_node_idname(C); + const char *node_idname = node_group_idname(C); ED_preview_kill_jobs(CTX_wm_manager(C), bmain); @@ -1013,7 +1013,7 @@ static int node_group_make_exec(bContext *C, wmOperator *op) SpaceNode *snode = CTX_wm_space_node(C); bNodeTree *ntree = snode->edittree; const char *ntree_idname = group_ntree_idname(C); - const char *node_idname = group_node_idname(C); + const char *node_idname = node_group_idname(C); Main *bmain = CTX_data_main(C); ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C)); @@ -1070,7 +1070,7 @@ static int node_group_insert_exec(bContext *C, wmOperator *op) { SpaceNode *snode = CTX_wm_space_node(C); bNodeTree *ntree = snode->edittree; - const char *node_idname = group_node_idname(C); + const char *node_idname = node_group_idname(C); Main *bmain = CTX_data_main(C); ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C)); diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index 51333fd5a09..5973d59e68f 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -32,16 +32,20 @@ struct ARegion; struct ARegionType; struct Main; +struct NodeInsertOfsData; struct View2D; struct bContext; struct bNode; struct bNodeLink; struct bNodeSocket; -struct NodeInsertOfsData; struct wmGizmoGroupType; struct wmKeyConfig; struct wmWindow; +#ifdef __cplusplus +extern "C" { +#endif + /* temp data to pass on to modal */ typedef struct bNodeLinkDrag { struct bNodeLinkDrag *next, *prev; @@ -77,7 +81,10 @@ typedef struct SpaceNode_Runtime { /* transform between View2Ds in the tree path */ void space_node_group_offset(struct SpaceNode *snode, float *x, float *y); -/* node_draw.c */ +/* node_draw.cc */ +float node_socket_calculate_height(const bNodeSocket *socket); +void node_link_calculate_multi_input_position(const bNodeLink *link, float r[2]); + int node_get_colorid(struct bNode *node); int node_get_resize_cursor(int directions); void node_draw_shadow(const struct SpaceNode *snode, @@ -178,6 +185,10 @@ bool node_link_bezier_points(const struct View2D *v2d, const struct bNodeLink *link, float coord_array[][2], const int resol); +bool node_link_bezier_handles(const struct View2D *v2d, + const struct SpaceNode *snode, + const struct bNodeLink *link, + float vec[4][2]); void draw_nodespace_back_pix(const struct bContext *C, struct ARegion *region, struct SpaceNode *snode, @@ -187,11 +198,13 @@ void draw_nodespace_back_pix(const struct bContext *C, bNode *node_add_node( const struct bContext *C, const char *idname, int type, float locx, float locy); void NODE_OT_add_reroute(struct wmOperatorType *ot); +void NODE_OT_add_group(struct wmOperatorType *ot); void NODE_OT_add_file(struct wmOperatorType *ot); void NODE_OT_add_mask(struct wmOperatorType *ot); void NODE_OT_new_node_tree(struct wmOperatorType *ot); /* node_group.c */ +const char *node_group_idname(struct bContext *C); void NODE_OT_group_make(struct wmOperatorType *ot); void NODE_OT_group_insert(struct wmOperatorType *ot); void NODE_OT_group_ungroup(struct wmOperatorType *ot); @@ -290,25 +303,10 @@ extern const char *node_context_dir[]; #define NODE_HEIGHT(node) (node->height * UI_DPI_FAC) #define NODE_MARGIN_X (1.10f * U.widget_unit) #define NODE_SOCKSIZE (0.25f * U.widget_unit) +#define NODE_MULTI_INPUT_LINK_GAP (0.25f * U.widget_unit) #define NODE_RESIZE_MARGIN (0.20f * U.widget_unit) #define NODE_LINK_RESOL 12 -/* Button events (butspace) */ -enum eNodeSpace_ButEvents { - B_NOP = 0, - B_REDR = 1, - B_NODE_USEMAT, - B_NODE_USESCENE, - B_NODE_USETEX, - B_TEXBROWSE, - B_TEXALONE, - B_TEXLOCAL, - B_TEXDELETE, - B_TEXPRV, - B_AUTOTEXNAME, - B_KEEPDATA, - B_NODE_EXEC, - B_MATPRV, - B_NODE_LOADIMAGE, - B_NODE_SETIMAGE, -}; +#ifdef __cplusplus +} +#endif diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c index 11933ef0811..7671547363b 100644 --- a/source/blender/editors/space_node/node_ops.c +++ b/source/blender/editors/space_node/node_ops.c @@ -23,14 +23,10 @@ #include "DNA_node_types.h" -#include "BLI_utildefines.h" - #include "BKE_context.h" #include "ED_node.h" /* own include */ #include "ED_screen.h" -#include "ED_select_utils.h" -#include "ED_transform.h" #include "RNA_access.h" @@ -92,6 +88,7 @@ void node_operatortypes(void) WM_operatortype_append(NODE_OT_backimage_fit); WM_operatortype_append(NODE_OT_backimage_sample); + WM_operatortype_append(NODE_OT_add_group); WM_operatortype_append(NODE_OT_add_file); WM_operatortype_append(NODE_OT_add_mask); diff --git a/source/blender/editors/space_node/node_relationships.c b/source/blender/editors/space_node/node_relationships.c index f3ce60bbcd9..d6edfcce8e8 100644 --- a/source/blender/editors/space_node/node_relationships.c +++ b/source/blender/editors/space_node/node_relationships.c @@ -32,6 +32,7 @@ #include "BKE_anim_data.h" #include "BKE_context.h" +#include "BKE_curve.h" #include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_node.h" @@ -179,6 +180,137 @@ typedef struct NodeInsertOfsData { float offset_x; /* offset to apply to node chain */ } NodeInsertOfsData; +static void clear_picking_highlight(ListBase *links) +{ + LISTBASE_FOREACH (bNodeLink *, link, links) { + link->flag &= ~NODE_LINK_TEMP_HIGHLIGHT; + } +} + +static LinkData *create_drag_link(Main *bmain, SpaceNode *snode, bNode *node, bNodeSocket *sock) +{ + LinkData *linkdata = MEM_callocN(sizeof(LinkData), "drag link op link data"); + bNodeLink *oplink = MEM_callocN(sizeof(bNodeLink), "drag link op link"); + linkdata->data = oplink; + if (sock->in_out == SOCK_OUT) { + oplink->fromnode = node; + oplink->fromsock = sock; + } + else { + oplink->tonode = node; + oplink->tosock = sock; + } + oplink->flag |= NODE_LINK_VALID; + oplink->flag &= ~NODE_LINK_TEST; + if (node_connected_to_output(bmain, snode->edittree, node)) { + oplink->flag |= NODE_LINK_TEST; + } + return linkdata; +} + +static void pick_link(const bContext *C, + wmOperator *op, + bNodeLinkDrag *nldrag, + SpaceNode *snode, + bNode *node, + bNodeLink *link_to_pick) +{ + clear_picking_highlight(&snode->edittree->links); + RNA_boolean_set(op->ptr, "has_link_picked", true); + + Main *bmain = CTX_data_main(C); + LinkData *linkdata = create_drag_link( + bmain, snode, link_to_pick->fromnode, link_to_pick->fromsock); + + BLI_addtail(&nldrag->links, linkdata); + nodeRemLink(snode->edittree, link_to_pick); + /* Send changed event to original link->tonode. */ + if (node) { + snode_update(snode, node); + } +} + +static void pick_input_link_by_link_intersect(const bContext *C, + wmOperator *op, + bNodeLinkDrag *nldrag, + const float *cursor) +{ + SpaceNode *snode = CTX_wm_space_node(C); + const ARegion *region = CTX_wm_region(C); + const View2D *v2d = ®ion->v2d; + + float drag_start[2]; + RNA_float_get_array(op->ptr, "drag_start", drag_start); + bNode *node; + bNodeSocket *socket; + node_find_indicated_socket(snode, &node, &socket, drag_start, SOCK_IN); + + const float trigger_drag_distance = 25.0f; + const float cursor_link_touch_distance = 25.0f; + + const float socket_height = node_socket_calculate_height(socket); + + float cursor_to_socket_relative[2]; + float socket_position[2] = {socket->locx, socket->locy}; + sub_v2_v2v2(cursor_to_socket_relative, cursor, socket_position); + float distance_from_socket_v2[2] = { + max_ff(0, fabs(cursor_to_socket_relative[0]) - NODE_SOCKSIZE * 0.5), + max_ff(0, fabs(cursor_to_socket_relative[1]) - socket_height)}; + const float distance_from_socket = len_v2(distance_from_socket_v2); + + const int resolution = NODE_LINK_RESOL; + + bNodeLink *link_to_pick = NULL; + clear_picking_highlight(&snode->edittree->links); + LISTBASE_FOREACH (bNodeLink *, link, &snode->edittree->links) { + if (link->tosock == socket) { + /* Test if the cursor is near a link. */ + float vec[4][2]; + node_link_bezier_handles(v2d, snode, link, vec); + + float data[NODE_LINK_RESOL * 2 + 2]; + BKE_curve_forward_diff_bezier( + vec[0][0], vec[1][0], vec[2][0], vec[3][0], data, resolution, sizeof(float[2])); + BKE_curve_forward_diff_bezier( + vec[0][1], vec[1][1], vec[2][1], vec[3][1], data + 1, resolution, sizeof(float[2])); + + for (int i = 0; i < resolution * 2; i += 2) { + float *l1 = &data[i]; + float *l2 = &data[i + 2]; + float distance = dist_squared_to_line_segment_v2(cursor, l1, l2); + if (distance < cursor_link_touch_distance) { + link_to_pick = link; + RNA_int_set(op->ptr, "last_picked_link_index", link->multi_input_socket_index); + } + } + } + } + + /* If no linked was picked in this call, try using the one picked in the previous call. + * Not essential for the basic behavior, but can make interaction feel a bit better if + * the mouse moves to the right and loses the "selection." */ + if (!link_to_pick) { + int last_picked_link_index = RNA_int_get(op->ptr, "last_picked_link_index"); + if (last_picked_link_index > -1) { + LISTBASE_FOREACH (bNodeLink *, link, &snode->edittree->links) { + if (link->multi_input_socket_index == last_picked_link_index) { + link_to_pick = link; + } + } + } + } + + if (link_to_pick) { + /* Highlight is set here and cleared in the next iteration or if the operation finishes. */ + link_to_pick->flag |= NODE_LINK_TEMP_HIGHLIGHT; + ED_area_tag_redraw(CTX_wm_area(C)); + + if (distance_from_socket > trigger_drag_distance) { + pick_link(C, op, nldrag, snode, node, link_to_pick); + } + } +} + static int sort_nodes_locx(const void *a, const void *b) { const bNodeListItem *nli1 = a; @@ -600,6 +732,13 @@ static void node_remove_extra_links(SpaceNode *snode, bNodeLink *link) tlink = NULL; to_count--; } + else if (tlink->fromsock == from) { + /* Also remove link if it comes from the same output. */ + nodeRemLink(ntree, tlink); + tlink = NULL; + to_count--; + from_count--; + } } } } @@ -748,10 +887,15 @@ static int node_link_modal(bContext *C, wmOperator *op, const wmEvent *event) switch (event->type) { case MOUSEMOVE: - node_link_find_socket(C, op, cursor); + if (nldrag->from_multi_input_socket && !RNA_boolean_get(op->ptr, "has_link_picked")) { + pick_input_link_by_link_intersect(C, op, nldrag, cursor); + } + else { + node_link_find_socket(C, op, cursor); - node_link_update_header(C, nldrag); - ED_region_tag_redraw(region); + node_link_update_header(C, nldrag); + ED_region_tag_redraw(region); + } break; case LEFTMOUSE: @@ -762,6 +906,8 @@ static int node_link_modal(bContext *C, wmOperator *op, const wmEvent *event) ED_workspace_status_text(C, NULL); ED_region_tag_redraw(region); + SpaceNode *snode = CTX_wm_space_node(C); + clear_picking_highlight(&snode->edittree->links); return OPERATOR_FINISHED; } break; @@ -817,16 +963,7 @@ static bNodeLinkDrag *node_link_init(Main *bmain, SpaceNode *snode, float cursor /* dragged links are fixed on output side */ nldrag->in_out = SOCK_OUT; /* create a new link */ - LinkData *linkdata = MEM_callocN(sizeof(LinkData), "drag link op link data"); - bNodeLink *oplink = MEM_callocN(sizeof(bNodeLink), "drag link op link"); - linkdata->data = oplink; - oplink->fromnode = node; - oplink->fromsock = sock; - oplink->flag |= NODE_LINK_VALID; - oplink->flag &= ~NODE_LINK_TEST; - if (node_connected_to_output(bmain, snode->edittree, node)) { - oplink->flag |= NODE_LINK_TEST; - } + LinkData *linkdata = create_drag_link(bmain, snode, node, sock); BLI_addtail(&nldrag->links, linkdata); } @@ -875,16 +1012,7 @@ static bNodeLinkDrag *node_link_init(Main *bmain, SpaceNode *snode, float cursor /* dragged links are fixed on input side */ nldrag->in_out = SOCK_IN; /* create a new link */ - LinkData *linkdata = MEM_callocN(sizeof(LinkData), "drag link op link data"); - bNodeLink *oplink = MEM_callocN(sizeof(bNodeLink), "drag link op link"); - linkdata->data = oplink; - oplink->tonode = node; - oplink->tosock = sock; - oplink->flag |= NODE_LINK_VALID; - oplink->flag &= ~NODE_LINK_TEST; - if (node_connected_to_output(bmain, snode->edittree, node)) { - oplink->flag |= NODE_LINK_TEST; - } + LinkData *linkdata = create_drag_link(bmain, snode, node, sock); BLI_addtail(&nldrag->links, linkdata); } @@ -904,6 +1032,7 @@ static int node_link_invoke(bContext *C, wmOperator *op, const wmEvent *event) float cursor[2]; UI_view2d_region_to_view(®ion->v2d, event->mval[0], event->mval[1], &cursor[0], &cursor[1]); RNA_float_set_array(op->ptr, "drag_start", cursor); + RNA_int_set(op->ptr, "last_picked_link_index", -1); RNA_boolean_set(op->ptr, "has_link_picked", false); ED_preview_kill_jobs(CTX_wm_manager(C), bmain); @@ -931,6 +1060,7 @@ static void node_link_cancel(bContext *C, wmOperator *op) BLI_freelistN(&nldrag->links); MEM_freeN(nldrag); + clear_picking_highlight(&snode->edittree->links); } void NODE_OT_link(wmOperatorType *ot) @@ -972,6 +1102,16 @@ void NODE_OT_link(wmOperatorType *ot) -UI_PRECISION_FLOAT_MAX, UI_PRECISION_FLOAT_MAX); RNA_def_property_flag(prop, PROP_HIDDEN); + RNA_def_int(ot->srna, + "last_picked_link_index", + -1, + -1, + 4095, + "Last Picked Link Index", + "The index of the last picked link on a multi-input socket", + -1, + 4095); + RNA_def_property_flag(prop, PROP_HIDDEN); } /* ********************** Make Link operator ***************** */ diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c index a41f99afb4c..58d22c2864f 100644 --- a/source/blender/editors/space_node/node_select.c +++ b/source/blender/editors/space_node/node_select.c @@ -26,7 +26,6 @@ #include "DNA_node_types.h" #include "DNA_windowmanager_types.h" -#include "BLI_alloca.h" #include "BLI_lasso_2d.h" #include "BLI_listbase.h" #include "BLI_math.h" @@ -730,7 +729,7 @@ void NODE_OT_select_box(wmOperatorType *ot) "tweak", 0, "Tweak", - "Only activate when mouse is not over a node - useful for tweak gesture"); + "Only activate when mouse is not over a node (useful for tweak gesture)"); WM_operator_properties_gesture_box(ot); WM_operator_properties_select_operation_simple(ot); @@ -906,7 +905,7 @@ void NODE_OT_select_lasso(wmOperatorType *ot) "tweak", 0, "Tweak", - "Only activate when mouse is not over a node - useful for tweak gesture"); + "Only activate when mouse is not over a node (useful for tweak gesture)"); WM_operator_properties_gesture_lasso(ot); WM_operator_properties_select_operation_simple(ot); diff --git a/source/blender/editors/space_node/node_templates.c b/source/blender/editors/space_node/node_templates.c index 553971cd0a5..f0e3f5442cc 100644 --- a/source/blender/editors/space_node/node_templates.c +++ b/source/blender/editors/space_node/node_templates.c @@ -35,7 +35,6 @@ #include "BKE_context.h" #include "BKE_lib_id.h" #include "BKE_main.h" -#include "BKE_scene.h" #include "RNA_access.h" diff --git a/source/blender/editors/space_node/node_toolbar.c b/source/blender/editors/space_node/node_toolbar.c index 7afd3fef4db..2e7d6ab6cd5 100644 --- a/source/blender/editors/space_node/node_toolbar.c +++ b/source/blender/editors/space_node/node_toolbar.c @@ -29,9 +29,6 @@ #include "BKE_screen.h" #include "WM_api.h" -#include "WM_types.h" - -#include "ED_screen.h" #include "node_intern.h" /* own include */ diff --git a/source/blender/editors/space_node/node_view.c b/source/blender/editors/space_node/node_view.c index d938cb38270..8f1dc3c8c3e 100644 --- a/source/blender/editors/space_node/node_view.c +++ b/source/blender/editors/space_node/node_view.c @@ -52,7 +52,6 @@ #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" -#include "NOD_composite.h" #include "node_intern.h" /* own include */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index 94915022ce9..289b7d9efa1 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -35,7 +35,6 @@ #include "BKE_context.h" #include "BKE_lib_id.h" #include "BKE_node.h" -#include "BKE_scene.h" #include "BKE_screen.h" #include "ED_node.h" @@ -80,7 +79,12 @@ void ED_node_tree_start(SpaceNode *snode, bNodeTree *ntree, ID *id, ID *from) BLI_addtail(&snode->treepath, path); - id_us_ensure_real(&ntree->id); + if (ntree->type != NTREE_GEOMETRY) { + /* This can probably be removed for all node tree types. It mainly exists because it was not + * possible to store id references in custom properties. Also see T36024. I don't want to + * remove it for all tree types in bcon3 though. */ + id_us_ensure_real(&ntree->id); + } } /* update current tree */ @@ -655,6 +659,14 @@ static void node_main_region_draw(const bContext *C, ARegion *region) /* ************* dropboxes ************* */ +static bool node_group_drop_poll(bContext *UNUSED(C), + wmDrag *drag, + const wmEvent *UNUSED(event), + const char **UNUSED(r_tooltip)) +{ + return WM_drag_is_ID_type(drag, ID_NT); +} + static bool node_ima_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *UNUSED(event), @@ -675,6 +687,13 @@ static bool node_mask_drop_poll(bContext *UNUSED(C), return WM_drag_is_ID_type(drag, ID_MSK); } +static void node_group_drop_copy(wmDrag *drag, wmDropBox *drop) +{ + ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0); + + RNA_string_set(drop->ptr, "name", id->name + 2); +} + static void node_id_drop_copy(wmDrag *drag, wmDropBox *drop) { ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0); @@ -701,8 +720,21 @@ static void node_dropboxes(void) { ListBase *lb = WM_dropboxmap_find("Node Editor", SPACE_NODE, RGN_TYPE_WINDOW); - WM_dropbox_add(lb, "NODE_OT_add_file", node_ima_drop_poll, node_id_path_drop_copy); - WM_dropbox_add(lb, "NODE_OT_add_mask", node_mask_drop_poll, node_id_drop_copy); + WM_dropbox_add(lb, + "NODE_OT_add_group", + node_group_drop_poll, + node_group_drop_copy, + WM_drag_free_imported_drag_ID); + WM_dropbox_add(lb, + "NODE_OT_add_file", + node_ima_drop_poll, + node_id_path_drop_copy, + WM_drag_free_imported_drag_ID); + WM_dropbox_add(lb, + "NODE_OT_add_mask", + node_mask_drop_poll, + node_id_drop_copy, + WM_drag_free_imported_drag_ID); } /* ************* end drop *********** */ diff --git a/source/blender/editors/space_outliner/outliner_collections.c b/source/blender/editors/space_outliner/outliner_collections.c index e686648038d..0afc26e0d8a 100644 --- a/source/blender/editors/space_outliner/outliner_collections.c +++ b/source/blender/editors/space_outliner/outliner_collections.c @@ -28,6 +28,7 @@ #include "BKE_collection.h" #include "BKE_context.h" +#include "BKE_idtype.h" #include "BKE_layer.h" #include "BKE_lib_id.h" #include "BKE_main.h" @@ -361,8 +362,14 @@ void outliner_collection_delete( break; } if (parent->flag & COLLECTION_IS_MASTER) { - Scene *parent_scene = BKE_collection_master_scene_search(bmain, parent); - if (ID_IS_LINKED(parent_scene)) { + BLI_assert(parent->id.flag & LIB_EMBEDDED_DATA); + + const IDTypeInfo *id_type = BKE_idtype_get_info_from_id(&parent->id); + BLI_assert(id_type->owner_get != NULL); + + ID *scene_owner = id_type->owner_get(bmain, &parent->id); + BLI_assert(GS(scene_owner->name) == ID_SCE); + if (ID_IS_LINKED(scene_owner)) { skip = true; break; } @@ -592,11 +599,18 @@ static int collection_duplicate_exec(bContext *C, wmOperator *op) scene->master_collection; } else if (parent != NULL && (parent->flag & COLLECTION_IS_MASTER) != 0) { - Scene *scene = BKE_collection_master_scene_search(bmain, parent); - BLI_assert(scene != NULL); - if (ID_IS_LINKED(scene) || ID_IS_OVERRIDE_LIBRARY(scene)) { - scene = CTX_data_scene(C); - parent = ID_IS_LINKED(scene) ? NULL : scene->master_collection; + BLI_assert(parent->id.flag & LIB_EMBEDDED_DATA); + + const IDTypeInfo *id_type = BKE_idtype_get_info_from_id(&parent->id); + BLI_assert(id_type->owner_get != NULL); + + Scene *scene_owner = (Scene *)id_type->owner_get(bmain, &parent->id); + BLI_assert(scene_owner != NULL); + BLI_assert(GS(scene_owner->id.name) == ID_SCE); + + if (ID_IS_LINKED(scene_owner) || ID_IS_OVERRIDE_LIBRARY(scene_owner)) { + scene_owner = CTX_data_scene(C); + parent = ID_IS_LINKED(scene_owner) ? NULL : scene_owner->master_collection; } } diff --git a/source/blender/editors/space_outliner/outliner_context.c b/source/blender/editors/space_outliner/outliner_context.c index a314a640e42..e2b3b79e027 100644 --- a/source/blender/editors/space_outliner/outliner_context.c +++ b/source/blender/editors/space_outliner/outliner_context.c @@ -27,8 +27,6 @@ #include "DNA_space_types.h" -#include "RNA_access.h" - #include "outliner_intern.h" static void outliner_context_selected_ids_recursive(const ListBase *subtree, diff --git a/source/blender/editors/space_outliner/outliner_dragdrop.c b/source/blender/editors/space_outliner/outliner_dragdrop.c index 70aeef76234..3090cab75ae 100644 --- a/source/blender/editors/space_outliner/outliner_dragdrop.c +++ b/source/blender/editors/space_outliner/outliner_dragdrop.c @@ -1213,11 +1213,23 @@ static bool collection_drop_poll(bContext *C, *r_tooltip = TIP_("Move after collection"); } break; - case TE_INSERT_INTO: + case TE_INSERT_INTO: { tselem->flag |= TSE_DRAG_INTO; changed = true; - *r_tooltip = TIP_("Move inside collection (Ctrl to link, Shift to parent)"); + + /* Check the type of the drag IDs to avoid the incorrect "Shift to parent" + * for collections. Checking the type of the first ID works fine here since + * all drag IDs are the same type. */ + wmDragID *drag_id = (wmDragID *)drag->ids.first; + const bool is_object = (GS(drag_id->id->name) == ID_OB); + if (is_object) { + *r_tooltip = TIP_("Move inside collection (Ctrl to link, Shift to parent)"); + } + else { + *r_tooltip = TIP_("Move inside collection (Ctrl to link)"); + } break; + } } } if (changed) { @@ -1483,7 +1495,7 @@ static int outliner_item_drag_drop_invoke(bContext *C, /* Outliner drag and drop. This operator mostly exists to support dragging * from outliner text instead of only from the icon, and also to show a - * hint in the statusbar keymap. */ + * hint in the status-bar key-map. */ void OUTLINER_OT_item_drag_drop(wmOperatorType *ot) { @@ -1504,10 +1516,10 @@ void outliner_dropboxes(void) { ListBase *lb = WM_dropboxmap_find("Outliner", SPACE_OUTLINER, RGN_TYPE_WINDOW); - WM_dropbox_add(lb, "OUTLINER_OT_parent_drop", parent_drop_poll, NULL); - WM_dropbox_add(lb, "OUTLINER_OT_parent_clear", parent_clear_poll, NULL); - WM_dropbox_add(lb, "OUTLINER_OT_scene_drop", scene_drop_poll, NULL); - WM_dropbox_add(lb, "OUTLINER_OT_material_drop", material_drop_poll, NULL); - WM_dropbox_add(lb, "OUTLINER_OT_datastack_drop", datastack_drop_poll, NULL); - WM_dropbox_add(lb, "OUTLINER_OT_collection_drop", collection_drop_poll, NULL); + WM_dropbox_add(lb, "OUTLINER_OT_parent_drop", parent_drop_poll, NULL, NULL); + WM_dropbox_add(lb, "OUTLINER_OT_parent_clear", parent_clear_poll, NULL, NULL); + WM_dropbox_add(lb, "OUTLINER_OT_scene_drop", scene_drop_poll, NULL, NULL); + WM_dropbox_add(lb, "OUTLINER_OT_material_drop", material_drop_poll, NULL, NULL); + WM_dropbox_add(lb, "OUTLINER_OT_datastack_drop", datastack_drop_poll, NULL, NULL); + WM_dropbox_add(lb, "OUTLINER_OT_collection_drop", collection_drop_poll, NULL, NULL); } diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c index 35756ea5ac7..008ae727947 100644 --- a/source/blender/editors/space_outliner/outliner_draw.c +++ b/source/blender/editors/space_outliner/outliner_draw.c @@ -760,7 +760,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname) char newname[sizeof(bone->name)]; /* always make current object active */ - tree_element_active(C, &tvc, space_outliner, te, OL_SETSEL_NORMAL, true); + tree_element_activate(C, &tvc, te, OL_SETSEL_NORMAL, true); /* restore bone name */ BLI_strncpy(newname, bone->name, sizeof(bone->name)); @@ -778,7 +778,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname) char newname[sizeof(pchan->name)]; /* always make current pose-bone active */ - tree_element_active(C, &tvc, space_outliner, te, OL_SETSEL_NORMAL, true); + tree_element_activate(C, &tvc, te, OL_SETSEL_NORMAL, true); BLI_assert(ob->type == OB_ARMATURE); @@ -1876,9 +1876,7 @@ static void outliner_buttons(const bContext *C, tselem = TREESTORE(te); BLI_assert(tselem->flag & TSE_TEXTBUT); - /* If we add support to rename Sequence. - * need change this. - */ + /* If we add support to rename Sequence, need change this. */ if (tselem->type == TSE_EBONE) { len = sizeof(((EditBone *)0)->name); @@ -1912,11 +1910,11 @@ static void outliner_buttons(const bContext *C, ""); UI_but_func_rename_set(bt, namebutton_fn, tselem); - /* returns false if button got removed */ + /* Returns false if button got removed. */ if (false == UI_but_active_only(C, region, block, bt)) { tselem->flag &= ~TSE_TEXTBUT; - /* bad! (notifier within draw) without this, we don't get a refresh */ + /* Bad! (notifier within draw) without this, we don't get a refresh. */ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_OUTLINER, NULL); } } @@ -2287,12 +2285,6 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te) case TSE_R_LAYER: data.icon = ICON_RENDER_RESULT; break; - case TSE_LINKED_LAMP: - data.icon = ICON_LIGHT_DATA; - break; - case TSE_LINKED_MAT: - data.icon = ICON_MATERIAL_DATA; - break; case TSE_POSEGRP_BASE: case TSE_POSEGRP: data.icon = ICON_GROUP_BONE; @@ -2629,7 +2621,7 @@ static void tselem_draw_icon(uiBlock *block, /* Collection colors and icons covered by restrict buttons. */ if (!is_clickable || x >= xmax || is_collection) { - /* placement of icons, copied from interface_widgets.c */ + /* Placement of icons, copied from interface_widgets.c */ float aspect = (0.8f * UI_UNIT_Y) / ICON_DEFAULT_HEIGHT; x += 2.0f * aspect; y += 2.0f * aspect; @@ -2653,8 +2645,7 @@ static void tselem_draw_icon(uiBlock *block, /* Reduce alpha to match icon buttons */ alpha *= 0.8f; - /* restrict column clip... it has been coded by simply overdrawing, - * doesn't work for buttons */ + /* Restrict column clip. it has been coded by simply overdrawing, doesn't work for buttons. */ uchar color[4]; if (UI_icon_get_theme_color(data.icon, color)) { UI_icon_draw_ex(x, y, data.icon, U.inv_dpi_fac, alpha, 0.0f, color, true); @@ -2881,16 +2872,11 @@ static void outliner_draw_iconrow(bContext *C, active = OL_DRAWSEL_ACTIVE; } else { - active = tree_element_active(C, tvc, space_outliner, te, OL_SETSEL_NONE, false); + active = tree_element_active_state_get(tvc, te, tselem); } } - else if (tselem->type == TSE_GP_LAYER) { - bGPDlayer *gpl = te->directdata; - active = (gpl->flag & GP_LAYER_ACTIVE) ? OL_DRAWSEL_ACTIVE : OL_DRAWSEL_NONE; - } else { - active = tree_element_type_active( - C, tvc, space_outliner, te, tselem, OL_SETSEL_NONE, false); + active = tree_element_type_active_state_get(C, tvc, te, tselem); } if (!ELEM(tselem->type, 0, TSE_LAYER_COLLECTION, TSE_R_LAYER, TSE_GP_LAYER)) { @@ -2964,6 +2950,41 @@ static void outliner_set_coord_tree_element(TreeElement *te, int startx, int sta } } +static bool element_should_draw_faded(const TreeViewContext *tvc, + const TreeElement *te, + const TreeStoreElem *tselem) +{ + if (tselem->type == 0) { + switch (te->idcode) { + case ID_OB: { + const Object *ob = (const Object *)tselem->id; + /* Lookup in view layer is logically const as it only checks a cache. */ + const Base *base = (te->directdata) ? (const Base *)te->directdata : + BKE_view_layer_base_find( + (ViewLayer *)tvc->view_layer, (Object *)ob); + const bool is_visible = (base != NULL) && (base->flag & BASE_VISIBLE_VIEWLAYER); + if (!is_visible) { + return true; + } + } + } + } + switch (tselem->type) { + case TSE_LAYER_COLLECTION: { + const LayerCollection *layer_collection = (const LayerCollection *)te->directdata; + const bool is_visible = layer_collection->runtime_flag & LAYER_COLLECTION_VISIBLE_VIEW_LAYER; + const bool is_excluded = layer_collection->flag & LAYER_COLLECTION_EXCLUDE; + return !is_visible || is_excluded; + } + } + + if (te->flag & TE_CHILD_NOT_IN_COLLECTION) { + return true; + } + + return false; +} + static void outliner_draw_tree_element(bContext *C, uiBlock *block, const uiFontStyle *fstyle, @@ -2987,33 +3008,23 @@ static void outliner_draw_tree_element(bContext *C, outliner_icon_background_colors(icon_bgcolor, icon_border); if (*starty + 2 * UI_UNIT_Y >= region->v2d.cur.ymin && *starty <= region->v2d.cur.ymax) { - const float alpha_fac = ((te->flag & TE_DISABLED) || (te->flag & TE_CHILD_NOT_IN_COLLECTION) || - draw_grayed_out) ? - 0.5f : - 1.0f; + const float alpha_fac = element_should_draw_faded(tvc, te, tselem) ? 0.5f : 1.0f; int xmax = region->v2d.cur.xmax; if ((tselem->flag & TSE_TEXTBUT) && (*te_edit == NULL)) { *te_edit = te; } - /* icons can be ui buts, we don't want it to overlap with restrict */ + /* Icons can be ui buts, we don't want it to overlap with restrict .*/ if (restrict_column_width > 0) { xmax -= restrict_column_width + UI_UNIT_X; } GPU_blend(GPU_BLEND_ALPHA); - /* colors for active/selected data */ + /* Colors for active/selected data. */ if (tselem->type == 0) { - if (te->idcode == ID_SCE) { - if (tselem->id == (ID *)tvc->scene) { - /* active scene */ - icon_bgcolor[3] = 0.2f; - active = OL_DRAWSEL_ACTIVE; - } - } - else if (te->idcode == ID_OB) { + if (te->idcode == ID_OB) { Object *ob = (Object *)tselem->id; Base *base = (te->directdata) ? (Base *)te->directdata : BKE_view_layer_base_find(tvc->view_layer, ob); @@ -3025,44 +3036,36 @@ static void outliner_draw_tree_element(bContext *C, if (is_selected) { if (ob == tvc->obact) { - /* active selected object */ + /* Active selected object. */ UI_GetThemeColor3ubv(TH_ACTIVE_OBJECT, text_color); text_color[3] = 255; } else { - /* other selected objects */ + /* Other selected objects. */ UI_GetThemeColor3ubv(TH_SELECTED_OBJECT, text_color); text_color[3] = 255; } } } else if (is_object_data_in_editmode(tselem->id, tvc->obact)) { - /* objects being edited */ + /* Objects being edited. */ UI_GetThemeColor4fv(TH_EDITED_OBJECT, icon_bgcolor); icon_border[3] = 0.3f; active = OL_DRAWSEL_ACTIVE; } else { - if (tree_element_active(C, tvc, space_outliner, te, OL_SETSEL_NONE, false)) { - /* active items like camera or material */ + if (tree_element_active_state_get(tvc, te, tselem)) { + /* Active items like camera or material. */ icon_bgcolor[3] = 0.2f; active = OL_DRAWSEL_ACTIVE; } } } - else if (tselem->type == TSE_GP_LAYER) { - /* Active grease pencil layer. */ - if (((bGPDlayer *)te->directdata)->flag & GP_LAYER_ACTIVE) { - icon_bgcolor[3] = 0.2f; - active = OL_DRAWSEL_ACTIVE; - } - } else { - active = tree_element_type_active(C, tvc, space_outliner, te, tselem, OL_SETSEL_NONE, false); - /* Active collection. */ + active = tree_element_type_active_state_get(C, tvc, te, tselem); } - /* active circle */ + /* Active circle. */ if (active != OL_DRAWSEL_NONE) { outliner_draw_active_indicator((float)startx + offsx + UI_UNIT_X, (float)*starty, @@ -3098,7 +3101,7 @@ static void outliner_draw_tree_element(bContext *C, } offsx += UI_UNIT_X; - /* datatype icon */ + /* Data-type icon. */ if (!(ELEM(tselem->type, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM, TSE_ID_BASE))) { tselem_draw_icon(block, xmax, @@ -3125,7 +3128,7 @@ static void outliner_draw_tree_element(bContext *C, } GPU_blend(GPU_BLEND_NONE); - /* name */ + /* Name. */ if ((tselem->flag & TSE_TEXTBUT) == 0) { if (ELEM(tselem->type, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM)) { UI_GetThemeColorBlend3ubv(TH_BACK, TH_TEXT, 0.75f, text_color); @@ -3137,11 +3140,11 @@ static void outliner_draw_tree_element(bContext *C, offsx += (int)(UI_UNIT_X + UI_fontstyle_string_width(fstyle, te->name)); - /* closed item, we draw the icons, not when it's a scene, or master-server list though */ + /* Closed item, we draw the icons, not when it's a scene, or master-server list though. */ if (!TSELEM_OPEN(tselem, space_outliner)) { if (te->subtree.first) { if (tselem->type == 0 && te->idcode == ID_SCE) { - /* pass */ + /* Pass. */ } /* this tree element always has same amount of branches, so don't draw */ else if (tselem->type != TSE_R_LAYER) { @@ -3168,7 +3171,7 @@ static void outliner_draw_tree_element(bContext *C, } } } - /* store coord and continue, we need coordinates for elements outside view too */ + /* Store coord and continue, we need coordinates for elements outside view too. */ te->xs = startx; te->ys = *starty; te->xend = startx + offsx; @@ -3322,7 +3325,7 @@ static void outliner_draw_struct_marks(ARegion *region, LISTBASE_FOREACH (TreeElement *, te, lb) { TreeStoreElem *tselem = TREESTORE(te); - /* selection status */ + /* Selection status. */ if (TSELEM_OPEN(tselem, space_outliner)) { if (tselem->type == TSE_RNA_STRUCT) { GPUVertFormat *format = immVertexFormat(); @@ -3373,7 +3376,7 @@ static void outliner_draw_highlights_recursive(uint pos, const TreeStoreElem *tselem = TREESTORE(te); const int start_y = *io_start_y; - /* selection status */ + /* Selection status. */ if ((tselem->flag & TSE_ACTIVE) && (tselem->flag & TSE_SELECTED)) { immUniformColor4fv(col_active); immRecti(pos, 0, start_y, (int)region->v2d.cur.xmax, start_y + UI_UNIT_Y); @@ -3383,12 +3386,12 @@ static void outliner_draw_highlights_recursive(uint pos, immRecti(pos, 0, start_y, (int)region->v2d.cur.xmax, start_y + UI_UNIT_Y); } - /* highlights */ + /* Highlights. */ if (tselem->flag & (TSE_DRAG_ANY | TSE_HIGHLIGHTED | TSE_SEARCHMATCH)) { const int end_x = (int)region->v2d.cur.xmax; if (tselem->flag & TSE_DRAG_ANY) { - /* drag and drop highlight */ + /* Drag and drop highlight. */ float col[4]; UI_GetThemeColorShade4fv(TH_BACK, -40, col); @@ -3411,14 +3414,13 @@ static void outliner_draw_highlights_recursive(uint pos, } else { if (is_searching && (tselem->flag & TSE_SEARCHMATCH)) { - /* search match highlights - * we don't expand items when searching in the data-blocks but we - * still want to highlight any filter matches. */ + /* Search match highlights. We don't expand items when searching in the data-blocks, + * but we still want to highlight any filter matches. */ immUniformColor4fv(col_searchmatch); immRecti(pos, start_x, start_y, end_x, start_y + UI_UNIT_Y); } else if (tselem->flag & TSE_HIGHLIGHTED) { - /* mouse hover highlight */ + /* Mouse hover highlight. */ immUniformColor4fv(col_highlight); immRecti(pos, 0, start_y, end_x, start_y + UI_UNIT_Y); } @@ -3450,9 +3452,9 @@ static void outliner_draw_highlights(ARegion *region, float col_selection[4], col_active[4], col_searchmatch[4]; UI_GetThemeColor3fv(TH_SELECT_HIGHLIGHT, col_selection); - col_selection[3] = 1.0f; /* no alpha */ + col_selection[3] = 1.0f; /* No alpha. */ UI_GetThemeColor3fv(TH_SELECT_ACTIVE, col_active); - col_active[3] = 1.0f; /* no alpha */ + col_active[3] = 1.0f; /* No alpha. */ UI_GetThemeColor4fv(TH_MATCH, col_searchmatch); col_searchmatch[3] = 0.5f; @@ -3502,12 +3504,12 @@ static void outliner_draw_tree(bContext *C, outliner_draw_struct_marks(region, space_outliner, &space_outliner->tree, &starty); } - /* draw highlights before hierarchy */ + /* Draw highlights before hierarchy. */ starty = (int)region->v2d.tot.ymax - UI_UNIT_Y - OL_Y_OFFSET; startx = 0; outliner_draw_highlights(region, space_outliner, startx, &starty); - /* set scissor so tree elements or lines can't overlap restriction icons */ + /* Set scissor so tree elements or lines can't overlap restriction icons. */ int scissor[4] = {0}; if (restrict_column_width > 0.0f) { int mask_x = BLI_rcti_size_x(®ion->v2d.mask) - (int)restrict_column_width + 1; @@ -3541,7 +3543,7 @@ static void outliner_draw_tree(bContext *C, } if (restrict_column_width > 0.0f) { - /* reset scissor */ + /* Reset scissor. */ GPU_scissor(UNPACK4(scissor)); } } @@ -3608,7 +3610,7 @@ static void outliner_update_viewable_area(ARegion *region, int sizex = outliner_width(space_outliner, tree_width, restrict_column_width); int sizey = tree_height; - /* extend size to allow for horizontal scrollbar and extra offset */ + /* Extend size to allow for horizontal scrollbar and extra offset. */ sizey += V2D_SCROLL_HEIGHT + OL_Y_OFFSET; UI_view2d_totRect_set(®ion->v2d, sizex, sizey); @@ -3631,27 +3633,27 @@ void draw_outliner(const bContext *C) outliner_build_tree(mainvar, tvc.scene, tvc.view_layer, space_outliner, region); /* Always. */ - /* If global sync select is dirty, flag other outliners */ + /* If global sync select is dirty, flag other outliners. */ if (ED_outliner_select_sync_is_dirty(C)) { ED_outliner_select_sync_flag_outliners(C); } - /* Sync selection state from view layer */ + /* Sync selection state from view layer. */ if (!ELEM(space_outliner->outlinevis, SO_LIBRARIES, SO_DATA_API, SO_ID_ORPHANS) && space_outliner->flag & SO_SYNC_SELECT) { outliner_sync_selection(C, space_outliner); } - /* force display to pixel coords */ + /* Force display to pixel coords. */ v2d->flag |= (V2D_PIXELOFS_X | V2D_PIXELOFS_Y); - /* set matrix for 2d-view controls */ + /* Set matrix for 2D-view controls. */ UI_view2d_view_ortho(v2d); - /* Only show mode column in View Layers and Scenes view */ + /* Only show mode column in View Layers and Scenes view. */ const bool use_mode_column = (space_outliner->flag & SO_MODE_COLUMN) && (ELEM(space_outliner->outlinevis, SO_VIEW_LAYER, SO_SCENES)); - /* draw outliner stuff (background, hierarchy lines and names) */ + /* Draw outliner stuff (background, hierarchy lines and names). */ const float restrict_column_width = outliner_restrict_columns_width(space_outliner); outliner_back(region); block = UI_block_begin(C, region, __func__, UI_EMBOSS); diff --git a/source/blender/editors/space_outliner/outliner_edit.c b/source/blender/editors/space_outliner/outliner_edit.c index 7df8e9e1de4..d1260f02c67 100644 --- a/source/blender/editors/space_outliner/outliner_edit.c +++ b/source/blender/editors/space_outliner/outliner_edit.c @@ -2267,29 +2267,19 @@ static bool ed_operator_outliner_id_orphans_active(bContext *C) /** \} */ -static void outliner_orphans_purge_tag(ID *id, int *num_tagged) -{ - if (id->us == 0) { - id->tag |= LIB_TAG_DOIT; - num_tagged[INDEX_ID_NULL]++; - num_tagged[BKE_idtype_idcode_to_index(GS(id->name))]++; - } - else { - id->tag &= ~LIB_TAG_DOIT; - } -} - static int outliner_orphans_purge_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(evt)) { Main *bmain = CTX_data_main(C); int num_tagged[INDEX_ID_MAX] = {0}; - /* Tag all IDs having zero users. */ - ID *id; - FOREACH_MAIN_ID_BEGIN (bmain, id) { - outliner_orphans_purge_tag(id, num_tagged); - } - FOREACH_MAIN_ID_END; + const bool do_local_ids = RNA_boolean_get(op->ptr, "do_local_ids"); + const bool do_linked_ids = RNA_boolean_get(op->ptr, "do_linked_ids"); + const bool do_recursive_cleanup = RNA_boolean_get(op->ptr, "do_recursive"); + + /* Tag all IDs to delete. */ + BKE_lib_query_unused_ids_tag( + bmain, LIB_TAG_DOIT, do_local_ids, do_linked_ids, do_recursive_cleanup, num_tagged); + RNA_int_set(op->ptr, "num_deleted", num_tagged[INDEX_ID_NULL]); if (num_tagged[INDEX_ID_NULL] == 0) { @@ -2298,7 +2288,7 @@ static int outliner_orphans_purge_invoke(bContext *C, wmOperator *op, const wmEv } DynStr *dyn_str = BLI_dynstr_new(); - BLI_dynstr_append(dyn_str, "Purging unused data-blocks ("); + BLI_dynstr_appendf(dyn_str, "Purging %d unused data-blocks (", num_tagged[INDEX_ID_NULL]); bool is_first = true; for (int i = 0; i < INDEX_ID_MAX - 2; i++) { if (num_tagged[i] != 0) { @@ -2332,12 +2322,13 @@ static int outliner_orphans_purge_exec(bContext *C, wmOperator *op) int num_tagged[INDEX_ID_MAX] = {0}; if ((num_tagged[INDEX_ID_NULL] = RNA_int_get(op->ptr, "num_deleted")) == 0) { - /* Tag all IDs having zero users. */ - ID *id; - FOREACH_MAIN_ID_BEGIN (bmain, id) { - outliner_orphans_purge_tag(id, num_tagged); - } - FOREACH_MAIN_ID_END; + const bool do_local_ids = RNA_boolean_get(op->ptr, "do_local_ids"); + const bool do_linked_ids = RNA_boolean_get(op->ptr, "do_linked_ids"); + const bool do_recursive_cleanup = RNA_boolean_get(op->ptr, "do_recursive"); + + /* Tag all IDs to delete. */ + BKE_lib_query_unused_ids_tag( + bmain, LIB_TAG_DOIT, do_local_ids, do_linked_ids, do_recursive_cleanup, num_tagged); if (num_tagged[INDEX_ID_NULL] == 0) { BKE_report(op->reports, RPT_INFO, "No orphaned data-blocks to purge"); @@ -2359,8 +2350,10 @@ static int outliner_orphans_purge_exec(bContext *C, wmOperator *op) } DEG_relations_tag_update(bmain); - WM_event_add_notifier(C, NC_ID | NA_EDITED, NULL); - WM_event_add_notifier(C, NC_SPACE | ND_SPACE_OUTLINER, NULL); + WM_event_add_notifier(C, NC_ID | NA_REMOVED, NULL); + /* Force full redraw of the UI. */ + WM_main_add_notifier(NC_WINDOW, NULL); + return OPERATOR_FINISHED; } @@ -2382,6 +2375,24 @@ void OUTLINER_OT_orphans_purge(wmOperatorType *ot) /* properties */ PropertyRNA *prop = RNA_def_int(ot->srna, "num_deleted", 0, 0, INT_MAX, "", "", 0, INT_MAX); RNA_def_property_flag(prop, PROP_SKIP_SAVE | PROP_HIDDEN); + + RNA_def_boolean(ot->srna, + "do_local_ids", + true, + "Local Data-blocks", + "Include unused local data-blocks into deletion"); + RNA_def_boolean(ot->srna, + "do_linked_ids", + true, + "Linked Data-blocks", + "Include unused linked data-blocks into deletion"); + + RNA_def_boolean(ot->srna, + "do_recursive", + false, + "Recursive Delete", + "Recursively check for indirectly unused data-blocks, ensuring that no orphaned " + "data-blocks remain after execution"); } /** \} */ diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h index 339cc3068d0..593c33bd3df 100644 --- a/source/blender/editors/space_outliner/outliner_intern.h +++ b/source/blender/editors/space_outliner/outliner_intern.h @@ -153,8 +153,7 @@ enum { TE_ICONROW = (1 << 1), TE_LAZY_CLOSED = (1 << 2), TE_FREE_NAME = (1 << 3), - TE_DISABLED = (1 << 4), - TE_DRAGGING = (1 << 5), + TE_DRAGGING = (1 << 4), TE_CHILD_NOT_IN_COLLECTION = (1 << 6), /* Child elements of the same type in the icon-row are drawn merged as one icon. * This flag is set for an element that is part of these merged child icons. */ @@ -289,19 +288,24 @@ void outliner_collection_isolate_flag(struct Scene *scene, int tree_element_id_type_to_index(TreeElement *te); /* outliner_select.c -------------------------------------------- */ -eOLDrawState tree_element_type_active(struct bContext *C, - const TreeViewContext *tvc, - struct SpaceOutliner *space_outliner, - TreeElement *te, - TreeStoreElem *tselem, - const eOLSetState set, - bool recursive); -eOLDrawState tree_element_active(struct bContext *C, - const TreeViewContext *tvc, - SpaceOutliner *space_outliner, - TreeElement *te, - const eOLSetState set, - const bool handle_all_types); +void tree_element_type_active_set(struct bContext *C, + const TreeViewContext *tvc, + TreeElement *te, + TreeStoreElem *tselem, + const eOLSetState set, + bool recursive); +eOLDrawState tree_element_type_active_state_get(const struct bContext *C, + const struct TreeViewContext *tvc, + const TreeElement *te, + const TreeStoreElem *tselem); +void tree_element_activate(struct bContext *C, + const TreeViewContext *tvc, + TreeElement *te, + const eOLSetState set, + const bool handle_all_types); +eOLDrawState tree_element_active_state_get(const TreeViewContext *tvc, + const TreeElement *te, + const TreeStoreElem *tselem); struct bPoseChannel *outliner_find_parent_bone(TreeElement *te, TreeElement **r_bone_te); @@ -388,21 +392,6 @@ void id_remap_fn(struct bContext *C, struct TreeStoreElem *tselem, void *user_data); -void item_object_mode_enter_fn(struct bContext *C, - struct ReportList *reports, - struct Scene *scene, - TreeElement *te, - struct TreeStoreElem *tsep, - struct TreeStoreElem *tselem, - void *user_data); -void item_object_mode_exit_fn(struct bContext *C, - struct ReportList *reports, - struct Scene *scene, - TreeElement *te, - struct TreeStoreElem *tsep, - struct TreeStoreElem *tselem, - void *user_data); - void outliner_set_coordinates(struct ARegion *region, struct SpaceOutliner *space_outliner); void outliner_item_openclose(struct SpaceOutliner *space_outliner, diff --git a/source/blender/editors/space_outliner/outliner_ops.c b/source/blender/editors/space_outliner/outliner_ops.c index acda5ae82f0..7e5b0c90714 100644 --- a/source/blender/editors/space_outliner/outliner_ops.c +++ b/source/blender/editors/space_outliner/outliner_ops.c @@ -21,22 +21,9 @@ * \ingroup spoutliner */ -#include "MEM_guardedalloc.h" - -#include "DNA_collection_types.h" - -#include "BLT_translation.h" - -#include "RNA_access.h" - -#include "UI_interface.h" -#include "UI_view2d.h" - #include "WM_api.h" -#include "WM_types.h" #include "ED_screen.h" -#include "ED_select_utils.h" #include "outliner_intern.h" diff --git a/source/blender/editors/space_outliner/outliner_select.c b/source/blender/editors/space_outliner/outliner_select.c index 1ef5735d7d2..e31af48ab7e 100644 --- a/source/blender/editors/space_outliner/outliner_select.c +++ b/source/blender/editors/space_outliner/outliner_select.c @@ -222,32 +222,21 @@ void outliner_item_mode_toggle(bContext *C, /* ****************************************************** */ /* Outliner Element Selection/Activation on Click */ -static eOLDrawState active_viewlayer(bContext *C, - Scene *UNUSED(scene), - ViewLayer *UNUSED(sl), - TreeElement *te, - const eOLSetState set) +static void tree_element_viewlayer_activate(bContext *C, TreeElement *te) { /* paranoia check */ if (te->idcode != ID_SCE) { - return OL_DRAWSEL_NONE; + return; } ViewLayer *view_layer = te->directdata; + wmWindow *win = CTX_wm_window(C); + Scene *scene = WM_window_get_active_scene(win); - if (set != OL_SETSEL_NONE) { - wmWindow *win = CTX_wm_window(C); - Scene *scene = WM_window_get_active_scene(win); - - if (BLI_findindex(&scene->view_layers, view_layer) != -1) { - WM_window_set_active_view_layer(win, view_layer); - WM_event_add_notifier(C, NC_SCREEN | ND_LAYER, NULL); - } + if (BLI_findindex(&scene->view_layers, view_layer) != -1) { + WM_window_set_active_view_layer(win, view_layer); + WM_event_add_notifier(C, NC_SCREEN | ND_LAYER, NULL); } - else { - return CTX_data_view_layer(C) == view_layer; - } - return OL_DRAWSEL_NONE; } /** @@ -297,13 +286,12 @@ static void do_outliner_ebone_select_recursive(bArmature *arm, EditBone *ebone_p } } -static eOLDrawState tree_element_set_active_object(bContext *C, - Scene *scene, - ViewLayer *view_layer, - SpaceOutliner *UNUSED(space_outliner), - TreeElement *te, - const eOLSetState set, - bool recursive) +static void tree_element_object_activate(bContext *C, + Scene *scene, + ViewLayer *view_layer, + TreeElement *te, + const eOLSetState set, + bool recursive) { TreeStoreElem *tselem = TREESTORE(te); TreeStoreElem *parent_tselem = NULL; @@ -324,12 +312,12 @@ static eOLDrawState tree_element_set_active_object(bContext *C, /* Don't return when activating children of the previous active object. */ if (ob == OBACT(view_layer) && set == OL_SETSEL_NONE) { - return OL_DRAWSEL_NONE; + return; } } } if (ob == NULL) { - return OL_DRAWSEL_NONE; + return; } sce = (Scene *)outliner_search_back(te, ID_SCE); @@ -403,322 +391,200 @@ static eOLDrawState tree_element_set_active_object(bContext *C, WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene); } } - return OL_DRAWSEL_NORMAL; } -static eOLDrawState tree_element_active_material(bContext *C, - Scene *UNUSED(scene), - ViewLayer *view_layer, - TreeElement *te, - const eOLSetState set) +static void tree_element_material_activate(bContext *C, ViewLayer *view_layer, TreeElement *te) { - TreeElement *tes; - Object *ob; - /* we search for the object parent */ - ob = (Object *)outliner_search_back(te, ID_OB); + Object *ob = (Object *)outliner_search_back(te, ID_OB); /* Note : ob->matbits can be NULL when a local object points to a library mesh. */ if (ob == NULL || ob != OBACT(view_layer) || ob->matbits == NULL) { - return OL_DRAWSEL_NONE; /* just paranoia */ + return; /* just paranoia */ } - /* searching in ob mat array? */ - tes = te->parent; + /* In ob mat array? */ + TreeElement *tes = te->parent; if (tes->idcode == ID_OB) { - if (set != OL_SETSEL_NONE) { - ob->actcol = te->index + 1; - ob->matbits[te->index] = 1; /* Make ob material active too. */ - } - else { - if (ob->actcol == te->index + 1) { - if (ob->matbits[te->index]) { - return OL_DRAWSEL_NORMAL; - } - } - } + ob->actcol = te->index + 1; + ob->matbits[te->index] = 1; /* Make ob material active too. */ } - /* or we search for obdata material */ else { - if (set != OL_SETSEL_NONE) { - ob->actcol = te->index + 1; - ob->matbits[te->index] = 0; /* Make obdata material active too. */ - } - else { - if (ob->actcol == te->index + 1) { - if (ob->matbits[te->index] == 0) { - return OL_DRAWSEL_NORMAL; - } - } - } + /* or in obdata material */ + ob->actcol = te->index + 1; + ob->matbits[te->index] = 0; /* Make obdata material active too. */ } - if (set != OL_SETSEL_NONE) { - /* Tagging object for update seems a bit stupid here, but looks like we have to do it - * for render views to update. See T42973. - * Note that RNA material update does it too, see e.g. rna_MaterialSlot_update(). */ - DEG_id_tag_update((ID *)ob, ID_RECALC_TRANSFORM); - WM_event_add_notifier(C, NC_MATERIAL | ND_SHADING_LINKS, NULL); - } - return OL_DRAWSEL_NONE; + + /* Tagging object for update seems a bit stupid here, but looks like we have to do it + * for render views to update. See T42973. + * Note that RNA material update does it too, see e.g. rna_MaterialSlot_update(). */ + DEG_id_tag_update((ID *)ob, ID_RECALC_TRANSFORM); + WM_event_add_notifier(C, NC_MATERIAL | ND_SHADING_LINKS, NULL); } -static eOLDrawState tree_element_active_camera(bContext *C, - Scene *scene, - ViewLayer *UNUSED(view_layer), - TreeElement *te, - const eOLSetState set) +static void tree_element_camera_activate(bContext *C, Scene *scene, TreeElement *te) { Object *ob = (Object *)outliner_search_back(te, ID_OB); - if (set != OL_SETSEL_NONE) { - scene->camera = ob; + scene->camera = ob; - Main *bmain = CTX_data_main(C); - wmWindowManager *wm = bmain->wm.first; + Main *bmain = CTX_data_main(C); + wmWindowManager *wm = bmain->wm.first; - WM_windows_scene_data_sync(&wm->windows, scene); - DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); - DEG_relations_tag_update(bmain); - WM_event_add_notifier(C, NC_SCENE | NA_EDITED, NULL); - - return OL_DRAWSEL_NONE; - } - return scene->camera == ob; + WM_windows_scene_data_sync(&wm->windows, scene); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); + DEG_relations_tag_update(bmain); + WM_event_add_notifier(C, NC_SCENE | NA_EDITED, NULL); } -static eOLDrawState tree_element_active_world(bContext *C, - Scene *scene, - ViewLayer *UNUSED(sl), - SpaceOutliner *UNUSED(space_outliner), - TreeElement *te, - const eOLSetState set) +static void tree_element_world_activate(bContext *C, Scene *scene, TreeElement *te) { - TreeElement *tep; - TreeStoreElem *tselem = NULL; Scene *sce = NULL; - tep = te->parent; + TreeElement *tep = te->parent; if (tep) { - tselem = TREESTORE(tep); + TreeStoreElem *tselem = TREESTORE(tep); if (tselem->type == 0) { sce = (Scene *)tselem->id; } } - if (set != OL_SETSEL_NONE) { - /* make new scene active */ - if (sce && scene != sce) { - WM_window_set_active_scene(CTX_data_main(C), C, CTX_wm_window(C), sce); - } + /* make new scene active */ + if (sce && scene != sce) { + WM_window_set_active_scene(CTX_data_main(C), C, CTX_wm_window(C), sce); } - - if (tep == NULL || tselem->id == (ID *)scene) { - if (set == OL_SETSEL_NONE) { - return OL_DRAWSEL_NORMAL; - } - } - return OL_DRAWSEL_NONE; } -static eOLDrawState tree_element_active_defgroup(bContext *C, - ViewLayer *view_layer, - TreeElement *te, - TreeStoreElem *tselem, - const eOLSetState set) +static void tree_element_defgroup_activate(bContext *C, TreeElement *te, TreeStoreElem *tselem) { - Object *ob; - /* id in tselem is object */ - ob = (Object *)tselem->id; - if (set != OL_SETSEL_NONE) { - BLI_assert(te->index + 1 >= 0); - ob->actdef = te->index + 1; + Object *ob = (Object *)tselem->id; + BLI_assert(te->index + 1 >= 0); + ob->actdef = te->index + 1; - DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); - WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, ob); - } - else { - if (ob == OBACT(view_layer)) { - if (ob->actdef == te->index + 1) { - return OL_DRAWSEL_NORMAL; - } - } - } - return OL_DRAWSEL_NONE; + DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); + WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, ob); } -static eOLDrawState tree_element_active_gplayer(bContext *C, - Scene *UNUSED(scene), - TreeElement *te, - TreeStoreElem *tselem, - const eOLSetState set) +static void tree_element_gplayer_activate(bContext *C, TreeElement *te, TreeStoreElem *tselem) { bGPdata *gpd = (bGPdata *)tselem->id; bGPDlayer *gpl = te->directdata; /* We can only have a single "active" layer at a time - * and there must always be an active layer... - */ - if (set != OL_SETSEL_NONE) { - if (gpl) { - BKE_gpencil_layer_active_set(gpd, gpl); - DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_SELECTED, gpd); - } + * and there must always be an active layer... */ + if (gpl) { + BKE_gpencil_layer_active_set(gpd, gpl); + DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); + WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_SELECTED, gpd); } - else { - return OL_DRAWSEL_NORMAL; - } - - return OL_DRAWSEL_NONE; } -static eOLDrawState tree_element_active_posegroup(bContext *C, - Scene *UNUSED(scene), - ViewLayer *view_layer, - TreeElement *te, - TreeStoreElem *tselem, - const eOLSetState set) +static void tree_element_posegroup_activate(bContext *C, TreeElement *te, TreeStoreElem *tselem) { Object *ob = (Object *)tselem->id; - - if (set != OL_SETSEL_NONE) { - if (ob->pose) { - ob->pose->active_group = te->index + 1; - WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob); - } + if (ob->pose) { + ob->pose->active_group = te->index + 1; + WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob); } - else { - if (ob == OBACT(view_layer) && ob->pose) { - if (ob->pose->active_group == te->index + 1) { - return OL_DRAWSEL_NORMAL; - } - } - } - return OL_DRAWSEL_NONE; } -static eOLDrawState tree_element_active_posechannel(bContext *C, - Scene *UNUSED(scene), - ViewLayer *view_layer, - Object *ob_pose, - TreeElement *te, - TreeStoreElem *tselem, - const eOLSetState set, - bool recursive) +static void tree_element_posechannel_activate(bContext *C, + ViewLayer *view_layer, + TreeElement *te, + TreeStoreElem *tselem, + const eOLSetState set, + bool recursive) { Object *ob = (Object *)tselem->id; bArmature *arm = ob->data; bPoseChannel *pchan = te->directdata; - if (set != OL_SETSEL_NONE) { - if (!(pchan->bone->flag & BONE_HIDDEN_P)) { + if (!(pchan->bone->flag & BONE_HIDDEN_P)) { + if (set != OL_SETSEL_EXTEND) { + /* Single select forces all other bones to get unselected. */ + uint objects_len = 0; + Object **objects = BKE_object_pose_array_get_unique(view_layer, NULL, &objects_len); - if (set != OL_SETSEL_EXTEND) { - /* Single select forces all other bones to get unselected. */ - uint objects_len = 0; - Object **objects = BKE_object_pose_array_get_unique(view_layer, NULL, &objects_len); + for (uint object_index = 0; object_index < objects_len; object_index++) { + Object *ob_iter = BKE_object_pose_armature_get(objects[object_index]); - for (uint object_index = 0; object_index < objects_len; object_index++) { - Object *ob_iter = BKE_object_pose_armature_get(objects[object_index]); - - /* Sanity checks. */ - if (ELEM(NULL, ob_iter, ob_iter->pose, ob_iter->data)) { - continue; - } - - bPoseChannel *pchannel; - for (pchannel = ob_iter->pose->chanbase.first; pchannel; pchannel = pchannel->next) { - pchannel->bone->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL); - } - - if (ob != ob_iter) { - DEG_id_tag_update(ob_iter->data, ID_RECALC_SELECT); - } + /* Sanity checks. */ + if (ELEM(NULL, ob_iter, ob_iter->pose, ob_iter->data)) { + continue; } - MEM_freeN(objects); - } - if ((set == OL_SETSEL_EXTEND) && (pchan->bone->flag & BONE_SELECTED)) { - pchan->bone->flag &= ~BONE_SELECTED; - } - else { - pchan->bone->flag |= BONE_SELECTED; - arm->act_bone = pchan->bone; - } + bPoseChannel *pchannel; + for (pchannel = ob_iter->pose->chanbase.first; pchannel; pchannel = pchannel->next) { + pchannel->bone->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL); + } - if (recursive) { - /* Recursive select/deselect */ - do_outliner_bone_select_recursive( - arm, pchan->bone, (pchan->bone->flag & BONE_SELECTED) != 0); + if (ob != ob_iter) { + DEG_id_tag_update(ob_iter->data, ID_RECALC_SELECT); + } } - - WM_event_add_notifier(C, NC_OBJECT | ND_BONE_ACTIVE, ob); - DEG_id_tag_update(&arm->id, ID_RECALC_SELECT); + MEM_freeN(objects); } - } - else { - if (ob == ob_pose && ob->pose) { - if (pchan->bone->flag & BONE_SELECTED) { - return OL_DRAWSEL_NORMAL; - } + + if ((set == OL_SETSEL_EXTEND) && (pchan->bone->flag & BONE_SELECTED)) { + pchan->bone->flag &= ~BONE_SELECTED; } + else { + pchan->bone->flag |= BONE_SELECTED; + arm->act_bone = pchan->bone; + } + + if (recursive) { + /* Recursive select/deselect */ + do_outliner_bone_select_recursive( + arm, pchan->bone, (pchan->bone->flag & BONE_SELECTED) != 0); + } + + WM_event_add_notifier(C, NC_OBJECT | ND_BONE_ACTIVE, ob); + DEG_id_tag_update(&arm->id, ID_RECALC_SELECT); } - return OL_DRAWSEL_NONE; } -static eOLDrawState tree_element_active_bone(bContext *C, - ViewLayer *view_layer, - TreeElement *te, - TreeStoreElem *tselem, - const eOLSetState set, - bool recursive) +static void tree_element_bone_activate(bContext *C, + ViewLayer *view_layer, + TreeElement *te, + TreeStoreElem *tselem, + const eOLSetState set, + bool recursive) { bArmature *arm = (bArmature *)tselem->id; Bone *bone = te->directdata; - if (set != OL_SETSEL_NONE) { - if (!(bone->flag & BONE_HIDDEN_P)) { - Object *ob = OBACT(view_layer); - if (ob) { - if (set != OL_SETSEL_EXTEND) { - /* single select forces all other bones to get unselected */ - for (Bone *bone_iter = arm->bonebase.first; bone_iter != NULL; - bone_iter = bone_iter->next) { - bone_iter->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL); - do_outliner_bone_select_recursive(arm, bone_iter, false); - } + if (!(bone->flag & BONE_HIDDEN_P)) { + Object *ob = OBACT(view_layer); + if (ob) { + if (set != OL_SETSEL_EXTEND) { + /* single select forces all other bones to get unselected */ + for (Bone *bone_iter = arm->bonebase.first; bone_iter != NULL; + bone_iter = bone_iter->next) { + bone_iter->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL); + do_outliner_bone_select_recursive(arm, bone_iter, false); } } - - if (set == OL_SETSEL_EXTEND && (bone->flag & BONE_SELECTED)) { - bone->flag &= ~BONE_SELECTED; - } - else { - bone->flag |= BONE_SELECTED; - arm->act_bone = bone; - } - - if (recursive) { - /* Recursive select/deselect */ - do_outliner_bone_select_recursive(arm, bone, (bone->flag & BONE_SELECTED) != 0); - } - - WM_event_add_notifier(C, NC_OBJECT | ND_BONE_ACTIVE, ob); } - } - else { - Object *ob = OBACT(view_layer); - if (ob && ob->data == arm) { - if (bone->flag & BONE_SELECTED) { - return OL_DRAWSEL_NORMAL; - } + if (set == OL_SETSEL_EXTEND && (bone->flag & BONE_SELECTED)) { + bone->flag &= ~BONE_SELECTED; } + else { + bone->flag |= BONE_SELECTED; + arm->act_bone = bone; + } + + if (recursive) { + /* Recursive select/deselect */ + do_outliner_bone_select_recursive(arm, bone, (bone->flag & BONE_SELECTED) != 0); + } + + WM_event_add_notifier(C, NC_OBJECT | ND_BONE_ACTIVE, ob); } - return OL_DRAWSEL_NONE; } -/* ebones only draw in editmode armature */ +/** Edit-bones only draw in edit-mode armature. */ static void tree_element_active_ebone__sel(bContext *C, bArmature *arm, EditBone *ebone, short sel) { if (sel) { @@ -727,193 +593,120 @@ static void tree_element_active_ebone__sel(bContext *C, bArmature *arm, EditBone ED_armature_ebone_select_set(ebone, sel); WM_event_add_notifier(C, NC_OBJECT | ND_BONE_ACTIVE, CTX_data_edit_object(C)); } -static eOLDrawState tree_element_active_ebone(bContext *C, - ViewLayer *view_layer, - TreeElement *te, - TreeStoreElem *tselem, - const eOLSetState set, - bool recursive) +static void tree_element_ebone_activate(bContext *C, + ViewLayer *view_layer, + TreeElement *te, + TreeStoreElem *tselem, + const eOLSetState set, + bool recursive) { bArmature *arm = (bArmature *)tselem->id; EditBone *ebone = te->directdata; - eOLDrawState status = OL_DRAWSEL_NONE; - if (set != OL_SETSEL_NONE) { - if (set == OL_SETSEL_NORMAL) { - if (!(ebone->flag & BONE_HIDDEN_A)) { - uint bases_len = 0; - Base **bases = BKE_view_layer_array_from_bases_in_edit_mode_unique_data( - view_layer, NULL, &bases_len); - ED_armature_edit_deselect_all_multi_ex(bases, bases_len); - MEM_freeN(bases); + if (set == OL_SETSEL_NORMAL) { + if (!(ebone->flag & BONE_HIDDEN_A)) { + uint bases_len = 0; + Base **bases = BKE_view_layer_array_from_bases_in_edit_mode_unique_data( + view_layer, NULL, &bases_len); + ED_armature_edit_deselect_all_multi_ex(bases, bases_len); + MEM_freeN(bases); + tree_element_active_ebone__sel(C, arm, ebone, true); + } + } + else if (set == OL_SETSEL_EXTEND) { + if (!(ebone->flag & BONE_HIDDEN_A)) { + if (!(ebone->flag & BONE_SELECTED)) { tree_element_active_ebone__sel(C, arm, ebone, true); - status = OL_DRAWSEL_NORMAL; + } + else { + /* entirely selected, so de-select */ + tree_element_active_ebone__sel(C, arm, ebone, false); } } - else if (set == OL_SETSEL_EXTEND) { - if (!(ebone->flag & BONE_HIDDEN_A)) { - if (!(ebone->flag & BONE_SELECTED)) { - tree_element_active_ebone__sel(C, arm, ebone, true); - status = OL_DRAWSEL_NORMAL; - } - else { - /* entirely selected, so de-select */ - tree_element_active_ebone__sel(C, arm, ebone, false); - status = OL_DRAWSEL_NONE; - } - } - } - - if (recursive) { - /* Recursive select/deselect */ - do_outliner_ebone_select_recursive(arm, ebone, (ebone->flag & BONE_SELECTED) != 0); - } - } - else if (ebone->flag & BONE_SELECTED) { - status = OL_DRAWSEL_NORMAL; } - return status; + if (recursive) { + /* Recursive select/deselect */ + do_outliner_ebone_select_recursive(arm, ebone, (ebone->flag & BONE_SELECTED) != 0); + } } -static eOLDrawState tree_element_active_modifier(bContext *C, - Scene *UNUSED(scene), - ViewLayer *UNUSED(sl), - TreeElement *UNUSED(te), - TreeStoreElem *tselem, - const eOLSetState set) +static void tree_element_modifier_activate(bContext *C, + TreeElement *te, + TreeStoreElem *tselem, + const eOLSetState set) { - if (set != OL_SETSEL_NONE) { - Object *ob = (Object *)tselem->id; + Object *ob = (Object *)tselem->id; + ModifierData *md = (ModifierData *)te->directdata; + if (set == OL_SETSEL_NORMAL) { + BKE_object_modifier_set_active(ob, md); WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); } - - return OL_DRAWSEL_NONE; } -static eOLDrawState tree_element_active_psys(bContext *C, - Scene *UNUSED(scene), - TreeElement *UNUSED(te), - TreeStoreElem *tselem, - const eOLSetState set) +static void tree_element_psys_activate(bContext *C, TreeStoreElem *tselem) { - if (set != OL_SETSEL_NONE) { - Object *ob = (Object *)tselem->id; + Object *ob = (Object *)tselem->id; - WM_event_add_notifier(C, NC_OBJECT | ND_PARTICLE | NA_EDITED, ob); - } - - return OL_DRAWSEL_NONE; + WM_event_add_notifier(C, NC_OBJECT | ND_PARTICLE | NA_EDITED, ob); } -static int tree_element_active_constraint(bContext *C, - Scene *scene, - ViewLayer *view_layer, - TreeElement *te, - TreeStoreElem *tselem, - const eOLSetState set) -{ - if (set != OL_SETSEL_NONE) { - Object *ob = (Object *)tselem->id; - - /* Activate the parent bone if this is a bone constraint. */ - te = te->parent; - while (te) { - tselem = TREESTORE(te); - if (tselem->type == TSE_POSE_CHANNEL) { - tree_element_active_posechannel(C, scene, view_layer, ob, te, tselem, set, false); - return OL_DRAWSEL_NONE; - } - te = te->parent; - } - - WM_event_add_notifier(C, NC_OBJECT | ND_CONSTRAINT, ob); - } - - return OL_DRAWSEL_NONE; -} - -static eOLDrawState tree_element_active_pose(bContext *UNUSED(C), - Scene *UNUSED(scene), +static void tree_element_constraint_activate(bContext *C, ViewLayer *view_layer, - TreeElement *UNUSED(te), + TreeElement *te, TreeStoreElem *tselem, const eOLSetState set) { Object *ob = (Object *)tselem->id; - Base *base = BKE_view_layer_base_find(view_layer, ob); - if (base == NULL) { - /* Armature not instantiated in current scene (e.g. inside an appended group...). */ - return OL_DRAWSEL_NONE; - } - - if (set != OL_SETSEL_NONE) { - } - else { - if (ob->mode & OB_MODE_POSE) { - return OL_DRAWSEL_NORMAL; + /* Activate the parent bone if this is a bone constraint. */ + te = te->parent; + while (te) { + tselem = TREESTORE(te); + if (tselem->type == TSE_POSE_CHANNEL) { + tree_element_posechannel_activate(C, view_layer, te, tselem, set, false); + return; } + te = te->parent; } - return OL_DRAWSEL_NONE; + + WM_event_add_notifier(C, NC_OBJECT | ND_CONSTRAINT, ob); } -static eOLDrawState tree_element_active_sequence(bContext *C, - Scene *scene, - TreeElement *te, - TreeStoreElem *UNUSED(tselem), - const eOLSetState set) +static void tree_element_sequence_activate(bContext *C, + Scene *scene, + TreeElement *te, + const eOLSetState set) { Sequence *seq = (Sequence *)te->directdata; Editing *ed = SEQ_editing_get(scene, false); - if (set != OL_SETSEL_NONE) { - /* only check on setting */ - if (BLI_findindex(ed->seqbasep, seq) != -1) { - if (set == OL_SETSEL_EXTEND) { - SEQ_select_active_set(scene, NULL); - } - ED_sequencer_deselect_all(scene); - - if ((set == OL_SETSEL_EXTEND) && seq->flag & SELECT) { - seq->flag &= ~SELECT; - } - else { - seq->flag |= SELECT; - SEQ_select_active_set(scene, seq); - } + if (BLI_findindex(ed->seqbasep, seq) != -1) { + if (set == OL_SETSEL_EXTEND) { + SEQ_select_active_set(scene, NULL); } + ED_sequencer_deselect_all(scene); - WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER | NA_SELECTED, scene); - } - else { - if (ed->act_seq == seq && seq->flag & SELECT) { - return OL_DRAWSEL_NORMAL; + if ((set == OL_SETSEL_EXTEND) && seq->flag & SELECT) { + seq->flag &= ~SELECT; + } + else { + seq->flag |= SELECT; + SEQ_select_active_set(scene, seq); } } - return OL_DRAWSEL_NONE; + + WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER | NA_SELECTED, scene); } -static eOLDrawState tree_element_active_sequence_dup(Scene *scene, - TreeElement *te, - TreeStoreElem *UNUSED(tselem), - const eOLSetState set) +static void tree_element_sequence_dup_activate(Scene *scene, TreeElement *UNUSED(te)) { - Sequence *seq, *p; Editing *ed = SEQ_editing_get(scene, false); - seq = (Sequence *)te->directdata; - if (set == OL_SETSEL_NONE) { - if (seq->flag & SELECT) { - return OL_DRAWSEL_NORMAL; - } - return OL_DRAWSEL_NONE; - } - /* XXX select_single_seq(seq, 1); */ - p = ed->seqbasep->first; + Sequence *p = ed->seqbasep->first; while (p) { if ((!p->strip) || (!p->strip->stripdata) || (p->strip->stripdata->name[0] == '\0')) { p = p->next; @@ -924,85 +717,37 @@ static eOLDrawState tree_element_active_sequence_dup(Scene *scene, * 0); */ p = p->next; } - return OL_DRAWSEL_NONE; } -static eOLDrawState tree_element_active_keymap_item(bContext *UNUSED(C), - Scene *UNUSED(scene), - ViewLayer *UNUSED(sl), - TreeElement *te, - TreeStoreElem *UNUSED(tselem), - const eOLSetState set) +static void tree_element_master_collection_activate(const bContext *C) { - wmKeyMapItem *kmi = te->directdata; - - if (set == OL_SETSEL_NONE) { - if (kmi->flag & KMI_INACTIVE) { - return OL_DRAWSEL_NONE; - } - return OL_DRAWSEL_NORMAL; - } - kmi->flag ^= KMI_INACTIVE; - return OL_DRAWSEL_NONE; + ViewLayer *view_layer = CTX_data_view_layer(C); + LayerCollection *layer_collection = view_layer->layer_collections.first; + BKE_layer_collection_activate(view_layer, layer_collection); + /* A very precise notifier - ND_LAYER alone is quite vague, we want to avoid unnecessary work + * when only the active collection changes. */ + WM_main_add_notifier(NC_SCENE | ND_LAYER | NS_LAYER_COLLECTION | NA_ACTIVATED, NULL); } -static eOLDrawState tree_element_active_master_collection(bContext *C, - TreeElement *UNUSED(te), - const eOLSetState set) +static void tree_element_layer_collection_activate(bContext *C, TreeElement *te) { - if (set == OL_SETSEL_NONE) { - ViewLayer *view_layer = CTX_data_view_layer(C); - LayerCollection *active = CTX_data_layer_collection(C); - - if (active == view_layer->layer_collections.first) { - return OL_DRAWSEL_NORMAL; - } - } - else { - ViewLayer *view_layer = CTX_data_view_layer(C); - LayerCollection *layer_collection = view_layer->layer_collections.first; - BKE_layer_collection_activate(view_layer, layer_collection); - /* A very precise notifier - ND_LAYER alone is quite vague, we want to avoid unnecessary work - * when only the active collection changes. */ - WM_main_add_notifier(NC_SCENE | ND_LAYER | NS_LAYER_COLLECTION | NA_ACTIVATED, NULL); - } - - return OL_DRAWSEL_NONE; -} - -static eOLDrawState tree_element_active_layer_collection(bContext *C, - TreeElement *te, - const eOLSetState set) -{ - if (set == OL_SETSEL_NONE) { - LayerCollection *active = CTX_data_layer_collection(C); - - if (active == te->directdata) { - return OL_DRAWSEL_NORMAL; - } - } - else { - Scene *scene = CTX_data_scene(C); - LayerCollection *layer_collection = te->directdata; - ViewLayer *view_layer = BKE_view_layer_find_from_collection(scene, layer_collection); - BKE_layer_collection_activate(view_layer, layer_collection); - /* A very precise notifier - ND_LAYER alone is quite vague, we want to avoid unnecessary work - * when only the active collection changes. */ - WM_main_add_notifier(NC_SCENE | ND_LAYER | NS_LAYER_COLLECTION | NA_ACTIVATED, NULL); - } - - return OL_DRAWSEL_NONE; + Scene *scene = CTX_data_scene(C); + LayerCollection *layer_collection = te->directdata; + ViewLayer *view_layer = BKE_view_layer_find_from_collection(scene, layer_collection); + BKE_layer_collection_activate(view_layer, layer_collection); + /* A very precise notifier - ND_LAYER alone is quite vague, we want to avoid unnecessary work + * when only the active collection changes. */ + WM_main_add_notifier(NC_SCENE | ND_LAYER | NS_LAYER_COLLECTION | NA_ACTIVATED, NULL); } /* ---------------------------------------------- */ /* generic call for ID data check or make/check active in UI */ -eOLDrawState tree_element_active(bContext *C, - const TreeViewContext *tvc, - SpaceOutliner *space_outliner, - TreeElement *te, - const eOLSetState set, - const bool handle_all_types) +void tree_element_activate(bContext *C, + const TreeViewContext *tvc, + TreeElement *te, + const eOLSetState set, + const bool handle_all_types) { switch (te->idcode) { /** \note #ID_OB only if handle_all_type is true, @@ -1010,76 +755,371 @@ eOLDrawState tree_element_active(bContext *C, * See #do_outliner_item_activate. */ case ID_OB: if (handle_all_types) { - return tree_element_set_active_object( - C, tvc->scene, tvc->view_layer, space_outliner, te, set, false); + tree_element_object_activate(C, tvc->scene, tvc->view_layer, te, set, false); } break; case ID_MA: - return tree_element_active_material(C, tvc->scene, tvc->view_layer, te, set); + tree_element_material_activate(C, tvc->view_layer, te); + break; case ID_WO: - return tree_element_active_world(C, tvc->scene, tvc->view_layer, space_outliner, te, set); + tree_element_world_activate(C, tvc->scene, te); + break; case ID_CA: - return tree_element_active_camera(C, tvc->scene, tvc->view_layer, te, set); + tree_element_camera_activate(C, tvc->scene, te); + break; + } +} + +/** + * Generic call for non-id data to make active in UI + */ +void tree_element_type_active_set(bContext *C, + const TreeViewContext *tvc, + TreeElement *te, + TreeStoreElem *tselem, + const eOLSetState set, + bool recursive) +{ + BLI_assert(set != OL_SETSEL_NONE); + switch (tselem->type) { + case TSE_DEFGROUP: + tree_element_defgroup_activate(C, te, tselem); + break; + case TSE_BONE: + tree_element_bone_activate(C, tvc->view_layer, te, tselem, set, recursive); + break; + case TSE_EBONE: + tree_element_ebone_activate(C, tvc->view_layer, te, tselem, set, recursive); + break; + case TSE_MODIFIER: + tree_element_modifier_activate(C, te, tselem, set); + break; + case TSE_LINKED_OB: + tree_element_object_activate(C, tvc->scene, tvc->view_layer, te, set, false); + break; + case TSE_LINKED_PSYS: + tree_element_psys_activate(C, tselem); + break; + case TSE_POSE_BASE: + return; + case TSE_POSE_CHANNEL: + tree_element_posechannel_activate(C, tvc->view_layer, te, tselem, set, recursive); + break; + case TSE_CONSTRAINT_BASE: + case TSE_CONSTRAINT: + tree_element_constraint_activate(C, tvc->view_layer, te, tselem, set); + break; + case TSE_R_LAYER: + tree_element_viewlayer_activate(C, te); + break; + case TSE_POSEGRP: + tree_element_posegroup_activate(C, te, tselem); + break; + case TSE_SEQUENCE: + tree_element_sequence_activate(C, tvc->scene, te, set); + break; + case TSE_SEQUENCE_DUP: + tree_element_sequence_dup_activate(tvc->scene, te); + break; + case TSE_GP_LAYER: + tree_element_gplayer_activate(C, te, tselem); + break; + case TSE_VIEW_COLLECTION_BASE: + tree_element_master_collection_activate(C); + break; + case TSE_LAYER_COLLECTION: + tree_element_layer_collection_activate(C, te); + break; + } +} + +static eOLDrawState tree_element_defgroup_state_get(const ViewLayer *view_layer, + const TreeElement *te, + const TreeStoreElem *tselem) +{ + const Object *ob = (const Object *)tselem->id; + if (ob == OBACT(view_layer)) { + if (ob->actdef == te->index + 1) { + return OL_DRAWSEL_NORMAL; + } + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_bone_state_get(const ViewLayer *view_layer, + const TreeElement *te, + const TreeStoreElem *tselem) +{ + const bArmature *arm = (const bArmature *)tselem->id; + const Bone *bone = te->directdata; + const Object *ob = OBACT(view_layer); + if (ob && ob->data == arm) { + if (bone->flag & BONE_SELECTED) { + return OL_DRAWSEL_NORMAL; + } + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_ebone_state_get(const TreeElement *te) +{ + const EditBone *ebone = te->directdata; + if (ebone->flag & BONE_SELECTED) { + return OL_DRAWSEL_NORMAL; + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_modifier_state_get(const TreeElement *te, + const TreeStoreElem *tselem) +{ + const Object *ob = (const Object *)tselem->id; + const ModifierData *md = (const ModifierData *)te->directdata; + + return (BKE_object_active_modifier(ob) == md) ? OL_DRAWSEL_NORMAL : OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_object_state_get(const TreeViewContext *tvc, + const TreeStoreElem *tselem) +{ + return (tselem->id == (const ID *)tvc->obact) ? OL_DRAWSEL_NORMAL : OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_pose_state_get(const ViewLayer *view_layer, + const TreeStoreElem *tselem) +{ + const Object *ob = (const Object *)tselem->id; + /* This will just lookup in a cache, it will not change the arguments. */ + const Base *base = BKE_view_layer_base_find((ViewLayer *)view_layer, (Object *)ob); + if (base == NULL) { + /* Armature not instantiated in current scene (e.g. inside an appended group). */ + return OL_DRAWSEL_NONE; + } + + if (ob->mode & OB_MODE_POSE) { + return OL_DRAWSEL_NORMAL; + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_posechannel_state_get(const Object *ob_pose, + const TreeElement *te, + const TreeStoreElem *tselem) +{ + const Object *ob = (const Object *)tselem->id; + const bPoseChannel *pchan = te->directdata; + if (ob == ob_pose && ob->pose) { + if (pchan->bone->flag & BONE_SELECTED) { + return OL_DRAWSEL_NORMAL; + } + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_viewlayer_state_get(const bContext *C, const TreeElement *te) +{ + /* paranoia check */ + if (te->idcode != ID_SCE) { + return OL_DRAWSEL_NONE; + } + + const ViewLayer *view_layer = te->directdata; + + if (CTX_data_view_layer(C) == view_layer) { + return OL_DRAWSEL_NORMAL; + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_posegroup_state_get(const ViewLayer *view_layer, + const TreeElement *te, + const TreeStoreElem *tselem) +{ + const Object *ob = (const Object *)tselem->id; + + if (ob == OBACT(view_layer) && ob->pose) { + if (ob->pose->active_group == te->index + 1) { + return OL_DRAWSEL_NORMAL; + } + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_sequence_state_get(const Scene *scene, const TreeElement *te) +{ + const Sequence *seq = (const Sequence *)te->directdata; + const Editing *ed = scene->ed; + + if (ed && ed->act_seq == seq && seq->flag & SELECT) { + return OL_DRAWSEL_NORMAL; + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_sequence_dup_state_get(const TreeElement *te) +{ + const Sequence *seq = (const Sequence *)te->directdata; + if (seq->flag & SELECT) { + return OL_DRAWSEL_NORMAL; + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_gplayer_state_get(const TreeElement *te) +{ + if (((const bGPDlayer *)te->directdata)->flag & GP_LAYER_ACTIVE) { + return OL_DRAWSEL_NORMAL; + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_master_collection_state_get(const bContext *C) +{ + const ViewLayer *view_layer = CTX_data_view_layer(C); + const LayerCollection *active = CTX_data_layer_collection(C); + + if (active == view_layer->layer_collections.first) { + return OL_DRAWSEL_NORMAL; + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_layer_collection_state_get(const bContext *C, + const TreeElement *te) +{ + const LayerCollection *active = CTX_data_layer_collection(C); + if (active == te->directdata) { + return OL_DRAWSEL_NORMAL; + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_active_material_get(const ViewLayer *view_layer, + const TreeElement *te) +{ + /* we search for the object parent */ + const Object *ob = (const Object *)outliner_search_back((TreeElement *)te, ID_OB); + /* Note : ob->matbits can be NULL when a local object points to a library mesh. */ + if (ob == NULL || ob != OBACT(view_layer) || ob->matbits == NULL) { + return OL_DRAWSEL_NONE; /* just paranoia */ + } + + /* searching in ob mat array? */ + const TreeElement *tes = te->parent; + if (tes->idcode == ID_OB) { + if (ob->actcol == te->index + 1) { + if (ob->matbits[te->index]) { + return OL_DRAWSEL_NORMAL; + } + } + } + /* or we search for obdata material */ + else { + if (ob->actcol == te->index + 1) { + if (ob->matbits[te->index] == 0) { + return OL_DRAWSEL_NORMAL; + } + } + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_active_scene_get(const TreeViewContext *tvc, + const TreeElement *te, + const TreeStoreElem *tselem) +{ + if (te->idcode == ID_SCE) { + if (tselem->id == (ID *)tvc->scene) { + return OL_DRAWSEL_NORMAL; + } + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_active_world_get(const Scene *scene, const TreeElement *te) +{ + const TreeElement *tep = te->parent; + if (tep == NULL) { + return OL_DRAWSEL_NORMAL; + } + + const TreeStoreElem *tselem = TREESTORE(tep); + if (tselem->id == (const ID *)scene) { + return OL_DRAWSEL_NORMAL; + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_active_camera_get(const Scene *scene, const TreeElement *te) +{ + const Object *ob = (const Object *)outliner_search_back((TreeElement *)te, ID_OB); + + return (scene->camera == ob) ? OL_DRAWSEL_NORMAL : OL_DRAWSEL_NONE; +} + +eOLDrawState tree_element_active_state_get(const TreeViewContext *tvc, + const TreeElement *te, + const TreeStoreElem *tselem) +{ + switch (te->idcode) { + case ID_SCE: + return tree_element_active_scene_get(tvc, te, tselem); + case ID_OB: + /* Objects are currently handled by the caller in order to also change text color. */ + return OL_DRAWSEL_NONE; + break; + case ID_MA: + return tree_element_active_material_get(tvc->view_layer, te); + case ID_WO: + return tree_element_active_world_get(tvc->scene, te); + case ID_CA: + return tree_element_active_camera_get(tvc->scene, te); } return OL_DRAWSEL_NONE; } /** - * Generic call for non-id data to make/check active in UI + * Generic call for non-id data to check the active state in UI. */ -eOLDrawState tree_element_type_active(bContext *C, - const TreeViewContext *tvc, - SpaceOutliner *space_outliner, - TreeElement *te, - TreeStoreElem *tselem, - const eOLSetState set, - bool recursive) +eOLDrawState tree_element_type_active_state_get(const bContext *C, + const TreeViewContext *tvc, + const TreeElement *te, + const TreeStoreElem *tselem) { switch (tselem->type) { case TSE_DEFGROUP: - return tree_element_active_defgroup(C, tvc->view_layer, te, tselem, set); + return tree_element_defgroup_state_get(tvc->view_layer, te, tselem); case TSE_BONE: - return tree_element_active_bone(C, tvc->view_layer, te, tselem, set, recursive); + return tree_element_bone_state_get(tvc->view_layer, te, tselem); case TSE_EBONE: - return tree_element_active_ebone(C, tvc->view_layer, te, tselem, set, recursive); + return tree_element_ebone_state_get(te); case TSE_MODIFIER: - return tree_element_active_modifier(C, tvc->scene, tvc->view_layer, te, tselem, set); + return tree_element_modifier_state_get(te, tselem); case TSE_LINKED_OB: - if (set != OL_SETSEL_NONE) { - tree_element_set_active_object( - C, tvc->scene, tvc->view_layer, space_outliner, te, set, false); - } - else if (tselem->id == (ID *)tvc->obact) { - return OL_DRAWSEL_NORMAL; - } - break; + return tree_element_object_state_get(tvc, tselem); case TSE_LINKED_PSYS: - return tree_element_active_psys(C, tvc->scene, te, tselem, set); + return OL_DRAWSEL_NONE; case TSE_POSE_BASE: - return tree_element_active_pose(C, tvc->scene, tvc->view_layer, te, tselem, set); + return tree_element_pose_state_get(tvc->view_layer, tselem); case TSE_POSE_CHANNEL: - return tree_element_active_posechannel( - C, tvc->scene, tvc->view_layer, tvc->ob_pose, te, tselem, set, recursive); + return tree_element_posechannel_state_get(tvc->ob_pose, te, tselem); case TSE_CONSTRAINT_BASE: case TSE_CONSTRAINT: - return tree_element_active_constraint(C, tvc->scene, tvc->view_layer, te, tselem, set); + return OL_DRAWSEL_NONE; case TSE_R_LAYER: - return active_viewlayer(C, tvc->scene, tvc->view_layer, te, set); + return tree_element_viewlayer_state_get(C, te); case TSE_POSEGRP: - return tree_element_active_posegroup(C, tvc->scene, tvc->view_layer, te, tselem, set); + return tree_element_posegroup_state_get(tvc->view_layer, te, tselem); case TSE_SEQUENCE: - return tree_element_active_sequence(C, tvc->scene, te, tselem, set); + return tree_element_sequence_state_get(tvc->scene, te); case TSE_SEQUENCE_DUP: - return tree_element_active_sequence_dup(tvc->scene, te, tselem, set); - case TSE_KEYMAP_ITEM: - return tree_element_active_keymap_item(C, tvc->scene, tvc->view_layer, te, tselem, set); + return tree_element_sequence_dup_state_get(te); case TSE_GP_LAYER: - return tree_element_active_gplayer(C, tvc->scene, te, tselem, set); - break; + return tree_element_gplayer_state_get(te); case TSE_VIEW_COLLECTION_BASE: - return tree_element_active_master_collection(C, te, set); + return tree_element_master_collection_state_get(C); case TSE_LAYER_COLLECTION: - return tree_element_active_layer_collection(C, te, set); + return tree_element_layer_collection_state_get(C, te); } return OL_DRAWSEL_NONE; } @@ -1200,7 +1240,6 @@ static void outliner_set_properties_tab(bContext *C, TreeElement *te, TreeStoreE } else { ModifierData *md = (ModifierData *)te->directdata; - BKE_object_modifier_set_active(ob, md); switch ((ModifierType)md->type) { case eModifierType_ParticleSystem: @@ -1331,14 +1370,13 @@ static void do_outliner_item_activate_tree_element(bContext *C, * objects, we do not want to switch out of edit mode (see T48328 for details). */ } else if (do_activate_data) { - tree_element_set_active_object(C, - tvc->scene, - tvc->view_layer, - space_outliner, - te, - (extend && tselem->type == 0) ? OL_SETSEL_EXTEND : - OL_SETSEL_NORMAL, - recursive && tselem->type == 0); + tree_element_object_activate(C, + tvc->scene, + tvc->view_layer, + te, + (extend && tselem->type == 0) ? OL_SETSEL_EXTEND : + OL_SETSEL_NORMAL, + recursive && tselem->type == 0); } if (tselem->type == 0) { /* The lib blocks. */ @@ -1391,17 +1429,12 @@ static void do_outliner_item_activate_tree_element(bContext *C, WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, tvc->scene); } else { /* Rest of types. */ - tree_element_active(C, tvc, space_outliner, te, OL_SETSEL_NORMAL, false); + tree_element_activate(C, tvc, te, OL_SETSEL_NORMAL, false); } } else if (do_activate_data) { - tree_element_type_active(C, - tvc, - space_outliner, - te, - tselem, - extend ? OL_SETSEL_EXTEND : OL_SETSEL_NORMAL, - recursive); + tree_element_type_active_set( + C, tvc, te, tselem, extend ? OL_SETSEL_EXTEND : OL_SETSEL_NORMAL, recursive); } } diff --git a/source/blender/editors/space_outliner/outliner_sync.c b/source/blender/editors/space_outliner/outliner_sync.c index 81b8974fba4..8bd5e3a130a 100644 --- a/source/blender/editors/space_outliner/outliner_sync.c +++ b/source/blender/editors/space_outliner/outliner_sync.c @@ -38,7 +38,6 @@ #include "BKE_context.h" #include "BKE_layer.h" #include "BKE_main.h" -#include "BKE_object.h" #include "DEG_depsgraph.h" diff --git a/source/blender/editors/space_outliner/outliner_tools.c b/source/blender/editors/space_outliner/outliner_tools.c index 8b522d41af8..8726fd768d4 100644 --- a/source/blender/editors/space_outliner/outliner_tools.c +++ b/source/blender/editors/space_outliner/outliner_tools.c @@ -892,6 +892,8 @@ static void id_override_library_resync_fn(bContext *C, } BKE_lib_override_library_resync(bmain, scene, CTX_data_view_layer(C), id_root); + + WM_event_add_notifier(C, NC_WINDOW, NULL); } else { CLOG_WARN(&LOG, "Could not resync library override of data block '%s'", id_root->name); @@ -926,6 +928,8 @@ static void id_override_library_delete_fn(bContext *C, } BKE_lib_override_library_delete(bmain, id_root); + + WM_event_add_notifier(C, NC_WINDOW, NULL); } else { CLOG_WARN(&LOG, "Could not delete library override of data block '%s'", id_root->name); @@ -1439,13 +1443,7 @@ enum { OL_OP_DESELECT, OL_OP_SELECT_HIERARCHY, OL_OP_REMAP, - OL_OP_LOCALIZED, /* disabled, see below */ - OL_OP_TOGVIS, - OL_OP_TOGSEL, - OL_OP_TOGREN, OL_OP_RENAME, - OL_OP_OBJECT_MODE_ENTER, - OL_OP_OBJECT_MODE_EXIT, OL_OP_PROXY_TO_OVERRIDE_CONVERT, }; @@ -1459,8 +1457,6 @@ static const EnumPropertyItem prop_object_op_types[] = { "Remap Users", "Make all users of selected data-blocks to use instead a new chosen one"}, {OL_OP_RENAME, "RENAME", 0, "Rename", ""}, - {OL_OP_OBJECT_MODE_ENTER, "OBJECT_MODE_ENTER", 0, "Enter Mode", ""}, - {OL_OP_OBJECT_MODE_EXIT, "OBJECT_MODE_EXIT", 0, "Exit Mode", ""}, {OL_OP_PROXY_TO_OVERRIDE_CONVERT, "OBJECT_PROXY_TO_OVERRIDE", 0, @@ -1525,11 +1521,6 @@ static int outliner_object_operation_exec(bContext *C, wmOperator *op) /* No undo push here, operator does it itself (since it's a modal one, the op_undo_depth * trick does not work here). */ } - else if (event == OL_OP_LOCALIZED) { /* disabled, see above enum (ton) */ - outliner_do_object_operation( - C, op->reports, scene, space_outliner, &space_outliner->tree, id_local_fn); - str = "Localized Objects"; - } else if (event == OL_OP_RENAME) { outliner_do_object_operation( C, op->reports, scene, space_outliner, &space_outliner->tree, item_rename_fn); @@ -2444,9 +2435,6 @@ typedef enum eOutliner_AnimDataOps { OUTLINER_ANIMOP_REFRESH_DRV, OUTLINER_ANIMOP_CLEAR_DRV - - /* OUTLINER_ANIMOP_COPY_DRIVERS, */ - /* OUTLINER_ANIMOP_PASTE_DRIVERS */ } eOutliner_AnimDataOps; static const EnumPropertyItem prop_animdata_op_types[] = { @@ -2458,8 +2446,6 @@ static const EnumPropertyItem prop_animdata_op_types[] = { {OUTLINER_ANIMOP_SET_ACT, "SET_ACT", 0, "Set Action", ""}, {OUTLINER_ANIMOP_CLEAR_ACT, "CLEAR_ACT", 0, "Unlink Action", ""}, {OUTLINER_ANIMOP_REFRESH_DRV, "REFRESH_DRIVERS", 0, "Refresh Drivers", ""}, - /* {OUTLINER_ANIMOP_COPY_DRIVERS, "COPY_DRIVERS", 0, "Copy Drivers", ""}, */ - /* {OUTLINER_ANIMOP_PASTE_DRIVERS, "PASTE_DRIVERS", 0, "Paste Drivers", ""}, */ {OUTLINER_ANIMOP_CLEAR_DRV, "CLEAR_DRIVERS", 0, "Clear Drivers", ""}, {0, NULL, 0, NULL, NULL}, }; diff --git a/source/blender/editors/space_outliner/outliner_tree.c b/source/blender/editors/space_outliner/outliner_tree.c index 7df6115cb06..f94f19246fa 100644 --- a/source/blender/editors/space_outliner/outliner_tree.c +++ b/source/blender/editors/space_outliner/outliner_tree.c @@ -991,9 +991,6 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner, else if (type == TSE_ID_BASE) { /* pass */ } - else if (ELEM(type, TSE_KEYMAP, TSE_KEYMAP_ITEM)) { - /* pass */ - } else { /* Other cases must be caught above. */ BLI_assert(TSE_IS_REAL_ID(tselem)); @@ -1214,50 +1211,6 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner, te->flag |= TE_FREE_NAME; } } - else if (type == TSE_KEYMAP) { - wmKeyMap *km = (wmKeyMap *)idv; - char opname[OP_MAX_TYPENAME]; - - te->directdata = idv; - te->name = km->idname; - - if (TSELEM_OPEN(tselem, space_outliner)) { - int a; - LISTBASE_FOREACH_INDEX (wmKeyMapItem *, kmi, &km->items, a) { - const char *key = WM_key_event_string(kmi->type, false); - - if (key[0]) { - wmOperatorType *ot = NULL; - - if (kmi->propvalue) { - /* pass */ - } - else { - ot = WM_operatortype_find(kmi->idname, 0); - } - - if (ot || kmi->propvalue) { - TreeElement *ten = outliner_add_element( - space_outliner, &te->subtree, kmi, te, TSE_KEYMAP_ITEM, a); - - ten->directdata = kmi; - - if (kmi->propvalue) { - ten->name = IFACE_("Modal map, not yet"); - } - else { - WM_operator_py_idname(opname, ot->idname); - ten->name = BLI_strdup(opname); - ten->flag |= TE_FREE_NAME; - } - } - } - } - } - else { - te->flag |= TE_LAZY_CLOSED; - } - } return te; } diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c index 88e88ab0c66..419713035b6 100644 --- a/source/blender/editors/space_outliner/space_outliner.c +++ b/source/blender/editors/space_outliner/space_outliner.c @@ -31,9 +31,7 @@ #include "BLI_utildefines.h" #include "BKE_context.h" -#include "BKE_layer.h" #include "BKE_outliner_treehash.h" -#include "BKE_scene.h" #include "BKE_screen.h" #include "ED_screen.h" @@ -51,7 +49,6 @@ #include "UI_resources.h" #include "UI_view2d.h" -#include "GPU_framebuffer.h" #include "outliner_intern.h" #include "tree/tree_display.h" @@ -328,7 +325,7 @@ static SpaceLink *outliner_create(const ScrArea *UNUSED(area), const Scene *UNUS space_outliner = MEM_callocN(sizeof(SpaceOutliner), "initoutliner"); space_outliner->spacetype = SPACE_OUTLINER; space_outliner->filter_id_type = ID_GR; - space_outliner->show_restrict_flags = SO_RESTRICT_ENABLE | SO_RESTRICT_HIDE; + space_outliner->show_restrict_flags = SO_RESTRICT_ENABLE | SO_RESTRICT_HIDE | SO_RESTRICT_RENDER; space_outliner->outlinevis = SO_VIEW_LAYER; space_outliner->sync_select_dirty |= WM_OUTLINER_SYNC_SELECT_FROM_ALL; space_outliner->flag = SO_SYNC_SELECT | SO_MODE_COLUMN; @@ -398,13 +395,13 @@ static SpaceLink *outliner_duplicate(SpaceLink *sl) return (SpaceLink *)space_outliner_new; } -static void outliner_id_remap(ScrArea *UNUSED(area), SpaceLink *slink, ID *old_id, ID *new_id) +static void outliner_id_remap(ScrArea *area, SpaceLink *slink, ID *old_id, ID *new_id) { SpaceOutliner *space_outliner = (SpaceOutliner *)slink; /* Some early out checks. */ if (!TREESTORE_ID_TYPE(old_id)) { - return; /* ID type is not used by outilner... */ + return; /* ID type is not used by outliner. */ } if (space_outliner->search_tse.id == old_id) { @@ -430,6 +427,13 @@ static void outliner_id_remap(ScrArea *UNUSED(area), SpaceLink *slink, ID *old_i /* rebuild hash table, because it depends on ids too */ /* postpone a full rebuild because this can be called many times on-free */ space_outliner->storeflag |= SO_TREESTORE_REBUILD; + + if (new_id == NULL) { + /* Redraw is needed when removing data for multiple outlines show the same data. + * without this, the stale data won't get fully flushed when this outliner + * is not the active outliner the user is interacting with. See T85976. */ + ED_area_tag_redraw(area); + } } } } diff --git a/source/blender/editors/space_outliner/tree/common.cc b/source/blender/editors/space_outliner/tree/common.cc index 65c9448634c..306d59288f4 100644 --- a/source/blender/editors/space_outliner/tree/common.cc +++ b/source/blender/editors/space_outliner/tree/common.cc @@ -28,7 +28,6 @@ /* -------------------------------------------------------------------- */ /** \name ID Helpers. - * * \{ */ const char *outliner_idcode_to_plural(short idcode) diff --git a/source/blender/editors/space_outliner/tree/tree_display.cc b/source/blender/editors/space_outliner/tree/tree_display.cc index d2070fb9b1c..6632c057814 100644 --- a/source/blender/editors/space_outliner/tree/tree_display.cc +++ b/source/blender/editors/space_outliner/tree/tree_display.cc @@ -18,8 +18,6 @@ * \ingroup spoutliner */ -#include "BLI_listbase.h" - #include "DNA_listBase.h" #include "tree_display.hh" diff --git a/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc b/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc index f7740f4648f..a0ebac5f451 100644 --- a/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc +++ b/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc @@ -60,7 +60,6 @@ class ObjectsChildrenBuilder { /* -------------------------------------------------------------------- */ /** \name Tree-Display for a View Layer. - * * \{ */ TreeDisplayViewLayer::TreeDisplayViewLayer(SpaceOutliner &space_outliner) @@ -143,10 +142,6 @@ void TreeDisplayViewLayer::add_layer_collections_recursive(ListBase &tree, if (!(tselem->used || ID_IS_LINKED(id) || ID_IS_OVERRIDE_LIBRARY(id))) { tselem->flag &= ~TSE_CLOSED; } - - if (exclude || (lc->runtime_flag & LAYER_COLLECTION_VISIBLE_VIEW_LAYER) == 0) { - ten->flag |= TE_DISABLED; - } } add_layer_collections_recursive(ten->subtree, lc->layer_collections, *ten); @@ -165,10 +160,6 @@ void TreeDisplayViewLayer::add_layer_collection_objects(ListBase &tree, TreeElement *te_object = outliner_add_element( &space_outliner_, &tree, base->object, &ten, 0, 0); te_object->directdata = base; - - if (!(base->flag & BASE_VISIBLE_VIEWLAYER)) { - te_object->flag |= TE_DISABLED; - } } } diff --git a/source/blender/editors/space_outliner/tree/tree_element.cc b/source/blender/editors/space_outliner/tree/tree_element.cc index ce2a8fa634d..27846614994 100644 --- a/source/blender/editors/space_outliner/tree/tree_element.cc +++ b/source/blender/editors/space_outliner/tree/tree_element.cc @@ -20,8 +20,6 @@ #include "DNA_listBase.h" -#include "../outliner_intern.h" - #include "tree_element_anim_data.hh" #include "tree_element_driver_base.hh" #include "tree_element_nla.hh" diff --git a/source/blender/editors/space_script/space_script.c b/source/blender/editors/space_script/space_script.c index 47de18e8faf..4ce0e454df8 100644 --- a/source/blender/editors/space_script/space_script.c +++ b/source/blender/editors/space_script/space_script.c @@ -36,7 +36,6 @@ #include "ED_space_api.h" #include "WM_api.h" -#include "WM_types.h" #include "UI_resources.h" #include "UI_view2d.h" @@ -44,7 +43,6 @@ #ifdef WITH_PYTHON #endif -#include "GPU_framebuffer.h" #include "script_intern.h" /* own include */ // static script_run_python(char *funcname, ) diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c index 516d3bba16f..a9033b98708 100644 --- a/source/blender/editors/space_sequencer/sequencer_add.c +++ b/source/blender/editors/space_sequencer/sequencer_add.c @@ -66,8 +66,6 @@ #include "UI_interface.h" -#include "BKE_sound.h" - #ifdef WITH_AUDASPACE # include #endif @@ -1146,6 +1144,7 @@ void SEQUENCER_OT_effect_strip_add(struct wmOperatorType *ot) "Type", "Sequencer effect type"); sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME | SEQPROP_ENDFRAME); + /* Only used when strip is of the Color type. */ prop = RNA_def_float_color(ot->srna, "color", 3, @@ -1153,7 +1152,7 @@ void SEQUENCER_OT_effect_strip_add(struct wmOperatorType *ot) 0.0f, 1.0f, "Color", - "Initialize the strip with this color (only used when type='COLOR')", + "Initialize the strip with this color", 0.0f, 1.0f); RNA_def_property_subtype(prop, PROP_COLOR_GAMMA); diff --git a/source/blender/editors/space_sequencer/sequencer_buttons.c b/source/blender/editors/space_sequencer/sequencer_buttons.c index a8c13d63259..11614d94862 100644 --- a/source/blender/editors/space_sequencer/sequencer_buttons.c +++ b/source/blender/editors/space_sequencer/sequencer_buttons.c @@ -35,13 +35,9 @@ #include "BKE_global.h" #include "BKE_screen.h" -#include "ED_gpencil.h" #include "ED_screen.h" #include "ED_sequencer.h" -#include "WM_api.h" -#include "WM_types.h" - #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c index 201df1ceed6..b9fb577eb43 100644 --- a/source/blender/editors/space_sequencer/sequencer_draw.c +++ b/source/blender/editors/space_sequencer/sequencer_draw.c @@ -1533,7 +1533,7 @@ static void *sequencer_OCIO_transform_ibuf(const bContext *C, /* Default */ *r_format = GPU_RGBA8; - *r_data = GPU_DATA_UNSIGNED_BYTE; + *r_data = GPU_DATA_UBYTE; /* Fallback to CPU based color space conversion. */ if (force_fallback) { @@ -1580,7 +1580,7 @@ static void *sequencer_OCIO_transform_ibuf(const bContext *C, if ((ibuf->rect || ibuf->rect_float) && !*r_glsl_used) { display_buffer = IMB_display_buffer_acquire_ctx(C, ibuf, &cache_handle); *r_format = GPU_RGBA8; - *r_data = GPU_DATA_UNSIGNED_BYTE; + *r_data = GPU_DATA_UBYTE; } if (cache_handle) { IMB_display_buffer_release(cache_handle); @@ -1682,7 +1682,7 @@ static void sequencer_draw_display_buffer(const bContext *C, display_buffer = (uchar *)ibuf->rect; format = GPU_RGBA8; - data = GPU_DATA_UNSIGNED_BYTE; + data = GPU_DATA_UBYTE; } else { display_buffer = sequencer_OCIO_transform_ibuf(C, ibuf, &glsl_used, &format, &data); diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 7474f8034de..608e220c582 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -28,7 +28,6 @@ #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" -#include "BLI_ghash.h" #include "BLI_math.h" #include "BLI_timecode.h" #include "BLI_utildefines.h" diff --git a/source/blender/editors/space_sequencer/sequencer_ops.c b/source/blender/editors/space_sequencer/sequencer_ops.c index 7bfc8600544..48e6cfcdcd0 100644 --- a/source/blender/editors/space_sequencer/sequencer_ops.c +++ b/source/blender/editors/space_sequencer/sequencer_ops.c @@ -29,12 +29,7 @@ #include "WM_api.h" #include "WM_types.h" -#include "ED_markers.h" -#include "ED_select_utils.h" #include "ED_sequencer.h" -#include "ED_transform.h" /* Transform keymap. */ - -#include "SEQ_sequencer.h" #include "sequencer_intern.h" diff --git a/source/blender/editors/space_sequencer/sequencer_proxy.c b/source/blender/editors/space_sequencer/sequencer_proxy.c index b9698492aa5..24fa4ad7a17 100644 --- a/source/blender/editors/space_sequencer/sequencer_proxy.c +++ b/source/blender/editors/space_sequencer/sequencer_proxy.c @@ -25,7 +25,6 @@ #include "BLI_blenlib.h" #include "BLI_ghash.h" -#include "BLI_timecode.h" #include "DNA_scene_types.h" diff --git a/source/blender/editors/space_sequencer/sequencer_scopes.c b/source/blender/editors/space_sequencer/sequencer_scopes.c index f5707d1ea65..16768e09cb8 100644 --- a/source/blender/editors/space_sequencer/sequencer_scopes.c +++ b/source/blender/editors/space_sequencer/sequencer_scopes.c @@ -30,8 +30,6 @@ #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" -#include "atomic_ops.h" - #include "sequencer_intern.h" /* XXX, why is this function better than BLI_math version? diff --git a/source/blender/editors/space_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c index d7937725705..cf26d1e3243 100644 --- a/source/blender/editors/space_sequencer/space_sequencer.c +++ b/source/blender/editors/space_sequencer/space_sequencer.c @@ -51,7 +51,6 @@ #include "RNA_access.h" -#include "SEQ_sequencer.h" #include "SEQ_utils.h" #include "UI_interface.h" @@ -449,9 +448,9 @@ static void sequencer_dropboxes(void) { ListBase *lb = WM_dropboxmap_find("Sequencer", SPACE_SEQ, RGN_TYPE_WINDOW); - WM_dropbox_add(lb, "SEQUENCER_OT_image_strip_add", image_drop_poll, sequencer_drop_copy); - WM_dropbox_add(lb, "SEQUENCER_OT_movie_strip_add", movie_drop_poll, sequencer_drop_copy); - WM_dropbox_add(lb, "SEQUENCER_OT_sound_strip_add", sound_drop_poll, sequencer_drop_copy); + WM_dropbox_add(lb, "SEQUENCER_OT_image_strip_add", image_drop_poll, sequencer_drop_copy, NULL); + WM_dropbox_add(lb, "SEQUENCER_OT_movie_strip_add", movie_drop_poll, sequencer_drop_copy, NULL); + WM_dropbox_add(lb, "SEQUENCER_OT_sound_strip_add", sound_drop_poll, sequencer_drop_copy, NULL); } /* ************* end drop *********** */ diff --git a/source/blender/editors/space_statusbar/space_statusbar.c b/source/blender/editors/space_statusbar/space_statusbar.c index e877cf8ffcf..0b4f483c114 100644 --- a/source/blender/editors/space_statusbar/space_statusbar.c +++ b/source/blender/editors/space_statusbar/space_statusbar.c @@ -34,7 +34,6 @@ #include "RNA_access.h" #include "UI_interface.h" -#include "UI_view2d.h" #include "WM_api.h" #include "WM_message.h" diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c index 045305e0f5d..98faf89f8ae 100644 --- a/source/blender/editors/space_text/space_text.c +++ b/source/blender/editors/space_text/space_text.c @@ -33,7 +33,6 @@ #include "BKE_global.h" #include "BKE_lib_id.h" #include "BKE_screen.h" -#include "BKE_text.h" #include "ED_screen.h" #include "ED_space_api.h" @@ -47,7 +46,6 @@ #include "RNA_access.h" -#include "GPU_framebuffer.h" #include "text_format.h" #include "text_intern.h" /* own include */ @@ -369,8 +367,8 @@ static void text_dropboxes(void) { ListBase *lb = WM_dropboxmap_find("Text", SPACE_TEXT, RGN_TYPE_WINDOW); - WM_dropbox_add(lb, "TEXT_OT_open", text_drop_poll, text_drop_copy); - WM_dropbox_add(lb, "TEXT_OT_insert", text_drop_paste_poll, text_drop_paste); + WM_dropbox_add(lb, "TEXT_OT_open", text_drop_poll, text_drop_copy, NULL); + WM_dropbox_add(lb, "TEXT_OT_insert", text_drop_paste_poll, text_drop_paste, NULL); } /* ************* end drop *********** */ diff --git a/source/blender/editors/space_topbar/space_topbar.c b/source/blender/editors/space_topbar/space_topbar.c index 6a7439df6e3..419721cf89e 100644 --- a/source/blender/editors/space_topbar/space_topbar.c +++ b/source/blender/editors/space_topbar/space_topbar.c @@ -38,7 +38,6 @@ #include "ED_screen.h" #include "ED_space_api.h" -#include "ED_undo.h" #include "UI_interface.h" #include "UI_resources.h" diff --git a/source/blender/editors/space_userpref/userpref_ops.c b/source/blender/editors/space_userpref/userpref_ops.c index f05d6df9944..7c799f0d97b 100644 --- a/source/blender/editors/space_userpref/userpref_ops.c +++ b/source/blender/editors/space_userpref/userpref_ops.c @@ -28,10 +28,8 @@ #include "BLI_listbase.h" #include "BKE_context.h" -#include "BKE_global.h" #include "BKE_main.h" #include "BKE_preferences.h" -#include "BKE_report.h" #include "RNA_access.h" #include "RNA_define.h" @@ -39,8 +37,6 @@ #include "UI_interface.h" -#include "../interface/interface_intern.h" - #include "WM_api.h" #include "WM_types.h" diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index 26441bde6b6..3d260a9a05b 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -689,21 +689,41 @@ static void view3d_dropboxes(void) { ListBase *lb = WM_dropboxmap_find("View3D", SPACE_VIEW3D, RGN_TYPE_WINDOW); - WM_dropbox_add(lb, "OBJECT_OT_add_named", view3d_ob_drop_poll, view3d_ob_drop_copy); - WM_dropbox_add(lb, "OBJECT_OT_drop_named_material", view3d_mat_drop_poll, view3d_id_drop_copy); - WM_dropbox_add( - lb, "VIEW3D_OT_background_image_add", view3d_ima_bg_drop_poll, view3d_id_path_drop_copy); - WM_dropbox_add( - lb, "OBJECT_OT_drop_named_image", view3d_ima_empty_drop_poll, view3d_id_path_drop_copy); - WM_dropbox_add(lb, "OBJECT_OT_volume_import", view3d_volume_drop_poll, view3d_id_path_drop_copy); + WM_dropbox_add(lb, + "OBJECT_OT_add_named", + view3d_ob_drop_poll, + view3d_ob_drop_copy, + WM_drag_free_imported_drag_ID); + WM_dropbox_add(lb, + "OBJECT_OT_drop_named_material", + view3d_mat_drop_poll, + view3d_id_drop_copy, + WM_drag_free_imported_drag_ID); + WM_dropbox_add(lb, + "VIEW3D_OT_background_image_add", + view3d_ima_bg_drop_poll, + view3d_id_path_drop_copy, + WM_drag_free_imported_drag_ID); + WM_dropbox_add(lb, + "OBJECT_OT_drop_named_image", + view3d_ima_empty_drop_poll, + view3d_id_path_drop_copy, + WM_drag_free_imported_drag_ID); + WM_dropbox_add(lb, + "OBJECT_OT_volume_import", + view3d_volume_drop_poll, + view3d_id_path_drop_copy, + WM_drag_free_imported_drag_ID); WM_dropbox_add(lb, "OBJECT_OT_collection_instance_add", view3d_collection_drop_poll, - view3d_collection_drop_copy); + view3d_collection_drop_copy, + WM_drag_free_imported_drag_ID); WM_dropbox_add(lb, "OBJECT_OT_data_instance_add", view3d_object_data_drop_poll, - view3d_id_drop_copy_with_type); + view3d_id_drop_copy_with_type, + WM_drag_free_imported_drag_ID); } static void view3d_widgets(void) @@ -1591,7 +1611,8 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes if (view_layer->basact) { Object *ob = view_layer->basact->object; /* if hidden but in edit mode, we still display, can happen with animation */ - if ((view_layer->basact->flag & BASE_VISIBLE_DEPSGRAPH) != 0 || (ob->mode & OB_MODE_EDIT)) { + if ((view_layer->basact->flag & BASE_VISIBLE_DEPSGRAPH) != 0 || + (ob->mode != OB_MODE_OBJECT)) { CTX_data_pointer_set(result, &scene->id, &RNA_ObjectBase, view_layer->basact); } } @@ -1599,12 +1620,25 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes return 1; } else if (CTX_data_equals(member, "active_object")) { + /* In most cases the active object is the `view_layer->basact->object`. + * For the 3D view however it can be NULL when hidden. + * + * This is ignored in the case the object is in any mode (besides object-mode), + * since the object's mode impacts the current tool, cursor, gizmos etc. + * If we didn't have this exception, changing visibility would need to perform + * many of the the same updates as changing the objects mode. + * + * Further, there are multiple ways to hide objects - by collection, by object type, etc. + * it's simplest if all these methods behave consistently - respecting the object-mode + * without showing the object. + * + * See T85532 for alternatives that were considered. */ ViewLayer *view_layer = CTX_data_view_layer(C); if (view_layer->basact) { Object *ob = view_layer->basact->object; /* if hidden but in edit mode, we still display, can happen with animation */ if ((view_layer->basact->flag & BASE_VISIBLE_DEPSGRAPH) != 0 || - (ob->mode & OB_MODE_EDIT) != 0) { + (ob->mode != OB_MODE_OBJECT)) { CTX_data_id_pointer_set(result, &ob->id); } } diff --git a/source/blender/editors/space_view3d/view3d_camera_control.c b/source/blender/editors/space_view3d/view3d_camera_control.c index 11643960595..0edd6aeb2ca 100644 --- a/source/blender/editors/space_view3d/view3d_camera_control.c +++ b/source/blender/editors/space_view3d/view3d_camera_control.c @@ -50,12 +50,8 @@ #include "DEG_depsgraph.h" -#include "ED_screen.h" - #include "view3d_intern.h" /* own include */ -#include "BLI_strict_flags.h" - typedef struct View3DCameraControl { /* -------------------------------------------------------------------- */ diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index aa4922372c8..a46d093c039 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -878,7 +878,11 @@ void ED_view3d_draw_depth(Depsgraph *depsgraph, ARegion *region, View3D *v3d, bo UI_Theme_Restore(&theme_state); } -/* ******************** other elements ***************** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Other Elements + * \{ */ /** could move this elsewhere, but tied into #ED_view3d_grid_scale */ float ED_scene_grid_scale(const Scene *scene, const char **r_grid_unit) @@ -1676,6 +1680,7 @@ void ED_view3d_draw_offscreen(Depsgraph *depsgraph, bool draw_background, const char *viewname, const bool do_color_management, + const bool restore_rv3d_mats, GPUOffScreen *ofs, GPUViewport *viewport) { @@ -1764,7 +1769,11 @@ void ED_view3d_draw_offscreen(Depsgraph *depsgraph, region->winy = orig.region_winy; region->winrct = orig.region_winrct; - ED_view3d_mats_rv3d_restore(region->regiondata, orig.rv3d_mats); + /* Optionally do _not_ restore rv3d matrices (e.g. they are used/stored in the ImBuff for + * reprojection, see texture_paint_image_from_view_exec(). */ + if (restore_rv3d_mats) { + ED_view3d_mats_rv3d_restore(region->regiondata, orig.rv3d_mats); + } MEM_freeN(orig.rv3d_mats); UI_Theme_Restore(&orig.theme_state); @@ -1856,6 +1865,7 @@ void ED_view3d_draw_offscreen_simple(Depsgraph *depsgraph, draw_background, viewname, do_color_management, + true, ofs, viewport); } @@ -1876,6 +1886,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Depsgraph *depsgraph, eImBufFlags imbuf_flag, int alpha_mode, const char *viewname, + const bool restore_rv3d_mats, /* output vars */ GPUOffScreen *ofs, char err_out[256]) @@ -1983,6 +1994,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Depsgraph *depsgraph, draw_sky, viewname, do_color_management, + restore_rv3d_mats, ofs, NULL); @@ -1990,7 +2002,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Depsgraph *depsgraph, GPU_offscreen_read_pixels(ofs, GPU_DATA_FLOAT, ibuf->rect_float); } else if (ibuf->rect) { - GPU_offscreen_read_pixels(ofs, GPU_DATA_UNSIGNED_BYTE, ibuf->rect); + GPU_offscreen_read_pixels(ofs, GPU_DATA_UBYTE, ibuf->rect); } /* unbind */ @@ -2108,6 +2120,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Depsgraph *depsgraph, imbuf_flag, alpha_mode, viewname, + true, ofs, err_out); } @@ -2140,7 +2153,11 @@ bool ED_view3d_clipping_test(const RegionView3D *rv3d, const float co[3], const return view3d_clipping_test(co, is_local ? rv3d->clip_local : rv3d->clip); } -/* *********************** backdraw for selection *************** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Back-Draw for Selection + * \{ */ /** * \note Only use in object mode. @@ -2183,7 +2200,7 @@ static void validate_object_select_id(struct Depsgraph *depsgraph, } /* TODO: Create a flag in `DRW_manager` because the drawing is no longer - * made on the backbuffer in this case. */ + * made on the back-buffer in this case. */ v3d->flag &= ~V3D_INVALID_BACKBUF; } @@ -2212,7 +2229,7 @@ static void view3d_opengl_read_Z_pixels(GPUViewport *viewport, rcti *rect, void void ED_view3d_select_id_validate(ViewContext *vc) { /* TODO: Create a flag in `DRW_manager` because the drawing is no longer - * made on the backbuffer in this case. */ + * made on the back-buffer in this case. */ if (vc->v3d->flag & V3D_INVALID_BACKBUF) { validate_object_select_id(vc->depsgraph, vc->view_layer, vc->region, vc->v3d, vc->obact); } @@ -2242,7 +2259,11 @@ int ED_view3d_backbuf_sample_size_clamp(ARegion *region, const float dist) return (int)min_ff(ceilf(dist), (float)max_ii(region->winx, region->winx)); } -/* *********************** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Z-Depth Utilities + * \{ */ void view3d_update_depths_rect(ARegion *region, ViewDepths *d, rcti *rect) { @@ -2374,7 +2395,11 @@ void ED_view3d_draw_depth_gpencil(Depsgraph *depsgraph, Scene *scene, ARegion *r GPU_depth_test(GPU_DEPTH_NONE); } -/* *********************** customdata **************** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Custom-data Utilities + * \{ */ void ED_view3d_datamask(const bContext *C, const Scene *UNUSED(scene), @@ -2421,6 +2446,12 @@ void ED_view3d_screen_datamask(const bContext *C, } } +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Region View Matrix Backup/Restore + * \{ */ + /** * Store values from #RegionView3D, set when drawing. * This is needed when we draw with to a viewport using a different matrix @@ -2463,6 +2494,12 @@ void ED_view3d_mats_rv3d_restore(struct RegionView3D *rv3d, struct RV3DMatrixSto rv3d->pixsize = rv3dmat->pixsize; } +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name FPS Drawing + * \{ */ + /** * \note The info that this uses is updated in #ED_refresh_viewport_fps, * which currently gets called during #SCREEN_OT_animation_step. @@ -2522,6 +2559,12 @@ void ED_scene_draw_fps(const Scene *scene, int xoffset, int *yoffset) BLF_disable(font_id, BLF_SHADOW); } +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Calculate Render Border + * \{ */ + static bool view3d_main_region_do_render_draw(const Scene *scene) { RenderEngineType *type = RE_engines_find(scene->r.engine); diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 2f8cd5a7517..dc590833368 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -4105,8 +4105,6 @@ static int view_camera_exec(bContext *C, wmOperator *op) ED_view3d_smooth_view_force_finish(C, v3d, region); if ((RV3D_LOCK_FLAGS(rv3d) & RV3D_LOCK_ANY_TRANSFORM) == 0) { - /* lastview - */ - ViewLayer *view_layer = CTX_data_view_layer(C); Scene *scene = CTX_data_scene(C); @@ -4120,15 +4118,6 @@ static int view_camera_exec(bContext *C, wmOperator *op) ED_view3d_lastview_store(rv3d); } -#if 0 - if (G.qual == LR_ALTKEY) { - if (oldcamera && is_an_active_object(oldcamera)) { - v3d->camera = oldcamera; - } - handle_view3d_lock(); - } -#endif - /* first get the default camera for the view lock type */ if (v3d->scenelock) { /* sets the camera view if available */ @@ -5285,7 +5274,7 @@ void VIEW3D_OT_cursor3d(wmOperatorType *ot) static const EnumPropertyItem prop_shading_type_items[] = { {OB_WIRE, "WIREFRAME", 0, "Wireframe", "Toggle wireframe shading"}, {OB_SOLID, "SOLID", 0, "Solid", "Toggle solid shading"}, - {OB_MATERIAL, "MATERIAL", 0, "LookDev", "Toggle lookdev shading"}, + {OB_MATERIAL, "MATERIAL", 0, "Material Preview", "Toggle material preview shading"}, {OB_RENDER, "RENDERED", 0, "Rendered", "Toggle rendered shading"}, {0, NULL, 0, NULL, NULL}, }; diff --git a/source/blender/editors/space_view3d/view3d_gizmo_armature.c b/source/blender/editors/space_view3d/view3d_gizmo_armature.c index ee512a5f726..4d8102af6ff 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_armature.c +++ b/source/blender/editors/space_view3d/view3d_gizmo_armature.c @@ -48,7 +48,6 @@ /* -------------------------------------------------------------------- */ /** \name Armature Spline Gizmo - * * \{ */ /* diff --git a/source/blender/editors/space_view3d/view3d_gizmo_camera.c b/source/blender/editors/space_view3d/view3d_gizmo_camera.c index a9928fa2dc0..20d766357e8 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_camera.c +++ b/source/blender/editors/space_view3d/view3d_gizmo_camera.c @@ -242,7 +242,7 @@ static void WIDGETGROUP_camera_refresh(const bContext *C, wmGizmoGroup *gzgroup) WM_gizmo_target_property_def_rna_ptr(widget, gz_prop_type, &camera_ptr, prop, -1); } - /* This could be handled more elegently (split into two gizmo groups). */ + /* This could be handled more elegantly (split into two gizmo groups). */ if ((v3d->gizmo_show_camera & V3D_GIZMO_SHOW_CAMERA_LENS) == 0) { WM_gizmo_set_flag(cagzgroup->focal_len, WM_GIZMO_HIDDEN, true); WM_gizmo_set_flag(cagzgroup->ortho_scale, WM_GIZMO_HIDDEN, true); diff --git a/source/blender/editors/space_view3d/view3d_gizmo_forcefield.c b/source/blender/editors/space_view3d/view3d_gizmo_forcefield.c index 242a0a802a6..98597cb2986 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_forcefield.c +++ b/source/blender/editors/space_view3d/view3d_gizmo_forcefield.c @@ -22,7 +22,6 @@ #include "BKE_context.h" #include "BKE_layer.h" -#include "BKE_object.h" #include "DNA_object_force_types.h" #include "DNA_object_types.h" diff --git a/source/blender/editors/space_view3d/view3d_gizmo_navigate.c b/source/blender/editors/space_view3d/view3d_gizmo_navigate.c index c145497fa09..6fa974cdb09 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_navigate.c +++ b/source/blender/editors/space_view3d/view3d_gizmo_navigate.c @@ -22,7 +22,6 @@ #include "BLI_utildefines.h" #include "BKE_context.h" -#include "BKE_object.h" #include "DNA_object_types.h" diff --git a/source/blender/editors/space_view3d/view3d_gizmo_preselect.c b/source/blender/editors/space_view3d/view3d_gizmo_preselect.c index 3f07653fb2f..441182d7a5f 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_preselect.c +++ b/source/blender/editors/space_view3d/view3d_gizmo_preselect.c @@ -30,14 +30,12 @@ #include "UI_resources.h" #include "WM_api.h" -#include "WM_toolsystem.h" #include "WM_types.h" #include "view3d_intern.h" /* own include */ /* -------------------------------------------------------------------- */ /** \name Mesh Pre-Select Element Gizmo - * * \{ */ struct GizmoGroupPreSelElem { @@ -73,7 +71,6 @@ void VIEW3D_GGT_mesh_preselect_elem(wmGizmoGroupType *gzgt) /* -------------------------------------------------------------------- */ /** \name Mesh Pre-Select Edge Ring Gizmo - * * \{ */ struct GizmoGroupPreSelEdgeRing { diff --git a/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c b/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c index 9f35abf7fef..298a2a7a824 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c +++ b/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c @@ -52,7 +52,6 @@ /* -------------------------------------------------------------------- */ /** \name Mesh Element (Vert/Edge/Face) Pre-Select Gizmo API - * * \{ */ typedef struct MeshElemGizmo3D { @@ -282,7 +281,6 @@ static void GIZMO_GT_mesh_preselect_elem_3d(wmGizmoType *gzt) /* -------------------------------------------------------------------- */ /** \name Mesh Edge-Ring Pre-Select Gizmo API - * * \{ */ typedef struct MeshEdgeRingGizmo3D { @@ -439,7 +437,6 @@ static void GIZMO_GT_mesh_preselect_edgering_3d(wmGizmoType *gzt) /* -------------------------------------------------------------------- */ /** \name Gizmo API - * * \{ */ void ED_gizmotypes_preselect_3d(void) diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c index f2e42cd1725..607ca110d0f 100644 --- a/source/blender/editors/space_view3d/view3d_header.c +++ b/source/blender/editors/space_view3d/view3d_header.c @@ -40,14 +40,11 @@ #include "DEG_depsgraph.h" #include "RNA_access.h" -#include "RNA_define.h" -#include "RNA_enum_types.h" #include "WM_api.h" #include "WM_types.h" #include "ED_mesh.h" -#include "ED_screen.h" #include "ED_undo.h" #include "UI_interface.h" diff --git a/source/blender/editors/space_view3d/view3d_ops.c b/source/blender/editors/space_view3d/view3d_ops.c index 0770bac1313..344168e895b 100644 --- a/source/blender/editors/space_view3d/view3d_ops.c +++ b/source/blender/editors/space_view3d/view3d_ops.c @@ -24,7 +24,6 @@ #include #include -#include "DNA_collection_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" @@ -36,7 +35,6 @@ #include "BKE_appdir.h" #include "BKE_blender_copybuffer.h" -#include "BKE_collection.h" #include "BKE_context.h" #include "BKE_main.h" #include "BKE_report.h" @@ -49,7 +47,6 @@ #include "ED_outliner.h" #include "ED_screen.h" -#include "ED_select_utils.h" #include "ED_transform.h" #include "view3d_intern.h" diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c index 148a0986c5c..cce9287679c 100644 --- a/source/blender/editors/space_view3d/view3d_snap.c +++ b/source/blender/editors/space_view3d/view3d_snap.c @@ -27,7 +27,6 @@ #include "DNA_object_types.h" #include "BLI_array.h" -#include "BLI_blenlib.h" #include "BLI_math.h" #include "BLI_utildefines.h" diff --git a/source/blender/editors/space_view3d/view3d_utils.c b/source/blender/editors/space_view3d/view3d_utils.c index a6a77ecd5f7..3ef428cfbaf 100644 --- a/source/blender/editors/space_view3d/view3d_utils.c +++ b/source/blender/editors/space_view3d/view3d_utils.c @@ -67,7 +67,6 @@ /* -------------------------------------------------------------------- */ /** \name View Data Access Utilities - * * \{ */ void ED_view3d_background_color_get(const Scene *scene, const View3D *v3d, float r_color[3]) @@ -189,7 +188,6 @@ bool ED_view3d_viewplane_get(Depsgraph *depsgraph, /* -------------------------------------------------------------------- */ /** \name View State/Context Utilities - * * \{ */ /** @@ -272,7 +270,6 @@ bool ED_view3d_context_activate(bContext *C) /* -------------------------------------------------------------------- */ /** \name View Clipping Utilities - * * \{ */ void ED_view3d_clipping_calc_from_boundbox(float clip[4][4], @@ -397,7 +394,6 @@ bool ED_view3d_clipping_clamp_minmax(const RegionView3D *rv3d, float min[3], flo /* -------------------------------------------------------------------- */ /** \name View Bound-Box Utilities - * * \{ */ static bool view3d_boundbox_clip_m4(const BoundBox *bb, const float persmatob[4][4]) diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c index 5c0ca1582a6..21cb8560e9b 100644 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@ -277,8 +277,7 @@ void ED_view3d_smooth_view_ex( if (rv3d->smooth_timer) { WM_event_remove_timer(wm, win, rv3d->smooth_timer); } - /* TIMER1 is hardcoded in keymap */ - /* max 30 frs/sec */ + /* #TIMER1 is hard-coded in key-map. */ rv3d->smooth_timer = WM_event_add_timer(wm, win, TIMER1, 1.0 / 100.0); ok = true; @@ -1210,8 +1209,8 @@ static uint free_localview_bit(Main *bmain) ushort local_view_bits = 0; - /* sometimes we lose a localview: when an area is closed */ - /* check all areas: which localviews are in use? */ + /* Sometimes we lose a local-view: when an area is closed. + * Check all areas: which local-views are in use? */ for (screen = bmain->screens.first; screen; screen = screen->id.next) { for (area = screen->areabase.first; area; area = area->next) { SpaceLink *sl = area->spacedata.first; diff --git a/source/blender/editors/transform/CMakeLists.txt b/source/blender/editors/transform/CMakeLists.txt index faed8abb202..b0bc5c6abda 100644 --- a/source/blender/editors/transform/CMakeLists.txt +++ b/source/blender/editors/transform/CMakeLists.txt @@ -55,6 +55,7 @@ set(SRC transform_convert_nla.c transform_convert_node.c transform_convert_object.c + transform_convert_object_texspace.c transform_convert_paintcurve.c transform_convert_particle.c transform_convert_sculpt.c diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 86a35949d1d..2fbcbe22349 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -440,7 +440,7 @@ static void viewRedrawForce(const bContext *C, TransInfo *t) } else { /* Do we need more refined tags? */ - if (t->flag & T_POSE) { + if (t->options & CTX_POSE_BONE) { WM_event_add_notifier(C, NC_OBJECT | ND_POSE, NULL); } else { @@ -484,7 +484,7 @@ static void viewRedrawForce(const bContext *C, TransInfo *t) wmWindow *window = CTX_wm_window(C); WM_paint_cursor_tag_redraw(window, t->region); } - else if (t->flag & T_CURSOR) { + else if (t->options & CTX_CURSOR) { ED_area_tag_redraw(t->area); } else { @@ -695,6 +695,7 @@ wmKeyMap *transform_modal_keymap(wmKeyConfig *keyconf) {TFM_MODAL_RESIZE, "RESIZE", 0, "Resize", ""}, {TFM_MODAL_AUTOCONSTRAINT, "AUTOCONSTRAIN", 0, "Automatic Constraint", ""}, {TFM_MODAL_AUTOCONSTRAINTPLANE, "AUTOCONSTRAINPLANE", 0, "Automatic Constraint Plane", ""}, + {TFM_MODAL_PRECISION, "PRECISION", 0, "Precision Mode", ""}, {0, NULL, 0, NULL, NULL}, }; @@ -806,8 +807,6 @@ int transformEvent(TransInfo *t, const wmEvent *event) const int modifiers_prev = t->modifiers; const int mode_prev = t->mode; - t->redraw |= handleMouseInput(t, &t->mouse, event); - /* Handle modal numinput events first, if already activated. */ if (((event->val == KM_PRESS) || (event->type == EVT_MODAL_MAP)) && hasNumInput(&t->num) && handleNumInput(t->context, &(t->num), event)) { @@ -895,7 +894,7 @@ int transformEvent(TransInfo *t, const wmEvent *event) break; case TFM_MODAL_ROTATE: /* only switch when... */ - if (!(t->options & CTX_TEXTURE) && !(t->options & (CTX_MOVIECLIP | CTX_MASK))) { + if (!(t->options & CTX_TEXTURE_SPACE) && !(t->options & (CTX_MOVIECLIP | CTX_MASK))) { if (transform_mode_is_changeable(t->mode)) { restoreTransObjects(t); resetTransModal(t); @@ -1069,7 +1068,7 @@ int transformEvent(TransInfo *t, const wmEvent *event) t->modifiers &= ~(MOD_CONSTRAINT_SELECT | MOD_CONSTRAINT_PLANE); } else { - if (t->flag & T_CAMERA) { + if (t->options & CTX_CAMERA) { /* Exception for switching to dolly, or trackball, in camera view. */ if (t->mode == TFM_TRANSLATION) { setLocalConstraint(t, (CON_AXIS2), TIP_("along local Z")); @@ -1095,6 +1094,19 @@ int transformEvent(TransInfo *t, const wmEvent *event) handled = true; } break; + case TFM_MODAL_PRECISION: + if (event->prevval == KM_PRESS) { + t->modifiers |= MOD_PRECISION; + /* Shift is modifier for higher precision transform. */ + t->mouse.precision = 1; + t->redraw |= TREDRAW_HARD; + } + else if (event->prevval == KM_RELEASE) { + t->modifiers &= ~MOD_PRECISION; + t->mouse.precision = 0; + t->redraw |= TREDRAW_HARD; + } + break; /* Those two are only handled in transform's own handler, see T44634! */ case TFM_MODAL_EDGESLIDE_UP: case TFM_MODAL_EDGESLIDE_DOWN: @@ -1382,7 +1394,7 @@ static void drawTransformPixel(const struct bContext *C, ARegion *region, void * */ if ((U.autokey_flag & AUTOKEY_FLAG_NOWARNING) == 0) { if (region == t->region) { - if (t->flag & (T_OBJECT | T_POSE)) { + if (t->options & (CTX_OBJECT | CTX_POSE_BONE)) { if (ob && autokeyframe_cfra_can_key(scene, &ob->id)) { drawAutoKeyWarning(t, region); } @@ -1652,7 +1664,7 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve if ((prop = RNA_struct_find_property(op->ptr, "texture_space")) && RNA_property_is_set(op->ptr, prop)) { if (RNA_property_boolean_get(op->ptr, prop)) { - options |= CTX_TEXTURE; + options |= CTX_TEXTURE_SPACE; } } diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index fff7d47cc5b..24335b6b6b7 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -36,6 +36,11 @@ #include "transform_data.h" +/* use node center for transform instead of upper-left corner. + * disabled since it makes absolute snapping not work so nicely + */ +// #define USE_NODE_CENTER + /* -------------------------------------------------------------------- */ /** \name Types/ * \{ */ @@ -60,6 +65,134 @@ struct wmKeyMap; struct wmOperator; struct wmTimer; +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Enums and Flags + * \{ */ + +/** #TransInfo.options */ +typedef enum { + CTX_NONE = 0, + + /* These are similar to TransInfo::data_type. */ + CTX_CAMERA = (1 << 0), + CTX_CURSOR = (1 << 1), + CTX_EDGE_DATA = (1 << 2), + CTX_GPENCIL_STROKES = (1 << 3), + CTX_MASK = (1 << 4), + CTX_MOVIECLIP = (1 << 5), + CTX_OBJECT = (1 << 6), + CTX_PAINT_CURVE = (1 << 7), + CTX_POSE_BONE = (1 << 8), + CTX_TEXTURE_SPACE = (1 << 9), + + CTX_NO_PET = (1 << 10), + CTX_NO_MIRROR = (1 << 11), + CTX_AUTOCONFIRM = (1 << 12), + /** When transforming object's, adjust the object data so it stays in the same place. */ + CTX_OBMODE_XFORM_OBDATA = (1 << 13), + /** Transform object parents without moving their children. */ + CTX_OBMODE_XFORM_SKIP_CHILDREN = (1 << 14), +} eTContext; + +/** #TransInfo.flag */ +typedef enum { + /** \note We could remove 'T_EDIT' and use 'obedit_type', for now ensure they're in sync. */ + T_EDIT = 1 << 0, + /** Transform points, having no rotation/scale. */ + T_POINTS = 1 << 1, + /** restrictions flags */ + T_NO_CONSTRAINT = 1 << 2, + T_NULL_ONE = 1 << 3, + T_NO_ZERO = 1 << 4, + T_ALL_RESTRICTIONS = T_NO_CONSTRAINT | T_NULL_ONE | T_NO_ZERO, + + T_PROP_EDIT = 1 << 5, + T_PROP_CONNECTED = 1 << 6, + T_PROP_PROJECTED = 1 << 7, + T_PROP_EDIT_ALL = T_PROP_EDIT | T_PROP_CONNECTED | T_PROP_PROJECTED, + + T_V3D_ALIGN = 1 << 8, + /** For 2D views such as UV or f-curve. */ + T_2D_EDIT = 1 << 9, + T_CLIP_UV = 1 << 10, + + /** Auto-IK is on. */ + T_AUTOIK = 1 << 11, + + /** Don't use mirror even if the data-block option is set. */ + T_NO_MIRROR = 1 << 12, + + /** To indicate that the value set in the `value` parameter is the final + * value of the transformation, modified only by the constrain. */ + T_INPUT_IS_VALUES_FINAL = 1 << 13, + + /** To specify if we save back settings at the end. */ + T_MODAL = 1 << 14, + + /** No re-topology (projection). */ + T_NO_PROJECT = 1 << 15, + + T_RELEASE_CONFIRM = 1 << 16, + + /** Alternative transformation. used to add offset to tracking markers. */ + T_ALT_TRANSFORM = 1 << 17, + + /** #TransInfo.center has been set, don't change it. */ + T_OVERRIDE_CENTER = 1 << 18, + + T_MODAL_CURSOR_SET = 1 << 19, + + T_CLNOR_REBUILD = 1 << 20, + + /** Merges unselected into selected after transforming (runs after transforming). */ + T_AUTOMERGE = 1 << 21, + /** Runs auto-merge & splits. */ + T_AUTOSPLIT = 1 << 22, +} eTFlag; + +/** #TransInfo.modifiers */ +typedef enum { + MOD_CONSTRAINT_SELECT = 1 << 0, + MOD_PRECISION = 1 << 1, + MOD_SNAP = 1 << 2, + MOD_SNAP_INVERT = 1 << 3, + MOD_CONSTRAINT_PLANE = 1 << 4, +} eTModifier; + +/** #TransSnap.status */ +typedef enum { + SNAP_FORCED = 1 << 0, + TARGET_INIT = 1 << 1, + /* Special flag for snap to grid. */ + TARGET_GRID_INIT = 1 << 2, + POINT_INIT = 1 << 3, + MULTI_POINTS = 1 << 4, +} eTSnap; + +/** #TransCon.mode, #TransInfo.con.mode */ +typedef enum { + /** When set constraints are in use. */ + CON_APPLY = 1 << 0, + /** These are only used for modal execution. */ + CON_AXIS0 = 1 << 1, + CON_AXIS1 = 1 << 2, + CON_AXIS2 = 1 << 3, + CON_SELECT = 1 << 4, + /** Does not reorient vector to face viewport when on. */ + CON_NOFLIP = 1 << 5, + CON_USER = 1 << 6, +} eTConstraint; + +/** #TransInfo.state */ +typedef enum { + TRANS_STARTING = 0, + TRANS_RUNNING = 1, + TRANS_CONFIRM = 2, + TRANS_CANCEL = 3, +} eTState; + /** #TransInfo.redraw */ typedef enum { TREDRAW_NOTHING = 0, @@ -67,6 +200,97 @@ typedef enum { TREDRAW_SOFT = 2, } eRedrawFlag; +/** #TransInfo.helpline */ +typedef enum { + HLP_NONE = 0, + HLP_SPRING = 1, + HLP_ANGLE = 2, + HLP_HARROW = 3, + HLP_VARROW = 4, + HLP_CARROW = 5, + HLP_TRACKBALL = 6, +} eTHelpline; + +typedef enum { + TC_NONE = 0, + TC_ACTION_DATA, + TC_POSE, + TC_ARMATURE_VERTS, + TC_CURSOR_IMAGE, + TC_CURSOR_VIEW3D, + TC_CURVE_VERTS, + TC_GRAPH_EDIT_DATA, + TC_GPENCIL, + TC_LATTICE_VERTS, + TC_MASKING_DATA, + TC_MBALL_VERTS, + TC_MESH_VERTS, + TC_MESH_EDGES, + TC_MESH_SKIN, + TC_MESH_UV, + TC_NLA_DATA, + TC_NODE_DATA, + TC_OBJECT, + TC_OBJECT_TEXSPACE, + TC_PAINT_CURVE_VERTS, + TC_PARTICLE_VERTS, + TC_SCULPT, + TC_SEQ_DATA, + TC_TRACKING_DATA, +} eTConvertType; + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Keymap Modal Items + * + * \note these values are saved in key-map files, do not change then but just add new ones. + * \{ */ + +enum { + TFM_MODAL_CANCEL = 1, + TFM_MODAL_CONFIRM = 2, + TFM_MODAL_TRANSLATE = 3, + TFM_MODAL_ROTATE = 4, + TFM_MODAL_RESIZE = 5, + TFM_MODAL_SNAP_INV_ON = 6, + TFM_MODAL_SNAP_INV_OFF = 7, + TFM_MODAL_SNAP_TOGGLE = 8, + TFM_MODAL_AXIS_X = 9, + TFM_MODAL_AXIS_Y = 10, + TFM_MODAL_AXIS_Z = 11, + TFM_MODAL_PLANE_X = 12, + TFM_MODAL_PLANE_Y = 13, + TFM_MODAL_PLANE_Z = 14, + TFM_MODAL_CONS_OFF = 15, + TFM_MODAL_ADD_SNAP = 16, + TFM_MODAL_REMOVE_SNAP = 17, + + /* 18 and 19 used by number-input, defined in `ED_numinput.h`. */ + // NUM_MODAL_INCREMENT_UP = 18, + // NUM_MODAL_INCREMENT_DOWN = 19, + + TFM_MODAL_PROPSIZE_UP = 20, + TFM_MODAL_PROPSIZE_DOWN = 21, + TFM_MODAL_AUTOIK_LEN_INC = 22, + TFM_MODAL_AUTOIK_LEN_DEC = 23, + + TFM_MODAL_EDGESLIDE_UP = 24, + TFM_MODAL_EDGESLIDE_DOWN = 25, + + /** For analog input, like track-pad. */ + TFM_MODAL_PROPSIZE = 26, + /** Node editor insert offset (also called auto-offset) direction toggle. */ + TFM_MODAL_INSERTOFS_TOGGLE_DIR = 27, + + TFM_MODAL_AUTOCONSTRAINT = 28, + TFM_MODAL_AUTOCONSTRAINTPLANE = 29, + + TFM_MODAL_PRECISION = 30, +}; + +/** \} */ + typedef struct TransSnapPoint { struct TransSnapPoint *next, *prev; float co[3]; @@ -82,13 +306,14 @@ typedef struct TransSnap { bool snap_self; bool peel; bool use_backface_culling; - char status; + eTSnap status; /* Snapped Element Type (currently for objects only). */ char snapElem; /** snapping from this point (in global-space). */ float snapPoint[3]; /** to this point (in global-space). */ float snapTarget[3]; + float snapTargetGrid[3]; float snapNormal[3]; char snapNodeBorder; ListBase points; @@ -120,7 +345,7 @@ typedef struct TransCon { * the one in #TransInfo is not guarantee to stay the same (Rotates change it). */ int imval[2]; /** Mode flags of the constraint. */ - int mode; + eTConstraint mode; void (*drawExtra)(struct TransInfo *t); /* Note: if 'tc' is NULL, 'td' must also be NULL. @@ -266,37 +491,45 @@ typedef struct TransInfo { TransDataContainer *data_container; int data_container_len; - /** #eTransConvertType - * TODO: It should be a member of #TransDataContainer. */ - int data_type; - /** Combine length of all #TransDataContainer.data_len * Use to check if nothing is selected or if we have a single selection. */ int data_len_all; - /** Current mode. */ - int mode; - /** Generic flags for special behaviors. */ - int flag; - /** Special modifiers, by function, not key. */ - int modifiers; - /** Current state (running, canceled. */ - short state; + /** TODO: It should be a member of #TransDataContainer. */ + eTConvertType data_type; + /** Current context/options for transform. */ - int options; - void (*transform)(struct TransInfo *, const int[2]); - /** Transform function pointer. */ - eRedrawFlag (*handleEvent)(struct TransInfo *, const struct wmEvent *); - /* event handler function pointer RETURN 1 if redraw is needed */ - /** transformed constraint. */ - TransCon con; - TransSnap tsnap; - /** numerical input. */ - NumInput num; - /** mouse input. */ - MouseInput mouse; - /** redraw flag. */ + eTContext options; + /** Generic flags for special behaviors. */ + eTFlag flag; + /** Special modifiers, by function, not key. */ + eTModifier modifiers; + /** Current state (running, canceled. */ + eTState state; + /** Redraw flag. */ eRedrawFlag redraw; + /** Choice of custom cursor with or without a help line from the gizmo to the mouse position. */ + eTHelpline helpline; + /** Current mode. */ + eTfmMode mode; + + /** Main transform mode function. */ + void (*transform)(struct TransInfo *, const int[2]); + /* Event handler function that determines whether the viewport needs to be redrawn. */ + eRedrawFlag (*handleEvent)(struct TransInfo *, const struct wmEvent *); + + /** Constraint Data. */ + TransCon con; + + /** Snap Data. */ + TransSnap tsnap; + + /** Numerical input. */ + NumInput num; + + /** Mouse input. */ + MouseInput mouse; + /** proportional circle radius. */ float prop_size; /** proportional falloff text. */ @@ -310,9 +543,6 @@ typedef struct TransInfo { float center_global[3]; /** center in screen coordinates. */ float center2d[2]; - /* Lazy initialize center data for when we need other center values. - * V3D_AROUND_ACTIVE + 1 (static assert checks this) */ - TransCenterData center_cache[5]; /** maximum index on the input vector. */ short idx_max; /** Snapping Gears. */ @@ -333,8 +563,6 @@ typedef struct TransInfo { short around; /** space-type where transforming is. */ char spacetype; - /** Choice of custom cursor with or without a help line from the gizmo to the mouse position. */ - char helpline; /** Avoid looking inside #TransDataContainer.obedit. */ short obedit_type; @@ -421,178 +649,6 @@ typedef struct TransInfo { /** \} */ -/* -------------------------------------------------------------------- */ -/** \name Flags - * \{ */ - -/** #TransInfo.state */ -enum { - TRANS_STARTING = 0, - TRANS_RUNNING = 1, - TRANS_CONFIRM = 2, - TRANS_CANCEL = 3, -}; - -/** #TransInfo.flag */ -enum { - T_OBJECT = 1 << 0, - /** \note We could remove 'T_EDIT' and use 'obedit_type', for now ensure they're in sync. */ - T_EDIT = 1 << 1, - T_POSE = 1 << 2, - T_TEXTURE = 1 << 3, - /** Transforming the 3d view. */ - T_CAMERA = 1 << 4, - /** Transforming the 3D cursor. */ - T_CURSOR = 1 << 5, - /** Transform points, having no rotation/scale. */ - T_POINTS = 1 << 6, - /** restrictions flags */ - T_NO_CONSTRAINT = 1 << 7, - T_NULL_ONE = 1 << 8, - T_NO_ZERO = 1 << 9, - T_ALL_RESTRICTIONS = T_NO_CONSTRAINT | T_NULL_ONE | T_NO_ZERO, - - T_PROP_EDIT = 1 << 10, - T_PROP_CONNECTED = 1 << 11, - T_PROP_PROJECTED = 1 << 12, - T_PROP_EDIT_ALL = T_PROP_EDIT | T_PROP_CONNECTED | T_PROP_PROJECTED, - - T_V3D_ALIGN = 1 << 13, - /** For 2D views such as UV or f-curve. */ - T_2D_EDIT = 1 << 14, - T_CLIP_UV = 1 << 15, - - /** Auto-IK is on. */ - T_AUTOIK = 1 << 16, - - /** Don't use mirror even if the data-block option is set. */ - T_NO_MIRROR = 1 << 17, - - /** To indicate that the value set in the `value` parameter is the final - * value of the transformation, modified only by the constrain. */ - T_INPUT_IS_VALUES_FINAL = 1 << 18, - - /** To specify if we save back settings at the end. */ - T_MODAL = 1 << 19, - - /** No re-topology (projection). */ - T_NO_PROJECT = 1 << 20, - - T_RELEASE_CONFIRM = 1 << 21, - - /** Alternative transformation. used to add offset to tracking markers. */ - T_ALT_TRANSFORM = 1 << 22, - - /** #TransInfo.center has been set, don't change it. */ - T_OVERRIDE_CENTER = 1 << 23, - - T_MODAL_CURSOR_SET = 1 << 24, - - T_CLNOR_REBUILD = 1 << 25, - - /** Merges unselected into selected after transforming (runs after transforming). */ - T_AUTOMERGE = 1 << 26, - /** Runs auto-merge & splits. */ - T_AUTOSPLIT = 1 << 27, -}; - -/** #TransInfo.modifiers */ -enum { - MOD_CONSTRAINT_SELECT = 1 << 0, - MOD_PRECISION = 1 << 1, - MOD_SNAP = 1 << 2, - MOD_SNAP_INVERT = 1 << 3, - MOD_CONSTRAINT_PLANE = 1 << 4, -}; - -/* use node center for transform instead of upper-left corner. - * disabled since it makes absolute snapping not work so nicely - */ -// #define USE_NODE_CENTER - -/** #TransInfo.helpline */ -enum { - HLP_NONE = 0, - HLP_SPRING = 1, - HLP_ANGLE = 2, - HLP_HARROW = 3, - HLP_VARROW = 4, - HLP_CARROW = 5, - HLP_TRACKBALL = 6, -}; - -/** #TransCon.mode, #TransInfo.con.mode */ -enum { - /** When set constraints are in use. */ - CON_APPLY = 1 << 0, - /** These are only used for modal execution. */ - CON_AXIS0 = 1 << 1, - CON_AXIS1 = 1 << 2, - CON_AXIS2 = 1 << 3, - CON_SELECT = 1 << 4, - /** Does not reorient vector to face viewport when on. */ - CON_NOFLIP = 1 << 5, - CON_USER = 1 << 6, -}; - -/** #TransSnap.status */ -enum { - SNAP_FORCED = 1 << 0, - TARGET_INIT = 1 << 1, - POINT_INIT = 1 << 2, - MULTI_POINTS = 1 << 3, -}; - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Keymap Modal Items - * - * \note these values are saved in key-map files, do not change then but just add new ones. - * \{ */ - -enum { - TFM_MODAL_CANCEL = 1, - TFM_MODAL_CONFIRM = 2, - TFM_MODAL_TRANSLATE = 3, - TFM_MODAL_ROTATE = 4, - TFM_MODAL_RESIZE = 5, - TFM_MODAL_SNAP_INV_ON = 6, - TFM_MODAL_SNAP_INV_OFF = 7, - TFM_MODAL_SNAP_TOGGLE = 8, - TFM_MODAL_AXIS_X = 9, - TFM_MODAL_AXIS_Y = 10, - TFM_MODAL_AXIS_Z = 11, - TFM_MODAL_PLANE_X = 12, - TFM_MODAL_PLANE_Y = 13, - TFM_MODAL_PLANE_Z = 14, - TFM_MODAL_CONS_OFF = 15, - TFM_MODAL_ADD_SNAP = 16, - TFM_MODAL_REMOVE_SNAP = 17, - - /* 18 and 19 used by number-input, defined in `ED_numinput.h`. */ - // NUM_MODAL_INCREMENT_UP = 18, - // NUM_MODAL_INCREMENT_DOWN = 19, - - TFM_MODAL_PROPSIZE_UP = 20, - TFM_MODAL_PROPSIZE_DOWN = 21, - TFM_MODAL_AUTOIK_LEN_INC = 22, - TFM_MODAL_AUTOIK_LEN_DEC = 23, - - TFM_MODAL_EDGESLIDE_UP = 24, - TFM_MODAL_EDGESLIDE_DOWN = 25, - - /** For analog input, like track-pad. */ - TFM_MODAL_PROPSIZE = 26, - /** Node editor insert offset (also called auto-offset) direction toggle. */ - TFM_MODAL_INSERTOFS_TOGGLE_DIR = 27, - - TFM_MODAL_AUTOCONSTRAINT = 28, - TFM_MODAL_AUTOCONSTRAINTPLANE = 29, -}; - -/** \} */ - /* -------------------------------------------------------------------- */ /** \name Public Transform API * \{ */ @@ -666,9 +722,6 @@ typedef enum { void initMouseInput( TransInfo *t, MouseInput *mi, const float center[2], const int mval[2], const bool precision); void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode); -eRedrawFlag handleMouseInput(struct TransInfo *t, - struct MouseInput *mi, - const struct wmEvent *event); void applyMouseInput(struct TransInfo *t, struct MouseInput *mi, const int mval[2], @@ -684,10 +737,6 @@ void setInputPostFct(MouseInput *mi, void (*post)(struct TransInfo *t, float val /** \name Generics * \{ */ -void initTransDataContainers_FromObjectData(TransInfo *t, - struct Object *obact, - struct Object **objects, - uint objects_len); void initTransInfo(struct bContext *C, TransInfo *t, struct wmOperator *op, @@ -709,7 +758,6 @@ void recalcData(TransInfo *t); void calculateCenter2D(TransInfo *t); void calculateCenterLocal(TransInfo *t, const float center_global[3]); -const TransCenterData *transformCenter_from_type(TransInfo *t, int around); void calculateCenter(TransInfo *t); /* API functions for getting center points */ @@ -724,6 +772,8 @@ void calculatePropRatio(TransInfo *t); void transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot); +struct Object *transform_object_deform_pose_armature_get(const TransInfo *t, struct Object *ob); + void freeCustomNormalArray(TransInfo *t, TransDataContainer *tc, TransCustomData *custom_data); /* TODO. transform_query.c */ diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c index 4b7b16c2986..93d5d41e121 100644 --- a/source/blender/editors/transform/transform_constraints.c +++ b/source/blender/editors/transform/transform_constraints.c @@ -572,7 +572,7 @@ static void constraints_rotation_impl(TransInfo *t, break; } /* don't flip axis if asked to or if num input */ - if (r_angle && (mode & CON_NOFLIP) == 0 && hasNumInput(&t->num) == 0) { + if (r_angle && !((mode & CON_NOFLIP) || hasNumInput(&t->num) || (t->flag & T_INPUT_IS_VALUES_FINAL))) { float view_vector[3]; view_vector_calc(t, t->center_global, view_vector); if (dot_v3v3(r_vec, view_vector) > 0.0f) { @@ -914,7 +914,7 @@ static void drawObjectConstraint(TransInfo *t) mul_m3_m3m3(tmp_axismtx, tc->mat3_unit, td->axismtx); axismtx = tmp_axismtx; } - else if (t->flag & T_POSE) { + else if (t->options & CTX_POSE_BONE) { mul_v3_m4v3(co, tc->mat, td->center); axismtx = td->axismtx; } diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c index 96a9690d891..e2ec857b670 100644 --- a/source/blender/editors/transform/transform_convert.c +++ b/source/blender/editors/transform/transform_convert.c @@ -23,6 +23,7 @@ #include "DNA_anim_types.h" #include "DNA_constraint_types.h" +#include "DNA_mesh_types.h" #include "MEM_guardedalloc.h" @@ -72,12 +73,20 @@ bool transform_mode_use_local_origins(const TransInfo *t) */ void transform_around_single_fallback_ex(TransInfo *t, int data_len_all) { - if ((ELEM(t->around, V3D_AROUND_CENTER_BOUNDS, V3D_AROUND_CENTER_MEDIAN, V3D_AROUND_ACTIVE)) && - transform_mode_use_local_origins(t)) { - if (data_len_all == 1) { - t->around = V3D_AROUND_LOCAL_ORIGINS; - } + if (data_len_all != 1) { + return; } + if (!ELEM(t->around, V3D_AROUND_CENTER_BOUNDS, V3D_AROUND_CENTER_MEDIAN, V3D_AROUND_ACTIVE)) { + return; + } + if (!transform_mode_use_local_origins(t)) { + return; + } + if (t->flag | T_OVERRIDE_CENTER) { + return; + } + + t->around = V3D_AROUND_LOCAL_ORIGINS; } void transform_around_single_fallback(TransInfo *t) @@ -892,7 +901,6 @@ void special_aftertrans_update(bContext *C, TransInfo *t) special_aftertrans_update__node(C, t); break; case TC_OBJECT: - case TC_OBJECT_TEXSPACE: special_aftertrans_update__object(C, t); break; case TC_SCULPT: @@ -912,6 +920,8 @@ void special_aftertrans_update(bContext *C, TransInfo *t) case TC_LATTICE_VERTS: case TC_MBALL_VERTS: case TC_MESH_UV: + case TC_MESH_SKIN: + case TC_OBJECT_TEXSPACE: case TC_PAINT_CURVE_VERTS: case TC_PARTICLE_VERTS: case TC_NONE: @@ -928,10 +938,10 @@ int special_transform_moving(TransInfo *t) if (t->spacetype == SPACE_GRAPH) { return G_TRANSFORM_FCURVES; } - if ((t->flag & T_EDIT) || (t->flag & T_POSE)) { + if ((t->flag & T_EDIT) || (t->options & CTX_POSE_BONE)) { return G_TRANSFORM_EDIT; } - if (t->flag & (T_OBJECT | T_TEXTURE)) { + if (t->options & (CTX_OBJECT | CTX_TEXTURE_SPACE)) { return G_TRANSFORM_OBJ; } @@ -973,304 +983,43 @@ static int countAndCleanTransDataContainer(TransInfo *t) return t->data_len_all; } -void createTransData(bContext *C, TransInfo *t) +static void init_proportional_edit(TransInfo *t) { - Scene *scene = t->scene; - ViewLayer *view_layer = t->view_layer; - Object *ob = OBACT(view_layer); - - t->data_len_all = -1; - - eTransConvertType convert_type = TC_NONE; - - /* if tests must match recalcData for correct updates */ - if (t->options & CTX_CURSOR) { - t->flag |= T_CURSOR; - - if (t->spacetype == SPACE_IMAGE) { - convert_type = TC_CURSOR_IMAGE; - } - else { - convert_type = TC_CURSOR_VIEW3D; - } - - /* Since we're transforming the cursor, initialize this value before it's modified. - * Needed for #snap_grid_apply to access the cursor location. */ - transformCenter_from_type(t, V3D_AROUND_CURSOR); - } - else if (!(t->options & CTX_PAINT_CURVE) && (t->spacetype == SPACE_VIEW3D) && ob && - (ob->mode == OB_MODE_SCULPT) && ob->sculpt) { - convert_type = TC_SCULPT; - } - else if (t->options & CTX_TEXTURE) { - t->flag |= T_TEXTURE; - convert_type = TC_OBJECT_TEXSPACE; - } - else if (t->options & CTX_EDGE) { - t->flag |= T_EDIT; - convert_type = TC_MESH_EDGES; - /* Multi object editing. */ - initTransDataContainers_FromObjectData(t, ob, NULL, 0); - } - else if (t->options & CTX_GPENCIL_STROKES) { - t->options |= CTX_GPENCIL_STROKES; - t->flag |= T_POINTS | T_EDIT; - convert_type = TC_GPENCIL; - initTransDataContainers_FromObjectData(t, ob, NULL, 0); - } - else if (t->spacetype == SPACE_IMAGE) { - t->flag |= T_POINTS | T_2D_EDIT; - if (t->options & CTX_MASK) { - convert_type = TC_MASKING_DATA; - } - else if (t->options & CTX_PAINT_CURVE) { - if (!ELEM(t->mode, TFM_SHEAR, TFM_SHRINKFATTEN)) { - convert_type = TC_PAINT_CURVE_VERTS; - } - } - else if (t->obedit_type == OB_MESH) { - t->flag |= T_EDIT; - convert_type = TC_MESH_UV; - initTransDataContainers_FromObjectData(t, ob, NULL, 0); - } - } - else if (t->spacetype == SPACE_ACTION) { - t->flag |= T_POINTS | T_2D_EDIT; - t->obedit_type = -1; - convert_type = TC_ACTION_DATA; - } - else if (t->spacetype == SPACE_NLA) { - t->flag |= T_POINTS | T_2D_EDIT; - t->obedit_type = -1; - convert_type = TC_NLA_DATA; - } - else if (t->spacetype == SPACE_SEQ) { - t->flag |= T_POINTS | T_2D_EDIT; - t->obedit_type = -1; - t->num.flag |= NUM_NO_FRACTION; /* sequencer has no use for floating point transform. */ - convert_type = TC_SEQ_DATA; - } - else if (t->spacetype == SPACE_GRAPH) { - t->flag |= T_POINTS | T_2D_EDIT; - t->obedit_type = -1; - convert_type = TC_GRAPH_EDIT_DATA; - } - else if (t->spacetype == SPACE_NODE) { - t->flag |= T_POINTS | T_2D_EDIT; - t->obedit_type = -1; - convert_type = TC_NODE_DATA; - } - else if (t->spacetype == SPACE_CLIP) { - t->flag |= T_POINTS | T_2D_EDIT; - t->obedit_type = -1; - - if (t->options & CTX_MOVIECLIP) { - convert_type = TC_TRACKING_DATA; - } - else if (t->options & CTX_MASK) { - convert_type = TC_MASKING_DATA; - } - } - else if (t->obedit_type != -1) { - t->flag |= T_EDIT | T_POINTS; - - /* Multi object editing. */ - initTransDataContainers_FromObjectData(t, ob, NULL, 0); - - if (t->obedit_type == OB_MESH) { - if (t->mode == TFM_SKIN_RESIZE) { - convert_type = TC_MESH_SKIN; - } - else { - convert_type = TC_MESH_VERTS; - } - } - else if (ELEM(t->obedit_type, OB_CURVE, OB_SURF)) { - convert_type = TC_CURVE_VERTS; - } - else if (t->obedit_type == OB_LATTICE) { - convert_type = TC_LATTICE_VERTS; - } - else if (t->obedit_type == OB_MBALL) { - convert_type = TC_MBALL_VERTS; - } - else if (t->obedit_type == OB_ARMATURE) { - t->flag &= ~T_PROP_EDIT; - convert_type = TC_ARMATURE_VERTS; - } - } - else if (ob && (ob->mode & OB_MODE_POSE)) { - /* XXX this is currently limited to active armature only... */ - - /* XXX active-layer checking isn't done - * as that should probably be checked through context instead. */ - - /* Multi object editing. */ - initTransDataContainers_FromObjectData(t, ob, NULL, 0); - convert_type = TC_POSE; - } - else if (ob && (ob->mode & OB_MODE_ALL_WEIGHT_PAINT) && !(t->options & CTX_PAINT_CURVE)) { - /* Important that ob_armature can be set even when its not selected T23412. - * Lines below just check is also visible. */ - Object *ob_armature = BKE_modifiers_is_deformed_by_armature(ob); - if (ob_armature && ob_armature->mode & OB_MODE_POSE) { - Base *base_arm = BKE_view_layer_base_find(t->view_layer, ob_armature); - if (base_arm) { - View3D *v3d = t->view; - if (BASE_VISIBLE(v3d, base_arm)) { - Object *objects[1]; - objects[0] = ob_armature; - uint objects_len = 1; - initTransDataContainers_FromObjectData(t, ob_armature, objects, objects_len); - convert_type = TC_POSE; - } - } - } - } - else if (ob && (ob->mode & OB_MODE_PARTICLE_EDIT) && - PE_start_edit(PE_get_current(t->depsgraph, scene, ob))) { - t->flag |= T_POINTS; - convert_type = TC_PARTICLE_VERTS; - } - else if (ob && (ob->mode & OB_MODE_ALL_PAINT)) { - if ((t->options & CTX_PAINT_CURVE) && !ELEM(t->mode, TFM_SHEAR, TFM_SHRINKFATTEN)) { - t->flag |= T_POINTS | T_2D_EDIT; - convert_type = TC_PAINT_CURVE_VERTS; - } - } - else if ((ob) && (ELEM(ob->mode, - OB_MODE_PAINT_GPENCIL, - OB_MODE_SCULPT_GPENCIL, - OB_MODE_WEIGHT_GPENCIL, - OB_MODE_VERTEX_GPENCIL))) { - /* In grease pencil all transformations must be canceled if not Object or Edit. */ - } - else { - /* Needed for correct Object.obmat after duplication, see: T62135. */ - BKE_scene_graph_evaluated_ensure(t->depsgraph, CTX_data_main(t->context)); - - if ((scene->toolsettings->transform_flag & SCE_XFORM_DATA_ORIGIN) != 0) { - t->options |= CTX_OBMODE_XFORM_OBDATA; - } - if ((scene->toolsettings->transform_flag & SCE_XFORM_SKIP_CHILDREN) != 0) { - t->options |= CTX_OBMODE_XFORM_SKIP_CHILDREN; - } - - t->flag |= T_OBJECT; - convert_type = TC_OBJECT; - } - - t->data_type = convert_type; - bool init_prop_edit = (t->flag & T_PROP_EDIT) != 0; - + eTConvertType convert_type = t->data_type; switch (convert_type) { case TC_ACTION_DATA: - createTransActionData(C, t); - break; - case TC_POSE: - createTransPose(t); - /* Disable PET, its not usable in pose mode yet T32444. */ - init_prop_edit = false; - break; - case TC_ARMATURE_VERTS: - createTransArmatureVerts(t); - break; - case TC_CURSOR_IMAGE: - createTransCursor_image(t); - init_prop_edit = false; - break; - case TC_CURSOR_VIEW3D: - createTransCursor_view3d(t); - init_prop_edit = false; - break; case TC_CURVE_VERTS: - createTransCurveVerts(t); - break; case TC_GRAPH_EDIT_DATA: - createTransGraphEditData(C, t); - break; case TC_GPENCIL: - createTransGPencil(C, t); - break; case TC_LATTICE_VERTS: - createTransLatticeVerts(t); - break; case TC_MASKING_DATA: - createTransMaskingData(C, t); - break; case TC_MBALL_VERTS: - createTransMBallVerts(t); - break; case TC_MESH_VERTS: - createTransEditVerts(t); - break; case TC_MESH_EDGES: - createTransEdge(t); - break; case TC_MESH_SKIN: - createTransMeshSkin(t); - break; case TC_MESH_UV: - createTransUVs(C, t); - break; - case TC_NLA_DATA: - createTransNlaData(C, t); - init_prop_edit = false; - break; case TC_NODE_DATA: - createTransNodeData(t); - break; case TC_OBJECT: - createTransObject(C, t); - /* Check if we're transforming the camera from the camera */ - if ((t->spacetype == SPACE_VIEW3D) && (t->region->regiontype == RGN_TYPE_WINDOW)) { - View3D *v3d = t->view; - RegionView3D *rv3d = t->region->regiondata; - if ((rv3d->persp == RV3D_CAMOB) && v3d->camera) { - /* we could have a flag to easily check an object is being transformed */ - if (v3d->camera->id.tag & LIB_TAG_DOIT) { - t->flag |= T_CAMERA; - } - } - else if (v3d->ob_center && v3d->ob_center->id.tag & LIB_TAG_DOIT) { - t->flag |= T_CAMERA; - } - } - break; - case TC_OBJECT_TEXSPACE: - createTransTexspace(t); - init_prop_edit = false; - break; - case TC_PAINT_CURVE_VERTS: - createTransPaintCurveVerts(C, t); - init_prop_edit = false; - break; case TC_PARTICLE_VERTS: - createTransParticleVerts(C, t); break; + case TC_POSE: /* Disable PET, its not usable in pose mode yet T32444. */ + case TC_ARMATURE_VERTS: + case TC_CURSOR_IMAGE: + case TC_CURSOR_VIEW3D: + case TC_NLA_DATA: + case TC_OBJECT_TEXSPACE: + case TC_PAINT_CURVE_VERTS: case TC_SCULPT: - createTransSculpt(C, t); - init_prop_edit = false; - break; case TC_SEQ_DATA: - createTransSeqData(t); - init_prop_edit = false; - break; case TC_TRACKING_DATA: - createTransTrackingData(C, t); - init_prop_edit = false; - break; case TC_NONE: default: - printf("edit type not implemented!\n"); - BLI_assert(t->data_len_all == -1); - t->data_len_all = 0; + t->options |= CTX_NO_PET; + t->flag &= ~T_PROP_EDIT_ALL; return; } - countAndCleanTransDataContainer(t); - - if (t->data_len_all && init_prop_edit) { + if (t->data_len_all && (t->flag & T_PROP_EDIT)) { if (convert_type == TC_OBJECT) { /* Selected objects are already first, no need to presort. */ } @@ -1301,17 +1050,417 @@ void createTransData(bContext *C, TransInfo *t) sort_trans_data_dist(t); } - else { - if (ELEM(t->obedit_type, OB_CURVE)) { - /* Needed because bezier handles can be partially selected - * and are still added into transform data. */ - sort_trans_data_selected_first(t); + else if (ELEM(t->obedit_type, OB_CURVE)) { + /* Needed because bezier handles can be partially selected + * and are still added into transform data. */ + sort_trans_data_selected_first(t); + } +} + +/* For multi object editing. */ +static void init_TransDataContainers(TransInfo *t, + Object *obact, + Object **objects, + uint objects_len) +{ + switch (t->data_type) { + case TC_POSE: + case TC_ARMATURE_VERTS: + case TC_CURVE_VERTS: + case TC_GPENCIL: + case TC_LATTICE_VERTS: + case TC_MBALL_VERTS: + case TC_MESH_VERTS: + case TC_MESH_EDGES: + case TC_MESH_SKIN: + case TC_MESH_UV: + break; + case TC_ACTION_DATA: + case TC_GRAPH_EDIT_DATA: + case TC_CURSOR_IMAGE: + case TC_CURSOR_VIEW3D: + case TC_MASKING_DATA: + case TC_NLA_DATA: + case TC_NODE_DATA: + case TC_OBJECT: + case TC_OBJECT_TEXSPACE: + case TC_PAINT_CURVE_VERTS: + case TC_PARTICLE_VERTS: + case TC_SCULPT: + case TC_SEQ_DATA: + case TC_TRACKING_DATA: + case TC_NONE: + default: + /* Does not support Multi object editing. */ + return; + } + + const eObjectMode object_mode = obact ? obact->mode : OB_MODE_OBJECT; + const short object_type = obact ? obact->type : -1; + + if ((object_mode & OB_MODE_EDIT) || (t->data_type == TC_GPENCIL) || + ((object_mode & OB_MODE_POSE) && (object_type == OB_ARMATURE))) { + if (t->data_container) { + MEM_freeN(t->data_container); } - if (!init_prop_edit) { - t->flag &= ~T_PROP_EDIT_ALL; + bool free_objects = false; + if (objects == NULL) { + objects = BKE_view_layer_array_from_objects_in_mode( + t->view_layer, + (t->spacetype == SPACE_VIEW3D) ? t->view : NULL, + &objects_len, + { + .object_mode = object_mode, + .no_dup_data = true, + }); + free_objects = true; + } + + t->data_container = MEM_callocN(sizeof(*t->data_container) * objects_len, __func__); + t->data_container_len = objects_len; + + for (int i = 0; i < objects_len; i++) { + TransDataContainer *tc = &t->data_container[i]; + if (((t->flag & T_NO_MIRROR) == 0) && ((t->options & CTX_NO_MIRROR) == 0) && + (objects[i]->type == OB_MESH)) { + tc->use_mirror_axis_x = (((Mesh *)objects[i]->data)->symmetry & ME_SYMMETRY_X) != 0; + tc->use_mirror_axis_y = (((Mesh *)objects[i]->data)->symmetry & ME_SYMMETRY_Y) != 0; + tc->use_mirror_axis_z = (((Mesh *)objects[i]->data)->symmetry & ME_SYMMETRY_Z) != 0; + } + + if (object_mode & OB_MODE_EDIT) { + tc->obedit = objects[i]; + /* Check needed for UV's */ + if ((t->flag & T_2D_EDIT) == 0) { + tc->use_local_mat = true; + } + } + else if (object_mode & OB_MODE_POSE) { + tc->poseobj = objects[i]; + tc->use_local_mat = true; + } + else if (t->data_type == TC_GPENCIL) { + tc->use_local_mat = true; + } + + if (tc->use_local_mat) { + BLI_assert((t->flag & T_2D_EDIT) == 0); + copy_m4_m4(tc->mat, objects[i]->obmat); + copy_m3_m4(tc->mat3, tc->mat); + /* for non-invertible scale matrices, invert_m4_m4_fallback() + * can still provide a valid pivot */ + invert_m4_m4_fallback(tc->imat, tc->mat); + invert_m3_m3(tc->imat3, tc->mat3); + normalize_m3_m3(tc->mat3_unit, tc->mat3); + } + /* Otherwise leave as zero. */ + } + + if (free_objects) { + MEM_freeN(objects); } } +} + +static eTFlag flags_from_data_type(eTConvertType data_type) +{ + switch (data_type) { + case TC_ACTION_DATA: + case TC_GRAPH_EDIT_DATA: + case TC_MASKING_DATA: + case TC_NLA_DATA: + case TC_NODE_DATA: + case TC_PAINT_CURVE_VERTS: + case TC_SEQ_DATA: + case TC_TRACKING_DATA: + return T_POINTS | T_2D_EDIT; + case TC_ARMATURE_VERTS: + case TC_CURVE_VERTS: + case TC_GPENCIL: + case TC_LATTICE_VERTS: + case TC_MBALL_VERTS: + case TC_MESH_VERTS: + case TC_MESH_SKIN: + return T_EDIT | T_POINTS; + case TC_MESH_EDGES: + return T_EDIT; + case TC_MESH_UV: + return T_EDIT | T_POINTS | T_2D_EDIT; + case TC_PARTICLE_VERTS: + return T_POINTS; + case TC_POSE: + case TC_CURSOR_IMAGE: + case TC_CURSOR_VIEW3D: + case TC_OBJECT: + case TC_OBJECT_TEXSPACE: + case TC_SCULPT: + case TC_NONE: + default: + break; + } + return 0; +} + +static eTConvertType convert_type_get(const TransInfo *t, Object **r_obj_armature) +{ + ViewLayer *view_layer = t->view_layer; + Object *ob = OBACT(view_layer); + eTConvertType convert_type = TC_NONE; + + /* if tests must match recalcData for correct updates */ + if (t->options & CTX_CURSOR) { + if (t->spacetype == SPACE_IMAGE) { + convert_type = TC_CURSOR_IMAGE; + } + else { + convert_type = TC_CURSOR_VIEW3D; + } + } + else if (!(t->options & CTX_PAINT_CURVE) && (t->spacetype == SPACE_VIEW3D) && ob && + (ob->mode == OB_MODE_SCULPT) && ob->sculpt) { + convert_type = TC_SCULPT; + } + else if (t->options & CTX_TEXTURE_SPACE) { + convert_type = TC_OBJECT_TEXSPACE; + } + else if (t->options & CTX_EDGE_DATA) { + convert_type = TC_MESH_EDGES; + } + else if (t->options & CTX_GPENCIL_STROKES) { + convert_type = TC_GPENCIL; + } + else if (t->spacetype == SPACE_IMAGE) { + if (t->options & CTX_MASK) { + convert_type = TC_MASKING_DATA; + } + else if (t->options & CTX_PAINT_CURVE) { + if (!ELEM(t->mode, TFM_SHEAR, TFM_SHRINKFATTEN)) { + convert_type = TC_PAINT_CURVE_VERTS; + } + } + else if (t->obedit_type == OB_MESH) { + convert_type = TC_MESH_UV; + } + } + else if (t->spacetype == SPACE_ACTION) { + convert_type = TC_ACTION_DATA; + } + else if (t->spacetype == SPACE_NLA) { + convert_type = TC_NLA_DATA; + } + else if (t->spacetype == SPACE_SEQ) { + convert_type = TC_SEQ_DATA; + } + else if (t->spacetype == SPACE_GRAPH) { + convert_type = TC_GRAPH_EDIT_DATA; + } + else if (t->spacetype == SPACE_NODE) { + convert_type = TC_NODE_DATA; + } + else if (t->spacetype == SPACE_CLIP) { + if (t->options & CTX_MOVIECLIP) { + convert_type = TC_TRACKING_DATA; + } + else if (t->options & CTX_MASK) { + convert_type = TC_MASKING_DATA; + } + } + else if (t->obedit_type != -1) { + if (t->obedit_type == OB_MESH) { + if (t->mode == TFM_SKIN_RESIZE) { + convert_type = TC_MESH_SKIN; + } + else { + convert_type = TC_MESH_VERTS; + } + } + else if (ELEM(t->obedit_type, OB_CURVE, OB_SURF)) { + convert_type = TC_CURVE_VERTS; + } + else if (t->obedit_type == OB_LATTICE) { + convert_type = TC_LATTICE_VERTS; + } + else if (t->obedit_type == OB_MBALL) { + convert_type = TC_MBALL_VERTS; + } + else if (t->obedit_type == OB_ARMATURE) { + convert_type = TC_ARMATURE_VERTS; + } + } + else if (ob && (ob->mode & OB_MODE_POSE)) { + convert_type = TC_POSE; + } + else if (ob && (ob->mode & OB_MODE_ALL_WEIGHT_PAINT) && !(t->options & CTX_PAINT_CURVE)) { + Object *ob_armature = transform_object_deform_pose_armature_get(t, ob); + if (ob_armature) { + *r_obj_armature = ob_armature; + convert_type = TC_POSE; + } + } + else if (ob && (ob->mode & OB_MODE_PARTICLE_EDIT) && + PE_start_edit(PE_get_current(t->depsgraph, t->scene, ob))) { + convert_type = TC_PARTICLE_VERTS; + } + else if (ob && (ob->mode & OB_MODE_ALL_PAINT)) { + if ((t->options & CTX_PAINT_CURVE) && !ELEM(t->mode, TFM_SHEAR, TFM_SHRINKFATTEN)) { + convert_type = TC_PAINT_CURVE_VERTS; + } + } + else if ((ob) && (ELEM(ob->mode, + OB_MODE_PAINT_GPENCIL, + OB_MODE_SCULPT_GPENCIL, + OB_MODE_WEIGHT_GPENCIL, + OB_MODE_VERTEX_GPENCIL))) { + /* In grease pencil all transformations must be canceled if not Object or Edit. */ + } + else { + convert_type = TC_OBJECT; + } + + return convert_type; +} + +void createTransData(bContext *C, TransInfo *t) +{ + t->data_len_all = -1; + + Object *ob_armature = NULL; + t->data_type = convert_type_get(t, &ob_armature); + t->flag |= flags_from_data_type(t->data_type); + + if (ob_armature) { + init_TransDataContainers(t, ob_armature, &ob_armature, 1); + } + else { + ViewLayer *view_layer = t->view_layer; + Object *ob = OBACT(view_layer); + init_TransDataContainers(t, ob, NULL, 0); + } + + switch (t->data_type) { + case TC_ACTION_DATA: + t->obedit_type = -1; + createTransActionData(C, t); + break; + case TC_POSE: + t->options |= CTX_POSE_BONE; + + /* XXX active-layer checking isn't done + * as that should probably be checked through context instead. */ + createTransPose(t); + break; + case TC_ARMATURE_VERTS: + createTransArmatureVerts(t); + break; + case TC_CURSOR_IMAGE: + createTransCursor_image(t); + break; + case TC_CURSOR_VIEW3D: + createTransCursor_view3d(t); + break; + case TC_CURVE_VERTS: + createTransCurveVerts(t); + break; + case TC_GRAPH_EDIT_DATA: + t->obedit_type = -1; + createTransGraphEditData(C, t); + break; + case TC_GPENCIL: + createTransGPencil(C, t); + break; + case TC_LATTICE_VERTS: + createTransLatticeVerts(t); + break; + case TC_MASKING_DATA: + if (t->spacetype == SPACE_CLIP) { + t->obedit_type = -1; + } + createTransMaskingData(C, t); + break; + case TC_MBALL_VERTS: + createTransMBallVerts(t); + break; + case TC_MESH_VERTS: + createTransEditVerts(t); + break; + case TC_MESH_EDGES: + createTransEdge(t); + break; + case TC_MESH_SKIN: + createTransMeshSkin(t); + break; + case TC_MESH_UV: + createTransUVs(C, t); + break; + case TC_NLA_DATA: + t->obedit_type = -1; + createTransNlaData(C, t); + break; + case TC_NODE_DATA: + t->obedit_type = -1; + createTransNodeData(t); + break; + case TC_OBJECT: + t->options |= CTX_OBJECT; + + /* Needed for correct Object.obmat after duplication, see: T62135. */ + BKE_scene_graph_evaluated_ensure(t->depsgraph, CTX_data_main(t->context)); + + if ((t->settings->transform_flag & SCE_XFORM_DATA_ORIGIN) != 0) { + t->options |= CTX_OBMODE_XFORM_OBDATA; + } + if ((t->settings->transform_flag & SCE_XFORM_SKIP_CHILDREN) != 0) { + t->options |= CTX_OBMODE_XFORM_SKIP_CHILDREN; + } + createTransObject(C, t); + /* Check if we're transforming the camera from the camera */ + if ((t->spacetype == SPACE_VIEW3D) && (t->region->regiontype == RGN_TYPE_WINDOW)) { + View3D *v3d = t->view; + RegionView3D *rv3d = t->region->regiondata; + if ((rv3d->persp == RV3D_CAMOB) && v3d->camera) { + /* we could have a flag to easily check an object is being transformed */ + if (v3d->camera->id.tag & LIB_TAG_DOIT) { + t->options |= CTX_CAMERA; + } + } + else if (v3d->ob_center && v3d->ob_center->id.tag & LIB_TAG_DOIT) { + t->options |= CTX_CAMERA; + } + } + break; + case TC_OBJECT_TEXSPACE: + createTransTexspace(t); + break; + case TC_PAINT_CURVE_VERTS: + createTransPaintCurveVerts(C, t); + break; + case TC_PARTICLE_VERTS: + createTransParticleVerts(t); + break; + case TC_SCULPT: + createTransSculpt(C, t); + break; + case TC_SEQ_DATA: + t->obedit_type = -1; + t->num.flag |= NUM_NO_FRACTION; /* sequencer has no use for floating point transform. */ + createTransSeqData(t); + break; + case TC_TRACKING_DATA: + t->obedit_type = -1; + createTransTrackingData(C, t); + break; + case TC_NONE: + default: + printf("edit type not implemented!\n"); + BLI_assert(t->data_len_all == -1); + t->data_len_all = 0; + return; + } + + countAndCleanTransDataContainer(t); + + init_proportional_edit(t); BLI_assert((!(t->flag & T_EDIT)) == (!(t->obedit_type != -1))); } @@ -1557,9 +1706,11 @@ void recalcData(TransInfo *t) flushTransNodes(t); break; case TC_OBJECT: - case TC_OBJECT_TEXSPACE: recalcData_objects(t); break; + case TC_OBJECT_TEXSPACE: + recalcData_texspace(t); + break; case TC_PAINT_CURVE_VERTS: flushTransPaintCurve(t); break; diff --git a/source/blender/editors/transform/transform_convert.h b/source/blender/editors/transform/transform_convert.h index a1c7a6a39a6..36a51d57f64 100644 --- a/source/blender/editors/transform/transform_convert.h +++ b/source/blender/editors/transform/transform_convert.h @@ -24,9 +24,9 @@ #pragma once -struct BezTriple; struct BMEditMesh; struct BMesh; +struct BezTriple; struct FCurve; struct ListBase; struct Object; @@ -52,34 +52,6 @@ int transform_convert_sequencer_get_snap_bound(TransInfo *t); void transform_convert_sequencer_channel_clamp(TransInfo *t); /********************* intern **********************/ -typedef enum eTransConvertType { - TC_NONE = 0, - TC_ACTION_DATA, - TC_POSE, - TC_ARMATURE_VERTS, - TC_CURSOR_IMAGE, - TC_CURSOR_VIEW3D, - TC_CURVE_VERTS, - TC_GRAPH_EDIT_DATA, - TC_GPENCIL, - TC_LATTICE_VERTS, - TC_MASKING_DATA, - TC_MBALL_VERTS, - TC_MESH_VERTS, - TC_MESH_EDGES, - TC_MESH_SKIN, - TC_MESH_UV, - TC_NLA_DATA, - TC_NODE_DATA, - TC_OBJECT, - TC_OBJECT_TEXSPACE, - TC_PAINT_CURVE_VERTS, - TC_PARTICLE_VERTS, - TC_SCULPT, - TC_SEQ_DATA, - TC_TRACKING_DATA, -} eTransConvertType; - /* transform_convert.c */ bool transform_mode_use_local_origins(const TransInfo *t); void transform_around_single_fallback_ex(TransInfo *t, int data_len_all); @@ -215,16 +187,19 @@ void special_aftertrans_update__node(bContext *C, TransInfo *t); /* transform_convert_object.c */ void createTransObject(bContext *C, TransInfo *t); -void createTransTexspace(TransInfo *t); void recalcData_objects(TransInfo *t); void special_aftertrans_update__object(bContext *C, TransInfo *t); +/* transform_convert_object_texspace.c */ +void createTransTexspace(TransInfo *t); +void recalcData_texspace(TransInfo *t); + /* transform_convert_paintcurve.c */ void createTransPaintCurveVerts(bContext *C, TransInfo *t); void flushTransPaintCurve(TransInfo *t); /* transform_convert_particle.c */ -void createTransParticleVerts(bContext *C, TransInfo *t); +void createTransParticleVerts(TransInfo *t); void recalcData_particles(TransInfo *t); /* transform_convert_sculpt.c */ diff --git a/source/blender/editors/transform/transform_convert_action.c b/source/blender/editors/transform/transform_convert_action.c index da68f9c13de..8204264e105 100644 --- a/source/blender/editors/transform/transform_convert_action.c +++ b/source/blender/editors/transform/transform_convert_action.c @@ -55,7 +55,6 @@ typedef struct tGPFtransdata { /* -------------------------------------------------------------------- */ /** \name Action Transform Creation - * * \{ */ /* fully select selected beztriples, but only include if it's on the right side of cfra */ @@ -553,7 +552,6 @@ void createTransActionData(bContext *C, TransInfo *t) /* -------------------------------------------------------------------- */ /** \name Action Transform Flush - * * \{ */ /* This function helps flush transdata written to tempdata into the gp-frames */ diff --git a/source/blender/editors/transform/transform_convert_armature.c b/source/blender/editors/transform/transform_convert_armature.c index 7994d97581f..a4edf51ffee 100644 --- a/source/blender/editors/transform/transform_convert_armature.c +++ b/source/blender/editors/transform/transform_convert_armature.c @@ -672,7 +672,7 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr } } - /* for axismat we use bone's own transform */ + /* For `axismtx` we use bone's own transform. */ copy_m3_m4(pmat, pchan->pose_mat); mul_m3_m3m3(td->axismtx, omat, pmat); normalize_m3(td->axismtx); @@ -870,8 +870,6 @@ void createTransPose(TransInfo *t) t->mode = TFM_RESIZE; } } - - t->flag |= T_POSE; } void createTransArmatureVerts(TransInfo *t) @@ -1343,7 +1341,7 @@ static void pose_transform_mirror_update(TransInfo *t, TransDataContainer *tc, O } BKE_pchan_apply_mat4(pchan, pchan_mtx_final, false); - /* Set flag to let autokeyframe know to keyframe the mirrred bone. */ + /* Set flag to let auto key-frame know to key-frame the mirrored bone. */ pchan->bone->flag |= BONE_TRANSFORM_MIRROR; /* In this case we can do target-less IK grabbing. */ diff --git a/source/blender/editors/transform/transform_convert_curve.c b/source/blender/editors/transform/transform_convert_curve.c index 3c01c716123..bef3eca0d9d 100644 --- a/source/blender/editors/transform/transform_convert_curve.c +++ b/source/blender/editors/transform/transform_convert_curve.c @@ -40,7 +40,6 @@ /* -------------------------------------------------------------------- */ /** \name Curve/Surfaces Transform Creation - * * \{ */ /** diff --git a/source/blender/editors/transform/transform_convert_gpencil.c b/source/blender/editors/transform/transform_convert_gpencil.c index 17362ae65e5..244cd552495 100644 --- a/source/blender/editors/transform/transform_convert_gpencil.c +++ b/source/blender/editors/transform/transform_convert_gpencil.c @@ -43,7 +43,6 @@ /* -------------------------------------------------------------------- */ /** \name Gpencil Transform Creation - * * \{ */ static void createTransGPencil_center_get(bGPDstroke *gps, float r_center[3]) @@ -688,7 +687,7 @@ void createTransGPencil(bContext *C, TransInfo *t) Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); const Scene *scene = CTX_data_scene(C); ToolSettings *ts = scene->toolsettings; - Object *obact = CTX_data_active_object(C); + Object *obact = OBACT(t->view_layer); bGPdata *gpd = obact->data; BLI_assert(gpd != NULL); diff --git a/source/blender/editors/transform/transform_convert_graph.c b/source/blender/editors/transform/transform_convert_graph.c index 7daa6498334..d57f7fffe0b 100644 --- a/source/blender/editors/transform/transform_convert_graph.c +++ b/source/blender/editors/transform/transform_convert_graph.c @@ -49,7 +49,6 @@ typedef struct TransDataGraph { /* -------------------------------------------------------------------- */ /** \name Graph Editor Transform Creation - * * \{ */ /* Helper function for createTransGraphEditData, which is responsible for associating @@ -632,7 +631,6 @@ void createTransGraphEditData(bContext *C, TransInfo *t) /* -------------------------------------------------------------------- */ /** \name Graph Editor Transform Flush - * * \{ */ static bool fcu_test_selected(FCurve *fcu) diff --git a/source/blender/editors/transform/transform_convert_lattice.c b/source/blender/editors/transform/transform_convert_lattice.c index e564733266b..20ac7dcb998 100644 --- a/source/blender/editors/transform/transform_convert_lattice.c +++ b/source/blender/editors/transform/transform_convert_lattice.c @@ -39,7 +39,6 @@ /* -------------------------------------------------------------------- */ /** \name Curve/Surfaces Transform Creation - * * \{ */ void createTransLatticeVerts(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_mask.c b/source/blender/editors/transform/transform_convert_mask.c index 340f14c6800..d60d34d2c5d 100644 --- a/source/blender/editors/transform/transform_convert_mask.c +++ b/source/blender/editors/transform/transform_convert_mask.c @@ -57,7 +57,6 @@ typedef struct TransDataMasking { /* -------------------------------------------------------------------- */ /** \name Masking Transform Creation - * * \{ */ static void MaskHandleToTransData(MaskSplinePoint *point, @@ -400,7 +399,6 @@ void createTransMaskingData(bContext *C, TransInfo *t) /* -------------------------------------------------------------------- */ /** \name Recalc TransData Masking - * * \{ */ static void flushTransMasking(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_mball.c b/source/blender/editors/transform/transform_convert_mball.c index ce5e4dade5a..6f5c0318054 100644 --- a/source/blender/editors/transform/transform_convert_mball.c +++ b/source/blender/editors/transform/transform_convert_mball.c @@ -34,7 +34,6 @@ /* -------------------------------------------------------------------- */ /** \name Meta Elements Transform Creation - * * \{ */ void createTransMBallVerts(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_mesh.c b/source/blender/editors/transform/transform_convert_mesh.c index ce74c5f5a36..7270763c4e4 100644 --- a/source/blender/editors/transform/transform_convert_mesh.c +++ b/source/blender/editors/transform/transform_convert_mesh.c @@ -52,7 +52,6 @@ /* -------------------------------------------------------------------- */ /** \name Island Creation - * * \{ */ void transform_convert_mesh_islands_calc(struct BMEditMesh *em, @@ -248,7 +247,6 @@ void transform_convert_mesh_islanddata_free(struct TransIslandData *island_data) /* -------------------------------------------------------------------- */ /** \name Connectivity Distance for Proportional Editing - * * \{ */ /* Propagate distance from v1 and v2 to v0. */ @@ -308,6 +306,24 @@ static bool bmesh_test_dist_add(BMVert *v0, return false; } +static bool bmesh_test_loose_edge(BMEdge *edge) +{ + /* Actual loose edge. */ + if (edge->l == NULL) { + return true; + } + + /* Loose edge due to hidden adjacent faces. */ + BMIter iter; + BMFace *face; + BM_ITER_ELEM (face, &iter, edge, BM_FACES_OF_EDGE) { + if (BM_elem_flag_test(face, BM_ELEM_HIDDEN) == 0) { + return false; + } + } + return true; +} + /** * \param mtx: Measure distance in this space. * \param dists: Store the closest connected distance to selected vertices. @@ -321,6 +337,9 @@ void transform_convert_mesh_connectivity_distance(struct BMesh *bm, BLI_LINKSTACK_DECLARE(queue, BMEdge *); /* any BM_ELEM_TAG'd edge is in 'queue_next', so we don't add in twice */ + const int tag_queued = BM_ELEM_TAG; + const int tag_loose = BM_ELEM_TAG_ALT; + BLI_LINKSTACK_DECLARE(queue_next, BMEdge *); BLI_LINKSTACK_INIT(queue); @@ -368,7 +387,8 @@ void transform_convert_mesh_connectivity_distance(struct BMesh *bm, if (dists[i1] != FLT_MAX || dists[i2] != FLT_MAX) { BLI_LINKSTACK_PUSH(queue, e); } - BM_elem_flag_disable(e, BM_ELEM_TAG); + BM_elem_flag_disable(e, tag_queued); + BM_elem_flag_set(e, tag_loose, bmesh_test_loose_edge(e)); } } @@ -381,7 +401,7 @@ void transform_convert_mesh_connectivity_distance(struct BMesh *bm, int i1 = BM_elem_index_get(v1); int i2 = BM_elem_index_get(v2); - if (e->l == NULL || (dists[i1] == FLT_MAX || dists[i2] == FLT_MAX)) { + if (BM_elem_flag_test(e, tag_loose) || (dists[i1] == FLT_MAX || dists[i2] == FLT_MAX)) { /* Propagate along edge from vertex with smallest to largest distance. */ if (dists[i1] > dists[i2]) { SWAP(int, i1, i2); @@ -394,16 +414,16 @@ void transform_convert_mesh_connectivity_distance(struct BMesh *bm, BMEdge *e_other; BMIter eiter; BM_ITER_ELEM (e_other, &eiter, v2, BM_EDGES_OF_VERT) { - if (e_other != e && BM_elem_flag_test(e_other, BM_ELEM_TAG) == 0 && - (e->l == NULL || e_other->l == NULL)) { - BM_elem_flag_enable(e_other, BM_ELEM_TAG); + if (e_other != e && BM_elem_flag_test(e_other, tag_queued) == 0 && + (BM_elem_flag_test(e, tag_loose) || BM_elem_flag_test(e_other, tag_loose))) { + BM_elem_flag_enable(e_other, tag_queued); BLI_LINKSTACK_PUSH(queue_next, e_other); } } } } - if (e->l != NULL) { + if (!BM_elem_flag_test(e, tag_loose)) { /* Propagate across edge to vertices in adjacent faces. */ BMLoop *l; BMIter liter; @@ -419,10 +439,10 @@ void transform_convert_mesh_connectivity_distance(struct BMesh *bm, BMEdge *e_other; BMIter eiter; BM_ITER_ELEM (e_other, &eiter, v_other, BM_EDGES_OF_VERT) { - if (e_other != e && BM_elem_flag_test(e_other, BM_ELEM_TAG) == 0 && - (e_other->l == NULL || + if (e_other != e && BM_elem_flag_test(e_other, tag_queued) == 0 && + (BM_elem_flag_test(e_other, tag_loose) || dists[BM_elem_index_get(BM_edge_other_vert(e_other, v_other))] != FLT_MAX)) { - BM_elem_flag_enable(e_other, BM_ELEM_TAG); + BM_elem_flag_enable(e_other, tag_queued); BLI_LINKSTACK_PUSH(queue_next, e_other); } } @@ -436,13 +456,13 @@ void transform_convert_mesh_connectivity_distance(struct BMesh *bm, for (LinkNode *lnk = queue_next; lnk; lnk = lnk->next) { BMEdge *e_link = lnk->link; - BM_elem_flag_disable(e_link, BM_ELEM_TAG); + BM_elem_flag_disable(e_link, tag_queued); } BLI_LINKSTACK_SWAP(queue, queue_next); /* None should be tagged now since 'queue_next' is empty. */ - BLI_assert(BM_iter_mesh_count_flag(BM_EDGES_OF_MESH, bm, BM_ELEM_TAG, true) == 0); + BLI_assert(BM_iter_mesh_count_flag(BM_EDGES_OF_MESH, bm, tag_queued, true) == 0); } while (BLI_LINKSTACK_SIZE(queue)); BLI_LINKSTACK_FREE(queue); @@ -453,7 +473,6 @@ void transform_convert_mesh_connectivity_distance(struct BMesh *bm, /* -------------------------------------------------------------------- */ /** \name TransDataMirror Creation - * * \{ */ /* Used for both mirror epsilon and TD_MIRROR_EDGE_ */ @@ -596,7 +615,6 @@ void transform_convert_mesh_mirrordata_free(struct TransMirrorData *mirror_data) /* -------------------------------------------------------------------- */ /** \name Crazy Space - * * \{ */ /* Detect CrazySpace [tm]. @@ -702,7 +720,6 @@ void transform_convert_mesh_crazyspace_free(struct TransMeshDataCrazySpace *r_cr /* -------------------------------------------------------------------- */ /** \name Edit Mesh Verts Transform Creation - * * \{ */ static void transdata_center_get(const struct TransIslandData *island_data, @@ -1010,7 +1027,6 @@ void createTransEditVerts(TransInfo *t) /* -------------------------------------------------------------------- */ /** \name CustomData Layer Correction - * * \{ */ struct TransCustomDataMergeGroup { @@ -1560,7 +1576,6 @@ static void mesh_customdatacorrect_restore(struct TransInfo *t) /* -------------------------------------------------------------------- */ /** \name Recalc Mesh Data - * * \{ */ static void mesh_apply_to_mirror(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_mesh_edge.c b/source/blender/editors/transform/transform_convert_mesh_edge.c index 7bdd33192da..bb9296b4b90 100644 --- a/source/blender/editors/transform/transform_convert_mesh_edge.c +++ b/source/blender/editors/transform/transform_convert_mesh_edge.c @@ -36,7 +36,6 @@ /* -------------------------------------------------------------------- */ /** \name Edge (for crease) Transform Creation - * * \{ */ void createTransEdge(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_mesh_skin.c b/source/blender/editors/transform/transform_convert_mesh_skin.c index b1024f5efe4..5dbb1947773 100644 --- a/source/blender/editors/transform/transform_convert_mesh_skin.c +++ b/source/blender/editors/transform/transform_convert_mesh_skin.c @@ -45,7 +45,6 @@ /* -------------------------------------------------------------------- */ /** \name Edit Mesh #CD_MVERT_SKIN Transform Creation - * * \{ */ static float *mesh_skin_transdata_center(const struct TransIslandData *island_data, @@ -274,7 +273,6 @@ void createTransMeshSkin(TransInfo *t) /* -------------------------------------------------------------------- */ /** \name Recalc Mesh Data - * * \{ */ static void mesh_skin_apply_to_mirror(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_mesh_uv.c b/source/blender/editors/transform/transform_convert_mesh_uv.c index 52394009d28..a5f90e9ac5f 100644 --- a/source/blender/editors/transform/transform_convert_mesh_uv.c +++ b/source/blender/editors/transform/transform_convert_mesh_uv.c @@ -44,7 +44,6 @@ /* -------------------------------------------------------------------- */ /** \name UVs Transform Creation - * * \{ */ static void UVsToTransData(const float aspect[2], @@ -414,7 +413,6 @@ void createTransUVs(bContext *C, TransInfo *t) /* -------------------------------------------------------------------- */ /** \name UVs Transform Flush - * * \{ */ static void flushTransUVs(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_nla.c b/source/blender/editors/transform/transform_convert_nla.c index 5eb3f68787a..b55005673d9 100644 --- a/source/blender/editors/transform/transform_convert_nla.c +++ b/source/blender/editors/transform/transform_convert_nla.c @@ -70,7 +70,6 @@ typedef struct TransDataNla { /* -------------------------------------------------------------------- */ /** \name NLA Transform Creation - * * \{ */ void createTransNlaData(bContext *C, TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_node.c b/source/blender/editors/transform/transform_convert_node.c index 58ff4db324e..506e8a2bd9b 100644 --- a/source/blender/editors/transform/transform_convert_node.c +++ b/source/blender/editors/transform/transform_convert_node.c @@ -42,7 +42,6 @@ /* -------------------------------------------------------------------- */ /** \name Node Transform Creation - * * \{ */ /* transcribe given node into TransData2D for Transforming */ @@ -145,7 +144,6 @@ void createTransNodeData(TransInfo *t) /* -------------------------------------------------------------------- */ /** \name Node Transform Creation - * * \{ */ void flushTransNodes(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_object.c b/source/blender/editors/transform/transform_convert_object.c index 90ffccfdd7b..b546f1d0b4c 100644 --- a/source/blender/editors/transform/transform_convert_object.c +++ b/source/blender/editors/transform/transform_convert_object.c @@ -21,12 +21,8 @@ * \ingroup edtransform */ -#include "DNA_mesh_types.h" - #include "MEM_guardedalloc.h" -#include "BLI_compiler_compat.h" -#include "BLI_ghash.h" #include "BLI_listbase.h" #include "BLI_math.h" @@ -46,11 +42,11 @@ #include "DEG_depsgraph_query.h" #include "transform.h" +#include "transform_orientations.h" #include "transform_snap.h" /* Own include. */ #include "transform_convert.h" -#include "transform_orientations.h" /* -------------------------------------------------------------------- */ /** \name Object Mode Custom Data @@ -712,66 +708,6 @@ void createTransObject(bContext *C, TransInfo *t) /** \} */ -/* -------------------------------------------------------------------- */ -/** \name Texture Space Transform Creation - * - * Instead of transforming the selection, move the 2D/3D cursor. - * - * \{ */ - -void createTransTexspace(TransInfo *t) -{ - ViewLayer *view_layer = t->view_layer; - TransData *td; - Object *ob; - ID *id; - short *texflag; - - ob = OBACT(view_layer); - - if (ob == NULL) { /* Shouldn't logically happen, but still. */ - return; - } - - id = ob->data; - if (id == NULL || !ELEM(GS(id->name), ID_ME, ID_CU, ID_MB)) { - BKE_report(t->reports, RPT_ERROR, "Unsupported object type for text-space transform"); - return; - } - - if (BKE_object_obdata_is_libdata(ob)) { - BKE_report(t->reports, RPT_ERROR, "Linked data can't text-space transform"); - return; - } - - { - BLI_assert(t->data_container_len == 1); - TransDataContainer *tc = t->data_container; - tc->data_len = 1; - td = tc->data = MEM_callocN(sizeof(TransData), "TransTexspace"); - td->ext = tc->data_ext = MEM_callocN(sizeof(TransDataExtension), "TransTexspace"); - } - - td->flag = TD_SELECTED; - copy_v3_v3(td->center, ob->obmat[3]); - td->ob = ob; - - copy_m3_m4(td->mtx, ob->obmat); - copy_m3_m4(td->axismtx, ob->obmat); - normalize_m3(td->axismtx); - pseudoinverse_m3_m3(td->smtx, td->mtx, PSEUDOINVERSE_EPSILON); - - if (BKE_object_obdata_texspace_get(ob, &texflag, &td->loc, &td->ext->size)) { - ob->dtx |= OB_TEXSPACE; - *texflag &= ~ME_AUTOSPACE; - } - - copy_v3_v3(td->iloc, td->loc); - copy_v3_v3(td->ext->isize, td->ext->size); -} - -/** \} */ - /* -------------------------------------------------------------------- */ /** \name Transform (Auto-Keyframing) * \{ */ @@ -924,7 +860,6 @@ static bool motionpath_need_update_object(Scene *scene, Object *ob) /* -------------------------------------------------------------------- */ /** \name Recalc Data object - * * \{ */ /* helper for recalcData() - for object transforms, typically in the 3D view */ @@ -962,10 +897,6 @@ void recalcData_objects(TransInfo *t) * otherwise proxies don't function correctly */ DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM); - - if (t->flag & T_TEXTURE) { - DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); - } } } @@ -991,7 +922,7 @@ void recalcData_objects(TransInfo *t) void special_aftertrans_update__object(bContext *C, TransInfo *t) { - BLI_assert(t->flag & (T_OBJECT | T_TEXTURE)); + BLI_assert(t->options & CTX_OBJECT); Object *ob; const bool canceled = (t->state == TRANS_CANCEL); diff --git a/source/blender/editors/transform/transform_convert_object_texspace.c b/source/blender/editors/transform/transform_convert_object_texspace.c new file mode 100644 index 00000000000..371a5b48818 --- /dev/null +++ b/source/blender/editors/transform/transform_convert_object_texspace.c @@ -0,0 +1,125 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + */ + +/** \file + * \ingroup edtransform + */ + +#include "MEM_guardedalloc.h" + +#include "BLI_math.h" + +#include "BKE_animsys.h" +#include "BKE_context.h" +#include "BKE_object.h" +#include "BKE_report.h" + +#include "DNA_mesh_types.h" + +#include "transform.h" +#include "transform_snap.h" + +/* Own include. */ +#include "transform_convert.h" + +/* -------------------------------------------------------------------- */ +/** \name Texture Space Transform Creation + * + * Instead of transforming the selection, move the 2D/3D cursor. + * + * \{ */ + +void createTransTexspace(TransInfo *t) +{ + ViewLayer *view_layer = t->view_layer; + TransData *td; + Object *ob; + ID *id; + short *texflag; + + ob = OBACT(view_layer); + + if (ob == NULL) { /* Shouldn't logically happen, but still. */ + return; + } + + id = ob->data; + if (id == NULL || !ELEM(GS(id->name), ID_ME, ID_CU, ID_MB)) { + BKE_report(t->reports, RPT_ERROR, "Unsupported object type for text-space transform"); + return; + } + + if (BKE_object_obdata_is_libdata(ob)) { + BKE_report(t->reports, RPT_ERROR, "Linked data can't text-space transform"); + return; + } + + { + BLI_assert(t->data_container_len == 1); + TransDataContainer *tc = t->data_container; + tc->data_len = 1; + td = tc->data = MEM_callocN(sizeof(TransData), "TransTexspace"); + td->ext = tc->data_ext = MEM_callocN(sizeof(TransDataExtension), "TransTexspace"); + } + + td->flag = TD_SELECTED; + copy_v3_v3(td->center, ob->obmat[3]); + td->ob = ob; + + copy_m3_m4(td->mtx, ob->obmat); + copy_m3_m4(td->axismtx, ob->obmat); + normalize_m3(td->axismtx); + pseudoinverse_m3_m3(td->smtx, td->mtx, PSEUDOINVERSE_EPSILON); + + if (BKE_object_obdata_texspace_get(ob, &texflag, &td->loc, &td->ext->size)) { + ob->dtx |= OB_TEXSPACE; + *texflag &= ~ME_AUTOSPACE; + } + + copy_v3_v3(td->iloc, td->loc); + copy_v3_v3(td->ext->isize, td->ext->size); +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Recalc Data object + * \{ */ + +/* helper for recalcData() - for object transforms, typically in the 3D view */ +void recalcData_texspace(TransInfo *t) +{ + + if (t->state != TRANS_CANCEL) { + applyProject(t); + } + + FOREACH_TRANS_DATA_CONTAINER (t, tc) { + TransData *td = tc->data; + + for (int i = 0; i < tc->data_len; i++, td++) { + if (td->flag & TD_SKIP) { + continue; + } + DEG_id_tag_update(&td->ob->id, ID_RECALC_GEOMETRY); + } + } +} + +/** \} */ diff --git a/source/blender/editors/transform/transform_convert_paintcurve.c b/source/blender/editors/transform/transform_convert_paintcurve.c index 47859896673..560298bd99b 100644 --- a/source/blender/editors/transform/transform_convert_paintcurve.c +++ b/source/blender/editors/transform/transform_convert_paintcurve.c @@ -40,7 +40,6 @@ typedef struct TransDataPaintCurve { /* -------------------------------------------------------------------- */ /** \name Paint Curve Transform Creation - * * \{ */ #define PC_IS_ANY_SEL(pc) (((pc)->bez.f1 | (pc)->bez.f2 | (pc)->bez.f3) & SELECT) @@ -203,7 +202,6 @@ void createTransPaintCurveVerts(bContext *C, TransInfo *t) /* -------------------------------------------------------------------- */ /** \name Paint Curve Transform Flush - * * \{ */ void flushTransPaintCurve(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_particle.c b/source/blender/editors/transform/transform_convert_particle.c index fbe9c07ebe9..cb4df28d94b 100644 --- a/source/blender/editors/transform/transform_convert_particle.c +++ b/source/blender/editors/transform/transform_convert_particle.c @@ -42,16 +42,15 @@ /* -------------------------------------------------------------------- */ /** \name Particle Edit Transform Creation - * * \{ */ -void createTransParticleVerts(bContext *C, TransInfo *t) +void createTransParticleVerts(TransInfo *t) { FOREACH_TRANS_DATA_CONTAINER (t, tc) { TransData *td = NULL; TransDataExtension *tx; - Object *ob = CTX_data_active_object(C); + Object *ob = OBACT(t->view_layer); ParticleEditSettings *pset = PE_settings(t->scene); PTCacheEdit *edit = PE_get_current(t->depsgraph, t->scene, ob); ParticleSystem *psys = NULL; @@ -193,7 +192,6 @@ void createTransParticleVerts(bContext *C, TransInfo *t) /* -------------------------------------------------------------------- */ /** \name Node Transform Creation - * * \{ */ static void flushTransParticles(TransInfo *t) @@ -251,7 +249,6 @@ static void flushTransParticles(TransInfo *t) /* -------------------------------------------------------------------- */ /** \name Recalc Transform Particles Data - * * \{ */ void recalcData_particles(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_sculpt.c b/source/blender/editors/transform/transform_convert_sculpt.c index 0ac6bd9264f..d9c29ddbcf7 100644 --- a/source/blender/editors/transform/transform_convert_sculpt.c +++ b/source/blender/editors/transform/transform_convert_sculpt.c @@ -36,7 +36,6 @@ /* -------------------------------------------------------------------- */ /** \name Sculpt Transform Creation - * * \{ */ void createTransSculpt(bContext *C, TransInfo *t) @@ -49,7 +48,7 @@ void createTransSculpt(bContext *C, TransInfo *t) return; } - Object *ob = CTX_data_active_object(t->context); + Object *ob = OBACT(t->view_layer); SculptSession *ss = ob->sculpt; { @@ -101,19 +100,19 @@ void createTransSculpt(bContext *C, TransInfo *t) copy_m3_m4(td->axismtx, ob->obmat); BLI_assert(!(t->options & CTX_PAINT_CURVE)); - ED_sculpt_init_transform(C); + ED_sculpt_init_transform(C, ob); } /** \} */ /* -------------------------------------------------------------------- */ /** \name Recalc Data object - * * \{ */ void recalcData_sculpt(TransInfo *t) { - ED_sculpt_update_modal_transform(t->context); + Object *ob = OBACT(t->view_layer); + ED_sculpt_update_modal_transform(t->context, ob); } void special_aftertrans_update__sculpt(bContext *C, TransInfo *t) @@ -124,8 +123,9 @@ void special_aftertrans_update__sculpt(bContext *C, TransInfo *t) return; } + Object *ob = OBACT(t->view_layer); BLI_assert(!(t->options & CTX_PAINT_CURVE)); - ED_sculpt_end_transform(C); + ED_sculpt_end_transform(C, ob); } /** \} */ diff --git a/source/blender/editors/transform/transform_convert_sequencer.c b/source/blender/editors/transform/transform_convert_sequencer.c index 22b1f9fd8d7..4ab52b78002 100644 --- a/source/blender/editors/transform/transform_convert_sequencer.c +++ b/source/blender/editors/transform/transform_convert_sequencer.c @@ -71,7 +71,6 @@ typedef struct TransSeq { /* -------------------------------------------------------------------- */ /** \name Sequencer Transform Creation - * * \{ */ /* This function applies the rules for transforming a strip so duplicate @@ -641,7 +640,6 @@ void createTransSeqData(TransInfo *t) /* -------------------------------------------------------------------- */ /** \name UVs Transform Flush - * * \{ */ /* commented _only_ because the meta may have animation data which diff --git a/source/blender/editors/transform/transform_convert_tracking.c b/source/blender/editors/transform/transform_convert_tracking.c index 5f5f06e388f..211dec3c4e8 100644 --- a/source/blender/editors/transform/transform_convert_tracking.c +++ b/source/blender/editors/transform/transform_convert_tracking.c @@ -71,7 +71,6 @@ enum transDataTracking_Mode { /* -------------------------------------------------------------------- */ /** \name Clip Editor Motion Tracking Transform Creation - * * \{ */ typedef struct TransformInitContext { @@ -567,7 +566,6 @@ void createTransTrackingData(bContext *C, TransInfo *t) /* -------------------------------------------------------------------- */ /** \name recalc Motion Tracking TransData - * * \{ */ static void cancelTransTracking(TransInfo *t) diff --git a/source/blender/editors/transform/transform_draw_cursors.c b/source/blender/editors/transform/transform_draw_cursors.c index b4b28ea0ac0..ead8eae0997 100644 --- a/source/blender/editors/transform/transform_draw_cursors.c +++ b/source/blender/editors/transform/transform_draw_cursors.c @@ -211,6 +211,8 @@ void transform_draw_cursor_draw(bContext *UNUSED(C), int x, int y, void *customd drawArrow(pos_id, DOWN); break; } + case HLP_NONE: + break; } GPU_matrix_pop(); diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index e181593d28a..e43a3ff3635 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -26,7 +26,6 @@ #include "MEM_guardedalloc.h" #include "DNA_gpencil_types.h" -#include "DNA_mesh_types.h" #include "BLI_blenlib.h" #include "BLI_math.h" @@ -44,6 +43,7 @@ #include "BKE_context.h" #include "BKE_layer.h" #include "BKE_mask.h" +#include "BKE_modifier.h" #include "BKE_paint.h" #include "ED_clip.h" @@ -119,79 +119,6 @@ void resetTransRestrictions(TransInfo *t) t->flag &= ~T_ALL_RESTRICTIONS; } -void initTransDataContainers_FromObjectData(TransInfo *t, - Object *obact, - Object **objects, - uint objects_len) -{ - const eObjectMode object_mode = obact ? obact->mode : OB_MODE_OBJECT; - const short object_type = obact ? obact->type : -1; - - if ((object_mode & OB_MODE_EDIT) || (t->options & CTX_GPENCIL_STROKES) || - ((object_mode & OB_MODE_POSE) && (object_type == OB_ARMATURE))) { - if (t->data_container) { - MEM_freeN(t->data_container); - } - - bool free_objects = false; - if (objects == NULL) { - objects = BKE_view_layer_array_from_objects_in_mode( - t->view_layer, - (t->spacetype == SPACE_VIEW3D) ? t->view : NULL, - &objects_len, - { - .object_mode = object_mode, - .no_dup_data = true, - }); - free_objects = true; - } - - t->data_container = MEM_callocN(sizeof(*t->data_container) * objects_len, __func__); - t->data_container_len = objects_len; - - for (int i = 0; i < objects_len; i++) { - TransDataContainer *tc = &t->data_container[i]; - if (((t->flag & T_NO_MIRROR) == 0) && ((t->options & CTX_NO_MIRROR) == 0) && - (objects[i]->type == OB_MESH)) { - tc->use_mirror_axis_x = (((Mesh *)objects[i]->data)->symmetry & ME_SYMMETRY_X) != 0; - tc->use_mirror_axis_y = (((Mesh *)objects[i]->data)->symmetry & ME_SYMMETRY_Y) != 0; - tc->use_mirror_axis_z = (((Mesh *)objects[i]->data)->symmetry & ME_SYMMETRY_Z) != 0; - } - - if (object_mode & OB_MODE_EDIT) { - tc->obedit = objects[i]; - /* Check needed for UV's */ - if ((t->flag & T_2D_EDIT) == 0) { - tc->use_local_mat = true; - } - } - else if (object_mode & OB_MODE_POSE) { - tc->poseobj = objects[i]; - tc->use_local_mat = true; - } - else if (t->options & CTX_GPENCIL_STROKES) { - tc->use_local_mat = true; - } - - if (tc->use_local_mat) { - BLI_assert((t->flag & T_2D_EDIT) == 0); - copy_m4_m4(tc->mat, objects[i]->obmat); - copy_m3_m4(tc->mat3, tc->mat); - /* for non-invertible scale matrices, invert_m4_m4_fallback() - * can still provide a valid pivot */ - invert_m4_m4_fallback(tc->imat, tc->mat); - invert_m3_m3(tc->imat3, tc->mat3); - normalize_m3_m3(tc->mat3_unit, tc->mat3); - } - /* Otherwise leave as zero. */ - } - - if (free_objects) { - MEM_freeN(objects); - } - } -} - /** * Setup internal data, mouse, vectors * @@ -225,7 +152,7 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve t->flag = 0; - if (obact && !(t->options & (CTX_CURSOR | CTX_TEXTURE)) && + if (obact && !(t->options & (CTX_CURSOR | CTX_TEXTURE_SPACE)) && ELEM(object_mode, OB_MODE_EDIT, OB_MODE_EDIT_GPENCIL)) { t->obedit_type = obact->type; } @@ -272,7 +199,7 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve /* Crease needs edge flag */ if (ELEM(t->mode, TFM_CREASE, TFM_BWEIGHT)) { - t->options |= CTX_EDGE; + t->options |= CTX_EDGE_DATA; } t->remove_on_cancel = false; @@ -454,12 +381,10 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve if (op && (prop = RNA_struct_find_property(op->ptr, "constraint_axis"))) { bool constraint_axis[3] = {false, false, false}; - if (t->flag & T_INPUT_IS_VALUES_FINAL) { - if (t_values_set_is_array) { - /* For operators whose `t->values` is array, set constraint so that the - * orientation is more intuitive in the Redo Panel. */ - constraint_axis[0] = constraint_axis[1] = constraint_axis[2] = true; - } + if (t_values_set_is_array && t->flag & T_INPUT_IS_VALUES_FINAL) { + /* For operators whose `t->values` is array (as Move and Scale), set constraint so that the + * orientation is more intuitive in the Redo Panel. */ + constraint_axis[0] = constraint_axis[1] = constraint_axis[2] = true; } else if (RNA_property_is_set(op->ptr, prop)) { RNA_property_boolean_get_array(op->ptr, prop, constraint_axis); @@ -1110,7 +1035,7 @@ bool calculateCenterActive(TransInfo *t, bool select_only, float r_center[3]) return true; } } - else if (t->flag & T_POSE) { + else if (t->options & CTX_POSE_BONE) { ViewLayer *view_layer = t->view_layer; Object *ob = OBACT(view_layer); if (ED_object_calc_active_center_for_posemode(ob, select_only, r_center)) { @@ -1184,20 +1109,13 @@ void calculateCenter(TransInfo *t) } calculateCenterLocal(t, t->center_global); - /* avoid calculating again */ - { - TransCenterData *cd = &t->center_cache[t->around]; - copy_v3_v3(cd->global, t->center_global); - cd->is_set = true; - } - calculateCenter2D(t); /* For panning from the camera-view. */ - if ((t->flag & T_OBJECT) && (t->flag & T_OVERRIDE_CENTER) == 0) { + if ((t->options & CTX_OBJECT) && (t->flag & T_OVERRIDE_CENTER) == 0) { if (t->spacetype == SPACE_VIEW3D && t->region && t->region->regiontype == RGN_TYPE_WINDOW) { - if (t->flag & T_CAMERA) { + if (t->options & CTX_CAMERA) { float axis[3]; /* persinv is nasty, use viewinv instead, always right */ copy_v3_v3(axis, t->viewinv[2]); @@ -1237,23 +1155,6 @@ void calculateCenter(TransInfo *t) } } -BLI_STATIC_ASSERT(ARRAY_SIZE(((TransInfo *)NULL)->center_cache) == (V3D_AROUND_ACTIVE + 1), - "test size"); - -/** - * Lazy initialize transform center data, when we need to access center values from other types. - */ -const TransCenterData *transformCenter_from_type(TransInfo *t, int around) -{ - BLI_assert(around <= V3D_AROUND_ACTIVE); - TransCenterData *cd = &t->center_cache[around]; - if (cd->is_set == false) { - calculateCenter_FromAround(t, around, cd->global); - cd->is_set = true; - } - return cd; -} - void calculatePropRatio(TransInfo *t) { int i; @@ -1478,3 +1379,23 @@ void transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot) copy_v3_v3(td->ext->rot, eul); } } + +Object *transform_object_deform_pose_armature_get(const TransInfo *t, Object *ob) +{ + if (!(ob->mode & OB_MODE_ALL_WEIGHT_PAINT)) { + return NULL; + } + /* Important that ob_armature can be set even when its not selected T23412. + * Lines below just check is also visible. */ + Object *ob_armature = BKE_modifiers_is_deformed_by_armature(ob); + if (ob_armature && ob_armature->mode & OB_MODE_POSE) { + Base *base_arm = BKE_view_layer_base_find(t->view_layer, ob_armature); + if (base_arm) { + View3D *v3d = t->view; + if (BASE_VISIBLE(v3d, base_arm)) { + return ob_armature; + } + } + } + return NULL; +} diff --git a/source/blender/editors/transform/transform_gizmo_extrude_3d.c b/source/blender/editors/transform/transform_gizmo_extrude_3d.c index ae7cda0bd03..63c8efdd475 100644 --- a/source/blender/editors/transform/transform_gizmo_extrude_3d.c +++ b/source/blender/editors/transform/transform_gizmo_extrude_3d.c @@ -151,7 +151,7 @@ static void gizmo_mesh_extrude_setup(const bContext *C, wmGizmoGroup *gzgroup) { const char *op_idname = NULL; - /* grease pencil does not use obedit */ + /* Grease pencil does not use `obedit`. */ /* GPXX: Remove if OB_MODE_EDIT_GPENCIL is merged with OB_MODE_EDIT */ const Object *obact = CTX_data_active_object(C); if (obact->type == OB_GPENCIL) { diff --git a/source/blender/editors/transform/transform_input.c b/source/blender/editors/transform/transform_input.c index ec84eab27a9..bfeb96d18c4 100644 --- a/source/blender/editors/transform/transform_input.c +++ b/source/blender/editors/transform/transform_input.c @@ -499,28 +499,4 @@ void applyMouseInput(TransInfo *t, MouseInput *mi, const int mval[2], float outp } } -eRedrawFlag handleMouseInput(TransInfo *t, MouseInput *mi, const wmEvent *event) -{ - eRedrawFlag redraw = TREDRAW_NOTHING; - - switch (event->type) { - case EVT_LEFTSHIFTKEY: - case EVT_RIGHTSHIFTKEY: - if (event->val == KM_PRESS) { - t->modifiers |= MOD_PRECISION; - /* Shift is modifier for higher precision transform. */ - mi->precision = 1; - redraw = TREDRAW_HARD; - } - else if (event->val == KM_RELEASE) { - t->modifiers &= ~MOD_PRECISION; - mi->precision = 0; - redraw = TREDRAW_HARD; - } - break; - } - - return redraw; -} - /** \} */ diff --git a/source/blender/editors/transform/transform_mode.c b/source/blender/editors/transform/transform_mode.c index be4f3daa3d2..d14f693da9c 100644 --- a/source/blender/editors/transform/transform_mode.c +++ b/source/blender/editors/transform/transform_mode.c @@ -70,7 +70,7 @@ int transform_mode_really_used(bContext *C, int mode) bool transdata_check_local_center(TransInfo *t, short around) { return ((around == V3D_AROUND_LOCAL_ORIGINS) && - ((t->flag & (T_OBJECT | T_POSE)) || + ((t->options & (CTX_OBJECT | CTX_POSE_BONE)) || /* implicit: (t->flag & T_EDIT) */ (ELEM(t->obedit_type, OB_MESH, OB_CURVE, OB_MBALL, OB_ARMATURE, OB_GPENCIL)) || (t->spacetype == SPACE_GRAPH) || @@ -554,15 +554,6 @@ void headerRotation(TransInfo *t, char str[UI_MAX_DRAW_STR], float final) } } -void postInputRotation(TransInfo *t, float values[3]) -{ - float axis_final[3]; - copy_v3_v3(axis_final, t->spacemtx[t->orient_axis]); - if ((t->con.mode & CON_APPLY) && t->con.applyRot) { - t->con.applyRot(t, NULL, NULL, axis_final, values); - } -} - /** * Applies values of rotation to `td->loc` and `td->ext->quat` * based on a rotation matrix (mat) and a pivot (center). @@ -629,7 +620,7 @@ void ElementRotation_ex(TransInfo *t, * matrix (and inverse). That is not all though. Once the proper translation * has been computed, it has to be converted back into the bone's space. */ - else if (t->flag & T_POSE) { + else if (t->options & CTX_POSE_BONE) { /* Extract and invert armature object matrix */ if ((td->flag & TD_NO_LOC) == 0) { @@ -1026,7 +1017,7 @@ void ElementResize(TransInfo *t, TransDataContainer *tc, TransData *td, float ma mul_v3_fl(vec, td->factor); } - if (t->flag & (T_OBJECT | T_POSE)) { + if (t->options & (CTX_OBJECT | CTX_POSE_BONE)) { mul_m3_v3(td->smtx, vec); } diff --git a/source/blender/editors/transform/transform_mode.h b/source/blender/editors/transform/transform_mode.h index 7a05506e12c..6d7a0b528ae 100644 --- a/source/blender/editors/transform/transform_mode.h +++ b/source/blender/editors/transform/transform_mode.h @@ -47,7 +47,6 @@ void protectedTransBits(short protectflag, float vec[3]); void protectedSizeBits(short protectflag, float size[3]); void constraintTransLim(TransInfo *t, TransData *td); void constraintSizeLim(TransInfo *t, TransData *td); -void postInputRotation(TransInfo *t, float values[3]); void headerRotation(TransInfo *t, char *str, float final); void ElementRotation_ex(TransInfo *t, TransDataContainer *tc, diff --git a/source/blender/editors/transform/transform_mode_align.c b/source/blender/editors/transform/transform_mode_align.c index f16021914f1..5bc2aa68443 100644 --- a/source/blender/editors/transform/transform_mode_align.c +++ b/source/blender/editors/transform/transform_mode_align.c @@ -55,7 +55,7 @@ static void applyAlign(TransInfo *t, const int UNUSED(mval[2])) } /* around local centers */ - if (t->flag & (T_OBJECT | T_POSE)) { + if (t->options & (CTX_OBJECT | CTX_POSE_BONE)) { copy_v3_v3(tc->center_local, td->center); } else { diff --git a/source/blender/editors/transform/transform_mode_bend.c b/source/blender/editors/transform/transform_mode_bend.c index adf3a0346a0..038f7d48c66 100644 --- a/source/blender/editors/transform/transform_mode_bend.c +++ b/source/blender/editors/transform/transform_mode_bend.c @@ -254,7 +254,6 @@ void initBend(TransInfo *t) t->transform = Bend; t->handleEvent = handleEventBend; - setInputPostFct(&t->mouse, postInputRotation); initMouseInputMode(t, &t->mouse, INPUT_ANGLE_SPRING); t->idx_max = 1; diff --git a/source/blender/editors/transform/transform_mode_edge_rotate_normal.c b/source/blender/editors/transform/transform_mode_edge_rotate_normal.c index 32f0d4bd365..c78115561b2 100644 --- a/source/blender/editors/transform/transform_mode_edge_rotate_normal.c +++ b/source/blender/editors/transform/transform_mode_edge_rotate_normal.c @@ -127,7 +127,6 @@ void initNormalRotation(TransInfo *t) t->mode = TFM_NORMAL_ROTATION; t->transform = applyNormalRotation; - setInputPostFct(&t->mouse, postInputRotation); initMouseInputMode(t, &t->mouse, INPUT_ANGLE); t->idx_max = 0; diff --git a/source/blender/editors/transform/transform_mode_mirror.c b/source/blender/editors/transform/transform_mode_mirror.c index 3aa99975fda..9891af8b9a4 100644 --- a/source/blender/editors/transform/transform_mode_mirror.c +++ b/source/blender/editors/transform/transform_mode_mirror.c @@ -152,7 +152,7 @@ static void ElementMirror(TransInfo *t, TransDataContainer *tc, TransData *td, i sub_v3_v3(vec, td->center); } - if (t->flag & (T_OBJECT | T_POSE)) { + if (t->options & (CTX_OBJECT | CTX_POSE_BONE)) { mul_m3_v3(td->smtx, vec); } diff --git a/source/blender/editors/transform/transform_mode_rotate.c b/source/blender/editors/transform/transform_mode_rotate.c index fa02e5382a7..8d8594d5775 100644 --- a/source/blender/editors/transform/transform_mode_rotate.c +++ b/source/blender/editors/transform/transform_mode_rotate.c @@ -197,7 +197,7 @@ static void applyRotation(TransInfo *t, const int UNUSED(mval[2])) float final = t->values[0]; if ((t->con.mode & CON_APPLY) && t->con.applyRot) { - t->con.applyRot(t, NULL, NULL, axis_final, NULL); + t->con.applyRot(t, NULL, NULL, axis_final, &final); } else { negate_v3_v3(axis_final, t->spacemtx[t->orient_axis]); @@ -234,7 +234,6 @@ void initRotation(TransInfo *t) t->tsnap.applySnap = ApplySnapRotation; t->tsnap.distance = RotationBetween; - setInputPostFct(&t->mouse, postInputRotation); initMouseInputMode(t, &t->mouse, INPUT_ANGLE); t->idx_max = 0; diff --git a/source/blender/editors/transform/transform_mode_shrink_fatten.c b/source/blender/editors/transform/transform_mode_shrink_fatten.c index a392a354449..6e497d85417 100644 --- a/source/blender/editors/transform/transform_mode_shrink_fatten.c +++ b/source/blender/editors/transform/transform_mode_shrink_fatten.c @@ -84,8 +84,13 @@ static void applyShrinkFatten(TransInfo *t, const int UNUSED(mval[2])) else { /* default header print */ if (unit != NULL) { - ofs += BKE_unit_value_as_string( - str + ofs, sizeof(str) - ofs, distance * unit->scale_length, 4, B_UNIT_LENGTH, unit, true); + ofs += BKE_unit_value_as_string(str + ofs, + sizeof(str) - ofs, + distance * unit->scale_length, + 4, + B_UNIT_LENGTH, + unit, + true); } else { ofs += BLI_snprintf(str + ofs, sizeof(str) - ofs, "%.4f", distance); diff --git a/source/blender/editors/transform/transform_mode_translate.c b/source/blender/editors/transform/transform_mode_translate.c index 851e0feb5f5..41fc6ee0aaf 100644 --- a/source/blender/editors/transform/transform_mode_translate.c +++ b/source/blender/editors/transform/transform_mode_translate.c @@ -294,7 +294,7 @@ static void applyTranslationValue(TransInfo *t, const float vec[3]) const float *original_normal; /* In pose mode, we want to align normals with Y axis of bones... */ - if (t->flag & T_POSE) { + if (t->options & CTX_POSE_BONE) { original_normal = td->axismtx[1]; } else { diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c index 5b366e7f5fd..01c00247a7a 100644 --- a/source/blender/editors/transform/transform_ops.c +++ b/source/blender/editors/transform/transform_ops.c @@ -411,7 +411,7 @@ static int transform_modal(bContext *C, wmOperator *op, const wmEvent *event) int exit_code; TransInfo *t = op->customdata; - const enum TfmMode mode_prev = t->mode; + const eTfmMode mode_prev = t->mode; #if defined(WITH_INPUT_NDOF) && 0 /* Stable 2D mouse coords map to different 3D coords while the 3D mouse is active diff --git a/source/blender/editors/transform/transform_orientations.c b/source/blender/editors/transform/transform_orientations.c index 6d1bb9cc0de..1470d3b7059 100644 --- a/source/blender/editors/transform/transform_orientations.c +++ b/source/blender/editors/transform/transform_orientations.c @@ -609,6 +609,12 @@ short transform_orientation_matrix_get( orientation_index_custom = orientation - V3D_ORIENT_CUSTOM; orientation = V3D_ORIENT_CUSTOM; } + else if (ob && (ob->mode & OB_MODE_ALL_WEIGHT_PAINT) && !(t->options & CTX_PAINT_CURVE)) { + Object *ob_armature = transform_object_deform_pose_armature_get(t, ob); + if (ob_armature) { + ob = ob_armature; + } + } if ((t->spacetype == SPACE_VIEW3D) && t->region && (t->region->regiontype == RGN_TYPE_WINDOW)) { rv3d = t->region->regiondata; diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index 575c736cf51..d0f91802fff 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -332,7 +332,7 @@ void applyProject(TransInfo *t) if (tc->use_local_mat) { mul_m4_v3(tc->mat, iloc); } - else if (t->flag & T_OBJECT) { + else if (t->options & CTX_OBJECT) { BKE_object_eval_transform_all(t->depsgraph, t->scene, td->ob); copy_v3_v3(iloc, td->ob->obmat[3]); } @@ -366,7 +366,7 @@ void applyProject(TransInfo *t) add_v3_v3(td->loc, tvec); - if (t->tsnap.align && (t->flag & T_OBJECT)) { + if (t->tsnap.align && (t->options & CTX_OBJECT)) { /* handle alignment as well */ const float *original_normal; float mat[3][3]; @@ -422,7 +422,7 @@ void applyGridAbsolute(TransInfo *t) if (tc->use_local_mat) { mul_m4_v3(tc->mat, iloc); } - else if (t->flag & T_OBJECT) { + else if (t->options & CTX_OBJECT) { BKE_object_eval_transform_all(t->depsgraph, t->scene, td->ob); copy_v3_v3(iloc, td->ob->obmat[3]); } @@ -461,7 +461,7 @@ void applySnapping(TransInfo *t, float *vec) activeSnap(t)) { double current = PIL_check_seconds_timer(); - /* Time base quirky code to go around findnearest slowness */ + /* Time base quirky code to go around find-nearest slowness. */ /* TODO: add exception for object mode, no need to slow it down then. */ if (current - t->tsnap.last >= 0.01) { t->tsnap.calcSnap(t, vec); @@ -571,7 +571,8 @@ static void initSnappingMode(TransInfo *t) } } - if ((t->spacetype == SPACE_VIEW3D || t->spacetype == SPACE_IMAGE) && (t->flag & T_CAMERA) == 0) { + if ((t->spacetype == SPACE_VIEW3D || t->spacetype == SPACE_IMAGE) && + (t->options & CTX_CAMERA) == 0) { /* Only 3D view or UV. */ /* Not with camera selected in camera view. */ @@ -926,6 +927,64 @@ static void CalcSnapGeometry(TransInfo *t, float *UNUSED(vec)) /** \name Target * \{ */ +static void snap_target_median_impl(TransInfo *t, float r_median[3]) +{ + int i_accum = 0; + + zero_v3(r_median); + + FOREACH_TRANS_DATA_CONTAINER (t, tc) { + TransData *td = tc->data; + int i; + float v[3]; + zero_v3(v); + + for (i = 0; i < tc->data_len && td->flag & TD_SELECTED; i++, td++) { + add_v3_v3(v, td->center); + } + + if (i == 0) { + /* Is this possible? */ + continue; + } + + mul_v3_fl(v, 1.0 / i); + + if (tc->use_local_mat) { + mul_m4_v3(tc->mat, v); + } + + add_v3_v3(r_median, v); + i_accum++; + } + + mul_v3_fl(r_median, 1.0 / i_accum); + + // TargetSnapOffset(t, NULL); +} + +static void snap_target_grid_ensure(TransInfo *t) +{ + /* Only need to calculate once. */ + if ((t->tsnap.status & TARGET_GRID_INIT) == 0) { + if (t->data_type == TC_CURSOR_VIEW3D) { + /* Use a fallback when transforming the cursor. + * In this case the center is _not_ derived from the cursor which is being transformed. */ + copy_v3_v3(t->tsnap.snapTargetGrid, TRANS_DATA_CONTAINER_FIRST_SINGLE(t)->data->iloc); + } + else if (t->around == V3D_AROUND_CURSOR) { + /* Use a fallback for cursor selection, + * this isn't useful as a global center for absolute grid snapping + * since its not based on the position of the selection. */ + snap_target_median_impl(t, t->tsnap.snapTargetGrid); + } + else { + copy_v3_v3(t->tsnap.snapTargetGrid, t->center_global); + } + t->tsnap.status |= TARGET_GRID_INIT; + } +} + static void TargetSnapOffset(TransInfo *t, TransData *td) { if (t->spacetype == SPACE_NODE && td != NULL) { @@ -997,41 +1056,7 @@ static void TargetSnapMedian(TransInfo *t) { /* Only need to calculate once. */ if ((t->tsnap.status & TARGET_INIT) == 0) { - int i_accum = 0; - - t->tsnap.snapTarget[0] = 0; - t->tsnap.snapTarget[1] = 0; - t->tsnap.snapTarget[2] = 0; - - FOREACH_TRANS_DATA_CONTAINER (t, tc) { - TransData *td = tc->data; - int i; - float v[3]; - zero_v3(v); - - for (i = 0; i < tc->data_len && td->flag & TD_SELECTED; i++, td++) { - add_v3_v3(v, td->center); - } - - if (i == 0) { - /* Is this possible? */ - continue; - } - - mul_v3_fl(v, 1.0 / i); - - if (tc->use_local_mat) { - mul_m4_v3(tc->mat, v); - } - - add_v3_v3(t->tsnap.snapTarget, v); - i_accum++; - } - - mul_v3_fl(t->tsnap.snapTarget, 1.0 / i_accum); - - TargetSnapOffset(t, NULL); - + snap_target_median_impl(t, t->tsnap.snapTarget); t->tsnap.status |= TARGET_INIT; } } @@ -1044,7 +1069,7 @@ static void TargetSnapClosest(TransInfo *t) TransData *closest = NULL; /* Object mode */ - if (t->flag & T_OBJECT) { + if (t->options & CTX_OBJECT) { int i; FOREACH_TRANS_DATA_CONTAINER (t, tc) { TransData *td = tc->data; @@ -1431,28 +1456,10 @@ static void snap_grid_apply( TransInfo *t, const int max_index, const float grid_dist, const float loc[3], float r_out[3]) { BLI_assert(max_index <= 2); - const float *center_global = t->center_global; + snap_target_grid_ensure(t); + const float *center_global = t->tsnap.snapTargetGrid; const float *asp = t->aspect; - if (t->options & CTX_CURSOR) { - /* Note that we must already have called #transformCenter_from_type, otherwise - * we would be lazy-initializing data which is being transformed, - * causing the transformed cursor location to be used instead of it's initial location. */ - BLI_assert(t->center_cache[V3D_AROUND_CURSOR].is_set); - - /* Use a fallback when transforming the cursor. - * In this case the center is _not_ derived from the cursor which is being transformed. */ - const TransCenterData *cd = transformCenter_from_type(t, V3D_AROUND_CURSOR); - center_global = cd->global; - } - else if (t->around == V3D_AROUND_CURSOR) { - /* Use a fallback for cursor selection, - * this isn't useful as a global center for absolute grid snapping - * since its not based on the position of the selection. */ - const TransCenterData *cd = transformCenter_from_type(t, V3D_AROUND_CENTER_MEDIAN); - center_global = cd->global; - } - float in[3]; if (t->con.mode & CON_APPLY) { BLI_assert(t->tsnap.snapElem == 0); diff --git a/source/blender/editors/undo/ed_undo.c b/source/blender/editors/undo/ed_undo.c index baa178a6a94..7d8f72f3779 100644 --- a/source/blender/editors/undo/ed_undo.c +++ b/source/blender/editors/undo/ed_undo.c @@ -846,16 +846,15 @@ void ED_OT_undo_history(wmOperatorType *ot) /** \name Undo Helper Functions * \{ */ -void ED_undo_object_set_active_or_warn(ViewLayer *view_layer, - Object *ob, - const char *info, - CLG_LogRef *log) +void ED_undo_object_set_active_or_warn( + Scene *scene, ViewLayer *view_layer, Object *ob, const char *info, CLG_LogRef *log) { Object *ob_prev = OBACT(view_layer); if (ob_prev != ob) { Base *base = BKE_view_layer_base_find(view_layer, ob); if (base != NULL) { view_layer->basact = base; + ED_object_base_active_refresh(G_MAIN, scene, view_layer); } else { /* Should never fail, may not crash but can give odd behavior. */ @@ -864,6 +863,9 @@ void ED_undo_object_set_active_or_warn(ViewLayer *view_layer, } } +/** + * Load all our objects from `object_array` into edit-mode, clear everything else. + */ void ED_undo_object_editmode_restore_helper(struct bContext *C, Object **object_array, uint object_array_len, diff --git a/source/blender/editors/undo/memfile_undo.c b/source/blender/editors/undo/memfile_undo.c index 51859b6a555..4fd8c180a4b 100644 --- a/source/blender/editors/undo/memfile_undo.c +++ b/source/blender/editors/undo/memfile_undo.c @@ -314,8 +314,8 @@ struct MemFile *ED_undosys_stack_memfile_get_active(UndoStack *ustack) * If the last undo step is a memfile one, find the first #MemFileChunk matching given ID * (using its session UUID), and tag it as "changed in the future". * - * Since non-memfile undos cannot automatically set this flag in the previous step as done with - * memfile ones, this has to be called manually by relevant undo code. + * Since non-memfile undo-steps cannot automatically set this flag in the previous step as done + * with memfile ones, this has to be called manually by relevant undo code. * * \note Only current known case for this is undoing a switch from Object to Sculpt mode (see * T82388). diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c index c59fbbe1646..695db9ba246 100644 --- a/source/blender/editors/util/ed_util.c +++ b/source/blender/editors/util/ed_util.c @@ -183,7 +183,7 @@ void ED_editors_exit(Main *bmain, bool do_undo_system) return; } - /* frees all editmode undos */ + /* Frees all edit-mode undo-steps. */ if (do_undo_system && G_MAIN->wm.first) { wmWindowManager *wm = G_MAIN->wm.first; /* normally we don't check for NULL undo stack, diff --git a/source/blender/editors/util/ed_util_ops.cc b/source/blender/editors/util/ed_util_ops.cc index cb7ff9f3a63..5b2e1a16bc2 100644 --- a/source/blender/editors/util/ed_util_ops.cc +++ b/source/blender/editors/util/ed_util_ops.cc @@ -20,7 +20,7 @@ * Utility operators for UI data or for the UI to use. */ -#include +#include #include "DNA_space_types.h" #include "DNA_windowmanager_types.h" diff --git a/source/blender/editors/uvedit/uvedit_select.c b/source/blender/editors/uvedit/uvedit_select.c index 0bc1943802a..88802e0d868 100644 --- a/source/blender/editors/uvedit/uvedit_select.c +++ b/source/blender/editors/uvedit/uvedit_select.c @@ -3546,6 +3546,51 @@ struct UVOverlapData { float tri[3][2]; }; +/** + * Specialized 2D triangle intersection for detecting UV overlap: + * + * \return + * - false when single corners or edges touch (common for UV coordinates). + * - true when all corners touch (an exactly overlapping triangle). + */ +static bool overlap_tri_tri_uv_test(const float t1[3][2], + const float t2[3][2], + const float endpoint_bias) +{ + float vi[2]; + + /* Don't use 'isect_tri_tri_v2' here + * because it's important to ignore overlap at end-points. */ + if (isect_seg_seg_v2_point_ex(t1[0], t1[1], t2[0], t2[1], endpoint_bias, vi) == 1 || + isect_seg_seg_v2_point_ex(t1[0], t1[1], t2[1], t2[2], endpoint_bias, vi) == 1 || + isect_seg_seg_v2_point_ex(t1[0], t1[1], t2[2], t2[0], endpoint_bias, vi) == 1 || + isect_seg_seg_v2_point_ex(t1[1], t1[2], t2[0], t2[1], endpoint_bias, vi) == 1 || + isect_seg_seg_v2_point_ex(t1[1], t1[2], t2[1], t2[2], endpoint_bias, vi) == 1 || + isect_seg_seg_v2_point_ex(t1[1], t1[2], t2[2], t2[0], endpoint_bias, vi) == 1 || + isect_seg_seg_v2_point_ex(t1[2], t1[0], t2[0], t2[1], endpoint_bias, vi) == 1 || + isect_seg_seg_v2_point_ex(t1[2], t1[0], t2[1], t2[2], endpoint_bias, vi) == 1) { + return true; + } + + /* When none of the segments intersect, checking if either of the triangles corners + * is inside the others is almost always sufficient to test if the two triangles intersect. + * + * However, the `endpoint_bias` on segment intersections causes _exact_ overlapping + * triangles not to be detected. + * + * Resolve this problem at the small cost of calculating the triangle center, see T85508. */ + mid_v2_v2v2v2(vi, UNPACK3(t1)); + if (isect_point_tri_v2(vi, UNPACK3(t2)) != 0) { + return true; + } + mid_v2_v2v2v2(vi, UNPACK3(t2)); + if (isect_point_tri_v2(vi, UNPACK3(t1)) != 0) { + return true; + } + + return false; +} + static int uv_select_overlap(bContext *C, const bool extend) { Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); @@ -3689,24 +3734,7 @@ static int uv_select_overlap(bContext *C, const bool extend) /* Main tri-tri overlap test. */ const float endpoint_bias = -1e-4f; - const float(*t1)[2] = o_a->tri; - const float(*t2)[2] = o_b->tri; - float vi[2]; - bool result = ( - /* Don't use 'isect_tri_tri_v2' here - * because it's important to ignore overlap at end-points. */ - isect_seg_seg_v2_point_ex(t1[0], t1[1], t2[0], t2[1], endpoint_bias, vi) == 1 || - isect_seg_seg_v2_point_ex(t1[0], t1[1], t2[1], t2[2], endpoint_bias, vi) == 1 || - isect_seg_seg_v2_point_ex(t1[0], t1[1], t2[2], t2[0], endpoint_bias, vi) == 1 || - isect_seg_seg_v2_point_ex(t1[1], t1[2], t2[0], t2[1], endpoint_bias, vi) == 1 || - isect_seg_seg_v2_point_ex(t1[1], t1[2], t2[1], t2[2], endpoint_bias, vi) == 1 || - isect_seg_seg_v2_point_ex(t1[1], t1[2], t2[2], t2[0], endpoint_bias, vi) == 1 || - isect_seg_seg_v2_point_ex(t1[2], t1[0], t2[0], t2[1], endpoint_bias, vi) == 1 || - isect_seg_seg_v2_point_ex(t1[2], t1[0], t2[1], t2[2], endpoint_bias, vi) == 1 || - isect_point_tri_v2(t1[0], t2[0], t2[1], t2[2]) != 0 || - isect_point_tri_v2(t2[0], t1[0], t1[1], t1[2]) != 0); - - if (result) { + if (overlap_tri_tri_uv_test(o_a->tri, o_b->tri, endpoint_bias)) { uvedit_face_select_enable(scene, em_a, face_a, false, cd_loop_uv_offset_a); uvedit_face_select_enable(scene, em_b, face_b, false, cd_loop_uv_offset_b); } diff --git a/source/blender/editors/uvedit/uvedit_smart_stitch.c b/source/blender/editors/uvedit/uvedit_smart_stitch.c index 5c4dc90f112..8ebf000baaa 100644 --- a/source/blender/editors/uvedit/uvedit_smart_stitch.c +++ b/source/blender/editors/uvedit/uvedit_smart_stitch.c @@ -129,8 +129,10 @@ typedef struct UvEdge { /** general use flag * (Used to check if edge is boundary here, and propagates to adjacency elements) */ uchar flag; - /** element that guarantees element->face - * has the edge on element->tfindex and element->tfindex+1 is the second uv */ + /** + * Element that guarantees `element.l` has the edge on + * `element.loop_of_poly_index` and `element->loop_of_poly_index + 1` is the second UV. + */ UvElement *element; /** next uv edge with the same exact vertices as this one. * Calculated at startup to save time */ diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c index d29ad938922..42a54010ceb 100644 --- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c +++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c @@ -1336,9 +1336,9 @@ static void uv_map_rotation_matrix_ex(float result[4][4], zero_m4(rotup); zero_m4(rotside); - /* compensate front/side.. against opengl x,y,z world definition */ - /* this is "kanonen gegen spatzen", a few plus minus 1 will do here */ - /* i wanted to keep the reason here, so we're rotating*/ + /* Compensate front/side.. against opengl x,y,z world definition. + * This is "a sledgehammer to crack a nut" (overkill), a few plus minus 1 will do here. + * I wanted to keep the reason here, so we're rotating. */ sideangle = (float)M_PI * (sideangledeg + 180.0f) / 180.0f; rotside[0][0] = cosf(sideangle); rotside[0][1] = -sinf(sideangle); diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp index f761b1f6243..4f6ffc451c8 100644 --- a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp +++ b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp @@ -628,7 +628,7 @@ void BlenderStrokeRenderer::GenerateStrokeMesh(StrokeGroup *group, bool hasTex) mesh->mloopcol = colors; mesh->mat = (Material **)MEM_mallocN(sizeof(Material *) * mesh->totcol, "MaterialList"); - for (const auto &item : group->materials.items()) { + for (const auto item : group->materials.items()) { Material *material = item.key; const int matnr = item.value; mesh->mat[matnr] = material; diff --git a/source/blender/freestyle/intern/geometry/FitCurve.cpp b/source/blender/freestyle/intern/geometry/FitCurve.cpp index 5768f88e95f..7c0b3bf0224 100644 --- a/source/blender/freestyle/intern/geometry/FitCurve.cpp +++ b/source/blender/freestyle/intern/geometry/FitCurve.cpp @@ -134,7 +134,7 @@ static BezierCurve GenerateBezier( double alpha_l; /* Alpha values, left and right */ double alpha_r; Vector2 tmp; /* Utility variable */ - BezierCurve bezCurve; /* RETURN bezier curve ctl pts */ + BezierCurve bezCurve; /* RETURN bezier curve control points. */ bezCurve = (Vector2 *)malloc(4 * sizeof(Vector2)); nPts = last - first + 1; diff --git a/source/blender/freestyle/intern/python/BPy_BBox.cpp b/source/blender/freestyle/intern/python/BPy_BBox.cpp index d66a74bc83f..78431aa6728 100644 --- a/source/blender/freestyle/intern/python/BPy_BBox.cpp +++ b/source/blender/freestyle/intern/python/BPy_BBox.cpp @@ -24,6 +24,9 @@ extern "C" { #endif +using namespace Freestyle; +using namespace Freestyle::Geometry; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -80,11 +83,7 @@ PyTypeObject BBox_Type = { sizeof(BPy_BBox), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)BBox_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif + 0, /* tp_vectorcall_offset */ nullptr, /* tp_getattr */ nullptr, /* tp_setattr */ nullptr, /* tp_reserved */ diff --git a/source/blender/freestyle/intern/python/BPy_BBox.h b/source/blender/freestyle/intern/python/BPy_BBox.h index a284deed10c..889dbc62a41 100644 --- a/source/blender/freestyle/intern/python/BPy_BBox.h +++ b/source/blender/freestyle/intern/python/BPy_BBox.h @@ -27,9 +27,6 @@ extern "C" { #include "../geometry/BBox.h" #include "../geometry/Geom.h" -using namespace Freestyle; -using namespace Freestyle::Geometry; - #ifdef __cplusplus extern "C" { #endif @@ -42,7 +39,7 @@ extern PyTypeObject BBox_Type; /*---------------------------Python BPy_BBox structure definition----------*/ typedef struct { - PyObject_HEAD BBox *bb; + PyObject_HEAD Freestyle::BBox *bb; } BPy_BBox; /*---------------------------Python BPy_BBox visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.cpp b/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.cpp index 2359d79f7d0..652b576852d 100644 --- a/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.cpp +++ b/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -153,43 +155,39 @@ PyTypeObject BinaryPredicate0D_Type = { sizeof(BPy_BinaryPredicate0D), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)BinaryPredicate0D___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)BinaryPredicate0D___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)BinaryPredicate0D___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - BinaryPredicate0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_BinaryPredicate0D_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)BinaryPredicate0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)BinaryPredicate0D___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)BinaryPredicate0D___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + BinaryPredicate0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_BinaryPredicate0D_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)BinaryPredicate0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.h b/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.h index cdf81f3e4fc..a368d4cd47e 100644 --- a/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.h +++ b/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.h @@ -26,8 +26,6 @@ extern "C" { #include "../stroke/Predicates0D.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -41,7 +39,7 @@ extern PyTypeObject BinaryPredicate0D_Type; /*---------------------------Python BPy_BinaryPredicate0D structure definition----------*/ typedef struct { - PyObject_HEAD BinaryPredicate0D *bp0D; + PyObject_HEAD Freestyle::BinaryPredicate0D *bp0D; } BPy_BinaryPredicate0D; /*---------------------------Python BPy_BinaryPredicate0D visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.cpp b/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.cpp index 7d554e0abe1..37762f1b8b3 100644 --- a/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.cpp +++ b/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.cpp @@ -33,6 +33,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -187,43 +189,39 @@ PyTypeObject BinaryPredicate1D_Type = { sizeof(BPy_BinaryPredicate1D), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)BinaryPredicate1D___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)BinaryPredicate1D___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)BinaryPredicate1D___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - BinaryPredicate1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_BinaryPredicate1D_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)BinaryPredicate1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)BinaryPredicate1D___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)BinaryPredicate1D___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + BinaryPredicate1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_BinaryPredicate1D_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)BinaryPredicate1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.h b/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.h index b761f6f6ace..b34fad9e213 100644 --- a/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.h +++ b/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.h @@ -26,8 +26,6 @@ extern "C" { #include "../stroke/Predicates1D.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -41,7 +39,7 @@ extern PyTypeObject BinaryPredicate1D_Type; /*---------------------------Python BPy_BinaryPredicate1D structure definition----------*/ typedef struct { - PyObject_HEAD BinaryPredicate1D *bp1D; + PyObject_HEAD Freestyle::BinaryPredicate1D *bp1D; } BPy_BinaryPredicate1D; /*---------------------------Python BPy_BinaryPredicate1D visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_Convert.cpp b/source/blender/freestyle/intern/python/BPy_Convert.cpp index f1d7a242a93..99ba3090137 100644 --- a/source/blender/freestyle/intern/python/BPy_Convert.cpp +++ b/source/blender/freestyle/intern/python/BPy_Convert.cpp @@ -61,6 +61,9 @@ extern "C" { #endif +using namespace Freestyle; +using namespace Freestyle::Geometry; + /////////////////////////////////////////////////////////////////////////////////////////// //============================== diff --git a/source/blender/freestyle/intern/python/BPy_Convert.h b/source/blender/freestyle/intern/python/BPy_Convert.h index 5a1c11ec086..e0916196808 100644 --- a/source/blender/freestyle/intern/python/BPy_Convert.h +++ b/source/blender/freestyle/intern/python/BPy_Convert.h @@ -28,9 +28,6 @@ extern "C" { #include "../geometry/Geom.h" -using namespace Freestyle; -using namespace Freestyle::Geometry; - // BBox #include "../geometry/BBox.h" @@ -94,76 +91,81 @@ extern "C" { //============================== PyObject *PyBool_from_bool(bool b); -PyObject *Vector_from_Vec2f(Vec2f &v); -PyObject *Vector_from_Vec3f(Vec3f &v); -PyObject *Vector_from_Vec3r(Vec3r &v); +PyObject *Vector_from_Vec2f(Freestyle::Geometry::Vec2f &v); +PyObject *Vector_from_Vec3f(Freestyle::Geometry::Vec3f &v); +PyObject *Vector_from_Vec3r(Freestyle::Geometry::Vec3r &v); -PyObject *Any_BPy_Interface0D_from_Interface0D(Interface0D &if0D); -PyObject *Any_BPy_Interface1D_from_Interface1D(Interface1D &if1D); -PyObject *Any_BPy_FEdge_from_FEdge(FEdge &fe); -PyObject *Any_BPy_ViewVertex_from_ViewVertex(ViewVertex &vv); +PyObject *Any_BPy_Interface0D_from_Interface0D(Freestyle::Interface0D &if0D); +PyObject *Any_BPy_Interface1D_from_Interface1D(Freestyle::Interface1D &if1D); +PyObject *Any_BPy_FEdge_from_FEdge(Freestyle::FEdge &fe); +PyObject *Any_BPy_ViewVertex_from_ViewVertex(Freestyle::ViewVertex &vv); -PyObject *BPy_BBox_from_BBox(const BBox &bb); -PyObject *BPy_CurvePoint_from_CurvePoint(CurvePoint &cp); -PyObject *BPy_directedViewEdge_from_directedViewEdge(ViewVertex::directedViewEdge &dve); -PyObject *BPy_FEdge_from_FEdge(FEdge &fe); -PyObject *BPy_FEdgeSharp_from_FEdgeSharp(FEdgeSharp &fes); -PyObject *BPy_FEdgeSmooth_from_FEdgeSmooth(FEdgeSmooth &fes); -PyObject *BPy_Id_from_Id(Id &id); -PyObject *BPy_Interface0D_from_Interface0D(Interface0D &if0D); -PyObject *BPy_Interface1D_from_Interface1D(Interface1D &if1D); -PyObject *BPy_IntegrationType_from_IntegrationType(IntegrationType i); -PyObject *BPy_FrsMaterial_from_FrsMaterial(const FrsMaterial &m); +PyObject *BPy_BBox_from_BBox(const Freestyle::BBox &bb); +PyObject *BPy_CurvePoint_from_CurvePoint(Freestyle::CurvePoint &cp); +PyObject *BPy_directedViewEdge_from_directedViewEdge(Freestyle::ViewVertex::directedViewEdge &dve); +PyObject *BPy_FEdge_from_FEdge(Freestyle::FEdge &fe); +PyObject *BPy_FEdgeSharp_from_FEdgeSharp(Freestyle::FEdgeSharp &fes); +PyObject *BPy_FEdgeSmooth_from_FEdgeSmooth(Freestyle::FEdgeSmooth &fes); +PyObject *BPy_Id_from_Id(Freestyle::Id &id); +PyObject *BPy_Interface0D_from_Interface0D(Freestyle::Interface0D &if0D); +PyObject *BPy_Interface1D_from_Interface1D(Freestyle::Interface1D &if1D); +PyObject *BPy_IntegrationType_from_IntegrationType(Freestyle::IntegrationType i); +PyObject *BPy_FrsMaterial_from_FrsMaterial(const Freestyle::FrsMaterial &m); PyObject *BPy_Nature_from_Nature(unsigned short n); -PyObject *BPy_MediumType_from_MediumType(Stroke::MediumType n); -PyObject *BPy_SShape_from_SShape(SShape &ss); -PyObject *BPy_Stroke_from_Stroke(Stroke &s); -PyObject *BPy_StrokeAttribute_from_StrokeAttribute(StrokeAttribute &sa); -PyObject *BPy_StrokeVertex_from_StrokeVertex(StrokeVertex &sv); -PyObject *BPy_SVertex_from_SVertex(SVertex &sv); -PyObject *BPy_ViewVertex_from_ViewVertex(ViewVertex &vv); -PyObject *BPy_NonTVertex_from_NonTVertex(NonTVertex &ntv); -PyObject *BPy_TVertex_from_TVertex(TVertex &tv); -PyObject *BPy_ViewEdge_from_ViewEdge(ViewEdge &ve); -PyObject *BPy_Chain_from_Chain(Chain &c); -PyObject *BPy_ViewShape_from_ViewShape(ViewShape &vs); +PyObject *BPy_MediumType_from_MediumType(Freestyle::Stroke::MediumType n); +PyObject *BPy_SShape_from_SShape(Freestyle::SShape &ss); +PyObject *BPy_Stroke_from_Stroke(Freestyle::Stroke &s); +PyObject *BPy_StrokeAttribute_from_StrokeAttribute(Freestyle::StrokeAttribute &sa); +PyObject *BPy_StrokeVertex_from_StrokeVertex(Freestyle::StrokeVertex &sv); +PyObject *BPy_SVertex_from_SVertex(Freestyle::SVertex &sv); +PyObject *BPy_ViewVertex_from_ViewVertex(Freestyle::ViewVertex &vv); +PyObject *BPy_NonTVertex_from_NonTVertex(Freestyle::NonTVertex &ntv); +PyObject *BPy_TVertex_from_TVertex(Freestyle::TVertex &tv); +PyObject *BPy_ViewEdge_from_ViewEdge(Freestyle::ViewEdge &ve); +PyObject *BPy_Chain_from_Chain(Freestyle::Chain &c); +PyObject *BPy_ViewShape_from_ViewShape(Freestyle::ViewShape &vs); -PyObject *BPy_AdjacencyIterator_from_AdjacencyIterator(AdjacencyIterator &a_it); -PyObject *BPy_Interface0DIterator_from_Interface0DIterator(Interface0DIterator &if0D_it, +PyObject *BPy_AdjacencyIterator_from_AdjacencyIterator(Freestyle::AdjacencyIterator &a_it); +PyObject *BPy_Interface0DIterator_from_Interface0DIterator(Freestyle::Interface0DIterator &if0D_it, bool reversed); -PyObject *BPy_CurvePointIterator_from_CurvePointIterator(CurveInternal::CurvePointIterator &cp_it); +PyObject *BPy_CurvePointIterator_from_CurvePointIterator( + Freestyle::CurveInternal::CurvePointIterator &cp_it); PyObject *BPy_StrokeVertexIterator_from_StrokeVertexIterator( - StrokeInternal::StrokeVertexIterator &sv_it, bool reversed); -PyObject *BPy_SVertexIterator_from_SVertexIterator(ViewEdgeInternal::SVertexIterator &sv_it); + Freestyle::StrokeInternal::StrokeVertexIterator &sv_it, bool reversed); +PyObject *BPy_SVertexIterator_from_SVertexIterator( + Freestyle::ViewEdgeInternal::SVertexIterator &sv_it); PyObject *BPy_orientedViewEdgeIterator_from_orientedViewEdgeIterator( - ViewVertexInternal::orientedViewEdgeIterator &ove_it, bool reversed); -PyObject *BPy_ViewEdgeIterator_from_ViewEdgeIterator(ViewEdgeInternal::ViewEdgeIterator &ve_it); -PyObject *BPy_ChainingIterator_from_ChainingIterator(ChainingIterator &c_it); -PyObject *BPy_ChainPredicateIterator_from_ChainPredicateIterator(ChainPredicateIterator &cp_it); -PyObject *BPy_ChainSilhouetteIterator_from_ChainSilhouetteIterator(ChainSilhouetteIterator &cs_it); + Freestyle::ViewVertexInternal::orientedViewEdgeIterator &ove_it, bool reversed); +PyObject *BPy_ViewEdgeIterator_from_ViewEdgeIterator( + Freestyle::ViewEdgeInternal::ViewEdgeIterator &ve_it); +PyObject *BPy_ChainingIterator_from_ChainingIterator(Freestyle::ChainingIterator &c_it); +PyObject *BPy_ChainPredicateIterator_from_ChainPredicateIterator( + Freestyle::ChainPredicateIterator &cp_it); +PyObject *BPy_ChainSilhouetteIterator_from_ChainSilhouetteIterator( + Freestyle::ChainSilhouetteIterator &cs_it); //============================== // Python => C++ //============================== bool bool_from_PyBool(PyObject *b); -IntegrationType IntegrationType_from_BPy_IntegrationType(PyObject *obj); -Stroke::MediumType MediumType_from_BPy_MediumType(PyObject *obj); -Nature::EdgeNature EdgeNature_from_BPy_Nature(PyObject *obj); -bool Vec2f_ptr_from_PyObject(PyObject *obj, Vec2f &vec); -bool Vec3f_ptr_from_PyObject(PyObject *obj, Vec3f &vec); -bool Vec3r_ptr_from_PyObject(PyObject *obj, Vec3r &vec); -bool Vec2f_ptr_from_Vector(PyObject *obj, Vec2f &vec); -bool Vec3f_ptr_from_Vector(PyObject *obj, Vec3f &vec); -bool Vec3r_ptr_from_Vector(PyObject *obj, Vec3r &vec); -bool Vec3f_ptr_from_Color(PyObject *obj, Vec3f &vec); -bool Vec3r_ptr_from_Color(PyObject *obj, Vec3r &vec); -bool Vec2f_ptr_from_PyList(PyObject *obj, Vec2f &vec); -bool Vec3f_ptr_from_PyList(PyObject *obj, Vec3f &vec); -bool Vec3r_ptr_from_PyList(PyObject *obj, Vec3r &vec); -bool Vec2f_ptr_from_PyTuple(PyObject *obj, Vec2f &vec); -bool Vec3f_ptr_from_PyTuple(PyObject *obj, Vec3f &vec); -bool Vec3r_ptr_from_PyTuple(PyObject *obj, Vec3r &vec); +Freestyle::IntegrationType IntegrationType_from_BPy_IntegrationType(PyObject *obj); +Freestyle::Stroke::MediumType MediumType_from_BPy_MediumType(PyObject *obj); +Freestyle::Nature::EdgeNature EdgeNature_from_BPy_Nature(PyObject *obj); +bool Vec2f_ptr_from_PyObject(PyObject *obj, Freestyle::Geometry::Vec2f &vec); +bool Vec3f_ptr_from_PyObject(PyObject *obj, Freestyle::Geometry::Vec3f &vec); +bool Vec3r_ptr_from_PyObject(PyObject *obj, Freestyle::Geometry::Vec3r &vec); +bool Vec2f_ptr_from_Vector(PyObject *obj, Freestyle::Geometry::Vec2f &vec); +bool Vec3f_ptr_from_Vector(PyObject *obj, Freestyle::Geometry::Vec3f &vec); +bool Vec3r_ptr_from_Vector(PyObject *obj, Freestyle::Geometry::Vec3r &vec); +bool Vec3f_ptr_from_Color(PyObject *obj, Freestyle::Geometry::Vec3f &vec); +bool Vec3r_ptr_from_Color(PyObject *obj, Freestyle::Geometry::Vec3r &vec); +bool Vec2f_ptr_from_PyList(PyObject *obj, Freestyle::Geometry::Vec2f &vec); +bool Vec3f_ptr_from_PyList(PyObject *obj, Freestyle::Geometry::Vec3f &vec); +bool Vec3r_ptr_from_PyList(PyObject *obj, Freestyle::Geometry::Vec3r &vec); +bool Vec2f_ptr_from_PyTuple(PyObject *obj, Freestyle::Geometry::Vec2f &vec); +bool Vec3f_ptr_from_PyTuple(PyObject *obj, Freestyle::Geometry::Vec3f &vec); +bool Vec3r_ptr_from_PyTuple(PyObject *obj, Freestyle::Geometry::Vec3r &vec); bool float_array_from_PyObject(PyObject *obj, float *v, int n); diff --git a/source/blender/freestyle/intern/python/BPy_FrsMaterial.cpp b/source/blender/freestyle/intern/python/BPy_FrsMaterial.cpp index 2aa08ec3ab5..48b2ad767d2 100644 --- a/source/blender/freestyle/intern/python/BPy_FrsMaterial.cpp +++ b/source/blender/freestyle/intern/python/BPy_FrsMaterial.cpp @@ -28,6 +28,8 @@ extern "C" { #include "BLI_hash_mm2a.h" +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -538,43 +540,39 @@ PyTypeObject FrsMaterial_Type = { sizeof(BPy_FrsMaterial), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)FrsMaterial_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)FrsMaterial_repr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - (hashfunc)FrsMaterial_hash, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - FrsMaterial_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - (richcmpfunc)BPy_FrsMaterial_richcmpr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_FrsMaterial_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)FrsMaterial_init, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)FrsMaterial_repr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + (hashfunc)FrsMaterial_hash, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + FrsMaterial_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + (richcmpfunc)BPy_FrsMaterial_richcmpr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_FrsMaterial_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)FrsMaterial_init, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_FrsMaterial.h b/source/blender/freestyle/intern/python/BPy_FrsMaterial.h index 13a116d7ef2..084fcef9a62 100644 --- a/source/blender/freestyle/intern/python/BPy_FrsMaterial.h +++ b/source/blender/freestyle/intern/python/BPy_FrsMaterial.h @@ -26,8 +26,6 @@ extern "C" { #include "../scene_graph/FrsMaterial.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -41,7 +39,7 @@ extern PyTypeObject FrsMaterial_Type; /*---------------------------Python BPy_FrsMaterial structure definition----------*/ typedef struct { - PyObject_HEAD FrsMaterial *m; + PyObject_HEAD Freestyle::FrsMaterial *m; } BPy_FrsMaterial; /*---------------------------Python BPy_FrsMaterial visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_FrsNoise.cpp b/source/blender/freestyle/intern/python/BPy_FrsNoise.cpp index 943a9ca0e64..40127064875 100644 --- a/source/blender/freestyle/intern/python/BPy_FrsNoise.cpp +++ b/source/blender/freestyle/intern/python/BPy_FrsNoise.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -330,43 +332,39 @@ PyTypeObject FrsNoise_Type = { sizeof(BPy_FrsNoise), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)FrsNoise_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)FrsNoise_repr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - FrsNoise_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_FrsNoise_methods, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)FrsNoise_init, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)FrsNoise_repr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + FrsNoise_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_FrsNoise_methods, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)FrsNoise_init, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_FrsNoise.h b/source/blender/freestyle/intern/python/BPy_FrsNoise.h index 09bcc82ae94..0f8f2d3242c 100644 --- a/source/blender/freestyle/intern/python/BPy_FrsNoise.h +++ b/source/blender/freestyle/intern/python/BPy_FrsNoise.h @@ -27,8 +27,6 @@ extern "C" { #include "../geometry/Noise.h" #include "../system/PseudoNoise.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -41,8 +39,8 @@ extern PyTypeObject FrsNoise_Type; /*---------------------------Python BPy_FrsNoise structure definition----------*/ typedef struct { - PyObject_HEAD Noise *n; - PseudoNoise *pn; + PyObject_HEAD Freestyle::Noise *n; + Freestyle::PseudoNoise *pn; } BPy_FrsNoise; /*---------------------------Python BPy_FrsNoise visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_Id.cpp b/source/blender/freestyle/intern/python/BPy_Id.cpp index 323e76fe249..752bea16fb1 100644 --- a/source/blender/freestyle/intern/python/BPy_Id.cpp +++ b/source/blender/freestyle/intern/python/BPy_Id.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -167,15 +169,11 @@ static PyGetSetDef BPy_Id_getseters[] = { /*-----------------------BPy_Id type definition ------------------------------*/ PyTypeObject Id_Type = { - PyVarObject_HEAD_INIT(nullptr, 0) "Id", /* tp_name */ - sizeof(BPy_Id), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)Id_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif + PyVarObject_HEAD_INIT(nullptr, 0) "Id", /* tp_name */ + sizeof(BPy_Id), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)Id_dealloc, /* tp_dealloc */ + 0, /* tp_vectorcall_offset */ nullptr, /* tp_getattr */ nullptr, /* tp_setattr */ nullptr, /* tp_reserved */ diff --git a/source/blender/freestyle/intern/python/BPy_Id.h b/source/blender/freestyle/intern/python/BPy_Id.h index f5952297c66..51a70a391b1 100644 --- a/source/blender/freestyle/intern/python/BPy_Id.h +++ b/source/blender/freestyle/intern/python/BPy_Id.h @@ -26,12 +26,8 @@ extern "C" { #include -using namespace std; - #include "../system/Id.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -44,7 +40,7 @@ extern PyTypeObject Id_Type; /*---------------------------Python BPy_Id structure definition----------*/ typedef struct { - PyObject_HEAD Id *id; + PyObject_HEAD Freestyle::Id *id; } BPy_Id; /*---------------------------Python BPy_Id visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp b/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp index 25f3c54ea7d..2af019e8fe2 100644 --- a/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp +++ b/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp @@ -30,6 +30,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------ MODULE FUNCTIONS ---------------------------------- @@ -153,43 +155,39 @@ PyTypeObject IntegrationType_Type = { sizeof(PyLongObject), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - IntegrationType_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &PyLong_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - nullptr, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + IntegrationType_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &PyLong_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + nullptr, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /*-----------------------BPy_IntegrationType instance definitions -------------------------*/ diff --git a/source/blender/freestyle/intern/python/BPy_IntegrationType.h b/source/blender/freestyle/intern/python/BPy_IntegrationType.h index be815c6c95a..9176a504b24 100644 --- a/source/blender/freestyle/intern/python/BPy_IntegrationType.h +++ b/source/blender/freestyle/intern/python/BPy_IntegrationType.h @@ -26,8 +26,6 @@ extern "C" { #include "../view_map/Interface1D.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/freestyle/intern/python/BPy_Interface0D.cpp b/source/blender/freestyle/intern/python/BPy_Interface0D.cpp index 3d0c57d5509..9a86e61e623 100644 --- a/source/blender/freestyle/intern/python/BPy_Interface0D.cpp +++ b/source/blender/freestyle/intern/python/BPy_Interface0D.cpp @@ -34,6 +34,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -313,43 +315,39 @@ PyTypeObject Interface0D_Type = { sizeof(BPy_Interface0D), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)Interface0D_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)Interface0D_repr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Interface0D_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_Interface0D_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_Interface0D_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Interface0D_init, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)Interface0D_repr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Interface0D_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_Interface0D_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_Interface0D_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Interface0D_init, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_Interface0D.h b/source/blender/freestyle/intern/python/BPy_Interface0D.h index 7e41a8888e1..9734378f446 100644 --- a/source/blender/freestyle/intern/python/BPy_Interface0D.h +++ b/source/blender/freestyle/intern/python/BPy_Interface0D.h @@ -26,8 +26,6 @@ extern "C" { #include "../view_map/Interface0D.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -41,7 +39,7 @@ extern PyTypeObject Interface0D_Type; /*---------------------------Python BPy_Interface0D structure definition----------*/ typedef struct { - PyObject_HEAD Interface0D *if0D; + PyObject_HEAD Freestyle::Interface0D *if0D; bool borrowed; /* true if *if0D is a borrowed object */ } BPy_Interface0D; diff --git a/source/blender/freestyle/intern/python/BPy_Interface1D.cpp b/source/blender/freestyle/intern/python/BPy_Interface1D.cpp index 8a4a6eb61db..61884ee63e5 100644 --- a/source/blender/freestyle/intern/python/BPy_Interface1D.cpp +++ b/source/blender/freestyle/intern/python/BPy_Interface1D.cpp @@ -35,6 +35,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -341,43 +343,39 @@ PyTypeObject Interface1D_Type = { sizeof(BPy_Interface1D), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)Interface1D_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)Interface1D_repr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Interface1D_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_Interface1D_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_Interface1D_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Interface1D_init, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)Interface1D_repr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Interface1D_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_Interface1D_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_Interface1D_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Interface1D_init, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_Interface1D.h b/source/blender/freestyle/intern/python/BPy_Interface1D.h index 20a4af0b4d0..4ed562c24f7 100644 --- a/source/blender/freestyle/intern/python/BPy_Interface1D.h +++ b/source/blender/freestyle/intern/python/BPy_Interface1D.h @@ -26,8 +26,6 @@ extern "C" { #include "../view_map/Interface1D.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -41,7 +39,7 @@ extern PyTypeObject Interface1D_Type; /*---------------------------Python BPy_Interface1D structure definition----------*/ typedef struct { - PyObject_HEAD Interface1D *if1D; + PyObject_HEAD Freestyle::Interface1D *if1D; bool borrowed; /* true if *if1D is a borrowed object */ } BPy_Interface1D; diff --git a/source/blender/freestyle/intern/python/BPy_Iterator.cpp b/source/blender/freestyle/intern/python/BPy_Iterator.cpp index bee30aa9e8c..bc6d8032ea2 100644 --- a/source/blender/freestyle/intern/python/BPy_Iterator.cpp +++ b/source/blender/freestyle/intern/python/BPy_Iterator.cpp @@ -36,6 +36,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -228,43 +230,39 @@ PyTypeObject Iterator_Type = { sizeof(BPy_Iterator), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)Iterator_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)Iterator_repr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Iterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_Iterator_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_Iterator_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Iterator_init, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)Iterator_repr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Iterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_Iterator_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_Iterator_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Iterator_init, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_Iterator.h b/source/blender/freestyle/intern/python/BPy_Iterator.h index 5d1e8422976..7094384140f 100644 --- a/source/blender/freestyle/intern/python/BPy_Iterator.h +++ b/source/blender/freestyle/intern/python/BPy_Iterator.h @@ -26,8 +26,6 @@ extern "C" { #include "../system/Iterator.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -40,7 +38,7 @@ extern PyTypeObject Iterator_Type; /*---------------------------Python BPy_Iterator structure definition----------*/ typedef struct { - PyObject_HEAD Iterator *it; + PyObject_HEAD Freestyle::Iterator *it; } BPy_Iterator; /*---------------------------Python BPy_Iterator visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_MediumType.cpp b/source/blender/freestyle/intern/python/BPy_MediumType.cpp index 547f46839b8..d9d5e683c4f 100644 --- a/source/blender/freestyle/intern/python/BPy_MediumType.cpp +++ b/source/blender/freestyle/intern/python/BPy_MediumType.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*-----------------------BPy_MediumType type definition ------------------------------*/ @@ -45,43 +47,39 @@ PyTypeObject MediumType_Type = { sizeof(PyLongObject), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - MediumType_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &PyLong_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - nullptr, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + MediumType_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &PyLong_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + nullptr, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /*-----------------------BPy_IntegrationType instance definitions -------------------------*/ diff --git a/source/blender/freestyle/intern/python/BPy_MediumType.h b/source/blender/freestyle/intern/python/BPy_MediumType.h index 854f826291e..e34edc45f42 100644 --- a/source/blender/freestyle/intern/python/BPy_MediumType.h +++ b/source/blender/freestyle/intern/python/BPy_MediumType.h @@ -26,8 +26,6 @@ extern "C" { #include "../stroke/Stroke.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/freestyle/intern/python/BPy_Nature.cpp b/source/blender/freestyle/intern/python/BPy_Nature.cpp index b0a620803d1..45335f27619 100644 --- a/source/blender/freestyle/intern/python/BPy_Nature.cpp +++ b/source/blender/freestyle/intern/python/BPy_Nature.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// static PyObject *BPy_Nature_and(PyObject *a, PyObject *b); @@ -107,43 +109,39 @@ PyTypeObject Nature_Type = { sizeof(PyLongObject), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - &nature_as_number, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - Nature_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &PyLong_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - nullptr, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + &nature_as_number, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + Nature_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &PyLong_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + nullptr, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /*-----------------------BPy_Nature instance definitions ----------------------------------*/ diff --git a/source/blender/freestyle/intern/python/BPy_Nature.h b/source/blender/freestyle/intern/python/BPy_Nature.h index 48d15c8e796..a105db22b2a 100644 --- a/source/blender/freestyle/intern/python/BPy_Nature.h +++ b/source/blender/freestyle/intern/python/BPy_Nature.h @@ -26,8 +26,6 @@ extern "C" { #include "../winged_edge/Nature.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/freestyle/intern/python/BPy_Operators.cpp b/source/blender/freestyle/intern/python/BPy_Operators.cpp index d911e7db447..004fa118cf6 100644 --- a/source/blender/freestyle/intern/python/BPy_Operators.cpp +++ b/source/blender/freestyle/intern/python/BPy_Operators.cpp @@ -36,6 +36,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -770,43 +772,39 @@ PyTypeObject Operators_Type = { sizeof(BPy_Operators), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)Operators_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - Operators_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_Operators_methods, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - nullptr, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + Operators_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_Operators_methods, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + nullptr, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_Operators.h b/source/blender/freestyle/intern/python/BPy_Operators.h index 3b060d63f3c..9ed6bc2305d 100644 --- a/source/blender/freestyle/intern/python/BPy_Operators.h +++ b/source/blender/freestyle/intern/python/BPy_Operators.h @@ -26,8 +26,6 @@ extern "C" { #include "../stroke/Operators.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/freestyle/intern/python/BPy_SShape.cpp b/source/blender/freestyle/intern/python/BPy_SShape.cpp index ed83e76559f..0ea02d8a3f6 100644 --- a/source/blender/freestyle/intern/python/BPy_SShape.cpp +++ b/source/blender/freestyle/intern/python/BPy_SShape.cpp @@ -30,6 +30,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -199,7 +201,7 @@ static int SShape_name_set(BPy_SShape *self, PyObject *value, void *UNUSED(closu PyErr_SetString(PyExc_TypeError, "value must be a string"); return -1; } - const char *name = _PyUnicode_AsString(value); + const char *name = PyUnicode_AsUTF8(value); self->ss->setName(name); return 0; } @@ -281,43 +283,39 @@ PyTypeObject SShape_Type = { sizeof(BPy_SShape), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SShape_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)SShape_repr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - SShape_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_SShape_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_SShape_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)SShape_init, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)SShape_repr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + SShape_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_SShape_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_SShape_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)SShape_init, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_SShape.h b/source/blender/freestyle/intern/python/BPy_SShape.h index 9741a10f69e..a6fb090a537 100644 --- a/source/blender/freestyle/intern/python/BPy_SShape.h +++ b/source/blender/freestyle/intern/python/BPy_SShape.h @@ -26,8 +26,6 @@ extern "C" { #include "../view_map/Silhouette.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -40,7 +38,7 @@ extern PyTypeObject SShape_Type; /*---------------------------Python BPy_SShape structure definition----------*/ typedef struct { - PyObject_HEAD SShape *ss; + PyObject_HEAD Freestyle::SShape *ss; bool borrowed; /* true if *ss is a borrowed object */ } BPy_SShape; diff --git a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp index 8f706f56f7d..256fa5be290 100644 --- a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp +++ b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -677,43 +679,39 @@ PyTypeObject StrokeAttribute_Type = { sizeof(BPy_StrokeAttribute), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)StrokeAttribute_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)StrokeAttribute_repr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - StrokeAttribute_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_StrokeAttribute_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_StrokeAttribute_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)StrokeAttribute_init, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)StrokeAttribute_repr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + StrokeAttribute_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_StrokeAttribute_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_StrokeAttribute_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)StrokeAttribute_init, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.h b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.h index 9068eb4c7a3..9c0a7368dcb 100644 --- a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.h +++ b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.h @@ -26,8 +26,6 @@ extern "C" { #include "../stroke/Stroke.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -41,7 +39,7 @@ extern PyTypeObject StrokeAttribute_Type; /*---------------------------Python BPy_StrokeAttribute structure definition----------*/ typedef struct { - PyObject_HEAD StrokeAttribute *sa; + PyObject_HEAD Freestyle::StrokeAttribute *sa; bool borrowed; /* true if *sa is a borrowed reference */ } BPy_StrokeAttribute; diff --git a/source/blender/freestyle/intern/python/BPy_StrokeShader.cpp b/source/blender/freestyle/intern/python/BPy_StrokeShader.cpp index b55da256c22..9ce91b8a486 100644 --- a/source/blender/freestyle/intern/python/BPy_StrokeShader.cpp +++ b/source/blender/freestyle/intern/python/BPy_StrokeShader.cpp @@ -46,6 +46,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -282,43 +284,39 @@ PyTypeObject StrokeShader_Type = { sizeof(BPy_StrokeShader), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)StrokeShader___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)StrokeShader___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - StrokeShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_StrokeShader_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_StrokeShader_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)StrokeShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)StrokeShader___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + StrokeShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_StrokeShader_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_StrokeShader_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)StrokeShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_StrokeShader.h b/source/blender/freestyle/intern/python/BPy_StrokeShader.h index 04fff8e8052..74c5df52312 100644 --- a/source/blender/freestyle/intern/python/BPy_StrokeShader.h +++ b/source/blender/freestyle/intern/python/BPy_StrokeShader.h @@ -26,12 +26,8 @@ extern "C" { #include "../system/FreestyleConfig.h" -using namespace std; - #include "../stroke/StrokeShader.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -45,7 +41,7 @@ extern PyTypeObject StrokeShader_Type; /*---------------------------Python BPy_StrokeShader structure definition----------*/ typedef struct { - PyObject_HEAD StrokeShader *ss; + PyObject_HEAD Freestyle::StrokeShader *ss; } BPy_StrokeShader; /*---------------------------Python BPy_StrokeShader visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.cpp b/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.cpp index 78c93ddce31..1bc569860aa 100644 --- a/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.cpp +++ b/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.cpp @@ -35,6 +35,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -124,43 +126,39 @@ PyTypeObject UnaryFunction0D_Type = { sizeof(BPy_UnaryFunction0D), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0D___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0D___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryFunction0D_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - nullptr, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0D___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryFunction0D_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + nullptr, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.h b/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.h index 1319cabe94a..ef3021faf48 100644 --- a/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.h +++ b/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.h @@ -26,8 +26,6 @@ extern "C" { #include "../view_map/Functions0D.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.cpp b/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.cpp index 365850b748c..c11640aa136 100644 --- a/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.cpp +++ b/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.cpp @@ -33,6 +33,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -118,43 +120,39 @@ PyTypeObject UnaryFunction1D_Type = { sizeof(BPy_UnaryFunction1D), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction1D___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction1D___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryFunction1D_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - nullptr, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction1D___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryFunction1D_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + nullptr, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.h b/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.h index 331c3b4aaa1..4613d58c2b7 100644 --- a/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.h +++ b/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.h @@ -26,8 +26,6 @@ extern "C" { #include "../view_map/Functions1D.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.cpp b/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.cpp index e3076d4615f..cc9f666fbdd 100644 --- a/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.cpp +++ b/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -167,43 +169,39 @@ PyTypeObject UnaryPredicate0D_Type = { sizeof(BPy_UnaryPredicate0D), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryPredicate0D___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryPredicate0D___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryPredicate0D___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryPredicate0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryPredicate0D_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryPredicate0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryPredicate0D___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryPredicate0D___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryPredicate0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryPredicate0D_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryPredicate0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.h b/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.h index 2460b1f028b..3d45c2fc701 100644 --- a/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.h +++ b/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.h @@ -26,8 +26,6 @@ extern "C" { #include "../stroke/Predicates0D.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -41,7 +39,7 @@ extern PyTypeObject UnaryPredicate0D_Type; /*---------------------------Python BPy_UnaryPredicate0D structure definition----------*/ typedef struct { - PyObject_HEAD UnaryPredicate0D *up0D; + PyObject_HEAD Freestyle::UnaryPredicate0D *up0D; } BPy_UnaryPredicate0D; /*---------------------------Python BPy_UnaryPredicate0D visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.cpp b/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.cpp index 4b5269a1434..41c0acc088c 100644 --- a/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.cpp +++ b/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.cpp @@ -38,6 +38,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -225,43 +227,39 @@ PyTypeObject UnaryPredicate1D_Type = { sizeof(BPy_UnaryPredicate1D), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryPredicate1D___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryPredicate1D___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryPredicate1D___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryPredicate1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryPredicate1D_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryPredicate1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryPredicate1D___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryPredicate1D___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryPredicate1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryPredicate1D_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryPredicate1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.h b/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.h index 8fad7f94caf..0139ed8af77 100644 --- a/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.h +++ b/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.h @@ -26,8 +26,6 @@ extern "C" { #include "../stroke/Predicates1D.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -41,7 +39,7 @@ extern PyTypeObject UnaryPredicate1D_Type; /*---------------------------Python BPy_UnaryPredicate1D structure definition----------*/ typedef struct { - PyObject_HEAD UnaryPredicate1D *up1D; + PyObject_HEAD Freestyle::UnaryPredicate1D *up1D; } BPy_UnaryPredicate1D; /*---------------------------Python BPy_UnaryPredicate1D visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_ViewMap.cpp b/source/blender/freestyle/intern/python/BPy_ViewMap.cpp index 8565a95fc1a..269959a19c3 100644 --- a/source/blender/freestyle/intern/python/BPy_ViewMap.cpp +++ b/source/blender/freestyle/intern/python/BPy_ViewMap.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -184,43 +186,39 @@ PyTypeObject ViewMap_Type = { sizeof(BPy_ViewMap), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)ViewMap_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)ViewMap_repr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ViewMap_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_ViewMap_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_ViewMap_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ViewMap_init, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)ViewMap_repr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ViewMap_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_ViewMap_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_ViewMap_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ViewMap_init, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_ViewMap.h b/source/blender/freestyle/intern/python/BPy_ViewMap.h index 59738b6dce9..2222b327dc2 100644 --- a/source/blender/freestyle/intern/python/BPy_ViewMap.h +++ b/source/blender/freestyle/intern/python/BPy_ViewMap.h @@ -26,8 +26,6 @@ extern "C" { #include "../view_map/ViewMap.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -40,7 +38,7 @@ extern PyTypeObject ViewMap_Type; /*---------------------------Python BPy_ViewMap structure definition----------*/ typedef struct { - PyObject_HEAD ViewMap *vm; + PyObject_HEAD Freestyle::ViewMap *vm; } BPy_ViewMap; /*---------------------------Python BPy_ViewMap visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_ViewShape.cpp b/source/blender/freestyle/intern/python/BPy_ViewShape.cpp index 6c8551867fd..dd9d169dac2 100644 --- a/source/blender/freestyle/intern/python/BPy_ViewShape.cpp +++ b/source/blender/freestyle/intern/python/BPy_ViewShape.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -352,43 +354,39 @@ PyTypeObject ViewShape_Type = { sizeof(BPy_ViewShape), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)ViewShape_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)ViewShape_repr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ViewShape_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_ViewShape_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_ViewShape_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ViewShape_init, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)ViewShape_repr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ViewShape_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_ViewShape_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_ViewShape_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ViewShape_init, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_ViewShape.h b/source/blender/freestyle/intern/python/BPy_ViewShape.h index bd51fd0d5cb..8401c4378f0 100644 --- a/source/blender/freestyle/intern/python/BPy_ViewShape.h +++ b/source/blender/freestyle/intern/python/BPy_ViewShape.h @@ -26,8 +26,6 @@ extern "C" { #include "../view_map/ViewMap.h" -using namespace Freestyle; - #include "BPy_SShape.h" #ifdef __cplusplus @@ -42,7 +40,7 @@ extern PyTypeObject ViewShape_Type; /*---------------------------Python BPy_ViewShape structure definition----------*/ typedef struct { - PyObject_HEAD ViewShape *vs; + PyObject_HEAD Freestyle::ViewShape *vs; bool borrowed; /* true if *vs a borrowed object */ BPy_SShape *py_ss; } BPy_ViewShape; diff --git a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_FalseBP1D.cpp b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_FalseBP1D.cpp index e284f28cd0b..ed09025a45e 100644 --- a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_FalseBP1D.cpp +++ b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_FalseBP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -59,43 +61,39 @@ PyTypeObject FalseBP1D_Type = { sizeof(BPy_FalseBP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - FalseBP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &BinaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)FalseBP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + FalseBP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &BinaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)FalseBP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_Length2DBP1D.cpp b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_Length2DBP1D.cpp index 2c84f69dd6e..9d4f0693af9 100644 --- a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_Length2DBP1D.cpp +++ b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_Length2DBP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -61,43 +63,39 @@ PyTypeObject Length2DBP1D_Type = { sizeof(BPy_Length2DBP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Length2DBP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &BinaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Length2DBP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Length2DBP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &BinaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Length2DBP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_SameShapeIdBP1D.cpp b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_SameShapeIdBP1D.cpp index ab79ae4e209..372d250c628 100644 --- a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_SameShapeIdBP1D.cpp +++ b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_SameShapeIdBP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -60,43 +62,39 @@ PyTypeObject SameShapeIdBP1D_Type = { sizeof(BPy_SameShapeIdBP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - SameShapeIdBP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &BinaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)SameShapeIdBP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + SameShapeIdBP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &BinaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)SameShapeIdBP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_TrueBP1D.cpp b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_TrueBP1D.cpp index 47c3c6b53aa..04bd36738d1 100644 --- a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_TrueBP1D.cpp +++ b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_TrueBP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -60,43 +62,39 @@ PyTypeObject TrueBP1D_Type = { sizeof(BPy_TrueBP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - TrueBP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &BinaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)TrueBP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + TrueBP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &BinaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)TrueBP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_ViewMapGradientNormBP1D.cpp b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_ViewMapGradientNormBP1D.cpp index 9d69b1c902c..337d0fa3020 100644 --- a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_ViewMapGradientNormBP1D.cpp +++ b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_ViewMapGradientNormBP1D.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -90,43 +92,39 @@ PyTypeObject ViewMapGradientNormBP1D_Type = { sizeof(BPy_ViewMapGradientNormBP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ViewMapGradientNormBP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &BinaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ViewMapGradientNormBP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ViewMapGradientNormBP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &BinaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ViewMapGradientNormBP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Director.cpp b/source/blender/freestyle/intern/python/Director.cpp index ff1d63f5f58..4dd3f732be9 100644 --- a/source/blender/freestyle/intern/python/Director.cpp +++ b/source/blender/freestyle/intern/python/Director.cpp @@ -56,6 +56,8 @@ #include "UnaryFunction1D/BPy_UnaryFunction1DVec3f.h" #include "UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.h" +using namespace Freestyle; + // BinaryPredicate0D: __call__ int Director_BPy_BinaryPredicate0D___call__(BinaryPredicate0D *bp0D, Interface0D &i1, diff --git a/source/blender/freestyle/intern/python/Director.h b/source/blender/freestyle/intern/python/Director.h index 468150524f1..0894911fe14 100644 --- a/source/blender/freestyle/intern/python/Director.h +++ b/source/blender/freestyle/intern/python/Director.h @@ -34,31 +34,34 @@ class Stroke; class StrokeShader; } // namespace Freestyle -using namespace Freestyle; - // BinaryPredicate0D: __call__ -int Director_BPy_BinaryPredicate0D___call__(BinaryPredicate0D *bp0D, - Interface0D &i1, - Interface0D &i2); +int Director_BPy_BinaryPredicate0D___call__(Freestyle::BinaryPredicate0D *bp0D, + Freestyle::Interface0D &i1, + Freestyle::Interface0D &i2); // BinaryPredicate1D: __call__ -int Director_BPy_BinaryPredicate1D___call__(BinaryPredicate1D *bp1D, - Interface1D &i1, - Interface1D &i2); +int Director_BPy_BinaryPredicate1D___call__(Freestyle::BinaryPredicate1D *bp1D, + Freestyle::Interface1D &i1, + Freestyle::Interface1D &i2); // UnaryFunction{0D,1D}: __call__ -int Director_BPy_UnaryFunction0D___call__(void *uf0D, void *py_uf0D, Interface0DIterator &if0D_it); -int Director_BPy_UnaryFunction1D___call__(void *uf1D, void *py_uf1D, Interface1D &if1D); +int Director_BPy_UnaryFunction0D___call__(void *uf0D, + void *py_uf0D, + Freestyle::Interface0DIterator &if0D_it); +int Director_BPy_UnaryFunction1D___call__(void *uf1D, void *py_uf1D, Freestyle::Interface1D &if1D); // UnaryPredicate0D: __call__ -int Director_BPy_UnaryPredicate0D___call__(UnaryPredicate0D *up0D, Interface0DIterator &if0D_it); +int Director_BPy_UnaryPredicate0D___call__(Freestyle::UnaryPredicate0D *up0D, + Freestyle::Interface0DIterator &if0D_it); // UnaryPredicate1D: __call__ -int Director_BPy_UnaryPredicate1D___call__(UnaryPredicate1D *up1D, Interface1D &if1D); +int Director_BPy_UnaryPredicate1D___call__(Freestyle::UnaryPredicate1D *up1D, + Freestyle::Interface1D &if1D); // StrokeShader: shade -int Director_BPy_StrokeShader_shade(StrokeShader *ss, Stroke &s); +int Director_BPy_StrokeShader_shade(Freestyle::StrokeShader *ss, Freestyle::Stroke &s); // ChainingIterator: init, traverse -int Director_BPy_ChainingIterator_init(ChainingIterator *c_it); -int Director_BPy_ChainingIterator_traverse(ChainingIterator *c_it, AdjacencyIterator &a_it); +int Director_BPy_ChainingIterator_init(Freestyle::ChainingIterator *c_it); +int Director_BPy_ChainingIterator_traverse(Freestyle::ChainingIterator *c_it, + Freestyle::AdjacencyIterator &a_it); diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.cpp b/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.cpp index f70f70275df..2367c3f9cb5 100644 --- a/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.cpp +++ b/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------CurvePoint methods----------------------------*/ @@ -242,43 +244,39 @@ PyTypeObject CurvePoint_Type = { sizeof(BPy_CurvePoint), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - CurvePoint_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_CurvePoint_getseters, /* tp_getset */ - &Interface0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)CurvePoint_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + CurvePoint_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_CurvePoint_getseters, /* tp_getset */ + &Interface0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)CurvePoint_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.h b/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.h index 6a550085817..0def155d22b 100644 --- a/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.h +++ b/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.h @@ -37,7 +37,7 @@ extern PyTypeObject CurvePoint_Type; /*---------------------------Python BPy_CurvePoint structure definition----------*/ typedef struct { BPy_Interface0D py_if0D; - CurvePoint *cp; + Freestyle::CurvePoint *cp; } BPy_CurvePoint; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp index b245ecd81f1..4f1b57915b2 100644 --- a/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp +++ b/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------SVertex methods ----------------------------*/ @@ -455,43 +457,39 @@ PyTypeObject SVertex_Type = { sizeof(BPy_SVertex), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - SVertex_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_SVertex_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_SVertex_getseters, /* tp_getset */ - &Interface0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)SVertex_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + SVertex_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_SVertex_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_SVertex_getseters, /* tp_getset */ + &Interface0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)SVertex_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.h b/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.h index 8d24576a98f..d2fa48d17d8 100644 --- a/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.h +++ b/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.h @@ -37,7 +37,7 @@ extern PyTypeObject SVertex_Type; /*---------------------------Python BPy_SVertex structure definition----------*/ typedef struct { BPy_Interface0D py_if0D; - SVertex *sv; + Freestyle::SVertex *sv; } BPy_SVertex; /*---------------------------Python BPy_SVertex visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.cpp index 696b3022e85..600ee37aa55 100644 --- a/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.cpp +++ b/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------ViewVertex methods----------------------------*/ @@ -164,43 +166,39 @@ PyTypeObject ViewVertex_Type = { sizeof(BPy_ViewVertex), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ViewVertex_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_ViewVertex_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_ViewVertex_getseters, /* tp_getset */ - &Interface0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ViewVertex_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ViewVertex_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_ViewVertex_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_ViewVertex_getseters, /* tp_getset */ + &Interface0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ViewVertex_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.h b/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.h index cb9815fb3d4..b5881dcafb5 100644 --- a/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.h +++ b/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.h @@ -37,7 +37,7 @@ extern PyTypeObject ViewVertex_Type; /*---------------------------Python BPy_ViewVertex structure definition----------*/ typedef struct { BPy_Interface0D py_if0D; - ViewVertex *vv; + Freestyle::ViewVertex *vv; } BPy_ViewVertex; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp index 5e63e190356..79e537d48c0 100644 --- a/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp +++ b/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -361,43 +363,39 @@ PyTypeObject StrokeVertex_Type = { sizeof(BPy_StrokeVertex), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - StrokeVertex_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_StrokeVertex_getseters, /* tp_getset */ - &CurvePoint_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)StrokeVertex_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + StrokeVertex_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_StrokeVertex_getseters, /* tp_getset */ + &CurvePoint_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)StrokeVertex_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.h b/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.h index 44da0ed212a..d635a8541db 100644 --- a/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.h +++ b/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.h @@ -38,7 +38,7 @@ extern PyTypeObject StrokeVertex_Type; /*---------------------------Python BPy_StrokeVertex structure definition----------*/ typedef struct { BPy_CurvePoint py_cp; - StrokeVertex *sv; + Freestyle::StrokeVertex *sv; } BPy_StrokeVertex; /*---------------------------Python BPy_StrokeVertex visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.cpp index ed10f3e0af5..7b782b513b6 100644 --- a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.cpp +++ b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------NonTVertex methods ----------------------------*/ @@ -109,43 +111,39 @@ PyTypeObject NonTVertex_Type = { sizeof(BPy_NonTVertex), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - NonTVertex_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_NonTVertex_getseters, /* tp_getset */ - &ViewVertex_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)NonTVertex_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + NonTVertex_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_NonTVertex_getseters, /* tp_getset */ + &ViewVertex_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)NonTVertex_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.h b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.h index 43f2c2b4a5c..6d84533aa6b 100644 --- a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.h +++ b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.h @@ -37,7 +37,7 @@ extern PyTypeObject NonTVertex_Type; /*---------------------------Python BPy_NonTVertex structure definition----------*/ typedef struct { BPy_ViewVertex py_vv; - NonTVertex *ntv; + Freestyle::NonTVertex *ntv; } BPy_NonTVertex; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.cpp index 596eec7a4e5..eecede4f1f3 100644 --- a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.cpp +++ b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.cpp @@ -30,6 +30,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------TVertex methods ----------------------------*/ @@ -219,43 +221,39 @@ PyTypeObject TVertex_Type = { sizeof(BPy_TVertex), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - TVertex_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_TVertex_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_TVertex_getseters, /* tp_getset */ - &ViewVertex_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)TVertex_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + TVertex_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_TVertex_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_TVertex_getseters, /* tp_getset */ + &ViewVertex_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)TVertex_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.h b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.h index 253934bb4e7..009ba24d1e8 100644 --- a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.h +++ b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.h @@ -37,7 +37,7 @@ extern PyTypeObject TVertex_Type; /*---------------------------Python BPy_TVertex structure definition----------*/ typedef struct { BPy_ViewVertex py_vv; - TVertex *tv; + Freestyle::TVertex *tv; } BPy_TVertex; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.cpp b/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.cpp index 0438abfd38c..e8f80f515df 100644 --- a/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.cpp @@ -30,6 +30,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------FEdge methods ----------------------------*/ @@ -358,43 +360,39 @@ PyTypeObject FEdge_Type = { sizeof(BPy_FEdge), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - &BPy_FEdge_as_sequence, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - FEdge_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_FEdge_getseters, /* tp_getset */ - &Interface1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)FEdge_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + &BPy_FEdge_as_sequence, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + FEdge_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_FEdge_getseters, /* tp_getset */ + &Interface1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)FEdge_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.h b/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.h index 25b1bc99860..3c259d77a44 100644 --- a/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.h +++ b/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.h @@ -37,7 +37,7 @@ extern PyTypeObject FEdge_Type; /*---------------------------Python BPy_FEdge structure definition----------*/ typedef struct { BPy_Interface1D py_if1D; - FEdge *fe; + Freestyle::FEdge *fe; } BPy_FEdge; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.cpp b/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.cpp index d77a8007b1a..bf7feb7be27 100644 --- a/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------CurvePoint methods ----------------------------*/ @@ -190,43 +192,39 @@ PyTypeObject FrsCurve_Type = { sizeof(BPy_FrsCurve), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - FrsCurve_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_FrsCurve_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_FrsCurve_getseters, /* tp_getset */ - &Interface1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)FrsCurve_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + FrsCurve_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_FrsCurve_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_FrsCurve_getseters, /* tp_getset */ + &Interface1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)FrsCurve_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.h b/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.h index 9bdc3919a38..be3e98edefe 100644 --- a/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.h +++ b/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.h @@ -37,7 +37,7 @@ extern PyTypeObject FrsCurve_Type; /*---------------------------Python BPy_FrsCurve structure definition----------*/ typedef struct { BPy_Interface1D py_if1D; - Curve *c; + Freestyle::Curve *c; } BPy_FrsCurve; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.cpp b/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.cpp index 90cc3e4f1ab..8df40087f9b 100644 --- a/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.cpp @@ -31,6 +31,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------Stroke methods ----------------------------*/ @@ -501,43 +503,39 @@ PyTypeObject Stroke_Type = { sizeof(BPy_Stroke), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - &BPy_Stroke_as_sequence, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Stroke_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - (getiterfunc)Stroke_iter, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_Stroke_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_Stroke_getseters, /* tp_getset */ - &Interface1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Stroke_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + &BPy_Stroke_as_sequence, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Stroke_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + (getiterfunc)Stroke_iter, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_Stroke_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_Stroke_getseters, /* tp_getset */ + &Interface1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Stroke_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.h b/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.h index 33c6aa70f91..eb919b4a376 100644 --- a/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.h +++ b/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.h @@ -37,7 +37,7 @@ extern PyTypeObject Stroke_Type; /*---------------------------Python BPy_Stroke structure definition----------*/ typedef struct { BPy_Interface1D py_if1D; - Stroke *s; + Freestyle::Stroke *s; } BPy_Stroke; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.cpp b/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.cpp index c416d860c77..eee5dc095a6 100644 --- a/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.cpp @@ -32,6 +32,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------ViewEdge methods ----------------------------*/ @@ -386,43 +388,39 @@ PyTypeObject ViewEdge_Type = { sizeof(BPy_ViewEdge), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ViewEdge_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_ViewEdge_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_ViewEdge_getseters, /* tp_getset */ - &Interface1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ViewEdge_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ViewEdge_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_ViewEdge_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_ViewEdge_getseters, /* tp_getset */ + &Interface1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ViewEdge_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.h b/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.h index 519081cedbd..ffcdb46cff6 100644 --- a/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.h +++ b/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.h @@ -37,7 +37,7 @@ extern PyTypeObject ViewEdge_Type; /*---------------------------Python BPy_ViewEdge structure definition----------*/ typedef struct { BPy_Interface1D py_if1D; - ViewEdge *ve; + Freestyle::ViewEdge *ve; } BPy_ViewEdge; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.cpp b/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.cpp index dcf6c149b7d..5de2f435469 100644 --- a/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------Chain methods ----------------------------*/ @@ -150,43 +152,39 @@ PyTypeObject Chain_Type = { sizeof(BPy_Chain), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Chain_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_Chain_methods, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &FrsCurve_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Chain_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Chain_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_Chain_methods, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &FrsCurve_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Chain_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.h b/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.h index 73da253688c..279a9cdc945 100644 --- a/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.h +++ b/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.h @@ -37,7 +37,7 @@ extern PyTypeObject Chain_Type; /*---------------------------Python BPy_Chain structure definition----------*/ typedef struct { BPy_FrsCurve py_c; - Chain *c; + Freestyle::Chain *c; } BPy_Chain; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp index 454a2bb1c0f..538e5d3bf85 100644 --- a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------FEdgeSharp methods ----------------------------*/ @@ -408,43 +410,39 @@ PyTypeObject FEdgeSharp_Type = { sizeof(BPy_FEdgeSharp), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - FEdgeSharp_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_FEdgeSharp_getseters, /* tp_getset */ - &FEdge_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)FEdgeSharp_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + FEdgeSharp_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_FEdgeSharp_getseters, /* tp_getset */ + &FEdge_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)FEdgeSharp_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.h b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.h index 2b8b09a5990..c3d0298bc5c 100644 --- a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.h +++ b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.h @@ -37,7 +37,7 @@ extern PyTypeObject FEdgeSharp_Type; /*---------------------------Python BPy_FEdgeSharp structure definition----------*/ typedef struct { BPy_FEdge py_fe; - FEdgeSharp *fes; + Freestyle::FEdgeSharp *fes; } BPy_FEdgeSharp; /*---------------------------Python BPy_FEdgeSharp visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp index c0d56ec949c..8f244fb203d 100644 --- a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------FEdgeSmooth methods ----------------------------*/ @@ -253,43 +255,39 @@ PyTypeObject FEdgeSmooth_Type = { sizeof(BPy_FEdgeSmooth), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - FEdgeSmooth_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_FEdgeSmooth_getseters, /* tp_getset */ - &FEdge_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)FEdgeSmooth_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + FEdgeSmooth_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_FEdgeSmooth_getseters, /* tp_getset */ + &FEdge_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)FEdgeSmooth_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.h b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.h index 97497281310..d8ddd6c573f 100644 --- a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.h +++ b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.h @@ -38,7 +38,7 @@ extern PyTypeObject FEdgeSmooth_Type; /*---------------------------Python BPy_FEdgeSmooth structure definition----------*/ typedef struct { BPy_FEdge py_fe; - FEdgeSmooth *fes; + Freestyle::FEdgeSmooth *fes; } BPy_FEdgeSmooth; /*---------------------------Python BPy_FEdgeSmooth visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp index 9f5f8d07e26..6945e3f2b51 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -186,43 +188,39 @@ PyTypeObject AdjacencyIterator_Type = { sizeof(BPy_AdjacencyIterator), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - AdjacencyIterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - (getiterfunc)AdjacencyIterator_iter, /* tp_iter */ - (iternextfunc)AdjacencyIterator_iternext, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_AdjacencyIterator_getseters, /* tp_getset */ - &Iterator_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)AdjacencyIterator_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + AdjacencyIterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + (getiterfunc)AdjacencyIterator_iter, /* tp_iter */ + (iternextfunc)AdjacencyIterator_iternext, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_AdjacencyIterator_getseters, /* tp_getset */ + &Iterator_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)AdjacencyIterator_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h index e5332e0d180..1de73dad015 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h @@ -38,7 +38,7 @@ extern PyTypeObject AdjacencyIterator_Type; /*---------------------------Python BPy_AdjacencyIterator structure definition----------*/ typedef struct { BPy_Iterator py_it; - AdjacencyIterator *a_it; + Freestyle::AdjacencyIterator *a_it; bool at_start; } BPy_AdjacencyIterator; diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.cpp index e4cd1cd073b..94d8952ef42 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -167,43 +169,39 @@ PyTypeObject ChainPredicateIterator_Type = { sizeof(BPy_ChainPredicateIterator), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)ChainPredicateIterator_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ChainPredicateIterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &ChainingIterator_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ChainPredicateIterator_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ChainPredicateIterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &ChainingIterator_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ChainPredicateIterator_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.h index ece8018d285..ae6f7307e3c 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.h @@ -38,7 +38,7 @@ extern PyTypeObject ChainPredicateIterator_Type; /*---------------------------Python BPy_ChainPredicateIterator structure definition----------*/ typedef struct { BPy_ChainingIterator py_c_it; - ChainPredicateIterator *cp_it; + Freestyle::ChainPredicateIterator *cp_it; PyObject *upred; PyObject *bpred; } BPy_ChainPredicateIterator; diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.cpp index 9aa8984f4af..36c251bb916 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -121,43 +123,39 @@ PyTypeObject ChainSilhouetteIterator_Type = { sizeof(BPy_ChainSilhouetteIterator), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ChainSilhouetteIterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &ChainingIterator_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ChainSilhouetteIterator_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ChainSilhouetteIterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &ChainingIterator_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ChainSilhouetteIterator_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.h index f91d0fb2585..7eb5ca8d70c 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.h @@ -38,7 +38,7 @@ extern PyTypeObject ChainSilhouetteIterator_Type; /*---------------------------Python BPy_ChainSilhouetteIterator structure definition----------*/ typedef struct { BPy_ChainingIterator py_c_it; - ChainSilhouetteIterator *cs_it; + Freestyle::ChainSilhouetteIterator *cs_it; } BPy_ChainSilhouetteIterator; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.cpp index f2441fa9d18..10b3ccdc496 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -255,43 +257,39 @@ PyTypeObject ChainingIterator_Type = { sizeof(BPy_ChainingIterator), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ChainingIterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_ChainingIterator_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_ChainingIterator_getseters, /* tp_getset */ - &ViewEdgeIterator_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ChainingIterator___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ChainingIterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_ChainingIterator_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_ChainingIterator_getseters, /* tp_getset */ + &ViewEdgeIterator_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ChainingIterator___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.h index e950824764c..54fd6e08f05 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.h @@ -38,7 +38,7 @@ extern PyTypeObject ChainingIterator_Type; /*---------------------------Python BPy_ChainingIterator structure definition----------*/ typedef struct { BPy_ViewEdgeIterator py_ve_it; - ChainingIterator *c_it; + Freestyle::ChainingIterator *c_it; } BPy_ChainingIterator; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.cpp index ff710e931d4..4c93b8337cf 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -135,43 +137,39 @@ PyTypeObject CurvePointIterator_Type = { sizeof(BPy_CurvePointIterator), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - CurvePointIterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_CurvePointIterator_getseters, /* tp_getset */ - &Iterator_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)CurvePointIterator_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + CurvePointIterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_CurvePointIterator_getseters, /* tp_getset */ + &Iterator_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)CurvePointIterator_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.h index db36bf386ec..2de21178e95 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.h @@ -38,7 +38,7 @@ extern PyTypeObject CurvePointIterator_Type; /*---------------------------Python BPy_CurvePointIterator structure definition----------*/ typedef struct { BPy_Iterator py_it; - CurveInternal::CurvePointIterator *cp_it; + Freestyle::CurveInternal::CurvePointIterator *cp_it; } BPy_CurvePointIterator; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp index d0de53fa424..2ac3857375a 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -210,43 +212,39 @@ PyTypeObject Interface0DIterator_Type = { sizeof(BPy_Interface0DIterator), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Interface0DIterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - (getiterfunc)Interface0DIterator_iter, /* tp_iter */ - (iternextfunc)Interface0DIterator_iternext, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_Interface0DIterator_getseters, /* tp_getset */ - &Iterator_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Interface0DIterator_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Interface0DIterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + (getiterfunc)Interface0DIterator_iter, /* tp_iter */ + (iternextfunc)Interface0DIterator_iternext, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_Interface0DIterator_getseters, /* tp_getset */ + &Iterator_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Interface0DIterator_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h index 663193bedee..82e44218634 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h @@ -38,7 +38,7 @@ extern PyTypeObject Interface0DIterator_Type; /*---------------------------Python BPy_Interface0DIterator structure definition----------*/ typedef struct { BPy_Iterator py_it; - Interface0DIterator *if0D_it; + Freestyle::Interface0DIterator *if0D_it; bool reversed; bool at_start; } BPy_Interface0DIterator; diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.cpp index c0db79858b7..ffb90281442 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -162,43 +164,39 @@ PyTypeObject SVertexIterator_Type = { sizeof(BPy_SVertexIterator), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - SVertexIterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_SVertexIterator_getseters, /* tp_getset */ - &Iterator_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)SVertexIterator_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + SVertexIterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_SVertexIterator_getseters, /* tp_getset */ + &Iterator_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)SVertexIterator_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.h index a34dc7a63c5..c7b18db8e48 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.h @@ -38,7 +38,7 @@ extern PyTypeObject SVertexIterator_Type; /*---------------------------Python BPy_SVertexIterator structure definition----------*/ typedef struct { BPy_Iterator py_it; - ViewEdgeInternal::SVertexIterator *sv_it; + Freestyle::ViewEdgeInternal::SVertexIterator *sv_it; } BPy_SVertexIterator; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp index ceb0d2a7546..f94ab4d3b8f 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -293,43 +295,39 @@ PyTypeObject StrokeVertexIterator_Type = { sizeof(BPy_StrokeVertexIterator), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - StrokeVertexIterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - (getiterfunc)StrokeVertexIterator_iter, /* tp_iter */ - (iternextfunc)StrokeVertexIterator_iternext, /* tp_iternext */ - BPy_StrokeVertexIterator_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_StrokeVertexIterator_getseters, /* tp_getset */ - &Iterator_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)StrokeVertexIterator_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + StrokeVertexIterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + (getiterfunc)StrokeVertexIterator_iter, /* tp_iter */ + (iternextfunc)StrokeVertexIterator_iternext, /* tp_iternext */ + BPy_StrokeVertexIterator_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_StrokeVertexIterator_getseters, /* tp_getset */ + &Iterator_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)StrokeVertexIterator_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.h index 629471a664c..d7ad3d99a54 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.h @@ -38,7 +38,7 @@ extern PyTypeObject StrokeVertexIterator_Type; /*---------------------------Python BPy_StrokeVertexIterator structure definition----------*/ typedef struct { BPy_Iterator py_it; - StrokeInternal::StrokeVertexIterator *sv_it; + Freestyle::StrokeInternal::StrokeVertexIterator *sv_it; bool reversed; /* attribute to make next() work correctly */ bool at_start; diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.cpp index e01bbe928ce..c878178f9ca 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -240,43 +242,39 @@ PyTypeObject ViewEdgeIterator_Type = { sizeof(BPy_ViewEdgeIterator), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ViewEdgeIterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_ViewEdgeIterator_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_ViewEdgeIterator_getseters, /* tp_getset */ - &Iterator_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ViewEdgeIterator_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ViewEdgeIterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_ViewEdgeIterator_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_ViewEdgeIterator_getseters, /* tp_getset */ + &Iterator_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ViewEdgeIterator_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.h index 7169a13f328..782f20c8884 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.h @@ -38,7 +38,7 @@ extern PyTypeObject ViewEdgeIterator_Type; /*---------------------------Python BPy_ViewEdgeIterator structure definition----------*/ typedef struct { BPy_Iterator py_it; - ViewEdgeInternal::ViewEdgeIterator *ve_it; + Freestyle::ViewEdgeInternal::ViewEdgeIterator *ve_it; } BPy_ViewEdgeIterator; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp index 735746e33be..5da124ce40a 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -144,43 +146,39 @@ PyTypeObject orientedViewEdgeIterator_Type = { sizeof(BPy_orientedViewEdgeIterator), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - orientedViewEdgeIterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - (getiterfunc)orientedViewEdgeIterator_iter, /* tp_iter */ - (iternextfunc)orientedViewEdgeIterator_iternext, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_orientedViewEdgeIterator_getseters, /* tp_getset */ - &Iterator_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)orientedViewEdgeIterator_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + orientedViewEdgeIterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + (getiterfunc)orientedViewEdgeIterator_iter, /* tp_iter */ + (iternextfunc)orientedViewEdgeIterator_iternext, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_orientedViewEdgeIterator_getseters, /* tp_getset */ + &Iterator_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)orientedViewEdgeIterator_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.h index 7a13f6d2c72..c6b1a123324 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.h @@ -38,7 +38,7 @@ extern PyTypeObject orientedViewEdgeIterator_Type; /*---------------------------Python BPy_orientedViewEdgeIterator structure definition----------*/ typedef struct { BPy_Iterator py_it; - ViewVertexInternal::orientedViewEdgeIterator *ove_it; + Freestyle::ViewVertexInternal::orientedViewEdgeIterator *ove_it; bool reversed; bool at_start; } BPy_orientedViewEdgeIterator; diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_BackboneStretcherShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_BackboneStretcherShader.cpp index c3b98d12918..2171b7bb2b9 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_BackboneStretcherShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_BackboneStretcherShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -71,43 +73,39 @@ PyTypeObject BackboneStretcherShader_Type = { sizeof(BPy_BackboneStretcherShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - BackboneStretcherShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)BackboneStretcherShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + BackboneStretcherShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)BackboneStretcherShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_BezierCurveShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_BezierCurveShader.cpp index 50fc9938a87..69f1814e38e 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_BezierCurveShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_BezierCurveShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -71,43 +73,39 @@ PyTypeObject BezierCurveShader_Type = { sizeof(BPy_BezierCurveShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - BezierCurveShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)BezierCurveShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + BezierCurveShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)BezierCurveShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_BlenderTextureShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_BlenderTextureShader.cpp index e1198266a98..06785ca5617 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_BlenderTextureShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_BlenderTextureShader.cpp @@ -28,6 +28,8 @@ extern "C" { #include "../../../../python/generic/py_capi_utils.h" +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -91,43 +93,39 @@ PyTypeObject BlenderTextureShader_Type = { sizeof(BPy_BlenderTextureShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - BlenderTextureShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)BlenderTextureShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + BlenderTextureShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)BlenderTextureShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp index e8790df2dd0..a5aa5e188ff 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -89,43 +91,39 @@ PyTypeObject CalligraphicShader_Type = { sizeof(BPy_CalligraphicShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - CalligraphicShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)CalligraphicShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + CalligraphicShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)CalligraphicShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_ColorNoiseShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_ColorNoiseShader.cpp index 8fb6e26d8d7..2642f109acf 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_ColorNoiseShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_ColorNoiseShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -70,43 +72,39 @@ PyTypeObject ColorNoiseShader_Type = { sizeof(BPy_ColorNoiseShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ColorNoiseShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ColorNoiseShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ColorNoiseShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ColorNoiseShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantColorShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantColorShader.cpp index 2b108226e90..a1e20542acf 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantColorShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantColorShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -76,43 +78,39 @@ PyTypeObject ConstantColorShader_Type = { sizeof(BPy_ConstantColorShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ConstantColorShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ConstantColorShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ConstantColorShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ConstantColorShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantThicknessShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantThicknessShader.cpp index 0174107f27f..6e338a5f6be 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantThicknessShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantThicknessShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -70,43 +72,39 @@ PyTypeObject ConstantThicknessShader_Type = { sizeof(BPy_ConstantThicknessShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ConstantThicknessShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ConstantThicknessShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ConstantThicknessShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ConstantThicknessShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstrainedIncreasingThicknessShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstrainedIncreasingThicknessShader.cpp index b5c200c17b1..db4b6df6cb4 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstrainedIncreasingThicknessShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstrainedIncreasingThicknessShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -76,11 +78,7 @@ PyTypeObject ConstrainedIncreasingThicknessShader_Type = { sizeof(BPy_ConstrainedIncreasingThicknessShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif + 0, /* tp_vectorcall_offset */ nullptr, /* tp_getattr */ nullptr, /* tp_setattr */ nullptr, /* tp_reserved */ diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_GuidingLinesShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_GuidingLinesShader.cpp index d1c3219b079..7365c369fb3 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_GuidingLinesShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_GuidingLinesShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -78,43 +80,39 @@ PyTypeObject GuidingLinesShader_Type = { sizeof(BPy_GuidingLinesShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GuidingLinesShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GuidingLinesShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GuidingLinesShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GuidingLinesShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingColorShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingColorShader.cpp index 7d1efebe71f..d6f33c3a295 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingColorShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingColorShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -98,43 +100,39 @@ PyTypeObject IncreasingColorShader_Type = { sizeof(BPy_IncreasingColorShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - IncreasingColorShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)IncreasingColorShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + IncreasingColorShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)IncreasingColorShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingThicknessShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingThicknessShader.cpp index f13930bd4b3..296d3fb0713 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingThicknessShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingThicknessShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -76,43 +78,39 @@ PyTypeObject IncreasingThicknessShader_Type = { sizeof(BPy_IncreasingThicknessShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - IncreasingThicknessShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)IncreasingThicknessShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + IncreasingThicknessShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)IncreasingThicknessShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_PolygonalizationShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_PolygonalizationShader.cpp index 48c63554f06..68c14e1151c 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_PolygonalizationShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_PolygonalizationShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -41,7 +43,7 @@ static char PolygonalizationShader___doc__[] = "\n" " :arg error: The error we want our polygonal approximation to have\n" " with respect to the original geometry. The smaller, the closer\n" - " the new stroke is to the orinal one. This error corresponds to\n" + " the new stroke is to the original one. This error corresponds to\n" " the maximum distance between the new stroke and the old one.\n" " :type error: float\n" "\n" @@ -77,43 +79,39 @@ PyTypeObject PolygonalizationShader_Type = { sizeof(BPy_PolygonalizationShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - PolygonalizationShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)PolygonalizationShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + PolygonalizationShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)PolygonalizationShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_SamplingShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_SamplingShader.cpp index 5f0a0bfb305..e4aeb612cc4 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_SamplingShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_SamplingShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -68,43 +70,39 @@ PyTypeObject SamplingShader_Type = { sizeof(BPy_SamplingShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - SamplingShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)SamplingShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + SamplingShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)SamplingShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_SmoothingShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_SmoothingShader.cpp index 3d30fb4e11b..55aee8b8a56 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_SmoothingShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_SmoothingShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -100,43 +102,39 @@ PyTypeObject SmoothingShader_Type = { sizeof(BPy_SmoothingShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - SmoothingShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)SmoothingShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + SmoothingShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)SmoothingShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_SpatialNoiseShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_SpatialNoiseShader.cpp index 876dd5f2f63..85e49b51f47 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_SpatialNoiseShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_SpatialNoiseShader.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -94,43 +96,39 @@ PyTypeObject SpatialNoiseShader_Type = { sizeof(BPy_SpatialNoiseShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - SpatialNoiseShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)SpatialNoiseShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + SpatialNoiseShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)SpatialNoiseShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_StrokeTextureStepShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_StrokeTextureStepShader.cpp index bd70d41717b..d914b180f6f 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_StrokeTextureStepShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_StrokeTextureStepShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -70,43 +72,39 @@ PyTypeObject StrokeTextureStepShader_Type = { sizeof(BPy_StrokeTextureStepShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - StrokeTextureStepShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)StrokeTextureStepShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + StrokeTextureStepShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)StrokeTextureStepShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_ThicknessNoiseShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_ThicknessNoiseShader.cpp index fd7f5fabe77..db1e634f91e 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_ThicknessNoiseShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_ThicknessNoiseShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -72,43 +74,39 @@ PyTypeObject ThicknessNoiseShader_Type = { sizeof(BPy_ThicknessNoiseShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ThicknessNoiseShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ThicknessNoiseShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ThicknessNoiseShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ThicknessNoiseShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_TipRemoverShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_TipRemoverShader.cpp index ed575b12b8d..ee1ac7697db 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_TipRemoverShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_TipRemoverShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -69,43 +71,39 @@ PyTypeObject TipRemoverShader_Type = { sizeof(BPy_TipRemoverShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - TipRemoverShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)TipRemoverShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + TipRemoverShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)TipRemoverShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.cpp index 5ce96212031..d2f138dc176 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.cpp @@ -38,6 +38,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -187,43 +189,39 @@ PyTypeObject UnaryFunction0DDouble_Type = { sizeof(BPy_UnaryFunction0DDouble), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0DDouble___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0DDouble___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction0DDouble___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0DDouble___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction0DDouble___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0DDouble___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction0DDouble___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0DDouble___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction0DDouble___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.h index 60ebc646d74..abfc2609523 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.h +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.h @@ -36,7 +36,7 @@ extern PyTypeObject UnaryFunction0DDouble_Type; /*---------------------------Python BPy_UnaryFunction0DDouble structure definition----------*/ typedef struct { BPy_UnaryFunction0D py_uf0D; - UnaryFunction0D *uf0D_double; + Freestyle::UnaryFunction0D *uf0D_double; } BPy_UnaryFunction0DDouble; /*---------------------------Python BPy_UnaryFunction0DDouble visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.cpp index 8c988d55c91..6e55b7d9bcc 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -126,43 +128,39 @@ PyTypeObject UnaryFunction0DEdgeNature_Type = { sizeof(BPy_UnaryFunction0DEdgeNature), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0DEdgeNature___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0DEdgeNature___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction0DEdgeNature___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0DEdgeNature___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction0DEdgeNature___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0DEdgeNature___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction0DEdgeNature___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0DEdgeNature___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction0DEdgeNature___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.h index 9ce4b3bfd0b..83abc003393 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.h +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.h @@ -38,7 +38,7 @@ extern PyTypeObject UnaryFunction0DEdgeNature_Type; /*---------------------------Python BPy_UnaryFunction0DEdgeNature structure definition----------*/ typedef struct { BPy_UnaryFunction0D py_uf0D; - UnaryFunction0D *uf0D_edgenature; + Freestyle::UnaryFunction0D *uf0D_edgenature; } BPy_UnaryFunction0DEdgeNature; /*---------------------------Python BPy_UnaryFunction0DEdgeNature visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.cpp index 25b19e84b60..23aece94c39 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.cpp @@ -34,6 +34,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -163,43 +165,39 @@ PyTypeObject UnaryFunction0DFloat_Type = { sizeof(BPy_UnaryFunction0DFloat), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0DFloat___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0DFloat___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction0DFloat___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0DFloat___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction0DFloat___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0DFloat___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction0DFloat___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0DFloat___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction0DFloat___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.h index fd221201d99..a4c401f3dcd 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.h +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.h @@ -36,7 +36,7 @@ extern PyTypeObject UnaryFunction0DFloat_Type; /*---------------------------Python BPy_UnaryFunction0DFloat structure definition----------*/ typedef struct { BPy_UnaryFunction0D py_uf0D; - UnaryFunction0D *uf0D_float; + Freestyle::UnaryFunction0D *uf0D_float; } BPy_UnaryFunction0DFloat; /*---------------------------Python BPy_UnaryFunction0DFloat visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.cpp index b2426cab572..6f904898458 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -122,43 +124,39 @@ PyTypeObject UnaryFunction0DId_Type = { sizeof(BPy_UnaryFunction0DId), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0DId___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0DId___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction0DId___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0DId___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction0DId___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0DId___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction0DId___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0DId___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction0DId___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.h index 14e5d48ce43..b13c976f0ac 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.h +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.h @@ -38,7 +38,7 @@ extern PyTypeObject UnaryFunction0DId_Type; /*---------------------------Python BPy_UnaryFunction0DId structure definition----------*/ typedef struct { BPy_UnaryFunction0D py_uf0D; - UnaryFunction0D *uf0D_id; + Freestyle::UnaryFunction0D *uf0D_id; } BPy_UnaryFunction0DId; /*---------------------------Python BPy_UnaryFunction0DId visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.cpp index 77f89265ba4..92dc5901b5c 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -125,43 +127,39 @@ PyTypeObject UnaryFunction0DMaterial_Type = { sizeof(BPy_UnaryFunction0DMaterial), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0DMaterial___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0DMaterial___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction0DMaterial___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0DMaterial___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction0DMaterial___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0DMaterial___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction0DMaterial___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0DMaterial___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction0DMaterial___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.h index bbd53c409eb..72054713a66 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.h +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.h @@ -38,7 +38,7 @@ extern PyTypeObject UnaryFunction0DMaterial_Type; /*---------------------------Python BPy_UnaryFunction0DMaterial structure definition----------*/ typedef struct { BPy_UnaryFunction0D py_uf0D; - UnaryFunction0D *uf0D_material; + Freestyle::UnaryFunction0D *uf0D_material; } BPy_UnaryFunction0DMaterial; /*---------------------------Python BPy_UnaryFunction0DMaterial visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.cpp index 52f990502ef..829c9d0b7c1 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -126,43 +128,39 @@ PyTypeObject UnaryFunction0DUnsigned_Type = { sizeof(BPy_UnaryFunction0DUnsigned), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0DUnsigned___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0DUnsigned___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction0DUnsigned___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0DUnsigned___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction0DUnsigned___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0DUnsigned___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction0DUnsigned___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0DUnsigned___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction0DUnsigned___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.h index 1a466ffc673..2958d10994c 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.h +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.h @@ -36,7 +36,7 @@ extern PyTypeObject UnaryFunction0DUnsigned_Type; /*---------------------------Python BPy_UnaryFunction0DUnsigned structure definition----------*/ typedef struct { BPy_UnaryFunction0D py_uf0D; - UnaryFunction0D *uf0D_unsigned; + Freestyle::UnaryFunction0D *uf0D_unsigned; } BPy_UnaryFunction0DUnsigned; /*---------------------------Python BPy_UnaryFunction0DUnsigned visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.cpp index 45e1144cd32..a7248eebae2 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.cpp @@ -30,6 +30,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -131,43 +133,39 @@ PyTypeObject UnaryFunction0DVec2f_Type = { sizeof(BPy_UnaryFunction0DVec2f), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0DVec2f___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0DVec2f___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction0DVec2f___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0DVec2f___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction0DVec2f___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0DVec2f___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction0DVec2f___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0DVec2f___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction0DVec2f___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.h index 6c3d5fc85cc..2e570adbaee 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.h +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.h @@ -23,7 +23,6 @@ #include "../BPy_UnaryFunction0D.h" #include "../../geometry/Geom.h" -using namespace Geometry; #ifdef __cplusplus extern "C" { @@ -39,7 +38,7 @@ extern PyTypeObject UnaryFunction0DVec2f_Type; /*---------------------------Python BPy_UnaryFunction0DVec2f structure definition----------*/ typedef struct { BPy_UnaryFunction0D py_uf0D; - UnaryFunction0D *uf0D_vec2f; + Freestyle::UnaryFunction0D *uf0D_vec2f; } BPy_UnaryFunction0DVec2f; /*---------------------------Python BPy_UnaryFunction0DVec2f visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.cpp index 18eeae86dd7..1810648b0b0 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -124,43 +126,39 @@ PyTypeObject UnaryFunction0DVec3f_Type = { sizeof(BPy_UnaryFunction0DVec3f), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0DVec3f___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0DVec3f___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction0DVec3f___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0DVec3f___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction0DVec3f___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0DVec3f___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction0DVec3f___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0DVec3f___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction0DVec3f___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.h index 4be9b170311..6334988a0ef 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.h +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.h @@ -23,7 +23,6 @@ #include "../BPy_UnaryFunction0D.h" #include "../../geometry/Geom.h" -using namespace Geometry; #ifdef __cplusplus extern "C" { @@ -39,7 +38,7 @@ extern PyTypeObject UnaryFunction0DVec3f_Type; /*---------------------------Python BPy_UnaryFunction0DVec3f structure definition----------*/ typedef struct { BPy_UnaryFunction0D py_uf0D; - UnaryFunction0D *uf0D_vec3f; + Freestyle::UnaryFunction0D *uf0D_vec3f; } BPy_UnaryFunction0DVec3f; /*---------------------------Python BPy_UnaryFunction0DVec3f visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.cpp index 28c4425b2a4..4c015cec410 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -135,43 +137,39 @@ PyTypeObject UnaryFunction0DVectorViewShape_Type = { sizeof(BPy_UnaryFunction0DVectorViewShape), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0DVectorViewShape___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0DVectorViewShape___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction0DVectorViewShape___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0DVectorViewShape___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction0DVectorViewShape___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0DVectorViewShape___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction0DVectorViewShape___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0DVectorViewShape___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction0DVectorViewShape___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.h index 2a36ae21002..4e49374273f 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.h +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.h @@ -40,7 +40,7 @@ extern PyTypeObject UnaryFunction0DVectorViewShape_Type; * definition----------*/ typedef struct { BPy_UnaryFunction0D py_uf0D; - UnaryFunction0D> *uf0D_vectorviewshape; + Freestyle::UnaryFunction0D> *uf0D_vectorviewshape; } BPy_UnaryFunction0DVectorViewShape; /*---------------------------Python BPy_UnaryFunction0DVectorViewShape visible diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.cpp index 75773aaa8d0..c2f0df9798c 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.cpp @@ -30,6 +30,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -133,43 +135,39 @@ PyTypeObject UnaryFunction0DViewShape_Type = { sizeof(BPy_UnaryFunction0DViewShape), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0DViewShape___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0DViewShape___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction0DViewShape___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0DViewShape___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction0DViewShape___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0DViewShape___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction0DViewShape___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0DViewShape___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction0DViewShape___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.h index 8a8dcdceb1f..7a3c27a30c1 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.h +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.h @@ -38,7 +38,7 @@ extern PyTypeObject UnaryFunction0DViewShape_Type; /*---------------------------Python BPy_UnaryFunction0DViewShape structure definition----------*/ typedef struct { BPy_UnaryFunction0D py_uf0D; - UnaryFunction0D *uf0D_viewshape; + Freestyle::UnaryFunction0D *uf0D_viewshape; } BPy_UnaryFunction0DViewShape; /*---------------------------Python BPy_UnaryFunction0DViewShape visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Id/BPy_ShapeIdF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Id/BPy_ShapeIdF0D.cpp index b59e72e23d2..4aed82a14d3 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Id/BPy_ShapeIdF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Id/BPy_ShapeIdF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -74,43 +76,39 @@ PyTypeObject ShapeIdF0D_Type = { sizeof(BPy_ShapeIdF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ShapeIdF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DId_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ShapeIdF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ShapeIdF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DId_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ShapeIdF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Material/BPy_MaterialF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Material/BPy_MaterialF0D.cpp index 9f7f2b234f7..6b6e06d6efd 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Material/BPy_MaterialF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Material/BPy_MaterialF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -77,43 +79,39 @@ PyTypeObject MaterialF0D_Type = { sizeof(BPy_MaterialF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - MaterialF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DMaterial_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)MaterialF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + MaterialF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DMaterial_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)MaterialF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Nature_EdgeNature/BPy_CurveNatureF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Nature_EdgeNature/BPy_CurveNatureF0D.cpp index 1cd1a4ab8ac..c6fb66270f7 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Nature_EdgeNature/BPy_CurveNatureF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Nature_EdgeNature/BPy_CurveNatureF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -68,43 +70,39 @@ PyTypeObject CurveNatureF0D_Type = { sizeof(BPy_CurveNatureF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - CurveNatureF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DEdgeNature_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)CurveNatureF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + CurveNatureF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DEdgeNature_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)CurveNatureF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_Normal2DF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_Normal2DF0D.cpp index 60cfed83713..66c0243727d 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_Normal2DF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_Normal2DF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -70,43 +72,39 @@ PyTypeObject Normal2DF0D_Type = { sizeof(BPy_Normal2DF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Normal2DF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DVec2f_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Normal2DF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Normal2DF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DVec2f_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Normal2DF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_VertexOrientation2DF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_VertexOrientation2DF0D.cpp index 063f1651486..4ade0e2e995 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_VertexOrientation2DF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_VertexOrientation2DF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -72,43 +74,39 @@ PyTypeObject VertexOrientation2DF0D_Type = { sizeof(BPy_VertexOrientation2DF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - VertexOrientation2DF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DVec2f_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)VertexOrientation2DF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + VertexOrientation2DF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DVec2f_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)VertexOrientation2DF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec3f/BPy_VertexOrientation3DF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec3f/BPy_VertexOrientation3DF0D.cpp index b0188cd0244..f634eaa0327 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec3f/BPy_VertexOrientation3DF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec3f/BPy_VertexOrientation3DF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -72,43 +74,39 @@ PyTypeObject VertexOrientation3DF0D_Type = { sizeof(BPy_VertexOrientation3DF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - VertexOrientation3DF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DVec3f_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)VertexOrientation3DF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + VertexOrientation3DF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DVec3f_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)VertexOrientation3DF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetOccludeeF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetOccludeeF0D.cpp index ba890477782..c624e3eb136 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetOccludeeF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetOccludeeF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -67,43 +69,39 @@ PyTypeObject GetOccludeeF0D_Type = { sizeof(BPy_GetOccludeeF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetOccludeeF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DViewShape_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetOccludeeF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetOccludeeF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DViewShape_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetOccludeeF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetShapeF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetShapeF0D.cpp index 531020dc32a..8234e7f4351 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetShapeF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetShapeF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -67,43 +69,39 @@ PyTypeObject GetShapeF0D_Type = { sizeof(BPy_GetShapeF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetShapeF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DViewShape_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetShapeF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetShapeF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DViewShape_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetShapeF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_Curvature2DAngleF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_Curvature2DAngleF0D.cpp index cb36e388306..217fe1cb55a 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_Curvature2DAngleF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_Curvature2DAngleF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -72,43 +74,39 @@ PyTypeObject Curvature2DAngleF0D_Type = { sizeof(BPy_Curvature2DAngleF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Curvature2DAngleF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Curvature2DAngleF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Curvature2DAngleF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Curvature2DAngleF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_DensityF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_DensityF0D.cpp index ca306a55d1e..b0777adb311 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_DensityF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_DensityF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -77,43 +79,39 @@ PyTypeObject DensityF0D_Type = { sizeof(BPy_DensityF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - DensityF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)DensityF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + DensityF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)DensityF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedXF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedXF0D.cpp index 6a688212239..6c230a1207d 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedXF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedXF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -67,43 +69,39 @@ PyTypeObject GetProjectedXF0D_Type = { sizeof(BPy_GetProjectedXF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetProjectedXF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetProjectedXF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetProjectedXF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetProjectedXF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedYF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedYF0D.cpp index 8efaaf1b699..43913316567 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedYF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedYF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -67,43 +69,39 @@ PyTypeObject GetProjectedYF0D_Type = { sizeof(BPy_GetProjectedYF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetProjectedYF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetProjectedYF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetProjectedYF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetProjectedYF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedZF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedZF0D.cpp index e13c990685f..a7d1d05c3ca 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedZF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedZF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -67,43 +69,39 @@ PyTypeObject GetProjectedZF0D_Type = { sizeof(BPy_GetProjectedZF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetProjectedZF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetProjectedZF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetProjectedZF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetProjectedZF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetXF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetXF0D.cpp index 43cbb433bdd..94abd089db1 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetXF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetXF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -67,43 +69,39 @@ PyTypeObject GetXF0D_Type = { sizeof(BPy_GetXF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetXF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetXF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetXF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetXF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetYF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetYF0D.cpp index 24bfe3be985..fc4edb9eb1a 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetYF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetYF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -67,43 +69,39 @@ PyTypeObject GetYF0D_Type = { sizeof(BPy_GetYF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetYF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetYF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetYF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetYF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetZF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetZF0D.cpp index 84a985a134d..3729f7bcb66 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetZF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetZF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -67,43 +69,39 @@ PyTypeObject GetZF0D_Type = { sizeof(BPy_GetZF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetZF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetZF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetZF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetZF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_LocalAverageDepthF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_LocalAverageDepthF0D.cpp index 247473dcb41..64f86653922 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_LocalAverageDepthF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_LocalAverageDepthF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -75,43 +77,39 @@ PyTypeObject LocalAverageDepthF0D_Type = { sizeof(BPy_LocalAverageDepthF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - LocalAverageDepthF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)LocalAverageDepthF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + LocalAverageDepthF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)LocalAverageDepthF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_ZDiscontinuityF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_ZDiscontinuityF0D.cpp index e82b5f1c557..2b2dba80f04 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_ZDiscontinuityF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_ZDiscontinuityF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -72,43 +74,39 @@ PyTypeObject ZDiscontinuityF0D_Type = { sizeof(BPy_ZDiscontinuityF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ZDiscontinuityF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ZDiscontinuityF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ZDiscontinuityF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ZDiscontinuityF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetCurvilinearAbscissaF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetCurvilinearAbscissaF0D.cpp index b4760d10b2c..092f78c584c 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetCurvilinearAbscissaF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetCurvilinearAbscissaF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -70,43 +72,39 @@ PyTypeObject GetCurvilinearAbscissaF0D_Type = { sizeof(BPy_GetCurvilinearAbscissaF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetCurvilinearAbscissaF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DFloat_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetCurvilinearAbscissaF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetCurvilinearAbscissaF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DFloat_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetCurvilinearAbscissaF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetParameterF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetParameterF0D.cpp index d4c735e3572..28be409b8fb 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetParameterF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetParameterF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -66,43 +68,39 @@ PyTypeObject GetParameterF0D_Type = { sizeof(BPy_GetParameterF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetParameterF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DFloat_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetParameterF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetParameterF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DFloat_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetParameterF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetViewMapGradientNormF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetViewMapGradientNormF0D.cpp index 6d5f1ed80c3..3f6667af843 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetViewMapGradientNormF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetViewMapGradientNormF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -75,43 +77,39 @@ PyTypeObject GetViewMapGradientNormF0D_Type = { sizeof(BPy_GetViewMapGradientNormF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetViewMapGradientNormF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DFloat_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetViewMapGradientNormF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetViewMapGradientNormF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DFloat_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetViewMapGradientNormF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadCompleteViewMapPixelF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadCompleteViewMapPixelF0D.cpp index bbf2aee5204..98cd37f5fea 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadCompleteViewMapPixelF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadCompleteViewMapPixelF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -73,43 +75,39 @@ PyTypeObject ReadCompleteViewMapPixelF0D_Type = { sizeof(BPy_ReadCompleteViewMapPixelF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ReadCompleteViewMapPixelF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DFloat_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ReadCompleteViewMapPixelF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ReadCompleteViewMapPixelF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DFloat_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ReadCompleteViewMapPixelF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadMapPixelF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadMapPixelF0D.cpp index 54401153d37..07bbcfed102 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadMapPixelF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadMapPixelF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -74,43 +76,39 @@ PyTypeObject ReadMapPixelF0D_Type = { sizeof(BPy_ReadMapPixelF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ReadMapPixelF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DFloat_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ReadMapPixelF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ReadMapPixelF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DFloat_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ReadMapPixelF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadSteerableViewMapPixelF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadSteerableViewMapPixelF0D.cpp index 88ca0579870..4d2da133b5f 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadSteerableViewMapPixelF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadSteerableViewMapPixelF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -77,43 +79,39 @@ PyTypeObject ReadSteerableViewMapPixelF0D_Type = { sizeof(BPy_ReadSteerableViewMapPixelF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ReadSteerableViewMapPixelF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DFloat_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ReadSteerableViewMapPixelF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ReadSteerableViewMapPixelF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DFloat_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ReadSteerableViewMapPixelF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_unsigned_int/BPy_QuantitativeInvisibilityF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_unsigned_int/BPy_QuantitativeInvisibilityF0D.cpp index d6e00988e68..30e5ea4a1f8 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_unsigned_int/BPy_QuantitativeInvisibilityF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_unsigned_int/BPy_QuantitativeInvisibilityF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -75,43 +77,39 @@ PyTypeObject QuantitativeInvisibilityF0D_Type = { sizeof(BPy_QuantitativeInvisibilityF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - QuantitativeInvisibilityF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DUnsigned_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)QuantitativeInvisibilityF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + QuantitativeInvisibilityF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DUnsigned_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)QuantitativeInvisibilityF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_vector_ViewShape/BPy_GetOccludersF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_vector_ViewShape/BPy_GetOccludersF0D.cpp index ddff11d7916..a8461e006b0 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_vector_ViewShape/BPy_GetOccludersF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_vector_ViewShape/BPy_GetOccludersF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -68,43 +70,39 @@ PyTypeObject GetOccludersF0D_Type = { sizeof(BPy_GetOccludersF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetOccludersF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DVectorViewShape_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetOccludersF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetOccludersF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DVectorViewShape_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetOccludersF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.cpp index 57b2d61d5c1..0ce6e099ed3 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.cpp @@ -43,6 +43,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -268,43 +270,39 @@ PyTypeObject UnaryFunction1DDouble_Type = { sizeof(BPy_UnaryFunction1DDouble), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction1DDouble___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction1DDouble___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction1DDouble___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction1DDouble___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryFunction1DDouble_getseters, /* tp_getset */ - &UnaryFunction1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction1DDouble___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction1DDouble___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction1DDouble___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction1DDouble___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryFunction1DDouble_getseters, /* tp_getset */ + &UnaryFunction1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction1DDouble___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.h index 1fb42a18337..a57e42ce528 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.h +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.h @@ -36,7 +36,7 @@ extern PyTypeObject UnaryFunction1DDouble_Type; /*---------------------------Python BPy_UnaryFunction1DDouble structure definition----------*/ typedef struct { BPy_UnaryFunction1D py_uf1D; - UnaryFunction1D *uf1D_double; + Freestyle::UnaryFunction1D *uf1D_double; } BPy_UnaryFunction1DDouble; /*---------------------------Python BPy_UnaryFunction1DDouble visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.cpp index a987dbb67f5..83a502de548 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.cpp @@ -30,6 +30,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -175,43 +177,39 @@ PyTypeObject UnaryFunction1DEdgeNature_Type = { sizeof(BPy_UnaryFunction1DEdgeNature), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction1DEdgeNature___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction1DEdgeNature___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction1DEdgeNature___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction1DEdgeNature___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryFunction1DEdgeNature_getseters, /* tp_getset */ - &UnaryFunction1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction1DEdgeNature___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction1DEdgeNature___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction1DEdgeNature___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction1DEdgeNature___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryFunction1DEdgeNature_getseters, /* tp_getset */ + &UnaryFunction1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction1DEdgeNature___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.h index 886eb469d51..4227cc47efa 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.h +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.h @@ -38,7 +38,7 @@ extern PyTypeObject UnaryFunction1DEdgeNature_Type; /*---------------------------Python BPy_UnaryFunction1DEdgeNature structure definition----------*/ typedef struct { BPy_UnaryFunction1D py_uf1D; - UnaryFunction1D *uf1D_edgenature; + Freestyle::UnaryFunction1D *uf1D_edgenature; } BPy_UnaryFunction1DEdgeNature; /*---------------------------Python BPy_UnaryFunction1DEdgeNature visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.cpp index 66499c68c65..7ba80c58256 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -164,43 +166,39 @@ PyTypeObject UnaryFunction1DFloat_Type = { sizeof(BPy_UnaryFunction1DFloat), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction1DFloat___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction1DFloat___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction1DFloat___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction1DFloat___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryFunction1DFloat_getseters, /* tp_getset */ - &UnaryFunction1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction1DFloat___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction1DFloat___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction1DFloat___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction1DFloat___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryFunction1DFloat_getseters, /* tp_getset */ + &UnaryFunction1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction1DFloat___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.h index 8b977c9c96a..8be928eba77 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.h +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.h @@ -36,7 +36,7 @@ extern PyTypeObject UnaryFunction1DFloat_Type; /*---------------------------Python BPy_UnaryFunction1DFloat structure definition----------*/ typedef struct { BPy_UnaryFunction1D py_uf1D; - UnaryFunction1D *uf1D_float; + Freestyle::UnaryFunction1D *uf1D_float; } BPy_UnaryFunction1DFloat; /*---------------------------Python BPy_UnaryFunction1DFloat visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.cpp index 54c5c786367..ed8790fcd89 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.cpp @@ -30,6 +30,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -175,43 +177,39 @@ PyTypeObject UnaryFunction1DUnsigned_Type = { sizeof(BPy_UnaryFunction1DUnsigned), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction1DUnsigned___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction1DUnsigned___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction1DUnsigned___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction1DUnsigned___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryFunction1DUnsigned_getseters, /* tp_getset */ - &UnaryFunction1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction1DUnsigned___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction1DUnsigned___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction1DUnsigned___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction1DUnsigned___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryFunction1DUnsigned_getseters, /* tp_getset */ + &UnaryFunction1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction1DUnsigned___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.h index 9149275b610..30fe050c2ad 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.h +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.h @@ -36,7 +36,7 @@ extern PyTypeObject UnaryFunction1DUnsigned_Type; /*---------------------------Python BPy_UnaryFunction1DUnsigned structure definition----------*/ typedef struct { BPy_UnaryFunction1D py_uf1D; - UnaryFunction1D *uf1D_unsigned; + Freestyle::UnaryFunction1D *uf1D_unsigned; } BPy_UnaryFunction1DUnsigned; /*---------------------------Python BPy_UnaryFunction1DUnsigned visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.cpp index 8b23163fc95..0f288faea4e 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.cpp @@ -31,6 +31,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -179,43 +181,39 @@ PyTypeObject UnaryFunction1DVec2f_Type = { sizeof(BPy_UnaryFunction1DVec2f), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction1DVec2f___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction1DVec2f___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction1DVec2f___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction1DVec2f___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryFunction1DVec2f_getseters, /* tp_getset */ - &UnaryFunction1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction1DVec2f___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction1DVec2f___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction1DVec2f___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction1DVec2f___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryFunction1DVec2f_getseters, /* tp_getset */ + &UnaryFunction1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction1DVec2f___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.h index b55f9af7c4d..2decb723a33 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.h +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.h @@ -23,7 +23,6 @@ #include "../BPy_UnaryFunction1D.h" #include "../../geometry/Geom.h" -using namespace Geometry; #ifdef __cplusplus extern "C" { @@ -39,7 +38,7 @@ extern PyTypeObject UnaryFunction1DVec2f_Type; /*---------------------------Python BPy_UnaryFunction1DVec2f structure definition----------*/ typedef struct { BPy_UnaryFunction1D py_uf1D; - UnaryFunction1D *uf1D_vec2f; + Freestyle::UnaryFunction1D *uf1D_vec2f; } BPy_UnaryFunction1DVec2f; /*---------------------------Python BPy_UnaryFunction1DVec2f visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.cpp index 9b6a2445588..fbdefd891be 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.cpp @@ -30,6 +30,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -172,43 +174,39 @@ PyTypeObject UnaryFunction1DVec3f_Type = { sizeof(BPy_UnaryFunction1DVec3f), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction1DVec3f___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction1DVec3f___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction1DVec3f___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction1DVec3f___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryFunction1DVec3f_getseters, /* tp_getset */ - &UnaryFunction1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction1DVec3f___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction1DVec3f___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction1DVec3f___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction1DVec3f___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryFunction1DVec3f_getseters, /* tp_getset */ + &UnaryFunction1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction1DVec3f___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.h index 9e4342979e4..9e7a899a371 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.h +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.h @@ -23,7 +23,6 @@ #include "../BPy_UnaryFunction1D.h" #include "../../geometry/Geom.h" -using namespace Geometry; #ifdef __cplusplus extern "C" { @@ -39,7 +38,7 @@ extern PyTypeObject UnaryFunction1DVec3f_Type; /*---------------------------Python BPy_UnaryFunction1DVec3f structure definition----------*/ typedef struct { BPy_UnaryFunction1D py_uf1D; - UnaryFunction1D *uf1D_vec3f; + Freestyle::UnaryFunction1D *uf1D_vec3f; } BPy_UnaryFunction1DVec3f; /*---------------------------Python BPy_UnaryFunction1DVec3f visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.cpp index c95595dc953..09b9e303fa0 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.cpp @@ -32,6 +32,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -200,43 +202,39 @@ PyTypeObject UnaryFunction1DVectorViewShape_Type = { sizeof(BPy_UnaryFunction1DVectorViewShape), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction1DVectorViewShape___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction1DVectorViewShape___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction1DVectorViewShape___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction1DVectorViewShape___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryFunction1DVectorViewShape_getseters, /* tp_getset */ - &UnaryFunction1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction1DVectorViewShape___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction1DVectorViewShape___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction1DVectorViewShape___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction1DVectorViewShape___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryFunction1DVectorViewShape_getseters, /* tp_getset */ + &UnaryFunction1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction1DVectorViewShape___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.h index bfbcf5e451d..a8dfee7f9aa 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.h +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.h @@ -40,7 +40,7 @@ extern PyTypeObject UnaryFunction1DVectorViewShape_Type; * definition----------*/ typedef struct { BPy_UnaryFunction1D py_uf1D; - UnaryFunction1D> *uf1D_vectorviewshape; + Freestyle::UnaryFunction1D> *uf1D_vectorviewshape; } BPy_UnaryFunction1DVectorViewShape; /*---------------------------Python BPy_UnaryFunction1DVectorViewShape visible diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.cpp index b258b0b27f7..9ab3de8bf79 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.cpp @@ -32,6 +32,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- @@ -187,43 +189,39 @@ PyTypeObject UnaryFunction1DVoid_Type = { sizeof(BPy_UnaryFunction1DVoid), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction1DVoid___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction1DVoid___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction1DVoid___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction1DVoid___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryFunction1DVoid_getseters, /* tp_getset */ - &UnaryFunction1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction1DVoid___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction1DVoid___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction1DVoid___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction1DVoid___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryFunction1DVoid_getseters, /* tp_getset */ + &UnaryFunction1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction1DVoid___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.h index 3a821bc2083..520ccc29c99 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.h +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.h @@ -36,7 +36,7 @@ extern PyTypeObject UnaryFunction1DVoid_Type; /*---------------------------Python BPy_UnaryFunction1DVoid structure definition----------*/ typedef struct { BPy_UnaryFunction1D py_uf1D; - UnaryFunction1D_void *uf1D_void; + Freestyle::UnaryFunction1D_void *uf1D_void; } BPy_UnaryFunction1DVoid; /*---------------------------Python BPy_UnaryFunction1DVoid visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Nature_EdgeNature/BPy_CurveNatureF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Nature_EdgeNature/BPy_CurveNatureF1D.cpp index 205820d9a92..141758bfe48 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Nature_EdgeNature/BPy_CurveNatureF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Nature_EdgeNature/BPy_CurveNatureF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -80,43 +82,39 @@ PyTypeObject CurveNatureF1D_Type = { sizeof(BPy_CurveNatureF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - CurveNatureF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DEdgeNature_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)CurveNatureF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + CurveNatureF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DEdgeNature_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)CurveNatureF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Normal2DF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Normal2DF1D.cpp index d22a1ec99ef..7fa596d4bbe 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Normal2DF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Normal2DF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -74,43 +76,39 @@ PyTypeObject Normal2DF1D_Type = { sizeof(BPy_Normal2DF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Normal2DF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DVec2f_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Normal2DF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Normal2DF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DVec2f_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Normal2DF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Orientation2DF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Orientation2DF1D.cpp index f66bd4c668f..69ab07a2829 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Orientation2DF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Orientation2DF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -74,43 +76,39 @@ PyTypeObject Orientation2DF1D_Type = { sizeof(BPy_Orientation2DF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Orientation2DF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DVec2f_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Orientation2DF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Orientation2DF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DVec2f_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Orientation2DF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec3f/BPy_Orientation3DF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec3f/BPy_Orientation3DF1D.cpp index 2f408d45b74..9866968e068 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec3f/BPy_Orientation3DF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec3f/BPy_Orientation3DF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -74,43 +76,39 @@ PyTypeObject Orientation3DF1D_Type = { sizeof(BPy_Orientation3DF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Orientation3DF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DVec3f_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Orientation3DF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Orientation3DF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DVec3f_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Orientation3DF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_Curvature2DAngleF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_Curvature2DAngleF1D.cpp index 13455eb3a4c..3bd9bf8abce 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_Curvature2DAngleF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_Curvature2DAngleF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -75,43 +77,39 @@ PyTypeObject Curvature2DAngleF1D_Type = { sizeof(BPy_Curvature2DAngleF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Curvature2DAngleF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Curvature2DAngleF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Curvature2DAngleF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Curvature2DAngleF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_DensityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_DensityF1D.cpp index fcf2bebc161..12237f6a5e5 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_DensityF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_DensityF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -88,43 +90,39 @@ PyTypeObject DensityF1D_Type = { sizeof(BPy_DensityF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - DensityF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)DensityF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + DensityF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)DensityF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetCompleteViewMapDensityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetCompleteViewMapDensityF1D.cpp index 5c352c670c1..49f7c019222 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetCompleteViewMapDensityF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetCompleteViewMapDensityF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -92,43 +94,39 @@ PyTypeObject GetCompleteViewMapDensityF1D_Type = { sizeof(BPy_GetCompleteViewMapDensityF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetCompleteViewMapDensityF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetCompleteViewMapDensityF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetCompleteViewMapDensityF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetCompleteViewMapDensityF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetDirectionalViewMapDensityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetDirectionalViewMapDensityF1D.cpp index 45c6a1b0fb7..240e632b433 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetDirectionalViewMapDensityF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetDirectionalViewMapDensityF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -99,43 +101,39 @@ PyTypeObject GetDirectionalViewMapDensityF1D_Type = { sizeof(BPy_GetDirectionalViewMapDensityF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetDirectionalViewMapDensityF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetDirectionalViewMapDensityF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetDirectionalViewMapDensityF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetDirectionalViewMapDensityF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedXF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedXF1D.cpp index 0c7276a13ec..ce111f81c9d 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedXF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedXF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -74,43 +76,39 @@ PyTypeObject GetProjectedXF1D_Type = { sizeof(BPy_GetProjectedXF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetProjectedXF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetProjectedXF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetProjectedXF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetProjectedXF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedYF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedYF1D.cpp index 1f1c01a5344..31dc72f8d0d 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedYF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedYF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -74,43 +76,39 @@ PyTypeObject GetProjectedYF1D_Type = { sizeof(BPy_GetProjectedYF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetProjectedYF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetProjectedYF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetProjectedYF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetProjectedYF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedZF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedZF1D.cpp index cfa06f9d8fd..e16a0c01942 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedZF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedZF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -74,43 +76,39 @@ PyTypeObject GetProjectedZF1D_Type = { sizeof(BPy_GetProjectedZF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetProjectedZF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetProjectedZF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetProjectedZF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetProjectedZF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetSteerableViewMapDensityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetSteerableViewMapDensityF1D.cpp index 985e10f2b83..78d74bf3399 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetSteerableViewMapDensityF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetSteerableViewMapDensityF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -89,43 +91,39 @@ PyTypeObject GetSteerableViewMapDensityF1D_Type = { sizeof(BPy_GetSteerableViewMapDensityF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetSteerableViewMapDensityF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetSteerableViewMapDensityF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetSteerableViewMapDensityF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetSteerableViewMapDensityF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetViewMapGradientNormF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetViewMapGradientNormF1D.cpp index 441ea2f5833..a158969c00c 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetViewMapGradientNormF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetViewMapGradientNormF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -89,43 +91,39 @@ PyTypeObject GetViewMapGradientNormF1D_Type = { sizeof(BPy_GetViewMapGradientNormF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetViewMapGradientNormF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetViewMapGradientNormF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetViewMapGradientNormF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetViewMapGradientNormF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetXF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetXF1D.cpp index 716cfbfe37a..9dfb5aa8793 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetXF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetXF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -74,43 +76,39 @@ PyTypeObject GetXF1D_Type = { sizeof(BPy_GetXF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetXF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetXF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetXF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetXF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetYF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetYF1D.cpp index 693c2453db2..239079e8472 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetYF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetYF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -73,43 +75,39 @@ PyTypeObject GetYF1D_Type = { sizeof(BPy_GetYF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetYF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetYF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetYF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetYF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetZF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetZF1D.cpp index e9030625b10..8f973adc3f0 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetZF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetZF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -74,43 +76,39 @@ PyTypeObject GetZF1D_Type = { sizeof(BPy_GetZF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetZF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetZF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetZF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetZF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_LocalAverageDepthF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_LocalAverageDepthF1D.cpp index 4ae2cd054e2..53eaf9b9596 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_LocalAverageDepthF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_LocalAverageDepthF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -84,43 +86,39 @@ PyTypeObject LocalAverageDepthF1D_Type = { sizeof(BPy_LocalAverageDepthF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - LocalAverageDepthF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)LocalAverageDepthF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + LocalAverageDepthF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)LocalAverageDepthF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_ZDiscontinuityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_ZDiscontinuityF1D.cpp index 9feb07552ca..8d1d43bc4de 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_ZDiscontinuityF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_ZDiscontinuityF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -78,43 +80,39 @@ PyTypeObject ZDiscontinuityF1D_Type = { sizeof(BPy_ZDiscontinuityF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ZDiscontinuityF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ZDiscontinuityF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ZDiscontinuityF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ZDiscontinuityF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_unsigned_int/BPy_QuantitativeInvisibilityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_unsigned_int/BPy_QuantitativeInvisibilityF1D.cpp index 400b5a95fcf..da5140c4459 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_unsigned_int/BPy_QuantitativeInvisibilityF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_unsigned_int/BPy_QuantitativeInvisibilityF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -80,43 +82,39 @@ PyTypeObject QuantitativeInvisibilityF1D_Type = { sizeof(BPy_QuantitativeInvisibilityF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - QuantitativeInvisibilityF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DUnsigned_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)QuantitativeInvisibilityF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + QuantitativeInvisibilityF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DUnsigned_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)QuantitativeInvisibilityF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludeeF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludeeF1D.cpp index 7637153017f..57dc15d4a55 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludeeF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludeeF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -67,43 +69,39 @@ PyTypeObject GetOccludeeF1D_Type = { sizeof(BPy_GetOccludeeF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetOccludeeF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DVectorViewShape_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetOccludeeF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetOccludeeF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DVectorViewShape_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetOccludeeF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludersF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludersF1D.cpp index d532268b294..ec8556eee96 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludersF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludersF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -67,43 +69,39 @@ PyTypeObject GetOccludersF1D_Type = { sizeof(BPy_GetOccludersF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetOccludersF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DVectorViewShape_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetOccludersF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetOccludersF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DVectorViewShape_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetOccludersF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetShapeF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetShapeF1D.cpp index dd1492e940e..95e7afe66fe 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetShapeF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetShapeF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -67,43 +69,39 @@ PyTypeObject GetShapeF1D_Type = { sizeof(BPy_GetShapeF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetShapeF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DVectorViewShape_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetShapeF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetShapeF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DVectorViewShape_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetShapeF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_ChainingTimeStampF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_ChainingTimeStampF1D.cpp index c3750734efc..906b23d03d2 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_ChainingTimeStampF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_ChainingTimeStampF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -67,43 +69,39 @@ PyTypeObject ChainingTimeStampF1D_Type = { sizeof(BPy_ChainingTimeStampF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ChainingTimeStampF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DVoid_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ChainingTimeStampF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ChainingTimeStampF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DVoid_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ChainingTimeStampF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_IncrementChainingTimeStampF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_IncrementChainingTimeStampF1D.cpp index 85738684e44..487af7dca70 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_IncrementChainingTimeStampF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_IncrementChainingTimeStampF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -67,43 +69,39 @@ PyTypeObject IncrementChainingTimeStampF1D_Type = { sizeof(BPy_IncrementChainingTimeStampF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - IncrementChainingTimeStampF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DVoid_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)IncrementChainingTimeStampF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + IncrementChainingTimeStampF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DVoid_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)IncrementChainingTimeStampF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_TimeStampF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_TimeStampF1D.cpp index 1f577820da4..ba21c98b0b0 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_TimeStampF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_TimeStampF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -65,43 +67,39 @@ PyTypeObject TimeStampF1D_Type = { sizeof(BPy_TimeStampF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - TimeStampF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DVoid_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)TimeStampF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + TimeStampF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DVoid_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)TimeStampF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_FalseUP0D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_FalseUP0D.cpp index 227aca2b5c6..300a9d66f07 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_FalseUP0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_FalseUP0D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -58,43 +60,39 @@ PyTypeObject FalseUP0D_Type = { sizeof(BPy_FalseUP0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - FalseUP0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)FalseUP0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + FalseUP0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)FalseUP0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_TrueUP0D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_TrueUP0D.cpp index 5f5c756b28d..6ff6ad03c1e 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_TrueUP0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_TrueUP0D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -58,43 +60,39 @@ PyTypeObject TrueUP0D_Type = { sizeof(BPy_TrueUP0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - TrueUP0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)TrueUP0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + TrueUP0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)TrueUP0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ContourUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ContourUP1D.cpp index b3f9c225931..b42573c1fbe 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ContourUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ContourUP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -59,43 +61,39 @@ PyTypeObject ContourUP1D_Type = { sizeof(BPy_ContourUP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ContourUP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ContourUP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ContourUP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ContourUP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_DensityLowerThanUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_DensityLowerThanUP1D.cpp index f865fe5013d..bcea039087c 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_DensityLowerThanUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_DensityLowerThanUP1D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -75,43 +77,39 @@ PyTypeObject DensityLowerThanUP1D_Type = { sizeof(BPy_DensityLowerThanUP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - DensityLowerThanUP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)DensityLowerThanUP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + DensityLowerThanUP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)DensityLowerThanUP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToChainingTimeStampUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToChainingTimeStampUP1D.cpp index 154b44ff81a..7ac09d4a644 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToChainingTimeStampUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToChainingTimeStampUP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -70,43 +72,39 @@ PyTypeObject EqualToChainingTimeStampUP1D_Type = { sizeof(BPy_EqualToChainingTimeStampUP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - EqualToChainingTimeStampUP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)EqualToChainingTimeStampUP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + EqualToChainingTimeStampUP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)EqualToChainingTimeStampUP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToTimeStampUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToTimeStampUP1D.cpp index 2bb9dbaf484..af98a277bad 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToTimeStampUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToTimeStampUP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -69,43 +71,39 @@ PyTypeObject EqualToTimeStampUP1D_Type = { sizeof(BPy_EqualToTimeStampUP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - EqualToTimeStampUP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)EqualToTimeStampUP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + EqualToTimeStampUP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)EqualToTimeStampUP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ExternalContourUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ExternalContourUP1D.cpp index 7b9923d7b6c..4c21d1ea54e 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ExternalContourUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ExternalContourUP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -63,43 +65,39 @@ PyTypeObject ExternalContourUP1D_Type = { sizeof(BPy_ExternalContourUP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ExternalContourUP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ExternalContourUP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ExternalContourUP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ExternalContourUP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_FalseUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_FalseUP1D.cpp index ec1a02e13aa..87c1ea918d0 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_FalseUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_FalseUP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -58,43 +60,39 @@ PyTypeObject FalseUP1D_Type = { sizeof(BPy_FalseUP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - FalseUP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)FalseUP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + FalseUP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)FalseUP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_QuantitativeInvisibilityUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_QuantitativeInvisibilityUP1D.cpp index b9a76f91c21..7fa00295887 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_QuantitativeInvisibilityUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_QuantitativeInvisibilityUP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -74,43 +76,39 @@ PyTypeObject QuantitativeInvisibilityUP1D_Type = { sizeof(BPy_QuantitativeInvisibilityUP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - QuantitativeInvisibilityUP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)QuantitativeInvisibilityUP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + QuantitativeInvisibilityUP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)QuantitativeInvisibilityUP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ShapeUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ShapeUP1D.cpp index 68f0ea7a913..2f097c5a6fe 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ShapeUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ShapeUP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -70,43 +72,39 @@ PyTypeObject ShapeUP1D_Type = { sizeof(BPy_ShapeUP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ShapeUP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ShapeUP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ShapeUP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ShapeUP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_TrueUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_TrueUP1D.cpp index 362bcc4cea8..d589f621a4d 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_TrueUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_TrueUP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -58,43 +60,39 @@ PyTypeObject TrueUP1D_Type = { sizeof(BPy_TrueUP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - TrueUP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)TrueUP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + TrueUP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)TrueUP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp index 9329e3a7628..32882ac3c20 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- @@ -71,43 +73,39 @@ PyTypeObject WithinImageBoundaryUP1D_Type = { sizeof(BPy_WithinImageBoundaryUP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - WithinImageBoundaryUP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)WithinImageBoundaryUP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + WithinImageBoundaryUP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)WithinImageBoundaryUP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/functions/FN_generic_value_map.hh b/source/blender/functions/FN_generic_value_map.hh index a9f2dc8a868..68cb945f1af 100644 --- a/source/blender/functions/FN_generic_value_map.hh +++ b/source/blender/functions/FN_generic_value_map.hh @@ -104,14 +104,12 @@ template class GValueMap { return return_value; } - template T lookup(const ForwardKey &key) const + template const T &lookup(const ForwardKey &key) const { GMutablePointer value = values_.lookup_as(key); - const CPPType &type = *value.type(); - BLI_assert(type.is()); - T return_value; - type.copy_to_initialized(value.get(), &return_value); - return return_value; + BLI_assert(value.is_type()); + BLI_assert(value.get() != nullptr); + return *(const T *)value.get(); } template bool contains(const ForwardKey &key) const diff --git a/source/blender/functions/intern/multi_function_network_optimization.cc b/source/blender/functions/intern/multi_function_network_optimization.cc index e24f157d4f9..6c418dee2c1 100644 --- a/source/blender/functions/intern/multi_function_network_optimization.cc +++ b/source/blender/functions/intern/multi_function_network_optimization.cc @@ -36,7 +36,6 @@ namespace blender::fn::mf_network_optimization { /* -------------------------------------------------------------------- */ /** \name Utility functions to find nodes in a network. - * * \{ */ static bool set_tag_and_check_if_modified(bool &tag, bool new_value) @@ -122,7 +121,6 @@ static Vector find_nodes_based_on_mask(MFNetwork &network, /* -------------------------------------------------------------------- */ /** \name Dead Node Removal - * * \{ */ /** @@ -140,7 +138,6 @@ void dead_node_removal(MFNetwork &network) /* -------------------------------------------------------------------- */ /** \name Constant Folding - * * \{ */ static bool function_node_can_be_constant(MFFunctionNode *node) @@ -330,7 +327,6 @@ void constant_folding(MFNetwork &network, ResourceCollector &resources) /* -------------------------------------------------------------------- */ /** \name Common Sub-network Elimination - * * \{ */ static uint64_t compute_node_hash(MFFunctionNode &node, RNG *rng, Span node_hashes) diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c index f80ad60eb07..686bd8c38e5 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c @@ -124,7 +124,9 @@ BLI_INLINE float table_sample(float *table, float x) return interpf(table[(int)ceilf(x)], table[(int)floor(x)], fractf(x)); } -/* aply noise effect based on stroke direction */ +/** + * Apply noise effect based on stroke direction. + */ static void deformStroke(GpencilModifierData *md, Depsgraph *depsgraph, Object *ob, diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilsmooth.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilsmooth.c index df2c838140e..54ff8d21633 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencilsmooth.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilsmooth.c @@ -83,7 +83,9 @@ static void copyData(const GpencilModifierData *md, GpencilModifierData *target) tgmd->curve_intensity = BKE_curvemapping_copy(gmd->curve_intensity); } -/* aply smooth effect based on stroke direction */ +/** + * Apply smooth effect based on stroke direction. + */ static void deformStroke(GpencilModifierData *md, Depsgraph *UNUSED(depsgraph), Object *ob, diff --git a/source/blender/gpu/GPU_capabilities.h b/source/blender/gpu/GPU_capabilities.h index e02fbaa6d04..b95053a3715 100644 --- a/source/blender/gpu/GPU_capabilities.h +++ b/source/blender/gpu/GPU_capabilities.h @@ -38,7 +38,7 @@ int GPU_max_textures_vert(void); int GPU_max_textures_geom(void); int GPU_max_textures_frag(void); -int GPU_texture_size_with_limit(int res); +int GPU_texture_size_with_limit(int res, bool limit_gl_texture_size); bool GPU_mip_render_workaround(void); bool GPU_depth_blitting_workaround(void); diff --git a/source/blender/gpu/GPU_framebuffer.h b/source/blender/gpu/GPU_framebuffer.h index 8c6592adf6d..af94c1fb0e6 100644 --- a/source/blender/gpu/GPU_framebuffer.h +++ b/source/blender/gpu/GPU_framebuffer.h @@ -209,6 +209,10 @@ void GPU_framebuffer_recursive_downsample(GPUFrameBuffer *fb, void (*callback)(void *userData, int level), void *userData); +void GPU_framebuffer_push(GPUFrameBuffer *fb); +GPUFrameBuffer *GPU_framebuffer_pop(void); +uint GPU_framebuffer_stack_level_get(void); + /* GPU OffScreen * - wrapper around frame-buffer and texture for simple off-screen drawing */ diff --git a/source/blender/gpu/GPU_texture.h b/source/blender/gpu/GPU_texture.h index da2d2639440..d9a01663de0 100644 --- a/source/blender/gpu/GPU_texture.h +++ b/source/blender/gpu/GPU_texture.h @@ -114,15 +114,15 @@ typedef enum eGPUTextureFormat { GPU_R16F, GPU_R16, /* Max texture buffer format. */ -/* Special formats texture & renderbuffer */ -#if 0 + /* Special formats texture & renderbuffer */ GPU_RGB10_A2, - GPU_RGB10_A2UI, -#endif GPU_R11F_G11F_B10F, GPU_DEPTH32F_STENCIL8, GPU_DEPTH24_STENCIL8, GPU_SRGB8_A8, +#if 0 + GPU_RGB10_A2UI, +#endif /* Texture only format */ GPU_RGB16F, @@ -171,10 +171,11 @@ typedef enum eGPUTextureFormat { typedef enum eGPUDataFormat { GPU_DATA_FLOAT, GPU_DATA_INT, - GPU_DATA_UNSIGNED_INT, - GPU_DATA_UNSIGNED_BYTE, - GPU_DATA_UNSIGNED_INT_24_8, + GPU_DATA_UINT, + GPU_DATA_UBYTE, + GPU_DATA_UINT_24_8, GPU_DATA_10_11_11_REV, + GPU_DATA_2_10_10_10_REV, } eGPUDataFormat; unsigned int GPU_texture_memory_usage_get(void); @@ -272,6 +273,10 @@ int GPU_texture_opengl_bindcode(const GPUTexture *tex); void GPU_texture_get_mipmap_size(GPUTexture *tex, int lvl, int *size); +/* utilities */ +size_t GPU_texture_component_len(eGPUTextureFormat format); +size_t GPU_texture_dataformat_size(eGPUDataFormat data_format); + #ifdef __cplusplus } #endif diff --git a/source/blender/gpu/intern/gpu_capabilities.cc b/source/blender/gpu/intern/gpu_capabilities.cc index 1d2b0e5c7a8..6d9182dcf17 100644 --- a/source/blender/gpu/intern/gpu_capabilities.cc +++ b/source/blender/gpu/intern/gpu_capabilities.cc @@ -49,10 +49,11 @@ int GPU_max_texture_size(void) return GCaps.max_texture_size; } -int GPU_texture_size_with_limit(int res) +int GPU_texture_size_with_limit(int res, bool limit_gl_texture_size) { int size = GPU_max_texture_size(); - int reslimit = (U.glreslimit != 0) ? min_ii(U.glreslimit, size) : size; + int reslimit = (limit_gl_texture_size && (U.glreslimit != 0)) ? min_ii(U.glreslimit, size) : + size; return min_ii(reslimit, res); } diff --git a/source/blender/gpu/intern/gpu_framebuffer.cc b/source/blender/gpu/intern/gpu_framebuffer.cc index 2e183f52eea..1e3cf479462 100644 --- a/source/blender/gpu/intern/gpu_framebuffer.cc +++ b/source/blender/gpu/intern/gpu_framebuffer.cc @@ -476,10 +476,9 @@ void GPU_framebuffer_recursive_downsample(GPUFrameBuffer *gpu_fb, /** \} */ /* -------------------------------------------------------------------- */ -/** \name GPUOffScreen +/** \name Frame-Buffer Stack * - * Container that holds a frame-buffer and its textures. - * Might be bound to multiple contexts. + * Keeps track of frame-buffer binding operation to restore previously bound frame-buffers. * \{ */ #define FRAMEBUFFER_STACK_DEPTH 16 @@ -489,22 +488,36 @@ static struct { uint top; } FrameBufferStack = {{nullptr}}; -static void gpuPushFrameBuffer(GPUFrameBuffer *fb) +void GPU_framebuffer_push(GPUFrameBuffer *fb) { BLI_assert(FrameBufferStack.top < FRAMEBUFFER_STACK_DEPTH); FrameBufferStack.framebuffers[FrameBufferStack.top] = fb; FrameBufferStack.top++; } -static GPUFrameBuffer *gpuPopFrameBuffer() +GPUFrameBuffer *GPU_framebuffer_pop(void) { BLI_assert(FrameBufferStack.top > 0); FrameBufferStack.top--; return FrameBufferStack.framebuffers[FrameBufferStack.top]; } +uint GPU_framebuffer_stack_level_get(void) +{ + return FrameBufferStack.top; +} + #undef FRAMEBUFFER_STACK_DEPTH +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name GPUOffScreen + * + * Container that holds a frame-buffer and its textures. + * Might be bound to multiple contexts. + * \{ */ + #define MAX_CTX_FB_LEN 3 struct GPUOffScreen { @@ -614,7 +627,7 @@ void GPU_offscreen_bind(GPUOffScreen *ofs, bool save) { if (save) { GPUFrameBuffer *fb = GPU_framebuffer_active_get(); - gpuPushFrameBuffer(fb); + GPU_framebuffer_push(fb); } unwrap(gpu_offscreen_fb_get(ofs))->bind(false); } @@ -623,7 +636,7 @@ void GPU_offscreen_unbind(GPUOffScreen *UNUSED(ofs), bool restore) { GPUFrameBuffer *fb = nullptr; if (restore) { - fb = gpuPopFrameBuffer(); + fb = GPU_framebuffer_pop(); } if (fb) { @@ -643,7 +656,7 @@ void GPU_offscreen_draw_to_screen(GPUOffScreen *ofs, int x, int y) void GPU_offscreen_read_pixels(GPUOffScreen *ofs, eGPUDataFormat format, void *pixels) { - BLI_assert(ELEM(format, GPU_DATA_UNSIGNED_BYTE, GPU_DATA_FLOAT)); + BLI_assert(ELEM(format, GPU_DATA_UBYTE, GPU_DATA_FLOAT)); const int w = GPU_texture_width(ofs->color); const int h = GPU_texture_height(ofs->color); diff --git a/source/blender/gpu/intern/gpu_immediate.cc b/source/blender/gpu/intern/gpu_immediate.cc index 95718391165..e56dcd16528 100644 --- a/source/blender/gpu/intern/gpu_immediate.cc +++ b/source/blender/gpu/intern/gpu_immediate.cc @@ -166,7 +166,7 @@ static void wide_line_workaround_start(GPUPrimType prim_type) return; } - imm->prev_shader = imm->shader; + imm->prev_builtin_shader = imm->builtin_shader_bound; immUnbindProgram(); @@ -194,15 +194,15 @@ static void wide_line_workaround_start(GPUPrimType prim_type) static void wide_line_workaround_end() { - if (imm->prev_shader) { + if (imm->prev_builtin_shader) { if (GPU_blend_get() == GPU_BLEND_NONE) { /* Restore default. */ immUniform1i("lineSmooth", 1); } immUnbindProgram(); - immBindShader(imm->prev_shader); - imm->prev_shader = nullptr; + immBindBuiltinProgram(imm->prev_builtin_shader); + imm->prev_builtin_shader = GPU_SHADER_TEXT; } } diff --git a/source/blender/gpu/intern/gpu_immediate_private.hh b/source/blender/gpu/intern/gpu_immediate_private.hh index 98399897ea9..382f70eeec4 100644 --- a/source/blender/gpu/intern/gpu_immediate_private.hh +++ b/source/blender/gpu/intern/gpu_immediate_private.hh @@ -58,7 +58,7 @@ class Immediate { /** Wide Line workaround. */ /** Previously bound shader to restore after drawing. */ - GPUShader *prev_shader = NULL; + eGPUBuiltinShader prev_builtin_shader = GPU_SHADER_TEXT; /** Builtin shader index. Used to test if the workaround can be done. */ eGPUBuiltinShader builtin_shader_bound = GPU_SHADER_TEXT; /** Uniform color: Kept here to update the wide-line shader just before #immBegin. */ diff --git a/source/blender/gpu/intern/gpu_material_library.c b/source/blender/gpu/intern/gpu_material_library.c index 496988c4ba9..64cd375d466 100644 --- a/source/blender/gpu/intern/gpu_material_library.c +++ b/source/blender/gpu/intern/gpu_material_library.c @@ -755,6 +755,10 @@ static void gpu_parse_material_library(GHash *hash, GPUMaterialLibrary *library) /* get parameters */ while (*code && *code != ')') { + if (BLI_str_startswith(code, "const ")) { + code = gpu_str_skip_token(code, NULL, 0); + } + /* test if it's an input or output */ qual = FUNCTION_QUAL_IN; if (BLI_str_startswith(code, "out ")) { diff --git a/source/blender/gpu/intern/gpu_matrix.cc b/source/blender/gpu/intern/gpu_matrix.cc index 4ccb28fedbd..24cdea74347 100644 --- a/source/blender/gpu/intern/gpu_matrix.cc +++ b/source/blender/gpu/intern/gpu_matrix.cc @@ -732,7 +732,7 @@ float GPU_polygon_offset_calc(const float (*winmat)[4], float viewdist, float di #else static float depth_fac = 0.0f; if (depth_fac == 0.0f) { - /* Hardcode for 24 bit precision. */ + /* Hard-code for 24 bit precision. */ int depthbits = 24; depth_fac = 1.0f / (float)((1 << depthbits) - 1); } diff --git a/source/blender/gpu/intern/gpu_select_pick.c b/source/blender/gpu/intern/gpu_select_pick.c index 6cda7888712..89c94fd3ba5 100644 --- a/source/blender/gpu/intern/gpu_select_pick.c +++ b/source/blender/gpu/intern/gpu_select_pick.c @@ -483,7 +483,7 @@ bool gpu_select_pick_load_id(uint id, bool end) const uint rect_len = ps->src.rect_len; GPUFrameBuffer *fb = GPU_framebuffer_active_get(); GPU_framebuffer_read_depth( - fb, UNPACK4(ps->gl.clip_readpixels), GPU_DATA_UNSIGNED_INT, ps->gl.rect_depth_test->buf); + fb, UNPACK4(ps->gl.clip_readpixels), GPU_DATA_UINT, ps->gl.rect_depth_test->buf); /* perform initial check since most cases the array remains unchanged */ bool do_pass = false; diff --git a/source/blender/gpu/intern/gpu_shader.cc b/source/blender/gpu/intern/gpu_shader.cc index 97673e92bcf..bb657ff1645 100644 --- a/source/blender/gpu/intern/gpu_shader.cc +++ b/source/blender/gpu/intern/gpu_shader.cc @@ -166,6 +166,11 @@ void Shader::print_log(Span sources, char *log, const char *stage, found_line_id = true; break; } +/* TODO(fclem) Make this an option to display N lines before error. */ +#if 0 /* Uncomment to print shader file up to the error line to have more context. */ + BLI_dynstr_appendf(dynstr, "%5d | ", src_line_index); + BLI_dynstr_nappend(dynstr, src_line, (src_line_end + 1) - src_line); +#endif /* Continue to next line. */ src_line = src_line_end + 1; src_line_index++; diff --git a/source/blender/gpu/intern/gpu_shader_interface.hh b/source/blender/gpu/intern/gpu_shader_interface.hh index 942be84caae..aec58544111 100644 --- a/source/blender/gpu/intern/gpu_shader_interface.hh +++ b/source/blender/gpu/intern/gpu_shader_interface.hh @@ -60,7 +60,7 @@ class ShaderInterface { uint attr_len_ = 0; uint ubo_len_ = 0; uint uniform_len_ = 0; - /** Enabled bindpoints that needs to be fed with data. */ + /** Enabled bind-points that needs to be fed with data. */ uint16_t enabled_attr_mask_ = 0; uint16_t enabled_ubo_mask_ = 0; uint8_t enabled_ima_mask_ = 0; diff --git a/source/blender/gpu/intern/gpu_texture.cc b/source/blender/gpu/intern/gpu_texture.cc index d134d718cbe..c3e9058c6c7 100644 --- a/source/blender/gpu/intern/gpu_texture.cc +++ b/source/blender/gpu/intern/gpu_texture.cc @@ -608,3 +608,19 @@ void GPU_samplers_update(void) } /** \} */ + +/* -------------------------------------------------------------------- */ +/** \name GPU texture utilities + * \{ */ + +size_t GPU_texture_component_len(eGPUTextureFormat tex_format) +{ + return to_component_len(tex_format); +} + +size_t GPU_texture_dataformat_size(eGPUDataFormat data_format) +{ + return to_bytesize(data_format); +} + +/** \} */ diff --git a/source/blender/gpu/intern/gpu_texture_private.hh b/source/blender/gpu/intern/gpu_texture_private.hh index 400a36559da..3d808bce152 100644 --- a/source/blender/gpu/intern/gpu_texture_private.hh +++ b/source/blender/gpu/intern/gpu_texture_private.hh @@ -283,6 +283,7 @@ inline size_t to_bytesize(eGPUTextureFormat format) case GPU_RGBA8UI: case GPU_RGBA8: case GPU_SRGB8_A8: + case GPU_RGB10_A2: case GPU_R11F_G11F_B10F: case GPU_R32F: case GPU_R32UI: @@ -368,6 +369,7 @@ inline int to_component_len(eGPUTextureFormat format) case GPU_RGBA16: case GPU_RGBA32F: case GPU_SRGB8_A8: + case GPU_RGB10_A2: return 4; case GPU_RGB16F: case GPU_R11F_G11F_B10F: @@ -384,17 +386,18 @@ inline int to_component_len(eGPUTextureFormat format) } } -inline size_t to_bytesize(eGPUTextureFormat tex_format, eGPUDataFormat data_format) +inline size_t to_bytesize(eGPUDataFormat data_format) { switch (data_format) { - case GPU_DATA_UNSIGNED_BYTE: - return 1 * to_component_len(tex_format); + case GPU_DATA_UBYTE: + return 1; case GPU_DATA_FLOAT: case GPU_DATA_INT: - case GPU_DATA_UNSIGNED_INT: - return 4 * to_component_len(tex_format); - case GPU_DATA_UNSIGNED_INT_24_8: + case GPU_DATA_UINT: + return 4; + case GPU_DATA_UINT_24_8: case GPU_DATA_10_11_11_REV: + case GPU_DATA_2_10_10_10_REV: return 4; default: BLI_assert(!"Data format incorrect or unsupported\n"); @@ -402,6 +405,11 @@ inline size_t to_bytesize(eGPUTextureFormat tex_format, eGPUDataFormat data_form } } +inline size_t to_bytesize(eGPUTextureFormat tex_format, eGPUDataFormat data_format) +{ + return to_component_len(tex_format) * to_bytesize(data_format); +} + /* Definitely not complete, edit according to the gl specification. */ inline bool validate_data_format(eGPUTextureFormat tex_format, eGPUDataFormat data_format) { @@ -412,12 +420,12 @@ inline bool validate_data_format(eGPUTextureFormat tex_format, eGPUDataFormat da return data_format == GPU_DATA_FLOAT; case GPU_DEPTH24_STENCIL8: case GPU_DEPTH32F_STENCIL8: - return data_format == GPU_DATA_UNSIGNED_INT_24_8; + return data_format == GPU_DATA_UINT_24_8; case GPU_R8UI: case GPU_R16UI: case GPU_RG16UI: case GPU_R32UI: - return data_format == GPU_DATA_UNSIGNED_INT; + return data_format == GPU_DATA_UINT; case GPU_RG16I: case GPU_R16I: return data_format == GPU_DATA_INT; @@ -426,7 +434,9 @@ inline bool validate_data_format(eGPUTextureFormat tex_format, eGPUDataFormat da case GPU_RGBA8: case GPU_RGBA8UI: case GPU_SRGB8_A8: - return ELEM(data_format, GPU_DATA_UNSIGNED_BYTE, GPU_DATA_FLOAT); + return ELEM(data_format, GPU_DATA_UBYTE, GPU_DATA_FLOAT); + case GPU_RGB10_A2: + return ELEM(data_format, GPU_DATA_2_10_10_10_REV, GPU_DATA_FLOAT); case GPU_R11F_G11F_B10F: return ELEM(data_format, GPU_DATA_10_11_11_REV, GPU_DATA_FLOAT); default: @@ -444,12 +454,12 @@ inline eGPUDataFormat to_data_format(eGPUTextureFormat tex_format) return GPU_DATA_FLOAT; case GPU_DEPTH24_STENCIL8: case GPU_DEPTH32F_STENCIL8: - return GPU_DATA_UNSIGNED_INT_24_8; + return GPU_DATA_UINT_24_8; case GPU_R8UI: case GPU_R16UI: case GPU_RG16UI: case GPU_R32UI: - return GPU_DATA_UNSIGNED_INT; + return GPU_DATA_UINT; case GPU_RG16I: case GPU_R16I: return GPU_DATA_INT; @@ -458,7 +468,9 @@ inline eGPUDataFormat to_data_format(eGPUTextureFormat tex_format) case GPU_RGBA8: case GPU_RGBA8UI: case GPU_SRGB8_A8: - return GPU_DATA_UNSIGNED_BYTE; + return GPU_DATA_UBYTE; + case GPU_RGB10_A2: + return GPU_DATA_2_10_10_10_REV; case GPU_R11F_G11F_B10F: return GPU_DATA_10_11_11_REV; default: diff --git a/source/blender/gpu/opengl/gl_framebuffer.cc b/source/blender/gpu/opengl/gl_framebuffer.cc index aea19295311..920dac407d7 100644 --- a/source/blender/gpu/opengl/gl_framebuffer.cc +++ b/source/blender/gpu/opengl/gl_framebuffer.cc @@ -365,7 +365,7 @@ void GLFrameBuffer::clear_attachment(GPUAttachmentType type, context_->state_manager->apply_state(); if (type == GPU_FB_DEPTH_STENCIL_ATTACHMENT) { - BLI_assert(data_format == GPU_DATA_UNSIGNED_INT_24_8); + BLI_assert(data_format == GPU_DATA_UINT_24_8); float depth = ((*(uint32_t *)clear_value) & 0x00FFFFFFu) / (float)0x00FFFFFFu; int stencil = ((*(uint32_t *)clear_value) >> 24); glClearBufferfi(GL_DEPTH_STENCIL, 0, depth, stencil); @@ -374,7 +374,7 @@ void GLFrameBuffer::clear_attachment(GPUAttachmentType type, if (data_format == GPU_DATA_FLOAT) { glClearBufferfv(GL_DEPTH, 0, (GLfloat *)clear_value); } - else if (data_format == GPU_DATA_UNSIGNED_INT) { + else if (data_format == GPU_DATA_UINT) { float depth = *(uint32_t *)clear_value / (float)0xFFFFFFFFu; glClearBufferfv(GL_DEPTH, 0, &depth); } @@ -388,7 +388,7 @@ void GLFrameBuffer::clear_attachment(GPUAttachmentType type, case GPU_DATA_FLOAT: glClearBufferfv(GL_COLOR, slot, (GLfloat *)clear_value); break; - case GPU_DATA_UNSIGNED_INT: + case GPU_DATA_UINT: glClearBufferuiv(GL_COLOR, slot, (GLuint *)clear_value); break; case GPU_DATA_INT: diff --git a/source/blender/gpu/opengl/gl_texture.cc b/source/blender/gpu/opengl/gl_texture.cc index ef38e964c7b..51cfcd20a6c 100644 --- a/source/blender/gpu/opengl/gl_texture.cc +++ b/source/blender/gpu/opengl/gl_texture.cc @@ -297,15 +297,15 @@ void GLTexture::update_sub( void GLTexture::generate_mipmap() { this->ensure_mipmaps(9999); - /* Some drivers have bugs when using glGenerateMipmap with depth textures (see T56789). + /* Some drivers have bugs when using #glGenerateMipmap with depth textures (see T56789). * In this case we just create a complete texture with mipmaps manually without * down-sampling. You must initialize the texture levels using other methods like - * GPU_framebuffer_recursive_downsample(). */ + * #GPU_framebuffer_recursive_downsample(). */ if (format_flag_ & GPU_FORMAT_DEPTH) { return; } - /* Downsample from mip 0 using implementation. */ + /* Down-sample from mip 0 using implementation. */ if (GLContext::direct_state_access_support) { glGenerateTextureMipmap(tex_id_); } diff --git a/source/blender/gpu/opengl/gl_texture.hh b/source/blender/gpu/opengl/gl_texture.hh index 65a211e12a3..9da27056269 100644 --- a/source/blender/gpu/opengl/gl_texture.hh +++ b/source/blender/gpu/opengl/gl_texture.hh @@ -158,6 +158,8 @@ inline GLenum to_gl_internal_format(eGPUTextureFormat format) case GPU_R16: return GL_R16; /* Special formats texture & renderbuffer */ + case GPU_RGB10_A2: + return GL_RGB10_A2; case GPU_R11F_G11F_B10F: return GL_R11F_G11F_B10F; case GPU_DEPTH32F_STENCIL8: @@ -274,12 +276,14 @@ inline GLenum to_gl(eGPUDataFormat format) return GL_FLOAT; case GPU_DATA_INT: return GL_INT; - case GPU_DATA_UNSIGNED_INT: + case GPU_DATA_UINT: return GL_UNSIGNED_INT; - case GPU_DATA_UNSIGNED_BYTE: + case GPU_DATA_UBYTE: return GL_UNSIGNED_BYTE; - case GPU_DATA_UNSIGNED_INT_24_8: + case GPU_DATA_UINT_24_8: return GL_UNSIGNED_INT_24_8; + case GPU_DATA_2_10_10_10_REV: + return GL_UNSIGNED_INT_2_10_10_10_REV; case GPU_DATA_10_11_11_REV: return GL_UNSIGNED_INT_10F_11F_11F_REV; default: @@ -333,6 +337,7 @@ inline GLenum to_gl_data_format(eGPUTextureFormat format) case GPU_RGBA16: case GPU_RGBA16F: case GPU_RGBA32F: + case GPU_RGB10_A2: return GL_RGBA; case GPU_DEPTH24_STENCIL8: case GPU_DEPTH32F_STENCIL8: diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl index eea8d19efce..0231aeca04b 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl @@ -1,13 +1,24 @@ #ifndef VOLUMETRICS -void node_ambient_occlusion( - vec4 color, float distance, vec3 normal, out vec4 result_color, out float result_ao) +void node_ambient_occlusion(vec4 color, + float dist, + vec3 normal, + const float inverted, + out vec4 result_color, + out float result_ao) { vec3 bent_normal; vec4 rand = texelfetch_noise_tex(gl_FragCoord.xy); - result_ao = occlusion_compute(normalize(normal), viewPosition, 1.0, rand, bent_normal); + OcclusionData data = occlusion_search(viewPosition, maxzBuffer, dist, inverted, 8.0); + + vec3 V = cameraVec(worldPosition); + vec3 N = normalize(normal); + vec3 Ng = safe_normalize(cross(dFdx(worldPosition), dFdy(worldPosition))); + + vec3 unused; + occlusion_eval(data, V, N, Ng, inverted, result_ao, unused); result_color = result_ao * color; } #else /* Stub ambient occlusion because it is not compatible with volumetrics. */ -# define node_ambient_occlusion(a, b, c, d, e) (e = CLOSURE_DEFAULT) +# define node_ambient_occlusion(a, b, c, d, e, f) (e = vec4(0); f = 0.0) #endif diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_diffuse.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_diffuse.glsl index d7b6143d2a1..01a16e194ca 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_diffuse.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_diffuse.glsl @@ -1,12 +1,27 @@ #ifndef VOLUMETRICS + +CLOSURE_EVAL_FUNCTION_DECLARE_1(node_bsdf_diffuse, Diffuse) + void node_bsdf_diffuse(vec4 color, float roughness, vec3 N, out Closure result) { - N = normalize(N); + CLOSURE_VARS_DECLARE_1(Diffuse); + + in_Diffuse_0.N = N; /* Normalized during eval. */ + in_Diffuse_0.albedo = color.rgb; + + CLOSURE_EVAL_FUNCTION_1(node_bsdf_diffuse, Diffuse); + result = CLOSURE_DEFAULT; - eevee_closure_diffuse(N, color.rgb, 1.0, true, result.radiance); - result.radiance = render_pass_diffuse_mask(color.rgb, result.radiance * color.rgb); - closure_load_ssr_data(vec3(0.0), 0.0, N, viewCameraVec, -1, result); + + out_Diffuse_0.radiance = render_pass_diffuse_mask(vec3(1.0), out_Diffuse_0.radiance); + out_Diffuse_0.radiance *= color.rgb; + + result.radiance = out_Diffuse_0.radiance; + + /* TODO(fclem) Try to not use this. */ + closure_load_ssr_data(vec3(0.0), 0.0, in_Diffuse_0.N, -1.0, result); } + #else /* Stub diffuse because it is not compatible with volumetrics. */ # define node_bsdf_diffuse(a, b, c, d) (d = CLOSURE_DEFAULT) diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl index 443bab7529b..0941482df45 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl @@ -1,4 +1,7 @@ #ifndef VOLUMETRICS + +CLOSURE_EVAL_FUNCTION_DECLARE_3(node_eevee_specular, Diffuse, Glossy, Glossy) + void node_eevee_specular(vec4 diffuse, vec4 specular, float roughness, @@ -12,34 +15,65 @@ void node_eevee_specular(vec4 diffuse, float ssr_id, out Closure result) { - normal = normalize(normal); + CLOSURE_VARS_DECLARE_3(Diffuse, Glossy, Glossy); - vec3 out_diff, out_spec, ssr_spec; - eevee_closure_default_clearcoat(normal, - diffuse.rgb, - specular.rgb, - vec3(1.0), - int(ssr_id), - roughness, - clearcoat_normal, - clearcoat * 0.25, - clearcoat_roughness, - occlusion, - true, - out_diff, - out_spec, - ssr_spec); + in_common.occlusion = occlusion; + + in_Diffuse_0.N = normal; /* Normalized during eval. */ + in_Diffuse_0.albedo = diffuse.rgb; + + in_Glossy_1.N = normal; /* Normalized during eval. */ + in_Glossy_1.roughness = roughness; + + in_Glossy_2.N = clearcoat_normal; /* Normalized during eval. */ + in_Glossy_2.roughness = clearcoat_roughness; + + CLOSURE_EVAL_FUNCTION_3(node_eevee_specular, Diffuse, Glossy, Glossy); + + result = CLOSURE_DEFAULT; + + vec3 V = cameraVec(worldPosition); + + { + /* Diffuse. */ + out_Diffuse_0.radiance = render_pass_diffuse_mask(vec3(1), out_Diffuse_0.radiance); + out_Diffuse_0.radiance *= in_Diffuse_0.albedo; + result.radiance += out_Diffuse_0.radiance; + } + { + /* Glossy. */ + float NV = dot(in_Glossy_1.N, V); + vec2 split_sum = brdf_lut(NV, in_Glossy_1.roughness); + vec3 brdf = F_brdf_single_scatter(specular.rgb, vec3(1.0), split_sum); + + out_Glossy_1.radiance = closure_mask_ssr_radiance(out_Glossy_1.radiance, ssr_id); + out_Glossy_1.radiance *= brdf; + out_Glossy_1.radiance = render_pass_glossy_mask(specular.rgb, out_Glossy_1.radiance); + closure_load_ssr_data( + out_Glossy_1.radiance, in_Glossy_1.roughness, in_Glossy_1.N, ssr_id, result); + } + { + /* Clearcoat. */ + float NV = dot(in_Glossy_2.N, V); + vec2 split_sum = brdf_lut(NV, in_Glossy_2.roughness); + vec3 brdf = F_brdf_single_scatter(vec3(0.04), vec3(1.0), split_sum); + + out_Glossy_2.radiance *= brdf * clearcoat * 0.25; + out_Glossy_2.radiance = render_pass_glossy_mask(vec3(1), out_Glossy_2.radiance); + result.radiance += out_Glossy_2.radiance; + } + { + /* Emission. */ + vec3 out_emission_radiance = render_pass_emission_mask(emissive.rgb); + result.radiance += out_emission_radiance; + } float alpha = 1.0 - transp; - result = CLOSURE_DEFAULT; - result.radiance = render_pass_diffuse_mask(diffuse.rgb, out_diff * diffuse.rgb); - result.radiance += render_pass_glossy_mask(vec3(1.0), out_spec); - result.radiance += render_pass_emission_mask(emissive.rgb); - result.radiance *= alpha; result.transmittance = vec3(transp); - - closure_load_ssr_data(ssr_spec * alpha, roughness, normal, viewCameraVec, int(ssr_id), result); + result.radiance *= alpha; + result.ssr_data.rgb *= alpha; } + #else /* Stub specular because it is not compatible with volumetrics. */ # define node_eevee_specular(a, b, c, d, e, f, g, h, i, j, k, result) (result = CLOSURE_DEFAULT) diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_emission.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_emission.glsl index 502bc7f92d6..f2de7c2da39 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_emission.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_emission.glsl @@ -3,7 +3,7 @@ void node_emission(vec4 color, float strength, vec3 vN, out Closure result) result = CLOSURE_DEFAULT; #ifndef VOLUMETRICS result.radiance = render_pass_emission_mask(color.rgb) * strength; - result.ssr_normal = normal_encode(vN, viewCameraVec); + result.ssr_normal = normal_encode(vN, viewCameraVec(viewPosition)); #else result.emission = color.rgb * strength; #endif diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl index c328b4800bc..aa0a8873596 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl @@ -1,38 +1,56 @@ #ifndef VOLUMETRICS + +CLOSURE_EVAL_FUNCTION_DECLARE_2(node_bsdf_glass, Glossy, Refraction) + void node_bsdf_glass(vec4 color, float roughness, float ior, vec3 N, - float use_multiscatter, - float ssr_id, + const float do_multiscatter, + const float ssr_id, out Closure result) { - N = normalize(N); - vec3 out_spec, out_refr, ssr_spec; - vec3 refr_color = (refractionDepth > 0.0) ? color.rgb * color.rgb : - color.rgb; /* Simulate 2 transmission event */ - eevee_closure_glass(N, - vec3(1.0), - /* HACK: Pass the multiscatter flag as the sign to not add closure - * variations or increase register usage. */ - (use_multiscatter != 0.0) ? vec3(1.0) : -vec3(1.0), - int(ssr_id), - roughness, - 1.0, - ior, - true, - out_spec, - out_refr, - ssr_spec); - float fresnel = F_eta(ior, dot(N, cameraVec)); - vec3 vN = mat3(ViewMatrix) * N; - result = CLOSURE_DEFAULT; - result.radiance = render_pass_glossy_mask(refr_color, out_refr * refr_color) * (1.0 - fresnel); - result.radiance += render_pass_glossy_mask(color.rgb, out_spec * color.rgb) * fresnel; + CLOSURE_VARS_DECLARE_2(Glossy, Refraction); + in_Glossy_0.N = N; /* Normalized during eval. */ + in_Glossy_0.roughness = roughness; + + in_Refraction_1.N = N; /* Normalized during eval. */ + in_Refraction_1.roughness = roughness; + in_Refraction_1.ior = ior; + + CLOSURE_EVAL_FUNCTION_2(node_bsdf_glass, Glossy, Refraction); + + result = CLOSURE_DEFAULT; + + float NV = dot(in_Refraction_1.N, cameraVec(worldPosition)); + + float fresnel = (do_multiscatter != 0.0) ? + btdf_lut(NV, in_Refraction_1.roughness, in_Refraction_1.ior).y : + F_eta(in_Refraction_1.ior, NV); + + vec2 split_sum = brdf_lut(NV, in_Glossy_0.roughness); + vec3 brdf = (do_multiscatter != 0.0) ? F_brdf_multi_scatter(vec3(1.0), vec3(1.0), split_sum) : + F_brdf_single_scatter(vec3(1.0), vec3(1.0), split_sum); + + out_Glossy_0.radiance = closure_mask_ssr_radiance(out_Glossy_0.radiance, ssr_id); + out_Glossy_0.radiance *= brdf; + out_Glossy_0.radiance = render_pass_glossy_mask(vec3(1.0), out_Glossy_0.radiance); + out_Glossy_0.radiance *= color.rgb * fresnel; closure_load_ssr_data( - ssr_spec * color.rgb * fresnel, roughness, N, viewCameraVec, int(ssr_id), result); + out_Glossy_0.radiance, in_Glossy_0.roughness, in_Glossy_0.N, ssr_id, result); + + float btdf = (do_multiscatter != 0.0) ? + 1.0 : + btdf_lut(NV, in_Refraction_1.roughness, in_Refraction_1.ior).x; + out_Refraction_1.radiance *= btdf; + out_Refraction_1.radiance = render_pass_glossy_mask(vec3(1.0), out_Refraction_1.radiance); + out_Refraction_1.radiance *= color.rgb * (1.0 - fresnel); + /* Simulate 2nd absorption event. */ + out_Refraction_1.radiance *= (refractionDepth > 0.0) ? color.rgb : vec3(1.0); + result.radiance += out_Refraction_1.radiance; } + #else /* Stub glass because it is not compatible with volumetrics. */ # define node_bsdf_glass(a, b, c, d, e, f, result) (result = CLOSURE_DEFAULT) diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl index 36675cf720d..fa83bfb6c7a 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl @@ -1,23 +1,32 @@ #ifndef VOLUMETRICS + +CLOSURE_EVAL_FUNCTION_DECLARE_1(node_bsdf_glossy, Glossy) + void node_bsdf_glossy( vec4 color, float roughness, vec3 N, float use_multiscatter, float ssr_id, out Closure result) { - N = normalize(N); - vec3 out_spec, ssr_spec; - eevee_closure_glossy(N, - vec3(1.0), - use_multiscatter != 0.0 ? vec3(1.0) : vec3(-1.0), /* HACK */ - int(ssr_id), - roughness, - 1.0, - true, - out_spec, - ssr_spec); - vec3 vN = mat3(ViewMatrix) * N; + bool do_ssr = (ssrToggle && int(ssr_id) == outputSsrId); + + CLOSURE_VARS_DECLARE_1(Glossy); + + in_Glossy_0.N = N; /* Normalized during eval. */ + in_Glossy_0.roughness = roughness; + + CLOSURE_EVAL_FUNCTION_1(node_bsdf_glossy, Glossy); + result = CLOSURE_DEFAULT; - result.radiance = render_pass_glossy_mask(vec3(1.0), out_spec) * color.rgb; - closure_load_ssr_data(ssr_spec * color.rgb, roughness, N, viewCameraVec, int(ssr_id), result); + + vec2 split_sum = brdf_lut(dot(in_Glossy_0.N, cameraVec(worldPosition)), in_Glossy_0.roughness); + vec3 brdf = (use_multiscatter != 0.0) ? F_brdf_multi_scatter(vec3(1.0), vec3(1.0), split_sum) : + F_brdf_single_scatter(vec3(1.0), vec3(1.0), split_sum); + out_Glossy_0.radiance = closure_mask_ssr_radiance(out_Glossy_0.radiance, ssr_id); + out_Glossy_0.radiance *= brdf; + out_Glossy_0.radiance = render_pass_glossy_mask(vec3(1.0), out_Glossy_0.radiance); + out_Glossy_0.radiance *= color.rgb; + closure_load_ssr_data( + out_Glossy_0.radiance, in_Glossy_0.roughness, in_Glossy_0.N, ssr_id, result); } + #else /* Stub glossy because it is not compatible with volumetrics. */ # define node_bsdf_glossy(a, b, c, d, e, result) (result = CLOSURE_DEFAULT) diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl index 3bd578e1ffc..49c8973a8ce 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl @@ -1,41 +1,20 @@ #ifndef VOLUMETRICS vec3 tint_from_color(vec3 color) { - float lum = dot(color, vec3(0.3, 0.6, 0.1)); /* luminance approx. */ - return (lum > 0) ? color / lum : vec3(1.0); /* normalize lum. to isolate hue+sat */ + float lum = dot(color, vec3(0.3, 0.6, 0.1)); /* luminance approx. */ + return (lum > 0.0) ? color / lum : vec3(1.0); /* normalize lum. to isolate hue+sat */ } -void convert_metallic_to_specular_tinted(vec3 basecol, - vec3 basecol_tint, - float metallic, - float specular_fac, - float specular_tint, - out vec3 diffuse, - out vec3 f0) -{ - vec3 tmp_col = mix(vec3(1.0), basecol_tint, specular_tint); - f0 = mix((0.08 * specular_fac) * tmp_col, basecol, metallic); - diffuse = basecol * (1.0 - metallic); -} - -/* Output sheen is to be multiplied by sheen_color. */ -void principled_sheen(float NV, - vec3 basecol_tint, - float sheen, - float sheen_tint, - out float out_sheen, - out vec3 sheen_color) +float principled_sheen(float NV) { float f = 1.0 - NV; - /* Temporary fix for T59784. Normal map seems to contain NaNs for tangent space normal maps, - * therefore we need to clamp value. */ - f = clamp(f, 0.0, 1.0); /* Empirical approximation (manual curve fitting). Can be refined. */ - out_sheen = f * f * f * 0.077 + f * 0.01 + 0.00026; - - sheen_color = sheen * mix(vec3(1.0), basecol_tint, sheen_tint); + float sheen = f * f * f * 0.077 + f * 0.01 + 0.00026; + return sheen; } +CLOSURE_EVAL_FUNCTION_DECLARE_4(node_bsdf_principled, Diffuse, Glossy, Glossy, Refraction) + void node_bsdf_principled(vec4 base_color, float subsurface, vec3 subsurface_radius, @@ -59,434 +38,168 @@ void node_bsdf_principled(vec4 base_color, vec3 N, vec3 CN, vec3 T, - vec3 I, - float use_multiscatter, + const float do_diffuse, + const float do_clearcoat, + const float do_refraction, + const float do_multiscatter, float ssr_id, float sss_id, vec3 sss_scale, out Closure result) { - N = normalize(N); - ior = max(ior, 1e-5); + /* Match cycles. */ metallic = saturate(metallic); transmission = saturate(transmission); - float m_transmission = 1.0 - transmission; + float diffuse_weight = (1.0 - transmission) * (1.0 - metallic); + transmission *= (1.0 - metallic); + float specular_weight = (1.0 - transmission); + clearcoat = max(clearcoat, 0.0); + transmission_roughness = 1.0 - (1.0 - roughness) * (1.0 - transmission_roughness); - float dielectric = 1.0 - metallic; - transmission *= dielectric; - sheen *= dielectric; - subsurface_color *= dielectric; + CLOSURE_VARS_DECLARE_4(Diffuse, Glossy, Glossy, Refraction); - vec3 diffuse, f0, out_diff, out_spec, out_refr, ssr_spec, sheen_color; - float out_sheen; - vec3 ctint = tint_from_color(base_color.rgb); - convert_metallic_to_specular_tinted( - base_color.rgb, ctint, metallic, specular, specular_tint, diffuse, f0); + in_Diffuse_0.N = N; /* Normalized during eval. */ + in_Diffuse_0.albedo = mix(base_color.rgb, subsurface_color.rgb, subsurface); - float NV = dot(N, cameraVec); - principled_sheen(NV, ctint, sheen, sheen_tint, out_sheen, sheen_color); + in_Glossy_1.N = N; /* Normalized during eval. */ + in_Glossy_1.roughness = roughness; - vec3 f90 = mix(vec3(1.0), f0, (1.0 - specular) * metallic); + in_Glossy_2.N = CN; /* Normalized during eval. */ + in_Glossy_2.roughness = clearcoat_roughness; - /* Far from being accurate, but 2 glossy evaluation is too expensive. - * Most noticeable difference is at grazing angles since the bsdf lut - * f0 color interpolation is done on top of this interpolation. */ - vec3 f0_glass = mix(vec3(1.0), base_color.rgb, specular_tint); - float fresnel = F_eta(ior, NV); - vec3 spec_col = F_color_blend(ior, fresnel, f0_glass) * fresnel; - f0 = mix(f0, spec_col, transmission); - f90 = mix(f90, spec_col, transmission); + in_Refraction_3.N = N; /* Normalized during eval. */ + in_Refraction_3.roughness = do_multiscatter != 0.0 ? roughness : transmission_roughness; + in_Refraction_3.ior = ior; - /* Really poor approximation but needed to workaround issues with renderpasses. */ - spec_col = mix(vec3(1.0), spec_col, transmission); - /* Match cycles. */ - spec_col += float(clearcoat > 1e-5); - - vec3 mixed_ss_base_color = mix(diffuse, subsurface_color.rgb, subsurface); - - float sss_scalef = avg(sss_scale) * subsurface; - eevee_closure_principled(N, - mixed_ss_base_color, - f0, - /* HACK: Pass the multiscatter flag as the sign to not add closure - * variations or increase register usage. */ - (use_multiscatter != 0.0) ? f90 : -f90, - int(ssr_id), - roughness, - CN, - clearcoat * 0.25, - clearcoat_roughness, - 1.0, - sss_scalef, - ior, - true, - out_diff, - out_spec, - out_refr, - ssr_spec); - - vec3 refr_color = base_color.rgb; - refr_color *= (refractionDepth > 0.0) ? refr_color : - vec3(1.0); /* Simulate 2 transmission event */ - refr_color *= saturate(1.0 - fresnel) * transmission; - - sheen_color *= m_transmission; - mixed_ss_base_color *= m_transmission; + CLOSURE_EVAL_FUNCTION_4(node_bsdf_principled, Diffuse, Glossy, Glossy, Refraction); result = CLOSURE_DEFAULT; - result.radiance = render_pass_glossy_mask(refr_color, out_refr * refr_color); - result.radiance += render_pass_glossy_mask(spec_col, out_spec); - /* Coarse approx. */ - result.radiance += render_pass_diffuse_mask(sheen_color, out_diff * out_sheen * sheen_color); - result.radiance += render_pass_emission_mask(emission.rgb * emission_strength); - result.radiance *= alpha; - closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result); - mixed_ss_base_color *= alpha; - closure_load_sss_data(sss_scalef, out_diff, mixed_ss_base_color, int(sss_id), result); - result.transmittance = vec3(1.0 - alpha); -} + /* This will tag the whole eval for optimisation. */ + if (do_diffuse == 0.0) { + out_Diffuse_0.radiance = vec3(0); + } + if (do_clearcoat == 0.0) { + out_Glossy_2.radiance = vec3(0); + } + if (do_refraction == 0.0) { + out_Refraction_3.radiance = vec3(0); + } -void node_bsdf_principled_dielectric(vec4 base_color, - float subsurface, - vec3 subsurface_radius, - vec4 subsurface_color, - float metallic, - float specular, - float specular_tint, - float roughness, - float anisotropic, - float anisotropic_rotation, - float sheen, - float sheen_tint, - float clearcoat, - float clearcoat_roughness, - float ior, - float transmission, - float transmission_roughness, - vec4 emission, - float emission_strength, - float alpha, - vec3 N, - vec3 CN, - vec3 T, - vec3 I, - float use_multiscatter, - float ssr_id, - float sss_id, - vec3 sss_scale, - out Closure result) -{ - N = normalize(N); - metallic = saturate(metallic); - float dielectric = 1.0 - metallic; + vec3 V = cameraVec(worldPosition); - vec3 diffuse, f0, out_diff, out_spec, ssr_spec, sheen_color; - float out_sheen; - vec3 ctint = tint_from_color(base_color.rgb); - convert_metallic_to_specular_tinted( - base_color.rgb, ctint, metallic, specular, specular_tint, diffuse, f0); + /* Glossy_1 will always be evaluated. */ + float NV = dot(in_Glossy_1.N, V); - vec3 f90 = mix(vec3(1.0), f0, (1.0 - specular) * metallic); + vec3 base_color_tint = tint_from_color(base_color.rgb); - float NV = dot(N, cameraVec); - principled_sheen(NV, ctint, sheen, sheen_tint, out_sheen, sheen_color); + float fresnel = (do_multiscatter != 0.0) ? + btdf_lut(NV, in_Glossy_1.roughness, in_Refraction_3.ior).y : + F_eta(in_Refraction_3.ior, NV); - eevee_closure_default(N, - diffuse, - f0, - /* HACK: Pass the multiscatter flag as the sign to not add closure - * variations or increase register usage. */ - (use_multiscatter != 0.0) ? f90 : -f90, - int(ssr_id), - roughness, - 1.0, - true, - out_diff, - out_spec, - ssr_spec); + { + /* Glossy reflections. + * Separate Glass reflections and main specular reflections to match Cycles renderpasses. */ + out_Glossy_1.radiance = closure_mask_ssr_radiance(out_Glossy_1.radiance, ssr_id); - result = CLOSURE_DEFAULT; - result.radiance = render_pass_glossy_mask(vec3(1.0), out_spec); - result.radiance += render_pass_diffuse_mask(sheen_color, out_diff * out_sheen * sheen_color); - result.radiance += render_pass_diffuse_mask(diffuse, out_diff * diffuse); - result.radiance += render_pass_emission_mask(emission.rgb * emission_strength); - result.radiance *= alpha; - closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result); + vec2 split_sum = brdf_lut(NV, roughness); + + vec3 glossy_radiance_final = vec3(0.0); + if (transmission > 1e-5) { + /* Glass Reflection: Reuse radiance from Glossy1. */ + vec3 out_glass_refl_radiance = out_Glossy_1.radiance; + + /* Poor approximation since we baked the LUT using a fixed IOR. */ + vec3 f0 = mix(vec3(1.0), base_color.rgb, specular_tint); + vec3 f90 = vec3(1); + + vec3 brdf = (do_multiscatter != 0.0) ? F_brdf_multi_scatter(f0, f90, split_sum) : + F_brdf_single_scatter(f0, f90, split_sum); + + out_glass_refl_radiance *= brdf; + out_glass_refl_radiance = render_pass_glossy_mask(vec3(1), out_glass_refl_radiance); + out_glass_refl_radiance *= fresnel * transmission; + glossy_radiance_final += out_glass_refl_radiance; + } + if (specular_weight > 1e-5) { + vec3 dielectric_f0_color = mix(vec3(1.0), base_color_tint, specular_tint); + vec3 metallic_f0_color = base_color.rgb; + vec3 f0 = mix((0.08 * specular) * dielectric_f0_color, metallic_f0_color, metallic); + /* Cycles does this blending using the microfacet fresnel factor. However, our fresnel + * is already baked inside the split sum LUT. We approximate using by modifying the + * changing the f90 color directly in a non linear fashion. */ + vec3 f90 = mix(f0, vec3(1), fast_sqrt(specular)); + + vec3 brdf = (do_multiscatter != 0.0) ? F_brdf_multi_scatter(f0, f90, split_sum) : + F_brdf_single_scatter(f0, f90, split_sum); + + out_Glossy_1.radiance *= brdf; + out_Glossy_1.radiance = render_pass_glossy_mask(vec3(1), out_Glossy_1.radiance); + out_Glossy_1.radiance *= specular_weight; + glossy_radiance_final += out_Glossy_1.radiance; + } + + closure_load_ssr_data( + glossy_radiance_final, in_Glossy_1.roughness, in_Glossy_1.N, ssr_id, result); + } + + if (diffuse_weight > 1e-5) { + /* Mask over all diffuse radiance. */ + out_Diffuse_0.radiance *= diffuse_weight; + + /* Sheen Coarse approximation: We reuse the diffuse radiance and just scale it. */ + vec3 sheen_color = mix(vec3(1), base_color_tint, sheen_tint); + vec3 out_sheen_radiance = out_Diffuse_0.radiance * principled_sheen(NV); + out_sheen_radiance = render_pass_diffuse_mask(vec3(1), out_sheen_radiance); + out_sheen_radiance *= sheen * sheen_color; + result.radiance += out_sheen_radiance; + + /* Diffuse / Subsurface. */ + float scale = avg(sss_scale) * subsurface; + closure_load_sss_data(scale, out_Diffuse_0.radiance, in_Diffuse_0.albedo, int(sss_id), result); + } + + if (transmission > 1e-5) { + float btdf = (do_multiscatter != 0.0) ? + 1.0 : + btdf_lut(NV, in_Refraction_3.roughness, in_Refraction_3.ior).x; + /* TODO(fclem) This could be going to a transmission render pass instead. */ + out_Refraction_3.radiance *= btdf; + out_Refraction_3.radiance = render_pass_glossy_mask(vec3(1), out_Refraction_3.radiance); + out_Refraction_3.radiance *= base_color.rgb; + /* Simulate 2nd transmission event. */ + out_Refraction_3.radiance *= (refractionDepth > 0.0) ? base_color.rgb : vec3(1); + out_Refraction_3.radiance *= (1.0 - fresnel) * transmission; + result.radiance += out_Refraction_3.radiance; + } + + if (clearcoat > 1e-5) { + float NV = dot(in_Glossy_2.N, V); + vec2 split_sum = brdf_lut(NV, in_Glossy_2.roughness); + vec3 brdf = F_brdf_single_scatter(vec3(0.04), vec3(1.0), split_sum); + + out_Glossy_2.radiance *= brdf * clearcoat * 0.25; + out_Glossy_2.radiance = render_pass_glossy_mask(vec3(1), out_Glossy_2.radiance); + result.radiance += out_Glossy_2.radiance; + } + + { + vec3 out_emission_radiance = render_pass_emission_mask(emission.rgb); + out_emission_radiance *= emission_strength; + result.radiance += out_emission_radiance; + } result.transmittance = vec3(1.0 - alpha); -} - -void node_bsdf_principled_metallic(vec4 base_color, - float subsurface, - vec3 subsurface_radius, - vec4 subsurface_color, - float metallic, - float specular, - float specular_tint, - float roughness, - float anisotropic, - float anisotropic_rotation, - float sheen, - float sheen_tint, - float clearcoat, - float clearcoat_roughness, - float ior, - float transmission, - float transmission_roughness, - vec4 emission, - float emission_strength, - float alpha, - vec3 N, - vec3 CN, - vec3 T, - vec3 I, - float use_multiscatter, - float ssr_id, - float sss_id, - vec3 sss_scale, - out Closure result) -{ - N = normalize(N); - vec3 out_spec, ssr_spec; - - vec3 f90 = mix(vec3(1.0), base_color.rgb, (1.0 - specular) * metallic); - - eevee_closure_glossy(N, - base_color.rgb, - /* HACK: Pass the multiscatter flag as the sign to not add closure - * variations or increase register usage. */ - (use_multiscatter != 0.0) ? f90 : -f90, - int(ssr_id), - roughness, - 1.0, - true, - out_spec, - ssr_spec); - - result = CLOSURE_DEFAULT; - result.radiance = render_pass_glossy_mask(vec3(1.0), out_spec); - result.radiance += render_pass_emission_mask(emission.rgb * emission_strength); result.radiance *= alpha; - closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result); - - result.transmittance = vec3(1.0 - alpha); + result.ssr_data.rgb *= alpha; +# ifdef USE_SSS + result.sss_irradiance *= alpha; +# endif } -void node_bsdf_principled_clearcoat(vec4 base_color, - float subsurface, - vec3 subsurface_radius, - vec4 subsurface_color, - float metallic, - float specular, - float specular_tint, - float roughness, - float anisotropic, - float anisotropic_rotation, - float sheen, - float sheen_tint, - float clearcoat, - float clearcoat_roughness, - float ior, - float transmission, - float transmission_roughness, - vec4 emission, - float emission_strength, - float alpha, - vec3 N, - vec3 CN, - vec3 T, - vec3 I, - float use_multiscatter, - float ssr_id, - float sss_id, - vec3 sss_scale, - out Closure result) -{ - vec3 out_spec, ssr_spec; - N = normalize(N); - - vec3 f90 = mix(vec3(1.0), base_color.rgb, (1.0 - specular) * metallic); - - eevee_closure_clearcoat(N, - base_color.rgb, - /* HACK: Pass the multiscatter flag as the sign to not add closure - * variations or increase register usage. */ - (use_multiscatter != 0.0) ? f90 : -f90, - int(ssr_id), - roughness, - CN, - clearcoat * 0.25, - clearcoat_roughness, - 1.0, - true, - out_spec, - ssr_spec); - /* Match cycles. */ - float spec_col = 1.0 + float(clearcoat > 1e-5); - - result = CLOSURE_DEFAULT; - result.radiance = render_pass_glossy_mask(vec3(spec_col), out_spec); - result.radiance += render_pass_emission_mask(emission.rgb * emission_strength); - result.radiance *= alpha; - - closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result); - - result.transmittance = vec3(1.0 - alpha); -} - -void node_bsdf_principled_subsurface(vec4 base_color, - float subsurface, - vec3 subsurface_radius, - vec4 subsurface_color, - float metallic, - float specular, - float specular_tint, - float roughness, - float anisotropic, - float anisotropic_rotation, - float sheen, - float sheen_tint, - float clearcoat, - float clearcoat_roughness, - float ior, - float transmission, - float transmission_roughness, - vec4 emission, - float emission_strength, - float alpha, - vec3 N, - vec3 CN, - vec3 T, - vec3 I, - float use_multiscatter, - float ssr_id, - float sss_id, - vec3 sss_scale, - out Closure result) -{ - metallic = saturate(metallic); - N = normalize(N); - - vec3 diffuse, f0, out_diff, out_spec, ssr_spec, sheen_color; - float out_sheen; - vec3 ctint = tint_from_color(base_color.rgb); - convert_metallic_to_specular_tinted( - base_color.rgb, ctint, metallic, specular, specular_tint, diffuse, f0); - - subsurface_color = subsurface_color * (1.0 - metallic); - vec3 mixed_ss_base_color = mix(diffuse, subsurface_color.rgb, subsurface); - float sss_scalef = avg(sss_scale) * subsurface; - - float NV = dot(N, cameraVec); - principled_sheen(NV, ctint, sheen, sheen_tint, out_sheen, sheen_color); - - vec3 f90 = mix(vec3(1.0), base_color.rgb, (1.0 - specular) * metallic); - - eevee_closure_skin(N, - mixed_ss_base_color, - f0, - /* HACK: Pass the multiscatter flag as the sign to not add closure variations - * or increase register usage. */ - (use_multiscatter != 0.0) ? f90 : -f90, - int(ssr_id), - roughness, - 1.0, - sss_scalef, - true, - out_diff, - out_spec, - ssr_spec); - - result = CLOSURE_DEFAULT; - result.radiance = render_pass_glossy_mask(vec3(1.0), out_spec); - result.radiance += render_pass_diffuse_mask(sheen_color, out_diff * out_sheen * sheen_color); - result.radiance += render_pass_emission_mask(emission.rgb * emission_strength); - result.radiance *= alpha; - - closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result); - - mixed_ss_base_color *= alpha; - closure_load_sss_data(sss_scalef, out_diff, mixed_ss_base_color, int(sss_id), result); - - result.transmittance = vec3(1.0 - alpha); -} - -void node_bsdf_principled_glass(vec4 base_color, - float subsurface, - vec3 subsurface_radius, - vec4 subsurface_color, - float metallic, - float specular, - float specular_tint, - float roughness, - float anisotropic, - float anisotropic_rotation, - float sheen, - float sheen_tint, - float clearcoat, - float clearcoat_roughness, - float ior, - float transmission, - float transmission_roughness, - vec4 emission, - float emission_strength, - float alpha, - vec3 N, - vec3 CN, - vec3 T, - vec3 I, - float use_multiscatter, - float ssr_id, - float sss_id, - vec3 sss_scale, - out Closure result) -{ - ior = max(ior, 1e-5); - N = normalize(N); - - vec3 f0, out_spec, out_refr, ssr_spec; - f0 = mix(vec3(1.0), base_color.rgb, specular_tint); - - eevee_closure_glass(N, - vec3(1.0), - vec3((use_multiscatter != 0.0) ? 1.0 : -1.0), - int(ssr_id), - roughness, - 1.0, - ior, - true, - out_spec, - out_refr, - ssr_spec); - - vec3 refr_color = base_color.rgb; - refr_color *= (refractionDepth > 0.0) ? refr_color : - vec3(1.0); /* Simulate 2 transmission events */ - - float fresnel = F_eta(ior, dot(N, cameraVec)); - vec3 spec_col = F_color_blend(ior, fresnel, f0); - spec_col *= fresnel; - refr_color *= (1.0 - fresnel); - - ssr_spec *= spec_col; - - result = CLOSURE_DEFAULT; - result.radiance = render_pass_glossy_mask(refr_color, out_refr * refr_color); - result.radiance += render_pass_glossy_mask(spec_col, out_spec * spec_col); - result.radiance += render_pass_emission_mask(emission.rgb * emission_strength); - result.radiance *= alpha; - closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result); - result.transmittance = vec3(1.0 - alpha); -} #else /* clang-format off */ /* Stub principled because it is not compatible with volumetrics. */ -# define node_bsdf_principled(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, result) (result = CLOSURE_DEFAULT) -# define node_bsdf_principled_dielectric(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, result) (result = CLOSURE_DEFAULT) -# define node_bsdf_principled_metallic(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, result) (result = CLOSURE_DEFAULT) -# define node_bsdf_principled_clearcoat(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, result) (result = CLOSURE_DEFAULT) -# define node_bsdf_principled_subsurface(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, result) (result = CLOSURE_DEFAULT) -# define node_bsdf_principled_glass(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, result) (result = CLOSURE_DEFAULT) +# define node_bsdf_principled(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, cc, dd, result) (result = CLOSURE_DEFAULT) /* clang-format on */ #endif diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl index cd043020a7f..7cbc7218f5c 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl @@ -1,15 +1,31 @@ #ifndef VOLUMETRICS + +CLOSURE_EVAL_FUNCTION_DECLARE_1(node_bsdf_refraction, Refraction) + void node_bsdf_refraction(vec4 color, float roughness, float ior, vec3 N, out Closure result) { - N = normalize(N); - vec3 out_refr; - color.rgb *= (refractionDepth > 0.0) ? color.rgb : vec3(1.0); /* Simulate 2 absorption event. */ - eevee_closure_refraction(N, roughness, ior, true, out_refr); - vec3 vN = mat3(ViewMatrix) * N; + CLOSURE_VARS_DECLARE_1(Refraction); + + in_Refraction_0.N = N; /* Normalized during eval. */ + in_Refraction_0.roughness = roughness; + in_Refraction_0.ior = ior; + + CLOSURE_EVAL_FUNCTION_1(node_bsdf_refraction, Refraction); + result = CLOSURE_DEFAULT; - result.ssr_normal = normal_encode(vN, viewCameraVec); - result.radiance = render_pass_glossy_mask(color.rgb, out_refr * color.rgb); + + out_Refraction_0.radiance = render_pass_glossy_mask(vec3(1.0), out_Refraction_0.radiance); + out_Refraction_0.radiance *= color.rgb; + /* Simulate 2nd absorption event. */ + out_Refraction_0.radiance *= (refractionDepth > 0.0) ? color.rgb : vec3(1.0); + + result.radiance = out_Refraction_0.radiance; + + /* TODO(fclem) Try to not use this. */ + result.ssr_normal = normal_encode(mat3(ViewMatrix) * in_Refraction_0.N, + viewCameraVec(viewPosition)); } + #else /* Stub refraction because it is not compatible with volumetrics. */ # define node_bsdf_refraction(a, b, c, d, e) (e = CLOSURE_DEFAULT) diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_shader_to_rgba.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_shader_to_rgba.glsl index f495157f6e1..a5fdc7a2337 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_shader_to_rgba.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_shader_to_rgba.glsl @@ -3,8 +3,8 @@ void node_shader_to_rgba(Closure cl, out vec4 outcol, out float outalpha) { vec4 spec_accum = vec4(0.0); if (ssrToggle && FLAG_TEST(cl.flag, CLOSURE_SSR_FLAG)) { - vec3 V = cameraVec; - vec3 vN = normal_decode(cl.ssr_normal, viewCameraVec); + vec3 V = cameraVec(worldPosition); + vec3 vN = normal_decode(cl.ssr_normal, viewCameraVec(viewPosition)); vec3 N = transform_direction(ViewMatrixInverse, vN); float roughness = cl.ssr_data.a; float roughnessSquared = max(1e-3, roughness * roughness); diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_subsurface_scattering.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_subsurface_scattering.glsl index c13b55513da..5a68f802659 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_subsurface_scattering.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_subsurface_scattering.glsl @@ -1,4 +1,7 @@ #ifndef VOLUMETRICS + +CLOSURE_EVAL_FUNCTION_DECLARE_1(node_subsurface_scattering, Diffuse) + void node_subsurface_scattering(vec4 color, float scale, vec3 radius, @@ -8,20 +11,29 @@ void node_subsurface_scattering(vec4 color, float sss_id, out Closure result) { - N = normalize(N); - vec3 out_diff; - vec3 vN = mat3(ViewMatrix) * N; + CLOSURE_VARS_DECLARE_1(Diffuse); + + in_Diffuse_0.N = N; /* Normalized during eval. */ + in_Diffuse_0.albedo = color.rgb; + + CLOSURE_EVAL_FUNCTION_1(node_subsurface_scattering, Diffuse); + result = CLOSURE_DEFAULT; - closure_load_ssr_data(vec3(0.0), 0.0, N, viewCameraVec, -1, result); - eevee_closure_subsurface(N, color.rgb, 1.0, scale, true, out_diff); + /* Not perfect for texture_blur values between 0.0 and 1.0. + * Interpolate between separated color and color applied on irradiance. */ + float one_minus_texture_blur = 1.0 - texture_blur; + vec3 sss_albedo = color.rgb * texture_blur + one_minus_texture_blur; + vec3 radiance_tint = color.rgb * one_minus_texture_blur + texture_blur; + /* Consider output radiance as irradiance. */ + out_Diffuse_0.radiance *= radiance_tint; - /* Not perfect for texture_blur not exactly equal to 0.0 or 1.0. */ - vec3 sss_albedo = mix(color.rgb, vec3(1.0), texture_blur); - out_diff *= mix(vec3(1.0), color.rgb, texture_blur); - result.radiance = render_pass_sss_mask(sss_albedo); - closure_load_sss_data(scale, out_diff, sss_albedo, int(sss_id), result); + closure_load_sss_data(scale, out_Diffuse_0.radiance, sss_albedo, int(sss_id), result); + + /* TODO(fclem) Try to not use this. */ + closure_load_ssr_data(vec3(0.0), 0.0, in_Diffuse_0.N, -1.0, result); } + #else /* Stub subsurface scattering because it is not compatible with volumetrics. */ # define node_subsurface_scattering(a, b, c, d, e, f, g, h) (h = CLOSURE_DEFAULT) diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_texture_coordinates.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_texture_coordinates.glsl index 24276156d55..08d566224bf 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_texture_coordinates.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_texture_coordinates.glsl @@ -50,7 +50,7 @@ void node_tex_coord(vec3 I, camera = vec3(I.xy, -I.z); vec4 projvec = ProjectionMatrix * vec4(I, 1.0); window = vec3(mtex_2d_mapping(projvec.xyz / projvec.w).xy * camerafac.xy + camerafac.zw, 0.0); - reflection = -reflect(cameraVec, normalize(wN)); + reflection = -reflect(cameraVec(worldPosition), normalize(wN)); } void node_tex_coord_background(vec3 I, diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl index 79bfd9b24bb..80bd3941b22 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl @@ -1,12 +1,20 @@ #ifndef VOLUMETRICS + +CLOSURE_EVAL_FUNCTION_DECLARE_1(node_bsdf_translucent, Translucent) + void node_bsdf_translucent(vec4 color, vec3 N, out Closure result) { - N = normalize(N); + CLOSURE_VARS_DECLARE_1(Translucent); + + in_Translucent_0.N = -N; /* Normalized during eval. */ + + CLOSURE_EVAL_FUNCTION_1(node_bsdf_translucent, Translucent); + result = CLOSURE_DEFAULT; - eevee_closure_diffuse(-N, color.rgb, 1.0, false, result.radiance); - closure_load_ssr_data(vec3(0.0), 0.0, N, viewCameraVec, -1, result); - result.radiance = render_pass_diffuse_mask(color.rgb, result.radiance * color.rgb); + closure_load_ssr_data(vec3(0.0), 0.0, -in_Translucent_0.N, -1.0, result); + result.radiance = render_pass_diffuse_mask(color.rgb, out_Translucent_0.radiance * color.rgb); } + #else /* Stub translucent because it is not compatible with volumetrics. */ # define node_bsdf_translucent(a, b, c) (c = CLOSURE_DEFAULT) diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h index 58ddc918f61..d131e4dacdc 100644 --- a/source/blender/imbuf/IMB_imbuf.h +++ b/source/blender/imbuf/IMB_imbuf.h @@ -27,7 +27,7 @@ * This module offers import/export of several graphical file formats. * \ingroup imbuf * - * \page IMB Imbuf module external interface + * \page IMB ImBuf module external interface * \section imb_about About the IMB module * * External interface of the IMage Buffer module. This module offers @@ -745,7 +745,8 @@ const char *IMB_ffmpeg_last_error(void); struct GPUTexture *IMB_create_gpu_texture(const char *name, struct ImBuf *ibuf, bool use_high_bitdepth, - bool use_premult); + bool use_premult, + bool limit_gl_texture_size); struct GPUTexture *IMB_touch_gpu_texture( const char *name, struct ImBuf *ibuf, int w, int h, int layers, bool use_high_bitdepth); void IMB_update_gpu_texture_sub(struct GPUTexture *tex, diff --git a/source/blender/imbuf/IMB_thumbs.h b/source/blender/imbuf/IMB_thumbs.h index a013e7e38dd..9dd0cbe895f 100644 --- a/source/blender/imbuf/IMB_thumbs.h +++ b/source/blender/imbuf/IMB_thumbs.h @@ -80,7 +80,6 @@ void IMB_thumb_makedirs(void); struct ImBuf *IMB_thumb_load_blend(const char *blen_path, const char *blen_group, const char *blen_id); -void IMB_thumb_overlay_blend(unsigned int *thumb, int width, int height, float aspect); /* special function for previewing fonts */ struct ImBuf *IMB_thumb_load_font(const char *filename, unsigned int x, unsigned int y); diff --git a/source/blender/imbuf/intern/IMB_colormanagement_intern.h b/source/blender/imbuf/intern/IMB_colormanagement_intern.h index 6b505a7171a..31dca888732 100644 --- a/source/blender/imbuf/intern/IMB_colormanagement_intern.h +++ b/source/blender/imbuf/intern/IMB_colormanagement_intern.h @@ -31,6 +31,7 @@ extern "C" { #endif struct ImBuf; +struct OCIO_ConstCPUProcessorRcPtr; struct OCIO_ConstProcessorRcPtr; extern float imbuf_luma_coefficients[3]; @@ -46,8 +47,8 @@ typedef struct ColorSpace { char name[MAX_COLORSPACE_NAME]; char description[MAX_COLORSPACE_DESCRIPTION]; - struct OCIO_ConstProcessorRcPtr *to_scene_linear; - struct OCIO_ConstProcessorRcPtr *from_scene_linear; + struct OCIO_ConstCPUProcessorRcPtr *to_scene_linear; + struct OCIO_ConstCPUProcessorRcPtr *from_scene_linear; bool is_invertible; bool is_data; @@ -66,8 +67,8 @@ typedef struct ColorManagedDisplay { char name[MAX_COLORSPACE_NAME]; ListBase views; /* LinkData.data -> ColorManagedView */ - struct OCIO_ConstProcessorRcPtr *to_scene_linear; - struct OCIO_ConstProcessorRcPtr *from_scene_linear; + struct OCIO_ConstCPUProcessorRcPtr *to_scene_linear; + struct OCIO_ConstCPUProcessorRcPtr *from_scene_linear; } ColorManagedDisplay; typedef struct ColorManagedView { diff --git a/source/blender/imbuf/intern/anim_movie.c b/source/blender/imbuf/intern/anim_movie.c index 3a7570cd320..28bf26aa343 100644 --- a/source/blender/imbuf/intern/anim_movie.c +++ b/source/blender/imbuf/intern/anim_movie.c @@ -55,6 +55,7 @@ #include "BLI_path_util.h" #include "BLI_string.h" +#include "BLI_threads.h" #include "BLI_utildefines.h" #include "MEM_guardedalloc.h" @@ -573,6 +574,9 @@ static int startffmpeg(struct anim *anim) pCodecCtx->workaround_bugs = 1; + pCodecCtx->thread_count = BLI_system_thread_count(); + pCodecCtx->thread_type = FF_THREAD_SLICE; + if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) { avformat_close_input(&pFormatCtx); return -1; diff --git a/source/blender/imbuf/intern/bmp.c b/source/blender/imbuf/intern/bmp.c index 58ce02f28ae..a5c558fc216 100644 --- a/source/blender/imbuf/intern/bmp.c +++ b/source/blender/imbuf/intern/bmp.c @@ -111,6 +111,14 @@ bool imb_is_a_bmp(const uchar *buf, size_t size) return checkbmp(buf, size); } +static size_t imb_bmp_calc_row_size_in_bytes(size_t x, size_t depth) +{ + if (depth <= 8) { + return (depth * x + 31) / 32 * 4; + } + return (depth >> 3) * x; +} + ImBuf *imb_bmp_decode(const uchar *mem, size_t size, int flags, char colorspace[IM_MAX_SPACE]) { ImBuf *ibuf = NULL; @@ -130,7 +138,8 @@ ImBuf *imb_bmp_decode(const uchar *mem, size_t size, int flags, char colorspace[ colorspace_set_default_role(colorspace, IM_MAX_SPACE, COLOR_ROLE_DEFAULT_BYTE); - bmp = mem + LITTLE_LONG(*(int *)(mem + 10)); + const size_t pixel_data_offset = LITTLE_LONG(*(int *)(mem + 10)); + bmp = mem + pixel_data_offset; if (CHECK_HEADER_FIELD_BMP(mem)) { /* skip fileheader */ @@ -150,6 +159,13 @@ ImBuf *imb_bmp_decode(const uchar *mem, size_t size, int flags, char colorspace[ xppm = LITTLE_LONG(bmi.biXPelsPerMeter); yppm = LITTLE_LONG(bmi.biYPelsPerMeter); + const size_t row_size_in_bytes = imb_bmp_calc_row_size_in_bytes(x, depth); + const size_t num_expected_data_bytes = row_size_in_bytes * y; + const size_t num_actual_data_bytes = size - pixel_data_offset; + if (num_actual_data_bytes < num_expected_data_bytes) { + return NULL; + } + if (depth <= 8) { ibuf_depth = 24; } @@ -179,7 +195,6 @@ ImBuf *imb_bmp_decode(const uchar *mem, size_t size, int flags, char colorspace[ rect = (uchar *)ibuf->rect; if (depth <= 8) { - const int rowsize = (depth * x + 31) / 32 * 4; const char(*palette)[4] = (void *)(mem + skip); const int startmask = ((1 << depth) - 1) << 8; for (size_t i = y; i > 0; i--) { @@ -212,7 +227,7 @@ ImBuf *imb_bmp_decode(const uchar *mem, size_t size, int flags, char colorspace[ } } /* Advance to the next row */ - bmp += (rowsize - nbytes); + bmp += (row_size_in_bytes - nbytes); } } else if (depth == 16) { diff --git a/source/blender/imbuf/intern/colormanagement.c b/source/blender/imbuf/intern/colormanagement.c index 046e233fd05..fc0b99a82fa 100644 --- a/source/blender/imbuf/intern/colormanagement.c +++ b/source/blender/imbuf/intern/colormanagement.c @@ -101,40 +101,26 @@ static float imbuf_linear_srgb_to_xyz[3][3] = {{0.0f}}; static pthread_mutex_t processor_lock = BLI_MUTEX_INITIALIZER; typedef struct ColormanageProcessor { - OCIO_ConstProcessorRcPtr *processor; + OCIO_ConstCPUProcessorRcPtr *cpu_processor; CurveMapping *curve_mapping; bool is_data_result; } ColormanageProcessor; -static struct global_glsl_state { - /* Actual processor used for GLSL baked LUTs. */ - /* UI colorspace here refers to the display linear color space, - * i.e: The linear color space w.r.t. display chromaticity and radiometry. - * We separate the colormanagement process into two steps to be able to - * merge UI using alpha blending in the correct color space. */ - OCIO_ConstProcessorRcPtr *processor_scene_to_ui; - OCIO_ConstProcessorRcPtr *processor_ui_to_display; - - /* Settings of processor for comparison. */ - char look[MAX_COLORSPACE_NAME]; - char view[MAX_COLORSPACE_NAME]; - char display[MAX_COLORSPACE_NAME]; - char input[MAX_COLORSPACE_NAME]; - float exposure, gamma; +static struct global_gpu_state { + /* GPU shader currently bound. */ + bool gpu_shader_bound; + /* Curve mapping. */ CurveMapping *curve_mapping, *orig_curve_mapping; bool use_curve_mapping; int curve_mapping_timestamp; OCIO_CurveMappingSettings curve_mapping_settings; - - /* Container for GLSL state needed for OCIO module. */ - struct OCIO_GLSLDrawState *ocio_glsl_state; -} global_glsl_state = {NULL}; +} global_gpu_state = {false}; static struct global_color_picking_state { /* Cached processor for color picking conversion. */ - OCIO_ConstProcessorRcPtr *processor_to; - OCIO_ConstProcessorRcPtr *processor_from; + OCIO_ConstCPUProcessorRcPtr *cpu_processor_to; + OCIO_ConstCPUProcessorRcPtr *cpu_processor_from; bool failed; } global_color_picking_state = {NULL}; @@ -609,11 +595,10 @@ static void colormanage_free_config(void) /* free precomputer processors */ if (colorspace->to_scene_linear) { - OCIO_processorRelease((OCIO_ConstProcessorRcPtr *)colorspace->to_scene_linear); + OCIO_cpuProcessorRelease((OCIO_ConstCPUProcessorRcPtr *)colorspace->to_scene_linear); } - if (colorspace->from_scene_linear) { - OCIO_processorRelease((OCIO_ConstProcessorRcPtr *)colorspace->from_scene_linear); + OCIO_cpuProcessorRelease((OCIO_ConstCPUProcessorRcPtr *)colorspace->from_scene_linear); } /* free color space itself */ @@ -631,11 +616,10 @@ static void colormanage_free_config(void) /* free precomputer processors */ if (display->to_scene_linear) { - OCIO_processorRelease((OCIO_ConstProcessorRcPtr *)display->to_scene_linear); + OCIO_cpuProcessorRelease((OCIO_ConstCPUProcessorRcPtr *)display->to_scene_linear); } - if (display->from_scene_linear) { - OCIO_processorRelease((OCIO_ConstProcessorRcPtr *)display->from_scene_linear); + OCIO_cpuProcessorRelease((OCIO_ConstCPUProcessorRcPtr *)display->from_scene_linear); } /* free list of views */ @@ -727,35 +711,25 @@ void colormanagement_init(void) void colormanagement_exit(void) { - if (global_glsl_state.processor_scene_to_ui) { - OCIO_processorRelease(global_glsl_state.processor_scene_to_ui); + OCIO_gpuCacheFree(); + + if (global_gpu_state.curve_mapping) { + BKE_curvemapping_free(global_gpu_state.curve_mapping); } - if (global_glsl_state.processor_ui_to_display) { - OCIO_processorRelease(global_glsl_state.processor_ui_to_display); + if (global_gpu_state.curve_mapping_settings.lut) { + MEM_freeN(global_gpu_state.curve_mapping_settings.lut); } - if (global_glsl_state.curve_mapping) { - BKE_curvemapping_free(global_glsl_state.curve_mapping); + if (global_color_picking_state.cpu_processor_to) { + OCIO_cpuProcessorRelease(global_color_picking_state.cpu_processor_to); } - if (global_glsl_state.curve_mapping_settings.lut) { - MEM_freeN(global_glsl_state.curve_mapping_settings.lut); + if (global_color_picking_state.cpu_processor_from) { + OCIO_cpuProcessorRelease(global_color_picking_state.cpu_processor_from); } - if (global_glsl_state.ocio_glsl_state) { - OCIO_freeOGLState(global_glsl_state.ocio_glsl_state); - } - - if (global_color_picking_state.processor_to) { - OCIO_processorRelease(global_color_picking_state.processor_to); - } - - if (global_color_picking_state.processor_from) { - OCIO_processorRelease(global_color_picking_state.processor_from); - } - - memset(&global_glsl_state, 0, sizeof(global_glsl_state)); + memset(&global_gpu_state, 0, sizeof(global_gpu_state)); memset(&global_color_picking_state, 0, sizeof(global_color_picking_state)); colormanage_free_config(); @@ -777,6 +751,12 @@ static bool colormanage_compatible_look(ColorManagedLook *look, const char *view return (look->view[0] == 0 || (view_name && STREQ(look->view, view_name))); } +static bool colormanage_use_look(const char *look, const char *view_name) +{ + ColorManagedLook *look_descr = colormanage_look_get_named(look); + return (look_descr->is_noop == false && colormanage_compatible_look(look_descr, view_name)); +} + void colormanage_cache_free(ImBuf *ibuf) { if (ibuf->display_buffer_flags) { @@ -852,95 +832,31 @@ static ColorSpace *display_transform_get_colorspace( return NULL; } -static OCIO_ConstProcessorRcPtr *create_display_buffer_processor(const char *look, - const char *view_transform, - const char *display, - float exposure, - float gamma, - const char *from_colorspace, - const bool linear_output) +static OCIO_ConstCPUProcessorRcPtr *create_display_buffer_processor(const char *look, + const char *view_transform, + const char *display, + float exposure, + float gamma, + const char *from_colorspace) { OCIO_ConstConfigRcPtr *config = OCIO_getCurrentConfig(); - OCIO_DisplayTransformRcPtr *dt; - OCIO_ConstProcessorRcPtr *processor; - ColorManagedLook *look_descr = colormanage_look_get_named(look); + const bool use_look = colormanage_use_look(look, view_transform); + const float scale = (exposure == 0.0f) ? 1.0f : powf(2.0f, exposure); + const float exponent = (gamma == 1.0f) ? 1.0f : 1.0f / max_ff(FLT_EPSILON, gamma); - dt = OCIO_createDisplayTransform(); + OCIO_ConstProcessorRcPtr *processor = OCIO_createDisplayProcessor( + config, from_colorspace, view_transform, display, (use_look) ? look : "", scale, exponent); - OCIO_displayTransformSetInputColorSpaceName(dt, from_colorspace); - OCIO_displayTransformSetView(dt, view_transform); - OCIO_displayTransformSetDisplay(dt, display); - - if (look_descr->is_noop == false && colormanage_compatible_look(look_descr, view_transform)) { - OCIO_displayTransformSetLooksOverrideEnabled(dt, true); - OCIO_displayTransformSetLooksOverride(dt, look); - } - - /* fstop exposure control */ - if (exposure != 0.0f) { - OCIO_MatrixTransformRcPtr *mt; - float gain = powf(2.0f, exposure); - const float scale4f[] = {gain, gain, gain, 1.0f}; - float m44[16], offset4[4]; - - OCIO_matrixTransformScale(m44, offset4, scale4f); - mt = OCIO_createMatrixTransform(); - OCIO_matrixTransformSetValue(mt, m44, offset4); - OCIO_displayTransformSetLinearCC(dt, (OCIO_ConstTransformRcPtr *)mt); - - OCIO_matrixTransformRelease(mt); - } - - /* post-display gamma transform */ - if (gamma != 1.0f) { - OCIO_ExponentTransformRcPtr *et; - float exponent = 1.0f / MAX2(FLT_EPSILON, gamma); - const float exponent4f[] = {exponent, exponent, exponent, exponent}; - - et = OCIO_createExponentTransform(); - OCIO_exponentTransformSetValue(et, exponent4f); - OCIO_displayTransformSetDisplayCC(dt, (OCIO_ConstTransformRcPtr *)et); - - OCIO_exponentTransformRelease(et); - } - - OCIO_GroupTransformRcPtr *gt = OCIO_createGroupTransform(); - OCIO_groupTransformSetDirection(gt, true); - OCIO_groupTransformPushBack(gt, (OCIO_ConstTransformRcPtr *)dt); - - if (linear_output) { - /* TODO use correct function display. */ - OCIO_ExponentTransformRcPtr *et = OCIO_createExponentTransform(); - OCIO_exponentTransformSetValue(et, (float[4]){2.2f, 2.2f, 2.2f, 1.0f}); - OCIO_groupTransformPushBack(gt, (OCIO_ConstTransformRcPtr *)et); - OCIO_exponentTransformRelease(et); - } - - processor = OCIO_configGetProcessor(config, (OCIO_ConstTransformRcPtr *)gt); - - OCIO_groupTransformRelease(gt); - OCIO_displayTransformRelease(dt); OCIO_configRelease(config); - return processor; -} + if (processor == NULL) { + return NULL; + } -static OCIO_ConstProcessorRcPtr *create_display_encoded_buffer_processor( - const char *UNUSED(display)) -{ - OCIO_ConstConfigRcPtr *config = OCIO_getCurrentConfig(); - OCIO_ConstProcessorRcPtr *processor; + OCIO_ConstCPUProcessorRcPtr *cpu_processor = OCIO_processorGetCPUProcessor(processor); + OCIO_processorRelease(processor); - /* TODO use correct function display. */ - OCIO_ExponentTransformRcPtr *et = OCIO_createExponentTransform(); - OCIO_exponentTransformSetValue(et, (float[4]){1.0f / 2.2f, 1.0f / 2.2f, 1.0f / 2.2f, 1.0f}); - - processor = OCIO_configGetProcessor(config, (OCIO_ConstTransformRcPtr *)et); - - OCIO_exponentTransformRelease(et); - OCIO_configRelease(config); - - return processor; + return cpu_processor; } static OCIO_ConstProcessorRcPtr *create_colorspace_transform_processor(const char *from_colorspace, @@ -956,43 +872,54 @@ static OCIO_ConstProcessorRcPtr *create_colorspace_transform_processor(const cha return processor; } -static OCIO_ConstProcessorRcPtr *colorspace_to_scene_linear_processor(ColorSpace *colorspace) +static OCIO_ConstCPUProcessorRcPtr *colorspace_to_scene_linear_cpu_processor( + ColorSpace *colorspace) { if (colorspace->to_scene_linear == NULL) { BLI_mutex_lock(&processor_lock); if (colorspace->to_scene_linear == NULL) { - OCIO_ConstProcessorRcPtr *to_scene_linear; - to_scene_linear = create_colorspace_transform_processor(colorspace->name, - global_role_scene_linear); - colorspace->to_scene_linear = (struct OCIO_ConstProcessorRcPtr *)to_scene_linear; + OCIO_ConstProcessorRcPtr *processor = create_colorspace_transform_processor( + colorspace->name, global_role_scene_linear); + + if (processor != NULL) { + colorspace->to_scene_linear = (struct OCIO_ConstCPUProcessorRcPtr *) + OCIO_processorGetCPUProcessor(processor); + OCIO_processorRelease(processor); + } } BLI_mutex_unlock(&processor_lock); } - return (OCIO_ConstProcessorRcPtr *)colorspace->to_scene_linear; + return (OCIO_ConstCPUProcessorRcPtr *)colorspace->to_scene_linear; } -static OCIO_ConstProcessorRcPtr *colorspace_from_scene_linear_processor(ColorSpace *colorspace) +static OCIO_ConstCPUProcessorRcPtr *colorspace_from_scene_linear_cpu_processor( + ColorSpace *colorspace) { if (colorspace->from_scene_linear == NULL) { BLI_mutex_lock(&processor_lock); if (colorspace->from_scene_linear == NULL) { - OCIO_ConstProcessorRcPtr *from_scene_linear; - from_scene_linear = create_colorspace_transform_processor(global_role_scene_linear, - colorspace->name); - colorspace->from_scene_linear = (struct OCIO_ConstProcessorRcPtr *)from_scene_linear; + OCIO_ConstProcessorRcPtr *processor = create_colorspace_transform_processor( + global_role_scene_linear, colorspace->name); + + if (processor != NULL) { + colorspace->from_scene_linear = (struct OCIO_ConstCPUProcessorRcPtr *) + OCIO_processorGetCPUProcessor(processor); + OCIO_processorRelease(processor); + } } BLI_mutex_unlock(&processor_lock); } - return (OCIO_ConstProcessorRcPtr *)colorspace->from_scene_linear; + return (OCIO_ConstCPUProcessorRcPtr *)colorspace->from_scene_linear; } -static OCIO_ConstProcessorRcPtr *display_from_scene_linear_processor(ColorManagedDisplay *display) +static OCIO_ConstCPUProcessorRcPtr *display_from_scene_linear_processor( + ColorManagedDisplay *display) { if (display->from_scene_linear == NULL) { BLI_mutex_lock(&processor_lock); @@ -1011,16 +938,20 @@ static OCIO_ConstProcessorRcPtr *display_from_scene_linear_processor(ColorManage OCIO_configRelease(config); } - display->from_scene_linear = (struct OCIO_ConstProcessorRcPtr *)processor; + if (processor != NULL) { + display->from_scene_linear = (struct OCIO_ConstCPUProcessorRcPtr *) + OCIO_processorGetCPUProcessor(processor); + OCIO_processorRelease(processor); + } } BLI_mutex_unlock(&processor_lock); } - return (OCIO_ConstProcessorRcPtr *)display->from_scene_linear; + return (OCIO_ConstCPUProcessorRcPtr *)display->from_scene_linear; } -static OCIO_ConstProcessorRcPtr *display_to_scene_linear_processor(ColorManagedDisplay *display) +static OCIO_ConstCPUProcessorRcPtr *display_to_scene_linear_processor(ColorManagedDisplay *display) { if (display->to_scene_linear == NULL) { BLI_mutex_lock(&processor_lock); @@ -1039,13 +970,17 @@ static OCIO_ConstProcessorRcPtr *display_to_scene_linear_processor(ColorManagedD OCIO_configRelease(config); } - display->to_scene_linear = (struct OCIO_ConstProcessorRcPtr *)processor; + if (processor != NULL) { + display->to_scene_linear = (struct OCIO_ConstCPUProcessorRcPtr *) + OCIO_processorGetCPUProcessor(processor); + OCIO_processorRelease(processor); + } } BLI_mutex_unlock(&processor_lock); } - return (OCIO_ConstProcessorRcPtr *)display->to_scene_linear; + return (OCIO_ConstCPUProcessorRcPtr *)display->to_scene_linear; } void IMB_colormanagement_init_default_view_settings( @@ -2168,7 +2103,7 @@ void IMB_colormanagement_transform_v4(float pixel[4], */ void IMB_colormanagement_colorspace_to_scene_linear_v3(float pixel[3], ColorSpace *colorspace) { - OCIO_ConstProcessorRcPtr *processor; + OCIO_ConstCPUProcessorRcPtr *processor; if (!colorspace) { /* should never happen */ @@ -2176,17 +2111,17 @@ void IMB_colormanagement_colorspace_to_scene_linear_v3(float pixel[3], ColorSpac return; } - processor = colorspace_to_scene_linear_processor(colorspace); + processor = colorspace_to_scene_linear_cpu_processor(colorspace); - if (processor) { - OCIO_processorApplyRGB(processor, pixel); + if (processor != NULL) { + OCIO_cpuProcessorApplyRGB(processor, pixel); } } /* same as above, but converts colors in opposite direction */ void IMB_colormanagement_scene_linear_to_colorspace_v3(float pixel[3], ColorSpace *colorspace) { - OCIO_ConstProcessorRcPtr *processor; + OCIO_ConstCPUProcessorRcPtr *processor; if (!colorspace) { /* should never happen */ @@ -2194,10 +2129,10 @@ void IMB_colormanagement_scene_linear_to_colorspace_v3(float pixel[3], ColorSpac return; } - processor = colorspace_from_scene_linear_processor(colorspace); + processor = colorspace_from_scene_linear_cpu_processor(colorspace); - if (processor) { - OCIO_processorApplyRGB(processor, pixel); + if (processor != NULL) { + OCIO_cpuProcessorApplyRGB(processor, pixel); } } @@ -2205,7 +2140,7 @@ void IMB_colormanagement_colorspace_to_scene_linear_v4(float pixel[4], bool predivide, ColorSpace *colorspace) { - OCIO_ConstProcessorRcPtr *processor; + OCIO_ConstCPUProcessorRcPtr *processor; if (!colorspace) { /* should never happen */ @@ -2213,14 +2148,14 @@ void IMB_colormanagement_colorspace_to_scene_linear_v4(float pixel[4], return; } - processor = colorspace_to_scene_linear_processor(colorspace); + processor = colorspace_to_scene_linear_cpu_processor(colorspace); - if (processor) { + if (processor != NULL) { if (predivide) { - OCIO_processorApplyRGBA_predivide(processor, pixel); + OCIO_cpuProcessorApplyRGBA_predivide(processor, pixel); } else { - OCIO_processorApplyRGBA(processor, pixel); + OCIO_cpuProcessorApplyRGBA(processor, pixel); } } } @@ -2232,7 +2167,7 @@ void IMB_colormanagement_colorspace_to_scene_linear(float *buffer, struct ColorSpace *colorspace, bool predivide) { - OCIO_ConstProcessorRcPtr *processor; + OCIO_ConstCPUProcessorRcPtr *processor; if (!colorspace) { /* should never happen */ @@ -2240,9 +2175,9 @@ void IMB_colormanagement_colorspace_to_scene_linear(float *buffer, return; } - processor = colorspace_to_scene_linear_processor(colorspace); + processor = colorspace_to_scene_linear_cpu_processor(colorspace); - if (processor) { + if (processor != NULL) { OCIO_PackedImageDesc *img; img = OCIO_createOCIO_PackedImageDesc(buffer, @@ -2254,10 +2189,10 @@ void IMB_colormanagement_colorspace_to_scene_linear(float *buffer, (size_t)channels * sizeof(float) * width); if (predivide) { - OCIO_processorApply_predivide(processor, img); + OCIO_cpuProcessorApply_predivide(processor, img); } else { - OCIO_processorApply(processor, img); + OCIO_cpuProcessorApply(processor, img); } OCIO_PackedImageDescRelease(img); @@ -2278,10 +2213,10 @@ void IMB_colormanagement_imbuf_to_byte_texture(unsigned char *out_buffer, * without precision or performance loss at minimal memory usage. */ BLI_assert(ibuf->rect && ibuf->rect_float == NULL); - OCIO_ConstProcessorRcPtr *processor = NULL; + OCIO_ConstCPUProcessorRcPtr *processor = NULL; if (compress_as_srgb && ibuf->rect_colorspace && !IMB_colormanagement_space_is_srgb(ibuf->rect_colorspace)) { - processor = colorspace_to_scene_linear_processor(ibuf->rect_colorspace); + processor = colorspace_to_scene_linear_cpu_processor(ibuf->rect_colorspace); } /* TODO(brecht): make this multi-threaded, or at least process in batches. */ @@ -2294,12 +2229,12 @@ void IMB_colormanagement_imbuf_to_byte_texture(unsigned char *out_buffer, const unsigned char *in = in_buffer + in_offset * 4; unsigned char *out = out_buffer + out_offset * 4; - if (processor) { + if (processor != NULL) { /* Convert to scene linear, to sRGB and premultiply. */ for (int x = 0; x < width; x++, in += 4, out += 4) { float pixel[4]; rgba_uchar_to_float(pixel, in); - OCIO_processorApplyRGB(processor, pixel); + OCIO_cpuProcessorApplyRGB(processor, pixel); linearrgb_to_srgb_v3_v3(pixel, pixel); if (use_premultiply) { mul_v3_fl(pixel, pixel[3]); @@ -2390,15 +2325,19 @@ void IMB_colormanagement_imbuf_to_float_texture(float *out_buffer, */ void IMB_colormanagement_scene_linear_to_color_picking_v3(float pixel[3]) { - if (!global_color_picking_state.processor_to && !global_color_picking_state.failed) { + if (!global_color_picking_state.cpu_processor_to && !global_color_picking_state.failed) { /* Create processor if none exists. */ BLI_mutex_lock(&processor_lock); - if (!global_color_picking_state.processor_to && !global_color_picking_state.failed) { - global_color_picking_state.processor_to = create_colorspace_transform_processor( + if (!global_color_picking_state.cpu_processor_to && !global_color_picking_state.failed) { + OCIO_ConstProcessorRcPtr *processor = create_colorspace_transform_processor( global_role_scene_linear, global_role_color_picking); - if (!global_color_picking_state.processor_to) { + if (processor != NULL) { + global_color_picking_state.cpu_processor_to = OCIO_processorGetCPUProcessor(processor); + OCIO_processorRelease(processor); + } + else { global_color_picking_state.failed = true; } } @@ -2406,22 +2345,26 @@ void IMB_colormanagement_scene_linear_to_color_picking_v3(float pixel[3]) BLI_mutex_unlock(&processor_lock); } - if (global_color_picking_state.processor_to) { - OCIO_processorApplyRGB(global_color_picking_state.processor_to, pixel); + if (global_color_picking_state.cpu_processor_to) { + OCIO_cpuProcessorApplyRGB(global_color_picking_state.cpu_processor_to, pixel); } } void IMB_colormanagement_color_picking_to_scene_linear_v3(float pixel[3]) { - if (!global_color_picking_state.processor_from && !global_color_picking_state.failed) { + if (!global_color_picking_state.cpu_processor_from && !global_color_picking_state.failed) { /* Create processor if none exists. */ BLI_mutex_lock(&processor_lock); - if (!global_color_picking_state.processor_from && !global_color_picking_state.failed) { - global_color_picking_state.processor_from = create_colorspace_transform_processor( + if (!global_color_picking_state.cpu_processor_from && !global_color_picking_state.failed) { + OCIO_ConstProcessorRcPtr *processor = create_colorspace_transform_processor( global_role_color_picking, global_role_scene_linear); - if (!global_color_picking_state.processor_from) { + if (processor != NULL) { + global_color_picking_state.cpu_processor_from = OCIO_processorGetCPUProcessor(processor); + OCIO_processorRelease(processor); + } + else { global_color_picking_state.failed = true; } } @@ -2429,8 +2372,8 @@ void IMB_colormanagement_color_picking_to_scene_linear_v3(float pixel[3]) BLI_mutex_unlock(&processor_lock); } - if (global_color_picking_state.processor_from) { - OCIO_processorApplyRGB(global_color_picking_state.processor_from, pixel); + if (global_color_picking_state.cpu_processor_from) { + OCIO_cpuProcessorApplyRGB(global_color_picking_state.cpu_processor_from, pixel); } } @@ -2456,24 +2399,20 @@ void IMB_colormanagement_srgb_to_scene_linear_v3(float pixel[3]) */ void IMB_colormanagement_scene_linear_to_display_v3(float pixel[3], ColorManagedDisplay *display) { - OCIO_ConstProcessorRcPtr *processor; + OCIO_ConstCPUProcessorRcPtr *processor = display_from_scene_linear_processor(display); - processor = display_from_scene_linear_processor(display); - - if (processor) { - OCIO_processorApplyRGB(processor, pixel); + if (processor != NULL) { + OCIO_cpuProcessorApplyRGB(processor, pixel); } } /* same as above, but converts color in opposite direction */ void IMB_colormanagement_display_to_scene_linear_v3(float pixel[3], ColorManagedDisplay *display) { - OCIO_ConstProcessorRcPtr *processor; + OCIO_ConstCPUProcessorRcPtr *processor = display_to_scene_linear_processor(display); - processor = display_to_scene_linear_processor(display); - - if (processor) { - OCIO_processorApplyRGB(processor, pixel); + if (processor != NULL) { + OCIO_cpuProcessorApplyRGB(processor, pixel); } } @@ -3833,13 +3772,13 @@ ColormanageProcessor *IMB_colormanagement_display_processor_new( cm_processor->is_data_result = display_space->is_data; } - cm_processor->processor = create_display_buffer_processor(applied_view_settings->look, - applied_view_settings->view_transform, - display_settings->display_device, - applied_view_settings->exposure, - applied_view_settings->gamma, - global_role_scene_linear, - false); + cm_processor->cpu_processor = create_display_buffer_processor( + applied_view_settings->look, + applied_view_settings->view_transform, + display_settings->display_device, + applied_view_settings->exposure, + applied_view_settings->gamma, + global_role_scene_linear); if (applied_view_settings->flag & COLORMANAGE_VIEW_USE_CURVES) { cm_processor->curve_mapping = BKE_curvemapping_copy(applied_view_settings->curve_mapping); @@ -3860,7 +3799,12 @@ ColormanageProcessor *IMB_colormanagement_colorspace_processor_new(const char *f color_space = colormanage_colorspace_get_named(to_colorspace); cm_processor->is_data_result = color_space->is_data; - cm_processor->processor = create_colorspace_transform_processor(from_colorspace, to_colorspace); + OCIO_ConstProcessorRcPtr *processor = create_colorspace_transform_processor(from_colorspace, + to_colorspace); + if (processor != NULL) { + cm_processor->cpu_processor = OCIO_processorGetCPUProcessor(processor); + } + OCIO_processorRelease(processor); return cm_processor; } @@ -3871,8 +3815,8 @@ void IMB_colormanagement_processor_apply_v4(ColormanageProcessor *cm_processor, BKE_curvemapping_evaluate_premulRGBF(cm_processor->curve_mapping, pixel, pixel); } - if (cm_processor->processor) { - OCIO_processorApplyRGBA(cm_processor->processor, pixel); + if (cm_processor->cpu_processor) { + OCIO_cpuProcessorApplyRGBA(cm_processor->cpu_processor, pixel); } } @@ -3883,8 +3827,8 @@ void IMB_colormanagement_processor_apply_v4_predivide(ColormanageProcessor *cm_p BKE_curvemapping_evaluate_premulRGBF(cm_processor->curve_mapping, pixel, pixel); } - if (cm_processor->processor) { - OCIO_processorApplyRGBA_predivide(cm_processor->processor, pixel); + if (cm_processor->cpu_processor) { + OCIO_cpuProcessorApplyRGBA_predivide(cm_processor->cpu_processor, pixel); } } @@ -3894,8 +3838,8 @@ void IMB_colormanagement_processor_apply_v3(ColormanageProcessor *cm_processor, BKE_curvemapping_evaluate_premulRGBF(cm_processor->curve_mapping, pixel, pixel); } - if (cm_processor->processor) { - OCIO_processorApplyRGB(cm_processor->processor, pixel); + if (cm_processor->cpu_processor) { + OCIO_cpuProcessorApplyRGB(cm_processor->cpu_processor, pixel); } } @@ -3940,7 +3884,7 @@ void IMB_colormanagement_processor_apply(ColormanageProcessor *cm_processor, } } - if (cm_processor->processor && channels >= 3) { + if (cm_processor->cpu_processor && channels >= 3) { OCIO_PackedImageDesc *img; /* apply OCIO processor */ @@ -3953,10 +3897,10 @@ void IMB_colormanagement_processor_apply(ColormanageProcessor *cm_processor, (size_t)channels * sizeof(float) * width); if (predivide) { - OCIO_processorApply_predivide(cm_processor->processor, img); + OCIO_cpuProcessorApply_predivide(cm_processor->cpu_processor, img); } else { - OCIO_processorApply(cm_processor->processor, img); + OCIO_cpuProcessorApply(cm_processor->cpu_processor, img); } OCIO_PackedImageDescRelease(img); @@ -3986,8 +3930,8 @@ void IMB_colormanagement_processor_free(ColormanageProcessor *cm_processor) if (cm_processor->curve_mapping) { BKE_curvemapping_free(cm_processor->curve_mapping); } - if (cm_processor->processor) { - OCIO_processorRelease(cm_processor->processor); + if (cm_processor->cpu_processor) { + OCIO_cpuProcessorRelease(cm_processor->cpu_processor); } MEM_freeN(cm_processor); @@ -3995,19 +3939,6 @@ void IMB_colormanagement_processor_free(ColormanageProcessor *cm_processor) /* **** OpenGL drawing routines using GLSL for color space transform ***** */ -static bool check_glsl_display_processor_changed( - const ColorManagedViewSettings *view_settings, - const ColorManagedDisplaySettings *display_settings, - const char *from_colorspace) -{ - return !(global_glsl_state.exposure == view_settings->exposure && - global_glsl_state.gamma == view_settings->gamma && - STREQ(global_glsl_state.look, view_settings->look) && - STREQ(global_glsl_state.view, view_settings->view_transform) && - STREQ(global_glsl_state.display, display_settings->display_device) && - STREQ(global_glsl_state.input, from_colorspace)); -} - static void curve_mapping_to_ocio_settings(CurveMapping *curve_mapping, OCIO_CurveMappingSettings *curve_mapping_settings) { @@ -4041,94 +3972,60 @@ static void curve_mapping_to_ocio_settings(CurveMapping *curve_mapping, curve_mapping_settings->cache_id = (size_t)curve_mapping + curve_mapping->changed_timestamp; } -static void update_glsl_display_processor(const ColorManagedViewSettings *view_settings, - const ColorManagedDisplaySettings *display_settings, - const char *from_colorspace) +static OCIO_CurveMappingSettings *update_glsl_curve_mapping( + const ColorManagedViewSettings *view_settings) { - bool use_curve_mapping = (view_settings->flag & COLORMANAGE_VIEW_USE_CURVES) != 0; - bool need_update = false; - - need_update = global_glsl_state.processor_scene_to_ui == NULL || - check_glsl_display_processor_changed( - view_settings, display_settings, from_colorspace) || - use_curve_mapping != global_glsl_state.use_curve_mapping; - - if (use_curve_mapping && need_update == false) { - need_update |= view_settings->curve_mapping->changed_timestamp != - global_glsl_state.curve_mapping_timestamp || - view_settings->curve_mapping != global_glsl_state.orig_curve_mapping; + /* Using curve mapping? */ + const bool use_curve_mapping = (view_settings->flag & COLORMANAGE_VIEW_USE_CURVES) != 0; + if (!use_curve_mapping) { + return NULL; } - /* Update state if there's no processor yet or - * processor settings has been changed. - */ - if (need_update) { - OCIO_CurveMappingSettings *curve_mapping_settings = &global_glsl_state.curve_mapping_settings; - CurveMapping *new_curve_mapping = NULL; - - /* Store settings of processor for further comparison. */ - BLI_strncpy(global_glsl_state.look, view_settings->look, MAX_COLORSPACE_NAME); - BLI_strncpy(global_glsl_state.view, view_settings->view_transform, MAX_COLORSPACE_NAME); - BLI_strncpy(global_glsl_state.display, display_settings->display_device, MAX_COLORSPACE_NAME); - BLI_strncpy(global_glsl_state.input, from_colorspace, MAX_COLORSPACE_NAME); - global_glsl_state.exposure = view_settings->exposure; - global_glsl_state.gamma = view_settings->gamma; - - /* We're using curve mapping's address as a cache ID, - * so we need to make sure re-allocation gives new address here. - * We do this by allocating new curve mapping before freeing old one. */ - if (use_curve_mapping) { - new_curve_mapping = BKE_curvemapping_copy(view_settings->curve_mapping); - } - - if (global_glsl_state.curve_mapping) { - BKE_curvemapping_free(global_glsl_state.curve_mapping); - MEM_freeN(curve_mapping_settings->lut); - global_glsl_state.curve_mapping = NULL; - curve_mapping_settings->lut = NULL; - } - - /* Fill in OCIO's curve mapping settings. */ - if (use_curve_mapping) { - curve_mapping_to_ocio_settings(new_curve_mapping, &global_glsl_state.curve_mapping_settings); - - global_glsl_state.curve_mapping = new_curve_mapping; - global_glsl_state.curve_mapping_timestamp = view_settings->curve_mapping->changed_timestamp; - global_glsl_state.orig_curve_mapping = view_settings->curve_mapping; - global_glsl_state.use_curve_mapping = true; - } - else { - global_glsl_state.orig_curve_mapping = NULL; - global_glsl_state.use_curve_mapping = false; - } - - /* Free old processor, if any. */ - if (global_glsl_state.processor_scene_to_ui) { - OCIO_processorRelease(global_glsl_state.processor_scene_to_ui); - } - - if (global_glsl_state.processor_ui_to_display) { - OCIO_processorRelease(global_glsl_state.processor_ui_to_display); - } - - /* We're using display OCIO processor, no RGB curves yet. */ - global_glsl_state.processor_scene_to_ui = create_display_buffer_processor( - global_glsl_state.look, - global_glsl_state.view, - global_glsl_state.display, - global_glsl_state.exposure, - global_glsl_state.gamma, - global_glsl_state.input, - true); - - global_glsl_state.processor_ui_to_display = create_display_encoded_buffer_processor( - global_glsl_state.display); + /* Already up to date? */ + OCIO_CurveMappingSettings *curve_mapping_settings = &global_gpu_state.curve_mapping_settings; + if (view_settings->curve_mapping->changed_timestamp == + global_gpu_state.curve_mapping_timestamp && + view_settings->curve_mapping == global_gpu_state.orig_curve_mapping) { + return curve_mapping_settings; } + + /* Need to update. */ + CurveMapping *new_curve_mapping = NULL; + + /* We're using curve mapping's address as a cache ID, + * so we need to make sure re-allocation gives new address here. + * We do this by allocating new curve mapping before freeing old one. */ + if (use_curve_mapping) { + new_curve_mapping = BKE_curvemapping_copy(view_settings->curve_mapping); + } + + if (global_gpu_state.curve_mapping) { + BKE_curvemapping_free(global_gpu_state.curve_mapping); + MEM_freeN(curve_mapping_settings->lut); + global_gpu_state.curve_mapping = NULL; + curve_mapping_settings->lut = NULL; + } + + /* Fill in OCIO's curve mapping settings. */ + if (use_curve_mapping) { + curve_mapping_to_ocio_settings(new_curve_mapping, &global_gpu_state.curve_mapping_settings); + + global_gpu_state.curve_mapping = new_curve_mapping; + global_gpu_state.curve_mapping_timestamp = view_settings->curve_mapping->changed_timestamp; + global_gpu_state.orig_curve_mapping = view_settings->curve_mapping; + global_gpu_state.use_curve_mapping = true; + } + else { + global_gpu_state.orig_curve_mapping = NULL; + global_gpu_state.use_curve_mapping = false; + } + + return curve_mapping_settings; } bool IMB_colormanagement_support_glsl_draw(const ColorManagedViewSettings *UNUSED(view_settings)) { - return OCIO_supportGLSLDraw(); + return OCIO_supportGPUShader(); } /** @@ -4165,27 +4062,40 @@ bool IMB_colormanagement_setup_glsl_draw_from_space( applied_view_settings = &default_view_settings; } - /* Make sure OCIO processor is up-to-date. */ - update_glsl_display_processor(applied_view_settings, - display_settings, - from_colorspace ? from_colorspace->name : - global_role_scene_linear); + /* Ensure curve mapping is up to data. */ + OCIO_CurveMappingSettings *curve_mapping_settings = update_glsl_curve_mapping( + applied_view_settings); - if (global_glsl_state.processor_scene_to_ui == NULL) { - /* Happens when requesting non-existing color space or LUT in the - * configuration file does not exist. - */ - return false; - } + /* GPU shader parameters. */ + const char *input = from_colorspace ? from_colorspace->name : global_role_scene_linear; + const char *view = applied_view_settings->view_transform; + const char *display = display_settings->display_device; + const bool use_look = colormanage_use_look(applied_view_settings->look, + applied_view_settings->view_transform); + const char *look = (use_look) ? applied_view_settings->look : ""; + const float exposure = applied_view_settings->exposure; + const float gamma = applied_view_settings->gamma; + const float scale = (exposure == 0.0f) ? 1.0f : powf(2.0f, exposure); + const float exponent = (gamma == 1.0f) ? 1.0f : 1.0f / max_ff(FLT_EPSILON, gamma); - return OCIO_setupGLSLDraw( - &global_glsl_state.ocio_glsl_state, - global_glsl_state.processor_scene_to_ui, - global_glsl_state.processor_ui_to_display, - global_glsl_state.use_curve_mapping ? &global_glsl_state.curve_mapping_settings : NULL, - dither, - predivide, - do_overlay_merge); + OCIO_ConstConfigRcPtr *config = OCIO_getCurrentConfig(); + + /* Bind shader. Internally GPU shaders are created and cached on demand. */ + global_gpu_state.gpu_shader_bound = OCIO_gpuDisplayShaderBind(config, + input, + view, + display, + look, + curve_mapping_settings, + scale, + exponent, + dither, + predivide, + do_overlay_merge); + + OCIO_configRelease(config); + + return global_gpu_state.gpu_shader_bound; } /* Configures GLSL shader for conversion from scene linear to display space */ @@ -4225,8 +4135,9 @@ bool IMB_colormanagement_setup_glsl_draw_ctx(const bContext *C, float dither, bo /* Finish GLSL-based display space conversion */ void IMB_colormanagement_finish_glsl_draw(void) { - if (global_glsl_state.ocio_glsl_state != NULL) { - OCIO_finishGLSLDraw(global_glsl_state.ocio_glsl_state); + if (global_gpu_state.gpu_shader_bound) { + OCIO_gpuDisplayShaderUnbind(); + global_gpu_state.gpu_shader_bound = false; } } diff --git a/source/blender/imbuf/intern/indexer.c b/source/blender/imbuf/intern/indexer.c index 20e1febedd7..c9581c108c0 100644 --- a/source/blender/imbuf/intern/indexer.c +++ b/source/blender/imbuf/intern/indexer.c @@ -29,6 +29,7 @@ #include "BLI_ghash.h" #include "BLI_path_util.h" #include "BLI_string.h" +#include "BLI_threads.h" #include "BLI_utildefines.h" #ifdef _WIN32 # include "BLI_winstuff.h" @@ -495,6 +496,8 @@ static struct proxy_output_ctx *alloc_proxy_output_ffmpeg( rv->st->id = 0; rv->c = rv->st->codec; + rv->c->thread_count = BLI_system_thread_count(); + rv->c->thread_type = FF_THREAD_SLICE; rv->c->codec_type = AVMEDIA_TYPE_VIDEO; rv->c->codec_id = AV_CODEC_ID_MJPEG; rv->c->width = width; diff --git a/source/blender/imbuf/intern/thumbs_blend.c b/source/blender/imbuf/intern/thumbs_blend.c index 0d1fa354b3e..106e4618847 100644 --- a/source/blender/imbuf/intern/thumbs_blend.c +++ b/source/blender/imbuf/intern/thumbs_blend.c @@ -100,61 +100,3 @@ ImBuf *IMB_thumb_load_blend(const char *blen_path, const char *blen_group, const return ima; } - -/* add a fake passepartout overlay to a byte buffer, use for blend file thumbnails */ -#define MARGIN 2 - -void IMB_thumb_overlay_blend(unsigned int *thumb, int width, int height, float aspect) -{ - unsigned char *px = (unsigned char *)thumb; - int margin_l = MARGIN; - int margin_b = MARGIN; - int margin_r = width - MARGIN; - int margin_t = height - MARGIN; - - if (aspect < 1.0f) { - margin_l = (int)((width - ((float)width * aspect)) / 2.0f); - margin_l += MARGIN; - CLAMP(margin_l, MARGIN, (width / 2)); - margin_r = width - margin_l; - } - else if (aspect > 1.0f) { - margin_b = (int)((height - ((float)height / aspect)) / 2.0f); - margin_b += MARGIN; - CLAMP(margin_b, MARGIN, (height / 2)); - margin_t = height - margin_b; - } - - { - int x, y; - int stride_x = (margin_r - margin_l) - 2; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++, px += 4) { - int hline = 0, vline = 0; - if ((x > margin_l && x < margin_r) && (y > margin_b && y < margin_t)) { - /* interior. skip */ - x += stride_x; - px += stride_x * 4; - } - else if ((hline = (((x == margin_l || x == margin_r)) && y >= margin_b && - y <= margin_t)) || - (vline = (((y == margin_b || y == margin_t)) && x >= margin_l && - x <= margin_r))) { - /* dashed line */ - if ((hline && y % 2) || (vline && x % 2)) { - px[0] = px[1] = px[2] = 0; - px[3] = 255; - } - } - else { - /* outside, fill in alpha, like passepartout */ - px[0] *= 0.5f; - px[1] *= 0.5f; - px[2] *= 0.5f; - px[3] = (px[3] * 0.5f) + 96; - } - } - } - } -} diff --git a/source/blender/imbuf/intern/util_gpu.c b/source/blender/imbuf/intern/util_gpu.c index fc89de476a1..2b99a0aa81d 100644 --- a/source/blender/imbuf/intern/util_gpu.c +++ b/source/blender/imbuf/intern/util_gpu.c @@ -49,7 +49,7 @@ static void imb_gpu_get_format(const ImBuf *ibuf, !IMB_colormanagement_space_is_scene_linear(ibuf->rect_colorspace)); high_bitdepth = (!(ibuf->flags & IB_halffloat) && high_bitdepth); - *r_data_format = (float_rect) ? GPU_DATA_FLOAT : GPU_DATA_UNSIGNED_BYTE; + *r_data_format = (float_rect) ? GPU_DATA_FLOAT : GPU_DATA_UBYTE; if (float_rect) { *r_texture_format = high_bitdepth ? GPU_RGBA32F : GPU_RGBA16F; @@ -219,10 +219,12 @@ void IMB_update_gpu_texture_sub(GPUTexture *tex, GPUTexture *IMB_create_gpu_texture(const char *name, ImBuf *ibuf, bool use_high_bitdepth, - bool use_premult) + bool use_premult, + bool limit_gl_texture_size) { GPUTexture *tex = NULL; - int size[2] = {GPU_texture_size_with_limit(ibuf->x), GPU_texture_size_with_limit(ibuf->y)}; + int size[2] = {GPU_texture_size_with_limit(ibuf->x, limit_gl_texture_size), + GPU_texture_size_with_limit(ibuf->y, limit_gl_texture_size)}; bool do_rescale = (ibuf->x != size[0]) || (ibuf->y != size[1]); #ifdef WITH_DDS diff --git a/source/blender/io/alembic/exporter/abc_archive.cc b/source/blender/io/alembic/exporter/abc_archive.cc index 90a4baf97bc..e066704cd24 100644 --- a/source/blender/io/alembic/exporter/abc_archive.cc +++ b/source/blender/io/alembic/exporter/abc_archive.cc @@ -141,13 +141,13 @@ static TimeSamplingPtr create_time_sampling(double scene_fps, std::vector samples; if (params.frame_start == params.frame_end) { - return TimeSamplingPtr(new TimeSampling()); + return TimeSamplingPtr(new TimeSampling()); // NOLINT: modernize-make-shared } get_shutter_samples(scene_fps, params, nr_of_samples, true, samples); TimeSamplingType ts(static_cast(samples.size()), 1.0 / scene_fps); - return TimeSamplingPtr(new TimeSampling(ts, samples)); + return TimeSamplingPtr(new TimeSampling(ts, samples)); // NOLINT: modernize-make-shared } static void get_frames(double scene_fps, diff --git a/source/blender/io/collada/DocumentImporter.cpp b/source/blender/io/collada/DocumentImporter.cpp index 259bf901091..214b5207a96 100644 --- a/source/blender/io/collada/DocumentImporter.cpp +++ b/source/blender/io/collada/DocumentImporter.cpp @@ -657,7 +657,7 @@ std::vector *DocumentImporter::write_node(COLLADAFW::Node *node, } } - /* XXX: if there're multiple instances, only one is stored */ + /* XXX: if there are multiple instances, only one is stored. */ if (!ob) { goto finally; diff --git a/source/blender/io/collada/GeometryExporter.h b/source/blender/io/collada/GeometryExporter.h index 51879f43272..948aafa760d 100644 --- a/source/blender/io/collada/GeometryExporter.h +++ b/source/blender/io/collada/GeometryExporter.h @@ -90,7 +90,6 @@ class GeometryExporter : COLLADASW::LibraryGeometries { /* creates for texcoords */ void createTexcoordsSource(std::string geom_id, Mesh *me); - void createTesselatedTexcoordsSource(std::string geom_id, Mesh *me); /* creates for normals */ void createNormalsSource(std::string geom_id, Mesh *me, std::vector &nor); diff --git a/source/blender/io/usd/CMakeLists.txt b/source/blender/io/usd/CMakeLists.txt index 79b15c60b94..6ea30f48a13 100644 --- a/source/blender/io/usd/CMakeLists.txt +++ b/source/blender/io/usd/CMakeLists.txt @@ -30,6 +30,9 @@ if(WIN32) endif() add_definitions(-DPXR_STATIC) +# USD headers use deprecated TBB headers, silence warning. +add_definitions(-DTBB_SUPPRESS_DEPRECATED_MESSAGES=1) + set(INC . ../common diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h index 26824216337..9d01617905f 100644 --- a/source/blender/makesdna/DNA_ID.h +++ b/source/blender/makesdna/DNA_ID.h @@ -24,6 +24,7 @@ #pragma once +#include "DNA_ID_enums.h" #include "DNA_defs.h" #include "DNA_listBase.h" @@ -367,13 +368,6 @@ typedef struct Library { short versionfile, subversionfile; } Library; -enum eIconSizes { - ICON_SIZE_ICON = 0, - ICON_SIZE_PREVIEW = 1, - - NUM_ICON_SIZES, -}; - /* for PreviewImage->flag */ enum ePreviewImage_Flag { PRV_CHANGED = (1 << 0), @@ -411,87 +405,6 @@ typedef struct PreviewImage { BLI_assert((prv)->tag & PRV_TAG_DEFFERED), \ (void *)((prv) + 1)) -/** - * Defines for working with IDs. - * - * The tags represent types! This is a dirty way of enabling RTTI. The - * sig_byte end endian defines aren't really used much. - */ - -#ifdef __BIG_ENDIAN__ -/* big endian */ -# define MAKE_ID2(c, d) ((c) << 8 | (d)) -#else -/* little endian */ -# define MAKE_ID2(c, d) ((d) << 8 | (c)) -#endif - -/** - * ID from database. - * - * Written to #BHead.code (for file IO) - * and the first 2 bytes of #ID.name (for runtime checks, see #GS macro). - */ -typedef enum ID_Type { - ID_SCE = MAKE_ID2('S', 'C'), /* Scene */ - ID_LI = MAKE_ID2('L', 'I'), /* Library */ - ID_OB = MAKE_ID2('O', 'B'), /* Object */ - ID_ME = MAKE_ID2('M', 'E'), /* Mesh */ - ID_CU = MAKE_ID2('C', 'U'), /* Curve */ - ID_MB = MAKE_ID2('M', 'B'), /* MetaBall */ - ID_MA = MAKE_ID2('M', 'A'), /* Material */ - ID_TE = MAKE_ID2('T', 'E'), /* Tex (Texture) */ - ID_IM = MAKE_ID2('I', 'M'), /* Image */ - ID_LT = MAKE_ID2('L', 'T'), /* Lattice */ - ID_LA = MAKE_ID2('L', 'A'), /* Light */ - ID_CA = MAKE_ID2('C', 'A'), /* Camera */ - ID_IP = MAKE_ID2('I', 'P'), /* Ipo (depreciated, replaced by FCurves) */ - ID_KE = MAKE_ID2('K', 'E'), /* Key (shape key) */ - ID_WO = MAKE_ID2('W', 'O'), /* World */ - ID_SCR = MAKE_ID2('S', 'R'), /* Screen */ - ID_VF = MAKE_ID2('V', 'F'), /* VFont (Vector Font) */ - ID_TXT = MAKE_ID2('T', 'X'), /* Text */ - ID_SPK = MAKE_ID2('S', 'K'), /* Speaker */ - ID_SO = MAKE_ID2('S', 'O'), /* Sound */ - ID_GR = MAKE_ID2('G', 'R'), /* Collection */ - ID_AR = MAKE_ID2('A', 'R'), /* bArmature */ - ID_AC = MAKE_ID2('A', 'C'), /* bAction */ - ID_NT = MAKE_ID2('N', 'T'), /* bNodeTree */ - ID_BR = MAKE_ID2('B', 'R'), /* Brush */ - ID_PA = MAKE_ID2('P', 'A'), /* ParticleSettings */ - ID_GD = MAKE_ID2('G', 'D'), /* bGPdata, (Grease Pencil) */ - ID_WM = MAKE_ID2('W', 'M'), /* WindowManager */ - ID_MC = MAKE_ID2('M', 'C'), /* MovieClip */ - ID_MSK = MAKE_ID2('M', 'S'), /* Mask */ - ID_LS = MAKE_ID2('L', 'S'), /* FreestyleLineStyle */ - ID_PAL = MAKE_ID2('P', 'L'), /* Palette */ - ID_PC = MAKE_ID2('P', 'C'), /* PaintCurve */ - ID_CF = MAKE_ID2('C', 'F'), /* CacheFile */ - ID_WS = MAKE_ID2('W', 'S'), /* WorkSpace */ - ID_LP = MAKE_ID2('L', 'P'), /* LightProbe */ - ID_HA = MAKE_ID2('H', 'A'), /* Hair */ - ID_PT = MAKE_ID2('P', 'T'), /* PointCloud */ - ID_VO = MAKE_ID2('V', 'O'), /* Volume */ - ID_SIM = MAKE_ID2('S', 'I'), /* Simulation (geometry node groups) */ -} ID_Type; - -/* Only used as 'placeholder' in .blend files for directly linked data-blocks. */ -#define ID_LINK_PLACEHOLDER MAKE_ID2('I', 'D') /* (internal use only) */ - -/* Deprecated. */ -#define ID_SCRN MAKE_ID2('S', 'N') - -/* NOTE! Fake IDs, needed for g.sipo->blocktype or outliner */ -#define ID_SEQ MAKE_ID2('S', 'Q') -/* constraint */ -#define ID_CO MAKE_ID2('C', 'O') -/* pose (action channel, used to be ID_AC in code, so we keep code for backwards compat) */ -#define ID_PO MAKE_ID2('A', 'C') -/* used in outliner... */ -#define ID_NLA MAKE_ID2('N', 'L') -/* fluidsim Ipo */ -#define ID_FLUIDSIM MAKE_ID2('F', 'S') - #define ID_FAKE_USERS(id) ((((const ID *)id)->flag & LIB_FAKEUSER) ? 1 : 0) #define ID_REAL_USERS(id) (((const ID *)id)->us - ID_FAKE_USERS(id)) #define ID_EXTRA_USERS(id) (((const ID *)id)->tag & LIB_TAG_EXTRAUSER ? 1 : 0) @@ -514,6 +427,10 @@ typedef enum ID_Type { (ID_IS_LINKED(_id) && !ID_MISSING(_id) && (((const ID *)(_id))->tag & LIB_TAG_EXTERN) != 0 && \ (BKE_idtype_get_info_from_id((const ID *)(_id))->flags & IDTYPE_FLAGS_NO_LIBLINKING) == 0) +/* NOTE: The three checks below do not take into account whether given ID is linked or not (when + * chaining overrides over several libraries). User must ensure the ID is not linked itself + * currently. */ +/* TODO: add `_EDITABLE` versions of those macros (that would check if ID is linked or not)? */ #define ID_IS_OVERRIDE_LIBRARY_REAL(_id) \ (((const ID *)(_id))->override_library != NULL && \ ((const ID *)(_id))->override_library->reference != NULL) @@ -550,7 +467,7 @@ typedef enum ID_Type { } \ ((void)0) -/** id->flag (persitent). */ +/** id->flag (persistent). */ enum { /** Don't delete the datablock even if unused. */ LIB_FAKEUSER = 1 << 9, @@ -617,7 +534,7 @@ enum { /* tag data-block as having an extra user. */ LIB_TAG_EXTRAUSER = 1 << 2, - /* tag data-block as having actually increased usercount for the extra virtual user. */ + /* tag data-block as having actually increased user-count for the extra virtual user. */ LIB_TAG_EXTRAUSER_SET = 1 << 7, /* RESET_AFTER_USE tag newly duplicated/copied IDs. diff --git a/source/blender/makesdna/DNA_ID_enums.h b/source/blender/makesdna/DNA_ID_enums.h new file mode 100644 index 00000000000..04cbf51dd62 --- /dev/null +++ b/source/blender/makesdna/DNA_ID_enums.h @@ -0,0 +1,118 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup DNA + * \brief Enumerations for `DNA_ID.h`. + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +enum eIconSizes { + ICON_SIZE_ICON = 0, + ICON_SIZE_PREVIEW = 1, + + NUM_ICON_SIZES, +}; + +/** + * Defines for working with IDs. + * + * The tags represent types! This is a dirty way of enabling RTTI. The + * sig_byte end endian defines aren't really used much. + */ + +#ifdef __BIG_ENDIAN__ +/* big endian */ +# define MAKE_ID2(c, d) ((c) << 8 | (d)) +#else +/* little endian */ +# define MAKE_ID2(c, d) ((d) << 8 | (c)) +#endif + +/** + * ID from database. + * + * Written to #BHead.code (for file IO) + * and the first 2 bytes of #ID.name (for runtime checks, see #GS macro). + */ +typedef enum ID_Type { + ID_SCE = MAKE_ID2('S', 'C'), /* Scene */ + ID_LI = MAKE_ID2('L', 'I'), /* Library */ + ID_OB = MAKE_ID2('O', 'B'), /* Object */ + ID_ME = MAKE_ID2('M', 'E'), /* Mesh */ + ID_CU = MAKE_ID2('C', 'U'), /* Curve */ + ID_MB = MAKE_ID2('M', 'B'), /* MetaBall */ + ID_MA = MAKE_ID2('M', 'A'), /* Material */ + ID_TE = MAKE_ID2('T', 'E'), /* Tex (Texture) */ + ID_IM = MAKE_ID2('I', 'M'), /* Image */ + ID_LT = MAKE_ID2('L', 'T'), /* Lattice */ + ID_LA = MAKE_ID2('L', 'A'), /* Light */ + ID_CA = MAKE_ID2('C', 'A'), /* Camera */ + ID_IP = MAKE_ID2('I', 'P'), /* Ipo (depreciated, replaced by FCurves) */ + ID_KE = MAKE_ID2('K', 'E'), /* Key (shape key) */ + ID_WO = MAKE_ID2('W', 'O'), /* World */ + ID_SCR = MAKE_ID2('S', 'R'), /* Screen */ + ID_VF = MAKE_ID2('V', 'F'), /* VFont (Vector Font) */ + ID_TXT = MAKE_ID2('T', 'X'), /* Text */ + ID_SPK = MAKE_ID2('S', 'K'), /* Speaker */ + ID_SO = MAKE_ID2('S', 'O'), /* Sound */ + ID_GR = MAKE_ID2('G', 'R'), /* Collection */ + ID_AR = MAKE_ID2('A', 'R'), /* bArmature */ + ID_AC = MAKE_ID2('A', 'C'), /* bAction */ + ID_NT = MAKE_ID2('N', 'T'), /* bNodeTree */ + ID_BR = MAKE_ID2('B', 'R'), /* Brush */ + ID_PA = MAKE_ID2('P', 'A'), /* ParticleSettings */ + ID_GD = MAKE_ID2('G', 'D'), /* bGPdata, (Grease Pencil) */ + ID_WM = MAKE_ID2('W', 'M'), /* WindowManager */ + ID_MC = MAKE_ID2('M', 'C'), /* MovieClip */ + ID_MSK = MAKE_ID2('M', 'S'), /* Mask */ + ID_LS = MAKE_ID2('L', 'S'), /* FreestyleLineStyle */ + ID_PAL = MAKE_ID2('P', 'L'), /* Palette */ + ID_PC = MAKE_ID2('P', 'C'), /* PaintCurve */ + ID_CF = MAKE_ID2('C', 'F'), /* CacheFile */ + ID_WS = MAKE_ID2('W', 'S'), /* WorkSpace */ + ID_LP = MAKE_ID2('L', 'P'), /* LightProbe */ + ID_HA = MAKE_ID2('H', 'A'), /* Hair */ + ID_PT = MAKE_ID2('P', 'T'), /* PointCloud */ + ID_VO = MAKE_ID2('V', 'O'), /* Volume */ + ID_SIM = MAKE_ID2('S', 'I'), /* Simulation (geometry node groups) */ +} ID_Type; + +/* Only used as 'placeholder' in .blend files for directly linked data-blocks. */ +#define ID_LINK_PLACEHOLDER MAKE_ID2('I', 'D') /* (internal use only) */ + +/* Deprecated. */ +#define ID_SCRN MAKE_ID2('S', 'N') + +/* NOTE: Fake IDs, needed for `g.sipo->blocktype` or outliner. */ +#define ID_SEQ MAKE_ID2('S', 'Q') +/* constraint */ +#define ID_CO MAKE_ID2('C', 'O') +/* pose (action channel, used to be ID_AC in code, so we keep code for backwards compatible). */ +#define ID_PO MAKE_ID2('A', 'C') +/* used in outliner... */ +#define ID_NLA MAKE_ID2('N', 'L') +/* fluidsim Ipo */ +#define ID_FLUIDSIM MAKE_ID2('F', 'S') + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/makesdna/DNA_action_types.h b/source/blender/makesdna/DNA_action_types.h index 96245e3b067..27374c451e9 100644 --- a/source/blender/makesdna/DNA_action_types.h +++ b/source/blender/makesdna/DNA_action_types.h @@ -290,13 +290,13 @@ typedef struct bPoseChannel { /** Matrix result of loc/quat/size, and where we put deform in, see next line */ float chan_mat[4][4]; /** - * Constraints accumulate here. in the end, pose_mat = bone->arm_mat * chan_mat + * Constraints accumulate here. in the end, `pose_mat = bone->arm_mat * chan_mat` * this matrix is object space. */ float pose_mat[4][4]; /** For display, pose_mat with bone length applied. */ float disp_mat[4][4]; - /** For display, pose_mat with bone length applied and translated to tai.l*/ + /** For display, pose_mat with bone length applied and translated to tail. */ float disp_tail_mat[4][4]; /** * Inverse result of constraints. @@ -653,7 +653,7 @@ typedef enum eActionGroup_Flag { * that affects a group of related settings (as defined by the user). */ typedef struct bAction { - /** ID-serialisation for relinking. */ + /** ID-serialization for relinking. */ ID id; /** Function-curves (FCurve). */ diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h index 1eafa655195..dffb3588de4 100644 --- a/source/blender/makesdna/DNA_anim_types.h +++ b/source/blender/makesdna/DNA_anim_types.h @@ -57,6 +57,13 @@ typedef struct FModifier { short type; /** Settings for the modifier. */ short flag; + /** + * Expansion state for the modifier panel and its sub-panels, stored as a bit-field + * in depth-first order. (Maximum of `sizeof(short)` total panels). + */ + short ui_expand_flag; + + char _pad[6]; /** The amount that the modifier should influence the value. */ float influence; @@ -82,7 +89,7 @@ typedef enum eFModifier_Types { FMODIFIER_TYPE_ENVELOPE = 3, FMODIFIER_TYPE_CYCLES = 4, FMODIFIER_TYPE_NOISE = 5, - /** Unimplemented - for applying: fft, high/low pass filters, etc. */ + /** Unimplemented - for applying: FFT, high/low pass filters, etc. */ FMODIFIER_TYPE_FILTER = 6, FMODIFIER_TYPE_PYTHON = 7, FMODIFIER_TYPE_LIMITS = 8, @@ -96,8 +103,10 @@ typedef enum eFModifier_Types { typedef enum eFModifier_Flags { /** Modifier is not able to be evaluated for some reason, and should be skipped (internal). */ FMODIFIER_FLAG_DISABLED = (1 << 0), - /** Modifier's data is expanded (in UI). */ +#ifdef DNA_DEPRECATED_ALLOW + /** Modifier's data is expanded (in UI). Deprecated, use `ui_expand_flag`. */ FMODIFIER_FLAG_EXPANDED = (1 << 1), +#endif /** Modifier is active one (in UI) for editing purposes. */ FMODIFIER_FLAG_ACTIVE = (1 << 2), /** User wants modifier to be skipped. */ @@ -438,9 +447,10 @@ typedef enum eDriverVar_Types { /** 'final' transform for object/bones */ DVAR_TYPE_TRANSFORM_CHAN, - /** Maximum number of variable types. + /** + * Maximum number of variable types. * - * \note This must always be th last item in this list, + * \note This must always be the last item in this list, * so add new types above this line. */ MAX_DVAR_TYPES, diff --git a/source/blender/makesdna/DNA_armature_types.h b/source/blender/makesdna/DNA_armature_types.h index de2d56bb264..09304ce09f2 100644 --- a/source/blender/makesdna/DNA_armature_types.h +++ b/source/blender/makesdna/DNA_armature_types.h @@ -42,23 +42,23 @@ struct AnimData; */ typedef struct Bone { - /** Next/prev elements within this list. */ + /** Next/previous elements within this list. */ struct Bone *next, *prev; /** User-Defined Properties on this Bone. */ IDProperty *prop; - /** Parent (ik parent if appropriate flag is set. */ + /** Parent (IK parent if appropriate flag is set). */ struct Bone *parent; - /** Children . */ + /** Children. */ ListBase childbase; - /** Name of the bone - must be unique within the armature, MAXBONENAME. */ + /** Name of the bone - must be unique within the armature, MAXBONENAME. */ char name[64]; - /** roll is input for editmode, length calculated. */ + /** Roll is input for edit-mode, length calculated. */ float roll; float head[3]; - /** head/tail and roll in Bone Space . */ + /** Head/tail and roll in Bone Space. */ float tail[3]; - /** rotation derived from head/tail/roll. */ + /** Rotation derived from head/tail/roll. */ float bone_mat[3][3]; int flag; @@ -67,21 +67,24 @@ typedef struct Bone { char _pad[7]; float arm_head[3]; - /** head/tail in Armature Space (rest pos). */ + /** Head/tail in Armature Space (rest pose). */ float arm_tail[3]; - /** matrix: (bonemat(b)+head(b))*arm_mat(b-1), rest po.s*/ + /** Matrix: `(bonemat(b)+head(b))*arm_mat(b-1)`, rest pose. */ float arm_mat[4][4]; - /** Roll in Armature Space (rest pos). */ + /** Roll in Armature Space (rest pose). */ float arm_roll; - /** dist, weight: for non-deformgroup deforms. */ + /** dist, weight: for non-deformgroup deforms. */ float dist, weight; - /** width: for block bones. keep in this order, transform!. */ + /** width: for block bones. keep in this order, transform!. */ float xwidth, length, zwidth; - /** Radius for head/tail sphere, defining deform as well, parent->rad_tip overrides rad_head. */ + /** + * Radius for head/tail sphere, defining deform as well, + * `parent->rad_tip` overrides `rad_head`. + */ float rad_head, rad_tail; - /** Curved bones settings - these define the "restpose" for a curved bone. */ + /** Curved bones settings - these define the "rest-pose" for a curved bone. */ float roll1, roll2; float curve_in_x, curve_in_y; float curve_out_x, curve_out_y; @@ -90,11 +93,11 @@ typedef struct Bone { float scale_in_x, scale_in_y; float scale_out_x, scale_out_y; - /** patch for upward compat, UNUSED!. */ + /** Patch for upward compatibility, UNUSED! */ float size[3]; /** Layers that bone appears on. */ int layer; - /** for B-bones. */ + /** For B-bones. */ short segments; /** Type of next/prev bone handles. */ @@ -126,7 +129,7 @@ typedef struct bArmature { /** Active bone. */ Bone *act_bone; - /** Active editbone (in editmode). */ + /** Active edit-bone (in edit-mode). */ struct EditBone *act_edbone; /** ID data is older than edit-mode data (TODO: move to edit-mode struct). */ diff --git a/source/blender/makesdna/DNA_boid_types.h b/source/blender/makesdna/DNA_boid_types.h index 7e010f27ce6..882d4eb1b3b 100644 --- a/source/blender/makesdna/DNA_boid_types.h +++ b/source/blender/makesdna/DNA_boid_types.h @@ -35,7 +35,7 @@ typedef enum eBoidRuleType { eBoidRuleType_Goal = 1, /** get away from assigned object or loudest assigned signal source */ eBoidRuleType_Avoid = 2, - /** manoeuver to avoid collisions with other boids and deflector object in near future */ + /** Maneuver to avoid collisions with other boids and deflector object in near future. */ eBoidRuleType_AvoidCollision = 3, /** keep from going through other boids */ eBoidRuleType_Separate = 4, diff --git a/source/blender/makesdna/DNA_brush_enums.h b/source/blender/makesdna/DNA_brush_enums.h index ff6341ba662..396d248014d 100644 --- a/source/blender/makesdna/DNA_brush_enums.h +++ b/source/blender/makesdna/DNA_brush_enums.h @@ -75,6 +75,10 @@ typedef enum eGPDbrush_Flag { GP_BRUSH_USE_STRENGTH_PRESSURE = (1 << 1), /* brush use pressure for alpha factor */ GP_BRUSH_USE_JITTER_PRESSURE = (1 << 2), + /* Disable automatic zoom for filling. */ + GP_BRUSH_FILL_FIT_DISABLE = (1 << 3), + /* Show extend fill help lines. */ + GP_BRUSH_FILL_SHOW_EXTENDLINES = (1 << 4), /* fill hide transparent */ GP_BRUSH_FILL_HIDE = (1 << 6), /* show fill help lines */ diff --git a/source/blender/makesdna/DNA_brush_types.h b/source/blender/makesdna/DNA_brush_types.h index 88dd662e94a..ab636623390 100644 --- a/source/blender/makesdna/DNA_brush_types.h +++ b/source/blender/makesdna/DNA_brush_types.h @@ -47,8 +47,6 @@ typedef struct BrushClone { char _pad[4]; } BrushClone; -#define GPENCIL_MIN_FILL_FAC 0.05f - typedef struct BrushGpencilSettings { /** Amount of smoothing to apply to newly created strokes. */ float draw_smoothfac; @@ -133,6 +131,10 @@ typedef struct BrushGpencilSettings { /** Randomness for Value. */ float random_value; + /** Factor to extend stroke extremes using fill tool. */ + float fill_extend_fac; + char _pad3[4]; + struct CurveMapping *curve_sensitivity; struct CurveMapping *curve_strength; struct CurveMapping *curve_jitter; diff --git a/source/blender/makesdna/DNA_cloth_types.h b/source/blender/makesdna/DNA_cloth_types.h index 1eff7be3f15..aae29e5fddc 100644 --- a/source/blender/makesdna/DNA_cloth_types.h +++ b/source/blender/makesdna/DNA_cloth_types.h @@ -52,7 +52,7 @@ typedef struct ClothSimSettings { float Cvi; /** Gravity/external force vector. */ float gravity[3]; - /** This is the duration of our time step, computed.. */ + /** This is the duration of our time step, computed. */ float dt; /** The mass of the entire cloth. */ float mass; @@ -78,9 +78,9 @@ typedef struct ClothSimSettings { float time_scale; /** See SB. */ float maxgoal; - /** Scaling of effector forces (see softbody_calc_forces)..*/ + /** Scaling of effector forces (see #softbody_calc_forces). */ float eff_force_scale; - /** Scaling of effector wind (see softbody_calc_forces).. */ + /** Scaling of effector wind (see #softbody_calc_forces). */ float eff_wind_scale; float sim_time_old; float defgoal; @@ -104,16 +104,19 @@ typedef struct ClothSimSettings { float shrink_max; /* Air pressure */ - /* The uniform pressure that is constanty applied to the mesh. Can be negative */ + /** The uniform pressure that is constantly applied to the mesh. Can be negative. */ float uniform_pressure_force; - /* User set volume. This is the volume the mesh wants to expand to (the equilibrium volume). */ + /** User set volume. This is the volume the mesh wants to expand to (the equilibrium volume). */ float target_volume; - /* The scaling factor to apply to the actual pressure. - * pressure=( (current_volume/target_volume) - 1 + uniform_pressure_force) * - * pressure_factor */ + /** + * The scaling factor to apply to the actual pressure. + * `pressure = ((current_volume/target_volume) - 1 + uniform_pressure_force) * pressure_factor` + */ float pressure_factor; - /* Density of the fluid inside or outside the object for use in the hydrostatic pressure - * gradient. */ + /** + * Density of the fluid inside or outside the object + * for use in the hydro-static pressure gradient. + */ float fluid_density; short vgroup_pressure; char _pad7[6]; @@ -168,7 +171,7 @@ typedef struct ClothSimSettings { /** The maximum length an internal spring can have during creation. */ float internal_spring_max_length; - /** How much the interal spring can diverge from the vertex normal during creation. */ + /** How much the internal spring can diverge from the vertex normal during creation. */ float internal_spring_max_diversion; /** Vertex group for scaling structural stiffness. */ short vgroup_intern; diff --git a/source/blender/makesdna/DNA_color_types.h b/source/blender/makesdna/DNA_color_types.h index bcebbf32ebd..e4f6a1eea41 100644 --- a/source/blender/makesdna/DNA_color_types.h +++ b/source/blender/makesdna/DNA_color_types.h @@ -196,7 +196,7 @@ typedef struct ColorManagedViewSettings { char look[64]; /** View transform which is being applied when displaying buffer on the screen. */ char view_transform[64]; - /** Fstop exposure. */ + /** F-stop exposure. */ float exposure; /** Post-display gamma transform. */ float gamma; diff --git a/source/blender/makesdna/DNA_constraint_types.h b/source/blender/makesdna/DNA_constraint_types.h index ddc1b3bd9d7..07fbf263d80 100644 --- a/source/blender/makesdna/DNA_constraint_types.h +++ b/source/blender/makesdna/DNA_constraint_types.h @@ -72,9 +72,9 @@ typedef struct bConstraint { /** Constraint name, MAX_NAME. */ char name[64]; - /** Amount of influence exherted by constraint (0.0-1.0). */ + /** Amount of influence exerted by constraint (0.0-1.0). */ float enforce; - /** Point along subtarget bone where the actual target is. 0=head (default for all), 1=tail. */ + /** Point along `subtarget` bone where the actual target is. 0=head (default for all), 1=tail. */ float headtail; /* old animation system, deprecated for 2.5. */ diff --git a/source/blender/makesdna/DNA_curve_types.h b/source/blender/makesdna/DNA_curve_types.h index 3bf58203bef..b3f0708539a 100644 --- a/source/blender/makesdna/DNA_curve_types.h +++ b/source/blender/makesdna/DNA_curve_types.h @@ -600,10 +600,10 @@ enum { CU_CHINFO_BOLD = 1 << 0, CU_CHINFO_ITALIC = 1 << 1, CU_CHINFO_UNDERLINE = 1 << 2, - /** wordwrap occurred here */ + /** Word-wrap occurred here. */ CU_CHINFO_WRAP = 1 << 3, CU_CHINFO_SMALLCAPS = 1 << 4, - /** set at runtime, checks if case switching is needed */ + /** Set at runtime, checks if case switching is needed. */ CU_CHINFO_SMALLCAPS_CHECK = 1 << 5, /** Set at runtime, indicates char that doesn't fit in text boxes. */ CU_CHINFO_OVERFLOW = 1 << 6, diff --git a/source/blender/makesdna/DNA_gpencil_modifier_defaults.h b/source/blender/makesdna/DNA_gpencil_modifier_defaults.h index 399bf6f0a6d..11d4ee1b2cd 100644 --- a/source/blender/makesdna/DNA_gpencil_modifier_defaults.h +++ b/source/blender/makesdna/DNA_gpencil_modifier_defaults.h @@ -20,7 +20,7 @@ #pragma once -/* Note that some struct members for colormapping and colorbands are not initialized here. */ +/* Note that some struct members for color-mapping and color-bands are not initialized here. */ /* Struct members on own line. */ /* clang-format off */ diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h index 1dbfd547673..9d969a29add 100644 --- a/source/blender/makesdna/DNA_gpencil_types.h +++ b/source/blender/makesdna/DNA_gpencil_types.h @@ -45,6 +45,9 @@ struct MDeformVert; #define GP_DEFAULT_CURVE_ERROR 0.1f #define GP_DEFAULT_CURVE_EDIT_CORNER_ANGLE M_PI_2 +#define GPENCIL_MIN_FILL_FAC 0.05f +#define GPENCIL_MAX_FILL_FAC 5.0f + /* ***************************************** */ /* GP Stroke Points */ @@ -99,7 +102,7 @@ typedef struct bGPDspoint { bGPDspoint_Runtime runtime; } bGPDspoint; -/* bGPDspoint->flag */ +/** #bGPDspoint.flag */ typedef enum eGPDspoint_Flag { /* stroke point is selected (for editing) */ GP_SPOINT_SELECT = (1 << 0), @@ -141,7 +144,7 @@ typedef struct bGPDpalettecolor { char _pad[6]; } bGPDpalettecolor; -/* bGPDpalettecolor->flag */ +/** #bGPDpalettecolor.flag */ typedef enum eGPDpalettecolor_Flag { /* color is active */ /* PC_COLOR_ACTIVE = (1 << 0), */ /* UNUSED */ @@ -168,7 +171,7 @@ typedef struct bGPDpalette { char _pad[6]; } bGPDpalette; -/* bGPDpalette->flag */ +/** #bGPDpalette.flag */ typedef enum eGPDpalette_Flag { /* palette is active */ PL_PALETTE_ACTIVE = (1 << 0), @@ -303,6 +306,10 @@ typedef struct bGPDstroke { float uv_translation[2]; float uv_scale; + /** Stroke selection index.*/ + int select_index; + char _pad4[4]; + /** Vertex weight data. */ struct MDeformVert *dvert; void *_pad3; @@ -316,7 +323,7 @@ typedef struct bGPDstroke { bGPDstroke_Runtime runtime; } bGPDstroke; -/* bGPDstroke->flag */ +/** #bGPDstroke.flag */ typedef enum eGPDstroke_Flag { /* stroke is in 3d-space */ GP_STROKE_3DSPACE = (1 << 0), @@ -344,19 +351,19 @@ typedef enum eGPDstroke_Flag { GP_STROKE_ERASER = (1 << 15), } eGPDstroke_Flag; -/* bGPDstroke->caps */ +/** #bGPDstroke.caps */ typedef enum eGPDstroke_Caps { /* type of extreme */ GP_STROKE_CAP_ROUND = 0, GP_STROKE_CAP_FLAT = 1, - /* Keeo last. */ + /* Keep last. */ GP_STROKE_CAP_MAX, } GPDstroke_Caps; /* Arrows ----------------------- */ -/* bGPDataRuntime.arrowstyle */ +/** #bGPDataRuntime.arrowstyle */ typedef enum eGPDstroke_Arrowstyle { GP_STROKE_ARROWSTYLE_NONE = 0, GP_STROKE_ARROWSTYLE_SEGMENT = 2, @@ -550,13 +557,13 @@ typedef enum eGPDlayer_Flag { GP_LAYER_IS_RULER = (1 << 14), } eGPDlayer_Flag; -/* bGPDlayer->onion_flag */ +/** #bGPDlayer.onion_flag */ typedef enum eGPDlayer_OnionFlag { /* do onion skinning */ GP_LAYER_ONIONSKIN = (1 << 0), } eGPDlayer_OnionFlag; -/* layer blend_mode */ +/** #bGPDlayer.blend_mode */ typedef enum eGPLayerBlendModes { eGplBlendMode_Regular = 0, eGplBlendMode_HardLight = 1, @@ -698,13 +705,19 @@ typedef struct bGPdata { /** Keyframe type for onion filter (eBezTriple_KeyframeType plus All option) */ short onion_keytype; + /** Stroke selection last index. Used to generate a unique selection index. */ + int select_last_index; + char _pad3[4]; + bGPgrid grid; bGPdata_Runtime runtime; } bGPdata; -/* bGPdata->flag */ -/* NOTE: A few flags have been deprecated since early 2.5, +/** + * #bGPdata.flag + * + * NOTE: A few flags have been deprecated since early 2.5, * since they have been made redundant by interaction * changes made during the porting process. */ @@ -809,8 +822,9 @@ typedef enum eGP_DrawMode { /* Check if 'multiedit sessions' is enabled */ #define GPENCIL_MULTIEDIT_SESSIONS_ON(gpd) \ ((gpd) && \ - ((gpd)->flag & (GP_DATA_STROKE_EDITMODE | GP_DATA_STROKE_SCULPTMODE | \ - GP_DATA_STROKE_WEIGHTMODE | GP_DATA_STROKE_VERTEXMODE)) && \ + ((gpd)->flag & \ + (GP_DATA_STROKE_PAINTMODE | GP_DATA_STROKE_EDITMODE | GP_DATA_STROKE_SCULPTMODE | \ + GP_DATA_STROKE_WEIGHTMODE | GP_DATA_STROKE_VERTEXMODE)) && \ ((gpd)->flag & GP_DATA_STROKE_MULTIEDIT)) #define GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd) \ diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h index b1d752d6197..22408687daf 100644 --- a/source/blender/makesdna/DNA_image_types.h +++ b/source/blender/makesdna/DNA_image_types.h @@ -119,6 +119,10 @@ typedef struct ImageTile { /* #define IMA_UNUSED_2 (1 << 2) */ #define IMA_NEED_FRAME_RECALC (1 << 3) #define IMA_SHOW_STEREO (1 << 4) +/* Do not limit the resolution by the limit texture size option in the user preferences. + * Images in the image editor or used as a backdrop are always shown using the maximum + * possible resolution. */ +#define IMA_SHOW_MAX_RESOLUTION (1 << 5) /* Used to get the correct gpu texture from an Image datablock. */ typedef enum eGPUTextureTarget { @@ -229,6 +233,8 @@ enum { IMA_GPU_PARTIAL_REFRESH = (1 << 1), /** All mipmap levels in OpenGL texture set? */ IMA_GPU_MIPMAP_COMPLETE = (1 << 2), + /** Current texture resolution won't be limited by the GL Texture Limit user preference. */ + IMA_GPU_MAX_RESOLUTION = (1 << 3), }; /* Image.source, where the image comes from */ diff --git a/source/blender/makesdna/DNA_lightprobe_types.h b/source/blender/makesdna/DNA_lightprobe_types.h index 3830919bfd3..48e3c44e2c9 100644 --- a/source/blender/makesdna/DNA_lightprobe_types.h +++ b/source/blender/makesdna/DNA_lightprobe_types.h @@ -141,7 +141,7 @@ typedef struct LightGridCache { float visibility_bias, visibility_bleed, visibility_range, _pad5; } LightGridCache; -/* These are used as ubo data. They need to be aligned to size of vec4. */ +/* These are used as UBO data. They need to be aligned to size of vec4. */ BLI_STATIC_ASSERT_ALIGN(LightProbeCache, 16) BLI_STATIC_ASSERT_ALIGN(LightGridCache, 16) @@ -185,7 +185,7 @@ typedef struct LightCache { } LightCache; /* Bump the version number for lightcache data structure changes. */ -#define LIGHTCACHE_STATIC_VERSION 1 +#define LIGHTCACHE_STATIC_VERSION 2 /* LightCache->type */ enum { diff --git a/source/blender/makesdna/DNA_mask_types.h b/source/blender/makesdna/DNA_mask_types.h index 79ac655300e..8868ac1ea12 100644 --- a/source/blender/makesdna/DNA_mask_types.h +++ b/source/blender/makesdna/DNA_mask_types.h @@ -131,7 +131,7 @@ typedef struct MaskLayerShape { /** U coordinate along spline segment and weight of this point. */ float *data; - /** To ensure no buffer overruns's: alloc size is (tot_vert * MASK_OBJECT_SHAPE_ELEM_SIZE). */ + /** To ensure no buffer overrun's: alloc size is `(tot_vert * MASK_OBJECT_SHAPE_ELEM_SIZE)`. */ int tot_vert; /** Different flags of this point. */ int frame; diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h index 919bd18be80..884c2df6480 100644 --- a/source/blender/makesdna/DNA_material_types.h +++ b/source/blender/makesdna/DNA_material_types.h @@ -45,11 +45,11 @@ struct bNodeTree; typedef struct TexPaintSlot { /** Image to be painted on. */ struct Image *ima; - /** Customdata index for uv layer, MAX_NAM.E*/ + /** Custom-data index for uv layer, #MAX_NAME. */ char *uvname; /** Do we have a valid image and UV map. */ int valid; - /** Copy of node inteporlation setting. */ + /** Copy of node interpolation setting. */ int interp; } TexPaintSlot; diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h index 780115a31be..05be31262a6 100644 --- a/source/blender/makesdna/DNA_meshdata_types.h +++ b/source/blender/makesdna/DNA_meshdata_types.h @@ -271,6 +271,9 @@ typedef struct MIntProperty { typedef struct MStringProperty { char s[255], s_len; } MStringProperty; +typedef struct MBoolProperty { + uint8_t b; +} MBoolProperty; /** \} */ @@ -414,7 +417,6 @@ typedef struct OrigSpaceLoop { typedef struct FreestyleEdge { char flag; - char _pad[3]; } FreestyleEdge; /** #FreestyleEdge.flag */ @@ -424,7 +426,6 @@ enum { typedef struct FreestyleFace { char flag; - char _pad[3]; } FreestyleFace; /** #FreestyleFace.flag */ diff --git a/source/blender/makesdna/DNA_meta_types.h b/source/blender/makesdna/DNA_meta_types.h index a827003a9a0..a991f654b09 100644 --- a/source/blender/makesdna/DNA_meta_types.h +++ b/source/blender/makesdna/DNA_meta_types.h @@ -128,9 +128,9 @@ typedef struct MetaBall { /* ml->type */ #define MB_BALL 0 -#define MB_TUBEX 1 /* depercated */ -#define MB_TUBEY 2 /* depercated */ -#define MB_TUBEZ 3 /* depercated */ +#define MB_TUBEX 1 /* deprecated. */ +#define MB_TUBEY 2 /* deprecated. */ +#define MB_TUBEZ 3 /* deprecated. */ #define MB_TUBE 4 #define MB_PLANE 5 #define MB_ELIPSOID 6 diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 091b34a5d32..c5e2397b995 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -1230,12 +1230,14 @@ typedef struct SolidifyModifierData { char defgrp_name[64]; char shell_defgrp_name[64]; char rim_defgrp_name[64]; - /** New surface offset leve.l*/ + /** New surface offset level. */ float offset; - /** Midpoint of the offset . */ + /** Midpoint of the offset. */ float offset_fac; - /** factor for the minimum weight to use when vgroups are used, - * avoids 0.0 weights giving duplicate geometry */ + /** + * Factor for the minimum weight to use when vertex-groups are used, + * avoids 0.0 weights giving duplicate geometry. + */ float offset_fac_vg; /** Clamp offset based on surrounding geometry. */ float offset_clamp; @@ -1719,7 +1721,7 @@ typedef enum eRemeshModifierMode { typedef struct RemeshModifierData { ModifierData modifier; - /* floodfill option, controls how small components can be before they are removed */ + /** Flood-fill option, controls how small components can be before they are removed. */ float threshold; /* ratio between size of model and grid */ diff --git a/source/blender/makesdna/DNA_movieclip_types.h b/source/blender/makesdna/DNA_movieclip_types.h index 11cdb48edf0..8e01a9e1f1f 100644 --- a/source/blender/makesdna/DNA_movieclip_types.h +++ b/source/blender/makesdna/DNA_movieclip_types.h @@ -144,19 +144,19 @@ typedef struct MovieClipScopes { struct ImBuf *track_search; /** #ImBuf displayed in track preview. */ struct ImBuf *track_preview; - /** Sub-pizel position of marker in track ImBuf. */ + /** Sub-pixel position of marker in track ImBuf. */ float track_pos[2]; /** Active track is disabled, special notifier should be drawn. */ short track_disabled; /** Active track is locked, no transformation should be allowed. */ short track_locked; - /** Frame number scopes are created for. */ - int framenr; + /** Frame number scopes are created for (measured in scene frames). */ + int scene_framenr; /** Track scopes are created for. */ struct MovieTrackingTrack *track; /** Marker scopes are created for. */ struct MovieTrackingMarker *marker; - /** Scale used for sliding from previewe area. */ + /** Scale used for sliding from preview area. */ float slide_scale[2]; } MovieClipScopes; diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index e8748e28776..8b0bc235861 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -37,6 +37,7 @@ struct Collection; struct ID; struct Image; struct ListBase; +struct NodeTreeUIStorage; struct bGPdata; struct bNodeInstanceHash; struct bNodeLink; @@ -118,7 +119,9 @@ typedef struct bNodeSocket { /* XXX deprecated, kept for forward compatibility */ short stack_type DNA_DEPRECATED; char display_shape; - char _pad[3]; + char _pad[1]; + /* Runtime-only cache of the number of input links, for multi-input sockets. */ + short total_inputs; /** Custom dynamic defined label, MAX_NAME. */ char label[64]; @@ -391,13 +394,15 @@ typedef struct bNodeLink { bNodeSocket *fromsock, *tosock; int flag; - char _pad[4]; + /* A runtime storage for automatically sorted links to multi-input sockets. */ + int multi_input_socket_index; } bNodeLink; /* link->flag */ #define NODE_LINKFLAG_HILITE (1 << 0) /* link has been successfully validated */ #define NODE_LINK_VALID (1 << 1) -#define NODE_LINK_TEST (1 << 2) /* free test flag, undefined */ +#define NODE_LINK_TEST (1 << 2) /* free test flag, undefined */ +#define NODE_LINK_TEMP_HIGHLIGHT (1 << 3) /* Link is highlighted for picking. */ /* tree->edit_quality/tree->render_quality */ #define NTREE_QUALITY_HIGH 0 @@ -497,6 +502,8 @@ typedef struct bNodeTree { int (*test_break)(void *); void (*update_draw)(void *); void *tbh, *prh, *sdh, *udh; + + struct NodeTreeUIStorage *ui_storage; } bNodeTree; /* ntree->type, index */ @@ -551,7 +558,6 @@ typedef struct bNodeSocketValueFloat { typedef struct bNodeSocketValueBoolean { char value; - char _pad[3]; } bNodeSocketValueBoolean; typedef struct bNodeSocketValueVector { @@ -831,7 +837,6 @@ typedef struct NodeColorspill { typedef struct NodeDilateErode { char falloff; - char _pad[7]; } NodeDilateErode; typedef struct NodeMask { @@ -840,7 +845,6 @@ typedef struct NodeMask { typedef struct NodeSetAlpha { char mode; - char _pad[7]; } NodeSetAlpha; typedef struct NodeTexBase { @@ -997,7 +1001,6 @@ typedef struct NodeTrackPosData { typedef struct NodeTranslateData { char wrap_axis; char relative; - char _pad[6]; } NodeTranslateData; typedef struct NodePlaneTrackDeformData { @@ -1076,7 +1079,6 @@ typedef struct NodeCryptomatte { typedef struct NodeDenoise { char hdr; - char _pad[7]; } NodeDenoise; typedef struct NodeAttributeCompare { @@ -1098,8 +1100,6 @@ typedef struct NodeAttributeMath { uint8_t input_type_a; uint8_t input_type_b; uint8_t input_type_c; - - char _pad[4]; } NodeAttributeMath; typedef struct NodeAttributeMix { @@ -1112,6 +1112,16 @@ typedef struct NodeAttributeMix { uint8_t input_type_b; } NodeAttributeMix; +typedef struct NodeAttributeRandomize { + /* CustomDataType. */ + uint8_t data_type; + /* AttributeDomain. */ + uint8_t domain; + /* GeometryNodeAttributeRandomizeMode. */ + uint8_t operation; + char _pad[1]; +} NodeAttributeRandomize; + typedef struct NodeAttributeVectorMath { /* NodeVectorMathOperation */ uint8_t operation; @@ -1120,8 +1130,6 @@ typedef struct NodeAttributeVectorMath { uint8_t input_type_a; uint8_t input_type_b; uint8_t input_type_c; - - char _pad[4]; } NodeAttributeVectorMath; typedef struct NodeAttributeColorRamp { @@ -1132,6 +1140,10 @@ typedef struct NodeInputVector { float vector[3]; } NodeInputVector; +typedef struct NodeInputString { + char *string; +} NodeInputString; + typedef struct NodeGeometryRotatePoints { /* GeometryNodeRotatePointsType */ uint8_t type; @@ -1159,22 +1171,16 @@ typedef struct NodeGeometryAlignRotationToVector { typedef struct NodeGeometryPointScale { /* GeometryNodeAttributeInputMode */ uint8_t input_type; - - char _pad[7]; } NodeGeometryPointScale; typedef struct NodeGeometryPointTranslate { /* GeometryNodeAttributeInputMode */ uint8_t input_type; - - char _pad[7]; } NodeGeometryPointTranslate; typedef struct NodeGeometryObjectInfo { /* GeometryNodeTransformSpace. */ uint8_t transform_space; - - char _pad[7]; } NodeGeometryObjectInfo; typedef struct NodeGeometryPointInstance { @@ -1182,8 +1188,6 @@ typedef struct NodeGeometryPointInstance { uint8_t instance_type; /* GeometryNodePointInstanceFlag. */ uint8_t flag; - - char _pad[6]; } NodeGeometryPointInstance; typedef struct NodeGeometryPointsToVolume { @@ -1191,31 +1195,37 @@ typedef struct NodeGeometryPointsToVolume { uint8_t resolution_mode; /* GeometryNodeAttributeInputMode */ uint8_t input_type_radius; - - char _pad[6]; } NodeGeometryPointsToVolume; typedef struct NodeGeometryCollectionInfo { /* GeometryNodeTransformSpace. */ uint8_t transform_space; - - char _pad[7]; } NodeGeometryCollectionInfo; typedef struct NodeGeometryAttributeProximity { - /* GeometryNodeAttributeProximityTargetGeometryElement. */ + /* GeometryNodeAttributeProximityTargetType. */ uint8_t target_geometry_element; - - char _pad[7]; } NodeGeometryAttributeProximity; typedef struct NodeGeometryVolumeToMesh { /* VolumeToMeshResolutionMode */ uint8_t resolution_mode; - - char _pad[7]; } NodeGeometryVolumeToMesh; +typedef struct NodeAttributeCombineXYZ { + /* GeometryNodeAttributeInputMode. */ + uint8_t input_type_x; + uint8_t input_type_y; + uint8_t input_type_z; + + char _pad[1]; +} NodeAttributeCombineXYZ; + +typedef struct NodeAttributeSeparateXYZ { + /* GeometryNodeAttributeInputMode. */ + uint8_t input_type; +} NodeAttributeSeparateXYZ; + /* script node mode */ #define NODE_SCRIPT_INTERNAL 0 #define NODE_SCRIPT_EXTERNAL 1 @@ -1223,7 +1233,7 @@ typedef struct NodeGeometryVolumeToMesh { /* script node flag */ #define NODE_SCRIPT_AUTO_UPDATE 1 -/* ies node mode */ +/* IES node mode. */ #define NODE_IES_INTERNAL 0 #define NODE_IES_EXTERNAL 1 @@ -1547,7 +1557,7 @@ enum { /* image */ #define CMP_NODE_IMAGE_USE_STRAIGHT_OUTPUT 1 -/* viewer and cmposite output */ +/* viewer and composite output. */ #define CMP_NODE_OUTPUT_IGNORE_ALPHA 1 /* Plane track deform node */ @@ -1603,11 +1613,11 @@ typedef enum NodeShaderOutputTarget { /* Geometry Nodes */ -typedef enum GeometryNodeAttributeProximityTargetGeometryElement { +typedef enum GeometryNodeAttributeProximityTargetType { GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_POINTS = 0, GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_EDGES = 1, GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_FACES = 2, -} GeometryNodeAttributeProximityTargetGeometryElement; +} GeometryNodeAttributeProximityTargetType; /* Boolean Node */ typedef enum GeometryNodeBooleanOperation { @@ -1644,18 +1654,26 @@ typedef enum GeometryNodeAttributeInputMode { GEO_NODE_ATTRIBUTE_INPUT_VECTOR = 2, GEO_NODE_ATTRIBUTE_INPUT_COLOR = 3, GEO_NODE_ATTRIBUTE_INPUT_BOOLEAN = 4, + GEO_NODE_ATTRIBUTE_INPUT_INTEGER = 5, } GeometryNodeAttributeInputMode; -typedef enum GeometryNodePointDistributeMethod { +typedef enum GeometryNodePointDistributeMode { GEO_NODE_POINT_DISTRIBUTE_RANDOM = 0, GEO_NODE_POINT_DISTRIBUTE_POISSON = 1, -} GeometryNodePointDistributeMethod; +} GeometryNodePointDistributeMode; typedef enum GeometryNodeRotatePointsType { GEO_NODE_POINT_ROTATE_TYPE_EULER = 0, GEO_NODE_POINT_ROTATE_TYPE_AXIS_ANGLE = 1, } GeometryNodeRotatePointsType; +typedef enum GeometryNodeAttributeRandomizeMode { + GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE = 0, + GEO_NODE_ATTRIBUTE_RANDOMIZE_ADD = 1, + GEO_NODE_ATTRIBUTE_RANDOMIZE_SUBTRACT = 2, + GEO_NODE_ATTRIBUTE_RANDOMIZE_MULTIPLY = 3, +} GeometryNodeAttributeRandomizeMode; + typedef enum GeometryNodeRotatePointsSpace { GEO_NODE_POINT_ROTATE_SPACE_OBJECT = 0, GEO_NODE_POINT_ROTATE_SPACE_POINT = 1, diff --git a/source/blender/makesdna/DNA_object_force_types.h b/source/blender/makesdna/DNA_object_force_types.h index 3bd11d02b7a..37013f5b4d6 100644 --- a/source/blender/makesdna/DNA_object_force_types.h +++ b/source/blender/makesdna/DNA_object_force_types.h @@ -224,7 +224,7 @@ typedef struct SoftBody { * rather find them by name tag to find it -> jow20090613. * MAX_VGROUP_NAME */ char namedVG_Mass[64]; - /** Softbody amount of gravitaion to apply. */ + /** Softbody amount of gravitation to apply. */ float grav; /** Friction to env. */ float mediafrict; @@ -310,7 +310,7 @@ typedef struct SoftBody { struct Collection *collision_group; struct EffectorWeights *effector_weights; - /* reverse esimated obmatrix .. no need to store in blend file .. how ever who cares */ + /* Reverse estimated object-matrix (run-time data, no need to store in the file). */ float lcom[3]; float lrot[3][3]; float lscale[3][3]; diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index 8b13db8a012..f6372a0c240 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -38,6 +38,7 @@ extern "C" { struct AnimData; struct BoundBox; +struct Curve; struct FluidsimSettings; struct GeometrySet; struct Ipo; @@ -186,6 +187,12 @@ typedef struct Object_Runtime { */ struct Mesh *object_as_temp_mesh; + /** + * This is a curve representation of corresponding object. + * It created when Python calls `object.to_curve()`. + */ + struct Curve *object_as_temp_curve; + /** Runtime evaluated curve-specific data, not stored in the file. */ struct CurveCache *curve_cache; diff --git a/source/blender/makesdna/DNA_outliner_types.h b/source/blender/makesdna/DNA_outliner_types.h index 8a8a40a5069..16129768b60 100644 --- a/source/blender/makesdna/DNA_outliner_types.h +++ b/source/blender/makesdna/DNA_outliner_types.h @@ -72,53 +72,55 @@ enum { }; /** #TreeStoreElem.types */ -#define TSE_NLA 1 /* NO ID */ -#define TSE_NLA_ACTION 2 -#define TSE_DEFGROUP_BASE 3 -#define TSE_DEFGROUP 4 -#define TSE_BONE 5 -#define TSE_EBONE 6 -#define TSE_CONSTRAINT_BASE 7 -#define TSE_CONSTRAINT 8 -#define TSE_MODIFIER_BASE 9 -#define TSE_MODIFIER 10 -#define TSE_LINKED_OB 11 -/* #define TSE_SCRIPT_BASE 12 */ /* UNUSED */ -#define TSE_POSE_BASE 13 -#define TSE_POSE_CHANNEL 14 -#define TSE_ANIM_DATA 15 -#define TSE_DRIVER_BASE 16 /* NO ID */ -/* #define TSE_DRIVER 17 */ /* UNUSED */ +typedef enum eTreeStoreElemType { + TSE_NLA = 1, /* NO ID */ + TSE_NLA_ACTION = 2, + TSE_DEFGROUP_BASE = 3, + TSE_DEFGROUP = 4, + TSE_BONE = 5, + TSE_EBONE = 6, + TSE_CONSTRAINT_BASE = 7, + TSE_CONSTRAINT = 8, + TSE_MODIFIER_BASE = 9, + TSE_MODIFIER = 10, + TSE_LINKED_OB = 11, + /* TSE_SCRIPT_BASE = 12, */ /* UNUSED */ + TSE_POSE_BASE = 13, + TSE_POSE_CHANNEL = 14, + TSE_ANIM_DATA = 15, + TSE_DRIVER_BASE = 16, /* NO ID */ + /* TSE_DRIVER = 17, */ /* UNUSED */ -#define TSE_PROXY 18 -#define TSE_R_LAYER_BASE 19 -#define TSE_R_LAYER 20 -/* #define TSE_R_PASS 21 */ /* UNUSED */ -#define TSE_LINKED_MAT 22 -/* NOTE, is used for light group */ -#define TSE_LINKED_LAMP 23 -#define TSE_POSEGRP_BASE 24 -#define TSE_POSEGRP 25 -#define TSE_SEQUENCE 26 /* NO ID */ -#define TSE_SEQ_STRIP 27 /* NO ID */ -#define TSE_SEQUENCE_DUP 28 /* NO ID */ -#define TSE_LINKED_PSYS 29 -#define TSE_RNA_STRUCT 30 /* NO ID */ -#define TSE_RNA_PROPERTY 31 /* NO ID */ -#define TSE_RNA_ARRAY_ELEM 32 /* NO ID */ -#define TSE_NLA_TRACK 33 /* NO ID */ -#define TSE_KEYMAP 34 /* NO ID */ -#define TSE_KEYMAP_ITEM 35 /* NO ID */ -#define TSE_ID_BASE 36 /* NO ID */ -#define TSE_GP_LAYER 37 /* NO ID */ -#define TSE_LAYER_COLLECTION 38 -#define TSE_SCENE_COLLECTION_BASE 39 -#define TSE_VIEW_COLLECTION_BASE 40 -#define TSE_SCENE_OBJECTS_BASE 41 -#define TSE_GPENCIL_EFFECT_BASE 42 -#define TSE_GPENCIL_EFFECT 43 -#define TSE_LIBRARY_OVERRIDE_BASE 44 -#define TSE_LIBRARY_OVERRIDE 45 + TSE_PROXY = 18, + TSE_R_LAYER_BASE = 19, + TSE_R_LAYER = 20, + /* TSE_R_PASS = 21, */ /* UNUSED */ + /* TSE_LINKED_MAT = 22, */ + /* NOTE, is used for light group */ + /* TSE_LINKED_LAMP = 23, */ + TSE_POSEGRP_BASE = 24, + TSE_POSEGRP = 25, + TSE_SEQUENCE = 26, /* NO ID */ + TSE_SEQ_STRIP = 27, /* NO ID */ + TSE_SEQUENCE_DUP = 28, /* NO ID */ + TSE_LINKED_PSYS = 29, + TSE_RNA_STRUCT = 30, /* NO ID */ + TSE_RNA_PROPERTY = 31, /* NO ID */ + TSE_RNA_ARRAY_ELEM = 32, /* NO ID */ + TSE_NLA_TRACK = 33, /* NO ID */ + /* TSE_KEYMAP = 34, */ /* UNUSED */ + /* TSE_KEYMAP_ITEM = 35, */ /* UNUSED */ + TSE_ID_BASE = 36, /* NO ID */ + TSE_GP_LAYER = 37, /* NO ID */ + TSE_LAYER_COLLECTION = 38, + TSE_SCENE_COLLECTION_BASE = 39, + TSE_VIEW_COLLECTION_BASE = 40, + TSE_SCENE_OBJECTS_BASE = 41, + TSE_GPENCIL_EFFECT_BASE = 42, + TSE_GPENCIL_EFFECT = 43, + TSE_LIBRARY_OVERRIDE_BASE = 44, + TSE_LIBRARY_OVERRIDE = 45, +} eTreeStoreElemType; /** Check whether given #TreeStoreElem should have a real ID in #TreeStoreElem.id member. */ #define TSE_IS_REAL_ID(_tse) \ @@ -132,8 +134,6 @@ enum { TSE_RNA_STRUCT, \ TSE_RNA_PROPERTY, \ TSE_RNA_ARRAY_ELEM, \ - TSE_KEYMAP, \ - TSE_KEYMAP_ITEM, \ TSE_ID_BASE, \ TSE_GP_LAYER)) diff --git a/source/blender/makesdna/DNA_particle_types.h b/source/blender/makesdna/DNA_particle_types.h index 10fcca734b2..cc40e26b92b 100644 --- a/source/blender/makesdna/DNA_particle_types.h +++ b/source/blender/makesdna/DNA_particle_types.h @@ -118,10 +118,10 @@ typedef struct ParticleData { /** Boids data. */ BoidParticle *boid; - /** Amount of hair or keyed key.s*/ + /** Amount of hair or keyed keys. */ int totkey; - /** Dietime is not necessarily time+lifetime as. */ + /** Die-time is not necessarily time+lifetime as. */ float time, lifetime; /** Particles can die unnaturally (collision). */ float dietime; diff --git a/source/blender/makesdna/DNA_rigidbody_types.h b/source/blender/makesdna/DNA_rigidbody_types.h index 48f183e1e28..740dc35517a 100644 --- a/source/blender/makesdna/DNA_rigidbody_types.h +++ b/source/blender/makesdna/DNA_rigidbody_types.h @@ -45,7 +45,7 @@ typedef struct RigidBodyWorld_Shared { struct ListBase ptcaches; /* References to Physics Sim objects. Exist at runtime only ---------------------- */ - /** Physics sim world (i.e. btDiscreteDynamicsWorld). */ + /** Physics sim world (i.e. #btDiscreteDynamicsWorld). */ void *physics_world; } RigidBodyWorld_Shared; @@ -63,7 +63,7 @@ typedef struct RigidBodyWorld { /** Array to access group objects by index, only used at runtime. */ struct Object **objects; - /** Group containing objects to use for Rigid Body Constraint.s*/ + /** Group containing objects to use for Rigid Body Constraints. */ struct Collection *constraints; char _pad[4]; @@ -72,19 +72,19 @@ typedef struct RigidBodyWorld { /** This pointer is shared between all evaluated copies. */ struct RigidBodyWorld_Shared *shared; - /** Moved to shared->pointcache. */ + /** Moved to `shared->pointcache`. */ struct PointCache *pointcache DNA_DEPRECATED; - /** Moved to shared->ptcaches. */ + /** Moved to `shared->ptcaches`. */ struct ListBase ptcaches DNA_DEPRECATED; /** Number of objects in rigid body group. */ int numbodies; - /** Number of simulation substeps steps taken per frame. */ + /** Number of simulation sub-steps steps taken per frame. */ short substeps_per_frame; /** Number of constraint solver iterations made per simulation step. */ short num_solver_iterations; - /** (eRigidBodyWorld_Flag) settings for this RigidBodyWorld. */ + /** (#eRigidBodyWorld_Flag) settings for this RigidBodyWorld. */ int flag; /** Used to speed up or slow down the simulation. */ float time_scale; @@ -96,7 +96,7 @@ typedef enum eRigidBodyWorld_Flag { RBW_FLAG_MUTED = (1 << 0), /* sim data needs to be rebuilt */ /* RBW_FLAG_NEEDS_REBUILD = (1 << 1), */ /* UNUSED */ - /* usse split impulse when stepping the simulation */ + /** Use split impulse when stepping the simulation. */ RBW_FLAG_USE_SPLIT_IMPULSE = (1 << 2), } eRigidBodyWorld_Flag; @@ -312,7 +312,7 @@ typedef enum eRigidBodyCon_Type { RBC_TYPE_HINGE = 1, /** simulates wheel suspension */ /* RBC_TYPE_HINGE2 = 2, */ /* UNUSED */ - /** restricts movent to a specified axis */ + /** Restricts moment to a specified axis. */ RBC_TYPE_SLIDER = 3, /** lets object rotate within a specified cone */ /* RBC_TYPE_CONE_TWIST = 4, */ /* UNUSED */ @@ -329,7 +329,7 @@ typedef enum eRigidBodyCon_Type { /** Simplified spring constraint with only once axis that's * automatically placed between the connected bodies */ /* RBC_TYPE_SPRING = 10, */ /* UNUSED */ - /** dirves bodies by applying linear and angular forces */ + /** Drives bodies by applying linear and angular forces. */ RBC_TYPE_MOTOR = 11, } eRigidBodyCon_Type; diff --git a/source/blender/makesdna/DNA_scene_defaults.h b/source/blender/makesdna/DNA_scene_defaults.h index ae02ac5ee35..3e1b2ef56a1 100644 --- a/source/blender/makesdna/DNA_scene_defaults.h +++ b/source/blender/makesdna/DNA_scene_defaults.h @@ -208,8 +208,11 @@ .gtao_factor = 1.0f, \ .gtao_quality = 0.25f, \ \ + .bokeh_overblur = 5.0f, \ .bokeh_max_size = 100.0f, \ .bokeh_threshold = 1.0f, \ + .bokeh_neighbor_max = 10.0f, \ + .bokeh_denoise_fac = 0.75f, \ \ .bloom_color = {1.0f, 1.0f, 1.0f}, \ .bloom_threshold = 0.8f, \ diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 973035281ca..97914e6cc06 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -231,7 +231,7 @@ typedef struct SceneRenderLayer { struct FreestyleConfig freestyleConfig DNA_DEPRECATED; } SceneRenderLayer; -/* SceneRenderLayer.layflag */ +/** #SceneRenderLayer.layflag */ #define SCE_LAY_SOLID (1 << 0) #define SCE_LAY_ZTRA (1 << 1) #define SCE_LAY_HALO (1 << 2) @@ -249,7 +249,7 @@ typedef struct SceneRenderLayer { #define SCE_LAY_ZMASK (1 << 18) #define SCE_LAY_NEG_ZMASK (1 << 19) -/* SceneRenderLayer.passflag */ +/** #SceneRenderLayer.passflag */ typedef enum eScenePassType { SCE_PASS_COMBINED = (1 << 0), SCE_PASS_Z = (1 << 1), @@ -334,16 +334,16 @@ typedef struct SceneRenderView { } SceneRenderView; -/* SceneRenderView.viewflag */ +/** #SceneRenderView.viewflag */ #define SCE_VIEW_DISABLE (1 << 0) -/* RenderData.views_format */ +/** #RenderData.views_format */ enum { SCE_VIEWS_FORMAT_STEREO_3D = 0, SCE_VIEWS_FORMAT_MULTIVIEW = 1, }; -/* ImageFormatData.views_format (also used for Sequence.views_format) */ +/** #ImageFormatData.views_format (also used for #Sequence.views_format) */ enum { R_IMF_VIEWS_INDIVIDUAL = 0, R_IMF_VIEWS_STEREO_3D = 1, @@ -361,7 +361,7 @@ typedef struct Stereo3dFormat { char _pad[3]; } Stereo3dFormat; -/* Stereo3dFormat.display_mode */ +/** #Stereo3dFormat.display_mode */ typedef enum eStereoDisplayMode { S3D_DISPLAY_ANAGLYPH = 0, S3D_DISPLAY_INTERLACE = 1, @@ -370,21 +370,21 @@ typedef enum eStereoDisplayMode { S3D_DISPLAY_TOPBOTTOM = 4, } eStereoDisplayMode; -/* Stereo3dFormat.flag */ +/** #Stereo3dFormat.flag */ typedef enum eStereo3dFlag { S3D_INTERLACE_SWAP = (1 << 0), S3D_SIDEBYSIDE_CROSSEYED = (1 << 1), S3D_SQUEEZED_FRAME = (1 << 2), } eStereo3dFlag; -/* Stereo3dFormat.anaglyph_type */ +/** #Stereo3dFormat.anaglyph_type */ typedef enum eStereo3dAnaglyphType { S3D_ANAGLYPH_REDCYAN = 0, S3D_ANAGLYPH_GREENMAGENTA = 1, S3D_ANAGLYPH_YELLOWBLUE = 2, } eStereo3dAnaglyphType; -/* Stereo3dFormat.interlace_type */ +/** #Stereo3dFormat.interlace_type */ typedef enum eStereo3dInterlaceType { S3D_INTERLACE_ROW = 0, S3D_INTERLACE_COLUMN = 1, @@ -449,26 +449,26 @@ typedef struct ImageFormatData { ColorManagedDisplaySettings display_settings; } ImageFormatData; -/* ImageFormatData.imtype */ +/** #ImageFormatData.imtype */ #define R_IMF_IMTYPE_TARGA 0 #define R_IMF_IMTYPE_IRIS 1 -/* #define R_HAMX 2 */ /* hamx is nomore */ -/* #define R_FTYPE 3 */ /* ftype is nomore */ +/* #define R_HAMX 2 */ /* DEPRECATED */ +/* #define R_FTYPE 3 */ /* DEPRECATED */ #define R_IMF_IMTYPE_JPEG90 4 -/* #define R_MOVIE 5 */ /* movie is nomore */ +/* #define R_MOVIE 5 */ /* DEPRECATED */ #define R_IMF_IMTYPE_IRIZ 7 #define R_IMF_IMTYPE_RAWTGA 14 #define R_IMF_IMTYPE_AVIRAW 15 #define R_IMF_IMTYPE_AVIJPEG 16 #define R_IMF_IMTYPE_PNG 17 -/* #define R_IMF_IMTYPE_AVICODEC 18 */ /* avicodec is nomore */ -/* #define R_IMF_IMTYPE_QUICKTIME 19 */ /* quicktime is nomore */ +/* #define R_IMF_IMTYPE_AVICODEC 18 */ /* DEPRECATED */ +/* #define R_IMF_IMTYPE_QUICKTIME 19 */ /* DEPRECATED */ #define R_IMF_IMTYPE_BMP 20 #define R_IMF_IMTYPE_RADHDR 21 #define R_IMF_IMTYPE_TIFF 22 #define R_IMF_IMTYPE_OPENEXR 23 #define R_IMF_IMTYPE_FFMPEG 24 -/* #define R_IMF_IMTYPE_FRAMESERVER 25 */ /* frame server is nomore */ +/* #define R_IMF_IMTYPE_FRAMESERVER 25 */ /* DEPRECATED */ #define R_IMF_IMTYPE_CINEON 26 #define R_IMF_IMTYPE_DPX 27 #define R_IMF_IMTYPE_MULTILAYER 28 @@ -481,12 +481,12 @@ typedef struct ImageFormatData { #define R_IMF_IMTYPE_INVALID 255 -/* ImageFormatData.flag */ +/** #ImageFormatData.flag */ #define R_IMF_FLAG_ZBUF (1 << 0) /* was R_OPENEXR_ZBUF */ #define R_IMF_FLAG_PREVIEW_JPG (1 << 1) /* was R_PREVIEW_JPG */ -/* return values from BKE_imtype_valid_depths, note this is depts per channel */ -/* ImageFormatData.depth */ +/* Return values from #BKE_imtype_valid_depths, note this is depths per channel. */ +/** #ImageFormatData.depth */ typedef enum eImageFormatDepth { /* 1bits (unused) */ R_IMF_CHAN_DEPTH_1 = (1 << 0), @@ -504,12 +504,12 @@ typedef enum eImageFormatDepth { R_IMF_CHAN_DEPTH_32 = (1 << 6), } eImageFormatDepth; -/* ImageFormatData.planes */ +/** #ImageFormatData.planes */ #define R_IMF_PLANES_RGB 24 #define R_IMF_PLANES_RGBA 32 #define R_IMF_PLANES_BW 8 -/* ImageFormatData.exr_codec */ +/** #ImageFormatData.exr_codec */ #define R_IMF_EXR_CODEC_NONE 0 #define R_IMF_EXR_CODEC_PXR24 1 #define R_IMF_EXR_CODEC_ZIP 2 @@ -522,19 +522,19 @@ typedef enum eImageFormatDepth { #define R_IMF_EXR_CODEC_DWAB 9 #define R_IMF_EXR_CODEC_MAX 10 -/* ImageFormatData.jp2_flag */ +/** #ImageFormatData.jp2_flag */ #define R_IMF_JP2_FLAG_YCC (1 << 0) /* when disabled use RGB */ /* was R_JPEG2K_YCC */ #define R_IMF_JP2_FLAG_CINE_PRESET (1 << 1) /* was R_JPEG2K_CINE_PRESET */ #define R_IMF_JP2_FLAG_CINE_48 (1 << 2) /* was R_JPEG2K_CINE_48FPS */ -/* ImageFormatData.jp2_codec */ +/** #ImageFormatData.jp2_codec */ #define R_IMF_JP2_CODEC_JP2 0 #define R_IMF_JP2_CODEC_J2K 1 -/* ImageFormatData.cineon_flag */ +/** #ImageFormatData.cineon_flag */ #define R_IMF_CINEON_FLAG_LOG (1 << 0) /* was R_CINEON_LOG */ -/* ImageFormatData.tiff_codec */ +/** #ImageFormatData.tiff_codec */ enum { R_IMF_TIFF_CODEC_DEFLATE = 0, R_IMF_TIFF_CODEC_LZW = 1, @@ -565,7 +565,7 @@ typedef struct BakeData { struct Object *cage_object; } BakeData; -/* BakeData.normal_swizzle (char) */ +/** #BakeData.normal_swizzle (char) */ typedef enum eBakeNormalSwizzle { R_BAKE_POSX = 0, R_BAKE_POSY = 1, @@ -575,19 +575,19 @@ typedef enum eBakeNormalSwizzle { R_BAKE_NEGZ = 5, } eBakeNormalSwizzle; -/* BakeData.target (char) */ +/** #BakeData.target (char) */ typedef enum eBakeTarget { R_BAKE_TARGET_IMAGE_TEXTURES = 0, R_BAKE_TARGET_VERTEX_COLORS = 1, } eBakeTarget; -/* BakeData.save_mode (char) */ +/** #BakeData.save_mode (char) */ typedef enum eBakeSaveMode { R_BAKE_SAVE_INTERNAL = 0, R_BAKE_SAVE_EXTERNAL = 1, } eBakeSaveMode; -/* BakeData.pass_filter */ +/** #BakeData.pass_filter */ typedef enum eBakePassFilter { R_BAKE_PASS_FILTER_NONE = 0, R_BAKE_PASS_FILTER_AO = (1 << 0), @@ -794,7 +794,7 @@ typedef enum eHairType { } eHairType; /* *************************************************************** */ -/* Render Conversion/Simplfication Settings */ +/* Render Conversion/Simplification Settings */ /* control render convert and shading engine */ typedef struct RenderProfile { @@ -812,11 +812,11 @@ typedef struct RenderProfile { } RenderProfile; /* UV Paint */ -/* ToolSettings.uv_sculpt_settings */ +/** #ToolSettings.uv_sculpt_settings */ #define UV_SCULPT_LOCK_BORDERS 1 #define UV_SCULPT_ALL_ISLANDS 2 -/* ToolSettings.uv_relax_method */ +/** #ToolSettings.uv_relax_method */ #define UV_SCULPT_TOOL_RELAX_LAPLACIAN 1 #define UV_SCULPT_TOOL_RELAX_HC 2 @@ -1010,7 +1010,7 @@ typedef struct GpPaint { int mode; } GpPaint; -/* GpPaint.flag */ +/** #GpPaint.flag */ enum { GPPAINT_FLAG_USE_MATERIAL = 0, GPPAINT_FLAG_USE_VERTEXCOLOR = 1, @@ -1049,7 +1049,7 @@ typedef struct VPaint { int radial_symm[3]; } VPaint; -/* VPaint.flag */ +/** #VPaint.flag */ enum { /* weight paint only */ VP_FLAG_VGROUP_RESTRICT = (1 << 7), @@ -1100,59 +1100,43 @@ typedef struct GP_Sculpt_Settings { struct GP_Sculpt_Guide guide; } GP_Sculpt_Settings; -/* GP_Sculpt_Settings.flag */ +/** #GP_Sculpt_Settings.flag */ typedef enum eGP_Sculpt_SettingsFlag { - /* enable falloff for multiframe editing */ + /** Enable falloff for multi-frame editing. */ GP_SCULPT_SETT_FLAG_FRAME_FALLOFF = (1 << 0), - /* apply primitive curve */ + /** Apply primitive curve. */ GP_SCULPT_SETT_FLAG_PRIMITIVE_CURVE = (1 << 1), - /* Scale thickness. */ + /** Scale thickness. */ GP_SCULPT_SETT_FLAG_SCALE_THICKNESS = (1 << 3), } eGP_Sculpt_SettingsFlag; -/* GP_Sculpt_Settings.gpencil_selectmode_sculpt */ +/** #GP_Sculpt_Settings.gpencil_selectmode_sculpt */ typedef enum eGP_Sculpt_SelectMaskFlag { - /* only affect selected points */ + /** Only affect selected points. */ GP_SCULPT_MASK_SELECTMODE_POINT = (1 << 0), - /* only affect selected strokes */ + /** Only affect selected strokes. */ GP_SCULPT_MASK_SELECTMODE_STROKE = (1 << 1), - /* only affect selected segmenst */ + /** only affect selected segments. */ GP_SCULPT_MASK_SELECTMODE_SEGMENT = (1 << 2), } eGP_Sculpt_SelectMaskFlag; -/* GP_Sculpt_Settings.gpencil_selectmode_vertex */ +/** #GP_Sculpt_Settings.gpencil_selectmode_vertex */ typedef enum eGP_vertex_SelectMaskFlag { - /* only affect selected points */ + /** Only affect selected points. */ GP_VERTEX_MASK_SELECTMODE_POINT = (1 << 0), - /* only affect selected strokes */ + /** Only affect selected strokes. */ GP_VERTEX_MASK_SELECTMODE_STROKE = (1 << 1), - /* only affect selected segmenst */ + /** Only affect selected segments. */ GP_VERTEX_MASK_SELECTMODE_SEGMENT = (1 << 2), } eGP_Vertex_SelectMaskFlag; /* Settings for GP Interpolation Operators */ typedef struct GP_Interpolate_Settings { - /** #eGP_Interpolate_SettingsFlag. */ - short flag; - - /** #eGP_Interpolate_Type - Interpolation Mode. */ - char type; - /** #eBezTriple_Easing - Easing mode (if easing equation used). */ - char easing; - - /** BEZT_IPO_BACK. */ - float back; - /** BEZT_IPO_ELASTIC. */ - float amplitude, period; - /* Step between sequence interpolated frames. */ - int step; - char _pad[4]; - /** Custom interpolation curve (for use with GP_IPO_CURVEMAP). */ struct CurveMapping *custom_ipo; } GP_Interpolate_Settings; -/* GP_Interpolate_Settings.flag */ +/** #GP_Interpolate_Settings.flag */ typedef enum eGP_Interpolate_SettingsFlag { /* apply interpolation to all layers */ GP_TOOLFLAG_INTERPOLATE_ALL_LAYERS = (1 << 0), @@ -1160,7 +1144,7 @@ typedef enum eGP_Interpolate_SettingsFlag { GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED = (1 << 1), } eGP_Interpolate_SettingsFlag; -/* GP_Interpolate_Settings.type */ +/** #GP_Interpolate_Settings.type */ typedef enum eGP_Interpolate_Type { /* Traditional Linear Interpolation */ GP_IPO_LINEAR = 0, @@ -1295,7 +1279,7 @@ typedef struct CurvePaintSettings { float corner_angle; } CurvePaintSettings; -/* CurvePaintSettings.flag */ +/** #CurvePaintSettings.flag */ enum { CURVE_PAINT_FLAG_CORNERS_DETECT = (1 << 0), CURVE_PAINT_FLAG_PRESSURE_RADIUS = (1 << 1), @@ -1303,19 +1287,19 @@ enum { CURVE_PAINT_FLAG_DEPTH_STROKE_OFFSET_ABS = (1 << 3), }; -/* CurvePaintSettings.fit_method */ +/** #CurvePaintSettings.fit_method */ enum { CURVE_PAINT_FIT_METHOD_REFIT = 0, CURVE_PAINT_FIT_METHOD_SPLIT = 1, }; -/* CurvePaintSettings.depth_mode */ +/** #CurvePaintSettings.depth_mode */ enum { CURVE_PAINT_PROJECT_CURSOR = 0, CURVE_PAINT_PROJECT_SURFACE = 1, }; -/* CurvePaintSettings.surface_plane */ +/** #CurvePaintSettings.surface_plane */ enum { CURVE_PAINT_SURFACE_PLANE_NORMAL_VIEW = 0, CURVE_PAINT_SURFACE_PLANE_NORMAL_SURFACE = 1, @@ -1361,7 +1345,7 @@ typedef enum eSeqImageFitMethod { /* *************************************************************** */ /* Tool Settings */ -/* CurvePaintSettings.surface_plane */ +/** #CurvePaintSettings.surface_plane */ enum { AUTO_MERGE = 1 << 0, AUTO_MERGE_AND_SPLIT = 1 << 1, @@ -1642,8 +1626,11 @@ typedef struct SceneEEVEE { float gtao_factor; float gtao_quality; + float bokeh_overblur; float bokeh_max_size; float bokeh_threshold; + float bokeh_neighbor_max; + float bokeh_denoise_fac; float bloom_color[3]; float bloom_threshold; @@ -1658,7 +1645,6 @@ typedef struct SceneEEVEE { int motion_blur_position; float motion_blur_shutter; float motion_blur_depth_scale; - char _pad0[4]; int shadow_method DNA_DEPRECATED; int shadow_cube_size; @@ -1936,7 +1922,7 @@ enum { }; /* bake_mode: same as RE_BAKE_xxx defines */ -/* RenderData.bake_flag */ +/** #RenderData.bake_flag */ #define R_BAKE_CLEAR (1 << 0) /* #define R_BAKE_OSA (1 << 1) */ /* deprecated */ #define R_BAKE_TO_ACTIVE (1 << 2) @@ -1949,19 +1935,19 @@ enum { #define R_BAKE_SPLIT_MAT (1 << 9) #define R_BAKE_AUTO_NAME (1 << 10) -/* RenderData.bake_normal_space */ +/** #RenderData.bake_normal_space */ #define R_BAKE_SPACE_CAMERA 0 #define R_BAKE_SPACE_WORLD 1 #define R_BAKE_SPACE_OBJECT 2 #define R_BAKE_SPACE_TANGENT 3 -/* RenderData.line_thickness_mode */ +/** #RenderData.line_thickness_mode */ #define R_LINE_THICKNESS_ABSOLUTE 1 #define R_LINE_THICKNESS_RELATIVE 2 /* sequencer seq_prev_type seq_rend_type */ -/* RenderData.engine (scene.c) */ +/** #RenderData.engine (scene.c) */ extern const char *RE_engine_id_BLENDER_EEVEE; extern const char *RE_engine_id_BLENDER_WORKBENCH; extern const char *RE_engine_id_CYCLES; @@ -2023,25 +2009,25 @@ extern const char *RE_engine_id_CYCLES; /* Base.flag is in DNA_object_types.h */ -/* ToolSettings.transform_flag */ +/** #ToolSettings.transform_flag */ enum { SCE_XFORM_AXIS_ALIGN = (1 << 0), SCE_XFORM_DATA_ORIGIN = (1 << 1), SCE_XFORM_SKIP_CHILDREN = (1 << 2), }; -/* ToolSettings.object_flag */ +/** #ToolSettings.object_flag */ enum { SCE_OBJECT_MODE_LOCK = (1 << 0), }; -/* ToolSettings.workspace_tool_flag */ +/** #ToolSettings.workspace_tool_flag */ enum { SCE_WORKSPACE_TOOL_FALLBACK = 0, SCE_WORKSPACE_TOOL_DEFAULT = 1, }; -/* ToolSettings.snap_flag */ +/** #ToolSettings.snap_flag */ #define SCE_SNAP (1 << 0) #define SCE_SNAP_ROTATE (1 << 1) #define SCE_SNAP_PEEL_OBJECT (1 << 2) @@ -2050,13 +2036,13 @@ enum { #define SCE_SNAP_ABS_GRID (1 << 5) #define SCE_SNAP_BACKFACE_CULLING (1 << 6) -/* ToolSettings.snap_target */ +/** #ToolSettings.snap_target */ #define SCE_SNAP_TARGET_CLOSEST 0 #define SCE_SNAP_TARGET_CENTER 1 #define SCE_SNAP_TARGET_MEDIAN 2 #define SCE_SNAP_TARGET_ACTIVE 3 -/* ToolSettings.snap_mode */ +/** #ToolSettings.snap_mode */ #define SCE_SNAP_MODE_VERTEX (1 << 0) #define SCE_SNAP_MODE_EDGE (1 << 1) #define SCE_SNAP_MODE_FACE (1 << 2) @@ -2065,11 +2051,11 @@ enum { #define SCE_SNAP_MODE_EDGE_MIDPOINT (1 << 5) #define SCE_SNAP_MODE_EDGE_PERPENDICULAR (1 << 6) -/* ToolSettings.snap_node_mode */ +/** #ToolSettings.snap_node_mode */ #define SCE_SNAP_MODE_NODE_X (1 << 5) #define SCE_SNAP_MODE_NODE_Y (1 << 6) -/* ToolSettings.snap_mode and ToolSettings.snap_node_mode */ +/** #ToolSettings.snap_mode and #ToolSettings.snap_node_mode */ #define SCE_SNAP_MODE_GRID (1 << 7) /** #ToolSettings.snap_transform_mode_flag */ @@ -2079,24 +2065,24 @@ enum { SCE_SNAP_TRANSFORM_MODE_SCALE = (1 << 2), }; -/* ToolSettings.selectmode */ +/** #ToolSettings.selectmode */ #define SCE_SELECT_VERTEX (1 << 0) /* for mesh */ #define SCE_SELECT_EDGE (1 << 1) #define SCE_SELECT_FACE (1 << 2) -/* MeshStatVis.type */ +/** #MeshStatVis.type */ #define SCE_STATVIS_OVERHANG 0 #define SCE_STATVIS_THICKNESS 1 #define SCE_STATVIS_INTERSECT 2 #define SCE_STATVIS_DISTORT 3 #define SCE_STATVIS_SHARP 4 -/* ParticleEditSettings.selectmode for particles */ +/** #ParticleEditSettings.selectmode for particles */ #define SCE_SELECT_PATH (1 << 0) #define SCE_SELECT_POINT (1 << 1) #define SCE_SELECT_END (1 << 2) -/* ToolSettings.prop_mode (proportional falloff) */ +/** #ToolSettings.prop_mode (proportional falloff) */ #define PROP_SMOOTH 0 #define PROP_SPHERE 1 #define PROP_ROOT 2 @@ -2114,7 +2100,7 @@ enum { PROP_EDIT_PROJECTED = (1 << 2), }; -/* ToolSettings.weightuser */ +/** #ToolSettings.weightuser */ enum { OB_DRAW_GROUPUSER_NONE = 0, OB_DRAW_GROUPUSER_ACTIVE = 1, @@ -2122,7 +2108,7 @@ enum { }; /* object_vgroup.c */ -/* ToolSettings.vgroupsubset */ +/** #ToolSettings.vgroupsubset */ typedef enum eVGroupSelect { WT_VGROUP_ALL = 0, WT_VGROUP_ACTIVE = 1, @@ -2135,7 +2121,7 @@ typedef enum eVGroupSelect { ((1 << WT_VGROUP_ACTIVE) | (1 << WT_VGROUP_BONE_SELECT) | (1 << WT_VGROUP_BONE_DEFORM) | \ (1 << WT_VGROUP_BONE_DEFORM_OFF) | (1 << WT_VGROUP_ALL)) -/* Scene.flag */ +/** #Scene.flag */ #define SCE_DS_SELECTED (1 << 0) #define SCE_DS_COLLAPSED (1 << 1) #define SCE_NLA_EDIT_ON (1 << 2) @@ -2149,13 +2135,13 @@ typedef enum eVGroupSelect { #define F_SCENE 1 #define F_DUPLI 3 -/* AudioData.flag */ +/** #AudioData.flag */ #define AUDIO_MUTE (1 << 0) #define AUDIO_SYNC (1 << 1) #define AUDIO_SCRUB (1 << 2) #define AUDIO_VOLUME_ANIMATED (1 << 3) -/* FFMpegCodecData.flags */ +/** #FFMpegCodecData.flags */ enum { #ifdef DNA_DEPRECATED_ALLOW FFMPEG_MULTIPLEX_AUDIO = (1 << 0), /* deprecated, you can choose none as audiocodec now */ @@ -2165,7 +2151,7 @@ enum { FFMPEG_USE_MAX_B_FRAMES = (1 << 3), }; -/* Paint.flags */ +/** #Paint.flags */ typedef enum ePaintFlags { PAINT_SHOW_BRUSH = (1 << 0), PAINT_FAST_NAVIGATE = (1 << 1), @@ -2174,8 +2160,10 @@ typedef enum ePaintFlags { PAINT_SCULPT_DELAY_UPDATES = (1 << 4), } ePaintFlags; -/* Paint.symmetry_flags - * (for now just a duplicate of sculpt symmetry flags) */ +/** + * #Paint.symmetry_flags + * (for now just a duplicate of sculpt symmetry flags). + */ typedef enum ePaintSymmetryFlags { PAINT_SYMM_X = (1 << 0), PAINT_SYMM_Y = (1 << 1), @@ -2188,8 +2176,10 @@ typedef enum ePaintSymmetryFlags { #define PAINT_SYMM_AXIS_ALL (PAINT_SYMM_X | PAINT_SYMM_Y | PAINT_SYMM_Z) -/* Sculpt.flags */ -/* These can eventually be moved to paint flags? */ +/** + * #Sculpt.flags + * These can eventually be moved to paint flags? + */ typedef enum eSculptFlags { SCULPT_FLAG_UNUSED_0 = (1 << 0), /* cleared */ SCULPT_FLAG_UNUSED_1 = (1 << 1), /* cleared */ @@ -2227,25 +2217,25 @@ typedef enum eSculptFlags { SCULPT_DYNTOPO_FLAT_VCOL_SHADING = (1<<18) } eSculptFlags; -/* ImagePaintSettings.mode */ +/** #ImagePaintSettings.mode */ typedef enum eImagePaintMode { IMAGEPAINT_MODE_MATERIAL = 0, /* detect texture paint slots from the material */ IMAGEPAINT_MODE_IMAGE = 1, /* select texture paint image directly */ } eImagePaintMode; -/* ImagePaintSettings.interp */ +/** #ImagePaintSettings.interp */ enum { IMAGEPAINT_INTERP_LINEAR = 0, IMAGEPAINT_INTERP_CLOSEST = 1, }; -/* ImagePaintSettings.flag */ +/** #ImagePaintSettings.flag */ #define IMAGEPAINT_DRAWING (1 << 0) // #define IMAGEPAINT_DRAW_TOOL (1 << 1) /* deprecated */ // #define IMAGEPAINT_DRAW_TOOL_DRAWING (1 << 2) /* deprecated */ /* projection painting only */ -/* ImagePaintSettings.flag */ +/** #ImagePaintSettings.flag */ #define IMAGEPAINT_PROJECT_XRAY (1 << 4) #define IMAGEPAINT_PROJECT_BACKFACE (1 << 5) #define IMAGEPAINT_PROJECT_FLAT (1 << 6) @@ -2253,13 +2243,13 @@ enum { #define IMAGEPAINT_PROJECT_LAYER_STENCIL (1 << 8) #define IMAGEPAINT_PROJECT_LAYER_STENCIL_INV (1 << 9) -/* ImagePaintSettings.missing_data */ +/** #ImagePaintSettings.missing_data */ #define IMAGEPAINT_MISSING_UVS (1 << 0) #define IMAGEPAINT_MISSING_MATERIAL (1 << 1) #define IMAGEPAINT_MISSING_TEX (1 << 2) #define IMAGEPAINT_MISSING_STENCIL (1 << 3) -/* ToolSettings.uvcalc_flag */ +/** #ToolSettings.uvcalc_flag */ #define UVCALC_FILLHOLES (1 << 0) /** would call this UVCALC_ASPECT_CORRECT, except it should be default with old file */ #define UVCALC_NO_ASPECT_CORRECT (1 << 1) @@ -2272,17 +2262,17 @@ enum { /** Keep equal values merged while correcting custom-data. */ #define UVCALC_TRANSFORM_CORRECT_KEEP_CONNECTED (1 << 5) -/* ToolSettings.uv_flag */ +/** #ToolSettings.uv_flag */ #define UV_SYNC_SELECTION 1 #define UV_SHOW_SAME_IMAGE 2 -/* ToolSettings.uv_selectmode */ +/** #ToolSettings.uv_selectmode */ #define UV_SELECT_VERTEX 1 #define UV_SELECT_EDGE 2 #define UV_SELECT_FACE 4 #define UV_SELECT_ISLAND 8 -/* ToolSettings.gpencil_flags */ +/** #ToolSettings.gpencil_flags */ typedef enum eGPencil_Flags { /* When creating new frames, the last frame gets used as the basis for the new one */ GP_TOOL_FLAG_RETAIN_LAST = (1 << 1), @@ -2296,7 +2286,7 @@ typedef enum eGPencil_Flags { GP_TOOL_FLAG_AUTOMERGE_STROKE = (1 << 5), } eGPencil_Flags; -/* scene->r.simplify_gpencil */ +/** #Scene.r.simplify_gpencil */ typedef enum eGPencil_SimplifyFlags { /* Simplify */ SIMPLIFY_GPENCIL_ENABLE = (1 << 0), @@ -2314,7 +2304,7 @@ typedef enum eGPencil_SimplifyFlags { SIMPLIFY_GPENCIL_AA = (1 << 8), } eGPencil_SimplifyFlags; -/* ToolSettings.gpencil_*_align - Stroke Placement mode flags */ +/** `ToolSettings.gpencil_*_align` - Stroke Placement mode flags */ typedef enum eGPencil_Placement_Flags { /* New strokes are added in viewport/data space (i.e. not screen space) */ GP_PROJECT_VIEWSPACE = (1 << 0), @@ -2332,14 +2322,14 @@ typedef enum eGPencil_Placement_Flags { GP_PROJECT_DEPTH_STROKE_FIRST = (1 << 6), } eGPencil_Placement_Flags; -/* ToolSettings.gpencil_selectmode */ +/** #ToolSettings.gpencil_selectmode */ typedef enum eGPencil_Selectmode_types { GP_SELECTMODE_POINT = 0, GP_SELECTMODE_STROKE = 1, GP_SELECTMODE_SEGMENT = 2, } eGPencil_Selectmode_types; -/* ToolSettings.gpencil_guide_types */ +/** #ToolSettings.gpencil_guide_types */ typedef enum eGPencil_GuideTypes { GP_GUIDE_CIRCULAR = 0, GP_GUIDE_RADIAL = 1, @@ -2348,14 +2338,14 @@ typedef enum eGPencil_GuideTypes { GP_GUIDE_ISO = 4, } eGPencil_GuideTypes; -/* ToolSettings.gpencil_guide_references */ +/** #ToolSettings.gpencil_guide_references */ typedef enum eGPencil_Guide_Reference { GP_GUIDE_REF_CURSOR = 0, GP_GUIDE_REF_CUSTOM = 1, GP_GUIDE_REF_OBJECT = 2, } eGPencil_Guide_Reference; -/* ToolSettings.particle flag */ +/** #ToolSettings.particle flag */ #define PE_KEEP_LENGTHS (1 << 0) #define PE_LOCK_FIRST (1 << 1) #define PE_DEFLECT_EMITTER (1 << 2) @@ -2365,7 +2355,7 @@ typedef enum eGPencil_Guide_Reference { #define PE_FADE_TIME (1 << 7) #define PE_AUTO_VELOCITY (1 << 8) -/* ParticleEditSettings.brushtype */ +/** #ParticleEditSettings.brushtype */ #define PE_BRUSH_NONE -1 #define PE_BRUSH_COMB 0 #define PE_BRUSH_CUT 1 @@ -2375,15 +2365,15 @@ typedef enum eGPencil_Guide_Reference { #define PE_BRUSH_SMOOTH 5 #define PE_BRUSH_WEIGHT 6 -/* ParticleBrushData.flag */ +/** #ParticleBrushData.flag */ #define PE_BRUSH_DATA_PUFF_VOLUME 1 -/* ParticleBrushData.edittype */ +/** #ParticleBrushData.edittype */ #define PE_TYPE_PARTICLES 0 #define PE_TYPE_SOFTBODY 1 #define PE_TYPE_CLOTH 2 -/* PhysicsSettings.flag */ +/** #PhysicsSettings.flag */ #define PHYS_GLOBAL_GRAVITY 1 /* UnitSettings */ @@ -2397,7 +2387,7 @@ typedef enum eGPencil_Guide_Reference { #define USER_UNIT_OPT_SPLIT 1 #define USER_UNIT_ROT_RADIANS 2 -/* SceneEEVEE->flag */ +/** #SceneEEVEE.flag */ enum { // SCE_EEVEE_VOLUMETRIC_ENABLED = (1 << 0), /* Unused */ SCE_EEVEE_VOLUMETRIC_LIGHTS = (1 << 1), @@ -2421,23 +2411,25 @@ enum { SCE_EEVEE_GI_AUTOBAKE = (1 << 19), SCE_EEVEE_SHADOW_SOFT = (1 << 20), SCE_EEVEE_OVERSCAN = (1 << 21), + SCE_EEVEE_DOF_HQ_SLIGHT_FOCUS = (1 << 22), + SCE_EEVEE_DOF_JITTER = (1 << 23), }; -/* SceneEEVEE->shadow_method */ +/** #SceneEEVEE.shadow_method */ enum { SHADOW_ESM = 1, /* SHADOW_VSM = 2, */ /* UNUSED */ /* SHADOW_METHOD_MAX = 3, */ /* UNUSED */ }; -/* SceneEEVEE->motion_blur_position */ +/** #SceneEEVEE.motion_blur_position */ enum { SCE_EEVEE_MB_CENTER = 0, SCE_EEVEE_MB_START = 1, SCE_EEVEE_MB_END = 2, }; -/* SceneDisplay->render_aa, SceneDisplay->viewport_aa */ +/** #SceneDisplay->render_aa and #SceneDisplay->viewport_aa */ enum { SCE_DISPLAY_AA_OFF = 0, SCE_DISPLAY_AA_FXAA = 1, diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h index 3a99a6f4ee8..8d3ac3a7814 100644 --- a/source/blender/makesdna/DNA_screen_types.h +++ b/source/blender/makesdna/DNA_screen_types.h @@ -285,7 +285,7 @@ typedef struct uiList { /* some list UI data need to be saved in file */ /** Defined as UI_MAX_NAME_STR. */ char list_id[64]; - /** How items are layedout in the list. */ + /** How items are laid out in the list. */ int layout_type; int flag; @@ -319,7 +319,7 @@ typedef struct TransformOrientation { typedef struct uiPreview { struct uiPreview *next, *prev; - /** Defined as UI_MAX_NAME_STR. */ + /** Defined as #UI_MAX_NAME_STR. */ char preview_id[64]; short height; char _pad1[6]; @@ -360,7 +360,7 @@ typedef struct ScrArea_Runtime { typedef struct ScrArea { struct ScrArea *next, *prev; - /** Ordered (bl, tl, tr, br). */ + /** Ordered (bottom-left, top-left, top-right, bottom-right). */ ScrVert *v1, *v2, *v3, *v4; /** If area==full, this is the parent. */ bScreen *full; diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index 51f8b58da62..dc1775b09c6 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -241,8 +241,8 @@ typedef enum eSpaceButtons_Flag { /* SpaceProperties.outliner_sync */ typedef enum eSpaceButtons_OutlinerSync { PROPERTIES_SYNC_AUTO = 0, - PROPERTIES_SYNC_OFF = 1, - PROPERTIES_SYNC_ON = 2, + PROPERTIES_SYNC_NEVER = 1, + PROPERTIES_SYNC_ALWAYS = 2, } eSpaceButtons_OutlinerSync; /** \} */ @@ -1545,7 +1545,7 @@ typedef struct SpaceNode { */ ListBase treepath; - /* The tree farthest down in the group heirarchy. */ + /* The tree farthest down in the group hierarchy. */ struct bNodeTree *edittree; struct bNodeTree *nodetree; diff --git a/source/blender/makesdna/DNA_tracking_types.h b/source/blender/makesdna/DNA_tracking_types.h index f08aee317a3..0e673aaec66 100644 --- a/source/blender/makesdna/DNA_tracking_types.h +++ b/source/blender/makesdna/DNA_tracking_types.h @@ -328,7 +328,7 @@ typedef struct MovieTrackingStabilization { float target_pos[2]; /** Expected target rotation of frame after raw stabilization, will be compensated. */ float target_rot; - /** Zoom factor known to be present on original footage. Also used for autoscale. */ + /** Zoom factor known to be present on original footage. Also used for auto-scale. */ float scale; /** Influence on location, scale and rotation. */ diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 0e31ec3494e..d304641e112 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -673,6 +673,21 @@ typedef struct UserDef { /** 768 = FILE_MAXDIR. */ char render_cachedir[768]; char textudir[768]; + /** + * Optional user location for scripts. + * + * This supports the same layout as Blender's scripts directory `release/scripts`. + * + * \note Unlike most paths, changing this is not fully supported at run-time, + * requiring a restart to properly take effect. Supporting this would cause complications as + * the script path can contain `startup`, `addons` & `modules` etc. properly unwinding the + * Python environment to the state it _would_ have been in gets complicated. + * + * Although this is partially supported as the `sys.path` is refreshed when loading preferences. + * This is done to support #PREFERENCES_OT_copy_prev which is available to the user when they + * launch with a new version of Blender. In this case setting the script path on top of + * factory settings will work without problems. + */ char pythondir[768]; char sounddir[768]; char i18ndir[768]; @@ -1207,7 +1222,7 @@ typedef enum eDupli_ID_Flags { USER_DUP_OBDATA = (~0) & ((1 << 24) - 1), - /* Those are not exposed as user preferences, only used internaly. */ + /* Those are not exposed as user preferences, only used internally. */ USER_DUP_OBJECT = (1 << 24), /* USER_DUP_COLLECTION = (1 << 25), */ /* UNUSED, keep because we may implement. */ diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h index a3aaf3ee937..1635aa7646b 100644 --- a/source/blender/makesdna/DNA_windowmanager_types.h +++ b/source/blender/makesdna/DNA_windowmanager_types.h @@ -472,7 +472,7 @@ typedef struct wmKeyConfig { /** Unique name. */ char idname[64]; - /** Idname of configuration this is derives from, "" if none. */ + /** ID-name of configuration this is derives from, "" if none. */ char basename[64]; ListBase keymaps; diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index 35b174f0da8..eecac8ca19e 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -91,6 +91,7 @@ extern StructRNA RNA_BoidSettings; extern StructRNA RNA_BoidState; extern StructRNA RNA_Bone; extern StructRNA RNA_BoneGroup; +extern StructRNA RNA_BoolAttribute; extern StructRNA RNA_BoolProperty; extern StructRNA RNA_BooleanModifier; extern StructRNA RNA_Brush; @@ -264,6 +265,7 @@ extern StructRNA RNA_FloatAttributeValue; extern StructRNA RNA_FloatColorAttribute; extern StructRNA RNA_FloatColorAttributeValue; extern StructRNA RNA_FloatProperty; +extern StructRNA RNA_Float2Attribute; extern StructRNA RNA_FloorConstraint; extern StructRNA RNA_FluidDomainSettings; extern StructRNA RNA_FluidEffectorSettings; diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index d8c91cb2923..c5dd516d16e 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -5826,26 +5826,29 @@ ID *RNA_find_real_ID_and_path(Main *bmain, ID *id, const char **r_path) *r_path = ""; } - if ((id != NULL) && (id->flag & LIB_EMBEDDED_DATA)) { - switch (GS(id->name)) { - case ID_NT: - if (r_path) { - *r_path = "node_tree"; - } - return BKE_node_tree_find_owner_ID(bmain, (bNodeTree *)id); - case ID_GR: - if (r_path) { - *r_path = "collection"; - } - return (ID *)BKE_collection_master_scene_search(bmain, (struct Collection *)id); - - default: - return NULL; - } - } - else { + if ((id == NULL) || (id->flag & LIB_EMBEDDED_DATA) == 0) { return id; } + + const IDTypeInfo *id_type = BKE_idtype_get_info_from_id(id); + if (r_path) { + switch (GS(id->name)) { + case ID_NT: + *r_path = "node_tree"; + break; + case ID_GR: + *r_path = "collection"; + break; + default: + BLI_assert(!"Missing handling of embedded id type."); + } + } + + if (id_type->owner_get == NULL) { + BLI_assert(!"Missing handling of embedded id type."); + return id; + } + return id_type->owner_get(bmain, id); } static char *rna_prepend_real_ID_path(Main *bmain, ID *id, char *path, ID **r_real_id) diff --git a/source/blender/makesrna/intern/rna_attribute.c b/source/blender/makesrna/intern/rna_attribute.c index 7cd6e375a82..b99b6891d3d 100644 --- a/source/blender/makesrna/intern/rna_attribute.c +++ b/source/blender/makesrna/intern/rna_attribute.c @@ -45,6 +45,7 @@ const EnumPropertyItem rna_enum_attribute_type_items[] = { {CD_MLOOPCOL, "BYTE_COLOR", 0, "Byte Color", "RGBA color with 8-bit precision"}, {CD_PROP_STRING, "STRING", 0, "String", "Text string"}, {CD_PROP_BOOL, "BOOLEAN", 0, "Boolean", "True or false"}, + {CD_PROP_FLOAT2, "FLOAT2", 0, "2D Vector", "2D vector with floating-point values"}, {0, NULL, 0, NULL, NULL}, }; @@ -79,6 +80,36 @@ static char *rna_Attribute_path(PointerRNA *ptr) return BLI_sprintfN("attributes['%s']", layer->name); } +static StructRNA *srna_by_custom_data_layer_type(const CustomDataType type) +{ + switch (type) { + case CD_PROP_FLOAT: + return &RNA_FloatAttribute; + case CD_PROP_INT32: + return &RNA_IntAttribute; + case CD_PROP_FLOAT3: + return &RNA_FloatVectorAttribute; + case CD_PROP_COLOR: + return &RNA_FloatColorAttribute; + case CD_MLOOPCOL: + return &RNA_ByteColorAttribute; + case CD_PROP_STRING: + return &RNA_StringAttribute; + case CD_PROP_BOOL: + return &RNA_BoolAttribute; + case CD_PROP_FLOAT2: + return &RNA_Float2Attribute; + default: + return NULL; + } +} + +static StructRNA *rna_Attribute_refine(PointerRNA *ptr) +{ + CustomDataLayer *layer = ptr->data; + return srna_by_custom_data_layer_type(layer->type); +} + static void rna_Attribute_name_set(PointerRNA *ptr, const char *value) { BKE_id_attribute_rename(ptr->owner_id, ptr->data, value, NULL); @@ -169,6 +200,12 @@ static void rna_Attribute_data_begin(CollectionPropertyIterator *iter, PointerRN case CD_PROP_STRING: struct_size = sizeof(MStringProperty); break; + case CD_PROP_BOOL: + struct_size = sizeof(MBoolProperty); + break; + case CD_PROP_FLOAT2: + struct_size = sizeof(float[2]); + break; default: struct_size = 0; length = 0; @@ -277,32 +314,11 @@ void rna_AttributeGroup_iterator_next(CollectionPropertyIterator *iter) PointerRNA rna_AttributeGroup_iterator_get(CollectionPropertyIterator *iter) { /* refine to the proper type */ - StructRNA *type; CustomDataLayer *layer = rna_iterator_array_get(iter); - - switch (layer->type) { - case CD_PROP_FLOAT: - type = &RNA_FloatAttribute; - break; - case CD_PROP_INT32: - type = &RNA_IntAttribute; - break; - case CD_PROP_FLOAT3: - type = &RNA_FloatVectorAttribute; - break; - case CD_PROP_COLOR: - type = &RNA_FloatColorAttribute; - break; - case CD_MLOOPCOL: - type = &RNA_ByteColorAttribute; - break; - case CD_PROP_STRING: - type = &RNA_StringAttribute; - break; - default: - return PointerRNA_NULL; + StructRNA *type = srna_by_custom_data_layer_type(layer->type); + if (type == NULL) { + return PointerRNA_NULL; } - return rna_pointer_inherit_refine(&iter->parent, type, layer); } @@ -555,6 +571,69 @@ static void rna_def_attribute_string(BlenderRNA *brna) RNA_def_property_update(prop, 0, "rna_Attribute_update_data"); } +static void rna_def_attribute_bool(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna = RNA_def_struct(brna, "BoolAttribute", "Attribute"); + RNA_def_struct_sdna(srna, "CustomDataLayer"); + RNA_def_struct_ui_text(srna, "Bool Attribute", "Bool geometry attribute"); + + prop = RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE); + RNA_def_property_struct_type(prop, "BoolAttributeValue"); + RNA_def_property_collection_funcs(prop, + "rna_Attribute_data_begin", + "rna_iterator_array_next", + "rna_iterator_array_end", + "rna_iterator_array_get", + "rna_Attribute_data_length", + NULL, + NULL, + NULL); + + srna = RNA_def_struct(brna, "BoolAttributeValue", NULL); + RNA_def_struct_sdna(srna, "MBoolProperty"); + RNA_def_struct_ui_text(srna, "Bool Attribute Value", "Bool value in geometry attribute"); + prop = RNA_def_property(srna, "value", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "b", 0x01); +} + +static void rna_def_attribute_float2(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + /* Float2 Attribute */ + srna = RNA_def_struct(brna, "Float2Attribute", "Attribute"); + RNA_def_struct_sdna(srna, "CustomDataLayer"); + RNA_def_struct_ui_text( + srna, "Float2 Attribute", "2D vector geometry attribute, with floating-point precision"); + + prop = RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE); + RNA_def_property_struct_type(prop, "Float2AttributeValue"); + RNA_def_property_collection_funcs(prop, + "rna_Attribute_data_begin", + "rna_iterator_array_next", + "rna_iterator_array_end", + "rna_iterator_array_get", + "rna_Attribute_data_length", + NULL, + NULL, + NULL); + + /* Float2 Attribute Value */ + srna = RNA_def_struct(brna, "Float2AttributeValue", NULL); + RNA_def_struct_sdna(srna, "vec2f"); + RNA_def_struct_ui_text(srna, "Float2 Attribute Value", "2D Vector value in geometry attribute"); + + prop = RNA_def_property(srna, "vector", PROP_FLOAT, PROP_DIRECTION); + RNA_def_property_ui_text(prop, "Vector", "2D vector"); + RNA_def_property_float_sdna(prop, NULL, "x"); + RNA_def_property_array(prop, 2); + RNA_def_property_update(prop, 0, "rna_Attribute_update_data"); +} + static void rna_def_attribute(BlenderRNA *brna) { PropertyRNA *prop; @@ -564,6 +643,7 @@ static void rna_def_attribute(BlenderRNA *brna) RNA_def_struct_sdna(srna, "CustomDataLayer"); RNA_def_struct_ui_text(srna, "Attribute", "Geometry attribute"); RNA_def_struct_path_func(srna, "rna_Attribute_path"); + RNA_def_struct_refine_func(srna, "rna_Attribute_refine"); prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Attribute_name_set"); @@ -592,6 +672,8 @@ static void rna_def_attribute(BlenderRNA *brna) rna_def_attribute_byte_color(brna); rna_def_attribute_int(brna); rna_def_attribute_string(brna); + rna_def_attribute_bool(brna); + rna_def_attribute_float2(brna); } /* Mesh/PointCloud/Hair.attributes */ diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c index bb040ace1bc..f662b6d2709 100644 --- a/source/blender/makesrna/intern/rna_brush.c +++ b/source/blender/makesrna/intern/rna_brush.c @@ -1474,7 +1474,7 @@ static void rna_def_gpencil_options(BlenderRNA *brna) /* fill factor size */ prop = RNA_def_property(srna, "fill_factor", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "fill_factor"); - RNA_def_property_range(prop, GPENCIL_MIN_FILL_FAC, 8.0f); + RNA_def_property_range(prop, GPENCIL_MIN_FILL_FAC, GPENCIL_MAX_FILL_FAC); RNA_def_property_ui_text( prop, "Precision", @@ -1616,6 +1616,15 @@ static void rna_def_gpencil_options(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Value", "Random factor to modify original value"); RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0); + /* Factor to extend stroke extremes in Fill tool. */ + prop = RNA_def_property(srna, "extend_stroke_factor", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "fill_extend_fac"); + RNA_def_property_range(prop, 0.0f, 10.0f); + RNA_def_property_float_default(prop, 0.0f); + RNA_def_property_ui_text( + prop, "Stroke Extension", "Strokes end extension for closing gaps, use zero to disable"); + RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0); + /* Flags */ prop = RNA_def_property(srna, "use_pressure", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_USE_PRESSURE); @@ -1835,6 +1844,12 @@ static void rna_def_gpencil_options(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Show Lines", "Show help lines for filling to see boundaries"); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + prop = RNA_def_property(srna, "show_fill_extend", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_FILL_SHOW_EXTENDLINES); + RNA_def_property_boolean_default(prop, true); + RNA_def_property_ui_text(prop, "Show Extend Lines", "Show help lines for stroke extension"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + prop = RNA_def_property(srna, "show_fill", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GP_BRUSH_FILL_HIDE); RNA_def_property_boolean_default(prop, true); @@ -1842,6 +1857,12 @@ static void rna_def_gpencil_options(BlenderRNA *brna) prop, "Show Fill", "Show transparent lines to use as boundary for filling"); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + prop = RNA_def_property(srna, "use_fill_limit", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_FILL_FIT_DISABLE); + RNA_def_property_boolean_default(prop, true); + RNA_def_property_ui_text(prop, "Limit to Viewport", "Fill only visible areas in viewport"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + prop = RNA_def_property(srna, "use_default_eraser", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_DEFAULT_ERASER); RNA_def_property_boolean_default(prop, true); diff --git a/source/blender/makesrna/intern/rna_color.c b/source/blender/makesrna/intern/rna_color.c index 39aeeb430c2..ea019c70445 100644 --- a/source/blender/makesrna/intern/rna_color.c +++ b/source/blender/makesrna/intern/rna_color.c @@ -185,7 +185,11 @@ static char *rna_ColorRamp_path(PointerRNA *ptr) char *node_path; for (node = ntree->nodes.first; node; node = node->next) { - if (ELEM(node->type, SH_NODE_VALTORGB, CMP_NODE_VALTORGB, TEX_NODE_VALTORGB)) { + if (ELEM(node->type, + SH_NODE_VALTORGB, + CMP_NODE_VALTORGB, + TEX_NODE_VALTORGB, + GEO_NODE_ATTRIBUTE_COLOR_RAMP)) { if (node->storage == ptr->data) { /* all node color ramp properties called 'color_ramp' * prepend path from ID to the node @@ -312,7 +316,11 @@ static void rna_ColorRamp_update(Main *bmain, Scene *UNUSED(scene), PointerRNA * bNode *node; for (node = ntree->nodes.first; node; node = node->next) { - if (ELEM(node->type, SH_NODE_VALTORGB, CMP_NODE_VALTORGB, TEX_NODE_VALTORGB)) { + if (ELEM(node->type, + SH_NODE_VALTORGB, + CMP_NODE_VALTORGB, + TEX_NODE_VALTORGB, + GEO_NODE_ATTRIBUTE_COLOR_RAMP)) { ED_node_tag_update_nodetree(bmain, ntree, node); } } diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c index a46026fd08f..50c18cf1dae 100644 --- a/source/blender/makesrna/intern/rna_curve.c +++ b/source/blender/makesrna/intern/rna_curve.c @@ -75,6 +75,10 @@ const EnumPropertyItem rna_enum_keyframe_handle_type_items[] = { {0, NULL, 0, NULL, NULL}, }; +/** + * \note this is a near exact duplicate of `gpencil_interpolation_type_items`, + * Changes here will likely apply there too. + */ const EnumPropertyItem rna_enum_beztriple_interpolation_mode_items[] = { /* interpolation */ {0, "", 0, N_("Interpolation"), "Standard transitions between keyframes"}, diff --git a/source/blender/makesrna/intern/rna_depsgraph.c b/source/blender/makesrna/intern/rna_depsgraph.c index aab81b2bd1f..36d39c5c201 100644 --- a/source/blender/makesrna/intern/rna_depsgraph.c +++ b/source/blender/makesrna/intern/rna_depsgraph.c @@ -570,7 +570,7 @@ static void rna_def_depsgraph_instance(BlenderRNA *brna) prop = RNA_def_property(srna, "random_id", PROP_INT, PROP_UNSIGNED); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE); RNA_def_property_ui_text( - prop, "Dupli random id", "Random id for this instance, typically for randomized shading"); + prop, "Instance Random ID", "Random id for this instance, typically for randomized shading"); RNA_def_property_int_funcs(prop, "rna_DepsgraphObjectInstance_random_id_get", NULL, NULL); prop = RNA_def_property(srna, "matrix_world", PROP_FLOAT, PROP_MATRIX); diff --git a/source/blender/makesrna/intern/rna_fcurve.c b/source/blender/makesrna/intern/rna_fcurve.c index b4e864eb4e1..1c7f6ef5cb3 100644 --- a/source/blender/makesrna/intern/rna_fcurve.c +++ b/source/blender/makesrna/intern/rna_fcurve.c @@ -112,7 +112,7 @@ const EnumPropertyItem rna_enum_beztriple_keyframe_type_items[] = { "EXTREME", ICON_KEYTYPE_EXTREME_VEC, "Extreme", - "An 'extreme' pose, or some other purpose as needed"}, + "An \"extreme\" pose, or some other purpose as needed"}, {BEZT_KEYTYPE_JITTER, "JITTER", ICON_KEYTYPE_JITTER_VEC, @@ -128,7 +128,7 @@ const EnumPropertyItem rna_enum_beztriple_interpolation_easing_items[] = { ICON_IPO_EASE_IN_OUT, "Automatic Easing", "Easing type is chosen automatically based on what the type of interpolation used " - "(e.g. 'Ease In' for transitional types, and 'Ease Out' for dynamic effects)"}, + "(e.g. Ease In for transitional types, and Ease Out for dynamic effects)"}, {BEZT_IPO_EASE_IN, "EASE_IN", @@ -1129,6 +1129,12 @@ static void rna_Keyframe_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *p rna_tag_animation_update(bmain, ptr->owner_id); } +static void rna_FModifier_show_expanded_set(PointerRNA *ptr, bool value) +{ + FModifier *fcm = ptr->data; + SET_FLAG_FROM_TEST(fcm->ui_expand_flag, value, UI_PANEL_DATA_EXPAND_ROOT); +} + #else static void rna_def_fmodifier_generator(BlenderRNA *brna) @@ -1187,6 +1193,8 @@ static void rna_def_fmodifier_generator(BlenderRNA *brna) NULL); RNA_def_property_ui_text( prop, "Coefficients", "Coefficients for 'x' (starting from lowest power of x^0)"); + RNA_def_property_update( + prop, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, "rna_FModifier_verify_data_update"); } /* --------- */ @@ -1219,7 +1227,7 @@ static void rna_def_fmodifier_function_generator(BlenderRNA *brna) prop = RNA_def_property(srna, "phase_multiplier", PROP_FLOAT, PROP_NONE); RNA_def_property_ui_text( - prop, "Phase Multiplier", "Scale factor determining the 'speed' of the function"); + prop, "Phase Multiple", "Scale factor determining the 'speed' of the function"); RNA_def_property_update(prop, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, "rna_FModifier_update"); prop = RNA_def_property(srna, "phase_offset", PROP_FLOAT, PROP_NONE); @@ -1632,13 +1640,14 @@ static void rna_def_fmodifier(BlenderRNA *brna) /* settings */ prop = RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE); RNA_def_property_flag(prop, PROP_NO_DEG_UPDATE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", FMODIFIER_FLAG_EXPANDED); + RNA_def_property_boolean_sdna(prop, NULL, "ui_expand_flag", 0); + RNA_def_property_boolean_funcs(prop, NULL, "rna_FModifier_show_expanded_set"); RNA_def_property_ui_text(prop, "Expanded", "F-Curve Modifier's panel is expanded in UI"); RNA_def_property_ui_icon(prop, ICON_DISCLOSURE_TRI_RIGHT, 1); prop = RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", FMODIFIER_FLAG_MUTED); - RNA_def_property_ui_text(prop, "Muted", "Disable F-Curve Modifier evaluation"); + RNA_def_property_ui_text(prop, "Enabled", "Enable F-Curve modifier evaluation"); RNA_def_property_update(prop, NC_ANIMATION | ND_KEYFRAME_PROP, "rna_FModifier_update"); RNA_def_property_ui_icon(prop, ICON_CHECKBOX_HLT, -1); @@ -1652,7 +1661,7 @@ static void rna_def_fmodifier(BlenderRNA *brna) /* TODO: setting this to true must ensure that all others in stack are turned off too... */ prop = RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", FMODIFIER_FLAG_ACTIVE); - RNA_def_property_ui_text(prop, "Active", "F-Curve Modifier is the one being edited"); + RNA_def_property_ui_text(prop, "Active", "F-Curve modifier will show settings in the editor"); RNA_def_property_boolean_funcs(prop, NULL, "rna_FModifier_active_set"); RNA_def_property_update(prop, NC_ANIMATION | ND_KEYFRAME_PROP, "rna_FModifier_active_update"); RNA_def_property_ui_icon(prop, ICON_RADIOBUT_OFF, 1); @@ -1666,8 +1675,6 @@ static void rna_def_fmodifier(BlenderRNA *brna) "F-Curve Modifier is only applied for the specified frame range to help " "mask off effects in order to chain them"); RNA_def_property_update(prop, NC_ANIMATION | ND_KEYFRAME_PROP, "rna_FModifier_update"); - RNA_def_property_ui_icon( - prop, ICON_DISCLOSURE_TRI_RIGHT, 1); /* XXX: depends on UI implementation */ prop = RNA_def_property(srna, "frame_start", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "sfra"); @@ -1709,8 +1716,6 @@ static void rna_def_fmodifier(BlenderRNA *brna) RNA_def_property_ui_text( prop, "Use Influence", "F-Curve Modifier's effects will be tempered by a default factor"); RNA_def_property_update(prop, NC_ANIMATION | ND_KEYFRAME_PROP, "rna_FModifier_update"); - RNA_def_property_ui_icon( - prop, ICON_DISCLOSURE_TRI_RIGHT, 1); /* XXX: depends on UI implementation */ prop = RNA_def_property(srna, "influence", PROP_FLOAT, PROP_FACTOR); RNA_def_property_float_sdna(prop, NULL, "influence"); diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c index 5437c93ef61..f9caa746dac 100644 --- a/source/blender/makesrna/intern/rna_gpencil.c +++ b/source/blender/makesrna/intern/rna_gpencil.c @@ -717,7 +717,7 @@ static void rna_GPencil_stroke_point_select_set(PointerRNA *ptr, const bool valu } /* Check if the stroke should be selected or not... */ - BKE_gpencil_stroke_sync_selection(gps); + BKE_gpencil_stroke_sync_selection(gpd, gps); } } @@ -933,6 +933,7 @@ static void rna_GPencil_stroke_close(ID *id, static void rna_GPencil_stroke_select_set(PointerRNA *ptr, const bool value) { + bGPdata *gpd = (bGPdata *)ptr->owner_id; bGPDstroke *gps = ptr->data; bGPDspoint *pt; int i; @@ -940,9 +941,11 @@ static void rna_GPencil_stroke_select_set(PointerRNA *ptr, const bool value) /* set new value */ if (value) { gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps); } else { gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_reset(gps); } /* ensure that the stroke's points are selected in the same way */ @@ -1744,6 +1747,11 @@ static void rna_def_gpencil_stroke(BlenderRNA *brna) RNA_def_property_ui_text( prop, "Vertex Fill Color", "Color used to mix with fill color to get final color"); RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* Selection Index */ + prop = RNA_def_property(srna, "select_index", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "select_index"); + RNA_def_property_ui_text(prop, "Select Index", "Index of selection used for interpolation"); } static void rna_def_gpencil_strokes_api(BlenderRNA *brna, PropertyRNA *cprop) diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h index 76c3e17e128..bfcb0039ca8 100644 --- a/source/blender/makesrna/intern/rna_internal.h +++ b/source/blender/makesrna/intern/rna_internal.h @@ -264,7 +264,7 @@ void rna_def_mtex_common(struct BlenderRNA *brna, const char *update, const char *update_index); void rna_def_texpaint_slots(struct BlenderRNA *brna, struct StructRNA *srna); -void rna_def_view_layer_common(struct StructRNA *srna, const bool scene); +void rna_def_view_layer_common(struct BlenderRNA *brna, struct StructRNA *srna, const bool scene); void rna_def_actionbone_group_common(struct StructRNA *srna, int update_flag, diff --git a/source/blender/makesrna/intern/rna_layer.c b/source/blender/makesrna/intern/rna_layer.c index afe69c37eef..7fce9b1f908 100644 --- a/source/blender/makesrna/intern/rna_layer.c +++ b/source/blender/makesrna/intern/rna_layer.c @@ -534,7 +534,7 @@ void RNA_def_view_layer(BlenderRNA *brna) RNA_def_struct_path_func(srna, "rna_ViewLayer_path"); RNA_def_struct_idprops_func(srna, "rna_ViewLayer_idprops"); - rna_def_view_layer_common(srna, true); + rna_def_view_layer_common(brna, srna, true); func = RNA_def_function(srna, "update_render_passes", "rna_ViewLayer_update_render_passes"); RNA_def_function_ui_description(func, diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c index f51bd2f9678..ed1024116fb 100644 --- a/source/blender/makesrna/intern/rna_mesh.c +++ b/source/blender/makesrna/intern/rna_mesh.c @@ -1893,7 +1893,7 @@ static void rna_def_mloop(BlenderRNA *brna) prop, "Bitangent", "Bitangent vector of this vertex for this polygon (must be computed beforehand using " - "calc_tangents, *use it only if really needed*, slower access than bitangent_sign)"); + "calc_tangents, use it only if really needed, slower access than bitangent_sign)"); } static void rna_def_mpolygon(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_meta.c b/source/blender/makesrna/intern/rna_meta.c index a391defe542..d5018a6911d 100644 --- a/source/blender/makesrna/intern/rna_meta.c +++ b/source/blender/makesrna/intern/rna_meta.c @@ -198,7 +198,7 @@ static void rna_def_metaelement(BlenderRNA *brna) srna = RNA_def_struct(brna, "MetaElement", NULL); RNA_def_struct_sdna(srna, "MetaElem"); - RNA_def_struct_ui_text(srna, "Meta Element", "Blobby element in a Metaball data-block"); + RNA_def_struct_ui_text(srna, "Metaball Element", "Blobby element in a metaball data-block"); RNA_def_struct_path_func(srna, "rna_MetaElement_path"); RNA_def_struct_ui_icon(srna, ICON_OUTLINER_DATA_META); @@ -290,13 +290,17 @@ static void rna_def_metaball_elements(BlenderRNA *brna, PropertyRNA *cprop) RNA_def_property_srna(cprop, "MetaBallElements"); srna = RNA_def_struct(brna, "MetaBallElements", NULL); RNA_def_struct_sdna(srna, "MetaBall"); - RNA_def_struct_ui_text(srna, "Meta Elements", "Collection of metaball elements"); + RNA_def_struct_ui_text(srna, "Metaball Elements", "Collection of metaball elements"); func = RNA_def_function(srna, "new", "rna_MetaBall_elements_new"); RNA_def_function_ui_description(func, "Add a new element to the metaball"); - RNA_def_enum( - func, "type", rna_enum_metaelem_type_items, MB_BALL, "", "type for the new meta-element"); - parm = RNA_def_pointer(func, "element", "MetaElement", "", "The newly created meta-element"); + RNA_def_enum(func, + "type", + rna_enum_metaelem_type_items, + MB_BALL, + "", + "Type for the new metaball element"); + parm = RNA_def_pointer(func, "element", "MetaElement", "", "The newly created metaball element"); RNA_def_function_return(func, parm); func = RNA_def_function(srna, "remove", "rna_MetaBall_elements_remove"); @@ -337,7 +341,7 @@ static void rna_def_metaball(BlenderRNA *brna) prop = RNA_def_property(srna, "elements", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "elems", NULL); RNA_def_property_struct_type(prop, "MetaElement"); - RNA_def_property_ui_text(prop, "Elements", "Meta elements"); + RNA_def_property_ui_text(prop, "Elements", "Metaball elements"); rna_def_metaball_elements(brna, prop); /* enums */ @@ -365,7 +369,7 @@ static void rna_def_metaball(BlenderRNA *brna) prop = RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "thresh"); RNA_def_property_range(prop, 0.0f, 5.0f); - RNA_def_property_ui_text(prop, "Threshold", "Influence of meta elements"); + RNA_def_property_ui_text(prop, "Threshold", "Influence of metaball elements"); RNA_def_property_update(prop, 0, "rna_MetaBall_update_data"); /* texture space */ diff --git a/source/blender/makesrna/intern/rna_meta_api.c b/source/blender/makesrna/intern/rna_meta_api.c index 178209d1152..19d0b35959b 100644 --- a/source/blender/makesrna/intern/rna_meta_api.c +++ b/source/blender/makesrna/intern/rna_meta_api.c @@ -54,7 +54,7 @@ void RNA_api_meta(StructRNA *srna) PropertyRNA *parm; func = RNA_def_function(srna, "transform", "rna_Meta_transform"); - RNA_def_function_ui_description(func, "Transform meta elements by a matrix"); + RNA_def_function_ui_description(func, "Transform metaball elements by a matrix"); parm = RNA_def_float_matrix(func, "matrix", 4, 4, NULL, 0.0f, 0.0f, "", "Matrix", 0.0f, 0.0f); RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index 6ec35dc204c..fe375cda24a 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -180,7 +180,7 @@ const EnumPropertyItem rna_enum_object_modifier_type_items[] = { "Skin", "Create a solid shape from vertices and edges, using the vertex radius to define the " "thickness"}, - {eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", " Make the surface thick"}, + {eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", "Make the surface thick"}, {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, @@ -279,7 +279,7 @@ const EnumPropertyItem rna_enum_object_modifier_type_items[] = { "WAVE", ICON_MOD_WAVE, "Wave", - "Adds a ripple-like motion to an object’s geometry"}, + "Adds a ripple-like motion to an object's geometry"}, {eModifierType_VolumeDisplace, "VOLUME_DISPLACE", ICON_VOLUME_DATA, @@ -1657,7 +1657,7 @@ static void rna_def_property_subdivision_common(StructRNA *srna) {SUBSURF_UV_SMOOTH_PRESERVE_BOUNDARIES, "PRESERVE_BOUNDARIES", 0, - "Keep boundaries", + "Keep Boundaries", "UVs are smoothed, boundaries are kept sharp"}, {SUBSURF_UV_SMOOTH_ALL, "SMOOTH_ALL", 0, "All", "UVs and boundaries are smoothed"}, {0, NULL, 0, NULL, NULL}, @@ -4562,7 +4562,7 @@ static void rna_def_modifier_solidify(BlenderRNA *brna) 0, "Complex", "Output a manifold mesh even if the base mesh is non-manifold, " - "where edges have 3 or more connecting faces." + "where edges have 3 or more connecting faces. " "This method is slower"}, {0, NULL, 0, NULL, NULL}, }; @@ -6747,7 +6747,7 @@ static void rna_def_modifier_normaledit(BlenderRNA *brna) "MUL", 0, "Multiply", - "Copy product of old and new normals (*not* cross product)"}, + "Copy product of old and new normals (not cross product)"}, {0, NULL, 0, NULL, NULL}, }; diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index c67a3e4448b..2c0d7ba3d06 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -355,6 +355,30 @@ const EnumPropertyItem rna_enum_node_filter_items[] = { {0, NULL, 0, NULL, NULL}, }; +static const EnumPropertyItem rna_node_geometry_attribute_randomize_operation_items[] = { + {GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE, + "REPLACE_CREATE", + ICON_NONE, + "Replace/Create", + "Replace the value and data type of an existing attribute, or create a new one"}, + {GEO_NODE_ATTRIBUTE_RANDOMIZE_ADD, + "ADD", + ICON_NONE, + "Add", + "Add the random values to the existing attribute values"}, + {GEO_NODE_ATTRIBUTE_RANDOMIZE_SUBTRACT, + "SUBTRACT", + ICON_NONE, + "Subtract", + "Subtract random values from the existing attribute values"}, + {GEO_NODE_ATTRIBUTE_RANDOMIZE_MULTIPLY, + "MULTIPLY", + ICON_NONE, + "Multiply", + "Multiply the existing attribute values with the random values"}, + {0, NULL, 0, NULL, NULL}, +}; + #ifndef RNA_RUNTIME static const EnumPropertyItem node_sampler_type_items[] = { {0, "NEAREST", 0, "Nearest", ""}, @@ -374,74 +398,6 @@ static const EnumPropertyItem prop_shader_output_target_items[] = { {0, NULL, 0, NULL, NULL}, }; -static const EnumPropertyItem rna_node_geometry_boolean_method_items[] = { - {GEO_NODE_BOOLEAN_INTERSECT, - "INTERSECT", - 0, - "Intersect", - "Keep the part of the mesh that is common between all operands"}, - {GEO_NODE_BOOLEAN_UNION, "UNION", 0, "Union", "Combine meshes in an additive way"}, - {GEO_NODE_BOOLEAN_DIFFERENCE, - "DIFFERENCE", - 0, - "Difference", - "Combine meshes in a subtractive way"}, - {0, NULL, 0, NULL, NULL}, -}; - -static const EnumPropertyItem rna_node_geometry_triangulate_quad_method_items[] = { - {GEO_NODE_TRIANGULATE_QUAD_BEAUTY, - "BEAUTY", - 0, - "Beauty", - "Split the quads in nice triangles, slower method"}, - {GEO_NODE_TRIANGULATE_QUAD_FIXED, - "FIXED", - 0, - "Fixed", - "Split the quads on the first and third vertices"}, - {GEO_NODE_TRIANGULATE_QUAD_ALTERNATE, - "FIXED_ALTERNATE", - 0, - "Fixed Alternate", - "Split the quads on the 2nd and 4th vertices"}, - {GEO_NODE_TRIANGULATE_QUAD_SHORTEDGE, - "SHORTEST_DIAGONAL", - 0, - "Shortest Diagonal", - "Split the quads based on the distance between the vertices"}, - {0, NULL, 0, NULL, NULL}, -}; - -static const EnumPropertyItem rna_node_geometry_triangulate_ngon_method_items[] = { - {GEO_NODE_TRIANGULATE_NGON_BEAUTY, - "BEAUTY", - 0, - "Beauty", - "Arrange the new triangles evenly (slow)"}, - {GEO_NODE_TRIANGULATE_NGON_EARCLIP, - "CLIP", - 0, - "Clip", - "Split the polygons with an ear clipping algorithm"}, - {0, NULL, 0, NULL, NULL}, -}; - -static const EnumPropertyItem rna_node_geometry_point_distribute_method_items[] = { - {GEO_NODE_POINT_DISTRIBUTE_RANDOM, - "RANDOM", - 0, - "Random", - "Distribute points randomly on the surface"}, - {GEO_NODE_POINT_DISTRIBUTE_POISSON, - "POISSON", - 0, - "Poisson Disk", - "Distribute the points randomly on the surface while taking a minimum distance between " - "points into account"}, - {0, NULL, 0, NULL, NULL}, -}; - #endif #define ITEM_ATTRIBUTE \ @@ -1921,7 +1877,7 @@ static const EnumPropertyItem *itemf_function_check( static bool attribute_random_type_supported(const EnumPropertyItem *item) { - return ELEM(item->value, CD_PROP_FLOAT, CD_PROP_FLOAT3, CD_PROP_BOOL); + return ELEM(item->value, CD_PROP_FLOAT, CD_PROP_FLOAT3, CD_PROP_BOOL, CD_PROP_INT32); } static const EnumPropertyItem *rna_GeometryNodeAttributeRandom_type_itemf( bContext *UNUSED(C), PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), bool *r_free) @@ -1930,20 +1886,53 @@ static const EnumPropertyItem *rna_GeometryNodeAttributeRandom_type_itemf( return itemf_function_check(rna_enum_attribute_type_items, attribute_random_type_supported); } -static bool attribute_random_domain_supported(const EnumPropertyItem *item) -{ - return item->value == ATTR_DOMAIN_POINT; -} -static const EnumPropertyItem *rna_GeometryNodeAttributeRandom_domain_itemf( - bContext *UNUSED(C), PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), bool *r_free) +static const EnumPropertyItem *rna_GeometryNodeAttributeRandomize_operation_itemf( + bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free) { + bNode *node = ptr->data; + const NodeAttributeRandomize *node_storage = (NodeAttributeRandomize *)node->storage; + const CustomDataType data_type = (CustomDataType)node_storage->data_type; + + EnumPropertyItem *item_array = NULL; + int items_len = 0; + for (const EnumPropertyItem *item = rna_node_geometry_attribute_randomize_operation_items; + item->identifier != NULL; + item++) { + if (data_type == CD_PROP_BOOL) { + if (item->value == GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE) { + RNA_enum_item_add(&item_array, &items_len, item); + } + } + else { + RNA_enum_item_add(&item_array, &items_len, item); + } + } + RNA_enum_item_end(&item_array, &items_len); + *r_free = true; - return itemf_function_check(rna_enum_attribute_domain_items, attribute_random_domain_supported); + return item_array; +} + +static void rna_GeometryNodeAttributeRandomize_data_type_update(Main *bmain, + Scene *scene, + PointerRNA *ptr) +{ + bNode *node = ptr->data; + NodeAttributeRandomize *node_storage = (NodeAttributeRandomize *)node->storage; + + /* The boolean data type has no extra operations besides, + * replace, so make sure the enum value is set properly. */ + if (node_storage->data_type == CD_PROP_BOOL) { + node_storage->operation = GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE; + } + + rna_Node_socket_update(bmain, scene, ptr); } static bool attribute_fill_type_supported(const EnumPropertyItem *item) { - return ELEM(item->value, CD_PROP_FLOAT, CD_PROP_FLOAT3, CD_PROP_COLOR, CD_PROP_BOOL); + return ELEM( + item->value, CD_PROP_FLOAT, CD_PROP_FLOAT3, CD_PROP_COLOR, CD_PROP_BOOL, CD_PROP_INT32); } static const EnumPropertyItem *rna_GeometryNodeAttributeFill_type_itemf(bContext *UNUSED(C), PointerRNA *UNUSED(ptr), @@ -3739,7 +3728,7 @@ static void rna_NodeCryptomatte_matte_set(PointerRNA *ptr, const char *value) { bNode *node = (bNode *)ptr->data; NodeCryptomatte *nc = node->storage; - BKE_cryptomatte_matte_id_to_entries(NULL, nc, value); + BKE_cryptomatte_matte_id_to_entries(nc, value); } static void rna_NodeCryptomatte_update_add(Main *bmain, Scene *scene, PointerRNA *ptr) @@ -4124,6 +4113,38 @@ void rna_ShaderNodePointDensity_density_minmax(bNode *self, RE_point_density_minmax(depsgraph, pd, r_min, r_max); } +static void rna_NodeInputString_string_get(PointerRNA *ptr, char *value) +{ + bNode *node = (bNode *)ptr->data; + NodeInputString *storage = node->storage; + + strcpy(value, (storage->string) ? storage->string : ""); +} + +static int rna_NodeInputString_string_length(PointerRNA *ptr) +{ + bNode *node = (bNode *)ptr->data; + NodeInputString *storage = node->storage; + + return (storage->string) ? strlen(storage->string) : 0; +} + +static void rna_NodeInputString_string_set(PointerRNA *ptr, const char *value) +{ + bNode *node = (bNode *)ptr->data; + NodeInputString *storage = node->storage; + + if (storage->string) { + MEM_freeN(storage->string); + } + + if (value && value[0]) { + storage->string = BLI_strdup(value); + } + else { + storage->string = NULL; + } +} #else static const EnumPropertyItem prop_image_layer_items[] = { @@ -4550,6 +4571,21 @@ static void def_fn_input_vector(StructRNA *srna) RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); } +static void def_fn_input_string(StructRNA *srna) +{ + PropertyRNA *prop; + + RNA_def_struct_sdna_from(srna, "NodeInputString", "storage"); + + prop = RNA_def_property(srna, "string", PROP_STRING, PROP_NONE); + RNA_def_property_string_funcs(prop, + "rna_NodeInputString_string_get", + "rna_NodeInputString_string_length", + "rna_NodeInputString_string_set"); + RNA_def_property_ui_text(prop, "String", ""); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); +} + /* -- Shader Nodes ---------------------------------------------------------- */ static void def_sh_output(StructRNA *srna) @@ -5186,7 +5222,7 @@ static void def_sh_tex_coord(StructRNA *srna) prop = RNA_def_property(srna, "from_instancer", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "custom1", 1); RNA_def_property_ui_text( - prop, "From Instancer", "Use the parent of the dupli object if possible"); + prop, "From Instancer", "Use the parent of the instance object if possible"); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); } @@ -5518,7 +5554,7 @@ static void def_sh_uvmap(StructRNA *srna) prop = RNA_def_property(srna, "from_instancer", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "custom1", 1); RNA_def_property_ui_text( - prop, "From Instancer", "Use the parent of the dupli object if possible"); + prop, "From Instancer", "Use the parent of the instance object if possible"); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); RNA_def_struct_sdna_from(srna, "NodeShaderUVMap", "storage"); @@ -8468,6 +8504,21 @@ static void def_geo_boolean(StructRNA *srna) { PropertyRNA *prop; + static const EnumPropertyItem rna_node_geometry_boolean_method_items[] = { + {GEO_NODE_BOOLEAN_INTERSECT, + "INTERSECT", + 0, + "Intersect", + "Keep the part of the mesh that is common between all operands"}, + {GEO_NODE_BOOLEAN_UNION, "UNION", 0, "Union", "Combine meshes in an additive way"}, + {GEO_NODE_BOOLEAN_DIFFERENCE, + "DIFFERENCE", + 0, + "Difference", + "Combine meshes in a subtractive way"}, + {0, NULL, 0, NULL, NULL}, + }; + prop = RNA_def_property(srna, "operation", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "custom1"); RNA_def_property_enum_items(prop, rna_node_geometry_boolean_method_items); @@ -8480,6 +8531,44 @@ static void def_geo_triangulate(StructRNA *srna) { PropertyRNA *prop; + static const EnumPropertyItem rna_node_geometry_triangulate_quad_method_items[] = { + {GEO_NODE_TRIANGULATE_QUAD_BEAUTY, + "BEAUTY", + 0, + "Beauty", + "Split the quads in nice triangles, slower method"}, + {GEO_NODE_TRIANGULATE_QUAD_FIXED, + "FIXED", + 0, + "Fixed", + "Split the quads on the first and third vertices"}, + {GEO_NODE_TRIANGULATE_QUAD_ALTERNATE, + "FIXED_ALTERNATE", + 0, + "Fixed Alternate", + "Split the quads on the 2nd and 4th vertices"}, + {GEO_NODE_TRIANGULATE_QUAD_SHORTEDGE, + "SHORTEST_DIAGONAL", + 0, + "Shortest Diagonal", + "Split the quads based on the distance between the vertices"}, + {0, NULL, 0, NULL, NULL}, + }; + + static const EnumPropertyItem rna_node_geometry_triangulate_ngon_method_items[] = { + {GEO_NODE_TRIANGULATE_NGON_BEAUTY, + "BEAUTY", + 0, + "Beauty", + "Arrange the new triangles evenly (slow)"}, + {GEO_NODE_TRIANGULATE_NGON_EARCLIP, + "CLIP", + 0, + "Clip", + "Split the polygons with an ear clipping algorithm"}, + {0, NULL, 0, NULL, NULL}, + }; + prop = RNA_def_property(srna, "quad_method", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "custom1"); RNA_def_property_enum_items(prop, rna_node_geometry_triangulate_quad_method_items); @@ -8528,9 +8617,27 @@ static void def_geo_attribute_create_common(StructRNA *srna, static void def_geo_attribute_randomize(StructRNA *srna) { - def_geo_attribute_create_common(srna, - "rna_GeometryNodeAttributeRandom_type_itemf", - "rna_GeometryNodeAttributeRandom_domain_itemf"); + PropertyRNA *prop; + + RNA_def_struct_sdna_from(srna, "NodeAttributeRandomize", "storage"); + + prop = RNA_def_property(srna, "data_type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "data_type"); + RNA_def_property_enum_items(prop, rna_enum_attribute_type_items); + RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_GeometryNodeAttributeRandom_type_itemf"); + RNA_def_property_enum_default(prop, CD_PROP_FLOAT); + RNA_def_property_ui_text(prop, "Data Type", "Type of data stored in attribute"); + RNA_def_property_update( + prop, NC_NODE | NA_EDITED, "rna_GeometryNodeAttributeRandomize_data_type_update"); + + prop = RNA_def_property(srna, "operation", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "operation"); + RNA_def_property_enum_items(prop, rna_node_geometry_attribute_randomize_operation_items); + RNA_def_property_enum_funcs( + prop, NULL, NULL, "rna_GeometryNodeAttributeRandomize_operation_itemf"); + RNA_def_property_enum_default(prop, GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE); + RNA_def_property_ui_text(prop, "Operation", ""); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update"); } static void def_geo_attribute_fill(StructRNA *srna) @@ -8600,9 +8707,9 @@ static void def_geo_attribute_vector_math(StructRNA *srna) RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update"); prop = RNA_def_property(srna, "input_type_c", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_bitflag_sdna(prop, NULL, "input_type_b"); + RNA_def_property_enum_bitflag_sdna(prop, NULL, "input_type_c"); RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_vector); - RNA_def_property_ui_text(prop, "Input Type B", ""); + RNA_def_property_ui_text(prop, "Input Type C", ""); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update"); } @@ -8693,6 +8800,21 @@ static void def_geo_point_distribute(StructRNA *srna) { PropertyRNA *prop; + static const EnumPropertyItem rna_node_geometry_point_distribute_method_items[] = { + {GEO_NODE_POINT_DISTRIBUTE_RANDOM, + "RANDOM", + 0, + "Random", + "Distribute points randomly on the surface"}, + {GEO_NODE_POINT_DISTRIBUTE_POISSON, + "POISSON", + 0, + "Poisson Disk", + "Distribute the points randomly on the surface while taking a minimum distance between " + "points into account"}, + {0, NULL, 0, NULL, NULL}, + }; + prop = RNA_def_property(srna, "distribute_method", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "custom1"); RNA_def_property_enum_items(prop, rna_node_geometry_point_distribute_method_items); @@ -8956,7 +9078,7 @@ static void def_geo_collection_info(StructRNA *srna) 0, "Relative", "Bring the input collection geometry into the modified object, maintaining the relative " - "position between the objects in the scene."}, + "position between the objects in the scene"}, {0, NULL, 0, NULL, NULL}, }; @@ -9032,6 +9154,40 @@ static void def_geo_volume_to_mesh(StructRNA *srna) RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update"); } +static void def_geo_attribute_combine_xyz(StructRNA *srna) +{ + PropertyRNA *prop; + + RNA_def_struct_sdna_from(srna, "NodeAttributeCombineXYZ", "storage"); + + prop = RNA_def_property(srna, "input_type_x", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_float); + RNA_def_property_ui_text(prop, "Input Type X", ""); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update"); + + prop = RNA_def_property(srna, "input_type_y", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_float); + RNA_def_property_ui_text(prop, "Input Type Y", ""); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update"); + + prop = RNA_def_property(srna, "input_type_z", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_float); + RNA_def_property_ui_text(prop, "Input Type Z", ""); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update"); +} + +static void def_geo_attribute_separate_xyz(StructRNA *srna) +{ + PropertyRNA *prop; + + RNA_def_struct_sdna_from(srna, "NodeAttributeSeparateXYZ", "storage"); + + prop = RNA_def_property(srna, "input_type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_vector); + RNA_def_property_ui_text(prop, "Input Type", ""); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update"); +} + /* -------------------------------------------------------------------------- */ static void rna_def_shader_node(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index 1eb5ed3977a..799d1e8190c 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -1602,7 +1602,12 @@ bool rna_Object_constraints_override_apply(Main *UNUSED(bmain), static ModifierData *rna_Object_modifier_new( Object *object, bContext *C, ReportList *reports, const char *name, int type) { - return ED_object_modifier_add(reports, CTX_data_main(C), CTX_data_scene(C), object, name, type); + ModifierData *md = ED_object_modifier_add( + reports, CTX_data_main(C), CTX_data_scene(C), object, name, type); + + WM_main_add_notifier(NC_OBJECT | ND_MODIFIER | NA_ADDED, object); + + return md; } static void rna_Object_modifier_remove(Object *object, @@ -2123,7 +2128,7 @@ static void rna_def_vertex_group(BlenderRNA *brna) RNA_def_function_ui_description(func, "Add vertices to the group"); RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID); /* TODO, see how array size of 0 works, this shouldn't be used */ - parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "Index List", 0, 0); + parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "List of indices", 0, 0); RNA_def_parameter_flags(parm, PROP_DYNAMIC, PARM_REQUIRED); parm = RNA_def_float(func, "weight", 0, 0.0f, 1.0f, "", "Vertex weight", 0.0f, 1.0f); RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); @@ -2131,10 +2136,10 @@ static void rna_def_vertex_group(BlenderRNA *brna) RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); func = RNA_def_function(srna, "remove", "rna_VertexGroup_vertex_remove"); - RNA_def_function_ui_description(func, "Remove a vertex from the group"); + RNA_def_function_ui_description(func, "Remove vertices from the group"); RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID); /* TODO, see how array size of 0 works, this shouldn't be used */ - parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "Index List", 0, 0); + parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "List of indices", 0, 0); RNA_def_parameter_flags(parm, PROP_DYNAMIC, PARM_REQUIRED); func = RNA_def_function(srna, "weight", "rna_VertexGroup_weight"); @@ -2178,17 +2183,17 @@ static void rna_def_face_map(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Index", "Index number of the face map"); func = RNA_def_function(srna, "add", "rna_FaceMap_face_add"); - RNA_def_function_ui_description(func, "Add vertices to the group"); + RNA_def_function_ui_description(func, "Add faces to the face-map"); RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID); /* TODO, see how array size of 0 works, this shouldn't be used */ - parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "Index List", 0, 0); + parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "List of indices", 0, 0); RNA_def_parameter_flags(parm, PROP_DYNAMIC, PARM_REQUIRED); func = RNA_def_function(srna, "remove", "rna_FaceMap_face_remove"); - RNA_def_function_ui_description(func, "Remove a vertex from the group"); + RNA_def_function_ui_description(func, "Remove faces from the face-map"); RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID); /* TODO, see how array size of 0 works, this shouldn't be used */ - parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "Index List", 0, 0); + parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "List of indices", 0, 0); RNA_def_parameter_flags(parm, PROP_DYNAMIC, PARM_REQUIRED); } diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c index 9fb883568c9..df628caa000 100644 --- a/source/blender/makesrna/intern/rna_object_api.c +++ b/source/blender/makesrna/intern/rna_object_api.c @@ -404,6 +404,29 @@ static void rna_Object_to_mesh_clear(Object *object) BKE_object_to_mesh_clear(object); } +static Curve *rna_Object_to_curve(Object *object, + ReportList *reports, + Depsgraph *depsgraph, + bool apply_modifiers) +{ + if (!ELEM(object->type, OB_FONT, OB_CURVE)) { + BKE_report(reports, RPT_ERROR, "Object is not a curve or a text"); + return NULL; + } + + if (depsgraph == NULL) { + BKE_report(reports, RPT_ERROR, "Invalid depsgraph"); + return NULL; + } + + return BKE_object_to_curve(object, depsgraph, apply_modifiers); +} + +static void rna_Object_to_curve_clear(Object *object) +{ + BKE_object_to_curve_clear(object); +} + static PointerRNA rna_Object_shape_key_add( Object *ob, bContext *C, ReportList *reports, const char *name, bool from_mix) { @@ -977,6 +1000,29 @@ void RNA_api_object(StructRNA *srna) func = RNA_def_function(srna, "to_mesh_clear", "rna_Object_to_mesh_clear"); RNA_def_function_ui_description(func, "Clears mesh data-block created by to_mesh()"); + /* curve */ + func = RNA_def_function(srna, "to_curve", "rna_Object_to_curve"); + RNA_def_function_ui_description( + func, + "Create a Curve data-block from the current state of the object. This only works for curve " + "and text objects. The object owns the data-block. To force free it, use to_curve_clear(). " + "The result is temporary and can not be used by objects from the main database"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm = RNA_def_pointer( + func, "depsgraph", "Depsgraph", "Dependency Graph", "Evaluated dependency graph"); + RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); + RNA_def_boolean(func, + "apply_modifiers", + false, + "", + "Apply the deform modifiers on the control points of the curve. This is only " + "supported for curve objects"); + parm = RNA_def_pointer(func, "curve", "Curve", "", "Curve created from object"); + RNA_def_function_return(func, parm); + + func = RNA_def_function(srna, "to_curve_clear", "rna_Object_to_curve_clear"); + RNA_def_function_ui_description(func, "Clears curve data-block created by to_curve()"); + /* Armature */ func = RNA_def_function(srna, "find_armature", "BKE_modifiers_is_deformed_by_armature"); RNA_def_function_ui_description( diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c index ab8c1b0bb3f..f81f965d0c8 100644 --- a/source/blender/makesrna/intern/rna_particle.c +++ b/source/blender/makesrna/intern/rna_particle.c @@ -1921,14 +1921,15 @@ static void rna_def_particle_dupliweight(BlenderRNA *brna) PropertyRNA *prop; srna = RNA_def_struct(brna, "ParticleDupliWeight", NULL); - RNA_def_struct_ui_text( - srna, "Particle Dupliobject Weight", "Weight of a particle dupliobject in a collection"); + RNA_def_struct_ui_text(srna, + "Particle Instance Object Weight", + "Weight of a particle instance object in a collection"); RNA_def_struct_sdna(srna, "ParticleDupliWeight"); prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); RNA_def_property_string_funcs( prop, "rna_ParticleDupliWeight_name_get", "rna_ParticleDupliWeight_name_length", NULL); - RNA_def_property_ui_text(prop, "Name", "Particle dupliobject name"); + RNA_def_property_ui_text(prop, "Name", "Particle instance object name"); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_struct_name_property(srna, prop); @@ -2783,7 +2784,7 @@ static void rna_def_particle_settings(BlenderRNA *brna) RNA_def_property_float_sdna(prop, NULL, "draw_size"); RNA_def_property_range(prop, 0, 1000); RNA_def_property_ui_range(prop, 0, 100, 1, -1); - RNA_def_property_ui_text(prop, "Draw Size", "Size of particles on viewport in BU"); + RNA_def_property_ui_text(prop, "Draw Size", "Size of particles on viewport"); RNA_def_property_update(prop, 0, "rna_Particle_redo"); prop = RNA_def_property(srna, "child_type", PROP_ENUM, PROP_NONE); @@ -2860,7 +2861,7 @@ static void rna_def_particle_settings(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Integration", "Algorithm used to calculate physics, from the fastest to the " - "most stable/accurate: Midpoint, Euler, Verlet, RK4 (Old)"); + "most stable and accurate: Midpoint, Euler, Verlet, RK4"); RNA_def_property_update(prop, 0, "rna_Particle_reset"); prop = RNA_def_property(srna, "kink", PROP_ENUM, PROP_NONE); @@ -3163,14 +3164,15 @@ static void rna_def_particle_settings(BlenderRNA *brna) RNA_def_property_int_sdna(prop, NULL, "child_nbr"); /*optional if prop names are the same */ RNA_def_property_range(prop, 0, 100000); RNA_def_property_ui_range(prop, 0, 1000, 1, -1); - RNA_def_property_ui_text(prop, "Children Per Parent", "Number of children/parent"); + RNA_def_property_ui_text(prop, "Children Per Parent", "Number of children per parent"); RNA_def_property_update(prop, 0, "rna_Particle_redo_child"); prop = RNA_def_property(srna, "rendered_child_count", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "ren_child_nbr"); RNA_def_property_range(prop, 0, 100000); RNA_def_property_ui_range(prop, 0, 10000, 1, -1); - RNA_def_property_ui_text(prop, "Rendered Children", "Number of children/parent for rendering"); + RNA_def_property_ui_text( + prop, "Rendered Children", "Number of children per parent for rendering"); prop = RNA_def_property(srna, "virtual_parents", PROP_FLOAT, PROP_FACTOR); RNA_def_property_float_sdna(prop, NULL, "parents"); @@ -3457,32 +3459,33 @@ static void rna_def_particle_settings(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_REFCOUNT); RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); RNA_def_property_ui_text( - prop, "Dupli Collection", "Show Objects in this collection in place of particles"); + prop, "Instance Collection", "Show objects in this collection in place of particles"); RNA_def_property_update(prop, 0, "rna_Particle_redo_count"); prop = RNA_def_property(srna, "instance_weights", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "instance_weights", NULL); RNA_def_property_struct_type(prop, "ParticleDupliWeight"); - RNA_def_property_ui_text( - prop, "Dupli Collection Weights", "Weights for all of the objects in the dupli collection"); + RNA_def_property_ui_text(prop, + "Instance Collection Weights", + "Weights for all of the objects in the instance collection"); prop = RNA_def_property(srna, "active_instanceweight", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "ParticleDupliWeight"); RNA_def_property_pointer_funcs(prop, "rna_ParticleDupliWeight_active_get", NULL, NULL, NULL); - RNA_def_property_ui_text(prop, "Active Dupli Object", ""); + RNA_def_property_ui_text(prop, "Active Instance Object", ""); prop = RNA_def_property(srna, "active_instanceweight_index", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_funcs(prop, "rna_ParticleDupliWeight_active_index_get", "rna_ParticleDupliWeight_active_index_set", "rna_ParticleDupliWeight_active_index_range"); - RNA_def_property_ui_text(prop, "Active Dupli Object Index", ""); + RNA_def_property_ui_text(prop, "Active Instance Object Index", ""); prop = RNA_def_property(srna, "instance_object", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "Object"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); - RNA_def_property_ui_text(prop, "Instance Object", "Show this Object in place of particles"); + RNA_def_property_ui_text(prop, "Instance Object", "Show this object in place of particles"); RNA_def_property_update(prop, 0, "rna_Particle_redo_dependency"); /* boids */ diff --git a/source/blender/makesrna/intern/rna_pose.c b/source/blender/makesrna/intern/rna_pose.c index 89a6c7cdf9d..bd45990fe30 100644 --- a/source/blender/makesrna/intern/rna_pose.c +++ b/source/blender/makesrna/intern/rna_pose.c @@ -1142,6 +1142,7 @@ static void rna_def_pose_channel(BlenderRNA *brna) prop = RNA_def_property(srna, "rotation_mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "rotmode"); + RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); RNA_def_property_enum_items(prop, rna_enum_object_rotation_mode_items); RNA_def_property_enum_funcs(prop, NULL, "rna_PoseChannel_rotation_mode_set", NULL); /* XXX... disabled, since proxy-locked layers are currently diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c index 0c2860c05e7..0411ef6d6ee 100644 --- a/source/blender/makesrna/intern/rna_render.c +++ b/source/blender/makesrna/intern/rna_render.c @@ -1058,7 +1058,7 @@ static void rna_def_render_layer(BlenderRNA *brna) RNA_define_verify_sdna(0); - rna_def_view_layer_common(srna, false); + rna_def_view_layer_common(brna, srna, false); prop = RNA_def_property(srna, "passes", PROP_COLLECTION, PROP_NONE); RNA_def_property_struct_type(prop, "RenderPass"); diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c index cad0d77607b..b0a942cd39e 100644 --- a/source/blender/makesrna/intern/rna_rna.c +++ b/source/blender/makesrna/intern/rna_rna.c @@ -1471,8 +1471,8 @@ static int rna_property_override_diff_propptr(Main *bmain, } } else { - /* We could also use is_diff_pointer, but then we potentially lose the gt/lt info - - * and don't think performances are critical here for now anyway... */ + /* We could also use is_diff_pointer, but then we potentially lose the greater-than/less-than + * info - and don't think performances are critical here for now anyway. */ return !RNA_struct_equals(bmain, propptr_a, propptr_b, mode); } } diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 58a89b7ffdc..170bbc7e372 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -262,7 +262,7 @@ const EnumPropertyItem rna_enum_curve_fit_method_items[] = { #define R_IMF_ENUM_BMP \ {R_IMF_IMTYPE_BMP, "BMP", ICON_FILE_IMAGE, "BMP", "Output image in bitmap format"}, #define R_IMF_ENUM_IRIS \ - {R_IMF_IMTYPE_IRIS, "IRIS", ICON_FILE_IMAGE, "Iris", "Output image in (old!) SGI IRIS format"}, + {R_IMF_IMTYPE_IRIS, "IRIS", ICON_FILE_IMAGE, "Iris", "Output image in SGI IRIS format"}, #define R_IMF_ENUM_PNG \ {R_IMF_IMTYPE_PNG, "PNG", ICON_FILE_IMAGE, "PNG", "Output image in PNG format"}, #define R_IMF_ENUM_JPEG \ @@ -549,62 +549,6 @@ static const EnumPropertyItem rna_enum_view_layer_aov_type_items[] = { {0, NULL, 0, NULL, NULL}, }; -#ifndef RNA_RUNTIME -static const EnumPropertyItem rna_enum_gpencil_interpolation_mode_items[] = { - /* interpolation */ - {0, "", 0, N_("Interpolation"), "Standard transitions between keyframes"}, - {GP_IPO_LINEAR, - "LINEAR", - ICON_IPO_LINEAR, - "Linear", - "Straight-line interpolation between A and B (i.e. no ease in/out)"}, - {GP_IPO_CURVEMAP, - "CUSTOM", - ICON_IPO_BEZIER, - "Custom", - "Custom interpolation defined using a curve map"}, - - /* easing */ - {0, - "", - 0, - N_("Easing (by strength)"), - "Predefined inertial transitions, useful for motion graphics (from least to most " - "''dramatic'')"}, - {GP_IPO_SINE, - "SINE", - ICON_IPO_SINE, - "Sinusoidal", - "Sinusoidal easing (weakest, almost linear but with a slight curvature)"}, - {GP_IPO_QUAD, "QUAD", ICON_IPO_QUAD, "Quadratic", "Quadratic easing"}, - {GP_IPO_CUBIC, "CUBIC", ICON_IPO_CUBIC, "Cubic", "Cubic easing"}, - {GP_IPO_QUART, "QUART", ICON_IPO_QUART, "Quartic", "Quartic easing"}, - {GP_IPO_QUINT, "QUINT", ICON_IPO_QUINT, "Quintic", "Quintic easing"}, - {GP_IPO_EXPO, "EXPO", ICON_IPO_EXPO, "Exponential", "Exponential easing (dramatic)"}, - {GP_IPO_CIRC, - "CIRC", - ICON_IPO_CIRC, - "Circular", - "Circular easing (strongest and most dynamic)"}, - - {0, "", 0, N_("Dynamic Effects"), "Simple physics-inspired easing effects"}, - {GP_IPO_BACK, "BACK", ICON_IPO_BACK, "Back", "Cubic easing with overshoot and settle"}, - {GP_IPO_BOUNCE, - "BOUNCE", - ICON_IPO_BOUNCE, - "Bounce", - "Exponentially decaying parabolic bounce, like when objects collide"}, - {GP_IPO_ELASTIC, - "ELASTIC", - ICON_IPO_ELASTIC, - "Elastic", - "Exponentially decaying sine wave, like an elastic band"}, - - {0, NULL, 0, NULL, NULL}, -}; - -#endif - const EnumPropertyItem rna_enum_transform_pivot_items_full[] = { {V3D_AROUND_CENTER_BOUNDS, "BOUNDING_BOX_CENTER", @@ -735,27 +679,6 @@ static void rna_GPencil_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *UN ED_gpencil_tag_scene_gpencil(scene); } -/* Grease Pencil Interpolation settings */ -static char *rna_GPencilInterpolateSettings_path(PointerRNA *UNUSED(ptr)) -{ - return BLI_strdup("tool_settings.gpencil_interpolate"); -} - -static void rna_GPencilInterpolateSettings_type_set(PointerRNA *ptr, int value) -{ - GP_Interpolate_Settings *settings = (GP_Interpolate_Settings *)ptr->data; - - /* NOTE: This cast should be fine, as we have a small + finite set of values - * (#eGP_Interpolate_Type) that should fit well within a char. - */ - settings->type = (char)value; - - /* init custom interpolation curve here now the first time it's used */ - if ((settings->type == GP_IPO_CURVEMAP) && (settings->custom_ipo == NULL)) { - settings->custom_ipo = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f); - } -} - static void rna_Gpencil_extend_selection(bContext *C, PointerRNA *UNUSED(ptr)) { /* Extend selection to all points in all selected strokes. */ @@ -2688,69 +2611,10 @@ static void rna_def_gpencil_interpolate(BlenderRNA *brna) srna = RNA_def_struct(brna, "GPencilInterpolateSettings", NULL); RNA_def_struct_sdna(srna, "GP_Interpolate_Settings"); - RNA_def_struct_path_func(srna, "rna_GPencilInterpolateSettings_path"); RNA_def_struct_ui_text(srna, "Grease Pencil Interpolate Settings", "Settings for Grease Pencil interpolation tools"); - /* flags */ - prop = RNA_def_property(srna, "interpolate_all_layers", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_TOOLFLAG_INTERPOLATE_ALL_LAYERS); - RNA_def_property_ui_text( - prop, "Interpolate All Layers", "Interpolate all layers, not only active"); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); - - prop = RNA_def_property(srna, "interpolate_selected_only", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED); - RNA_def_property_ui_text(prop, - "Interpolate Selected Strokes", - "Interpolate only selected strokes in the original frame"); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); - - /* interpolation type */ - prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "type"); - RNA_def_property_enum_items(prop, rna_enum_gpencil_interpolation_mode_items); - RNA_def_property_enum_funcs(prop, NULL, "rna_GPencilInterpolateSettings_type_set", NULL); - RNA_def_property_ui_text( - prop, "Type", "Interpolation method to use the next time 'Interpolate Sequence' is run"); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); - - prop = RNA_def_property(srna, "step", PROP_INT, PROP_NONE); - RNA_def_property_range(prop, 1, MAXFRAME); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_ui_text(prop, "Step", "Number of frames between generated interpolated frames"); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); - - /* easing */ - prop = RNA_def_property(srna, "easing", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "easing"); - RNA_def_property_enum_items(prop, rna_enum_beztriple_interpolation_easing_items); - RNA_def_property_ui_text( - prop, - "Easing", - "Which ends of the segment between the preceding and following grease pencil frames " - "easing interpolation is applied to"); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); - - /* easing options */ - prop = RNA_def_property(srna, "back", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "back"); - RNA_def_property_ui_text(prop, "Back", "Amount of overshoot for 'back' easing"); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); - - prop = RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "amplitude"); - RNA_def_property_range(prop, 0.0f, FLT_MAX); /* only positive values... */ - RNA_def_property_ui_text( - prop, "Amplitude", "Amount to boost elastic bounces for 'elastic' easing"); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); - - prop = RNA_def_property(srna, "period", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "period"); - RNA_def_property_ui_text(prop, "Period", "Time between bounces for elastic easing"); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); - /* custom curvemap */ prop = RNA_def_property(srna, "interpolation_curve", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "custom_ipo"); @@ -2759,7 +2623,6 @@ static void rna_def_gpencil_interpolate(BlenderRNA *brna) prop, "Interpolation Curve", "Custom curve to control 'sequence' interpolation between Grease Pencil frames"); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); } static void rna_def_transform_orientation(BlenderRNA *brna) @@ -4062,6 +3925,24 @@ static void rna_def_view_layer_eevee(BlenderRNA *brna) RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_ViewLayer_pass_update"); } +static void rna_def_view_layer_aovs(BlenderRNA *brna, PropertyRNA *cprop) +{ + StructRNA *srna; + /* PropertyRNA *prop; */ + + FunctionRNA *func; + PropertyRNA *parm; + + RNA_def_property_srna(cprop, "AOVs"); + srna = RNA_def_struct(brna, "AOVs", NULL); + RNA_def_struct_sdna(srna, "ViewLayer"); + RNA_def_struct_ui_text(srna, "List of AOVs", "Collection of AOVs"); + + func = RNA_def_function(srna, "add", "BKE_view_layer_add_aov"); + parm = RNA_def_pointer(func, "aov", "AOV", "", "Newly created AOV"); + RNA_def_function_return(func, parm); +} + static void rna_def_view_layer_aov(BlenderRNA *brna) { StructRNA *srna; @@ -4089,7 +3970,7 @@ static void rna_def_view_layer_aov(BlenderRNA *brna) RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_ViewLayer_pass_update"); } -void rna_def_view_layer_common(StructRNA *srna, const bool scene) +void rna_def_view_layer_common(BlenderRNA *brna, StructRNA *srna, const bool scene) { PropertyRNA *prop; @@ -4144,6 +4025,7 @@ void rna_def_view_layer_common(StructRNA *srna, const bool scene) RNA_def_property_collection_sdna(prop, NULL, "aovs", NULL); RNA_def_property_struct_type(prop, "AOV"); RNA_def_property_ui_text(prop, "Shader AOV", ""); + rna_def_view_layer_aovs(brna, prop); prop = RNA_def_property(srna, "active_aov", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "AOV"); @@ -7349,21 +7231,66 @@ static void rna_def_scene_eevee(BlenderRNA *brna) RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); /* Depth of Field */ + prop = RNA_def_property(srna, "bokeh_max_size", PROP_FLOAT, PROP_PIXEL); RNA_def_property_ui_text( prop, "Max Size", "Max size of the bokeh shape for the depth of field (lower is faster)"); RNA_def_property_range(prop, 0.0f, 2000.0f); - RNA_def_property_ui_range(prop, 2.0f, 200.0f, 1, 3); + RNA_def_property_ui_range(prop, 0.0f, 200.0f, 100.0f, 1); RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); prop = RNA_def_property(srna, "bokeh_threshold", PROP_FLOAT, PROP_FACTOR); RNA_def_property_ui_text( prop, "Sprite Threshold", "Brightness threshold for using sprite base depth of field"); RNA_def_property_range(prop, 0.0f, 100000.0f); - RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3); + RNA_def_property_ui_range(prop, 0.0f, 10.0f, 10, 2); RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + prop = RNA_def_property(srna, "bokeh_neighbor_max", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_ui_text(prop, + "Neighbor Rejection", + "Maximum brightness to consider when rejecting bokeh sprites " + "based on neighborhood (lower is faster)"); + RNA_def_property_range(prop, 0.0f, 100000.0f); + RNA_def_property_ui_range(prop, 0.0f, 40.0f, 10, 2); + RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + + prop = RNA_def_property(srna, "bokeh_denoise_fac", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_ui_text( + prop, "Denoise Amount", "Amount of flicker removal applied to bokeh highlights"); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 10, 2); + RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + + prop = RNA_def_property(srna, "use_bokeh_high_quality_slight_defocus", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", SCE_EEVEE_DOF_HQ_SLIGHT_FOCUS); + RNA_def_property_ui_text(prop, + "High Quality Slight Defocus", + "Sample all pixels in almost in-focus regions to eliminate noise"); + RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + + prop = RNA_def_property(srna, "use_bokeh_jittered", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", SCE_EEVEE_DOF_JITTER); + RNA_def_property_ui_text(prop, + "Jitter Camera", + "Jitter camera position to create accurate blurring " + "using render samples"); + RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + + prop = RNA_def_property(srna, "bokeh_overblur", PROP_FLOAT, PROP_PERCENTAGE); + RNA_def_property_ui_text(prop, + "Over-blur", + "Apply blur to each jittered sample to reduce " + "under-sampling artifacts"); + RNA_def_property_range(prop, 0, 100); + RNA_def_property_ui_range(prop, 0.0f, 20.0f, 1, 1); + RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); + /* Bloom */ prop = RNA_def_property(srna, "use_bloom", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", SCE_EEVEE_BLOOM_ENABLED); diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c index 784172b3ac9..6cf1d7a923b 100644 --- a/source/blender/makesrna/intern/rna_screen.c +++ b/source/blender/makesrna/intern/rna_screen.c @@ -56,6 +56,8 @@ const EnumPropertyItem rna_enum_region_type_items[] = { #ifdef RNA_RUNTIME +# include "RNA_access.h" + # include "BKE_global.h" # include "BKE_screen.h" # include "BKE_workspace.h" @@ -274,6 +276,25 @@ static void rna_Area_ui_type_update(bContext *C, PointerRNA *ptr) ED_area_tag_refresh(area); } +static PointerRNA rna_Region_data_get(PointerRNA *ptr) +{ + bScreen *screen = (bScreen *)ptr->owner_id; + ARegion *region = ptr->data; + + if (region->regiondata != NULL) { + if (region->regiontype == RGN_TYPE_WINDOW) { + /* We could make this static, it wont change at run-time. */ + SpaceType *st = BKE_spacetype_from_id(SPACE_VIEW3D); + if (region->type == BKE_regiontype_from_id(st, region->regiontype)) { + PointerRNA newptr; + RNA_pointer_create(&screen->id, &RNA_RegionView3D, region->regiondata, &newptr); + return newptr; + } + } + } + return PointerRNA_NULL; +} + static void rna_View2D_region_to_view(struct View2D *v2d, float x, float y, float result[2]) { UI_view2d_region_to_view(v2d, x, y, &result[0], &result[1]); @@ -539,6 +560,13 @@ static void rna_def_region(BlenderRNA *brna) RNA_def_property_enum_funcs(prop, "rna_region_alignment_get", NULL, NULL); RNA_def_property_ui_text(prop, "Alignment", "Alignment of the region within the area"); + prop = RNA_def_property(srna, "data", PROP_POINTER, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text( + prop, "Region Data", "Region specific data (the type depends on the region type)"); + RNA_def_property_struct_type(prop, "AnyType"); + RNA_def_property_pointer_funcs(prop, "rna_Region_data_get", NULL, NULL, NULL); + RNA_def_function(srna, "tag_redraw", "ED_region_tag_redraw"); } diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 2156516b187..3b43ad5e766 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -4008,7 +4008,7 @@ static void rna_def_space_view3d_overlay(BlenderRNA *brna) prop = RNA_def_property(srna, "show_occlude_wire", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_OCCLUDE_WIRE); RNA_def_property_ui_text(prop, "Hidden Wire", "Use hidden wireframe display"); - RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); + RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D | NS_VIEW3D_SHADING, NULL); prop = RNA_def_property(srna, "show_face_normals", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FACE_NORMALS); @@ -4336,7 +4336,7 @@ static void rna_def_space_view3d(BlenderRNA *brna) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "Render Region", - "Use a region within the frame size for rendered viewport" + "Use a region within the frame size for rendered viewport " "(when not viewing through the camera)"); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); @@ -4654,7 +4654,7 @@ static void rna_def_space_view3d(BlenderRNA *brna) RNA_def_property_boolean_negative_sdna( prop, NULL, view_mask_member[mask_index], info[type_index].type_mask); RNA_def_property_ui_text(prop, info[type_index].name, ""); - RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); + RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D | NS_VIEW3D_SHADING, NULL); } } @@ -4805,13 +4805,21 @@ static void rna_def_space_properties(BlenderRNA *brna) PropertyRNA *prop; static const EnumPropertyItem tab_sync_items[] = { - {PROPERTIES_SYNC_ON, "ON", 0, "On", "Always sync from outliner editors to this editor"}, - {PROPERTIES_SYNC_OFF, "OFF", 0, "Off", "Never sync from outliner editors to this editor"}, + {PROPERTIES_SYNC_ALWAYS, + "ALWAYS", + 0, + "Always", + "Always change tabs when clicking an icon in an outliner"}, + {PROPERTIES_SYNC_NEVER, + "NEVER", + 0, + "Never", + "Never change tabs when clicking an icon in an outliner"}, {PROPERTIES_SYNC_AUTO, "AUTO", 0, "Auto", - "Sync when this editor shares an edge with an outliner editor"}, + "Change tabs only when this editor shares a border with an outliner"}, {0, NULL, 0, NULL, NULL}, }; @@ -4870,7 +4878,9 @@ static void rna_def_space_properties(BlenderRNA *brna) prop = RNA_def_property(srna, "outliner_sync", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "outliner_sync"); RNA_def_property_enum_items(prop, tab_sync_items); - RNA_def_property_ui_text(prop, "Outliner Sync", "Sync tabs from outliner datablock selection"); + RNA_def_property_ui_text(prop, + "Outliner Sync", + "Change to the corresponding tab when outliner data icons are clicked"); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_PROPERTIES, NULL); } diff --git a/source/blender/makesrna/intern/rna_speaker.c b/source/blender/makesrna/intern/rna_speaker.c index 27e8654306a..43f0d27f514 100644 --- a/source/blender/makesrna/intern/rna_speaker.c +++ b/source/blender/makesrna/intern/rna_speaker.c @@ -96,7 +96,7 @@ static void rna_def_speaker(BlenderRNA *brna) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_range(prop, 0.0f, FLT_MAX); RNA_def_property_ui_text( - prop, "Reference Distance", "Reference distance at which volume is 100 %"); + prop, "Reference Distance", "Reference distance at which volume is 100%"); /* RNA_def_property_float_funcs(prop, NULL, "rna_Speaker_distance_reference_set", NULL); */ /* RNA_def_property_update(prop, 0, "rna_Speaker_update"); */ @@ -125,7 +125,7 @@ static void rna_def_speaker(BlenderRNA *brna) RNA_def_property_ui_text( prop, "Inner Cone Angle", - "Angle of the inner cone, in degrees, inside the cone the volume is 100 %"); + "Angle of the inner cone, in degrees, inside the cone the volume is 100%"); /* RNA_def_property_float_funcs(prop, NULL, "rna_Speaker_cone_angle_inner_set", NULL); */ /* RNA_def_property_update(prop, 0, "rna_Speaker_update"); */ diff --git a/source/blender/makesrna/intern/rna_tracking.c b/source/blender/makesrna/intern/rna_tracking.c index bcf75fb284f..c4a44556cf4 100644 --- a/source/blender/makesrna/intern/rna_tracking.c +++ b/source/blender/makesrna/intern/rna_tracking.c @@ -2001,7 +2001,7 @@ static void rna_def_trackingStabilization(BlenderRNA *brna) "Explicitly scale resulting frame to compensate zoom of original shot"); RNA_def_property_update(prop, NC_MOVIECLIP | ND_DISPLAY, "rna_tracking_flushUpdate"); - /* autoscale */ + /* Auto-scale. */ prop = RNA_def_property(srna, "use_autoscale", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", TRACKING_AUTOSCALE); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c index 1d3a7750c39..5e5b3549986 100644 --- a/source/blender/makesrna/intern/rna_ui.c +++ b/source/blender/makesrna/intern/rna_ui.c @@ -261,9 +261,14 @@ static StructRNA *rna_Panel_register(Main *bmain, Panel dummypanel = {NULL}; PointerRNA dummyptr; int have_function[4]; + size_t over_alloc = 0; /* Warning, if this becomes a mess, we better do another allocation. */ + char _panel_descr[RNA_DYN_DESCR_MAX]; + size_t description_size = 0; /* setup dummy panel & panel type to store static properties in */ dummypanel.type = &dummypt; + _panel_descr[0] = '\0'; + dummypanel.type->description = _panel_descr; RNA_pointer_create(NULL, &RNA_Panel, &dummypanel, &dummyptr); /* We have to set default context! Else we get a void string... */ @@ -355,9 +360,22 @@ static StructRNA *rna_Panel_register(Main *bmain, } /* create a new panel type */ - pt = MEM_mallocN(sizeof(PanelType), "python buttons panel"); + if (_panel_descr[0]) { + description_size = strlen(_panel_descr) + 1; + over_alloc += description_size; + } + pt = MEM_callocN(sizeof(PanelType) + over_alloc, "python buttons panel"); memcpy(pt, &dummypt, sizeof(dummypt)); + if (_panel_descr[0]) { + char *buf = (char *)(pt + 1); + memcpy(buf, _panel_descr, description_size); + pt->description = buf; + } + else { + pt->description = NULL; + } + pt->rna_ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, pt->idname, &RNA_Panel); RNA_def_struct_translation_context(pt->rna_ext.srna, pt->translation_context); pt->rna_ext.data = data; @@ -993,6 +1011,18 @@ static StructRNA *rna_Menu_refine(PointerRNA *mtr) return (menu->type && menu->type->rna_ext.srna) ? menu->type->rna_ext.srna : &RNA_Menu; } +static void rna_Panel_bl_description_set(PointerRNA *ptr, const char *value) +{ + Panel *data = (Panel *)(ptr->data); + char *str = (char *)data->type->description; + if (!str[0]) { + BLI_strncpy(str, value, RNA_DYN_DESCR_MAX); /* utf8 already ensured */ + } + else { + BLI_assert(!"setting the bl_description on a non-builtin panel"); + } +} + static void rna_Menu_bl_description_set(PointerRNA *ptr, const char *value) { Menu *data = (Menu *)(ptr->data); @@ -1408,6 +1438,14 @@ static void rna_def_panel(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL); RNA_define_verify_sdna(true); + prop = RNA_def_property(srna, "bl_description", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "type->description"); + RNA_def_property_string_maxlength(prop, RNA_DYN_DESCR_MAX); /* else it uses the pointer size! */ + RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Panel_bl_description_set"); + /* RNA_def_property_clear_flag(prop, PROP_EDITABLE); */ + RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL); + RNA_def_property_clear_flag(prop, PROP_NEVER_NULL); /* check for NULL */ + prop = RNA_def_property(srna, "bl_category", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "type->category"); RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL); diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index 269a242f074..4a50718c91d 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -274,7 +274,9 @@ static void rna_userdef_gizmo_update(Main *bmain, Scene *scene, PointerRNA *ptr) static void rna_userdef_theme_update_icons(Main *bmain, Scene *scene, PointerRNA *ptr) { - UI_icons_reload_internal_textures(); + if (!G.background) { + UI_icons_reload_internal_textures(); + } rna_userdef_theme_update(bmain, scene, ptr); } @@ -3542,59 +3544,59 @@ static void rna_def_userdef_theme_space_nla(BlenderRNA *brna) prop = RNA_def_property(srna, "strips", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "strip"); RNA_def_property_array(prop, 3); - RNA_def_property_ui_text(prop, "Strips", "Action-Clip Strip - Unselected"); + RNA_def_property_ui_text(prop, "Strips", "Unselected Action-Clip Strip"); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); prop = RNA_def_property(srna, "strips_selected", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "strip_select"); RNA_def_property_array(prop, 3); - RNA_def_property_ui_text(prop, "Strips Selected", "Action-Clip Strip - Selected"); + RNA_def_property_ui_text(prop, "Strips Selected", "Selected Action-Clip Strip"); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); prop = RNA_def_property(srna, "transition_strips", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "nla_transition"); RNA_def_property_array(prop, 3); - RNA_def_property_ui_text(prop, "Transitions", "Transition Strip - Unselected"); + RNA_def_property_ui_text(prop, "Transitions", "Unselected Transition Strip"); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); prop = RNA_def_property(srna, "transition_strips_selected", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "nla_transition_sel"); RNA_def_property_array(prop, 3); - RNA_def_property_ui_text(prop, "Transitions Selected", "Transition Strip - Selected"); + RNA_def_property_ui_text(prop, "Transitions Selected", "Selected Transition Strip"); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); prop = RNA_def_property(srna, "meta_strips", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "nla_meta"); RNA_def_property_array(prop, 3); RNA_def_property_ui_text( - prop, "Meta Strips", "Meta Strip - Unselected (for grouping related strips)"); + prop, "Meta Strips", "Unselected Meta Strip (for grouping related strips)"); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); prop = RNA_def_property(srna, "meta_strips_selected", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "nla_meta_sel"); RNA_def_property_array(prop, 3); RNA_def_property_ui_text( - prop, "Meta Strips Selected", "Meta Strip - Selected (for grouping related strips)"); + prop, "Meta Strips Selected", "Selected Meta Strip (for grouping related strips)"); RNA_def_property_update(prop, 0, "rna_userdef_update"); prop = RNA_def_property(srna, "sound_strips", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "nla_sound"); RNA_def_property_array(prop, 3); RNA_def_property_ui_text( - prop, "Sound Strips", "Sound Strip - Unselected (for timing speaker sounds)"); + prop, "Sound Strips", "Unselected Sound Strip (for timing speaker sounds)"); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); prop = RNA_def_property(srna, "sound_strips_selected", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "nla_sound_sel"); RNA_def_property_array(prop, 3); RNA_def_property_ui_text( - prop, "Sound Strips Selected", "Sound Strip - Selected (for timing speaker sounds)"); + prop, "Sound Strips Selected", "Selected Sound Strip (for timing speaker sounds)"); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); prop = RNA_def_property(srna, "tweak", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "nla_tweaking"); RNA_def_property_array(prop, 3); - RNA_def_property_ui_text(prop, "Tweak", "Color for strip/action being 'tweaked' or edited"); + RNA_def_property_ui_text(prop, "Tweak", "Color for strip/action being \"tweaked\" or edited"); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); prop = RNA_def_property(srna, "tweak_duplicate", PROP_FLOAT, PROP_COLOR_GAMMA); @@ -4866,7 +4868,7 @@ static void rna_def_userdef_view(BlenderRNA *brna) "Translate the names of new data-blocks (objects, materials...)"); RNA_def_property_update(prop, 0, "rna_userdef_update"); - /* Statusbar. */ + /* Status-bar. */ prop = RNA_def_property(srna, "show_statusbar_memory", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "statusbar_flag", STATUSBAR_SHOW_MEMORY); @@ -5830,8 +5832,10 @@ static void rna_def_userdef_input(BlenderRNA *brna) prop = RNA_def_property(srna, "tablet_api", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, tablet_api); - RNA_def_property_ui_text( - prop, "Tablet API", "Select the tablet API to use for pressure sensitivity"); + RNA_def_property_ui_text(prop, + "Tablet API", + "Select the tablet API to use for pressure sensitivity (may require " + "restarting Blender for changes to take effect)"); RNA_def_property_update(prop, 0, "rna_userdef_tablet_api_update"); # ifdef WITH_INPUT_NDOF @@ -6018,7 +6022,7 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna) static const EnumPropertyItem anim_player_presets[] = { {0, "INTERNAL", 0, "Internal", "Built-in animation player"}, - {2, "DJV", 0, "DJV", "Open source frame player: http://djv.sourceforge.net"}, + {2, "DJV", 0, "DJV", "Open source frame player"}, {3, "FRAMECYCLER", 0, "FrameCycler", "Frame player from IRIDAS"}, {4, "RV", 0, "RV", "Frame player from Tweak Software"}, {5, "MPLAYER", 0, "MPlayer", "Media player for video and PNG/JPEG/SGI image sequences"}, diff --git a/source/blender/makesrna/intern/rna_wm_api.c b/source/blender/makesrna/intern/rna_wm_api.c index 6b96562b3f8..cb20b480ee5 100644 --- a/source/blender/makesrna/intern/rna_wm_api.c +++ b/source/blender/makesrna/intern/rna_wm_api.c @@ -647,11 +647,6 @@ static wmEvent *rna_Window_event_add_simulate(wmWindow *win, e.alt = alt; e.oskey = oskey; - e.prevx = win->eventstate->x; - e.prevy = win->eventstate->y; - e.prevval = win->eventstate->val; - e.prevtype = win->eventstate->type; - e.ascii = '\0'; e.utf8_buf[0] = '\0'; if (unicode != NULL) { diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c index 66ccffd53b1..6242e26e251 100644 --- a/source/blender/modifiers/intern/MOD_boolean.c +++ b/source/blender/modifiers/intern/MOD_boolean.c @@ -49,6 +49,7 @@ #include "BKE_lib_query.h" #include "BKE_material.h" #include "BKE_mesh.h" +#include "BKE_mesh_boolean_convert.h" #include "BKE_mesh_wrapper.h" #include "BKE_modifier.h" #include "BKE_screen.h" @@ -70,14 +71,18 @@ #include "tools/bmesh_boolean.h" #include "tools/bmesh_intersect.h" -// #define DEBUG_TIME #ifdef DEBUG_TIME # include "PIL_time.h" # include "PIL_time_utildefines.h" #endif - static void - initData(ModifierData *md) +#ifdef WITH_GMP +const bool bypass_bmesh = true; +#else +const bool bypass_bmesh = false; +#endif + +static void initData(ModifierData *md) { BooleanModifierData *bmd = (BooleanModifierData *)md; @@ -604,6 +609,68 @@ static Mesh *collection_boolean_exact(BooleanModifierData *bmd, return result; } +#ifdef WITH_GMP +/* New method: bypass trip through BMesh. */ +static Mesh *exact_boolean_mesh(BooleanModifierData *bmd, + const ModifierEvalContext *ctx, + Mesh *mesh) +{ + Mesh *result; + Mesh *mesh_operand; + Mesh **meshes = NULL; + const float(**obmats)[4][4] = NULL; + BLI_array_declare(meshes); + BLI_array_declare(obmats); + +# ifdef DEBUG_TIME + TIMEIT_START(boolean_bmesh); +# endif + + BLI_array_append(meshes, mesh); + BLI_array_append(obmats, &ctx->object->obmat); + if (bmd->flag & eBooleanModifierFlag_Object) { + if (bmd->object == NULL) { + return mesh; + } + mesh_operand = BKE_modifier_get_evaluated_mesh_from_evaluated_object(bmd->object, false); + BKE_mesh_wrapper_ensure_mdata(mesh_operand); + BLI_array_append(meshes, mesh_operand); + BLI_array_append(obmats, &bmd->object->obmat); + } + else if (bmd->flag & eBooleanModifierFlag_Collection) { + Collection *collection = bmd->collection; + /* Allow collection to be empty: then target mesh will just removed self-intersections. */ + if (collection) { + FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN (collection, ob) { + if (ob->type == OB_MESH && ob != ctx->object) { + Mesh *collection_mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(ob, false); + BKE_mesh_wrapper_ensure_mdata(collection_mesh); + BLI_array_append(meshes, collection_mesh); + BLI_array_append(obmats, &ob->obmat); + } + } + FOREACH_COLLECTION_OBJECT_RECURSIVE_END; + } + } + + const bool use_self = (bmd->flag & eBooleanModifierFlag_Self) != 0; + result = BKE_mesh_boolean((const Mesh **)meshes, + (const float(**)[4][4])obmats, + BLI_array_len(meshes), + use_self, + bmd->operation); + + BLI_array_free(meshes); + BLI_array_free(obmats); + +# ifdef DEBUG_TIME + TIMEIT_END(boolean_bmesh); +# endif + + return result; +} +#endif + static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh) { BooleanModifierData *bmd = (BooleanModifierData *)md; @@ -611,12 +678,15 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * Mesh *result = mesh; Mesh *mesh_operand_ob; BMesh *bm; - Collection *col = bmd->collection; + Collection *collection = bmd->collection; bool is_flip = false; const bool confirm_return = true; #ifdef WITH_GMP const bool use_exact = bmd->solver == eBooleanModifierSolver_Exact; + if (use_exact && bypass_bmesh) { + return exact_boolean_mesh(bmd, ctx, mesh); + } #else const bool use_exact = false; #endif @@ -696,12 +766,12 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * } else { - if (col == NULL && !use_exact) { + if (collection == NULL && !use_exact) { return result; } /* Return result for certain errors. */ - if (BMD_error_messages(ctx->object, md, col) == confirm_return) { + if (BMD_error_messages(ctx->object, md, collection) == confirm_return) { return result; } @@ -709,7 +779,7 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * result = collection_boolean_exact(bmd, ctx, mesh); } else { - FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN (col, operand_ob) { + FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN (collection, operand_ob) { if (operand_ob->type == OB_MESH && operand_ob != ctx->object) { mesh_operand_ob = BKE_modifier_get_evaluated_mesh_from_evaluated_object(operand_ob, diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c index 4bd306e7679..a94dd6da477 100644 --- a/source/blender/modifiers/intern/MOD_meshdeform.c +++ b/source/blender/modifiers/intern/MOD_meshdeform.c @@ -24,6 +24,7 @@ #include "BLI_utildefines.h" #include "BLI_math.h" +#include "BLI_simd.h" #include "BLI_task.h" #include "BLT_translation.h" @@ -61,10 +62,6 @@ #include "MOD_ui_common.h" #include "MOD_util.h" -#ifdef __SSE2__ -# include -#endif - static void initData(ModifierData *md) { MeshDeformModifierData *mmd = (MeshDeformModifierData *)md; @@ -188,7 +185,7 @@ static float meshdeform_dynamic_bind(MeshDeformModifierData *mmd, float (*dco)[3 float gridvec[3], dvec[3], ivec[3], wx, wy, wz; float weight, cageweight, totweight, *cageco; int i, j, a, x, y, z, size; -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 __m128 co = _mm_setzero_ps(); #else float co[3] = {0.0f, 0.0f, 0.0f}; @@ -243,7 +240,7 @@ static float meshdeform_dynamic_bind(MeshDeformModifierData *mmd, float (*dco)[3 for (j = 0; j < cell->totinfluence; j++, inf++) { cageco = dco[inf->vertex]; cageweight = weight * inf->weight; -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 { __m128 cageweight_r = _mm_set1_ps(cageweight); /* This will load one extra element, this is ok because @@ -261,7 +258,7 @@ static float meshdeform_dynamic_bind(MeshDeformModifierData *mmd, float (*dco)[3 } } -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 copy_v3_v3(vec, (float *)&co); #else copy_v3_v3(vec, co); diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc index 23bfe76a5c3..c7731815a2a 100644 --- a/source/blender/modifiers/intern/MOD_nodes.cc +++ b/source/blender/modifiers/intern/MOD_nodes.cc @@ -50,6 +50,7 @@ #include "BKE_lib_query.h" #include "BKE_mesh.h" #include "BKE_modifier.h" +#include "BKE_node_ui_storage.hh" #include "BKE_pointcloud.h" #include "BKE_screen.h" #include "BKE_simulation.h" @@ -81,6 +82,7 @@ using blender::Map; using blender::Set; using blender::Span; using blender::StringRef; +using blender::StringRefNull; using blender::Vector; using blender::bke::PersistentCollectionHandle; using blender::bke::PersistentDataHandleMap; @@ -150,6 +152,40 @@ static void find_used_ids_from_settings(const NodesModifierSettings &settings, S &ids); } +static void add_collection_object_relations_recursive(const ModifierUpdateDepsgraphContext *ctx, + Collection &collection); + +static void add_object_relation(const ModifierUpdateDepsgraphContext *ctx, Object &object) +{ + DEG_add_object_relation(ctx->node, &object, DEG_OB_COMP_TRANSFORM, "Nodes Modifier"); + if (&(ID &)object != &ctx->object->id) { + if (object.type == OB_EMPTY) { + Collection *collection_instance = object.instance_collection; + if (collection_instance != nullptr) { + add_collection_object_relations_recursive(ctx, *collection_instance); + } + } + else { + DEG_add_object_relation(ctx->node, &object, DEG_OB_COMP_GEOMETRY, "Nodes Modifier"); + } + } +} + +static void add_collection_object_relations_recursive(const ModifierUpdateDepsgraphContext *ctx, + Collection &collection) +{ + LISTBASE_FOREACH (CollectionObject *, collection_object, &collection.gobject) { + BLI_assert(collection_object->ob != nullptr); + Object &object = *collection_object->ob; + add_object_relation(ctx, object); + } + LISTBASE_FOREACH (CollectionChild *, collection_child, &collection.children) { + BLI_assert(collection_child->collection != nullptr); + Collection &collection = *collection_child->collection; + add_collection_object_relations_recursive(ctx, collection); + } +} + static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { NodesModifierData *nmd = reinterpret_cast(md); @@ -163,18 +199,16 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte for (ID *id : used_ids) { if (GS(id->name) == ID_OB) { Object *object = reinterpret_cast(id); - DEG_add_object_relation(ctx->node, object, DEG_OB_COMP_TRANSFORM, "Nodes Modifier"); - if (id != &ctx->object->id) { - if (object->type != OB_EMPTY) { - DEG_add_object_relation( - ctx->node, (Object *)id, DEG_OB_COMP_GEOMETRY, "Nodes Modifier"); - } - } + add_object_relation(ctx, *object); + } + if (GS(id->name) == ID_GR) { + Collection *collection = reinterpret_cast(id); + add_collection_object_relations_recursive(ctx, *collection); } } } - /* TODO: Add dependency for collection changes. */ + /* TODO: Add dependency for adding and removing objects in collections. */ } static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData) @@ -221,6 +255,7 @@ class GeometryNodesEvaluator { const blender::nodes::DataTypeConversions &conversions_; const PersistentDataHandleMap &handle_map_; const Object *self_object_; + const ModifierData *modifier_; Depsgraph *depsgraph_; public: @@ -229,12 +264,14 @@ class GeometryNodesEvaluator { blender::nodes::MultiFunctionByNode &mf_by_node, const PersistentDataHandleMap &handle_map, const Object *self_object, + const ModifierData *modifier, Depsgraph *depsgraph) : group_outputs_(std::move(group_outputs)), mf_by_node_(mf_by_node), conversions_(blender::nodes::get_implicit_type_conversions()), handle_map_(handle_map), self_object_(self_object), + modifier_(modifier), depsgraph_(depsgraph) { for (auto item : group_input_data.items()) { @@ -308,7 +345,6 @@ class GeometryNodesEvaluator { void compute_output_and_forward(const DOutputSocket &socket_to_compute) { const DNode &node = socket_to_compute.node(); - const bNode &bnode = *node.bnode(); if (!socket_to_compute.is_available()) { /* If the output is not available, use a default value. */ @@ -337,7 +373,7 @@ class GeometryNodesEvaluator { /* Execute the node. */ GValueMap node_outputs_map{allocator_}; GeoNodeExecParams params{ - bnode, node_inputs_map, node_outputs_map, handle_map_, self_object_, depsgraph_}; + node, node_inputs_map, node_outputs_map, handle_map_, self_object_, modifier_, depsgraph_}; this->execute_node(node, params); /* Forward computed outputs to linked input sockets. */ @@ -353,6 +389,8 @@ class GeometryNodesEvaluator { { const bNode &bnode = params.node(); + this->store_ui_hints(node, params); + /* Use the geometry-node-execute callback if it exists. */ if (bnode.typeinfo->geometry_node_execute != nullptr) { bnode.typeinfo->geometry_node_execute(params); @@ -370,6 +408,33 @@ class GeometryNodesEvaluator { this->execute_unknown_node(node, params); } + void store_ui_hints(const DNode &node, GeoNodeExecParams params) const + { + for (const DInputSocket *dsocket : node.inputs()) { + if (!dsocket->is_available()) { + continue; + } + if (dsocket->bsocket()->type != SOCK_GEOMETRY) { + continue; + } + + bNodeTree *btree_cow = node.node_ref().tree().btree(); + bNodeTree *btree_original = (bNodeTree *)DEG_get_original_id((ID *)btree_cow); + const NodeTreeEvaluationContext context(*self_object_, *modifier_); + + const GeometrySet &geometry_set = params.get_input(dsocket->identifier()); + const Vector components = geometry_set.get_components_for_read(); + + for (const GeometryComponent *component : components) { + component->attribute_foreach([&](StringRefNull attribute_name, + const AttributeMetaData &UNUSED(meta_data)) { + BKE_nodetree_attribute_hint_add(*btree_original, context, *node.bnode(), attribute_name); + return true; + }); + } + } + } + void execute_multi_function_node(const DNode &node, GeoNodeExecParams params, const MultiFunction &fn) @@ -924,6 +989,19 @@ static void fill_data_handle_map(const NodesModifierSettings &settings, } } +static void reset_tree_ui_storage(Span trees, + const Object &object, + const ModifierData &modifier) +{ + const NodeTreeEvaluationContext context = {object, modifier}; + + for (const blender::nodes::NodeTreeRef *tree : trees) { + bNodeTree *btree_cow = tree->btree(); + bNodeTree *btree_original = (bNodeTree *)DEG_get_original_id((ID *)btree_cow); + BKE_nodetree_ui_storage_free_for_context(*btree_original, context); + } +} + /** * Evaluate a node group to compute the output geometry. * Currently, this uses a fairly basic and inefficient algorithm that might compute things more @@ -970,8 +1048,14 @@ static GeometrySet compute_geometry(const DerivedNodeTree &tree, Vector group_outputs; group_outputs.append(&socket_to_compute); - GeometryNodesEvaluator evaluator{ - group_inputs, group_outputs, mf_by_node, handle_map, ctx->object, ctx->depsgraph}; + GeometryNodesEvaluator evaluator{group_inputs, + group_outputs, + mf_by_node, + handle_map, + ctx->object, + (ModifierData *)nmd, + ctx->depsgraph}; + Vector results = evaluator.execute(); BLI_assert(results.size() == 1); GMutablePointer result = results[0]; @@ -1069,6 +1153,8 @@ static void modifyGeometry(ModifierData *md, return; } + reset_tree_ui_storage(tree.used_node_tree_refs(), *ctx->object, *md); + geometry_set = compute_geometry( tree, group_inputs, *group_outputs[0], std::move(geometry_set), nmd, ctx); } diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt index a209faa5d17..8c5081555fc 100644 --- a/source/blender/nodes/CMakeLists.txt +++ b/source/blender/nodes/CMakeLists.txt @@ -26,6 +26,7 @@ set(INC intern shader texture + ../editors/include ../blenkernel ../blenlib ../blentranslation @@ -134,6 +135,7 @@ set(SRC function/nodes/node_fn_combine_strings.cc function/nodes/node_fn_float_compare.cc function/nodes/node_fn_group_instance_id.cc + function/nodes/node_fn_input_string.cc function/nodes/node_fn_input_vector.cc function/nodes/node_fn_object_transforms.cc function/nodes/node_fn_random_float.cc @@ -142,13 +144,15 @@ set(SRC geometry/nodes/node_geo_align_rotation_to_vector.cc geometry/nodes/node_geo_attribute_color_ramp.cc + geometry/nodes/node_geo_attribute_combine_xyz.cc geometry/nodes/node_geo_attribute_compare.cc geometry/nodes/node_geo_attribute_fill.cc geometry/nodes/node_geo_attribute_math.cc geometry/nodes/node_geo_attribute_mix.cc - geometry/nodes/node_geo_attribute_sample_texture.cc geometry/nodes/node_geo_attribute_proximity.cc geometry/nodes/node_geo_attribute_randomize.cc + geometry/nodes/node_geo_attribute_sample_texture.cc + geometry/nodes/node_geo_attribute_separate_xyz.cc geometry/nodes/node_geo_attribute_vector_math.cc geometry/nodes/node_geo_boolean.cc geometry/nodes/node_geo_collection_info.cc @@ -165,6 +169,7 @@ set(SRC geometry/nodes/node_geo_point_translate.cc geometry/nodes/node_geo_points_to_volume.cc geometry/nodes/node_geo_subdivision_surface.cc + geometry/nodes/node_geo_subdivision_surface_simple.cc geometry/nodes/node_geo_transform.cc geometry/nodes/node_geo_triangulate.cc geometry/nodes/node_geo_volume_to_mesh.cc @@ -354,6 +359,9 @@ if(WITH_INTERNATIONAL) endif() if(WITH_TBB) + list(APPEND INC_SYS + ${TBB_INCLUDE_DIRS} + ) add_definitions(-DWITH_TBB) endif() diff --git a/source/blender/nodes/NOD_function.h b/source/blender/nodes/NOD_function.h index b5279f7d914..6b184f04af7 100644 --- a/source/blender/nodes/NOD_function.h +++ b/source/blender/nodes/NOD_function.h @@ -24,6 +24,7 @@ void register_node_type_fn_boolean_math(void); void register_node_type_fn_combine_strings(void); void register_node_type_fn_float_compare(void); void register_node_type_fn_group_instance_id(void); +void register_node_type_fn_input_string(void); void register_node_type_fn_input_vector(void); void register_node_type_fn_object_transforms(void); void register_node_type_fn_random_float(void); diff --git a/source/blender/nodes/NOD_geometry.h b/source/blender/nodes/NOD_geometry.h index 39338ab14dc..3ee8067e81a 100644 --- a/source/blender/nodes/NOD_geometry.h +++ b/source/blender/nodes/NOD_geometry.h @@ -28,12 +28,14 @@ void register_node_type_geo_group(void); void register_node_type_geo_align_rotation_to_vector(void); void register_node_type_geo_attribute_color_ramp(void); +void register_node_type_geo_attribute_combine_xyz(void); void register_node_type_geo_attribute_compare(void); void register_node_type_geo_attribute_fill(void); void register_node_type_geo_attribute_math(void); void register_node_type_geo_attribute_mix(void); void register_node_type_geo_attribute_proximity(void); void register_node_type_geo_attribute_randomize(void); +void register_node_type_geo_attribute_separate_xyz(void); void register_node_type_geo_attribute_vector_math(void); void register_node_type_geo_boolean(void); void register_node_type_geo_collection_info(void); @@ -50,6 +52,7 @@ void register_node_type_geo_point_translate(void); void register_node_type_geo_points_to_volume(void); void register_node_type_geo_sample_texture(void); void register_node_type_geo_subdivision_surface(void); +void register_node_type_geo_subdivision_surface_simple(void); void register_node_type_geo_transform(void); void register_node_type_geo_triangulate(void); void register_node_type_geo_volume_to_mesh(void); diff --git a/source/blender/nodes/NOD_geometry_exec.hh b/source/blender/nodes/NOD_geometry_exec.hh index 91d46e3951f..e648d77337b 100644 --- a/source/blender/nodes/NOD_geometry_exec.hh +++ b/source/blender/nodes/NOD_geometry_exec.hh @@ -20,11 +20,16 @@ #include "BKE_attribute_access.hh" #include "BKE_geometry_set.hh" +#include "BKE_geometry_set_instances.hh" +#include "BKE_node_ui_storage.hh" #include "BKE_persistent_data_handle.hh" #include "DNA_node_types.h" +#include "NOD_derived_node_tree.hh" + struct Depsgraph; +struct ModifierData; namespace blender::nodes { @@ -38,6 +43,7 @@ using bke::Float3ReadAttribute; using bke::Float3WriteAttribute; using bke::FloatReadAttribute; using bke::FloatWriteAttribute; +using bke::geometry_set_realize_instances; using bke::Int32ReadAttribute; using bke::Int32WriteAttribute; using bke::PersistentDataHandleMap; @@ -53,25 +59,28 @@ using fn::GValueMap; class GeoNodeExecParams { private: - const bNode &node_; + const DNode &node_; GValueMap &input_values_; GValueMap &output_values_; const PersistentDataHandleMap &handle_map_; const Object *self_object_; + const ModifierData *modifier_; Depsgraph *depsgraph_; public: - GeoNodeExecParams(const bNode &node, + GeoNodeExecParams(const DNode &node, GValueMap &input_values, GValueMap &output_values, const PersistentDataHandleMap &handle_map, const Object *self_object, + const ModifierData *modifier, Depsgraph *depsgraph) : node_(node), input_values_(input_values), output_values_(output_values), handle_map_(handle_map), self_object_(self_object), + modifier_(modifier), depsgraph_(depsgraph) { } @@ -124,11 +133,8 @@ class GeoNodeExecParams { /** * Get the input value for the input socket with the given identifier. - * - * This makes a copy of the value, which is fine for most types but should be avoided for - * geometry sets. */ - template T get_input(StringRef identifier) const + template const T &get_input(StringRef identifier) const { #ifdef DEBUG this->check_extract_input(identifier, &CPPType::get()); @@ -176,7 +182,7 @@ class GeoNodeExecParams { */ const bNode &node() const { - return node_; + return *node_.bnode(); } const PersistentDataHandleMap &handle_map() const @@ -194,9 +200,18 @@ class GeoNodeExecParams { return depsgraph_; } + /** + * Add an error message displayed at the top of the node when displaying the node tree, + * and potentially elsewhere in Blender. + */ + void error_message_add(const NodeWarningType type, std::string message) const; + /** * Creates a read-only attribute based on node inputs. The method automatically detects which - * input with the given name is available. + * input socket with the given name is available. + * + * \note This will add an error message if the string socket is active and + * the input attribute does not exist. */ ReadAttributePtr get_input_attribute(const StringRef name, const GeometryComponent &component, @@ -222,6 +237,10 @@ class GeoNodeExecParams { const GeometryComponent &component, const CustomDataType default_type) const; + AttributeDomain get_highest_priority_input_domain(Span names, + const GeometryComponent &component, + const AttributeDomain default_domain) const; + private: /* Utilities for detecting common errors at when using this class. */ void check_extract_input(StringRef identifier, const CPPType *requested_type = nullptr) const; diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h index 980790af766..35550bdec48 100644 --- a/source/blender/nodes/NOD_static_types.h +++ b/source/blender/nodes/NOD_static_types.h @@ -267,6 +267,7 @@ DefNode(FunctionNode, FN_NODE_COMBINE_STRINGS, 0, "COMBINE_STRINGS DefNode(FunctionNode, FN_NODE_OBJECT_TRANSFORMS, 0, "OBJECT_TRANSFORMS", ObjectTransforms, "Object Transforms", "") DefNode(FunctionNode, FN_NODE_RANDOM_FLOAT, 0, "RANDOM_FLOAT", RandomFloat, "Random Float", "") DefNode(FunctionNode, FN_NODE_INPUT_VECTOR, def_fn_input_vector, "INPUT_VECTOR", InputVector, "Vector", "") +DefNode(FunctionNode, FN_NODE_INPUT_STRING, def_fn_input_string, "INPUT_STRING", InputString, "String", "") DefNode(GeometryNode, GEO_NODE_TRIANGULATE, def_geo_triangulate, "TRIANGULATE", Triangulate, "Triangulate", "") DefNode(GeometryNode, GEO_NODE_EDGE_SPLIT, 0, "EDGE_SPLIT", EdgeSplit, "Edge Split", "") @@ -295,6 +296,9 @@ DefNode(GeometryNode, GEO_NODE_COLLECTION_INFO, def_geo_collection_info, "COLLEC DefNode(GeometryNode, GEO_NODE_IS_VIEWPORT, 0, "IS_VIEWPORT", IsViewport, "Is Viewport", "") DefNode(GeometryNode, GEO_NODE_ATTRIBUTE_PROXIMITY, def_geo_attribute_proximity, "ATTRIBUTE_PROXIMITY", AttributeProximity, "Attribute Proximity", "") DefNode(GeometryNode, GEO_NODE_VOLUME_TO_MESH, def_geo_volume_to_mesh, "VOLUME_TO_MESH", VolumeToMesh, "Volume to Mesh", "") +DefNode(GeometryNode, GEO_NODE_ATTRIBUTE_COMBINE_XYZ, def_geo_attribute_combine_xyz, "ATTRIBUTE_COMBINE_XYZ", AttributeCombineXYZ, "Attribute Combine XYZ", "") +DefNode(GeometryNode, GEO_NODE_ATTRIBUTE_SEPARATE_XYZ, def_geo_attribute_separate_xyz, "ATTRIBUTE_SEPARATE_XYZ", AttributeSeparateXYZ, "Attribute Separate XYZ", "") +DefNode(GeometryNode, GEO_NODE_SUBDIVISION_SURFACE_SIMPLE, 0, "SUBDIVISION_SURFACE_SIMPLE", SubdivisionSurfaceSimple, "Simple Subdivision Surface", "") /* undefine macros */ #undef DefNode diff --git a/source/blender/nodes/function/nodes/node_fn_boolean_math.cc b/source/blender/nodes/function/nodes/node_fn_boolean_math.cc index 9148cef7805..7a83ff8e016 100644 --- a/source/blender/nodes/function/nodes/node_fn_boolean_math.cc +++ b/source/blender/nodes/function/nodes/node_fn_boolean_math.cc @@ -19,6 +19,9 @@ #include "RNA_enum_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "node_function_util.hh" static bNodeSocketTemplate fn_node_boolean_math_in[] = { @@ -32,6 +35,11 @@ static bNodeSocketTemplate fn_node_boolean_math_out[] = { {-1, ""}, }; +static void fn_node_boolean_math_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "operation", 0, "", ICON_NONE); +} + static void node_boolean_math_update(bNodeTree *UNUSED(ntree), bNode *node) { bNodeSocket *sockB = (bNodeSocket *)BLI_findlink(&node->inputs, 1); @@ -86,5 +94,6 @@ void register_node_type_fn_boolean_math() node_type_label(&ntype, node_boolean_math_label); node_type_update(&ntype, node_boolean_math_update); ntype.expand_in_mf_network = node_boolean_expand_in_mf_network; + ntype.draw_buttons = fn_node_boolean_math_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/function/nodes/node_fn_float_compare.cc b/source/blender/nodes/function/nodes/node_fn_float_compare.cc index 93c79a48571..6c8df8f2ea0 100644 --- a/source/blender/nodes/function/nodes/node_fn_float_compare.cc +++ b/source/blender/nodes/function/nodes/node_fn_float_compare.cc @@ -21,6 +21,9 @@ #include "RNA_enum_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "node_function_util.hh" static bNodeSocketTemplate fn_node_float_compare_in[] = { @@ -35,6 +38,11 @@ static bNodeSocketTemplate fn_node_float_compare_out[] = { {-1, ""}, }; +static void geo_node_float_compare_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "operation", 0, "", ICON_NONE); +} + static void node_float_compare_update(bNodeTree *UNUSED(ntree), bNode *node) { bNodeSocket *sockEpsilon = (bNodeSocket *)BLI_findlink(&node->inputs, 2); @@ -105,5 +113,6 @@ void register_node_type_fn_float_compare() node_type_label(&ntype, node_float_compare_label); node_type_update(&ntype, node_float_compare_update); ntype.expand_in_mf_network = node_float_compare_expand_in_mf_network; + ntype.draw_buttons = geo_node_float_compare_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/function/nodes/node_fn_input_string.cc b/source/blender/nodes/function/nodes/node_fn_input_string.cc new file mode 100644 index 00000000000..f16bdef2f38 --- /dev/null +++ b/source/blender/nodes/function/nodes/node_fn_input_string.cc @@ -0,0 +1,84 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "node_function_util.hh" + +#include "UI_interface.h" +#include "UI_resources.h" + +static bNodeSocketTemplate fn_node_input_string_out[] = { + {SOCK_STRING, N_("String")}, + {-1, ""}, +}; + +static void fn_node_input_string_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "string", 0, "", ICON_NONE); +} + +static void fn_node_input_string_expand_in_mf_network( + blender::nodes::NodeMFNetworkBuilder &builder) +{ + bNode &bnode = builder.bnode(); + NodeInputString *node_storage = static_cast(bnode.storage); + std::string string = std::string((node_storage->string) ? node_storage->string : ""); + + builder.construct_and_set_matching_fn>(string); +} + +static void fn_node_input_string_init(bNodeTree *UNUSED(ntree), bNode *node) +{ + node->storage = MEM_callocN(sizeof(NodeInputString), __func__); +} + +static void fn_node_input_string_free(bNode *node) +{ + NodeInputString *storage = (NodeInputString *)node->storage; + if (storage == nullptr) { + return; + } + if (storage->string != nullptr) { + MEM_freeN(storage->string); + } + MEM_freeN(storage); +} + +static void fn_node_string_copy(bNodeTree *UNUSED(dest_ntree), + bNode *dest_node, + const bNode *src_node) +{ + NodeInputString *source_storage = (NodeInputString *)src_node->storage; + NodeInputString *destination_storage = (NodeInputString *)MEM_dupallocN(source_storage); + + if (source_storage->string) { + destination_storage->string = (char *)MEM_dupallocN(source_storage->string); + } + + dest_node->storage = destination_storage; +} + +void register_node_type_fn_input_string() +{ + static bNodeType ntype; + + fn_node_type_base(&ntype, FN_NODE_INPUT_STRING, "String", NODE_CLASS_INPUT, 0); + node_type_socket_templates(&ntype, nullptr, fn_node_input_string_out); + node_type_init(&ntype, fn_node_input_string_init); + node_type_storage(&ntype, "NodeInputString", fn_node_input_string_free, fn_node_string_copy); + ntype.expand_in_mf_network = fn_node_input_string_expand_in_mf_network; + ntype.draw_buttons = fn_node_input_string_layout; + nodeRegisterType(&ntype); +} diff --git a/source/blender/nodes/function/nodes/node_fn_input_vector.cc b/source/blender/nodes/function/nodes/node_fn_input_vector.cc index c2707f6307a..2cd4eb1d9df 100644 --- a/source/blender/nodes/function/nodes/node_fn_input_vector.cc +++ b/source/blender/nodes/function/nodes/node_fn_input_vector.cc @@ -18,11 +18,20 @@ #include "BLI_hash.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate fn_node_input_vector_out[] = { {SOCK_VECTOR, N_("Vector")}, {-1, ""}, }; +static void fn_node_input_vector_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiLayout *col = uiLayoutColumn(layout, true); + uiItemR(col, ptr, "vector", UI_ITEM_R_EXPAND, "", ICON_NONE); +} + static void fn_node_vector_input_expand_in_mf_network( blender::nodes::NodeMFNetworkBuilder &builder) { @@ -50,6 +59,6 @@ void register_node_type_fn_input_vector() node_type_storage( &ntype, "NodeInputVector", node_free_standard_storage, node_copy_standard_storage); ntype.expand_in_mf_network = fn_node_vector_input_expand_in_mf_network; - + ntype.draw_buttons = fn_node_input_vector_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/function/nodes/node_fn_switch.cc b/source/blender/nodes/function/nodes/node_fn_switch.cc index 281ddb05c76..5187decbbe5 100644 --- a/source/blender/nodes/function/nodes/node_fn_switch.cc +++ b/source/blender/nodes/function/nodes/node_fn_switch.cc @@ -15,8 +15,17 @@ */ #include "BLI_listbase.h" + +#include "UI_interface.h" +#include "UI_resources.h" + #include "node_function_util.hh" +static void fn_node_switch_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "data_type", 0, "", ICON_NONE); +} + static bNodeSocketTemplate fn_node_switch_in[] = { {SOCK_BOOLEAN, N_("Switch")}, @@ -72,5 +81,6 @@ void register_node_type_fn_switch() fn_node_type_base(&ntype, FN_NODE_SWITCH, "Switch", 0, 0); node_type_socket_templates(&ntype, fn_node_switch_in, fn_node_switch_out); node_type_update(&ntype, fn_node_switch_update); + ntype.draw_buttons = fn_node_switch_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/node_geometry_util.cc b/source/blender/nodes/geometry/node_geometry_util.cc index daaccf4450b..0f725ecf211 100644 --- a/source/blender/nodes/geometry/node_geometry_util.cc +++ b/source/blender/nodes/geometry/node_geometry_util.cc @@ -17,8 +17,17 @@ #include "node_geometry_util.hh" #include "node_util.h" +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" + +#include "BKE_mesh.h" +#include "BKE_mesh_runtime.h" +#include "BKE_pointcloud.h" + namespace blender::nodes { +using bke::GeometryInstanceGroup; + /** * Update the availability of a group of input sockets with the same name, * used for switching between attribute inputs or single values. @@ -45,50 +54,6 @@ void update_attribute_input_socket_availabilities(bNode &node, } } -static int attribute_data_type_complexity(const CustomDataType data_type) -{ - switch (data_type) { - case CD_PROP_BOOL: - return 0; - case CD_PROP_INT32: - return 1; - case CD_PROP_FLOAT: - return 2; - case CD_PROP_FLOAT2: - return 3; - case CD_PROP_FLOAT3: - return 4; - case CD_PROP_COLOR: - return 5; -#if 0 /* These attribute types are not supported yet. */ - case CD_MLOOPCOL: - return 3; - case CD_PROP_STRING: - return 6; -#endif - default: - /* Only accept "generic" custom data types used by the attribute system. */ - BLI_assert(false); - return 0; - } -} - -CustomDataType attribute_data_type_highest_complexity(Span data_types) -{ - int highest_complexity = INT_MIN; - CustomDataType most_complex_type = CD_PROP_COLOR; - - for (const CustomDataType data_type : data_types) { - const int complexity = attribute_data_type_complexity(data_type); - if (complexity > highest_complexity) { - highest_complexity = complexity; - most_complex_type = data_type; - } - } - - return most_complex_type; -} - } // namespace blender::nodes bool geo_node_poll_default(bNodeType *UNUSED(ntype), bNodeTree *ntree) diff --git a/source/blender/nodes/geometry/node_geometry_util.hh b/source/blender/nodes/geometry/node_geometry_util.hh index b7b2afeefcb..271e3771006 100644 --- a/source/blender/nodes/geometry/node_geometry_util.hh +++ b/source/blender/nodes/geometry/node_geometry_util.hh @@ -44,8 +44,6 @@ void update_attribute_input_socket_availabilities(bNode &node, const GeometryNodeAttributeInputMode mode, const bool name_is_available = true); -CustomDataType attribute_data_type_highest_complexity(Span); - Array get_geometry_element_ids_as_uints(const GeometryComponent &component, const AttributeDomain domain); diff --git a/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc b/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc index bdec3599bfa..fca460e3566 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc @@ -18,6 +18,9 @@ #include "BLI_math_rotation.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate geo_node_align_rotation_to_vector_in[] = { {SOCK_GEOMETRY, N_("Geometry")}, {SOCK_STRING, N_("Factor")}, @@ -32,6 +35,19 @@ static bNodeSocketTemplate geo_node_align_rotation_to_vector_out[] = { {-1, ""}, }; +static void geo_node_align_rotation_to_vector_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *ptr) +{ + uiItemR(layout, ptr, "axis", UI_ITEM_R_EXPAND, nullptr, ICON_NONE); + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + uiItemR(layout, ptr, "pivot_axis", 0, IFACE_("Pivot"), ICON_NONE); + uiLayout *col = uiLayoutColumn(layout, false); + uiItemR(col, ptr, "input_type_factor", 0, IFACE_("Factor"), ICON_NONE); + uiItemR(col, ptr, "input_type_vector", 0, IFACE_("Vector"), ICON_NONE); +} + namespace blender::nodes { static void align_rotations_auto_pivot(const Float3ReadAttribute &vectors, @@ -51,7 +67,16 @@ static void align_rotations_auto_pivot(const Float3ReadAttribute &vectors, mul_v3_m3v3(old_axis, old_rotation, local_main_axis); const float3 new_axis = vector.normalized(); - const float3 rotation_axis = float3::cross_high_precision(old_axis, new_axis); + float3 rotation_axis = float3::cross_high_precision(old_axis, new_axis); + if (is_zero_v3(rotation_axis)) { + /* The vectors are linearly dependent, so we fall back to another axis. */ + rotation_axis = float3::cross_high_precision(old_axis, float3(1, 0, 0)); + if (is_zero_v3(rotation_axis)) { + /* This is now guaranteed to not be zero. */ + rotation_axis = float3::cross_high_precision(old_axis, float3(0, 1, 0)); + } + } + const float full_angle = angle_normalized_v3v3(old_axis, new_axis); const float angle = factors[i] * full_angle; @@ -149,6 +174,8 @@ static void geo_node_align_rotation_to_vector_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { align_rotations_on_component(geometry_set.get_component_for_write(), params); } @@ -202,5 +229,6 @@ void register_node_type_geo_align_rotation_to_vector() node_free_standard_storage, node_copy_standard_storage); ntype.geometry_node_execute = blender::nodes::geo_node_align_rotation_to_vector_exec; + ntype.draw_buttons = geo_node_align_rotation_to_vector_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc index 9b0900e19ab..98bf612f589 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc @@ -18,6 +18,9 @@ #include "BKE_colorband.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate geo_node_attribute_color_ramp_in[] = { {SOCK_GEOMETRY, N_("Geometry")}, {SOCK_STRING, N_("Attribute")}, @@ -30,29 +33,53 @@ static bNodeSocketTemplate geo_node_attribute_color_ramp_out[] = { {-1, ""}, }; +static void geo_node_attribute_color_ramp_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *ptr) +{ + uiTemplateColorRamp(layout, ptr, "color_ramp", false); +} + namespace blender::nodes { +static AttributeDomain get_result_domain(const GeometryComponent &component, + StringRef input_name, + StringRef result_name) +{ + /* Use the domain of the result attribute if it already exists. */ + ReadAttributePtr result_attribute = component.attribute_try_get_for_read(result_name); + if (result_attribute) { + return result_attribute->domain(); + } + + /* Otherwise use the input attribute's domain if it exists. */ + ReadAttributePtr input_attribute = component.attribute_try_get_for_read(input_name); + if (input_attribute) { + return input_attribute->domain(); + } + + return ATTR_DOMAIN_POINT; +} + static void execute_on_component(const GeoNodeExecParams ¶ms, GeometryComponent &component) { const bNode &bnode = params.node(); NodeAttributeColorRamp *node_storage = (NodeAttributeColorRamp *)bnode.storage; + const std::string result_name = params.get_input("Result"); + const std::string input_name = params.get_input("Attribute"); /* Always output a color attribute for now. We might want to allow users to customize. * Using the type of an existing attribute could work, but does not have a real benefit * currently. */ const CustomDataType result_type = CD_PROP_COLOR; + const AttributeDomain result_domain = get_result_domain(component, input_name, result_name); - const std::string result_name = params.get_input("Result"); - /* Once we support more domains at the user level, we have to decide how the result domain is - * chosen. */ - const AttributeDomain result_domain = ATTR_DOMAIN_POINT; OutputAttributePtr attribute_result = component.attribute_try_get_for_output( result_name, result_domain, result_type); if (!attribute_result) { return; } - const std::string input_name = params.get_input("Attribute"); FloatReadAttribute attribute_in = component.attribute_get_for_read( input_name, result_domain, 0.0f); @@ -71,6 +98,8 @@ static void geo_node_attribute_color_ramp_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { execute_on_component(params, geometry_set.get_component_for_write()); } @@ -104,5 +133,6 @@ void register_node_type_geo_attribute_color_ramp() node_type_init(&ntype, blender::nodes::geo_node_attribute_color_ramp_init); node_type_size_preset(&ntype, NODE_SIZE_LARGE); ntype.geometry_node_execute = blender::nodes::geo_node_attribute_color_ramp_exec; + ntype.draw_buttons = geo_node_attribute_color_ramp_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc new file mode 100644 index 00000000000..9c5c7e270b1 --- /dev/null +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc @@ -0,0 +1,153 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "node_geometry_util.hh" + +#include "UI_interface.h" +#include "UI_resources.h" + +static bNodeSocketTemplate geo_node_attribute_combine_xyz_in[] = { + {SOCK_GEOMETRY, N_("Geometry")}, + {SOCK_STRING, N_("X")}, + {SOCK_FLOAT, N_("X"), 0.0, 0.0, 0.0, 0.0, -FLT_MAX, FLT_MAX}, + {SOCK_STRING, N_("Y")}, + {SOCK_FLOAT, N_("Y"), 0.0, 0.0, 0.0, 0.0, -FLT_MAX, FLT_MAX}, + {SOCK_STRING, N_("Z")}, + {SOCK_FLOAT, N_("Z"), 0.0, 0.0, 0.0, 0.0, -FLT_MAX, FLT_MAX}, + {SOCK_STRING, N_("Result")}, + {-1, ""}, +}; + +static bNodeSocketTemplate geo_node_attribute_combine_xyz_out[] = { + {SOCK_GEOMETRY, N_("Geometry")}, + {-1, ""}, +}; + +static void geo_node_attribute_combine_xyz_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *ptr) +{ + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + uiLayout *col = uiLayoutColumn(layout, false); + uiItemR(col, ptr, "input_type_x", 0, IFACE_("X"), ICON_NONE); + uiItemR(col, ptr, "input_type_y", 0, IFACE_("Y"), ICON_NONE); + uiItemR(col, ptr, "input_type_z", 0, IFACE_("Z"), ICON_NONE); +} + +namespace blender::nodes { + +static void geo_node_attribute_combine_xyz_init(bNodeTree *UNUSED(tree), bNode *node) +{ + NodeAttributeCombineXYZ *data = (NodeAttributeCombineXYZ *)MEM_callocN( + sizeof(NodeAttributeCombineXYZ), __func__); + + data->input_type_x = GEO_NODE_ATTRIBUTE_INPUT_FLOAT; + data->input_type_y = GEO_NODE_ATTRIBUTE_INPUT_FLOAT; + data->input_type_z = GEO_NODE_ATTRIBUTE_INPUT_FLOAT; + node->storage = data; +} + +static void geo_node_attribute_combine_xyz_update(bNodeTree *UNUSED(ntree), bNode *node) +{ + NodeAttributeCombineXYZ *node_storage = (NodeAttributeCombineXYZ *)node->storage; + update_attribute_input_socket_availabilities( + *node, "X", (GeometryNodeAttributeInputMode)node_storage->input_type_x); + update_attribute_input_socket_availabilities( + *node, "Y", (GeometryNodeAttributeInputMode)node_storage->input_type_y); + update_attribute_input_socket_availabilities( + *node, "Z", (GeometryNodeAttributeInputMode)node_storage->input_type_z); +} + +static AttributeDomain get_result_domain(const GeometryComponent &component, + const GeoNodeExecParams ¶ms, + StringRef result_name) +{ + /* Use the domain of the result attribute if it already exists. */ + ReadAttributePtr result_attribute = component.attribute_try_get_for_read(result_name); + if (result_attribute) { + return result_attribute->domain(); + } + + /* Otherwise use the highest priority domain from existing input attributes, or the default. */ + return params.get_highest_priority_input_domain({"X", "Y", "Z"}, component, ATTR_DOMAIN_POINT); +} + +static void combine_attributes(GeometryComponent &component, const GeoNodeExecParams ¶ms) +{ + const std::string result_name = params.get_input("Result"); + if (result_name.empty()) { + return; + } + const AttributeDomain result_domain = get_result_domain(component, params, result_name); + + OutputAttributePtr attribute_result = component.attribute_try_get_for_output( + result_name, result_domain, CD_PROP_FLOAT3); + if (!attribute_result) { + return; + } + FloatReadAttribute attribute_x = params.get_input_attribute( + "X", component, result_domain, 0.0f); + FloatReadAttribute attribute_y = params.get_input_attribute( + "Y", component, result_domain, 0.0f); + FloatReadAttribute attribute_z = params.get_input_attribute( + "Z", component, result_domain, 0.0f); + + MutableSpan results = attribute_result->get_span_for_write_only(); + for (const int i : results.index_range()) { + const float x = attribute_x[i]; + const float y = attribute_y[i]; + const float z = attribute_z[i]; + const float3 result = float3(x, y, z); + results[i] = result; + } + attribute_result.apply_span_and_save(); +} + +static void geo_node_attribute_combine_xyz_exec(GeoNodeExecParams params) +{ + GeometrySet geometry_set = params.extract_input("Geometry"); + + geometry_set = geometry_set_realize_instances(geometry_set); + + if (geometry_set.has()) { + combine_attributes(geometry_set.get_component_for_write(), params); + } + if (geometry_set.has()) { + combine_attributes(geometry_set.get_component_for_write(), params); + } + + params.set_output("Geometry", geometry_set); +} + +} // namespace blender::nodes + +void register_node_type_geo_attribute_combine_xyz() +{ + static bNodeType ntype; + + geo_node_type_base( + &ntype, GEO_NODE_ATTRIBUTE_COMBINE_XYZ, "Attribute Combine XYZ", NODE_CLASS_ATTRIBUTE, 0); + node_type_socket_templates( + &ntype, geo_node_attribute_combine_xyz_in, geo_node_attribute_combine_xyz_out); + node_type_init(&ntype, blender::nodes::geo_node_attribute_combine_xyz_init); + node_type_update(&ntype, blender::nodes::geo_node_attribute_combine_xyz_update); + node_type_storage( + &ntype, "NodeAttributeCombineXYZ", node_free_standard_storage, node_copy_standard_storage); + ntype.geometry_node_execute = blender::nodes::geo_node_attribute_combine_xyz_exec; + ntype.draw_buttons = geo_node_attribute_combine_xyz_layout; + nodeRegisterType(&ntype); +} diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc index 194b062021d..db1a5d18744 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc @@ -26,6 +26,9 @@ #include "DNA_mesh_types.h" #include "DNA_pointcloud_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "NOD_math_functions.hh" static bNodeSocketTemplate geo_node_attribute_compare_in[] = { @@ -48,6 +51,17 @@ static bNodeSocketTemplate geo_node_attribute_compare_out[] = { {-1, ""}, }; +static void geo_node_attribute_compare_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *ptr) +{ + uiItemR(layout, ptr, "operation", 0, "", ICON_NONE); + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + uiItemR(layout, ptr, "input_type_a", 0, IFACE_("A"), ICON_NONE); + uiItemR(layout, ptr, "input_type_b", 0, IFACE_("B"), ICON_NONE); +} + static void geo_node_attribute_compare_init(bNodeTree *UNUSED(tree), bNode *node) { NodeAttributeCompare *data = (NodeAttributeCompare *)MEM_callocN(sizeof(NodeAttributeCompare), @@ -218,7 +232,7 @@ static CustomDataType get_data_type(GeometryComponent &component, if (operation_tests_equality(node_storage)) { /* Convert the input attributes to the same data type for the equality tests. Use the higher * complexity attribute type, otherwise information necessary to the comparison may be lost. */ - return attribute_data_type_highest_complexity({ + return bke::attribute_data_type_highest_complexity({ params.get_input_attribute_data_type("A", component, CD_PROP_FLOAT), params.get_input_attribute_data_type("B", component, CD_PROP_FLOAT), }); @@ -228,20 +242,31 @@ static CustomDataType get_data_type(GeometryComponent &component, return CD_PROP_FLOAT; } +static AttributeDomain get_result_domain(const GeometryComponent &component, + const GeoNodeExecParams ¶ms, + StringRef result_name) +{ + /* Use the domain of the result attribute if it already exists. */ + ReadAttributePtr result_attribute = component.attribute_try_get_for_read(result_name); + if (result_attribute) { + return result_attribute->domain(); + } + + /* Otherwise use the highest priority domain from existing input attributes, or the default. */ + return params.get_highest_priority_input_domain({"A", "B"}, component, ATTR_DOMAIN_POINT); +} + static void attribute_compare_calc(GeometryComponent &component, const GeoNodeExecParams ¶ms) { const bNode &node = params.node(); NodeAttributeCompare *node_storage = (NodeAttributeCompare *)node.storage; const FloatCompareOperation operation = static_cast( node_storage->operation); - - /* The result type of this node is always float. */ - const CustomDataType result_type = CD_PROP_BOOL; - /* The result domain is always point for now. */ - const AttributeDomain result_domain = ATTR_DOMAIN_POINT; - - /* Get result attribute first, in case it has to overwrite one of the existing attributes. */ const std::string result_name = params.get_input("Result"); + + const CustomDataType result_type = CD_PROP_BOOL; + const AttributeDomain result_domain = get_result_domain(component, params, result_name); + OutputAttributePtr attribute_result = component.attribute_try_get_for_output( result_name, result_domain, result_type); if (!attribute_result) { @@ -306,6 +331,8 @@ static void geo_node_attribute_compare_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { attribute_compare_calc(geometry_set.get_component_for_write(), params); } @@ -327,6 +354,7 @@ void register_node_type_geo_attribute_compare() node_type_socket_templates( &ntype, geo_node_attribute_compare_in, geo_node_attribute_compare_out); ntype.geometry_node_execute = blender::nodes::geo_node_attribute_compare_exec; + ntype.draw_buttons = geo_node_attribute_compare_layout; node_type_update(&ntype, blender::nodes::geo_node_attribute_compare_update); node_type_storage( &ntype, "NodeAttributeCompare", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc index 9cec4070f89..f3bf69d567d 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc @@ -21,6 +21,9 @@ #include "DNA_mesh_types.h" #include "DNA_pointcloud_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate geo_node_attribute_fill_in[] = { {SOCK_GEOMETRY, N_("Geometry")}, {SOCK_STRING, N_("Attribute")}, @@ -28,6 +31,7 @@ static bNodeSocketTemplate geo_node_attribute_fill_in[] = { {SOCK_FLOAT, N_("Value"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX}, {SOCK_RGBA, N_("Value"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX}, {SOCK_BOOLEAN, N_("Value"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX}, + {SOCK_INT, N_("Value"), 0, 0, 0, 0, -10000000.0f, 10000000.0f}, {-1, ""}, }; @@ -36,6 +40,14 @@ static bNodeSocketTemplate geo_node_attribute_fill_out[] = { {-1, ""}, }; +static void geo_node_attribute_fill_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + uiItemR(layout, ptr, "data_type", 0, "", ICON_NONE); + // uiItemR(layout, ptr, "domain", 0, "", ICON_NONE); +} + static void geo_node_attribute_fill_init(bNodeTree *UNUSED(tree), bNode *node) { node->custom1 = CD_PROP_FLOAT; @@ -47,6 +59,7 @@ static void geo_node_attribute_fill_update(bNodeTree *UNUSED(ntree), bNode *node bNodeSocket *socket_value_float = socket_value_vector->next; bNodeSocket *socket_value_color4f = socket_value_float->next; bNodeSocket *socket_value_boolean = socket_value_color4f->next; + bNodeSocket *socket_value_int32 = socket_value_boolean->next; const CustomDataType data_type = static_cast(node->custom1); @@ -54,20 +67,37 @@ static void geo_node_attribute_fill_update(bNodeTree *UNUSED(ntree), bNode *node nodeSetSocketAvailability(socket_value_float, data_type == CD_PROP_FLOAT); nodeSetSocketAvailability(socket_value_color4f, data_type == CD_PROP_COLOR); nodeSetSocketAvailability(socket_value_boolean, data_type == CD_PROP_BOOL); + nodeSetSocketAvailability(socket_value_int32, data_type == CD_PROP_INT32); } namespace blender::nodes { +static AttributeDomain get_result_domain(const GeometryComponent &component, + const GeoNodeExecParams ¶ms, + StringRef attribute_name) +{ + /* Use the domain of the result attribute if it already exists. */ + ReadAttributePtr result_attribute = component.attribute_try_get_for_read(attribute_name); + if (result_attribute) { + return result_attribute->domain(); + } + + /* Otherwise use the input domain chosen in the interface. */ + const bNode &node = params.node(); + return static_cast(node.custom2); +} + static void fill_attribute(GeometryComponent &component, const GeoNodeExecParams ¶ms) { - const bNode &node = params.node(); - const CustomDataType data_type = static_cast(node.custom1); - const AttributeDomain domain = static_cast(node.custom2); const std::string attribute_name = params.get_input("Attribute"); if (attribute_name.empty()) { return; } + const bNode &node = params.node(); + const CustomDataType data_type = static_cast(node.custom1); + const AttributeDomain domain = get_result_domain(component, params, attribute_name); + OutputAttributePtr attribute = component.attribute_try_get_for_output( attribute_name, domain, data_type); if (!attribute) { @@ -99,6 +129,11 @@ static void fill_attribute(GeometryComponent &component, const GeoNodeExecParams attribute_span.fill(value); break; } + case CD_PROP_INT32: { + const int value = params.get_input("Value_004"); + MutableSpan attribute_span = attribute->get_span_for_write_only(); + attribute_span.fill(value); + } default: break; } @@ -110,6 +145,8 @@ static void geo_node_attribute_fill_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { fill_attribute(geometry_set.get_component_for_write(), params); } @@ -131,5 +168,6 @@ void register_node_type_geo_attribute_fill() node_type_init(&ntype, geo_node_attribute_fill_init); node_type_update(&ntype, geo_node_attribute_fill_update); ntype.geometry_node_execute = blender::nodes::geo_node_attribute_fill_exec; + ntype.draw_buttons = geo_node_attribute_fill_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc index f3fc45fc1be..c8cfcb1c24f 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc @@ -26,6 +26,9 @@ #include "DNA_mesh_types.h" #include "DNA_pointcloud_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "NOD_math_functions.hh" static bNodeSocketTemplate geo_node_attribute_math_in[] = { @@ -45,18 +48,6 @@ static bNodeSocketTemplate geo_node_attribute_math_out[] = { {-1, ""}, }; -static void geo_node_attribute_math_init(bNodeTree *UNUSED(tree), bNode *node) -{ - NodeAttributeMath *data = (NodeAttributeMath *)MEM_callocN(sizeof(NodeAttributeMath), - "NodeAttributeMath"); - - data->operation = NODE_MATH_ADD; - data->input_type_a = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; - data->input_type_b = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; - data->input_type_c = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; - node->storage = data; -} - static bool operation_use_input_c(const NodeMathOperation operation) { return ELEM(operation, @@ -117,6 +108,36 @@ static bool operation_use_input_b(const NodeMathOperation operation) return false; } +static void geo_node_attribute_math_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + bNode *node = (bNode *)ptr->data; + NodeAttributeMath *node_storage = (NodeAttributeMath *)node->storage; + NodeMathOperation operation = (NodeMathOperation)node_storage->operation; + + uiItemR(layout, ptr, "operation", 0, "", ICON_NONE); + + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + uiItemR(layout, ptr, "input_type_a", 0, IFACE_("A"), ICON_NONE); + if (operation_use_input_b(operation)) { + uiItemR(layout, ptr, "input_type_b", 0, IFACE_("B"), ICON_NONE); + } + if (operation_use_input_c(operation)) { + uiItemR(layout, ptr, "input_type_c", 0, IFACE_("C"), ICON_NONE); + } +} + +static void geo_node_attribute_math_init(bNodeTree *UNUSED(tree), bNode *node) +{ + NodeAttributeMath *data = (NodeAttributeMath *)MEM_callocN(sizeof(NodeAttributeMath), __func__); + + data->operation = NODE_MATH_ADD; + data->input_type_a = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; + data->input_type_b = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; + data->input_type_c = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; + node->storage = data; +} + namespace blender::nodes { static void geo_node_attribute_math_update(bNodeTree *UNUSED(ntree), bNode *node) @@ -183,19 +204,40 @@ static void do_math_operation(Span span_input, UNUSED_VARS_NDEBUG(success); } +static AttributeDomain get_result_domain(const GeometryComponent &component, + const GeoNodeExecParams ¶ms, + const NodeMathOperation operation, + StringRef result_name) +{ + /* Use the domain of the result attribute if it already exists. */ + ReadAttributePtr result_attribute = component.attribute_try_get_for_read(result_name); + if (result_attribute) { + return result_attribute->domain(); + } + + /* Otherwise use the highest priority domain from existing input attributes, or the default. */ + const AttributeDomain default_domain = ATTR_DOMAIN_POINT; + if (operation_use_input_b(operation)) { + if (operation_use_input_c(operation)) { + return params.get_highest_priority_input_domain({"A", "B", "C"}, component, default_domain); + } + return params.get_highest_priority_input_domain({"A", "B"}, component, default_domain); + } + return params.get_highest_priority_input_domain({"A"}, component, default_domain); +} + static void attribute_math_calc(GeometryComponent &component, const GeoNodeExecParams ¶ms) { const bNode &node = params.node(); const NodeAttributeMath *node_storage = (const NodeAttributeMath *)node.storage; const NodeMathOperation operation = static_cast(node_storage->operation); + const std::string result_name = params.get_input("Result"); /* The result type of this node is always float. */ const CustomDataType result_type = CD_PROP_FLOAT; - /* The result domain is always point for now. */ - const AttributeDomain result_domain = ATTR_DOMAIN_POINT; + const AttributeDomain result_domain = get_result_domain( + component, params, operation, result_name); - /* Get result attribute first, in case it has to overwrite one of the existing attributes. */ - const std::string result_name = params.get_input("Result"); OutputAttributePtr attribute_result = component.attribute_try_get_for_output( result_name, result_domain, result_type); if (!attribute_result) { @@ -248,6 +290,8 @@ static void geo_node_attribute_math_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { attribute_math_calc(geometry_set.get_component_for_write(), params); } @@ -267,9 +311,10 @@ void register_node_type_geo_attribute_math() geo_node_type_base(&ntype, GEO_NODE_ATTRIBUTE_MATH, "Attribute Math", NODE_CLASS_ATTRIBUTE, 0); node_type_socket_templates(&ntype, geo_node_attribute_math_in, geo_node_attribute_math_out); ntype.geometry_node_execute = blender::nodes::geo_node_attribute_math_exec; + ntype.draw_buttons = geo_node_attribute_math_layout; node_type_update(&ntype, blender::nodes::geo_node_attribute_math_update); node_type_init(&ntype, geo_node_attribute_math_init); node_type_storage( - &ntype, "NodeAttributeCompare", node_free_standard_storage, node_copy_standard_storage); + &ntype, "NodeAttributeMath", node_free_standard_storage, node_copy_standard_storage); nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc index 58d67145e75..9d8cd3dfa82 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc @@ -18,6 +18,9 @@ #include "DNA_material_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "node_geometry_util.hh" static bNodeSocketTemplate geo_node_attribute_mix_in[] = { @@ -41,6 +44,17 @@ static bNodeSocketTemplate geo_node_mix_attribute_out[] = { {-1, ""}, }; +static void geo_node_attribute_mix_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + uiItemR(layout, ptr, "blend_type", 0, "", ICON_NONE); + uiLayout *col = uiLayoutColumn(layout, false); + uiItemR(col, ptr, "input_type_factor", 0, IFACE_("Factor"), ICON_NONE); + uiItemR(col, ptr, "input_type_a", 0, IFACE_("A"), ICON_NONE); + uiItemR(col, ptr, "input_type_b", 0, IFACE_("B"), ICON_NONE); +} + namespace blender::nodes { static void do_mix_operation_float(const int blend_mode, @@ -113,28 +127,36 @@ static void do_mix_operation(const CustomDataType result_type, } } +static AttributeDomain get_result_domain(const GeometryComponent &component, + const GeoNodeExecParams ¶ms, + StringRef result_name) +{ + /* Use the domain of the result attribute if it already exists. */ + ReadAttributePtr result_attribute = component.attribute_try_get_for_read(result_name); + if (result_attribute) { + return result_attribute->domain(); + } + + /* Otherwise use the highest priority domain from existing input attributes, or the default. */ + return params.get_highest_priority_input_domain({"A", "B"}, component, ATTR_DOMAIN_POINT); +} + static void attribute_mix_calc(GeometryComponent &component, const GeoNodeExecParams ¶ms) { const bNode &node = params.node(); const NodeAttributeMix *node_storage = (const NodeAttributeMix *)node.storage; + const std::string result_name = params.get_input("Result"); /* Use the highest complexity data type among the inputs and outputs, that way the node will * never "remove information". Use CD_PROP_BOOL as the lowest complexity data type, but in any * real situation it won't be returned. */ - const CustomDataType result_type = attribute_data_type_highest_complexity({ + const CustomDataType result_type = bke::attribute_data_type_highest_complexity({ params.get_input_attribute_data_type("A", component, CD_PROP_BOOL), params.get_input_attribute_data_type("B", component, CD_PROP_BOOL), params.get_input_attribute_data_type("Result", component, CD_PROP_BOOL), }); - /* Once we support more domains at the user level, we have to decide how the result domain is - * chosen. */ - AttributeDomain result_domain = ATTR_DOMAIN_POINT; - const std::string result_name = params.get_input("Result"); - const ReadAttributePtr result_attribute_read = component.attribute_try_get_for_read(result_name); - if (result_attribute_read) { - result_domain = result_attribute_read->domain(); - } + const AttributeDomain result_domain = get_result_domain(component, params, result_name); OutputAttributePtr attribute_result = component.attribute_try_get_for_output( result_name, result_domain, result_type); @@ -162,6 +184,8 @@ static void geo_node_attribute_mix_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { attribute_mix_calc(geometry_set.get_component_for_write(), params); } @@ -204,6 +228,7 @@ void register_node_type_geo_attribute_mix() node_type_socket_templates(&ntype, geo_node_attribute_mix_in, geo_node_mix_attribute_out); node_type_init(&ntype, blender::nodes::geo_node_attribute_mix_init); node_type_update(&ntype, blender::nodes::geo_node_attribute_mix_update); + ntype.draw_buttons = geo_node_attribute_mix_layout; node_type_storage( &ntype, "NodeAttributeMix", node_free_standard_storage, node_copy_standard_storage); ntype.geometry_node_execute = blender::nodes::geo_node_attribute_mix_exec; diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc index 14b1c4e3a59..2ab76540bdf 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc @@ -14,21 +14,25 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#include "BLI_kdopbvh.h" #include "BLI_kdtree.h" #include "BLI_task.hh" +#include "BLI_timeit.hh" + +#include "DNA_mesh_types.h" #include "BKE_bvhutils.h" -#include "BLI_kdopbvh.h" + +#include "UI_interface.h" +#include "UI_resources.h" #include "node_geometry_util.hh" -#include "BLI_timeit.hh" -#include "DNA_mesh_types.h" - static bNodeSocketTemplate geo_node_attribute_proximity_in[] = { {SOCK_GEOMETRY, N_("Geometry")}, {SOCK_GEOMETRY, N_("Target")}, - {SOCK_STRING, N_("Result")}, + {SOCK_STRING, N_("Distance")}, + {SOCK_STRING, N_("Location")}, {-1, ""}, }; @@ -37,6 +41,13 @@ static bNodeSocketTemplate geo_node_attribute_proximity_out[] = { {-1, ""}, }; +static void geo_node_attribute_proximity_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *ptr) +{ + uiItemR(layout, ptr, "target_geometry_element", 0, "", ICON_NONE); +} + static void geo_attribute_proximity_init(bNodeTree *UNUSED(ntree), bNode *node) { NodeGeometryAttributeProximity *node_storage = (NodeGeometryAttributeProximity *)MEM_callocN( @@ -50,50 +61,66 @@ static void geo_attribute_proximity_init(bNodeTree *UNUSED(ntree), bNode *node) namespace blender::nodes { static void proximity_calc(MutableSpan distance_span, + MutableSpan location_span, Span positions, BVHTreeFromMesh &tree_data_mesh, BVHTreeFromPointCloud &tree_data_pointcloud, const bool bvh_mesh_success, - const bool bvh_pointcloud_success) + const bool bvh_pointcloud_success, + const bool store_distances, + const bool store_locations) { - IndexRange range = positions.index_range(); parallel_for(range, 512, [&](IndexRange range) { - BVHTreeNearest nearest; + BVHTreeNearest nearest_from_mesh; + BVHTreeNearest nearest_from_pointcloud; - if (bvh_mesh_success) { - copy_v3_fl(nearest.co, FLT_MAX); - nearest.index = -1; + copy_v3_fl(nearest_from_mesh.co, FLT_MAX); + copy_v3_fl(nearest_from_pointcloud.co, FLT_MAX); - for (int i : range) { - nearest.dist_sq = len_squared_v3v3(nearest.co, positions[i]); + nearest_from_mesh.index = -1; + nearest_from_pointcloud.index = -1; + + for (int i : range) { + /* Use the distance to the last found point as upper bound to speedup the bvh lookup. */ + nearest_from_mesh.dist_sq = len_squared_v3v3(nearest_from_mesh.co, positions[i]); + + if (bvh_mesh_success) { BLI_bvhtree_find_nearest(tree_data_mesh.tree, positions[i], - &nearest, + &nearest_from_mesh, tree_data_mesh.nearest_callback, &tree_data_mesh); - distance_span[i] = sqrtf(nearest.dist_sq); } - } - /* The next loop(s) use the values already in the span. */ - if (!bvh_mesh_success) { - distance_span.fill(FLT_MAX); - } + /* Use the distance to the closest point in the mesh to speedup the pointcloud bvh lookup. + * This is ok because we only need to find the closest point in the pointcloud if it's closer + * than the mesh. */ + nearest_from_pointcloud.dist_sq = nearest_from_mesh.dist_sq; - if (bvh_pointcloud_success) { - copy_v3_fl(nearest.co, FLT_MAX); - nearest.index = -1; - - for (int i : range) { - /* Use the distance to the last found point as upper bound to speedup the bvh lookup. */ - nearest.dist_sq = len_squared_v3v3(nearest.co, positions[i]); + if (bvh_pointcloud_success) { BLI_bvhtree_find_nearest(tree_data_pointcloud.tree, positions[i], - &nearest, + &nearest_from_pointcloud, tree_data_pointcloud.nearest_callback, &tree_data_pointcloud); - distance_span[i] = std::min(distance_span[i], sqrtf(nearest.dist_sq)); + } + + if (nearest_from_pointcloud.dist_sq < nearest_from_mesh.dist_sq) { + if (store_distances) { + distance_span[i] = sqrtf(nearest_from_pointcloud.dist_sq); + } + if (store_locations) { + location_span[i] = nearest_from_pointcloud.co; + } + } + else { + if (store_distances) { + distance_span[i] = sqrtf(nearest_from_mesh.dist_sq); + } + if (store_locations) { + location_span[i] = nearest_from_mesh.co; + } } } }); @@ -138,14 +165,21 @@ static void attribute_calc_proximity(GeometryComponent &component, GeometrySet &geometry_set_target, GeoNodeExecParams ¶ms) { - const std::string result_attribute_name = params.get_input("Result"); + /* This node works on the "point" domain, since that is where positions are stored. */ + const AttributeDomain result_domain = ATTR_DOMAIN_POINT; + + const std::string distance_attribute_name = params.get_input("Distance"); OutputAttributePtr distance_attribute = component.attribute_try_get_for_output( - result_attribute_name, ATTR_DOMAIN_POINT, CD_PROP_FLOAT); + distance_attribute_name, result_domain, CD_PROP_FLOAT); + + const std::string location_attribute_name = params.get_input("Location"); + OutputAttributePtr location_attribute = component.attribute_try_get_for_output( + location_attribute_name, result_domain, CD_PROP_FLOAT3); ReadAttributePtr position_attribute = component.attribute_try_get_for_read("position"); BLI_assert(position_attribute->custom_data_type() == CD_PROP_FLOAT3); - if (!distance_attribute || !position_attribute) { + if (!position_attribute || (!distance_attribute && !location_attribute)) { return; } @@ -170,12 +204,24 @@ static void attribute_calc_proximity(GeometryComponent &component, tree_data_pointcloud); } - proximity_calc(distance_attribute->get_span_for_write_only(), - position_attribute->get_span(), + Span position_span = position_attribute->get_span(); + + MutableSpan distance_span = distance_attribute ? + distance_attribute->get_span_for_write_only() : + MutableSpan(); + MutableSpan location_span = location_attribute ? + location_attribute->get_span_for_write_only() : + MutableSpan(); + + proximity_calc(distance_span, + location_span, + position_span, tree_data_mesh, tree_data_pointcloud, bvh_mesh_success, - bvh_pointcloud_success); + bvh_pointcloud_success, + distance_attribute, /* Boolean. */ + location_attribute); /* Boolean. */ if (bvh_mesh_success) { free_bvhtree_from_mesh(&tree_data_mesh); @@ -184,7 +230,12 @@ static void attribute_calc_proximity(GeometryComponent &component, free_bvhtree_from_pointcloud(&tree_data_pointcloud); } - distance_attribute.apply_span_and_save(); + if (distance_attribute) { + distance_attribute.apply_span_and_save(); + } + if (location_attribute) { + location_attribute.apply_span_and_save(); + } } static void geo_node_attribute_proximity_exec(GeoNodeExecParams params) @@ -192,6 +243,12 @@ static void geo_node_attribute_proximity_exec(GeoNodeExecParams params) GeometrySet geometry_set = params.extract_input("Geometry"); GeometrySet geometry_set_target = params.extract_input("Target"); + geometry_set = geometry_set_realize_instances(geometry_set); + + /* This isn't required. This node should be rewritten to handle instances + * for the target geometry set. However, the generic BVH API complicates this. */ + geometry_set_target = geometry_set_realize_instances(geometry_set_target); + if (geometry_set.has()) { attribute_calc_proximity( geometry_set.get_component_for_write(), geometry_set_target, params); @@ -220,5 +277,6 @@ void register_node_type_geo_attribute_proximity() node_free_standard_storage, node_copy_standard_storage); ntype.geometry_node_execute = blender::nodes::geo_node_attribute_proximity_exec; + ntype.draw_buttons = geo_node_attribute_proximity_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc index 3ee7df7fe72..bb5b5073c32 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc @@ -19,6 +19,9 @@ #include "BLI_hash.h" #include "BLI_rand.hh" +#include "UI_interface.h" +#include "UI_resources.h" + #include "DNA_mesh_types.h" #include "DNA_pointcloud_types.h" @@ -29,6 +32,8 @@ static bNodeSocketTemplate geo_node_attribute_randomize_in[] = { {SOCK_VECTOR, N_("Max"), 1.0f, 1.0f, 1.0f, 0.0f, -FLT_MAX, FLT_MAX}, {SOCK_FLOAT, N_("Min"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX}, {SOCK_FLOAT, N_("Max"), 1.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX}, + {SOCK_INT, N_("Min"), 0.0f, 0.0f, 0.0f, 0.0f, -100000, 100000}, + {SOCK_INT, N_("Max"), 100.0f, 0.0f, 0.0f, 0.0f, -100000, 100000}, {SOCK_INT, N_("Seed"), 0, 0, 0, 0, -10000, 10000}, {-1, ""}, }; @@ -38,9 +43,22 @@ static bNodeSocketTemplate geo_node_attribute_randomize_out[] = { {-1, ""}, }; +static void geo_node_attribute_random_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *ptr) +{ + uiItemR(layout, ptr, "data_type", 0, "", ICON_NONE); + uiItemR(layout, ptr, "operation", 0, "", ICON_NONE); +} + static void geo_node_attribute_randomize_init(bNodeTree *UNUSED(tree), bNode *node) { - node->custom1 = CD_PROP_FLOAT; + NodeAttributeRandomize *data = (NodeAttributeRandomize *)MEM_callocN( + sizeof(NodeAttributeRandomize), __func__); + data->data_type = CD_PROP_FLOAT; + data->domain = ATTR_DOMAIN_POINT; + data->operation = GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE; + node->storage = data; } static void geo_node_attribute_randomize_update(bNodeTree *UNUSED(ntree), bNode *node) @@ -49,71 +67,107 @@ static void geo_node_attribute_randomize_update(bNodeTree *UNUSED(ntree), bNode bNodeSocket *sock_max_vector = sock_min_vector->next; bNodeSocket *sock_min_float = sock_max_vector->next; bNodeSocket *sock_max_float = sock_min_float->next; + bNodeSocket *sock_min_int = sock_max_float->next; + bNodeSocket *sock_max_int = sock_min_int->next; - const CustomDataType data_type = static_cast(node->custom1); + const NodeAttributeRandomize &storage = *(const NodeAttributeRandomize *)node->storage; + const CustomDataType data_type = static_cast(storage.data_type); nodeSetSocketAvailability(sock_min_vector, data_type == CD_PROP_FLOAT3); nodeSetSocketAvailability(sock_max_vector, data_type == CD_PROP_FLOAT3); nodeSetSocketAvailability(sock_min_float, data_type == CD_PROP_FLOAT); nodeSetSocketAvailability(sock_max_float, data_type == CD_PROP_FLOAT); + nodeSetSocketAvailability(sock_min_int, data_type == CD_PROP_INT32); + nodeSetSocketAvailability(sock_max_int, data_type == CD_PROP_INT32); } namespace blender::nodes { -/** Rehash to combine the seed with the "id" hash and a mutator for each dimension. */ -static float noise_from_index_and_mutator(const int seed, const int hash, const int mutator) +template +T random_value_in_range(const uint32_t id, const uint32_t seed, const T min, const T max); + +template<> +inline float random_value_in_range(const uint32_t id, + const uint32_t seed, + const float min, + const float max) { - const int combined_hash = BLI_hash_int_3d(seed, hash, mutator); - return BLI_hash_int_01(combined_hash); + return BLI_hash_int_2d_to_float(id, seed) * (max - min) + min; } -/** Rehash to combine the seed with the "id" hash. */ -static float noise_from_index(const int seed, const int hash) +template<> +inline int random_value_in_range(const uint32_t id, + const uint32_t seed, + const int min, + const int max) { - const int combined_hash = BLI_hash_int_2d(seed, hash); - return BLI_hash_int_01(combined_hash); + return round_fl_to_int( + random_value_in_range(id, seed, static_cast(min), static_cast(max))); } -static void randomize_attribute_bool(BooleanWriteAttribute attribute, - Span hashes, - const int seed) +template<> +inline float3 random_value_in_range(const uint32_t id, + const uint32_t seed, + const float3 min, + const float3 max) { - MutableSpan attribute_span = attribute.get_span(); - for (const int i : IndexRange(attribute.size())) { - const bool value = noise_from_index(seed, (int)hashes[i]) > 0.5f; - attribute_span[i] = value; + const float x = BLI_hash_int_3d_to_float(seed, id, 435109); + const float y = BLI_hash_int_3d_to_float(seed, id, 380867); + const float z = BLI_hash_int_3d_to_float(seed, id, 1059217); + + return float3(x, y, z) * (max - min) + min; +} + +template +static void randomize_attribute(MutableSpan span, + const T min, + const T max, + Span ids, + const uint32_t seed, + const GeometryNodeAttributeRandomizeMode operation) +{ + /* The operations could be templated too, but it doesn't make the code much shorter. */ + switch (operation) { + case GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE: + for (const int i : span.index_range()) { + const T random_value = random_value_in_range(ids[i], seed, min, max); + span[i] = random_value; + } + break; + case GEO_NODE_ATTRIBUTE_RANDOMIZE_ADD: + for (const int i : span.index_range()) { + const T random_value = random_value_in_range(ids[i], seed, min, max); + span[i] = span[i] + random_value; + } + break; + case GEO_NODE_ATTRIBUTE_RANDOMIZE_SUBTRACT: + for (const int i : span.index_range()) { + const T random_value = random_value_in_range(ids[i], seed, min, max); + span[i] = span[i] - random_value; + } + break; + case GEO_NODE_ATTRIBUTE_RANDOMIZE_MULTIPLY: + for (const int i : span.index_range()) { + const T random_value = random_value_in_range(ids[i], seed, min, max); + span[i] = span[i] * random_value; + } + break; + default: + BLI_assert(false); + break; } - attribute.apply_span(); } -static void randomize_attribute_float(FloatWriteAttribute attribute, - const float min, - const float max, - Span hashes, - const int seed) +static void randomize_attribute_bool(MutableSpan span, + Span ids, + const uint32_t seed, + const GeometryNodeAttributeRandomizeMode operation) { - MutableSpan attribute_span = attribute.get_span(); - for (const int i : IndexRange(attribute.size())) { - const float value = noise_from_index(seed, (int)hashes[i]) * (max - min) + min; - attribute_span[i] = value; + BLI_assert(operation == GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE); + UNUSED_VARS_NDEBUG(operation); + for (const int i : span.index_range()) { + const bool random_value = BLI_hash_int_2d_to_float(ids[i], seed) > 0.5f; + span[i] = random_value; } - attribute.apply_span(); -} - -static void randomize_attribute_float3(Float3WriteAttribute attribute, - const float3 min, - const float3 max, - Span hashes, - const int seed) -{ - MutableSpan attribute_span = attribute.get_span(); - for (const int i : IndexRange(attribute.size())) { - const float x = noise_from_index_and_mutator(seed, (int)hashes[i], 47); - const float y = noise_from_index_and_mutator(seed, (int)hashes[i], 8); - const float z = noise_from_index_and_mutator(seed, (int)hashes[i], 64); - const float3 value = float3(x, y, z) * (max - min) + min; - attribute_span[i] = value; - } - attribute.apply_span(); } Array get_geometry_element_ids_as_uints(const GeometryComponent &component, @@ -143,60 +197,115 @@ Array get_geometry_element_ids_as_uints(const GeometryComponent &compo return hashes; } -static void randomize_attribute(GeometryComponent &component, - const GeoNodeExecParams ¶ms, - const int seed) +static AttributeDomain get_result_domain(const GeometryComponent &component, + const GeoNodeExecParams ¶ms, + StringRef attribute_name) { - const bNode &node = params.node(); - const CustomDataType data_type = static_cast(node.custom1); - const AttributeDomain domain = static_cast(node.custom2); - const std::string attribute_name = params.get_input("Attribute"); - if (attribute_name.empty()) { - return; + /* Use the domain of the result attribute if it already exists. */ + ReadAttributePtr result_attribute = component.attribute_try_get_for_read(attribute_name); + if (result_attribute) { + return result_attribute->domain(); } + /* Otherwise use the input domain chosen in the interface. */ + const bNode &node = params.node(); + return static_cast(node.custom2); +} + +static void randomize_attribute_on_component(GeometryComponent &component, + const GeoNodeExecParams ¶ms, + StringRef attribute_name, + const CustomDataType data_type, + const GeometryNodeAttributeRandomizeMode operation, + const int seed) +{ + /* If the node is not in "replace / create" mode and the attribute + * doesn't already exist, don't do the operation. */ + if (operation != GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE) { + if (!component.attribute_exists(attribute_name)) { + params.error_message_add(NodeWarningType::Error, + "No attribute with name '" + attribute_name + "'."); + return; + } + } + + const AttributeDomain domain = get_result_domain(component, params, attribute_name); + OutputAttributePtr attribute = component.attribute_try_get_for_output( attribute_name, domain, data_type); if (!attribute) { return; } + fn::GMutableSpan span = (operation == GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE) ? + attribute->get_span_for_write_only() : + attribute->get_span(); + Array hashes = get_geometry_element_ids_as_uints(component, domain); switch (data_type) { - case CD_PROP_FLOAT: { - const float min_value = params.get_input("Min_001"); - const float max_value = params.get_input("Max_001"); - randomize_attribute_float(*attribute, min_value, max_value, hashes, seed); + case CD_PROP_FLOAT3: { + const float3 min = params.get_input("Min"); + const float3 max = params.get_input("Max"); + randomize_attribute(span.typed(), min, max, hashes, seed, operation); break; } - case CD_PROP_FLOAT3: { - const float3 min_value = params.get_input("Min"); - const float3 max_value = params.get_input("Max"); - randomize_attribute_float3(*attribute, min_value, max_value, hashes, seed); + case CD_PROP_FLOAT: { + const float min = params.get_input("Min_001"); + const float max = params.get_input("Max_001"); + randomize_attribute(span.typed(), min, max, hashes, seed, operation); break; } case CD_PROP_BOOL: { - randomize_attribute_bool(*attribute, hashes, seed); + randomize_attribute_bool(span.typed(), hashes, seed, operation); break; } - default: + case CD_PROP_INT32: { + const int min = params.get_input("Min_002"); + const int max = params.get_input("Max_002"); + randomize_attribute(span.typed(), min, max, hashes, seed, operation); break; + } + default: { + BLI_assert(false); + break; + } } - attribute.save(); -} + attribute.apply_span_and_save(); +} // namespace blender::nodes static void geo_node_random_attribute_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + const std::string attribute_name = params.get_input("Attribute"); + if (attribute_name.empty()) { + params.set_output("Geometry", geometry_set); + return; + } const int seed = params.get_input("Seed"); + const NodeAttributeRandomize &storage = *(const NodeAttributeRandomize *)params.node().storage; + const CustomDataType data_type = static_cast(storage.data_type); + const GeometryNodeAttributeRandomizeMode operation = + static_cast(storage.operation); + + geometry_set = geometry_set_realize_instances(geometry_set); if (geometry_set.has()) { - randomize_attribute(geometry_set.get_component_for_write(), params, seed); + randomize_attribute_on_component(geometry_set.get_component_for_write(), + params, + attribute_name, + data_type, + operation, + seed); } if (geometry_set.has()) { - randomize_attribute(geometry_set.get_component_for_write(), params, seed); + randomize_attribute_on_component(geometry_set.get_component_for_write(), + params, + attribute_name, + data_type, + operation, + seed); } params.set_output("Geometry", geometry_set); @@ -215,5 +324,8 @@ void register_node_type_geo_attribute_randomize() node_type_init(&ntype, geo_node_attribute_randomize_init); node_type_update(&ntype, geo_node_attribute_randomize_update); ntype.geometry_node_execute = blender::nodes::geo_node_random_attribute_exec; + ntype.draw_buttons = geo_node_attribute_random_layout; + node_type_storage( + &ntype, "NodeAttributeRandomize", node_free_standard_storage, node_copy_standard_storage); nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc index 66495bfa53b..d0b2595b5b9 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc @@ -22,6 +22,9 @@ #include "RE_texture.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "node_geometry_util.hh" static bNodeSocketTemplate geo_node_attribute_sample_texture_in[] = { @@ -36,31 +39,60 @@ static bNodeSocketTemplate geo_node_attribute_sample_texture_out[] = { {-1, ""}, }; +static void geo_node_attribute_sample_texture_layout(uiLayout *layout, + bContext *C, + PointerRNA *ptr) +{ + uiTemplateID(layout, C, ptr, "texture", "texture.new", nullptr, nullptr, 0, ICON_NONE, nullptr); +} + namespace blender::nodes { +static AttributeDomain get_result_domain(const GeometryComponent &component, + StringRef result_attribute_name, + StringRef map_attribute_name) +{ + /* Use the domain of the result attribute if it already exists. */ + ReadAttributePtr result_attribute = component.attribute_try_get_for_read(result_attribute_name); + if (result_attribute) { + return result_attribute->domain(); + } + + /* Otherwise use the name of the map attribute. */ + ReadAttributePtr map_attribute = component.attribute_try_get_for_read(map_attribute_name); + if (map_attribute) { + return map_attribute->domain(); + } + + /* The node won't execute in this case, but we still have to return a value. */ + return ATTR_DOMAIN_POINT; +} + static void execute_on_component(GeometryComponent &component, const GeoNodeExecParams ¶ms) { const bNode &node = params.node(); Tex *texture = reinterpret_cast(node.id); - const std::string result_attribute_name = params.get_input("Result"); - if (texture == nullptr) { return; } + const std::string result_attribute_name = params.get_input("Result"); const std::string mapping_name = params.get_input("Mapping"); if (!component.attribute_exists(mapping_name)) { return; } + const AttributeDomain result_domain = get_result_domain( + component, result_attribute_name, mapping_name); + OutputAttributePtr attribute_out = component.attribute_try_get_for_output( - result_attribute_name, ATTR_DOMAIN_POINT, CD_PROP_COLOR); + result_attribute_name, result_domain, CD_PROP_COLOR); if (!attribute_out) { return; } Float3ReadAttribute mapping_attribute = component.attribute_get_for_read( - mapping_name, ATTR_DOMAIN_POINT, {0, 0, 0}); + mapping_name, result_domain, {0, 0, 0}); MutableSpan colors = attribute_out->get_span(); for (const int i : IndexRange(mapping_attribute.size())) { @@ -78,6 +110,8 @@ static void geo_node_attribute_sample_texture_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { execute_on_component(geometry_set.get_component_for_write(), params); } @@ -103,5 +137,6 @@ void register_node_type_geo_sample_texture() node_type_socket_templates( &ntype, geo_node_attribute_sample_texture_in, geo_node_attribute_sample_texture_out); ntype.geometry_node_execute = blender::nodes::geo_node_attribute_sample_texture_exec; + ntype.draw_buttons = geo_node_attribute_sample_texture_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc new file mode 100644 index 00000000000..55b933e8582 --- /dev/null +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc @@ -0,0 +1,179 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "DNA_material_types.h" + +#include "node_geometry_util.hh" + +#include "UI_interface.h" +#include "UI_resources.h" + +static bNodeSocketTemplate geo_node_attribute_separate_xyz_in[] = { + {SOCK_GEOMETRY, N_("Geometry")}, + {SOCK_STRING, N_("Vector")}, + {SOCK_VECTOR, N_("Vector"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX}, + {SOCK_STRING, N_("Result X")}, + {SOCK_STRING, N_("Result Y")}, + {SOCK_STRING, N_("Result Z")}, + {-1, ""}, +}; + +static bNodeSocketTemplate geo_node_attribute_separate_xyz_out[] = { + {SOCK_GEOMETRY, N_("Geometry")}, + {-1, ""}, +}; + +static void geo_node_attribute_separate_xyz_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *ptr) +{ + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + uiItemR(layout, ptr, "input_type", 0, IFACE_("Type"), ICON_NONE); +} + +namespace blender::nodes { + +static void geo_node_attribute_separate_xyz_init(bNodeTree *UNUSED(tree), bNode *node) +{ + NodeAttributeSeparateXYZ *data = (NodeAttributeSeparateXYZ *)MEM_callocN( + sizeof(NodeAttributeSeparateXYZ), __func__); + data->input_type = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; + node->storage = data; +} + +static void geo_node_attribute_separate_xyz_update(bNodeTree *UNUSED(ntree), bNode *node) +{ + NodeAttributeSeparateXYZ *node_storage = (NodeAttributeSeparateXYZ *)node->storage; + update_attribute_input_socket_availabilities( + *node, "Vector", (GeometryNodeAttributeInputMode)node_storage->input_type); +} + +static void extract_input(const int index, const Span &input, MutableSpan result) +{ + for (const int i : result.index_range()) { + /* Get the component of the float3. (0: X, 1: Y, 2: Z). */ + const float component = input[i][index]; + result[i] = component; + } +} + +static AttributeDomain get_result_domain(const GeometryComponent &component, + const GeoNodeExecParams ¶ms, + StringRef result_name_x, + StringRef result_name_y, + StringRef result_name_z) +{ + /* Use the highest priority domain from any existing attribute outputs. */ + Vector output_domains; + ReadAttributePtr attribute_x = component.attribute_try_get_for_read(result_name_x); + ReadAttributePtr attribute_y = component.attribute_try_get_for_read(result_name_y); + ReadAttributePtr attribute_z = component.attribute_try_get_for_read(result_name_z); + if (attribute_x) { + output_domains.append(attribute_x->domain()); + } + if (attribute_y) { + output_domains.append(attribute_y->domain()); + } + if (attribute_z) { + output_domains.append(attribute_z->domain()); + } + if (output_domains.size() > 0) { + return bke::attribute_domain_highest_priority(output_domains); + } + + /* Otherwise use the domain of the input attribute, or the default. */ + return params.get_highest_priority_input_domain({"Vector"}, component, ATTR_DOMAIN_POINT); +} + +static void separate_attribute(GeometryComponent &component, const GeoNodeExecParams ¶ms) +{ + const std::string result_name_x = params.get_input("Result X"); + const std::string result_name_y = params.get_input("Result Y"); + const std::string result_name_z = params.get_input("Result Z"); + if (result_name_x.empty() && result_name_y.empty() && result_name_z.empty()) { + return; + } + + /* The node is only for float3 to float conversions. */ + const CustomDataType input_type = CD_PROP_FLOAT3; + const CustomDataType result_type = CD_PROP_FLOAT; + const AttributeDomain result_domain = get_result_domain( + component, params, result_name_x, result_name_y, result_name_z); + + ReadAttributePtr attribute_input = params.get_input_attribute( + "Vector", component, result_domain, input_type, nullptr); + if (!attribute_input) { + return; + } + const Span input_span = attribute_input->get_span(); + + OutputAttributePtr attribute_result_x = component.attribute_try_get_for_output( + result_name_x, result_domain, result_type); + OutputAttributePtr attribute_result_y = component.attribute_try_get_for_output( + result_name_y, result_domain, result_type); + OutputAttributePtr attribute_result_z = component.attribute_try_get_for_output( + result_name_z, result_domain, result_type); + + /* Only extract the components for the outputs with a given attribute. */ + if (attribute_result_x) { + extract_input(0, input_span, attribute_result_x->get_span_for_write_only()); + attribute_result_x.apply_span_and_save(); + } + if (attribute_result_y) { + extract_input(1, input_span, attribute_result_y->get_span_for_write_only()); + attribute_result_y.apply_span_and_save(); + } + if (attribute_result_z) { + extract_input(2, input_span, attribute_result_z->get_span_for_write_only()); + attribute_result_z.apply_span_and_save(); + } +} + +static void geo_node_attribute_separate_xyz_exec(GeoNodeExecParams params) +{ + GeometrySet geometry_set = params.extract_input("Geometry"); + + geometry_set = geometry_set_realize_instances(geometry_set); + + if (geometry_set.has()) { + separate_attribute(geometry_set.get_component_for_write(), params); + } + if (geometry_set.has()) { + separate_attribute(geometry_set.get_component_for_write(), params); + } + + params.set_output("Geometry", geometry_set); +} + +} // namespace blender::nodes + +void register_node_type_geo_attribute_separate_xyz() +{ + static bNodeType ntype; + + geo_node_type_base( + &ntype, GEO_NODE_ATTRIBUTE_SEPARATE_XYZ, "Attribute Separate XYZ", NODE_CLASS_ATTRIBUTE, 0); + node_type_socket_templates( + &ntype, geo_node_attribute_separate_xyz_in, geo_node_attribute_separate_xyz_out); + node_type_init(&ntype, blender::nodes::geo_node_attribute_separate_xyz_init); + node_type_update(&ntype, blender::nodes::geo_node_attribute_separate_xyz_update); + node_type_storage( + &ntype, "NodeAttributeSeparateXYZ", node_free_standard_storage, node_copy_standard_storage); + ntype.geometry_node_execute = blender::nodes::geo_node_attribute_separate_xyz_exec; + ntype.draw_buttons = geo_node_attribute_separate_xyz_layout; + nodeRegisterType(&ntype); +} diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc index 529906a35e7..aa207860f32 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc @@ -26,6 +26,9 @@ #include "DNA_mesh_types.h" #include "DNA_pointcloud_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "NOD_math_functions.hh" static bNodeSocketTemplate geo_node_attribute_vector_math_in[] = { @@ -46,25 +49,6 @@ static bNodeSocketTemplate geo_node_attribute_vector_math_out[] = { {-1, ""}, }; -static void geo_node_attribute_vector_math_init(bNodeTree *UNUSED(tree), bNode *node) -{ - NodeAttributeVectorMath *data = (NodeAttributeVectorMath *)MEM_callocN( - sizeof(NodeAttributeVectorMath), __func__); - - data->operation = NODE_VECTOR_MATH_ADD; - data->input_type_a = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; - data->input_type_b = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; - node->storage = data; -} - -static CustomDataType operation_get_read_type_b(const NodeVectorMathOperation operation) -{ - if (operation == NODE_VECTOR_MATH_SCALE) { - return CD_PROP_FLOAT; - } - return CD_PROP_FLOAT3; -} - static bool operation_use_input_b(const NodeVectorMathOperation operation) { return !ELEM(operation, @@ -84,6 +68,46 @@ static bool operation_use_input_c(const NodeVectorMathOperation operation) return operation == NODE_VECTOR_MATH_WRAP; } +static void geo_node_attribute_vector_math_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *ptr) +{ + bNode *node = (bNode *)ptr->data; + const NodeAttributeVectorMath &node_storage = *(NodeAttributeVectorMath *)node->storage; + const NodeVectorMathOperation operation = (const NodeVectorMathOperation)node_storage.operation; + + uiItemR(layout, ptr, "operation", 0, "", ICON_NONE); + + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + uiItemR(layout, ptr, "input_type_a", 0, IFACE_("A"), ICON_NONE); + if (operation_use_input_b(operation)) { + uiItemR(layout, ptr, "input_type_b", 0, IFACE_("B"), ICON_NONE); + } + if (operation_use_input_c(operation)) { + uiItemR(layout, ptr, "input_type_c", 0, IFACE_("C"), ICON_NONE); + } +} + +static CustomDataType operation_get_read_type_b(const NodeVectorMathOperation operation) +{ + if (operation == NODE_VECTOR_MATH_SCALE) { + return CD_PROP_FLOAT; + } + return CD_PROP_FLOAT3; +} + +static void geo_node_attribute_vector_math_init(bNodeTree *UNUSED(tree), bNode *node) +{ + NodeAttributeVectorMath *data = (NodeAttributeVectorMath *)MEM_callocN( + sizeof(NodeAttributeVectorMath), __func__); + + data->operation = NODE_VECTOR_MATH_ADD; + data->input_type_a = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; + data->input_type_b = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; + node->storage = data; +} + static CustomDataType operation_get_result_type(const NodeVectorMathOperation operation) { switch (operation) { @@ -305,12 +329,35 @@ static void do_math_operation_fl3_to_fl(const Float3ReadAttribute &input_a, UNUSED_VARS_NDEBUG(success); } +static AttributeDomain get_result_domain(const GeometryComponent &component, + const GeoNodeExecParams ¶ms, + const NodeVectorMathOperation operation, + StringRef result_name) +{ + /* Use the domain of the result attribute if it already exists. */ + ReadAttributePtr result_attribute = component.attribute_try_get_for_read(result_name); + if (result_attribute) { + return result_attribute->domain(); + } + + /* Otherwise use the highest priority domain from existing input attributes, or the default. */ + const AttributeDomain default_domain = ATTR_DOMAIN_POINT; + if (operation_use_input_b(operation)) { + if (operation_use_input_c(operation)) { + return params.get_highest_priority_input_domain({"A", "B", "C"}, component, default_domain); + } + return params.get_highest_priority_input_domain({"A", "B"}, component, default_domain); + } + return params.get_highest_priority_input_domain({"A"}, component, default_domain); +} + static void attribute_vector_math_calc(GeometryComponent &component, const GeoNodeExecParams ¶ms) { const bNode &node = params.node(); const NodeAttributeVectorMath *node_storage = (const NodeAttributeVectorMath *)node.storage; const NodeVectorMathOperation operation = (NodeVectorMathOperation)node_storage->operation; + const std::string result_name = params.get_input("Result"); /* The number and type of the input attribute depend on the operation. */ const CustomDataType read_type_a = CD_PROP_FLOAT3; @@ -321,7 +368,8 @@ static void attribute_vector_math_calc(GeometryComponent &component, /* The result domain is always point for now. */ const CustomDataType result_type = operation_get_result_type(operation); - const AttributeDomain result_domain = ATTR_DOMAIN_POINT; + const AttributeDomain result_domain = get_result_domain( + component, params, operation, result_name); ReadAttributePtr attribute_a = params.get_input_attribute( "A", component, result_domain, read_type_a, nullptr); @@ -344,7 +392,6 @@ static void attribute_vector_math_calc(GeometryComponent &component, } /* Get result attribute first, in case it has to overwrite one of the existing attributes. */ - const std::string result_name = params.get_input("Result"); OutputAttributePtr attribute_result = component.attribute_try_get_for_output( result_name, result_domain, result_type); if (!attribute_result) { @@ -397,6 +444,8 @@ static void geo_node_attribute_vector_math_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { attribute_vector_math_calc(geometry_set.get_component_for_write(), params); } @@ -419,6 +468,7 @@ void register_node_type_geo_attribute_vector_math() node_type_socket_templates( &ntype, geo_node_attribute_vector_math_in, geo_node_attribute_vector_math_out); ntype.geometry_node_execute = blender::nodes::geo_node_attribute_vector_math_exec; + ntype.draw_buttons = geo_node_attribute_vector_math_layout; node_type_update(&ntype, blender::nodes::geo_node_attribute_vector_math_update); node_type_init(&ntype, geo_node_attribute_vector_math_init); node_type_storage( diff --git a/source/blender/nodes/geometry/nodes/node_geo_boolean.cc b/source/blender/nodes/geometry/nodes/node_geo_boolean.cc index e658bc3c2c1..c9e8e9a8dd0 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_boolean.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_boolean.cc @@ -24,6 +24,9 @@ #include "RNA_enum_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "BKE_mesh.h" #include "bmesh.h" @@ -42,6 +45,11 @@ static bNodeSocketTemplate geo_node_boolean_out[] = { {-1, ""}, }; +static void geo_node_boolean_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "operation", 0, "", ICON_NONE); +} + static int bm_face_isect_pair(BMFace *f, void *UNUSED(user_data)) { return BM_elem_flag_test(f, BM_ELEM_DRAW) ? 1 : 0; @@ -116,6 +124,12 @@ static void geo_node_boolean_exec(GeoNodeExecParams params) return; } + /* TODO: Boolean does support an input of multiple meshes. Currently they must all be + * converted to BMesh before running the operation though. D9957 will make it possible + * to use the mesh structure directly. */ + geometry_set_in_a = geometry_set_realize_instances(geometry_set_in_a); + geometry_set_in_b = geometry_set_realize_instances(geometry_set_in_b); + const Mesh *mesh_in_a = geometry_set_in_a.get_mesh_for_read(); const Mesh *mesh_in_b = geometry_set_in_b.get_mesh_for_read(); @@ -147,6 +161,7 @@ void register_node_type_geo_boolean() geo_node_type_base(&ntype, GEO_NODE_BOOLEAN, "Boolean", NODE_CLASS_GEOMETRY, 0); node_type_socket_templates(&ntype, geo_node_boolean_in, geo_node_boolean_out); + ntype.draw_buttons = geo_node_boolean_layout; ntype.geometry_node_execute = blender::nodes::geo_node_boolean_exec; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc b/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc index 637a117e2af..8991a26ba4b 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc @@ -20,6 +20,9 @@ #include "DNA_collection_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate geo_node_collection_info_in[] = { {SOCK_COLLECTION, N_("Collection")}, {-1, ""}, @@ -30,6 +33,11 @@ static bNodeSocketTemplate geo_node_collection_info_out[] = { {-1, ""}, }; +static void geo_node_collection_info_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "transform_space", UI_ITEM_R_EXPAND, nullptr, ICON_NONE); +} + namespace blender::nodes { static void geo_node_collection_info_exec(GeoNodeExecParams params) @@ -64,9 +72,6 @@ static void geo_node_collection_info_exec(GeoNodeExecParams params) copy_v3_v3(transform_mat[3], collection->instance_offset); mul_m4_m4_pre(transform_mat, self_object->imat); - - float3 self_loc; - copy_v3_v3(self_loc, self_object->obmat[3]); } instances.add_instance(instance, transform_mat, -1); @@ -95,5 +100,6 @@ void register_node_type_geo_collection_info() node_free_standard_storage, node_copy_standard_storage); ntype.geometry_node_execute = blender::nodes::geo_node_collection_info_exec; + ntype.draw_buttons = geo_node_collection_info_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc b/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc index 48ff8f2f683..1c794d1f43e 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc @@ -51,6 +51,8 @@ static void geo_node_edge_split_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (!geometry_set.has_mesh()) { params.set_output("Geometry", std::move(geometry_set)); return; diff --git a/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc b/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc index 384094b6d8c..4e15f232934 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc @@ -24,8 +24,16 @@ #include "node_geometry_util.hh" static bNodeSocketTemplate geo_node_join_geometry_in[] = { - {SOCK_GEOMETRY, N_("Geometry")}, - {SOCK_GEOMETRY, N_("Geometry")}, + {SOCK_GEOMETRY, + N_("Geometry"), + 0.0f, + 0.0f, + 0.0f, + 1.0f, + -1.0f, + 1.0f, + PROP_NONE, + SOCK_MULTI_INPUT}, {-1, ""}, }; @@ -139,16 +147,17 @@ static void determine_final_data_type_and_domain(Span AttributeDomain *r_domain) { Vector data_types; + Vector domains; for (const GeometryComponent *component : components) { ReadAttributePtr attribute = component->attribute_try_get_for_read(attribute_name); if (attribute) { data_types.append(attribute->custom_data_type()); - /* TODO: Use highest priority domain. */ - *r_domain = attribute->domain(); + domains.append(attribute->domain()); } } - *r_type = attribute_data_type_highest_complexity(data_types); + *r_type = bke::attribute_data_type_highest_complexity(data_types); + *r_domain = bke::attribute_domain_highest_priority(domains); } static void fill_new_attribute(Span src_components, @@ -192,8 +201,8 @@ static void join_attributes(Span src_components, AttributeDomain domain; determine_final_data_type_and_domain(src_components, attribute_name, &data_type, &domain); - result.attribute_try_create(attribute_name, domain, data_type); - WriteAttributePtr write_attribute = result.attribute_try_get_for_write(attribute_name); + OutputAttributePtr write_attribute = result.attribute_try_get_for_output( + attribute_name, domain, data_type); if (!write_attribute || &write_attribute->cpp_type() != bke::custom_data_type_to_cpp_type(data_type) || write_attribute->domain() != domain) { @@ -201,7 +210,7 @@ static void join_attributes(Span src_components, } fn::GMutableSpan dst_span = write_attribute->get_span_for_write_only(); fill_new_attribute(src_components, attribute_name, data_type, domain, dst_span); - write_attribute->apply_span(); + write_attribute.apply_span_and_save(); } } @@ -212,8 +221,9 @@ static void join_components(Span src_components, Geometry MeshComponent &dst_component = result.get_component_for_write(); dst_component.replace(new_mesh); - /* The position attribute is handled above already. */ - join_attributes(to_base_components(src_components), dst_component, {"position"}); + /* Don't copy attributes that are stored directly in the mesh data structs. */ + join_attributes( + to_base_components(src_components), dst_component, {"position", "material_index"}); } static void join_components(Span src_components, GeometrySet &result) @@ -252,11 +262,11 @@ static void join_components(Span src_components, Geomet } template -static void join_component_type(Span src_geometry_sets, GeometrySet &result) +static void join_component_type(Span src_geometry_sets, GeometrySet &result) { Vector components; - for (const GeometrySet *geometry_set : src_geometry_sets) { - const Component *component = geometry_set->get_component_for_read(); + for (const GeometrySet &geometry_set : src_geometry_sets) { + const Component *component = geometry_set.get_component_for_read(); if (component != nullptr && !component->is_empty()) { components.append(component); } @@ -274,16 +284,13 @@ static void join_component_type(Span src_geometry_sets, Geo static void geo_node_join_geometry_exec(GeoNodeExecParams params) { - GeometrySet geometry_set_a = params.extract_input("Geometry"); - GeometrySet geometry_set_b = params.extract_input("Geometry_001"); + Vector geometry_sets = params.extract_multi_input("Geometry"); + GeometrySet geometry_set_result; - - std::array src_geometry_sets = {&geometry_set_a, &geometry_set_b}; - - join_component_type(src_geometry_sets, geometry_set_result); - join_component_type(src_geometry_sets, geometry_set_result); - join_component_type(src_geometry_sets, geometry_set_result); - join_component_type(src_geometry_sets, geometry_set_result); + join_component_type(geometry_sets, geometry_set_result); + join_component_type(geometry_sets, geometry_set_result); + join_component_type(geometry_sets, geometry_set_result); + join_component_type(geometry_sets, geometry_set_result); params.set_output("Geometry", std::move(geometry_set_result)); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_object_info.cc b/source/blender/nodes/geometry/nodes/node_geo_object_info.cc index d713c191d5d..54ecb20dae7 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_object_info.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_object_info.cc @@ -23,6 +23,9 @@ #include "BLI_math_matrix.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate geo_node_object_info_in[] = { {SOCK_OBJECT, N_("Object")}, {-1, ""}, @@ -36,6 +39,11 @@ static bNodeSocketTemplate geo_node_object_info_out[] = { {-1, ""}, }; +static void geo_node_object_info_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "transform_space", UI_ITEM_R_EXPAND, nullptr, ICON_NONE); +} + namespace blender::nodes { static void geo_node_object_info_exec(GeoNodeExecParams params) { @@ -69,35 +77,15 @@ static void geo_node_object_info_exec(GeoNodeExecParams params) quat_to_eul(rotation, quaternion); if (object != self_object) { - if (object->type == OB_MESH) { - Mesh *mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(object, false); - if (mesh != nullptr) { - BKE_mesh_wrapper_ensure_mdata(mesh); + InstancesComponent &instances = geometry_set.get_component_for_write(); - /* Make a copy because the life time of the other mesh might be shorter. */ - Mesh *copied_mesh = BKE_mesh_copy_for_eval(mesh, false); - - if (transform_space_relative) { - /* Transform into the local space of the object that is being modified. */ - BKE_mesh_transform(copied_mesh, transform, true); - } - - MeshComponent &mesh_component = geometry_set.get_component_for_write(); - mesh_component.replace(copied_mesh); - mesh_component.copy_vertex_group_names_from_object(*object); - } + if (transform_space_relative) { + instances.add_instance(object, transform); } - if (object->type == OB_VOLUME) { - InstancesComponent &instances = geometry_set.get_component_for_write(); - - if (transform_space_relative) { - instances.add_instance(object, transform); - } - else { - float unit_transform[4][4]; - unit_m4(unit_transform); - instances.add_instance(object, unit_transform); - } + else { + float unit_transform[4][4]; + unit_m4(unit_transform); + instances.add_instance(object, unit_transform); } } } @@ -128,5 +116,6 @@ void register_node_type_geo_object_info() node_type_storage( &ntype, "NodeGeometryObjectInfo", node_free_standard_storage, node_copy_standard_storage); ntype.geometry_node_execute = blender::nodes::geo_node_object_info_exec; + ntype.draw_buttons = geo_node_object_info_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc index eaf13b94eb9..d9878d54353 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc @@ -33,6 +33,9 @@ #include "BKE_mesh_runtime.h" #include "BKE_pointcloud.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "node_geometry_util.hh" static bNodeSocketTemplate geo_node_point_distribute_in[] = { @@ -49,6 +52,13 @@ static bNodeSocketTemplate geo_node_point_distribute_out[] = { {-1, ""}, }; +static void geo_node_point_distribute_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *ptr) +{ + uiItemR(layout, ptr, "distribute_method", 0, "", ICON_NONE); +} + static void node_point_distribute_update(bNodeTree *UNUSED(ntree), bNode *node) { bNodeSocket *sock_min_dist = (bNodeSocket *)BLI_findlink(&node->inputs, 1); @@ -90,18 +100,21 @@ static void sample_mesh_surface(const Mesh &mesh, for (const int looptri_index : looptris.index_range()) { const MLoopTri &looptri = looptris[looptri_index]; - const int v0_index = mesh.mloop[looptri.tri[0]].v; - const int v1_index = mesh.mloop[looptri.tri[1]].v; - const int v2_index = mesh.mloop[looptri.tri[2]].v; + const int v0_loop = looptri.tri[0]; + const int v1_loop = looptri.tri[1]; + const int v2_loop = looptri.tri[2]; + const int v0_index = mesh.mloop[v0_loop].v; + const int v1_index = mesh.mloop[v1_loop].v; + const int v2_index = mesh.mloop[v2_loop].v; const float3 v0_pos = mesh.mvert[v0_index].co; const float3 v1_pos = mesh.mvert[v1_index].co; const float3 v2_pos = mesh.mvert[v2_index].co; float looptri_density_factor = 1.0f; if (density_factors != nullptr) { - const float v0_density_factor = std::max(0.0f, (*density_factors)[v0_index]); - const float v1_density_factor = std::max(0.0f, (*density_factors)[v1_index]); - const float v2_density_factor = std::max(0.0f, (*density_factors)[v2_index]); + const float v0_density_factor = std::max(0.0f, (*density_factors)[v0_loop]); + const float v1_density_factor = std::max(0.0f, (*density_factors)[v1_loop]); + const float v2_density_factor = std::max(0.0f, (*density_factors)[v2_loop]); looptri_density_factor = (v0_density_factor + v1_density_factor + v2_density_factor) / 3.0f; } const float area = area_tri_v3(v0_pos, v1_pos, v2_pos); @@ -186,13 +199,13 @@ BLI_NOINLINE static void update_elimination_mask_based_on_density_factors( const MLoopTri &looptri = looptris[looptri_indices[i]]; const float3 bary_coord = bary_coords[i]; - const int v0_index = mesh.mloop[looptri.tri[0]].v; - const int v1_index = mesh.mloop[looptri.tri[1]].v; - const int v2_index = mesh.mloop[looptri.tri[2]].v; + const int v0_loop = looptri.tri[0]; + const int v1_loop = looptri.tri[1]; + const int v2_loop = looptri.tri[2]; - const float v0_density_factor = std::max(0.0f, density_factors[v0_index]); - const float v1_density_factor = std::max(0.0f, density_factors[v1_index]); - const float v2_density_factor = std::max(0.0f, density_factors[v2_index]); + const float v0_density_factor = std::max(0.0f, density_factors[v0_loop]); + const float v1_density_factor = std::max(0.0f, density_factors[v1_loop]); + const float v2_density_factor = std::max(0.0f, density_factors[v2_loop]); const float probablity = v0_density_factor * bary_coord.x + v1_density_factor * bary_coord.y + v2_density_factor * bary_coord.z; @@ -366,7 +379,7 @@ BLI_NOINLINE static void compute_special_attributes(const Mesh &mesh, const float3 v1_pos = mesh.mvert[v1_index].co; const float3 v2_pos = mesh.mvert[v2_index].co; - ids[i] = (int)(bary_coord.hash()) + looptri_index; + ids[i] = (int)(bary_coord.hash() + (uint64_t)looptri_index); normal_tri_v3(normals[i], v0_pos, v1_pos, v2_pos); rotations[i] = normal_to_euler_rotation(normals[i]); } @@ -409,10 +422,14 @@ static void geo_node_point_distribute_exec(GeoNodeExecParams params) GeometrySet geometry_set = params.extract_input("Geometry"); GeometrySet geometry_set_out; - GeometryNodePointDistributeMethod distribute_method = - static_cast(params.node().custom1); + /* TODO: This node only needs read-only access to input instances. */ + geometry_set = geometry_set_realize_instances(geometry_set); + + GeometryNodePointDistributeMode distribute_method = static_cast( + params.node().custom1); if (!geometry_set.has_mesh()) { + params.error_message_add(NodeWarningType::Error, "Geometry must contain a mesh."); params.set_output("Geometry", std::move(geometry_set_out)); return; } @@ -428,13 +445,14 @@ static void geo_node_point_distribute_exec(GeoNodeExecParams params) const MeshComponent &mesh_component = *geometry_set.get_component_for_read(); const Mesh *mesh_in = mesh_component.get_for_read(); - if (mesh_in == nullptr || mesh_in->mpoly == nullptr) { + if (mesh_in->mpoly == nullptr) { + params.error_message_add(NodeWarningType::Error, "Mesh has no faces."); params.set_output("Geometry", std::move(geometry_set_out)); return; } const FloatReadAttribute density_factors = mesh_component.attribute_get_for_read( - density_attribute, ATTR_DOMAIN_POINT, 1.0f); + density_attribute, ATTR_DOMAIN_CORNER, 1.0f); const int seed = params.get_input("Seed"); Vector positions; @@ -485,5 +503,6 @@ void register_node_type_geo_point_distribute() node_type_socket_templates(&ntype, geo_node_point_distribute_in, geo_node_point_distribute_out); node_type_update(&ntype, node_point_distribute_update); ntype.geometry_node_execute = blender::nodes::geo_node_point_distribute_exec; + ntype.draw_buttons = geo_node_point_distribute_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc index 3bd8c355124..669b5ee4614 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc @@ -24,6 +24,9 @@ #include "BLI_hash.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "node_geometry_util.hh" static bNodeSocketTemplate geo_node_point_instance_in[] = { @@ -39,6 +42,14 @@ static bNodeSocketTemplate geo_node_point_instance_out[] = { {-1, ""}, }; +static void geo_node_point_instance_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "instance_type", UI_ITEM_R_EXPAND, nullptr, ICON_NONE); + if (RNA_enum_get(ptr, "instance_type") == GEO_NODE_POINT_INSTANCE_TYPE_COLLECTION) { + uiItemR(layout, ptr, "use_whole_collection", 0, nullptr, ICON_NONE); + } +} + namespace blender::nodes { static void geo_node_point_instance_update(bNodeTree *UNUSED(tree), bNode *node) @@ -90,6 +101,12 @@ static void get_instanced_data__collection( return; } + if (BLI_listbase_is_empty(&collection->children) && + BLI_listbase_is_empty(&collection->gobject)) { + params.error_message_add(NodeWarningType::Info, "Collection is empty."); + return; + } + const bool use_whole_collection = (node_storage->flag & GEO_NODE_POINT_INSTANCE_WHOLE_COLLECTION) != 0; if (use_whole_collection) { @@ -183,6 +200,10 @@ static void geo_node_point_instance_exec(GeoNodeExecParams params) GeometrySet geometry_set = params.extract_input("Geometry"); GeometrySet geometry_set_out; + /* TODO: This node should be able to instance on the input instances component + * rather than making the entire input geometry set real. */ + geometry_set = geometry_set_realize_instances(geometry_set); + InstancesComponent &instances = geometry_set_out.get_component_for_write(); if (geometry_set.has()) { add_instances_from_geometry_component( @@ -216,6 +237,7 @@ void register_node_type_geo_point_instance() node_type_init(&ntype, blender::nodes::geo_node_point_instance_init); node_type_storage( &ntype, "NodeGeometryPointInstance", node_free_standard_storage, node_copy_standard_storage); + ntype.draw_buttons = geo_node_point_instance_layout; node_type_update(&ntype, blender::nodes::geo_node_point_instance_update); ntype.geometry_node_execute = blender::nodes::geo_node_point_instance_exec; nodeRegisterType(&ntype); diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc b/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc index b1451dfb89e..5eef2fabce0 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc @@ -18,6 +18,9 @@ #include "BLI_math_rotation.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate geo_node_point_rotate_in[] = { {SOCK_GEOMETRY, N_("Geometry")}, {SOCK_STRING, N_("Axis")}, @@ -34,6 +37,26 @@ static bNodeSocketTemplate geo_node_point_rotate_out[] = { {-1, ""}, }; +static void geo_node_point_rotate_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + NodeGeometryRotatePoints *storage = (NodeGeometryRotatePoints *)((bNode *)ptr->data)->storage; + + uiItemR(layout, ptr, "type", UI_ITEM_R_EXPAND, nullptr, ICON_NONE); + uiItemR(layout, ptr, "space", UI_ITEM_R_EXPAND, nullptr, ICON_NONE); + + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + + uiLayout *col = uiLayoutColumn(layout, false); + if (storage->type == GEO_NODE_POINT_ROTATE_TYPE_AXIS_ANGLE) { + uiItemR(col, ptr, "input_type_axis", 0, IFACE_("Axis"), ICON_NONE); + uiItemR(col, ptr, "input_type_angle", 0, IFACE_("Angle"), ICON_NONE); + } + else { + uiItemR(col, ptr, "input_type_rotation", 0, IFACE_("Rotation"), ICON_NONE); + } +} + namespace blender::nodes { static void point_rotate__axis_angle__object_space(const int domain_size, @@ -145,6 +168,8 @@ static void geo_node_point_rotate_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { point_rotate_on_component(geometry_set.get_component_for_write(), params); } @@ -202,5 +227,6 @@ void register_node_type_geo_point_rotate() node_type_storage( &ntype, "NodeGeometryRotatePoints", node_free_standard_storage, node_copy_standard_storage); ntype.geometry_node_execute = blender::nodes::geo_node_point_rotate_exec; + ntype.draw_buttons = geo_node_point_rotate_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc b/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc index 47fca93d2ab..e28013a8bfc 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc @@ -18,6 +18,9 @@ #include "BKE_colorband.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate geo_node_point_scale_in[] = { {SOCK_GEOMETRY, N_("Geometry")}, {SOCK_STRING, N_("Factor")}, @@ -30,6 +33,13 @@ static bNodeSocketTemplate geo_node_point_scale_out[] = { {-1, ""}, }; +static void geo_node_point_scale_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + uiItemR(layout, ptr, "input_type", 0, IFACE_("Type"), ICON_NONE); +} + namespace blender::nodes { static void execute_on_component(GeoNodeExecParams params, GeometryComponent &component) @@ -56,6 +66,8 @@ static void geo_node_point_scale_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { execute_on_component(params, geometry_set.get_component_for_write()); } @@ -96,5 +108,6 @@ void register_node_type_geo_point_scale() node_type_storage( &ntype, "NodeGeometryPointScale", node_free_standard_storage, node_copy_standard_storage); ntype.geometry_node_execute = blender::nodes::geo_node_point_scale_exec; + ntype.draw_buttons = geo_node_point_scale_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc b/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc index 066b2952111..53d0fe1e112 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc @@ -84,19 +84,15 @@ static void move_split_attributes(const GeometryComponent &in_component, const CustomDataType data_type = bke::cpp_type_to_custom_data_type(attribute->cpp_type()); const AttributeDomain domain = attribute->domain(); - /* Don't try to create the attribute on the new component if it already exists. Built-in - * attributes will already exist on new components by definition. It should always be possible - * to recreate the attribute on the same component type. Also, if one of the new components - * has the attribute the other one should have it too, but check independently to be safe. */ + /* Don't try to create the attribute on the new component if it already exists (i.e. has been + * initialized by someone else). */ if (!out_component_a.attribute_exists(name)) { if (!out_component_a.attribute_try_create(name, domain, data_type)) { - BLI_assert(false); continue; } } if (!out_component_b.attribute_exists(name)) { if (!out_component_b.attribute_try_create(name, domain, data_type)) { - BLI_assert(false); continue; } } @@ -182,6 +178,10 @@ static void geo_node_point_separate_exec(GeoNodeExecParams params) GeometrySet out_set_a(geometry_set); GeometrySet out_set_b; + /* TODO: This is not necessary-- the input geometry set can be read only, + * but it must be rewritten to handle instance groups. */ + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { separate_point_cloud(*geometry_set.get_component_for_read(), params, diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_translate.cc b/source/blender/nodes/geometry/nodes/node_geo_point_translate.cc index 72176b11fdb..cb3cd012c77 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_translate.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_translate.cc @@ -18,6 +18,9 @@ #include "BKE_colorband.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate geo_node_point_translate_in[] = { {SOCK_GEOMETRY, N_("Geometry")}, {SOCK_STRING, N_("Translation")}, @@ -30,6 +33,13 @@ static bNodeSocketTemplate geo_node_point_translate_out[] = { {-1, ""}, }; +static void geo_node_point_translate_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + uiItemR(layout, ptr, "input_type", 0, IFACE_("Type"), ICON_NONE); +} + namespace blender::nodes { static void execute_on_component(GeoNodeExecParams params, GeometryComponent &component) @@ -55,6 +65,8 @@ static void geo_node_point_translate_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { execute_on_component(params, geometry_set.get_component_for_write()); } @@ -97,5 +109,6 @@ void register_node_type_geo_point_translate() node_free_standard_storage, node_copy_standard_storage); ntype.geometry_node_execute = blender::nodes::geo_node_point_translate_exec; + ntype.draw_buttons = geo_node_point_translate_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc b/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc index b90ef2034a8..b79ca0a6197 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc @@ -25,6 +25,9 @@ #include "BKE_lib_id.h" #include "BKE_volume.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate geo_node_points_to_volume_in[] = { {SOCK_GEOMETRY, N_("Geometry")}, {SOCK_FLOAT, N_("Density"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, FLT_MAX}, @@ -40,6 +43,16 @@ static bNodeSocketTemplate geo_node_point_translate_out[] = { {-1, ""}, }; +static void geo_node_points_to_volume_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *ptr) +{ + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + uiItemR(layout, ptr, "resolution_mode", 0, IFACE_("Resolution"), ICON_NONE); + uiItemR(layout, ptr, "input_type_radius", 0, IFACE_("Radius"), ICON_NONE); +} + namespace blender::nodes { #ifdef WITH_OPENVDB @@ -202,6 +215,9 @@ static void geo_node_points_to_volume_exec(GeoNodeExecParams params) GeometrySet geometry_set_in = params.extract_input("Geometry"); GeometrySet geometry_set_out; + /* TODO: Read-only access to instances should be supported here, for now they are made real. */ + geometry_set_in = geometry_set_realize_instances(geometry_set_in); + #ifdef WITH_OPENVDB initialize_volume_component_from_points(geometry_set_in, geometry_set_out, params); #endif @@ -255,5 +271,6 @@ void register_node_type_geo_points_to_volume() node_type_init(&ntype, blender::nodes::geo_node_points_to_volume_init); node_type_update(&ntype, blender::nodes::geo_node_points_to_volume_update); ntype.geometry_node_execute = blender::nodes::geo_node_points_to_volume_exec; + ntype.draw_buttons = geo_node_points_to_volume_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc b/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc index 543859aef3f..47304a0de68 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc @@ -20,6 +20,9 @@ #include "BKE_subdiv.h" #include "BKE_subdiv_mesh.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "node_geometry_util.hh" static bNodeSocketTemplate geo_node_subdivision_surface_in[] = { @@ -36,11 +39,24 @@ static bNodeSocketTemplate geo_node_subdivision_surface_out[] = { {-1, ""}, }; +static void geo_node_subdivision_surface_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *UNUSED(ptr)) +{ +#ifndef WITH_OPENSUBDIV + uiItemL(layout, IFACE_("Disabled, built without OpenSubdiv"), ICON_ERROR); +#else + UNUSED_VARS(layout); +#endif +} + namespace blender::nodes { static void geo_node_subdivision_surface_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (!geometry_set.has_mesh()) { params.set_output("Geometry", geometry_set); return; @@ -93,7 +109,8 @@ static void geo_node_subdivision_surface_exec(GeoNodeExecParams params) Mesh *mesh_out = BKE_subdiv_to_mesh(subdiv, &mesh_settings, mesh_in); BKE_mesh_calc_normals(mesh_out); - geometry_set.replace_mesh(mesh_out); + MeshComponent &mesh_component = geometry_set.get_component_for_write(); + mesh_component.replace_mesh_but_keep_vertex_group_names(mesh_out); // BKE_subdiv_stats_print(&subdiv->stats); BKE_subdiv_free(subdiv); @@ -112,5 +129,6 @@ void register_node_type_geo_subdivision_surface() node_type_socket_templates( &ntype, geo_node_subdivision_surface_in, geo_node_subdivision_surface_out); ntype.geometry_node_execute = blender::nodes::geo_node_subdivision_surface_exec; + ntype.draw_buttons = geo_node_subdivision_surface_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface_simple.cc b/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface_simple.cc new file mode 100644 index 00000000000..2a0cb727cd6 --- /dev/null +++ b/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface_simple.cc @@ -0,0 +1,115 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "MEM_guardedalloc.h" + +#include "BKE_mesh.h" +#include "BKE_subdiv.h" +#include "BKE_subdiv_mesh.h" + +#include "UI_interface.h" +#include "UI_resources.h" + +#include "node_geometry_util.hh" + +static bNodeSocketTemplate geo_node_subdivision_surface_simple_in[] = { + {SOCK_GEOMETRY, N_("Geometry")}, + {SOCK_INT, N_("Level"), 1, 0, 0, 0, 0, 6}, + {-1, ""}, +}; + +static bNodeSocketTemplate geo_node_subdivision_surface_simple_out[] = { + {SOCK_GEOMETRY, N_("Geometry")}, + {-1, ""}, +}; + +namespace blender::nodes { + +static void geo_node_subdivision_surface_simple_exec(GeoNodeExecParams params) +{ + GeometrySet geometry_set = params.extract_input("Geometry"); + + if (!geometry_set.has_mesh()) { + params.set_output("Geometry", geometry_set); + return; + } + +#ifndef WITH_OPENSUBDIV + params.error_message_add(NodeWarningType::Error, + "Disabled, Blender was built without OpenSubdiv"); + params.set_output("Geometry", std::move(geometry_set)); + return; +#endif + + /* See CCGSUBSURF_LEVEL_MAX for max limit. */ + const int subdiv_level = clamp_i(params.extract_input("Level"), 0, 11); + + if (subdiv_level == 0) { + params.set_output("Geometry", std::move(geometry_set)); + return; + } + + const Mesh *mesh_in = geometry_set.get_mesh_for_read(); + + /* Initialize mesh settings. */ + SubdivToMeshSettings mesh_settings; + mesh_settings.resolution = (1 << subdiv_level) + 1; + mesh_settings.use_optimal_display = false; + + /* Initialize subdivision settings. */ + SubdivSettings subdiv_settings; + subdiv_settings.is_simple = true; + subdiv_settings.is_adaptive = false; + subdiv_settings.use_creases = false; + subdiv_settings.level = 1; + subdiv_settings.vtx_boundary_interpolation = BKE_subdiv_vtx_boundary_interpolation_from_subsurf( + 0); + subdiv_settings.fvar_linear_interpolation = BKE_subdiv_fvar_interpolation_from_uv_smooth(0); + + /* Apply subdivision from mesh. */ + Subdiv *subdiv = BKE_subdiv_update_from_mesh(nullptr, &subdiv_settings, mesh_in); + + /* In case of bad topology, skip to input mesh. */ + if (subdiv == nullptr) { + params.set_output("Geometry", std::move(geometry_set)); + return; + } + + Mesh *mesh_out = BKE_subdiv_to_mesh(subdiv, &mesh_settings, mesh_in); + BKE_mesh_calc_normals(mesh_out); + + geometry_set.replace_mesh(mesh_out); + + BKE_subdiv_free(subdiv); + + params.set_output("Geometry", std::move(geometry_set)); +} +} // namespace blender::nodes + +void register_node_type_geo_subdivision_surface_simple() +{ + static bNodeType ntype; + + geo_node_type_base(&ntype, + GEO_NODE_SUBDIVISION_SURFACE_SIMPLE, + "Simple Subdivision Surface", + NODE_CLASS_GEOMETRY, + 0); + node_type_socket_templates( + &ntype, geo_node_subdivision_surface_simple_in, geo_node_subdivision_surface_simple_out); + ntype.geometry_node_execute = blender::nodes::geo_node_subdivision_surface_simple_exec; + nodeRegisterType(&ntype); +} diff --git a/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc b/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc index c224731ad9f..0c754ad3b37 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc @@ -18,6 +18,9 @@ #include "RNA_enum_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "node_geometry_util.hh" extern "C" { @@ -39,6 +42,12 @@ static bNodeSocketTemplate geo_node_triangulate_out[] = { {-1, ""}, }; +static void geo_node_triangulate_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "quad_method", 0, "", ICON_NONE); + uiItemR(layout, ptr, "ngon_method", 0, "", ICON_NONE); +} + static void geo_triangulate_init(bNodeTree *UNUSED(ntree), bNode *node) { node->custom1 = GEO_NODE_TRIANGULATE_QUAD_SHORTEDGE; @@ -56,6 +65,8 @@ static void geo_node_triangulate_exec(GeoNodeExecParams params) GeometryNodeTriangulateNGons ngon_method = static_cast( params.node().custom2); + geometry_set = geometry_set_realize_instances(geometry_set); + /* #triangulate_mesh might modify the input mesh currently. */ Mesh *mesh_in = geometry_set.get_mesh_for_write(); if (mesh_in != nullptr) { @@ -75,5 +86,6 @@ void register_node_type_geo_triangulate() node_type_socket_templates(&ntype, geo_node_triangulate_in, geo_node_triangulate_out); node_type_init(&ntype, geo_triangulate_init); ntype.geometry_node_execute = blender::nodes::geo_node_triangulate_exec; + ntype.draw_buttons = geo_node_triangulate_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc b/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc index b1d1430bccd..54dccb613a1 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc @@ -31,6 +31,9 @@ #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate geo_node_volume_to_mesh_in[] = { {SOCK_GEOMETRY, N_("Geometry")}, {SOCK_STRING, N_("Grid")}, @@ -46,6 +49,13 @@ static bNodeSocketTemplate geo_node_volume_to_mesh_out[] = { {-1, ""}, }; +static void geo_node_volume_to_mesh_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + uiItemR(layout, ptr, "resolution_mode", 0, IFACE_("Resolution"), ICON_NONE); +} + namespace blender::nodes { static void geo_node_volume_to_mesh_init(bNodeTree *UNUSED(ntree), bNode *node) @@ -156,5 +166,6 @@ void register_node_type_geo_volume_to_mesh() node_type_init(&ntype, blender::nodes::geo_node_volume_to_mesh_init); node_type_update(&ntype, blender::nodes::geo_node_volume_to_mesh_update); ntype.geometry_node_execute = blender::nodes::geo_node_volume_to_mesh_exec; + ntype.draw_buttons = geo_node_volume_to_mesh_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/intern/node_geometry_exec.cc b/source/blender/nodes/intern/node_geometry_exec.cc index eef2c6c9125..a2e0a4dd6a4 100644 --- a/source/blender/nodes/intern/node_geometry_exec.cc +++ b/source/blender/nodes/intern/node_geometry_exec.cc @@ -14,19 +14,40 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#include "DNA_modifier_types.h" + +#include "BKE_node_ui_storage.hh" + +#include "DEG_depsgraph_query.h" + +#include "NOD_derived_node_tree.hh" #include "NOD_geometry_exec.hh" #include "NOD_type_callbacks.hh" +#include "node_geometry_util.hh" + namespace blender::nodes { +void GeoNodeExecParams::error_message_add(const NodeWarningType type, std::string message) const +{ + bNodeTree *btree_cow = node_.node_ref().tree().btree(); + BLI_assert(btree_cow != nullptr); + if (btree_cow == nullptr) { + return; + } + bNodeTree *btree_original = (bNodeTree *)DEG_get_original_id((ID *)btree_cow); + + const NodeTreeEvaluationContext context(*self_object_, *modifier_); + + BKE_nodetree_error_message_add( + *btree_original, context, *node_.bnode(), type, std::move(message)); +} + const bNodeSocket *GeoNodeExecParams::find_available_socket(const StringRef name) const { - LISTBASE_FOREACH (const bNodeSocket *, socket, &node_.inputs) { - if ((socket->flag & SOCK_UNAVAIL) != 0) { - continue; - } - if (name == socket->name) { - return socket; + for (const DSocket *socket : node_.inputs()) { + if (socket->is_available() && socket->name() == name) { + return socket->bsocket(); } } @@ -47,7 +68,20 @@ ReadAttributePtr GeoNodeExecParams::get_input_attribute(const StringRef name, if (found_socket->type == SOCK_STRING) { const std::string name = this->get_input(found_socket->identifier); - return component.attribute_get_for_read(name, domain, type, default_value); + /* Try getting the attribute without the default value. */ + ReadAttributePtr attribute = component.attribute_try_get_for_read(name, domain, type); + if (attribute) { + return attribute; + } + + /* If the attribute doesn't exist, use the default value and output an error message + * (except when the field is empty, to avoid spamming error messages, and not when + * the domain is empty and we don't expect an attribute anyway). */ + if (!name.empty() && component.attribute_domain_size(domain) != 0) { + this->error_message_add(NodeWarningType::Error, + std::string("No attribute with name '") + name + "'."); + } + return component.attribute_get_constant_for_read(domain, type, default_value); } if (found_socket->type == SOCK_FLOAT) { const float value = this->get_input(found_socket->identifier); @@ -104,22 +138,57 @@ CustomDataType GeoNodeExecParams::get_input_attribute_data_type( return default_type; } +/** + * If any of the corresponding input sockets are attributes instead of single values, + * use the highest priority attribute domain from among them. + * Otherwise return the default domain. + */ +AttributeDomain GeoNodeExecParams::get_highest_priority_input_domain( + Span names, + const GeometryComponent &component, + const AttributeDomain default_domain) const +{ + Vector input_domains; + for (const std::string &name : names) { + const bNodeSocket *found_socket = this->find_available_socket(name); + BLI_assert(found_socket != nullptr); /* A socket should be available socket for the name. */ + if (found_socket == nullptr) { + continue; + } + + if (found_socket->type == SOCK_STRING) { + const std::string name = this->get_input(found_socket->identifier); + ReadAttributePtr attribute = component.attribute_try_get_for_read(name); + if (attribute) { + input_domains.append(attribute->domain()); + } + } + } + + if (input_domains.size() > 0) { + return bke::attribute_domain_highest_priority(input_domains); + } + + return default_domain; +} + void GeoNodeExecParams::check_extract_input(StringRef identifier, const CPPType *requested_type) const { bNodeSocket *found_socket = nullptr; - LISTBASE_FOREACH (bNodeSocket *, socket, &node_.inputs) { - if (identifier == socket->identifier) { - found_socket = socket; + for (const DSocket *socket : node_.inputs()) { + if (socket->identifier() == identifier) { + found_socket = socket->bsocket(); break; } } + if (found_socket == nullptr) { std::cout << "Did not find an input socket with the identifier '" << identifier << "'.\n"; std::cout << "Possible identifiers are: "; - LISTBASE_FOREACH (bNodeSocket *, socket, &node_.inputs) { - if ((socket->flag & SOCK_UNAVAIL) == 0) { - std::cout << "'" << socket->identifier << "', "; + for (const DSocket *socket : node_.inputs()) { + if (socket->is_available()) { + std::cout << "'" << socket->identifier() << "', "; } } std::cout << "\n"; @@ -149,18 +218,19 @@ void GeoNodeExecParams::check_extract_input(StringRef identifier, void GeoNodeExecParams::check_set_output(StringRef identifier, const CPPType &value_type) const { bNodeSocket *found_socket = nullptr; - LISTBASE_FOREACH (bNodeSocket *, socket, &node_.outputs) { - if (identifier == socket->identifier) { - found_socket = socket; + for (const DSocket *socket : node_.outputs()) { + if (socket->identifier() == identifier) { + found_socket = socket->bsocket(); break; } } + if (found_socket == nullptr) { std::cout << "Did not find an output socket with the identifier '" << identifier << "'.\n"; std::cout << "Possible identifiers are: "; - LISTBASE_FOREACH (bNodeSocket *, socket, &node_.outputs) { - if ((socket->flag & SOCK_UNAVAIL) == 0) { - std::cout << "'" << socket->identifier << "', "; + for (const DSocket *socket : node_.outputs()) { + if (socket->is_available()) { + std::cout << "'" << socket->identifier() << "', "; } } std::cout << "\n"; diff --git a/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.c b/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.c index 5d3a9dfc025..36971d4e799 100644 --- a/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.c +++ b/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.c @@ -46,7 +46,9 @@ static int node_shader_gpu_ambient_occlusion(GPUMaterial *mat, GPU_material_flag_set(mat, GPU_MATFLAG_DIFFUSE); - return GPU_stack_link(mat, node, "node_ambient_occlusion", in, out); + float inverted = node->custom2 ? 1.0f : 0.0f; + + return GPU_stack_link(mat, node, "node_ambient_occlusion", in, out, GPU_constant(&inverted)); } static void node_shader_init_ambient_occlusion(bNodeTree *UNUSED(ntree), bNode *node) diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c b/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c index e0fcce6f617..5fc946e3509 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c +++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c @@ -49,6 +49,10 @@ static int node_shader_gpu_bsdf_glass(GPUMaterial *mat, GPU_link(mat, "world_normals_get", &in[3].link); } + if (node->custom1 == SHD_GLOSSY_SHARP) { + GPU_link(mat, "set_value_zero", &in[1].link); + } + GPU_material_flag_set(mat, GPU_MATFLAG_GLOSSY | GPU_MATFLAG_REFRACT); float use_multi_scatter = (node->custom1 == SHD_GLOSSY_MULTI_GGX) ? 1.0f : 0.0f; diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c b/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c index b9f0e793a61..f601f3e9fd0 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c +++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c @@ -134,54 +134,32 @@ static int node_shader_gpu_bsdf_principled(GPUMaterial *mat, GPU_link(mat, "set_rgb_one", &sss_scale); } - /* Due to the manual effort done per config, we only optimize the most common permutations. */ - char *node_name; - uint flag = 0; - if (!use_subsurf && use_diffuse && !use_refract && !use_clear) { - static char name[] = "node_bsdf_principled_dielectric"; - node_name = name; - flag = GPU_MATFLAG_DIFFUSE | GPU_MATFLAG_GLOSSY; + uint flag = GPU_MATFLAG_GLOSSY; + if (use_diffuse) { + flag |= GPU_MATFLAG_DIFFUSE; } - else if (!use_subsurf && !use_diffuse && !use_refract && !use_clear) { - static char name[] = "node_bsdf_principled_metallic"; - node_name = name; - flag = GPU_MATFLAG_GLOSSY; + if (use_refract) { + flag |= GPU_MATFLAG_REFRACT; } - else if (!use_subsurf && !use_diffuse && !use_refract && use_clear) { - static char name[] = "node_bsdf_principled_clearcoat"; - node_name = name; - flag = GPU_MATFLAG_GLOSSY; - } - else if (use_subsurf && use_diffuse && !use_refract && !use_clear) { - static char name[] = "node_bsdf_principled_subsurface"; - node_name = name; - flag = GPU_MATFLAG_DIFFUSE | GPU_MATFLAG_GLOSSY; - } - else if (!use_subsurf && !use_diffuse && use_refract && !use_clear && !socket_not_zero(4)) { - static char name[] = "node_bsdf_principled_glass"; - node_name = name; - flag = GPU_MATFLAG_GLOSSY | GPU_MATFLAG_REFRACT; - } - else { - static char name[] = "node_bsdf_principled"; - node_name = name; - flag = GPU_MATFLAG_DIFFUSE | GPU_MATFLAG_GLOSSY | GPU_MATFLAG_REFRACT; - } - if (use_subsurf) { flag |= GPU_MATFLAG_SSS; } + float f_use_diffuse = use_diffuse ? 1.0f : 0.0f; + float f_use_clearcoat = use_clear ? 1.0f : 0.0f; + float f_use_refraction = use_refract ? 1.0f : 0.0f; float use_multi_scatter = (node->custom1 == SHD_GLOSSY_MULTI_GGX) ? 1.0f : 0.0f; GPU_material_flag_set(mat, flag); return GPU_stack_link(mat, node, - node_name, + "node_bsdf_principled", in, out, - GPU_builtin(GPU_VIEW_POSITION), + GPU_constant(&f_use_diffuse), + GPU_constant(&f_use_clearcoat), + GPU_constant(&f_use_refraction), GPU_constant(&use_multi_scatter), GPU_constant(&node->ssr_id), GPU_constant(&node->sss_id), diff --git a/source/blender/nodes/shader/nodes/node_shader_map_range.cc b/source/blender/nodes/shader/nodes/node_shader_map_range.cc index 4a6c9ec9a4d..c01e390c513 100644 --- a/source/blender/nodes/shader/nodes/node_shader_map_range.cc +++ b/source/blender/nodes/shader/nodes/node_shader_map_range.cc @@ -122,7 +122,8 @@ class MapRangeFunction : public blender::fn::MultiFunction { if (clamp_) { for (int64_t i : mask) { - CLAMP(results[i], 0.0f, 1.0f); + results[i] = (to_min[i] > to_max[i]) ? clamp_f(results[i], to_max[i], to_min[i]) : + clamp_f(results[i], to_min[i], to_max[i]); } } } diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h index 366d801a888..90f54c50a6d 100644 --- a/source/blender/python/BPY_extern.h +++ b/source/blender/python/BPY_extern.h @@ -21,6 +21,7 @@ #pragma once struct AnimationEvalContext; +struct ARegionType; struct ChannelDriver; /* DNA_anim_types.h */ struct ID; /* DNA_ID.h */ struct ListBase; /* DNA_listBase.h */ @@ -33,6 +34,7 @@ struct bConstraintTarget; /* DNA_constraint_types.h*/ struct bContext; struct bContextDataResult; struct bPythonConstraint; /* DNA_constraint_types.h */ +struct wmWindowManager; #include "BLI_utildefines.h" @@ -100,6 +102,10 @@ void BPY_id_release(struct ID *id); bool BPY_string_is_keyword(const char *str); +/* bpy_rna_callback.c */ +void BPY_callback_screen_free(struct ARegionType *art); +void BPY_callback_wm_free(struct wmWindowManager *wm); + /* I18n for addons */ #ifdef WITH_INTERNATIONAL const char *BPY_app_translations_py_pgettext(const char *msgctxt, const char *msgid); diff --git a/source/blender/python/bmesh/bmesh_py_ops.c b/source/blender/python/bmesh/bmesh_py_ops.c index 03a890d315c..b23891ca1fe 100644 --- a/source/blender/python/bmesh/bmesh_py_ops.c +++ b/source/blender/python/bmesh/bmesh_py_ops.c @@ -167,11 +167,7 @@ static PyTypeObject bmesh_op_Type = { 0, /* tp_itemsize */ /* methods */ NULL, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif + 0, /* tp_vectorcall_offset */ NULL, /* getattrfunc tp_getattr; */ NULL, /* setattrfunc tp_setattr; */ NULL, @@ -249,7 +245,7 @@ static PyTypeObject bmesh_op_Type = { static PyObject *bpy_bmesh_ops_module_getattro(PyObject *UNUSED(self), PyObject *pyname) { - const char *opname = _PyUnicode_AsString(pyname); + const char *opname = PyUnicode_AsUTF8(pyname); if (BMO_opcode_from_opname(opname) != -1) { return bpy_bmesh_op_CreatePyObject(opname); diff --git a/source/blender/python/bmesh/bmesh_py_ops_call.c b/source/blender/python/bmesh/bmesh_py_ops_call.c index d0676ec1947..28daf08507d 100644 --- a/source/blender/python/bmesh/bmesh_py_ops_call.c +++ b/source/blender/python/bmesh/bmesh_py_ops_call.c @@ -184,7 +184,7 @@ static int bpy_slot_from_py(BMesh *bm, if (slot->slot_subtype.intg == BMO_OP_SLOT_SUBTYPE_INT_ENUM) { int enum_val = -1; PyC_FlagSet *items = (PyC_FlagSet *)slot->data.enum_data.flags; - const char *enum_str = _PyUnicode_AsString(value); + const char *enum_str = PyUnicode_AsUTF8(value); if (enum_str == NULL) { PyErr_Format(PyExc_TypeError, @@ -787,7 +787,7 @@ PyObject *BPy_BMO_call(BPy_BMeshOpFunc *self, PyObject *args, PyObject *kw) PyObject *key, *value; Py_ssize_t pos = 0; while (PyDict_Next(kw, &pos, &key, &value)) { - const char *slot_name = _PyUnicode_AsString(key); + const char *slot_name = PyUnicode_AsUTF8(key); BMOpSlot *slot; if (!BMO_slot_exists(bmop.slots_in, slot_name)) { diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c index 928c30f681e..6375c1a1d37 100644 --- a/source/blender/python/bmesh/bmesh_py_types.c +++ b/source/blender/python/bmesh/bmesh_py_types.c @@ -3756,37 +3756,31 @@ PyObject *BPyInit_bmesh_types(void) submodule = PyModule_Create(&BPy_BM_types_module_def); -#define MODULE_TYPE_ADD(s, t) \ - PyModule_AddObject(s, t.tp_name, (PyObject *)&t); \ - Py_INCREF((PyObject *)&t) - /* bmesh_py_types.c */ - MODULE_TYPE_ADD(submodule, BPy_BMesh_Type); - MODULE_TYPE_ADD(submodule, BPy_BMVert_Type); - MODULE_TYPE_ADD(submodule, BPy_BMEdge_Type); - MODULE_TYPE_ADD(submodule, BPy_BMFace_Type); - MODULE_TYPE_ADD(submodule, BPy_BMLoop_Type); - MODULE_TYPE_ADD(submodule, BPy_BMElemSeq_Type); - MODULE_TYPE_ADD(submodule, BPy_BMVertSeq_Type); - MODULE_TYPE_ADD(submodule, BPy_BMEdgeSeq_Type); - MODULE_TYPE_ADD(submodule, BPy_BMFaceSeq_Type); - MODULE_TYPE_ADD(submodule, BPy_BMLoopSeq_Type); - MODULE_TYPE_ADD(submodule, BPy_BMIter_Type); + PyModule_AddType(submodule, &BPy_BMesh_Type); + PyModule_AddType(submodule, &BPy_BMVert_Type); + PyModule_AddType(submodule, &BPy_BMEdge_Type); + PyModule_AddType(submodule, &BPy_BMFace_Type); + PyModule_AddType(submodule, &BPy_BMLoop_Type); + PyModule_AddType(submodule, &BPy_BMElemSeq_Type); + PyModule_AddType(submodule, &BPy_BMVertSeq_Type); + PyModule_AddType(submodule, &BPy_BMEdgeSeq_Type); + PyModule_AddType(submodule, &BPy_BMFaceSeq_Type); + PyModule_AddType(submodule, &BPy_BMLoopSeq_Type); + PyModule_AddType(submodule, &BPy_BMIter_Type); /* bmesh_py_types_select.c */ - MODULE_TYPE_ADD(submodule, BPy_BMEditSelSeq_Type); - MODULE_TYPE_ADD(submodule, BPy_BMEditSelIter_Type); + PyModule_AddType(submodule, &BPy_BMEditSelSeq_Type); + PyModule_AddType(submodule, &BPy_BMEditSelIter_Type); /* bmesh_py_types_customdata.c */ - MODULE_TYPE_ADD(submodule, BPy_BMLayerAccessVert_Type); - MODULE_TYPE_ADD(submodule, BPy_BMLayerAccessEdge_Type); - MODULE_TYPE_ADD(submodule, BPy_BMLayerAccessFace_Type); - MODULE_TYPE_ADD(submodule, BPy_BMLayerAccessLoop_Type); - MODULE_TYPE_ADD(submodule, BPy_BMLayerCollection_Type); - MODULE_TYPE_ADD(submodule, BPy_BMLayerItem_Type); + PyModule_AddType(submodule, &BPy_BMLayerAccessVert_Type); + PyModule_AddType(submodule, &BPy_BMLayerAccessEdge_Type); + PyModule_AddType(submodule, &BPy_BMLayerAccessFace_Type); + PyModule_AddType(submodule, &BPy_BMLayerAccessLoop_Type); + PyModule_AddType(submodule, &BPy_BMLayerCollection_Type); + PyModule_AddType(submodule, &BPy_BMLayerItem_Type); /* bmesh_py_types_meshdata.c */ - MODULE_TYPE_ADD(submodule, BPy_BMLoopUV_Type); - MODULE_TYPE_ADD(submodule, BPy_BMDeformVert_Type); - -#undef MODULE_TYPE_ADD + PyModule_AddType(submodule, &BPy_BMLoopUV_Type); + PyModule_AddType(submodule, &BPy_BMDeformVert_Type); return submodule; } diff --git a/source/blender/python/bmesh/bmesh_py_types_customdata.c b/source/blender/python/bmesh/bmesh_py_types_customdata.c index 96c36f2d788..471a311c411 100644 --- a/source/blender/python/bmesh/bmesh_py_types_customdata.c +++ b/source/blender/python/bmesh/bmesh_py_types_customdata.c @@ -804,7 +804,7 @@ static PyObject *bpy_bmlayercollection_subscript(BPy_BMLayerCollection *self, Py { /* don't need error check here */ if (PyUnicode_Check(key)) { - return bpy_bmlayercollection_subscript_str(self, _PyUnicode_AsString(key)); + return bpy_bmlayercollection_subscript_str(self, PyUnicode_AsUTF8(key)); } if (PyIndex_Check(key)) { const Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError); @@ -862,7 +862,7 @@ static PyObject *bpy_bmlayercollection_subscript(BPy_BMLayerCollection *self, Py static int bpy_bmlayercollection_contains(BPy_BMLayerCollection *self, PyObject *value) { - const char *keyname = _PyUnicode_AsString(value); + const char *keyname = PyUnicode_AsUTF8(value); CustomData *data; int index; diff --git a/source/blender/python/generic/idprop_py_api.c b/source/blender/python/generic/idprop_py_api.c index fd996c8a1a2..c329ea7965c 100644 --- a/source/blender/python/generic/idprop_py_api.c +++ b/source/blender/python/generic/idprop_py_api.c @@ -189,13 +189,13 @@ static int BPy_IDGroup_SetData(BPy_IDProperty *self, IDProperty *prop, PyObject st = (char *)PyC_UnicodeAsByte(value, &value_coerce); alloc_len = strlen(st) + 1; - st = _PyUnicode_AsString(value); + st = PyUnicode_AsUTF8(value); IDP_ResizeArray(prop, alloc_len); memcpy(IDP_Array(prop), st, alloc_len); Py_XDECREF(value_coerce); } # else - st = _PyUnicode_AsString(value); + st = PyUnicode_AsUTF8(value); IDP_ResizeArray(prop, strlen(st) + 1); strcpy(IDP_Array(prop), st); # endif @@ -253,7 +253,7 @@ static int BPy_IDGroup_SetName(BPy_IDProperty *self, PyObject *value, void *UNUS return -1; } - name = _PyUnicode_AsStringAndSize(value, &name_size); + name = PyUnicode_AsUTF8AndSize(value, &name_size); if (name_size >= MAX_IDPROP_NAME) { PyErr_SetString(PyExc_TypeError, "string length cannot exceed 63 characters!"); @@ -300,7 +300,7 @@ static PyObject *BPy_IDGroup_Map_GetItem(BPy_IDProperty *self, PyObject *item) return NULL; } - name = _PyUnicode_AsString(item); + name = PyUnicode_AsUTF8(item); if (name == NULL) { PyErr_SetString(PyExc_TypeError, "only strings are allowed as keys of ID properties"); @@ -358,7 +358,7 @@ static const char *idp_try_read_name(PyObject *name_obj) const char *name = NULL; if (name_obj) { Py_ssize_t name_size; - name = _PyUnicode_AsStringAndSize(name_obj, &name_size); + name = PyUnicode_AsUTF8AndSize(name_obj, &name_size); if (name == NULL) { PyErr_Format(PyExc_KeyError, @@ -420,7 +420,7 @@ static IDProperty *idp_from_PyUnicode(const char *name, PyObject *ob) prop = IDP_New(IDP_STRING, &val, name); Py_XDECREF(value_coerce); #else - val.str = _PyUnicode_AsString(ob); + val.str = PyUnicode_AsUTF8(ob); prop = IDP_New(IDP_STRING, val, name); #endif return prop; @@ -722,7 +722,7 @@ int BPy_Wrap_SetMapItem(IDProperty *prop, PyObject *key, PyObject *val) if (val == NULL) { /* del idprop[key] */ IDProperty *pkey; - const char *name = _PyUnicode_AsString(key); + const char *name = PyUnicode_AsUTF8(key); if (name == NULL) { PyErr_Format(PyExc_KeyError, "expected a string, not %.200s", Py_TYPE(key)->tp_name); @@ -1050,7 +1050,7 @@ static PyObject *BPy_IDGroup_items(BPy_IDProperty *self) static int BPy_IDGroup_Contains(BPy_IDProperty *self, PyObject *value) { - const char *name = _PyUnicode_AsString(value); + const char *name = PyUnicode_AsUTF8(value); if (!name) { PyErr_Format(PyExc_TypeError, "expected a string, not a %.200s", Py_TYPE(value)->tp_name); @@ -1192,12 +1192,8 @@ PyTypeObject BPy_IDGroup_Type = { /* Methods to implement standard operations */ - NULL, /* destructor tp_dealloc; */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif + NULL, /* destructor tp_dealloc; */ + 0, /* tp_vectorcall_offset */ NULL, /* getattrfunc tp_getattr; */ NULL, /* setattrfunc tp_setattr; */ NULL, /* cmpfunc tp_compare; */ @@ -1605,12 +1601,8 @@ PyTypeObject BPy_IDArray_Type = { /* Methods to implement standard operations */ - NULL, /* destructor tp_dealloc; */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif + NULL, /* destructor tp_dealloc; */ + 0, /* tp_vectorcall_offset */ NULL, /* getattrfunc tp_getattr; */ NULL, /* setattrfunc tp_setattr; */ NULL, /* cmpfunc tp_compare; */ @@ -1726,12 +1718,8 @@ PyTypeObject BPy_IDGroup_Iter_Type = { /* Methods to implement standard operations */ - NULL, /* destructor tp_dealloc; */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif + NULL, /* destructor tp_dealloc; */ + 0, /* tp_vectorcall_offset */ NULL, /* getattrfunc tp_getattr; */ NULL, /* setattrfunc tp_setattr; */ NULL, /* cmpfunc tp_compare; */ @@ -1811,16 +1799,10 @@ static PyObject *BPyInit_idprop_types(void) IDProp_Init_Types(); -#define MODULE_TYPE_ADD(s, t) \ - PyModule_AddObject(s, t.tp_name, (PyObject *)&t); \ - Py_INCREF((PyObject *)&t) - /* bmesh_py_types.c */ - MODULE_TYPE_ADD(submodule, BPy_IDGroup_Type); - MODULE_TYPE_ADD(submodule, BPy_IDGroup_Iter_Type); - MODULE_TYPE_ADD(submodule, BPy_IDArray_Type); - -#undef MODULE_TYPE_ADD + PyModule_AddType(submodule, &BPy_IDGroup_Type); + PyModule_AddType(submodule, &BPy_IDGroup_Iter_Type); + PyModule_AddType(submodule, &BPy_IDArray_Type); return submodule; } diff --git a/source/blender/python/generic/imbuf_py_api.c b/source/blender/python/generic/imbuf_py_api.c index 24029f0ca12..5b4a4fd237e 100644 --- a/source/blender/python/generic/imbuf_py_api.c +++ b/source/blender/python/generic/imbuf_py_api.c @@ -40,6 +40,8 @@ #include #include +static PyObject *BPyInit_imbuf_types(void); + static PyObject *Py_ImBuf_CreatePyObject(ImBuf *ibuf); /* -------------------------------------------------------------------- */ @@ -267,7 +269,7 @@ static int py_imbuf_filepath_set(Py_ImBuf *self, PyObject *value, void *UNUSED(c ImBuf *ibuf = self->ibuf; const Py_ssize_t value_str_len_max = sizeof(ibuf->name); Py_ssize_t value_str_len; - const char *value_str = _PyUnicode_AsStringAndSize(value, &value_str_len); + const char *value_str = PyUnicode_AsUTF8AndSize(value, &value_str_len); if (value_str_len >= value_str_len_max) { PyErr_Format(PyExc_TypeError, "filepath length over %zd", value_str_len_max - 1); return -1; @@ -347,15 +349,11 @@ PyTypeObject Py_ImBuf_Type = { /* Methods to implement standard operations */ (destructor)py_imbuf_dealloc, /* destructor tp_dealloc; */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ - NULL, /* cmpfunc tp_compare; */ - (reprfunc)py_imbuf_repr, /* reprfunc tp_repr; */ + 0, /* tp_vectorcall_offset */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ + NULL, /* cmpfunc tp_compare; */ + (reprfunc)py_imbuf_repr, /* reprfunc tp_repr; */ /* Method suites for standard classes */ @@ -526,7 +524,7 @@ static PyObject *M_imbuf_write(PyObject *UNUSED(self), PyObject *args, PyObject /** \} */ /* -------------------------------------------------------------------- */ -/** \name Module Definition +/** \name Module Definition (`imbuf`) * \{ */ static PyMethodDef IMB_methods[] = { @@ -551,11 +549,51 @@ static struct PyModuleDef IMB_module_def = { PyObject *BPyInit_imbuf(void) { + PyObject *mod; PyObject *submodule; + PyObject *sys_modules = PyImport_GetModuleDict(); - submodule = PyModule_Create(&IMB_module_def); + mod = PyModule_Create(&IMB_module_def); - PyType_Ready(&Py_ImBuf_Type); + /* `imbuf.types` */ + PyModule_AddObject(mod, "types", (submodule = BPyInit_imbuf_types())); + PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); + + return mod; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Module Definition (`imbuf.types`) + * + * `imbuf.types` module, only include this to expose access to `imbuf.types.ImBuf` + * for docs and the ability to use with built-ins such as `isinstance`, `issubclass`. + * \{ */ + +PyDoc_STRVAR(IMB_types_doc, "This module provides access to image buffer types."); + +static struct PyModuleDef IMB_types_module_def = { + PyModuleDef_HEAD_INIT, + "imbuf.types", /* m_name */ + IMB_types_doc, /* m_doc */ + 0, /* m_size */ + NULL, /* m_methods */ + NULL, /* m_reload */ + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL, /* m_free */ +}; + +PyObject *BPyInit_imbuf_types(void) +{ + PyObject *submodule = PyModule_Create(&IMB_types_module_def); + + if (PyType_Ready(&Py_ImBuf_Type) < 0) { + return NULL; + } + + PyModule_AddType(submodule, &Py_ImBuf_Type); return submodule; } diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c index ec6b8c54ac0..82e65505147 100644 --- a/source/blender/python/generic/py_capi_utils.c +++ b/source/blender/python/generic/py_capi_utils.c @@ -257,7 +257,7 @@ int PyC_ParseBool(PyObject *o, void *p) int PyC_ParseStringEnum(PyObject *o, void *p) { struct PyC_StringEnum *e = p; - const char *value = _PyUnicode_AsString(o); + const char *value = PyUnicode_AsUTF8(o); if (value == NULL) { PyErr_Format(PyExc_ValueError, "expected a string, got %s", Py_TYPE(o)->tp_name); return 0; @@ -282,6 +282,17 @@ int PyC_ParseStringEnum(PyObject *o, void *p) return 0; } +const char *PyC_StringEnum_FindIDFromValue(const struct PyC_StringEnumItems *items, + const int value) +{ + for (int i = 0; items[i].id; i++) { + if (items[i].value == value) { + return items[i].id; + } + } + return NULL; +} + /* silly function, we dont use arg. just check its compatible with __deepcopy__ */ int PyC_CheckArgs_DeepCopy(PyObject *args) { @@ -343,7 +354,7 @@ void PyC_ObSpitStr(char *result, size_t result_len, PyObject *var) (int)var->ob_refcnt, (void *)var, type ? type->tp_name : null_str, - var_str ? _PyUnicode_AsString(var_str) : ""); + var_str ? PyUnicode_AsUTF8(var_str) : ""); if (var_str != NULL) { Py_DECREF(var_str); } @@ -405,7 +416,7 @@ void PyC_FileAndNum(const char **r_filename, int *r_lineno) /* when executing a script */ if (r_filename) { - *r_filename = _PyUnicode_AsString(frame->f_code->co_filename); + *r_filename = PyUnicode_AsUTF8(frame->f_code->co_filename); } /* when executing a module */ @@ -418,7 +429,7 @@ void PyC_FileAndNum(const char **r_filename, int *r_lineno) if (mod) { PyObject *mod_file = PyModule_GetFilenameObject(mod); if (mod_file) { - *r_filename = _PyUnicode_AsString(mod_name); + *r_filename = PyUnicode_AsUTF8(mod_name); Py_DECREF(mod_file); } else { @@ -428,7 +439,7 @@ void PyC_FileAndNum(const char **r_filename, int *r_lineno) /* unlikely, fallback */ if (*r_filename == NULL) { - *r_filename = _PyUnicode_AsString(mod_name); + *r_filename = PyUnicode_AsUTF8(mod_name); } } } @@ -569,9 +580,9 @@ void PyC_Err_PrintWithFunc(PyObject *py_func) /* use py style error */ fprintf(stderr, "File \"%s\", line %d, in %s\n", - _PyUnicode_AsString(f_code->co_filename), + PyUnicode_AsUTF8(f_code->co_filename), f_code->co_firstlineno, - _PyUnicode_AsString(((PyFunctionObject *)py_func)->func_name)); + PyUnicode_AsUTF8(((PyFunctionObject *)py_func)->func_name)); } /** \} */ @@ -740,7 +751,7 @@ const char *PyC_UnicodeAsByteAndSize(PyObject *py_str, Py_ssize_t *size, PyObjec { const char *result; - result = _PyUnicode_AsStringAndSize(py_str, size); + result = PyUnicode_AsUTF8AndSize(py_str, size); if (result) { /* 99% of the time this is enough but we better support non unicode @@ -767,7 +778,7 @@ const char *PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce) { const char *result; - result = _PyUnicode_AsString(py_str); + result = PyUnicode_AsUTF8(py_str); if (result) { /* 99% of the time this is enough but we better support non unicode @@ -879,40 +890,6 @@ void PyC_MainModule_Restore(PyObject *main_mod) Py_XDECREF(main_mod); } -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name #Py_SetPythonHome Wrapper - * \{ */ - -/** - * - Must be called before #Py_Initialize. - * - Expects output of `BKE_appdir_folder_id(BLENDER_PYTHON, NULL)`. - * - Note that the `PYTHONPATH` environment variable isn't reliable, see T31506. - * Use #Py_SetPythonHome instead. - */ -void PyC_SetHomePath(const char *py_path_bundle) -{ -# ifdef __APPLE__ - /* OSX allow file/directory names to contain : character (represented as / in the Finder) - * but current Python lib (release 3.1.1) doesn't handle these correctly */ - if (strchr(py_path_bundle, ':')) { - fprintf(stderr, - "Warning! Blender application is located in a path containing ':' or '/' chars\n" - "This may make python import function fail\n"); - } -# endif - - /* Set the environment path. */ - wchar_t py_path_bundle_wchar[1024]; - - /* Can't use `mbstowcs` on linux gives bug: T23018. */ - BLI_strncpy_wchar_from_utf8( - py_path_bundle_wchar, py_path_bundle, ARRAY_SIZE(py_path_bundle_wchar)); - - Py_SetPythonHome(py_path_bundle_wchar); -} - bool PyC_IsInterpreterActive(void) { /* instead of PyThreadState_Get, which calls Py_FatalError */ @@ -1180,7 +1157,7 @@ int PyC_FlagSet_ToBitfield(PyC_FlagSet *items, *r_value = 0; while (_PySet_NextEntry(value, &pos, &key, &hash)) { - const char *param = _PyUnicode_AsString(key); + const char *param = PyUnicode_AsUTF8(key); if (param == NULL) { PyErr_Format(PyExc_TypeError, @@ -1358,7 +1335,7 @@ bool PyC_RunString_AsStringAndSize(const char *imports[], const char *val; Py_ssize_t val_len; - val = _PyUnicode_AsStringAndSize(retval, &val_len); + val = PyUnicode_AsUTF8AndSize(retval, &val_len); if (val == NULL && PyErr_Occurred()) { ok = false; } @@ -1483,7 +1460,6 @@ uint32_t PyC_Long_AsU32(PyObject *value) /* -------------------------------------------------------------------- */ /** \name Py_buffer Utils - * * \{ */ char PyC_StructFmt_type_from_str(const char *typestr) diff --git a/source/blender/python/generic/py_capi_utils.h b/source/blender/python/generic/py_capi_utils.h index 358123657c7..842e1482c06 100644 --- a/source/blender/python/generic/py_capi_utils.h +++ b/source/blender/python/generic/py_capi_utils.h @@ -88,8 +88,6 @@ bool PyC_NameSpace_ImportArray(PyObject *py_dict, const char *imports[]); void PyC_MainModule_Backup(PyObject **r_main_mod); void PyC_MainModule_Restore(PyObject *main_mod); -void PyC_SetHomePath(const char *py_path_bundle); - bool PyC_IsInterpreterActive(void); void *PyC_RNA_AsPointer(PyObject *value, const char *type_name); @@ -142,6 +140,8 @@ struct PyC_StringEnum { }; int PyC_ParseStringEnum(PyObject *o, void *p); +const char *PyC_StringEnum_FindIDFromValue(const struct PyC_StringEnumItems *items, + const int value); int PyC_CheckArgs_DeepCopy(PyObject *args); diff --git a/source/blender/python/gpu/CMakeLists.txt b/source/blender/python/gpu/CMakeLists.txt index 7f6fd9eefab..fe5c559fcc0 100644 --- a/source/blender/python/gpu/CMakeLists.txt +++ b/source/blender/python/gpu/CMakeLists.txt @@ -33,25 +33,37 @@ set(INC_SYS ) set(SRC + gpu_py.c gpu_py_api.c gpu_py_batch.c + gpu_py_buffer.c gpu_py_element.c + gpu_py_framebuffer.c gpu_py_matrix.c gpu_py_offscreen.c gpu_py_select.c gpu_py_shader.c + gpu_py_state.c + gpu_py_texture.c gpu_py_types.c + gpu_py_uniformbuffer.c gpu_py_vertex_buffer.c gpu_py_vertex_format.c + gpu_py.h gpu_py_api.h gpu_py_batch.h + gpu_py_buffer.h gpu_py_element.h + gpu_py_framebuffer.h gpu_py_matrix.h gpu_py_offscreen.h gpu_py_select.h gpu_py_shader.h + gpu_py_state.h + gpu_py_texture.h gpu_py_types.h + gpu_py_uniformbuffer.h gpu_py_vertex_buffer.h gpu_py_vertex_format.h ) diff --git a/source/blender/python/gpu/gpu_py.c b/source/blender/python/gpu/gpu_py.c new file mode 100644 index 00000000000..7aea940da94 --- /dev/null +++ b/source/blender/python/gpu/gpu_py.c @@ -0,0 +1,79 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + * + * - Use ``bpygpu_`` for local API. + * - Use ``BPyGPU`` for public API. + */ + +#include + +#include "GPU_init_exit.h" +#include "GPU_primitive.h" +#include "GPU_texture.h" + +#include "../generic/py_capi_utils.h" + +#include "gpu_py.h" /* own include */ + +/* -------------------------------------------------------------------- */ +/** \name GPU Enums + * \{ */ + +struct PyC_StringEnumItems bpygpu_primtype_items[] = { + {GPU_PRIM_POINTS, "POINTS"}, + {GPU_PRIM_LINES, "LINES"}, + {GPU_PRIM_TRIS, "TRIS"}, + {GPU_PRIM_LINE_STRIP, "LINE_STRIP"}, + {GPU_PRIM_LINE_LOOP, "LINE_LOOP"}, + {GPU_PRIM_TRI_STRIP, "TRI_STRIP"}, + {GPU_PRIM_TRI_FAN, "TRI_FAN"}, + {GPU_PRIM_LINES_ADJ, "LINES_ADJ"}, + {GPU_PRIM_TRIS_ADJ, "TRIS_ADJ"}, + {GPU_PRIM_LINE_STRIP_ADJ, "LINE_STRIP_ADJ"}, + {0, NULL}, +}; + +struct PyC_StringEnumItems bpygpu_dataformat_items[] = { + {GPU_DATA_FLOAT, "FLOAT"}, + {GPU_DATA_INT, "INT"}, + {GPU_DATA_UINT, "UINT"}, + {GPU_DATA_UBYTE, "UBYTE"}, + {GPU_DATA_UINT_24_8, "UINT_24_8"}, + {GPU_DATA_10_11_11_REV, "10_11_11_REV"}, + {0, NULL}, +}; +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Utilities + * \{ */ + +bool bpygpu_is_init_or_error(void) +{ + if (!GPU_is_init()) { + PyErr_SetString(PyExc_SystemError, + "GPU functions for drawing are not available in background mode"); + + return false; + } + + return true; +} + +/** \} */ diff --git a/source/blender/python/gpu/gpu_py.h b/source/blender/python/gpu/gpu_py.h new file mode 100644 index 00000000000..39e5997f866 --- /dev/null +++ b/source/blender/python/gpu/gpu_py.h @@ -0,0 +1,37 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + */ + +#pragma once + +extern struct PyC_StringEnumItems bpygpu_primtype_items[]; +extern struct PyC_StringEnumItems bpygpu_dataformat_items[]; + +bool bpygpu_is_init_or_error(void); + +#define BPYGPU_IS_INIT_OR_ERROR_OBJ \ + if (UNLIKELY(!bpygpu_is_init_or_error())) { \ + return NULL; \ + } \ + ((void)0) +#define BPYGPU_IS_INIT_OR_ERROR_INT \ + if (UNLIKELY(!bpygpu_is_init_or_error())) { \ + return -1; \ + } \ + ((void)0) diff --git a/source/blender/python/gpu/gpu_py_api.c b/source/blender/python/gpu/gpu_py_api.c index 33130291162..68f7eb9816c 100644 --- a/source/blender/python/gpu/gpu_py_api.c +++ b/source/blender/python/gpu/gpu_py_api.c @@ -30,88 +30,24 @@ #include "../generic/python_utildefines.h" -#include "GPU_init_exit.h" -#include "GPU_primitive.h" - #include "gpu_py_matrix.h" #include "gpu_py_select.h" +#include "gpu_py_state.h" #include "gpu_py_types.h" #include "gpu_py_api.h" /* own include */ -/* -------------------------------------------------------------------- */ -/** \name Utils to invalidate functions - * \{ */ - -bool bpygpu_is_init_or_error(void) -{ - if (!GPU_is_init()) { - PyErr_SetString(PyExc_SystemError, - "GPU functions for drawing are not available in background mode"); - - return false; - } - - return true; -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Primitive Type Utils - * \{ */ - -int bpygpu_ParsePrimType(PyObject *o, void *p) -{ - Py_ssize_t mode_id_len; - const char *mode_id = _PyUnicode_AsStringAndSize(o, &mode_id_len); - if (mode_id == NULL) { - PyErr_Format(PyExc_ValueError, "expected a string, got %s", Py_TYPE(o)->tp_name); - return 0; - } -#define MATCH_ID(id) \ - if (mode_id_len == strlen(STRINGIFY(id))) { \ - if (STREQ(mode_id, STRINGIFY(id))) { \ - mode = GPU_PRIM_##id; \ - goto success; \ - } \ - } \ - ((void)0) - - GPUPrimType mode; - MATCH_ID(POINTS); - MATCH_ID(LINES); - MATCH_ID(TRIS); - MATCH_ID(LINE_STRIP); - MATCH_ID(LINE_LOOP); - MATCH_ID(TRI_STRIP); - MATCH_ID(TRI_FAN); - MATCH_ID(LINES_ADJ); - MATCH_ID(TRIS_ADJ); - MATCH_ID(LINE_STRIP_ADJ); - -#undef MATCH_ID - PyErr_Format(PyExc_ValueError, "unknown type literal: '%s'", mode_id); - return 0; - -success: - (*(GPUPrimType *)p) = mode; - return 1; -} - -/** \} */ - /* -------------------------------------------------------------------- */ /** \name GPU Module * \{ */ -PyDoc_STRVAR(GPU_doc, +PyDoc_STRVAR(pygpu_doc, "This module provides Python wrappers for the GPU implementation in Blender.\n" "Some higher level functions can be found in the `gpu_extras` module."); -static struct PyModuleDef GPU_module_def = { +static struct PyModuleDef pygpu_module_def = { PyModuleDef_HEAD_INIT, .m_name = "gpu", - .m_doc = GPU_doc, + .m_doc = pygpu_doc, }; PyObject *BPyInit_gpu(void) @@ -120,18 +56,21 @@ PyObject *BPyInit_gpu(void) PyObject *submodule; PyObject *mod; - mod = PyModule_Create(&GPU_module_def); + mod = PyModule_Create(&pygpu_module_def); - PyModule_AddObject(mod, "types", (submodule = BPyInit_gpu_types())); + PyModule_AddObject(mod, "types", (submodule = bpygpu_types_init())); PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); - PyModule_AddObject(mod, "matrix", (submodule = BPyInit_gpu_matrix())); + PyModule_AddObject(mod, "matrix", (submodule = bpygpu_matrix_init())); PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); - PyModule_AddObject(mod, "select", (submodule = BPyInit_gpu_select())); + PyModule_AddObject(mod, "select", (submodule = bpygpu_select_init())); PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); - PyModule_AddObject(mod, "shader", (submodule = BPyInit_gpu_shader())); + PyModule_AddObject(mod, "shader", (submodule = bpygpu_shader_init())); + PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); + + PyModule_AddObject(mod, "state", (submodule = bpygpu_state_init())); PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); return mod; diff --git a/source/blender/python/gpu/gpu_py_api.h b/source/blender/python/gpu/gpu_py_api.h index b8f0cde129f..38452ad67c1 100644 --- a/source/blender/python/gpu/gpu_py_api.h +++ b/source/blender/python/gpu/gpu_py_api.h @@ -20,18 +20,8 @@ #pragma once -int bpygpu_ParsePrimType(PyObject *o, void *p); +/* Each type object could have a method for free GPU resources. + * However, it is currently of little use. */ +// #define BPYGPU_USE_GPUOBJ_FREE_METHOD PyObject *BPyInit_gpu(void); - -bool bpygpu_is_init_or_error(void); -#define BPYGPU_IS_INIT_OR_ERROR_OBJ \ - if (UNLIKELY(!bpygpu_is_init_or_error())) { \ - return NULL; \ - } \ - ((void)0) -#define BPYGPU_IS_INIT_OR_ERROR_INT \ - if (UNLIKELY(!bpygpu_is_init_or_error())) { \ - return -1; \ - } \ - ((void)0) diff --git a/source/blender/python/gpu/gpu_py_batch.c b/source/blender/python/gpu/gpu_py_batch.c index 9fb7aea162a..ef795268158 100644 --- a/source/blender/python/gpu/gpu_py_batch.c +++ b/source/blender/python/gpu/gpu_py_batch.c @@ -38,17 +38,18 @@ #include "../generic/py_capi_utils.h" -#include "gpu_py_api.h" -#include "gpu_py_batch.h" /* own include */ +#include "gpu_py.h" #include "gpu_py_element.h" #include "gpu_py_shader.h" #include "gpu_py_vertex_buffer.h" +#include "gpu_py_batch.h" /* own include */ + /* -------------------------------------------------------------------- */ /** \name Utility Functions * \{ */ -static bool py_batch_is_program_or_error(BPyGPUBatch *self) +static bool pygpu_batch_is_program_or_error(BPyGPUBatch *self) { if (!self->batch->shader) { PyErr_SetString(PyExc_RuntimeError, "batch does not have any program assigned to it"); @@ -63,56 +64,50 @@ static bool py_batch_is_program_or_error(BPyGPUBatch *self) /** \name GPUBatch Type * \{ */ -static PyObject *py_Batch_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) +static PyObject *pygpu_batch__tp_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) { BPYGPU_IS_INIT_OR_ERROR_OBJ; const char *exc_str_missing_arg = "GPUBatch.__new__() missing required argument '%s' (pos %d)"; - struct { - GPUPrimType type_id; - BPyGPUVertBuf *py_vertbuf; - BPyGPUIndexBuf *py_indexbuf; - } params = {GPU_PRIM_NONE, NULL, NULL}; + struct PyC_StringEnum prim_type = {bpygpu_primtype_items, GPU_PRIM_NONE}; + BPyGPUVertBuf *py_vertbuf = NULL; + BPyGPUIndexBuf *py_indexbuf = NULL; static const char *_keywords[] = {"type", "buf", "elem", NULL}; static _PyArg_Parser _parser = {"|$O&O!O!:GPUBatch.__new__", _keywords, 0}; if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, - bpygpu_ParsePrimType, - ¶ms.type_id, + PyC_ParseStringEnum, + &prim_type, &BPyGPUVertBuf_Type, - ¶ms.py_vertbuf, + &py_vertbuf, &BPyGPUIndexBuf_Type, - ¶ms.py_indexbuf)) { + &py_indexbuf)) { return NULL; } - if (params.type_id == GPU_PRIM_NONE) { - PyErr_Format(PyExc_TypeError, exc_str_missing_arg, _keywords[0], 1); - return NULL; - } + BLI_assert(prim_type.value_found != GPU_PRIM_NONE); - if (params.py_vertbuf == NULL) { + if (py_vertbuf == NULL) { PyErr_Format(PyExc_TypeError, exc_str_missing_arg, _keywords[1], 2); return NULL; } - GPUBatch *batch = GPU_batch_create(params.type_id, - params.py_vertbuf->buf, - params.py_indexbuf ? params.py_indexbuf->elem : NULL); + GPUBatch *batch = GPU_batch_create( + prim_type.value_found, py_vertbuf->buf, py_indexbuf ? py_indexbuf->elem : NULL); BPyGPUBatch *ret = (BPyGPUBatch *)BPyGPUBatch_CreatePyObject(batch); #ifdef USE_GPU_PY_REFERENCES - ret->references = PyList_New(params.py_indexbuf ? 2 : 1); - PyList_SET_ITEM(ret->references, 0, (PyObject *)params.py_vertbuf); - Py_INCREF(params.py_vertbuf); + ret->references = PyList_New(py_indexbuf ? 2 : 1); + PyList_SET_ITEM(ret->references, 0, (PyObject *)py_vertbuf); + Py_INCREF(py_vertbuf); - if (params.py_indexbuf != NULL) { - PyList_SET_ITEM(ret->references, 1, (PyObject *)params.py_indexbuf); - Py_INCREF(params.py_indexbuf); + if (py_indexbuf != NULL) { + PyList_SET_ITEM(ret->references, 1, (PyObject *)py_indexbuf); + Py_INCREF(py_indexbuf); } PyObject_GC_Track(ret); @@ -121,7 +116,7 @@ static PyObject *py_Batch_new(PyTypeObject *UNUSED(type), PyObject *args, PyObje return (PyObject *)ret; } -PyDoc_STRVAR(py_Batch_vertbuf_add_doc, +PyDoc_STRVAR(pygpu_batch_vertbuf_add_doc, ".. method:: vertbuf_add(buf)\n" "\n" " Add another vertex buffer to the Batch.\n" @@ -134,7 +129,7 @@ PyDoc_STRVAR(py_Batch_vertbuf_add_doc, " :param buf: The vertex buffer that will be added to the batch.\n" " :type buf: :class:`gpu.types.GPUVertBuf`\n" ); -static PyObject *py_Batch_vertbuf_add(BPyGPUBatch *self, BPyGPUVertBuf *py_buf) +static PyObject *pygpu_batch_vertbuf_add(BPyGPUBatch *self, BPyGPUVertBuf *py_buf) { if (!BPyGPUVertBuf_Check(py_buf)) { PyErr_Format(PyExc_TypeError, "Expected a GPUVertBuf, got %s", Py_TYPE(py_buf)->tp_name); @@ -167,7 +162,7 @@ static PyObject *py_Batch_vertbuf_add(BPyGPUBatch *self, BPyGPUVertBuf *py_buf) } PyDoc_STRVAR( - py_Batch_program_set_doc, + pygpu_batch_program_set_doc, ".. method:: program_set(program)\n" "\n" " Assign a shader to this batch that will be used for drawing when not overwritten later.\n" @@ -177,7 +172,7 @@ PyDoc_STRVAR( "\n" " :param program: The program/shader the batch will use in future draw calls.\n" " :type program: :class:`gpu.types.GPUShader`\n"); -static PyObject *py_Batch_program_set(BPyGPUBatch *self, BPyGPUShader *py_shader) +static PyObject *pygpu_batch_program_set(BPyGPUBatch *self, BPyGPUShader *py_shader) { if (!BPyGPUShader_Check(py_shader)) { PyErr_Format(PyExc_TypeError, "Expected a GPUShader, got %s", Py_TYPE(py_shader)->tp_name); @@ -208,7 +203,7 @@ static PyObject *py_Batch_program_set(BPyGPUBatch *self, BPyGPUShader *py_shader Py_RETURN_NONE; } -PyDoc_STRVAR(py_Batch_draw_doc, +PyDoc_STRVAR(pygpu_batch_draw_doc, ".. method:: draw(program=None)\n" "\n" " Run the drawing program with the parameters assigned to the batch.\n" @@ -216,7 +211,7 @@ PyDoc_STRVAR(py_Batch_draw_doc, " :param program: Program that performs the drawing operations.\n" " If ``None`` is passed, the last program set to this batch will run.\n" " :type program: :class:`gpu.types.GPUShader`\n"); -static PyObject *py_Batch_draw(BPyGPUBatch *self, PyObject *args) +static PyObject *pygpu_batch_draw(BPyGPUBatch *self, PyObject *args) { BPyGPUShader *py_program = NULL; @@ -224,7 +219,7 @@ static PyObject *py_Batch_draw(BPyGPUBatch *self, PyObject *args) return NULL; } if (py_program == NULL) { - if (!py_batch_is_program_or_error(self)) { + if (!pygpu_batch_is_program_or_error(self)) { return NULL; } } @@ -236,42 +231,42 @@ static PyObject *py_Batch_draw(BPyGPUBatch *self, PyObject *args) Py_RETURN_NONE; } -static PyObject *py_Batch_program_use_begin(BPyGPUBatch *self) +static PyObject *pygpu_batch_program_use_begin(BPyGPUBatch *self) { - if (!py_batch_is_program_or_error(self)) { + if (!pygpu_batch_is_program_or_error(self)) { return NULL; } GPU_shader_bind(self->batch->shader); Py_RETURN_NONE; } -static PyObject *py_Batch_program_use_end(BPyGPUBatch *self) +static PyObject *pygpu_batch_program_use_end(BPyGPUBatch *self) { - if (!py_batch_is_program_or_error(self)) { + if (!pygpu_batch_is_program_or_error(self)) { return NULL; } GPU_shader_unbind(); Py_RETURN_NONE; } -static struct PyMethodDef py_Batch_methods[] = { - {"vertbuf_add", (PyCFunction)py_Batch_vertbuf_add, METH_O, py_Batch_vertbuf_add_doc}, - {"program_set", (PyCFunction)py_Batch_program_set, METH_O, py_Batch_program_set_doc}, - {"draw", (PyCFunction)py_Batch_draw, METH_VARARGS, py_Batch_draw_doc}, - {"_program_use_begin", (PyCFunction)py_Batch_program_use_begin, METH_NOARGS, ""}, - {"_program_use_end", (PyCFunction)py_Batch_program_use_end, METH_NOARGS, ""}, +static struct PyMethodDef pygpu_batch__tp_methods[] = { + {"vertbuf_add", (PyCFunction)pygpu_batch_vertbuf_add, METH_O, pygpu_batch_vertbuf_add_doc}, + {"program_set", (PyCFunction)pygpu_batch_program_set, METH_O, pygpu_batch_program_set_doc}, + {"draw", (PyCFunction)pygpu_batch_draw, METH_VARARGS, pygpu_batch_draw_doc}, + {"_program_use_begin", (PyCFunction)pygpu_batch_program_use_begin, METH_NOARGS, ""}, + {"_program_use_end", (PyCFunction)pygpu_batch_program_use_end, METH_NOARGS, ""}, {NULL, NULL, 0, NULL}, }; #ifdef USE_GPU_PY_REFERENCES -static int py_Batch_traverse(BPyGPUBatch *self, visitproc visit, void *arg) +static int pygpu_batch__tp_traverse(BPyGPUBatch *self, visitproc visit, void *arg) { Py_VISIT(self->references); return 0; } -static int py_Batch_clear(BPyGPUBatch *self) +static int pygpu_batch__tp_clear(BPyGPUBatch *self) { Py_CLEAR(self->references); return 0; @@ -279,14 +274,14 @@ static int py_Batch_clear(BPyGPUBatch *self) #endif -static void py_Batch_dealloc(BPyGPUBatch *self) +static void pygpu_batch__tp_dealloc(BPyGPUBatch *self) { GPU_batch_discard(self->batch); #ifdef USE_GPU_PY_REFERENCES if (self->references) { PyObject_GC_UnTrack(self); - py_Batch_clear(self); + pygpu_batch__tp_clear(self); Py_XDECREF(self->references); } #endif @@ -295,7 +290,7 @@ static void py_Batch_dealloc(BPyGPUBatch *self) } PyDoc_STRVAR( - py_gpu_batch_doc, + pygpu_batch__tp_doc, ".. class:: GPUBatch(type, buf, elem=None)\n" "\n" " Reusable container for drawable geometry.\n" @@ -319,17 +314,17 @@ PyDoc_STRVAR( PyTypeObject BPyGPUBatch_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUBatch", .tp_basicsize = sizeof(BPyGPUBatch), - .tp_dealloc = (destructor)py_Batch_dealloc, + .tp_dealloc = (destructor)pygpu_batch__tp_dealloc, #ifdef USE_GPU_PY_REFERENCES .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, - .tp_doc = py_gpu_batch_doc, - .tp_traverse = (traverseproc)py_Batch_traverse, - .tp_clear = (inquiry)py_Batch_clear, + .tp_doc = pygpu_batch__tp_doc, + .tp_traverse = (traverseproc)pygpu_batch__tp_traverse, + .tp_clear = (inquiry)pygpu_batch__tp_clear, #else .tp_flags = Py_TPFLAGS_DEFAULT, #endif - .tp_methods = py_Batch_methods, - .tp_new = py_Batch_new, + .tp_methods = pygpu_batch__tp_methods, + .tp_new = pygpu_batch__tp_new, }; /** \} */ diff --git a/source/blender/python/gpu/gpu_py_buffer.c b/source/blender/python/gpu/gpu_py_buffer.c new file mode 100644 index 00000000000..b89d2c6a69f --- /dev/null +++ b/source/blender/python/gpu/gpu_py_buffer.c @@ -0,0 +1,667 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + * + * This file defines the gpu.state API. + * + * - Use ``bpygpu_`` for local API. + * - Use ``BPyGPU`` for public API. + */ + +#include + +#include "BLI_utildefines.h" + +#include "MEM_guardedalloc.h" + +#include "GPU_texture.h" + +#include "../generic/py_capi_utils.h" + +#include "gpu_py.h" + +#include "gpu_py_buffer.h" + +// #define PYGPU_BUFFER_PROTOCOL + +/* -------------------------------------------------------------------- */ +/** \name Utility Functions + * \{ */ + +static bool pygpu_buffer_dimensions_compare(int ndim, + const Py_ssize_t *shape_a, + const Py_ssize_t *shape_b) +{ + return (bool)memcmp(shape_a, shape_b, ndim * sizeof(Py_ssize_t)); +} + +static const char *pygpu_buffer_formatstr(eGPUDataFormat data_format) +{ + switch (data_format) { + case GPU_DATA_FLOAT: + return "f"; + case GPU_DATA_INT: + return "i"; + case GPU_DATA_UINT: + return "I"; + case GPU_DATA_UBYTE: + return "B"; + case GPU_DATA_UINT_24_8: + case GPU_DATA_10_11_11_REV: + return "I"; + default: + break; + } + return NULL; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name BPyGPUBuffer API + * \{ */ + +static BPyGPUBuffer *pygpu_buffer_make_from_data(PyObject *parent, + const eGPUDataFormat format, + const int shape_len, + const Py_ssize_t *shape, + void *buf) +{ + BPyGPUBuffer *buffer = (BPyGPUBuffer *)_PyObject_GC_New(&BPyGPU_BufferType); + + buffer->parent = NULL; + buffer->format = format; + buffer->shape_len = shape_len; + buffer->shape = MEM_mallocN(shape_len * sizeof(*buffer->shape), "BPyGPUBuffer shape"); + memcpy(buffer->shape, shape, shape_len * sizeof(*buffer->shape)); + buffer->buf.as_void = buf; + + if (parent) { + Py_INCREF(parent); + buffer->parent = parent; + PyObject_GC_Track(buffer); + } + return buffer; +} + +static PyObject *pygpu_buffer__sq_item(BPyGPUBuffer *self, int i) +{ + if (i >= self->shape[0] || i < 0) { + PyErr_SetString(PyExc_IndexError, "array index out of range"); + return NULL; + } + + const char *formatstr = pygpu_buffer_formatstr(self->format); + + if (self->shape_len == 1) { + switch (self->format) { + case GPU_DATA_FLOAT: + return Py_BuildValue(formatstr, self->buf.as_float[i]); + case GPU_DATA_INT: + return Py_BuildValue(formatstr, self->buf.as_int[i]); + case GPU_DATA_UBYTE: + return Py_BuildValue(formatstr, self->buf.as_byte[i]); + case GPU_DATA_UINT: + case GPU_DATA_UINT_24_8: + case GPU_DATA_10_11_11_REV: + return Py_BuildValue(formatstr, self->buf.as_uint[i]); + } + } + else { + int offset = i * GPU_texture_dataformat_size(self->format); + for (int j = 1; j < self->shape_len; j++) { + offset *= self->shape[j]; + } + + return (PyObject *)pygpu_buffer_make_from_data((PyObject *)self, + self->format, + self->shape_len - 1, + self->shape + 1, + self->buf.as_byte + offset); + } + + return NULL; +} + +static PyObject *pygpu_buffer_to_list(BPyGPUBuffer *self) +{ + int i, len = self->shape[0]; + PyObject *list = PyList_New(len); + + for (i = 0; i < len; i++) { + PyList_SET_ITEM(list, i, pygpu_buffer__sq_item(self, i)); + } + + return list; +} + +static PyObject *pygpu_buffer_to_list_recursive(BPyGPUBuffer *self) +{ + PyObject *list; + + if (self->shape_len > 1) { + int i, len = self->shape[0]; + list = PyList_New(len); + + for (i = 0; i < len; i++) { + /* "BPyGPUBuffer *sub_tmp" is a temporary object created just to be read for nested lists. + * That is why it is decremented/freed soon after. + * TODO: For efficiency, avoid creating #BPyGPUBuffer when creating nested lists. */ + BPyGPUBuffer *sub_tmp = (BPyGPUBuffer *)pygpu_buffer__sq_item(self, i); + PyList_SET_ITEM(list, i, pygpu_buffer_to_list_recursive(sub_tmp)); + Py_DECREF(sub_tmp); + } + } + else { + list = pygpu_buffer_to_list(self); + } + + return list; +} + +static PyObject *pygpu_buffer_dimensions(BPyGPUBuffer *self, void *UNUSED(arg)) +{ + PyObject *list = PyList_New(self->shape_len); + int i; + + for (i = 0; i < self->shape_len; i++) { + PyList_SET_ITEM(list, i, PyLong_FromLong(self->shape[i])); + } + + return list; +} + +static int pygpu_buffer__tp_traverse(BPyGPUBuffer *self, visitproc visit, void *arg) +{ + Py_VISIT(self->parent); + return 0; +} + +static int pygpu_buffer__tp_clear(BPyGPUBuffer *self) +{ + Py_CLEAR(self->parent); + return 0; +} + +static void pygpu_buffer__tp_dealloc(BPyGPUBuffer *self) +{ + if (self->parent) { + PyObject_GC_UnTrack(self); + pygpu_buffer__tp_clear(self); + Py_XDECREF(self->parent); + } + else { + MEM_freeN(self->buf.as_void); + } + + MEM_freeN(self->shape); + + PyObject_GC_Del(self); +} + +static PyObject *pygpu_buffer__tp_repr(BPyGPUBuffer *self) +{ + PyObject *repr; + + PyObject *list = pygpu_buffer_to_list_recursive(self); + const char *typestr = PyC_StringEnum_FindIDFromValue(bpygpu_dataformat_items, self->format); + + repr = PyUnicode_FromFormat("Buffer(%s, %R)", typestr, list); + Py_DECREF(list); + + return repr; +} + +static int pygpu_buffer__sq_ass_item(BPyGPUBuffer *self, int i, PyObject *v); + +static int pygpu_buffer_ass_slice(BPyGPUBuffer *self, + Py_ssize_t begin, + Py_ssize_t end, + PyObject *seq) +{ + PyObject *item; + int count, err = 0; + + if (begin < 0) { + begin = 0; + } + if (end > self->shape[0]) { + end = self->shape[0]; + } + if (begin > end) { + begin = end; + } + + if (!PySequence_Check(seq)) { + PyErr_Format(PyExc_TypeError, + "buffer[:] = value, invalid assignment. " + "Expected a sequence, not an %.200s type", + Py_TYPE(seq)->tp_name); + return -1; + } + + /* re-use count var */ + if ((count = PySequence_Size(seq)) != (end - begin)) { + PyErr_Format(PyExc_TypeError, + "buffer[:] = value, size mismatch in assignment. " + "Expected: %d (given: %d)", + count, + end - begin); + return -1; + } + + for (count = begin; count < end; count++) { + item = PySequence_GetItem(seq, count - begin); + if (item) { + err = pygpu_buffer__sq_ass_item(self, count, item); + Py_DECREF(item); + } + else { + err = -1; + } + if (err) { + break; + } + } + return err; +} + +#define MAX_DIMENSIONS 64 +static PyObject *pygpu_buffer__tp_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) +{ + PyObject *length_ob, *init = NULL; + BPyGPUBuffer *buffer = NULL; + Py_ssize_t shape[MAX_DIMENSIONS]; + + Py_ssize_t i, shape_len = 0; + + if (kwds && PyDict_Size(kwds)) { + PyErr_SetString(PyExc_TypeError, "Buffer(): takes no keyword args"); + return NULL; + } + + const struct PyC_StringEnum pygpu_dataformat = {bpygpu_dataformat_items, GPU_DATA_FLOAT}; + if (!PyArg_ParseTuple( + args, "O&O|O: Buffer", PyC_ParseStringEnum, &pygpu_dataformat, &length_ob, &init)) { + return NULL; + } + + if (PyLong_Check(length_ob)) { + shape_len = 1; + if (((shape[0] = PyLong_AsLong(length_ob)) < 1)) { + PyErr_SetString(PyExc_AttributeError, "dimension must be greater than or equal to 1"); + return NULL; + } + } + else if (PySequence_Check(length_ob)) { + shape_len = PySequence_Size(length_ob); + if (shape_len > MAX_DIMENSIONS) { + PyErr_SetString(PyExc_AttributeError, + "too many dimensions, max is " STRINGIFY(MAX_DIMENSIONS)); + return NULL; + } + if (shape_len < 1) { + PyErr_SetString(PyExc_AttributeError, "sequence must have at least one dimension"); + return NULL; + } + + for (i = 0; i < shape_len; i++) { + PyObject *ob = PySequence_GetItem(length_ob, i); + if (!PyLong_Check(ob)) { + PyErr_Format(PyExc_TypeError, + "invalid dimension %i, expected an int, not a %.200s", + i, + Py_TYPE(ob)->tp_name); + Py_DECREF(ob); + return NULL; + } + shape[i] = PyLong_AsLong(ob); + Py_DECREF(ob); + + if (shape[i] < 1) { + PyErr_SetString(PyExc_AttributeError, "dimension must be greater than or equal to 1"); + return NULL; + } + } + } + else { + PyErr_Format(PyExc_TypeError, + "invalid second argument argument expected a sequence " + "or an int, not a %.200s", + Py_TYPE(length_ob)->tp_name); + return NULL; + } + + if (init && PyObject_CheckBuffer(init)) { + Py_buffer pybuffer; + + if (PyObject_GetBuffer(init, &pybuffer, PyBUF_ND | PyBUF_FORMAT) == -1) { + /* PyObject_GetBuffer raise a PyExc_BufferError */ + return NULL; + } + + if (shape_len != pybuffer.ndim || + !pygpu_buffer_dimensions_compare(shape_len, shape, pybuffer.shape)) { + PyErr_Format(PyExc_TypeError, "array size does not match"); + } + else { + buffer = pygpu_buffer_make_from_data( + init, pygpu_dataformat.value_found, pybuffer.ndim, shape, pybuffer.buf); + } + + PyBuffer_Release(&pybuffer); + } + else { + buffer = BPyGPU_Buffer_CreatePyObject(pygpu_dataformat.value_found, shape, shape_len, NULL); + if (init && pygpu_buffer_ass_slice(buffer, 0, shape[0], init)) { + Py_DECREF(buffer); + return NULL; + } + } + + return (PyObject *)buffer; +} + +/* BPyGPUBuffer sequence methods */ + +static int pygpu_buffer__sq_length(BPyGPUBuffer *self) +{ + return self->shape[0]; +} + +static PyObject *pygpu_buffer_slice(BPyGPUBuffer *self, Py_ssize_t begin, Py_ssize_t end) +{ + PyObject *list; + Py_ssize_t count; + + if (begin < 0) { + begin = 0; + } + if (end > self->shape[0]) { + end = self->shape[0]; + } + if (begin > end) { + begin = end; + } + + list = PyList_New(end - begin); + + for (count = begin; count < end; count++) { + PyList_SET_ITEM(list, count - begin, pygpu_buffer__sq_item(self, count)); + } + return list; +} + +static int pygpu_buffer__sq_ass_item(BPyGPUBuffer *self, int i, PyObject *v) +{ + if (i >= self->shape[0] || i < 0) { + PyErr_SetString(PyExc_IndexError, "array assignment index out of range"); + return -1; + } + + if (self->shape_len != 1) { + BPyGPUBuffer *row = (BPyGPUBuffer *)pygpu_buffer__sq_item(self, i); + + if (row) { + const int ret = pygpu_buffer_ass_slice(row, 0, self->shape[1], v); + Py_DECREF(row); + return ret; + } + + return -1; + } + + switch (self->format) { + case GPU_DATA_FLOAT: + return PyArg_Parse(v, "f:Expected floats", &self->buf.as_float[i]) ? 0 : -1; + case GPU_DATA_INT: + return PyArg_Parse(v, "i:Expected ints", &self->buf.as_int[i]) ? 0 : -1; + case GPU_DATA_UBYTE: + return PyArg_Parse(v, "b:Expected ints", &self->buf.as_byte[i]) ? 0 : -1; + case GPU_DATA_UINT: + case GPU_DATA_UINT_24_8: + case GPU_DATA_10_11_11_REV: + return PyArg_Parse(v, "b:Expected ints", &self->buf.as_uint[i]) ? 0 : -1; + default: + return 0; /* should never happen */ + } +} + +static PyObject *pygpu_buffer__mp_subscript(BPyGPUBuffer *self, PyObject *item) +{ + if (PyIndex_Check(item)) { + Py_ssize_t i; + i = PyNumber_AsSsize_t(item, PyExc_IndexError); + if (i == -1 && PyErr_Occurred()) { + return NULL; + } + if (i < 0) { + i += self->shape[0]; + } + return pygpu_buffer__sq_item(self, i); + } + if (PySlice_Check(item)) { + Py_ssize_t start, stop, step, slicelength; + + if (PySlice_GetIndicesEx(item, self->shape[0], &start, &stop, &step, &slicelength) < 0) { + return NULL; + } + + if (slicelength <= 0) { + return PyTuple_New(0); + } + if (step == 1) { + return pygpu_buffer_slice(self, start, stop); + } + + PyErr_SetString(PyExc_IndexError, "slice steps not supported with vectors"); + return NULL; + } + + PyErr_Format( + PyExc_TypeError, "buffer indices must be integers, not %.200s", Py_TYPE(item)->tp_name); + return NULL; +} + +static int pygpu_buffer__mp_ass_subscript(BPyGPUBuffer *self, PyObject *item, PyObject *value) +{ + if (PyIndex_Check(item)) { + Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); + if (i == -1 && PyErr_Occurred()) { + return -1; + } + if (i < 0) { + i += self->shape[0]; + } + return pygpu_buffer__sq_ass_item(self, i, value); + } + if (PySlice_Check(item)) { + Py_ssize_t start, stop, step, slicelength; + + if (PySlice_GetIndicesEx(item, self->shape[0], &start, &stop, &step, &slicelength) < 0) { + return -1; + } + + if (step == 1) { + return pygpu_buffer_ass_slice(self, start, stop, value); + } + + PyErr_SetString(PyExc_IndexError, "slice steps not supported with vectors"); + return -1; + } + + PyErr_Format( + PyExc_TypeError, "buffer indices must be integers, not %.200s", Py_TYPE(item)->tp_name); + return -1; +} + +static PyMethodDef pygpu_buffer__tp_methods[] = { + {"to_list", + (PyCFunction)pygpu_buffer_to_list_recursive, + METH_NOARGS, + "return the buffer as a list"}, + {NULL, NULL, 0, NULL}, +}; + +static PyGetSetDef pygpu_buffer_getseters[] = { + {"dimensions", (getter)pygpu_buffer_dimensions, NULL, NULL, NULL}, + {NULL, NULL, NULL, NULL, NULL}, +}; + +static PySequenceMethods pygpu_buffer__tp_as_sequence = { + (lenfunc)pygpu_buffer__sq_length, /*sq_length */ + (binaryfunc)NULL, /*sq_concat */ + (ssizeargfunc)NULL, /*sq_repeat */ + (ssizeargfunc)pygpu_buffer__sq_item, /*sq_item */ + (ssizessizeargfunc)NULL, /*sq_slice, deprecated, handled in pygpu_buffer__sq_item */ + (ssizeobjargproc)pygpu_buffer__sq_ass_item, /*sq_ass_item */ + (ssizessizeobjargproc)NULL, /* sq_ass_slice, deprecated handled in pygpu_buffer__sq_ass_item */ + (objobjproc)NULL, /* sq_contains */ + (binaryfunc)NULL, /* sq_inplace_concat */ + (ssizeargfunc)NULL, /* sq_inplace_repeat */ +}; + +static PyMappingMethods pygpu_buffer__tp_as_mapping = { + (lenfunc)pygpu_buffer__sq_length, + (binaryfunc)pygpu_buffer__mp_subscript, + (objobjargproc)pygpu_buffer__mp_ass_subscript, +}; + +#ifdef PYGPU_BUFFER_PROTOCOL +static void pygpu_buffer_strides_calc(const eGPUDataFormat format, + const int shape_len, + const Py_ssize_t *shape, + Py_ssize_t *r_strides) +{ + r_strides[0] = GPU_texture_dataformat_size(format); + for (int i = 1; i < shape_len; i++) { + r_strides[i] = r_strides[i - 1] * shape[i - 1]; + } +} + +/* Here is the buffer interface function */ +static int pygpu_buffer__bf_getbuffer(BPyGPUBuffer *self, Py_buffer *view, int flags) +{ + if (view == NULL) { + PyErr_SetString(PyExc_ValueError, "NULL view in getbuffer"); + return -1; + } + + view->obj = (PyObject *)self; + view->buf = (void *)self->buf.as_void; + view->len = bpygpu_Buffer_size(self); + view->readonly = 0; + view->itemsize = GPU_texture_dataformat_size(self->format); + view->format = pygpu_buffer_formatstr(self->format); + view->ndim = self->shape_len; + view->shape = self->shape; + view->strides = MEM_mallocN(view->ndim * sizeof(*view->strides), "BPyGPUBuffer strides"); + pygpu_buffer_strides_calc(self->format, view->ndim, view->shape, view->strides); + view->suboffsets = NULL; + view->internal = NULL; + + Py_INCREF(self); + return 0; +} + +static void pygpu_buffer__bf_releasebuffer(PyObject *UNUSED(exporter), Py_buffer *view) +{ + MEM_SAFE_FREE(view->strides); +} + +static PyBufferProcs pygpu_buffer__tp_as_buffer = { + (getbufferproc)pygpu_buffer__bf_getbuffer, + (releasebufferproc)pygpu_buffer__bf_releasebuffer, +}; +#endif + +PyDoc_STRVAR(pygpu_buffer__tp_doc, + ".. class:: Buffer(format, dimensions, data)\n" + "\n" + " For Python access to GPU functions requiring a pointer.\n" + "\n" + " :arg format: One of these primitive types: {\n" + " `FLOAT`,\n" + " `INT`,\n" + " `UINT`,\n" + " `UBYTE`,\n" + " `UINT_24_8`,\n" + " `10_11_11_REV`,\n" + " :type type: `str`\n" + " :arg dimensions: Array describing the dimensions.\n" + " :type dimensions: `int`\n" + " :arg data: Optional data array.\n" + " :type data: `array`\n"); +PyTypeObject BPyGPU_BufferType = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "Buffer", + .tp_basicsize = sizeof(BPyGPUBuffer), + .tp_dealloc = (destructor)pygpu_buffer__tp_dealloc, + .tp_repr = (reprfunc)pygpu_buffer__tp_repr, + .tp_as_sequence = &pygpu_buffer__tp_as_sequence, + .tp_as_mapping = &pygpu_buffer__tp_as_mapping, +#ifdef PYGPU_BUFFER_PROTOCOL + .tp_as_buffer = &pygpu_buffer__tp_as_buffer, +#endif + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + .tp_doc = pygpu_buffer__tp_doc, + .tp_traverse = (traverseproc)pygpu_buffer__tp_traverse, + .tp_clear = (inquiry)pygpu_buffer__tp_clear, + .tp_methods = pygpu_buffer__tp_methods, + .tp_getset = pygpu_buffer_getseters, + .tp_new = pygpu_buffer__tp_new, +}; + +static size_t pygpu_buffer_calc_size(const int format, + const int shape_len, + const Py_ssize_t *shape) +{ + size_t r_size = GPU_texture_dataformat_size(format); + + for (int i = 0; i < shape_len; i++) { + r_size *= shape[i]; + } + + return r_size; +} + +size_t bpygpu_Buffer_size(BPyGPUBuffer *buffer) +{ + return pygpu_buffer_calc_size(buffer->format, buffer->shape_len, buffer->shape); +} + +/** + * Create a buffer object + * + * \param shape: An array of `shape_len` integers representing the size of each dimension. + * \param buffer: When not NULL holds a contiguous buffer + * with the correct format from which the buffer will be initialized + */ +BPyGPUBuffer *BPyGPU_Buffer_CreatePyObject(const int format, + const Py_ssize_t *shape, + const int shape_len, + void *buffer) +{ + if (buffer == NULL) { + size_t size = pygpu_buffer_calc_size(format, shape_len, shape); + buffer = MEM_callocN(size, "BPyGPUBuffer buffer"); + } + + return pygpu_buffer_make_from_data(NULL, format, shape_len, shape, buffer); +} + +/** \} */ diff --git a/source/blender/python/gpu/gpu_py_buffer.h b/source/blender/python/gpu/gpu_py_buffer.h new file mode 100644 index 00000000000..5eac5e3d309 --- /dev/null +++ b/source/blender/python/gpu/gpu_py_buffer.h @@ -0,0 +1,53 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + */ + +#pragma once + +extern PyTypeObject BPyGPU_BufferType; + +#define BPyGPU_Buffer_Check(v) (Py_TYPE(v) == &BPyGPU_BufferType) + +/** + * Buffer Object + * + * For Python access to GPU functions requiring a pointer. + */ +typedef struct BPyGPUBuffer { + PyObject_VAR_HEAD PyObject *parent; + + int format; + int shape_len; + Py_ssize_t *shape; + + union { + char *as_byte; + int *as_int; + uint *as_uint; + float *as_float; + + void *as_void; + } buf; +} BPyGPUBuffer; + +size_t bpygpu_Buffer_size(BPyGPUBuffer *buffer); +BPyGPUBuffer *BPyGPU_Buffer_CreatePyObject(const int format, + const Py_ssize_t *shape, + const int shape_len, + void *buffer); diff --git a/source/blender/python/gpu/gpu_py_element.c b/source/blender/python/gpu/gpu_py_element.c index 0a1aecde986..2beabe6a93d 100644 --- a/source/blender/python/gpu/gpu_py_element.c +++ b/source/blender/python/gpu/gpu_py_element.c @@ -32,24 +32,22 @@ #include "../generic/py_capi_utils.h" #include "../generic/python_utildefines.h" -#include "gpu_py_api.h" +#include "gpu_py.h" #include "gpu_py_element.h" /* own include */ /* -------------------------------------------------------------------- */ /** \name IndexBuf Type * \{ */ -static PyObject *py_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) +static PyObject *pygpu_IndexBuf__tp_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) { BPYGPU_IS_INIT_OR_ERROR_OBJ; const char *error_prefix = "IndexBuf.__new__"; bool ok = true; - struct { - GPUPrimType type_id; - PyObject *seq; - } params; + struct PyC_StringEnum prim_type = {bpygpu_primtype_items, GPU_PRIM_NONE}; + PyObject *seq; uint verts_per_prim; uint index_len; @@ -58,11 +56,11 @@ static PyObject *py_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyO static const char *_keywords[] = {"type", "seq", NULL}; static _PyArg_Parser _parser = {"$O&O:IndexBuf.__new__", _keywords, 0}; if (!_PyArg_ParseTupleAndKeywordsFast( - args, kwds, &_parser, bpygpu_ParsePrimType, ¶ms.type_id, ¶ms.seq)) { + args, kwds, &_parser, PyC_ParseStringEnum, &prim_type, &seq)) { return NULL; } - verts_per_prim = GPU_indexbuf_primitive_len(params.type_id); + verts_per_prim = GPU_indexbuf_primitive_len(prim_type.value_found); if (verts_per_prim == -1) { PyErr_Format(PyExc_ValueError, "The argument 'type' must be " @@ -70,10 +68,10 @@ static PyObject *py_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyO return NULL; } - if (PyObject_CheckBuffer(params.seq)) { + if (PyObject_CheckBuffer(seq)) { Py_buffer pybuffer; - if (PyObject_GetBuffer(params.seq, &pybuffer, PyBUF_FORMAT | PyBUF_ND) == -1) { + if (PyObject_GetBuffer(seq, &pybuffer, PyBUF_FORMAT | PyBUF_ND) == -1) { /* PyObject_GetBuffer already handles error messages. */ return NULL; } @@ -97,7 +95,7 @@ static PyObject *py_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyO /* The `vertex_len` parameter is only used for asserts in the Debug build. */ /* Not very useful in python since scripts are often tested in Release build. */ /* Use `INT_MAX` instead of the actual number of vertices. */ - GPU_indexbuf_init(&builder, params.type_id, index_len, INT_MAX); + GPU_indexbuf_init(&builder, prim_type.value_found, index_len, INT_MAX); #if 0 uint *buf = pybuffer.buf; @@ -111,7 +109,7 @@ static PyObject *py_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyO PyBuffer_Release(&pybuffer); } else { - PyObject *seq_fast = PySequence_Fast(params.seq, error_prefix); + PyObject *seq_fast = PySequence_Fast(seq, error_prefix); if (seq_fast == NULL) { return false; @@ -126,7 +124,7 @@ static PyObject *py_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyO /* The `vertex_len` parameter is only used for asserts in the Debug build. */ /* Not very useful in python since scripts are often tested in Release build. */ /* Use `INT_MAX` instead of the actual number of vertices. */ - GPU_indexbuf_init(&builder, params.type_id, index_len, INT_MAX); + GPU_indexbuf_init(&builder, prim_type.value_found, index_len, INT_MAX); if (verts_per_prim == 1) { for (uint i = 0; i < seq_len; i++) { @@ -175,13 +173,13 @@ static PyObject *py_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyO return BPyGPUIndexBuf_CreatePyObject(GPU_indexbuf_build(&builder)); } -static void py_IndexBuf_dealloc(BPyGPUIndexBuf *self) +static void pygpu_IndexBuf__tp_dealloc(BPyGPUIndexBuf *self) { GPU_indexbuf_discard(self->elem); Py_TYPE(self)->tp_free(self); } -PyDoc_STRVAR(py_gpu_element_doc, +PyDoc_STRVAR(pygpu_IndexBuf__tp_doc, ".. class:: GPUIndexBuf(type, seq)\n" "\n" " Contains an index buffer.\n" @@ -199,10 +197,10 @@ PyDoc_STRVAR(py_gpu_element_doc, PyTypeObject BPyGPUIndexBuf_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUIndexBuf", .tp_basicsize = sizeof(BPyGPUIndexBuf), - .tp_dealloc = (destructor)py_IndexBuf_dealloc, + .tp_dealloc = (destructor)pygpu_IndexBuf__tp_dealloc, .tp_flags = Py_TPFLAGS_DEFAULT, - .tp_doc = py_gpu_element_doc, - .tp_new = py_IndexBuf_new, + .tp_doc = pygpu_IndexBuf__tp_doc, + .tp_new = pygpu_IndexBuf__tp_new, }; /** \} */ diff --git a/source/blender/python/gpu/gpu_py_framebuffer.c b/source/blender/python/gpu/gpu_py_framebuffer.c new file mode 100644 index 00000000000..5bf577f3b96 --- /dev/null +++ b/source/blender/python/gpu/gpu_py_framebuffer.c @@ -0,0 +1,546 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + * + * This file defines the framebuffer functionalities of the 'gpu' module + * used for off-screen OpenGL rendering. + * + * - Use ``bpygpu_`` for local API. + * - Use ``BPyGPU`` for public API. + */ + +#include + +#include "GPU_context.h" +#include "GPU_framebuffer.h" +#include "GPU_init_exit.h" + +#include "../generic/py_capi_utils.h" +#include "../generic/python_utildefines.h" +#include "../mathutils/mathutils.h" + +#include "gpu_py.h" +#include "gpu_py_texture.h" + +#include "gpu_py_framebuffer.h" /* own include */ + +/* -------------------------------------------------------------------- */ +/** \name GPUFrameBuffer Common Utilities + * \{ */ + +static int pygpu_framebuffer_valid_check(BPyGPUFrameBuffer *bpygpu_fb) +{ + if (UNLIKELY(bpygpu_fb->fb == NULL)) { + PyErr_SetString(PyExc_ReferenceError, +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD + "GPU framebuffer was freed, no further access is valid" +#else + "GPU framebuffer: internal error" +#endif + ); + return -1; + } + return 0; +} + +#define PYGPU_FRAMEBUFFER_CHECK_OBJ(bpygpu) \ + { \ + if (UNLIKELY(pygpu_framebuffer_valid_check(bpygpu) == -1)) { \ + return NULL; \ + } \ + } \ + ((void)0) + +static void pygpu_framebuffer_free_if_possible(GPUFrameBuffer *fb) +{ + if (!fb) { + return; + } + + if (GPU_is_init()) { + GPU_framebuffer_free(fb); + } + else { + printf("PyFramebuffer freed after the context has been destroyed.\n"); + } +} + +/* Keep less than or equal to #FRAMEBUFFER_STACK_DEPTH */ +#define GPU_PY_FRAMEBUFFER_STACK_LEN 16 + +static bool pygpu_framebuffer_stack_push_and_bind_or_error(GPUFrameBuffer *fb) +{ + if (GPU_framebuffer_stack_level_get() >= GPU_PY_FRAMEBUFFER_STACK_LEN) { + PyErr_SetString( + PyExc_RuntimeError, + "Maximum framebuffer stack depth " STRINGIFY(GPU_PY_FRAMEBUFFER_STACK_LEN) " reached"); + return false; + } + GPU_framebuffer_push(GPU_framebuffer_active_get()); + GPU_framebuffer_bind(fb); + return true; +} + +static bool pygpu_framebuffer_stack_pop_and_restore_or_error(GPUFrameBuffer *fb) +{ + if (GPU_framebuffer_stack_level_get() == 0) { + PyErr_SetString(PyExc_RuntimeError, "Minimum framebuffer stack depth reached"); + return false; + } + + if (fb && !GPU_framebuffer_bound(fb)) { + PyErr_SetString(PyExc_RuntimeError, "Framebuffer is not bound"); + return false; + } + + GPUFrameBuffer *fb_prev = GPU_framebuffer_pop(); + GPU_framebuffer_bind(fb_prev); + return true; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Stack (Context Manager) + * + * Safer alternative to ensure balanced push/pop calls. + * + * \{ */ + +typedef struct { + PyObject_HEAD /* required python macro */ + BPyGPUFrameBuffer *py_fb; + int level; +} PyFrameBufferStackContext; + +static void pygpu_framebuffer_stack_context__tp_dealloc(PyFrameBufferStackContext *self) +{ + Py_DECREF(self->py_fb); + PyObject_DEL(self); +} + +static PyObject *pygpu_framebuffer_stack_context_enter(PyFrameBufferStackContext *self) +{ + PYGPU_FRAMEBUFFER_CHECK_OBJ(self->py_fb); + + /* sanity - should never happen */ + if (self->level != -1) { + PyErr_SetString(PyExc_RuntimeError, "Already in use"); + return NULL; + } + + if (!pygpu_framebuffer_stack_push_and_bind_or_error(self->py_fb->fb)) { + return NULL; + } + + self->level = GPU_framebuffer_stack_level_get(); + Py_RETURN_NONE; +} + +static PyObject *pygpu_framebuffer_stack_context_exit(PyFrameBufferStackContext *self, + PyObject *UNUSED(args)) +{ + PYGPU_FRAMEBUFFER_CHECK_OBJ(self->py_fb); + + /* sanity - should never happen */ + if (self->level == -1) { + fprintf(stderr, "Not yet in use\n"); + return NULL; + } + + const int level = GPU_framebuffer_stack_level_get(); + if (level != self->level) { + fprintf(stderr, "Level of bind mismatch, expected %d, got %d\n", self->level, level); + } + + if (!pygpu_framebuffer_stack_pop_and_restore_or_error(self->py_fb->fb)) { + return NULL; + } + Py_RETURN_NONE; +} + +static PyMethodDef pygpu_framebuffer_stack_context__tp_methods[] = { + {"__enter__", (PyCFunction)pygpu_framebuffer_stack_context_enter, METH_NOARGS}, + {"__exit__", (PyCFunction)pygpu_framebuffer_stack_context_exit, METH_VARARGS}, + {NULL}, +}; + +static PyTypeObject FramebufferStackContext_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUFrameBufferStackContext", + .tp_basicsize = sizeof(PyFrameBufferStackContext), + .tp_dealloc = (destructor)pygpu_framebuffer_stack_context__tp_dealloc, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_methods = pygpu_framebuffer_stack_context__tp_methods, +}; + +PyDoc_STRVAR(pygpu_framebuffer_bind_doc, + ".. function:: bind()\n" + "\n" + " Context manager to ensure balanced bind calls, even in the case of an error.\n"); +static PyObject *pygpu_framebuffer_bind(BPyGPUFrameBuffer *self) +{ + PyFrameBufferStackContext *ret = PyObject_New(PyFrameBufferStackContext, + &FramebufferStackContext_Type); + ret->py_fb = self; + ret->level = -1; + Py_INCREF(self); + return (PyObject *)ret; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name GPUFramebuffer Type + * \{ */ + +/* Fill in the GPUAttachment according to the PyObject parameter. + * PyObject *o can be NULL, Py_None, BPyGPUTexture or a dictionary containing the keyword "texture" + * and the optional keywords "layer" and "mip". + * Returns false on error. In this case, a python message will be raised and GPUAttachment will not + * be touched. */ +static bool pygpu_framebuffer_new_parse_arg(PyObject *o, GPUAttachment *r_attach) +{ + GPUAttachment tmp_attach = GPU_ATTACHMENT_NONE; + + if (!o || o == Py_None) { + /* Pass. */; + } + else if (BPyGPUTexture_Check(o)) { + if (!bpygpu_ParseTexture(o, &tmp_attach.tex)) { + return false; + } + } + else { + const char *c_texture = "texture"; + const char *c_layer = "layer"; + const char *c_mip = "mip"; + PyObject *key, *value; + Py_ssize_t pos = 0; + while (PyDict_Next(o, &pos, &key, &value)) { + if (!PyUnicode_Check(key)) { + PyErr_SetString(PyExc_TypeError, "keywords must be strings"); + return false; + } + + if (c_texture && _PyUnicode_EqualToASCIIString(key, c_texture)) { + /* Compare only once. */ + c_texture = NULL; + if (!bpygpu_ParseTexture(value, &tmp_attach.tex)) { + return false; + } + } + else if (c_layer && _PyUnicode_EqualToASCIIString(key, c_layer)) { + /* Compare only once. */ + c_layer = NULL; + tmp_attach.layer = PyLong_AsLong(value); + if (tmp_attach.layer == -1 && PyErr_Occurred()) { + return false; + } + } + else if (c_mip && _PyUnicode_EqualToASCIIString(key, c_mip)) { + /* Compare only once. */ + c_mip = NULL; + tmp_attach.mip = PyLong_AsLong(value); + if (tmp_attach.mip == -1 && PyErr_Occurred()) { + return false; + } + } + else { + PyErr_Format( + PyExc_TypeError, "'%U' is an invalid keyword argument for this attribute", key); + return false; + } + } + } + + *r_attach = tmp_attach; + return true; +} + +static PyObject *pygpu_framebuffer__tp_new(PyTypeObject *UNUSED(self), + PyObject *args, + PyObject *kwds) +{ + BPYGPU_IS_INIT_OR_ERROR_OBJ; + if (!GPU_context_active_get()) { + PyErr_SetString(PyExc_RuntimeError, "No active GPU context found"); + return NULL; + } + + PyObject *depth_attachment = NULL; + PyObject *color_attachements = NULL; + static const char *_keywords[] = {"depth_slot", "color_slots", NULL}; + static _PyArg_Parser _parser = {"|$OO:GPUFrameBuffer.__new__", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast( + args, kwds, &_parser, &depth_attachment, &color_attachements)) { + return NULL; + } + + /* Keep in sync with #GPU_FB_MAX_COLOR_ATTACHMENT. + * TODO: share the define. */ +#define BPYGPU_FB_MAX_COLOR_ATTACHMENT 6 + + GPUAttachment config[BPYGPU_FB_MAX_COLOR_ATTACHMENT + 1]; + + if (!pygpu_framebuffer_new_parse_arg(depth_attachment, &config[0])) { + return NULL; + } + if (config[0].tex && !GPU_texture_depth(config[0].tex)) { + PyErr_SetString(PyExc_ValueError, "Depth texture with incompatible format"); + return NULL; + } + + int color_attachements_len = 0; + if (color_attachements && color_attachements != Py_None) { + if (PySequence_Check(color_attachements)) { + color_attachements_len = PySequence_Size(color_attachements); + if (color_attachements_len > BPYGPU_FB_MAX_COLOR_ATTACHMENT) { + PyErr_SetString( + PyExc_AttributeError, + "too many attachements, max is " STRINGIFY(BPYGPU_FB_MAX_COLOR_ATTACHMENT)); + return NULL; + } + + for (int i = 1; i <= color_attachements_len; i++) { + PyObject *o = PySequence_GetItem(color_attachements, i); + bool ok = pygpu_framebuffer_new_parse_arg(o, &config[i]); + Py_DECREF(o); + if (!ok) { + return NULL; + } + } + } + else { + if (!pygpu_framebuffer_new_parse_arg(color_attachements, &config[1])) { + return NULL; + } + color_attachements_len = 1; + } + } + + GPUFrameBuffer *fb_python = GPU_framebuffer_create("fb_python"); + GPU_framebuffer_config_array(fb_python, config, color_attachements_len + 1); + + return BPyGPUFrameBuffer_CreatePyObject(fb_python); +} + +PyDoc_STRVAR(pygpu_framebuffer_is_bound_doc, + "Checks if this is the active framebuffer in the context."); +static PyObject *pygpu_framebuffer_is_bound(BPyGPUFrameBuffer *self, void *UNUSED(type)) +{ + PYGPU_FRAMEBUFFER_CHECK_OBJ(self); + return PyBool_FromLong(GPU_framebuffer_bound(self->fb)); +} + +PyDoc_STRVAR(pygpu_framebuffer_clear_doc, + ".. method:: clear(color=None, depth=None, stencil=None)\n" + "\n" + " Fill color, depth and stencil textures with specific value.\n" + " Common values: color=(0.0, 0.0, 0.0, 1.0), depth=1.0, stencil=0.\n" + "\n" + " :arg color: float sequence each representing ``(r, g, b, a)``.\n" + " :type color: sequence of 3 or 4 floats\n" + " :arg depth: depth value.\n" + " :type depth: `float`\n" + " :arg stencil: stencil value.\n" + " :type stencil: `int`\n"); +static PyObject *pygpu_framebuffer_clear(BPyGPUFrameBuffer *self, PyObject *args, PyObject *kwds) +{ + PYGPU_FRAMEBUFFER_CHECK_OBJ(self); + + if (!GPU_framebuffer_bound(self->fb)) { + return NULL; + } + + PyObject *py_col = NULL; + PyObject *py_depth = NULL; + PyObject *py_stencil = NULL; + + static const char *_keywords[] = {"color", "depth", "stencil", NULL}; + static _PyArg_Parser _parser = {"|$OOO:clear", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, &py_col, &py_depth, &py_stencil)) { + return NULL; + } + + eGPUFrameBufferBits buffers = 0; + float col[4] = {0.0f, 0.0f, 0.0f, 1.0f}; + float depth = 1.0f; + uint stencil = 0; + + if (py_col && py_col != Py_None) { + if (mathutils_array_parse(col, 3, 4, py_col, "GPUFrameBuffer.clear(), invalid 'color' arg") == + -1) { + return NULL; + } + buffers |= GPU_COLOR_BIT; + } + + if (py_depth && py_depth != Py_None) { + depth = PyFloat_AsDouble(py_depth); + if (PyErr_Occurred()) { + return NULL; + } + buffers |= GPU_DEPTH_BIT; + } + + if (py_stencil && py_stencil != Py_None) { + if ((stencil = PyC_Long_AsU32(py_stencil)) == (uint)-1) { + return NULL; + } + buffers |= GPU_STENCIL_BIT; + } + + GPU_framebuffer_clear(self->fb, buffers, col, depth, stencil); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_framebuffer_viewport_set_doc, + ".. function:: viewport_set(x, y, xsize, ysize)\n" + "\n" + " Set the viewport for this framebuffer object.\n" + " Note: The viewport state is not saved upon framebuffer rebind.\n" + "\n" + " :param x, y: lower left corner of the viewport_set rectangle, in pixels.\n" + " :param xsize, ysize: width and height of the viewport_set.\n" + " :type x, y, xsize, ysize: `int`\n"); +static PyObject *pygpu_framebuffer_viewport_set(BPyGPUFrameBuffer *self, + PyObject *args, + void *UNUSED(type)) +{ + int x, y, xsize, ysize; + if (!PyArg_ParseTuple(args, "iiii:viewport_set", &x, &y, &xsize, &ysize)) { + return NULL; + } + + GPU_framebuffer_viewport_set(self->fb, x, y, xsize, ysize); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_framebuffer_viewport_get_doc, + ".. function:: viewport_get()\n" + "\n" + " Returns position and dimension to current viewport.\n"); +static PyObject *pygpu_framebuffer_viewport_get(BPyGPUFrameBuffer *self, void *UNUSED(type)) +{ + PYGPU_FRAMEBUFFER_CHECK_OBJ(self); + int viewport[4]; + GPU_framebuffer_viewport_get(self->fb, viewport); + + PyObject *ret = PyTuple_New(4); + PyTuple_SET_ITEMS(ret, + PyLong_FromLong(viewport[0]), + PyLong_FromLong(viewport[1]), + PyLong_FromLong(viewport[2]), + PyLong_FromLong(viewport[3])); + return ret; +} + +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD +PyDoc_STRVAR(pygpu_framebuffer_free_doc, + ".. method:: free()\n" + "\n" + " Free the framebuffer object.\n" + " The framebuffer will no longer be accessible.\n"); +static PyObject *pygpu_framebuffer_free(BPyGPUFrameBuffer *self) +{ + PYGPU_FRAMEBUFFER_CHECK_OBJ(self); + pygpu_framebuffer_free_if_possible(self->fb); + self->fb = NULL; + Py_RETURN_NONE; +} +#endif + +static void BPyGPUFrameBuffer__tp_dealloc(BPyGPUFrameBuffer *self) +{ + pygpu_framebuffer_free_if_possible(self->fb); + Py_TYPE(self)->tp_free((PyObject *)self); +} + +static PyGetSetDef pygpu_framebuffer__tp_getseters[] = { + {"is_bound", + (getter)pygpu_framebuffer_is_bound, + (setter)NULL, + pygpu_framebuffer_is_bound_doc, + NULL}, + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ +}; + +static struct PyMethodDef pygpu_framebuffer__tp_methods[] = { + {"bind", (PyCFunction)pygpu_framebuffer_bind, METH_NOARGS, pygpu_framebuffer_bind_doc}, + {"clear", + (PyCFunction)pygpu_framebuffer_clear, + METH_VARARGS | METH_KEYWORDS, + pygpu_framebuffer_clear_doc}, + {"viewport_set", + (PyCFunction)pygpu_framebuffer_viewport_set, + METH_NOARGS, + pygpu_framebuffer_viewport_set_doc}, + {"viewport_get", + (PyCFunction)pygpu_framebuffer_viewport_get, + METH_VARARGS, + pygpu_framebuffer_viewport_get_doc}, +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD + {"free", (PyCFunction)pygpu_framebuffer_free, METH_NOARGS, pygpu_framebuffer_free_doc}, +#endif + {NULL, NULL, 0, NULL}, +}; + +PyDoc_STRVAR(pygpu_framebuffer__tp_doc, + ".. class:: GPUFrameBuffer(depth_slot=None, color_slots=None)\n" + "\n" + " This object gives access to framebuffer functionallities.\n" + " When a 'layer' is specified in a argument, a single layer of a 3D or array " + "texture is attached to the frame-buffer.\n" + " For cube map textures, layer is translated into a cube map face.\n" + "\n" + " :arg depth_slot: GPUTexture to attach or a `dict` containing keywords: " + "'texture', 'layer' and 'mip'.\n" + " :type depth_slot: :class:`gpu.types.GPUTexture`, `dict` or `Nonetype`\n" + " :arg color_slots: Tuple where each item can be a GPUTexture or a `dict` " + "containing keywords: 'texture', 'layer' and 'mip'.\n" + " :type color_slots: `tuple` or `Nonetype`\n"); +PyTypeObject BPyGPUFrameBuffer_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUFrameBuffer", + .tp_basicsize = sizeof(BPyGPUFrameBuffer), + .tp_dealloc = (destructor)BPyGPUFrameBuffer__tp_dealloc, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_doc = pygpu_framebuffer__tp_doc, + .tp_methods = pygpu_framebuffer__tp_methods, + .tp_getset = pygpu_framebuffer__tp_getseters, + .tp_new = pygpu_framebuffer__tp_new, +}; + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Public API + * \{ */ + +PyObject *BPyGPUFrameBuffer_CreatePyObject(GPUFrameBuffer *fb) +{ + BPyGPUFrameBuffer *self; + + self = PyObject_New(BPyGPUFrameBuffer, &BPyGPUFrameBuffer_Type); + self->fb = fb; + + return (PyObject *)self; +} + +/** \} */ + +#undef PYGPU_FRAMEBUFFER_CHECK_OBJ diff --git a/source/blender/python/gpu/gpu_py_framebuffer.h b/source/blender/python/gpu/gpu_py_framebuffer.h new file mode 100644 index 00000000000..7113e7c35aa --- /dev/null +++ b/source/blender/python/gpu/gpu_py_framebuffer.h @@ -0,0 +1,33 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + */ + +#pragma once + +#include "BLI_compiler_attrs.h" + +extern PyTypeObject BPyGPUFrameBuffer_Type; + +#define BPyGPUFrameBuffer_Check(v) (Py_TYPE(v) == &BPyGPUFrameBuffer_Type) + +typedef struct BPyGPUFrameBuffer { + PyObject_HEAD struct GPUFrameBuffer *fb; +} BPyGPUFrameBuffer; + +PyObject *BPyGPUFrameBuffer_CreatePyObject(struct GPUFrameBuffer *fb) ATTR_NONNULL(1); diff --git a/source/blender/python/gpu/gpu_py_matrix.c b/source/blender/python/gpu/gpu_py_matrix.c index a479f270770..df7c82379b3 100644 --- a/source/blender/python/gpu/gpu_py_matrix.c +++ b/source/blender/python/gpu/gpu_py_matrix.c @@ -44,7 +44,7 @@ /** \name Helper Functions * \{ */ -static bool py_stack_is_push_model_view_ok_or_error(void) +static bool pygpu_stack_is_push_model_view_ok_or_error(void) { if (GPU_matrix_stack_level_get_model_view() >= GPU_PY_MATRIX_STACK_LEN) { PyErr_SetString( @@ -55,7 +55,7 @@ static bool py_stack_is_push_model_view_ok_or_error(void) return true; } -static bool py_stack_is_push_projection_ok_or_error(void) +static bool pygpu_stack_is_push_projection_ok_or_error(void) { if (GPU_matrix_stack_level_get_projection() >= GPU_PY_MATRIX_STACK_LEN) { PyErr_SetString( @@ -66,7 +66,7 @@ static bool py_stack_is_push_projection_ok_or_error(void) return true; } -static bool py_stack_is_pop_model_view_ok_or_error(void) +static bool pygpu_stack_is_pop_model_view_ok_or_error(void) { if (GPU_matrix_stack_level_get_model_view() == 0) { PyErr_SetString(PyExc_RuntimeError, "Minimum model-view stack depth reached"); @@ -75,7 +75,7 @@ static bool py_stack_is_pop_model_view_ok_or_error(void) return true; } -static bool py_stack_is_pop_projection_ok_or_error(void) +static bool pygpu_stack_is_pop_projection_ok_or_error(void) { if (GPU_matrix_stack_level_get_projection() == 0) { PyErr_SetString(PyExc_RuntimeError, "Minimum projection stack depth reached"); @@ -90,52 +90,52 @@ static bool py_stack_is_pop_projection_ok_or_error(void) /** \name Manage Stack * \{ */ -PyDoc_STRVAR(py_matrix_push_doc, +PyDoc_STRVAR(pygpu_matrix_push_doc, ".. function:: push()\n" "\n" " Add to the model-view matrix stack.\n"); -static PyObject *py_matrix_push(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_push(PyObject *UNUSED(self)) { - if (!py_stack_is_push_model_view_ok_or_error()) { + if (!pygpu_stack_is_push_model_view_ok_or_error()) { return NULL; } GPU_matrix_push(); Py_RETURN_NONE; } -PyDoc_STRVAR(py_matrix_pop_doc, +PyDoc_STRVAR(pygpu_matrix_pop_doc, ".. function:: pop()\n" "\n" " Remove the last model-view matrix from the stack.\n"); -static PyObject *py_matrix_pop(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_pop(PyObject *UNUSED(self)) { - if (!py_stack_is_pop_model_view_ok_or_error()) { + if (!pygpu_stack_is_pop_model_view_ok_or_error()) { return NULL; } GPU_matrix_pop(); Py_RETURN_NONE; } -PyDoc_STRVAR(py_matrix_push_projection_doc, +PyDoc_STRVAR(pygpu_matrix_push_projection_doc, ".. function:: push_projection()\n" "\n" " Add to the projection matrix stack.\n"); -static PyObject *py_matrix_push_projection(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_push_projection(PyObject *UNUSED(self)) { - if (!py_stack_is_push_projection_ok_or_error()) { + if (!pygpu_stack_is_push_projection_ok_or_error()) { return NULL; } GPU_matrix_push_projection(); Py_RETURN_NONE; } -PyDoc_STRVAR(py_matrix_pop_projection_doc, +PyDoc_STRVAR(pygpu_matrix_pop_projection_doc, ".. function:: pop_projection()\n" "\n" " Remove the last projection matrix from the stack.\n"); -static PyObject *py_matrix_pop_projection(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_pop_projection(PyObject *UNUSED(self)) { - if (!py_stack_is_pop_projection_ok_or_error()) { + if (!pygpu_stack_is_pop_projection_ok_or_error()) { return NULL; } GPU_matrix_pop_projection(); @@ -162,23 +162,23 @@ enum { PYGPU_MATRIX_TYPE_PROJECTION = 2, }; -static PyObject *py_matrix_stack_context_enter(BPyGPU_MatrixStackContext *self); -static PyObject *py_matrix_stack_context_exit(BPyGPU_MatrixStackContext *self, PyObject *args); +static PyObject *pygpu_matrix_stack_context_enter(BPyGPU_MatrixStackContext *self); +static PyObject *pygpu_matrix_stack_context_exit(BPyGPU_MatrixStackContext *self, PyObject *args); -static PyMethodDef py_matrix_stack_context_methods[] = { - {"__enter__", (PyCFunction)py_matrix_stack_context_enter, METH_NOARGS}, - {"__exit__", (PyCFunction)py_matrix_stack_context_exit, METH_VARARGS}, +static PyMethodDef pygpu_matrix_stack_context__tp_methods[] = { + {"__enter__", (PyCFunction)pygpu_matrix_stack_context_enter, METH_NOARGS}, + {"__exit__", (PyCFunction)pygpu_matrix_stack_context_exit, METH_VARARGS}, {NULL}, }; -static PyTypeObject BPyGPU_matrix_stack_context_Type = { +static PyTypeObject PyGPUMatrixStackContext_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUMatrixStackContext", .tp_basicsize = sizeof(BPyGPU_MatrixStackContext), .tp_flags = Py_TPFLAGS_DEFAULT, - .tp_methods = py_matrix_stack_context_methods, + .tp_methods = pygpu_matrix_stack_context__tp_methods, }; -static PyObject *py_matrix_stack_context_enter(BPyGPU_MatrixStackContext *self) +static PyObject *pygpu_matrix_stack_context_enter(BPyGPU_MatrixStackContext *self) { /* sanity - should never happen */ if (self->level != -1) { @@ -187,14 +187,14 @@ static PyObject *py_matrix_stack_context_enter(BPyGPU_MatrixStackContext *self) } if (self->type == PYGPU_MATRIX_TYPE_MODEL_VIEW) { - if (!py_stack_is_push_model_view_ok_or_error()) { + if (!pygpu_stack_is_push_model_view_ok_or_error()) { return NULL; } GPU_matrix_push(); self->level = GPU_matrix_stack_level_get_model_view(); } else if (self->type == PYGPU_MATRIX_TYPE_PROJECTION) { - if (!py_stack_is_push_projection_ok_or_error()) { + if (!pygpu_stack_is_push_projection_ok_or_error()) { return NULL; } GPU_matrix_push_projection(); @@ -206,8 +206,8 @@ static PyObject *py_matrix_stack_context_enter(BPyGPU_MatrixStackContext *self) Py_RETURN_NONE; } -static PyObject *py_matrix_stack_context_exit(BPyGPU_MatrixStackContext *self, - PyObject *UNUSED(args)) +static PyObject *pygpu_matrix_stack_context_exit(BPyGPU_MatrixStackContext *self, + PyObject *UNUSED(args)) { /* sanity - should never happen */ if (self->level == -1) { @@ -240,33 +240,33 @@ finally: Py_RETURN_NONE; } -static PyObject *py_matrix_push_pop_impl(int type) +static PyObject *pygpu_matrix_push_pop_impl(int type) { BPyGPU_MatrixStackContext *ret = PyObject_New(BPyGPU_MatrixStackContext, - &BPyGPU_matrix_stack_context_Type); + &PyGPUMatrixStackContext_Type); ret->type = type; ret->level = -1; return (PyObject *)ret; } PyDoc_STRVAR( - py_matrix_push_pop_doc, + pygpu_matrix_push_pop_doc, ".. function:: push_pop()\n" "\n" " Context manager to ensure balanced push/pop calls, even in the case of an error.\n"); -static PyObject *py_matrix_push_pop(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_push_pop(PyObject *UNUSED(self)) { - return py_matrix_push_pop_impl(PYGPU_MATRIX_TYPE_MODEL_VIEW); + return pygpu_matrix_push_pop_impl(PYGPU_MATRIX_TYPE_MODEL_VIEW); } PyDoc_STRVAR( - py_matrix_push_pop_projection_doc, + pygpu_matrix_push_pop_projection_doc, ".. function:: push_pop_projection()\n" "\n" " Context manager to ensure balanced push/pop calls, even in the case of an error.\n"); -static PyObject *py_matrix_push_pop_projection(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_push_pop_projection(PyObject *UNUSED(self)) { - return py_matrix_push_pop_impl(PYGPU_MATRIX_TYPE_PROJECTION); + return pygpu_matrix_push_pop_impl(PYGPU_MATRIX_TYPE_PROJECTION); } /** \} */ @@ -275,14 +275,14 @@ static PyObject *py_matrix_push_pop_projection(PyObject *UNUSED(self)) /** \name Manipulate State * \{ */ -PyDoc_STRVAR(py_matrix_multiply_matrix_doc, +PyDoc_STRVAR(pygpu_matrix_multiply_matrix_doc, ".. function:: multiply_matrix(matrix)\n" "\n" " Multiply the current stack matrix.\n" "\n" " :param matrix: A 4x4 matrix.\n" " :type matrix: :class:`mathutils.Matrix`\n"); -static PyObject *py_matrix_multiply_matrix(PyObject *UNUSED(self), PyObject *value) +static PyObject *pygpu_matrix_multiply_matrix(PyObject *UNUSED(self), PyObject *value) { MatrixObject *pymat; if (!Matrix_Parse4x4(value, &pymat)) { @@ -292,14 +292,14 @@ static PyObject *py_matrix_multiply_matrix(PyObject *UNUSED(self), PyObject *val Py_RETURN_NONE; } -PyDoc_STRVAR(py_matrix_scale_doc, +PyDoc_STRVAR(pygpu_matrix_scale_doc, ".. function:: scale(scale)\n" "\n" " Scale the current stack matrix.\n" "\n" " :param scale: Scale the current stack matrix.\n" " :type scale: sequence of 2 or 3 floats\n"); -static PyObject *py_matrix_scale(PyObject *UNUSED(self), PyObject *value) +static PyObject *pygpu_matrix_scale(PyObject *UNUSED(self), PyObject *value) { float scale[3]; int len; @@ -316,12 +316,12 @@ static PyObject *py_matrix_scale(PyObject *UNUSED(self), PyObject *value) Py_RETURN_NONE; } -PyDoc_STRVAR(py_matrix_scale_uniform_doc, +PyDoc_STRVAR(pygpu_matrix_scale_uniform_doc, ".. function:: scale_uniform(scale)\n" "\n" " :param scale: Scale the current stack matrix.\n" " :type scale: float\n"); -static PyObject *py_matrix_scale_uniform(PyObject *UNUSED(self), PyObject *value) +static PyObject *pygpu_matrix_scale_uniform(PyObject *UNUSED(self), PyObject *value) { float scalar; if ((scalar = PyFloat_AsDouble(value)) == -1.0f && PyErr_Occurred()) { @@ -332,14 +332,14 @@ static PyObject *py_matrix_scale_uniform(PyObject *UNUSED(self), PyObject *value Py_RETURN_NONE; } -PyDoc_STRVAR(py_matrix_translate_doc, +PyDoc_STRVAR(pygpu_matrix_translate_doc, ".. function:: translate(offset)\n" "\n" " Scale the current stack matrix.\n" "\n" " :param offset: Translate the current stack matrix.\n" " :type offset: sequence of 2 or 3 floats\n"); -static PyObject *py_matrix_translate(PyObject *UNUSED(self), PyObject *value) +static PyObject *pygpu_matrix_translate(PyObject *UNUSED(self), PyObject *value) { float offset[3]; int len; @@ -362,34 +362,34 @@ static PyObject *py_matrix_translate(PyObject *UNUSED(self), PyObject *value) /** \name Write State * \{ */ -PyDoc_STRVAR(py_matrix_reset_doc, +PyDoc_STRVAR(pygpu_matrix_reset_doc, ".. function:: reset()\n" "\n" " Empty stack and set to identity.\n"); -static PyObject *py_matrix_reset(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_reset(PyObject *UNUSED(self)) { GPU_matrix_reset(); Py_RETURN_NONE; } -PyDoc_STRVAR(py_matrix_load_identity_doc, +PyDoc_STRVAR(pygpu_matrix_load_identity_doc, ".. function:: load_identity()\n" "\n" " Empty stack and set to identity.\n"); -static PyObject *py_matrix_load_identity(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_load_identity(PyObject *UNUSED(self)) { GPU_matrix_identity_set(); Py_RETURN_NONE; } -PyDoc_STRVAR(py_matrix_load_matrix_doc, +PyDoc_STRVAR(pygpu_matrix_load_matrix_doc, ".. function:: load_matrix(matrix)\n" "\n" " Load a matrix into the stack.\n" "\n" " :param matrix: A 4x4 matrix.\n" " :type matrix: :class:`mathutils.Matrix`\n"); -static PyObject *py_matrix_load_matrix(PyObject *UNUSED(self), PyObject *value) +static PyObject *pygpu_matrix_load_matrix(PyObject *UNUSED(self), PyObject *value) { MatrixObject *pymat; if (!Matrix_Parse4x4(value, &pymat)) { @@ -399,14 +399,14 @@ static PyObject *py_matrix_load_matrix(PyObject *UNUSED(self), PyObject *value) Py_RETURN_NONE; } -PyDoc_STRVAR(py_matrix_load_projection_matrix_doc, +PyDoc_STRVAR(pygpu_matrix_load_projection_matrix_doc, ".. function:: load_projection_matrix(matrix)\n" "\n" " Load a projection matrix into the stack.\n" "\n" " :param matrix: A 4x4 matrix.\n" " :type matrix: :class:`mathutils.Matrix`\n"); -static PyObject *py_matrix_load_projection_matrix(PyObject *UNUSED(self), PyObject *value) +static PyObject *pygpu_matrix_load_projection_matrix(PyObject *UNUSED(self), PyObject *value) { MatrixObject *pymat; if (!Matrix_Parse4x4(value, &pymat)) { @@ -422,42 +422,42 @@ static PyObject *py_matrix_load_projection_matrix(PyObject *UNUSED(self), PyObje /** \name Read State * \{ */ -PyDoc_STRVAR(py_matrix_get_projection_matrix_doc, +PyDoc_STRVAR(pygpu_matrix_get_projection_matrix_doc, ".. function:: get_projection_matrix()\n" "\n" " Return a copy of the projection matrix.\n" "\n" " :return: A 4x4 projection matrix.\n" " :rtype: :class:`mathutils.Matrix`\n"); -static PyObject *py_matrix_get_projection_matrix(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_get_projection_matrix(PyObject *UNUSED(self)) { float matrix[4][4]; GPU_matrix_projection_get(matrix); return Matrix_CreatePyObject(&matrix[0][0], 4, 4, NULL); } -PyDoc_STRVAR(py_matrix_get_model_view_matrix_doc, +PyDoc_STRVAR(pygpu_matrix_get_model_view_matrix_doc, ".. function:: get_model_view_matrix()\n" "\n" " Return a copy of the model-view matrix.\n" "\n" " :return: A 4x4 view matrix.\n" " :rtype: :class:`mathutils.Matrix`\n"); -static PyObject *py_matrix_get_model_view_matrix(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_get_model_view_matrix(PyObject *UNUSED(self)) { float matrix[4][4]; GPU_matrix_model_view_get(matrix); return Matrix_CreatePyObject(&matrix[0][0], 4, 4, NULL); } -PyDoc_STRVAR(py_matrix_get_normal_matrix_doc, +PyDoc_STRVAR(pygpu_matrix_get_normal_matrix_doc, ".. function:: get_normal_matrix()\n" "\n" " Return a copy of the normal matrix.\n" "\n" " :return: A 3x3 normal matrix.\n" " :rtype: :class:`mathutils.Matrix`\n"); -static PyObject *py_matrix_get_normal_matrix(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_get_normal_matrix(PyObject *UNUSED(self)) { float matrix[3][3]; GPU_matrix_normal_get(matrix); @@ -470,87 +470,90 @@ static PyObject *py_matrix_get_normal_matrix(PyObject *UNUSED(self)) /** \name Module * \{ */ -static struct PyMethodDef py_matrix_methods[] = { +static struct PyMethodDef pygpu_matrix__tp_methods[] = { /* Manage Stack */ - {"push", (PyCFunction)py_matrix_push, METH_NOARGS, py_matrix_push_doc}, - {"pop", (PyCFunction)py_matrix_pop, METH_NOARGS, py_matrix_pop_doc}, + {"push", (PyCFunction)pygpu_matrix_push, METH_NOARGS, pygpu_matrix_push_doc}, + {"pop", (PyCFunction)pygpu_matrix_pop, METH_NOARGS, pygpu_matrix_pop_doc}, {"push_projection", - (PyCFunction)py_matrix_push_projection, + (PyCFunction)pygpu_matrix_push_projection, METH_NOARGS, - py_matrix_push_projection_doc}, + pygpu_matrix_push_projection_doc}, {"pop_projection", - (PyCFunction)py_matrix_pop_projection, + (PyCFunction)pygpu_matrix_pop_projection, METH_NOARGS, - py_matrix_pop_projection_doc}, + pygpu_matrix_pop_projection_doc}, /* Stack (Context Manager) */ - {"push_pop", (PyCFunction)py_matrix_push_pop, METH_NOARGS, py_matrix_push_pop_doc}, + {"push_pop", (PyCFunction)pygpu_matrix_push_pop, METH_NOARGS, pygpu_matrix_push_pop_doc}, {"push_pop_projection", - (PyCFunction)py_matrix_push_pop_projection, + (PyCFunction)pygpu_matrix_push_pop_projection, METH_NOARGS, - py_matrix_push_pop_projection_doc}, + pygpu_matrix_push_pop_projection_doc}, /* Manipulate State */ {"multiply_matrix", - (PyCFunction)py_matrix_multiply_matrix, + (PyCFunction)pygpu_matrix_multiply_matrix, METH_O, - py_matrix_multiply_matrix_doc}, - {"scale", (PyCFunction)py_matrix_scale, METH_O, py_matrix_scale_doc}, - {"scale_uniform", (PyCFunction)py_matrix_scale_uniform, METH_O, py_matrix_scale_uniform_doc}, - {"translate", (PyCFunction)py_matrix_translate, METH_O, py_matrix_translate_doc}, + pygpu_matrix_multiply_matrix_doc}, + {"scale", (PyCFunction)pygpu_matrix_scale, METH_O, pygpu_matrix_scale_doc}, + {"scale_uniform", + (PyCFunction)pygpu_matrix_scale_uniform, + METH_O, + pygpu_matrix_scale_uniform_doc}, + {"translate", (PyCFunction)pygpu_matrix_translate, METH_O, pygpu_matrix_translate_doc}, /* TODO */ #if 0 - {"rotate", (PyCFunction)py_matrix_rotate, METH_O, py_matrix_rotate_doc}, - {"rotate_axis", (PyCFunction)py_matrix_rotate_axis, METH_O, py_matrix_rotate_axis_doc}, - {"look_at", (PyCFunction)py_matrix_look_at, METH_O, py_matrix_look_at_doc}, + {"rotate", (PyCFunction)pygpu_matrix_rotate, METH_O, pygpu_matrix_rotate_doc}, + {"rotate_axis", (PyCFunction)pygpu_matrix_rotate_axis, METH_O, pygpu_matrix_rotate_axis_doc}, + {"look_at", (PyCFunction)pygpu_matrix_look_at, METH_O, pygpu_matrix_look_at_doc}, #endif /* Write State */ - {"reset", (PyCFunction)py_matrix_reset, METH_NOARGS, py_matrix_reset_doc}, + {"reset", (PyCFunction)pygpu_matrix_reset, METH_NOARGS, pygpu_matrix_reset_doc}, {"load_identity", - (PyCFunction)py_matrix_load_identity, + (PyCFunction)pygpu_matrix_load_identity, METH_NOARGS, - py_matrix_load_identity_doc}, - {"load_matrix", (PyCFunction)py_matrix_load_matrix, METH_O, py_matrix_load_matrix_doc}, + pygpu_matrix_load_identity_doc}, + {"load_matrix", (PyCFunction)pygpu_matrix_load_matrix, METH_O, pygpu_matrix_load_matrix_doc}, {"load_projection_matrix", - (PyCFunction)py_matrix_load_projection_matrix, + (PyCFunction)pygpu_matrix_load_projection_matrix, METH_O, - py_matrix_load_projection_matrix_doc}, + pygpu_matrix_load_projection_matrix_doc}, /* Read State */ {"get_projection_matrix", - (PyCFunction)py_matrix_get_projection_matrix, + (PyCFunction)pygpu_matrix_get_projection_matrix, METH_NOARGS, - py_matrix_get_projection_matrix_doc}, + pygpu_matrix_get_projection_matrix_doc}, {"get_model_view_matrix", - (PyCFunction)py_matrix_get_model_view_matrix, + (PyCFunction)pygpu_matrix_get_model_view_matrix, METH_NOARGS, - py_matrix_get_model_view_matrix_doc}, + pygpu_matrix_get_model_view_matrix_doc}, {"get_normal_matrix", - (PyCFunction)py_matrix_get_normal_matrix, + (PyCFunction)pygpu_matrix_get_normal_matrix, METH_NOARGS, - py_matrix_get_normal_matrix_doc}, + pygpu_matrix_get_normal_matrix_doc}, {NULL, NULL, 0, NULL}, }; -PyDoc_STRVAR(py_matrix_doc, "This module provides access to the matrix stack."); -static PyModuleDef BPyGPU_matrix_module_def = { +PyDoc_STRVAR(pygpu_matrix__tp_doc, "This module provides access to the matrix stack."); +static PyModuleDef pygpu_matrix_module_def = { PyModuleDef_HEAD_INIT, .m_name = "gpu.matrix", - .m_doc = py_matrix_doc, - .m_methods = py_matrix_methods, + .m_doc = pygpu_matrix__tp_doc, + .m_methods = pygpu_matrix__tp_methods, }; -PyObject *BPyInit_gpu_matrix(void) +PyObject *bpygpu_matrix_init(void) { PyObject *submodule; - submodule = PyModule_Create(&BPyGPU_matrix_module_def); + submodule = PyModule_Create(&pygpu_matrix_module_def); - if (PyType_Ready(&BPyGPU_matrix_stack_context_Type) < 0) { + if (PyType_Ready(&PyGPUMatrixStackContext_Type) < 0) { return NULL; } diff --git a/source/blender/python/gpu/gpu_py_matrix.h b/source/blender/python/gpu/gpu_py_matrix.h index 38a7f398b30..6af687f60ed 100644 --- a/source/blender/python/gpu/gpu_py_matrix.h +++ b/source/blender/python/gpu/gpu_py_matrix.h @@ -20,4 +20,4 @@ #pragma once -PyObject *BPyInit_gpu_matrix(void); +PyObject *bpygpu_matrix_init(void); diff --git a/source/blender/python/gpu/gpu_py_offscreen.c b/source/blender/python/gpu/gpu_py_offscreen.c index 51038aae598..9d5671ff702 100644 --- a/source/blender/python/gpu/gpu_py_offscreen.c +++ b/source/blender/python/gpu/gpu_py_offscreen.c @@ -30,6 +30,7 @@ #include "MEM_guardedalloc.h" +#include "BLI_string.h" #include "BLI_utildefines.h" #include "BKE_global.h" @@ -51,17 +52,26 @@ #include "../generic/py_capi_utils.h" -#include "gpu_py_api.h" +#include "gpu_py.h" #include "gpu_py_offscreen.h" /* own include */ +/* Define the free method to avoid breakage. */ +#define BPYGPU_USE_GPUOBJ_FREE_METHOD + /* -------------------------------------------------------------------- */ /** \name GPUOffScreen Common Utilities * \{ */ -static int py_offscreen_valid_check(BPyGPUOffScreen *py_ofs) +static int pygpu_offscreen_valid_check(BPyGPUOffScreen *py_ofs) { if (UNLIKELY(py_ofs->ofs == NULL)) { - PyErr_SetString(PyExc_ReferenceError, "GPU offscreen was freed, no further access is valid"); + PyErr_SetString(PyExc_ReferenceError, +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD + "GPU offscreen was freed, no further access is valid" +#else + "GPU offscreen: internal error" +#endif + ); return -1; } return 0; @@ -69,7 +79,7 @@ static int py_offscreen_valid_check(BPyGPUOffScreen *py_ofs) #define BPY_GPU_OFFSCREEN_CHECK_OBJ(bpygpu) \ { \ - if (UNLIKELY(py_offscreen_valid_check(bpygpu) == -1)) { \ + if (UNLIKELY(pygpu_offscreen_valid_check(bpygpu) == -1)) { \ return NULL; \ } \ } \ @@ -78,94 +88,96 @@ static int py_offscreen_valid_check(BPyGPUOffScreen *py_ofs) /** \} */ /* -------------------------------------------------------------------- */ -/** \name GPUOffscreen Type +/** \name Stack (Context Manager) + * + * Safer alternative to ensure balanced push/pop calls. + * * \{ */ -static PyObject *py_offscreen_new(PyTypeObject *UNUSED(self), PyObject *args, PyObject *kwds) +typedef struct { + PyObject_HEAD /* required python macro */ + BPyGPUOffScreen *py_offs; + int level; + bool is_explicitly_bound; /* Bound by "bind" method. */ +} OffScreenStackContext; + +static void pygpu_offscreen_stack_context__tp_dealloc(OffScreenStackContext *self) { - BPYGPU_IS_INIT_OR_ERROR_OBJ; + Py_DECREF(self->py_offs); + PyObject_DEL(self); +} - GPUOffScreen *ofs = NULL; - int width, height; - char err_out[256]; +static PyObject *pygpu_offscreen_stack_context_enter(OffScreenStackContext *self) +{ + BPY_GPU_OFFSCREEN_CHECK_OBJ(self->py_offs); - static const char *_keywords[] = {"width", "height", NULL}; - static _PyArg_Parser _parser = {"ii|i:GPUOffScreen.__new__", _keywords, 0}; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, &width, &height)) { + if (!self->is_explicitly_bound) { + if (self->level != -1) { + PyErr_SetString(PyExc_RuntimeError, "Already in use"); + return NULL; + } + + GPU_offscreen_bind(self->py_offs->ofs, true); + self->level = GPU_framebuffer_stack_level_get(); + } + + Py_RETURN_NONE; +} + +static PyObject *pygpu_offscreen_stack_context_exit(OffScreenStackContext *self, + PyObject *UNUSED(args)) +{ + BPY_GPU_OFFSCREEN_CHECK_OBJ(self->py_offs); + + if (self->level == -1) { + PyErr_SetString(PyExc_RuntimeError, "Not yet in use\n"); return NULL; } - if (GPU_context_active_get()) { - ofs = GPU_offscreen_create(width, height, true, false, err_out); - } - else { - strncpy(err_out, "No active GPU context found", 256); + const int level = GPU_framebuffer_stack_level_get(); + if (level != self->level) { + PyErr_Format( + PyExc_RuntimeError, "Level of bind mismatch, expected %d, got %d\n", self->level, level); } - if (ofs == NULL) { - PyErr_Format(PyExc_RuntimeError, - "gpu.offscreen.new(...) failed with '%s'", - err_out[0] ? err_out : "unknown error"); - return NULL; - } - - return BPyGPUOffScreen_CreatePyObject(ofs); + GPU_offscreen_unbind(self->py_offs->ofs, true); + Py_RETURN_NONE; } -PyDoc_STRVAR(py_offscreen_width_doc, "Width of the texture.\n\n:type: `int`"); -static PyObject *py_offscreen_width_get(BPyGPUOffScreen *self, void *UNUSED(type)) +static PyMethodDef pygpu_offscreen_stack_context__tp_methods[] = { + {"__enter__", (PyCFunction)pygpu_offscreen_stack_context_enter, METH_NOARGS}, + {"__exit__", (PyCFunction)pygpu_offscreen_stack_context_exit, METH_VARARGS}, + {NULL}, +}; + +static PyTypeObject PyGPUOffscreenStackContext_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUFrameBufferStackContext", + .tp_basicsize = sizeof(OffScreenStackContext), + .tp_dealloc = (destructor)pygpu_offscreen_stack_context__tp_dealloc, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_methods = pygpu_offscreen_stack_context__tp_methods, +}; + +PyDoc_STRVAR(pygpu_offscreen_bind_doc, + ".. function:: bind()\n" + "\n" + " Context manager to ensure balanced bind calls, even in the case of an error.\n"); +static PyObject *pygpu_offscreen_bind(BPyGPUOffScreen *self) { - BPY_GPU_OFFSCREEN_CHECK_OBJ(self); - return PyLong_FromLong(GPU_offscreen_width(self->ofs)); -} - -PyDoc_STRVAR(py_offscreen_height_doc, "Height of the texture.\n\n:type: `int`"); -static PyObject *py_offscreen_height_get(BPyGPUOffScreen *self, void *UNUSED(type)) -{ - BPY_GPU_OFFSCREEN_CHECK_OBJ(self); - return PyLong_FromLong(GPU_offscreen_height(self->ofs)); -} - -PyDoc_STRVAR(py_offscreen_color_texture_doc, - "OpenGL bindcode for the color texture.\n\n:type: `int`"); -static PyObject *py_offscreen_color_texture_get(BPyGPUOffScreen *self, void *UNUSED(type)) -{ - BPY_GPU_OFFSCREEN_CHECK_OBJ(self); - GPUTexture *texture = GPU_offscreen_color_texture(self->ofs); - return PyLong_FromLong(GPU_texture_opengl_bindcode(texture)); -} - -PyDoc_STRVAR( - py_offscreen_bind_doc, - ".. method:: bind(save=True)\n" - "\n" - " Bind the offscreen object.\n" - " To make sure that the offscreen gets unbind whether an exception occurs or not,\n" - " pack it into a `with` statement.\n" - "\n" - " :arg save: Save the current OpenGL state, so that it can be restored when unbinding.\n" - " :type save: `bool`\n"); -static PyObject *py_offscreen_bind(BPyGPUOffScreen *self, PyObject *args, PyObject *kwds) -{ - BPY_GPU_OFFSCREEN_CHECK_OBJ(self); - bool save = true; - - static const char *_keywords[] = {"save", NULL}; - static _PyArg_Parser _parser = {"|O&:bind", _keywords, 0}; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, PyC_ParseBool, &save)) { - return NULL; - } - - GPU_offscreen_bind(self->ofs, save); - GPU_apply_state(); - - self->is_saved = save; + OffScreenStackContext *ret = PyObject_New(OffScreenStackContext, + &PyGPUOffscreenStackContext_Type); + ret->py_offs = self; + ret->level = -1; + ret->is_explicitly_bound = false; Py_INCREF(self); - return (PyObject *)self; + pygpu_offscreen_stack_context_enter(ret); + ret->is_explicitly_bound = true; + + return (PyObject *)ret; } -PyDoc_STRVAR(py_offscreen_unbind_doc, +PyDoc_STRVAR(pygpu_offscreen_unbind_doc, ".. method:: unbind(restore=True)\n" "\n" " Unbind the offscreen object.\n" @@ -173,7 +185,7 @@ PyDoc_STRVAR(py_offscreen_unbind_doc, " :arg restore: Restore the OpenGL state, can only be used when the state has been " "saved before.\n" " :type restore: `bool`\n"); -static PyObject *py_offscreen_unbind(BPyGPUOffScreen *self, PyObject *args, PyObject *kwds) +static PyObject *pygpu_offscreen_unbind(BPyGPUOffScreen *self, PyObject *args, PyObject *kwds) { bool restore = true; @@ -190,8 +202,70 @@ static PyObject *py_offscreen_unbind(BPyGPUOffScreen *self, PyObject *args, PyOb Py_RETURN_NONE; } +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name GPUOffscreen Type + * \{ */ + +static PyObject *pygpu_offscreen__tp_new(PyTypeObject *UNUSED(self), + PyObject *args, + PyObject *kwds) +{ + BPYGPU_IS_INIT_OR_ERROR_OBJ; + + GPUOffScreen *ofs = NULL; + int width, height; + char err_out[256]; + + static const char *_keywords[] = {"width", "height", NULL}; + static _PyArg_Parser _parser = {"ii:GPUOffScreen.__new__", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, &width, &height)) { + return NULL; + } + + if (GPU_context_active_get()) { + ofs = GPU_offscreen_create(width, height, true, false, err_out); + } + else { + STRNCPY(err_out, "No active GPU context found"); + } + + if (ofs == NULL) { + PyErr_Format(PyExc_RuntimeError, + "gpu.offscreen.new(...) failed with '%s'", + err_out[0] ? err_out : "unknown error"); + return NULL; + } + + return BPyGPUOffScreen_CreatePyObject(ofs); +} + +PyDoc_STRVAR(pygpu_offscreen_width_doc, "Width of the texture.\n\n:type: `int`"); +static PyObject *pygpu_offscreen_width_get(BPyGPUOffScreen *self, void *UNUSED(type)) +{ + BPY_GPU_OFFSCREEN_CHECK_OBJ(self); + return PyLong_FromLong(GPU_offscreen_width(self->ofs)); +} + +PyDoc_STRVAR(pygpu_offscreen_height_doc, "Height of the texture.\n\n:type: `int`"); +static PyObject *pygpu_offscreen_height_get(BPyGPUOffScreen *self, void *UNUSED(type)) +{ + BPY_GPU_OFFSCREEN_CHECK_OBJ(self); + return PyLong_FromLong(GPU_offscreen_height(self->ofs)); +} + +PyDoc_STRVAR(pygpu_offscreen_color_texture_doc, + "OpenGL bindcode for the color texture.\n\n:type: `int`"); +static PyObject *pygpu_offscreen_color_texture_get(BPyGPUOffScreen *self, void *UNUSED(type)) +{ + BPY_GPU_OFFSCREEN_CHECK_OBJ(self); + GPUTexture *texture = GPU_offscreen_color_texture(self->ofs); + return PyLong_FromLong(GPU_texture_opengl_bindcode(texture)); +} + PyDoc_STRVAR( - py_offscreen_draw_view3d_doc, + pygpu_offscreen_draw_view3d_doc, ".. method:: draw_view3d(scene, view_layer, view3d, region, view_matrix, projection_matrix)\n" "\n" " Draw the 3d viewport in the offscreen object.\n" @@ -208,7 +282,7 @@ PyDoc_STRVAR( " :type view_matrix: :class:`mathutils.Matrix`\n" " :arg projection_matrix: Projection Matrix (e.g. ``camera.calc_matrix_camera(...)``).\n" " :type projection_matrix: :class:`mathutils.Matrix`\n"); -static PyObject *py_offscreen_draw_view3d(BPyGPUOffScreen *self, PyObject *args, PyObject *kwds) +static PyObject *pygpu_offscreen_draw_view3d(BPyGPUOffScreen *self, PyObject *args, PyObject *kwds) { MatrixObject *py_mat_view, *py_mat_projection; PyObject *py_scene, *py_view_layer, *py_region, *py_view3d; @@ -268,6 +342,7 @@ static PyObject *py_offscreen_draw_view3d(BPyGPUOffScreen *self, PyObject *args, true, "", false, + true, self->ofs, NULL); @@ -280,12 +355,13 @@ static PyObject *py_offscreen_draw_view3d(BPyGPUOffScreen *self, PyObject *args, Py_RETURN_NONE; } -PyDoc_STRVAR(py_offscreen_free_doc, +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD +PyDoc_STRVAR(pygpu_offscreen_free_doc, ".. method:: free()\n" "\n" " Free the offscreen object.\n" " The framebuffer, texture and render objects will no longer be accessible.\n"); -static PyObject *py_offscreen_free(BPyGPUOffScreen *self) +static PyObject *pygpu_offscreen_free(BPyGPUOffScreen *self) { BPY_GPU_OFFSCREEN_CHECK_OBJ(self); @@ -293,17 +369,7 @@ static PyObject *py_offscreen_free(BPyGPUOffScreen *self) self->ofs = NULL; Py_RETURN_NONE; } - -static PyObject *py_offscreen_bind_context_enter(BPyGPUOffScreen *UNUSED(self)) -{ - Py_RETURN_NONE; -} - -static PyObject *py_offscreen_bind_context_exit(BPyGPUOffScreen *self, PyObject *UNUSED(args)) -{ - GPU_offscreen_unbind(self->ofs, self->is_saved); - Py_RETURN_NONE; -} +#endif static void BPyGPUOffScreen__tp_dealloc(BPyGPUOffScreen *self) { @@ -313,34 +379,34 @@ static void BPyGPUOffScreen__tp_dealloc(BPyGPUOffScreen *self) Py_TYPE(self)->tp_free((PyObject *)self); } -static PyGetSetDef py_offscreen_getseters[] = { +static PyGetSetDef pygpu_offscreen__tp_getseters[] = { {"color_texture", - (getter)py_offscreen_color_texture_get, + (getter)pygpu_offscreen_color_texture_get, (setter)NULL, - py_offscreen_color_texture_doc, + pygpu_offscreen_color_texture_doc, NULL}, - {"width", (getter)py_offscreen_width_get, (setter)NULL, py_offscreen_width_doc, NULL}, - {"height", (getter)py_offscreen_height_get, (setter)NULL, py_offscreen_height_doc, NULL}, + {"width", (getter)pygpu_offscreen_width_get, (setter)NULL, pygpu_offscreen_width_doc, NULL}, + {"height", (getter)pygpu_offscreen_height_get, (setter)NULL, pygpu_offscreen_height_doc, NULL}, {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; -static struct PyMethodDef py_offscreen_methods[] = { - {"bind", (PyCFunction)py_offscreen_bind, METH_VARARGS | METH_KEYWORDS, py_offscreen_bind_doc}, +static struct PyMethodDef pygpu_offscreen__tp_methods[] = { + {"bind", (PyCFunction)pygpu_offscreen_bind, METH_NOARGS, pygpu_offscreen_bind_doc}, {"unbind", - (PyCFunction)py_offscreen_unbind, + (PyCFunction)pygpu_offscreen_unbind, METH_VARARGS | METH_KEYWORDS, - py_offscreen_unbind_doc}, + pygpu_offscreen_unbind_doc}, {"draw_view3d", - (PyCFunction)py_offscreen_draw_view3d, + (PyCFunction)pygpu_offscreen_draw_view3d, METH_VARARGS | METH_KEYWORDS, - py_offscreen_draw_view3d_doc}, - {"free", (PyCFunction)py_offscreen_free, METH_NOARGS, py_offscreen_free_doc}, - {"__enter__", (PyCFunction)py_offscreen_bind_context_enter, METH_NOARGS}, - {"__exit__", (PyCFunction)py_offscreen_bind_context_exit, METH_VARARGS}, + pygpu_offscreen_draw_view3d_doc}, +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD + {"free", (PyCFunction)pygpu_offscreen_free, METH_NOARGS, pygpu_offscreen_free_doc}, +#endif {NULL, NULL, 0, NULL}, }; -PyDoc_STRVAR(py_offscreen_doc, +PyDoc_STRVAR(pygpu_offscreen__tp_doc, ".. class:: GPUOffScreen(width, height)\n" "\n" " This object gives access to off screen buffers.\n" @@ -354,10 +420,10 @@ PyTypeObject BPyGPUOffScreen_Type = { .tp_basicsize = sizeof(BPyGPUOffScreen), .tp_dealloc = (destructor)BPyGPUOffScreen__tp_dealloc, .tp_flags = Py_TPFLAGS_DEFAULT, - .tp_doc = py_offscreen_doc, - .tp_methods = py_offscreen_methods, - .tp_getset = py_offscreen_getseters, - .tp_new = py_offscreen_new, + .tp_doc = pygpu_offscreen__tp_doc, + .tp_methods = pygpu_offscreen__tp_methods, + .tp_getset = pygpu_offscreen__tp_getseters, + .tp_new = pygpu_offscreen__tp_new, }; /** \} */ diff --git a/source/blender/python/gpu/gpu_py_offscreen.h b/source/blender/python/gpu/gpu_py_offscreen.h index efe5b57b22e..f551730cf54 100644 --- a/source/blender/python/gpu/gpu_py_offscreen.h +++ b/source/blender/python/gpu/gpu_py_offscreen.h @@ -28,7 +28,6 @@ extern PyTypeObject BPyGPUOffScreen_Type; typedef struct BPyGPUOffScreen { PyObject_HEAD struct GPUOffScreen *ofs; - bool is_saved; } BPyGPUOffScreen; PyObject *BPyGPUOffScreen_CreatePyObject(struct GPUOffScreen *ofs) ATTR_NONNULL(1); diff --git a/source/blender/python/gpu/gpu_py_select.c b/source/blender/python/gpu/gpu_py_select.c index 4fa9d5ebc7a..b72aca6a792 100644 --- a/source/blender/python/gpu/gpu_py_select.c +++ b/source/blender/python/gpu/gpu_py_select.c @@ -40,14 +40,14 @@ /** \name Methods * \{ */ -PyDoc_STRVAR(py_select_load_id_doc, +PyDoc_STRVAR(pygpu_select_load_id_doc, ".. function:: load_id(id)\n" "\n" " Set the selection ID.\n" "\n" " :param id: Number (32-bit uint).\n" " :type select: int\n"); -static PyObject *py_select_load_id(PyObject *UNUSED(self), PyObject *value) +static PyObject *pygpu_select_load_id(PyObject *UNUSED(self), PyObject *value) { uint id; if ((id = PyC_Long_AsU32(value)) == (uint)-1) { @@ -62,25 +62,25 @@ static PyObject *py_select_load_id(PyObject *UNUSED(self), PyObject *value) /** \name Module * \{ */ -static struct PyMethodDef py_select_methods[] = { +static struct PyMethodDef pygpu_select__tp_methods[] = { /* Manage Stack */ - {"load_id", (PyCFunction)py_select_load_id, METH_O, py_select_load_id_doc}, + {"load_id", (PyCFunction)pygpu_select_load_id, METH_O, pygpu_select_load_id_doc}, {NULL, NULL, 0, NULL}, }; -PyDoc_STRVAR(py_select_doc, "This module provides access to selection."); -static PyModuleDef BPyGPU_select_module_def = { +PyDoc_STRVAR(pygpu_select__tp_doc, "This module provides access to selection."); +static PyModuleDef pygpu_select_module_def = { PyModuleDef_HEAD_INIT, .m_name = "gpu.select", - .m_doc = py_select_doc, - .m_methods = py_select_methods, + .m_doc = pygpu_select__tp_doc, + .m_methods = pygpu_select__tp_methods, }; -PyObject *BPyInit_gpu_select(void) +PyObject *bpygpu_select_init(void) { PyObject *submodule; - submodule = PyModule_Create(&BPyGPU_select_module_def); + submodule = PyModule_Create(&pygpu_select_module_def); return submodule; } diff --git a/source/blender/python/gpu/gpu_py_select.h b/source/blender/python/gpu/gpu_py_select.h index 857cd7bb7f8..12152c82909 100644 --- a/source/blender/python/gpu/gpu_py_select.h +++ b/source/blender/python/gpu/gpu_py_select.h @@ -20,4 +20,4 @@ #pragma once -PyObject *BPyInit_gpu_select(void); +PyObject *bpygpu_select_init(void); diff --git a/source/blender/python/gpu/gpu_py_shader.c b/source/blender/python/gpu/gpu_py_shader.c index b2603c75c3f..4237e2d4b2d 100644 --- a/source/blender/python/gpu/gpu_py_shader.c +++ b/source/blender/python/gpu/gpu_py_shader.c @@ -26,20 +26,25 @@ #include "BLI_utildefines.h" #include "GPU_shader.h" +#include "GPU_texture.h" +#include "GPU_uniform_buffer.h" #include "../generic/py_capi_utils.h" #include "../generic/python_utildefines.h" #include "../mathutils/mathutils.h" -#include "gpu_py_api.h" -#include "gpu_py_shader.h" /* own include */ +#include "gpu_py.h" +#include "gpu_py_texture.h" +#include "gpu_py_uniformbuffer.h" #include "gpu_py_vertex_format.h" +#include "gpu_py_shader.h" /* own include */ + /* -------------------------------------------------------------------- */ /** \name Enum Conversion. * \{ */ -static const struct PyC_StringEnumItems pygpu_bultinshader_items[] = { +static const struct PyC_StringEnumItems pygpu_shader_builtin_items[] = { {GPU_SHADER_2D_UNIFORM_COLOR, "2D_UNIFORM_COLOR"}, {GPU_SHADER_2D_FLAT_COLOR, "2D_FLAT_COLOR"}, {GPU_SHADER_2D_SMOOTH_COLOR, "2D_SMOOTH_COLOR"}, @@ -51,7 +56,9 @@ static const struct PyC_StringEnumItems pygpu_bultinshader_items[] = { {0, NULL}, }; -static int py_uniform_location_get(GPUShader *shader, const char *name, const char *error_prefix) +static int pygpu_shader_uniform_location_get(GPUShader *shader, + const char *name, + const char *error_prefix) { const int uniform = GPU_shader_get_uniform(shader, name); @@ -68,7 +75,7 @@ static int py_uniform_location_get(GPUShader *shader, const char *name, const ch /** \name Shader Type * \{ */ -static PyObject *py_shader_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) +static PyObject *pygpu_shader__tp_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) { BPYGPU_IS_INIT_OR_ERROR_OBJ; @@ -107,17 +114,17 @@ static PyObject *py_shader_new(PyTypeObject *UNUSED(type), PyObject *args, PyObj } PyDoc_STRVAR( - py_shader_bind_doc, + pygpu_shader_bind_doc, ".. method:: bind()\n" "\n" " Bind the shader object. Required to be able to change uniforms of this shader.\n"); -static PyObject *py_shader_bind(BPyGPUShader *self) +static PyObject *pygpu_shader_bind(BPyGPUShader *self) { GPU_shader_bind(self->shader); Py_RETURN_NONE; } -PyDoc_STRVAR(py_shader_uniform_from_name_doc, +PyDoc_STRVAR(pygpu_shader_uniform_from_name_doc, ".. method:: uniform_from_name(name)\n" "\n" " Get uniform location by name.\n" @@ -126,14 +133,15 @@ PyDoc_STRVAR(py_shader_uniform_from_name_doc, " :type name: `str`\n" " :return: Location of the uniform variable.\n" " :rtype: `int`\n"); -static PyObject *py_shader_uniform_from_name(BPyGPUShader *self, PyObject *arg) +static PyObject *pygpu_shader_uniform_from_name(BPyGPUShader *self, PyObject *arg) { const char *name = PyUnicode_AsUTF8(arg); if (name == NULL) { return NULL; } - const int uniform = py_uniform_location_get(self->shader, name, "GPUShader.get_uniform"); + const int uniform = pygpu_shader_uniform_location_get( + self->shader, name, "GPUShader.get_uniform"); if (uniform == -1) { return NULL; @@ -143,7 +151,7 @@ static PyObject *py_shader_uniform_from_name(BPyGPUShader *self, PyObject *arg) } PyDoc_STRVAR( - py_shader_uniform_block_from_name_doc, + pygpu_shader_uniform_block_from_name_doc, ".. method:: uniform_block_from_name(name)\n" "\n" " Get uniform block location by name.\n" @@ -152,7 +160,7 @@ PyDoc_STRVAR( " :type name: `str`\n" " :return: The location of the uniform block variable.\n" " :rtype: `int`\n"); -static PyObject *py_shader_uniform_block_from_name(BPyGPUShader *self, PyObject *arg) +static PyObject *pygpu_shader_uniform_block_from_name(BPyGPUShader *self, PyObject *arg) { const char *name = PyUnicode_AsUTF8(arg); if (name == NULL) { @@ -169,12 +177,12 @@ static PyObject *py_shader_uniform_block_from_name(BPyGPUShader *self, PyObject return PyLong_FromLong(uniform); } -static bool py_shader_uniform_vector_impl(PyObject *args, - int elem_size, - int *r_location, - int *r_length, - int *r_count, - Py_buffer *r_pybuffer) +static bool pygpu_shader_uniform_vector_impl(PyObject *args, + int elem_size, + int *r_location, + int *r_length, + int *r_count, + Py_buffer *r_pybuffer) { PyObject *buffer; @@ -197,7 +205,7 @@ static bool py_shader_uniform_vector_impl(PyObject *args, return true; } -PyDoc_STRVAR(py_shader_uniform_vector_float_doc, +PyDoc_STRVAR(pygpu_shader_uniform_vector_float_doc, ".. method:: uniform_vector_float(location, buffer, length, count)\n" "\n" " Set the buffer to fill the uniform.\n" @@ -217,13 +225,14 @@ PyDoc_STRVAR(py_shader_uniform_vector_float_doc, " :param count: Specifies the number of elements, vector or matrices that are to " "be modified.\n" " :type count: int\n"); -static PyObject *py_shader_uniform_vector_float(BPyGPUShader *self, PyObject *args) +static PyObject *pygpu_shader_uniform_vector_float(BPyGPUShader *self, PyObject *args) { int location, length, count; Py_buffer pybuffer; - if (!py_shader_uniform_vector_impl(args, sizeof(float), &location, &length, &count, &pybuffer)) { + if (!pygpu_shader_uniform_vector_impl( + args, sizeof(float), &location, &length, &count, &pybuffer)) { return NULL; } @@ -234,17 +243,18 @@ static PyObject *py_shader_uniform_vector_float(BPyGPUShader *self, PyObject *ar Py_RETURN_NONE; } -PyDoc_STRVAR(py_shader_uniform_vector_int_doc, +PyDoc_STRVAR(pygpu_shader_uniform_vector_int_doc, ".. method:: uniform_vector_int(location, buffer, length, count)\n" "\n" " See GPUShader.uniform_vector_float(...) description.\n"); -static PyObject *py_shader_uniform_vector_int(BPyGPUShader *self, PyObject *args) +static PyObject *pygpu_shader_uniform_vector_int(BPyGPUShader *self, PyObject *args) { int location, length, count; Py_buffer pybuffer; - if (!py_shader_uniform_vector_impl(args, sizeof(int), &location, &length, &count, &pybuffer)) { + if (!pygpu_shader_uniform_vector_impl( + args, sizeof(int), &location, &length, &count, &pybuffer)) { return NULL; } @@ -255,7 +265,7 @@ static PyObject *py_shader_uniform_vector_int(BPyGPUShader *self, PyObject *args Py_RETURN_NONE; } -PyDoc_STRVAR(py_shader_uniform_bool_doc, +PyDoc_STRVAR(pygpu_shader_uniform_bool_doc, ".. method:: uniform_bool(name, seq)\n" "\n" " Specify the value of a uniform variable for the current program object.\n" @@ -264,7 +274,7 @@ PyDoc_STRVAR(py_shader_uniform_bool_doc, " :type name: str\n" " :param seq: Value that will be used to update the specified uniform variable.\n" " :type seq: sequence of bools\n"); -static PyObject *py_shader_uniform_bool(BPyGPUShader *self, PyObject *args) +static PyObject *pygpu_shader_uniform_bool(BPyGPUShader *self, PyObject *args) { const char *error_prefix = "GPUShader.uniform_bool"; @@ -308,7 +318,7 @@ static PyObject *py_shader_uniform_bool(BPyGPUShader *self, PyObject *args) return NULL; } - const int location = py_uniform_location_get(self->shader, params.id, error_prefix); + const int location = pygpu_shader_uniform_location_get(self->shader, params.id, error_prefix); if (location == -1) { return NULL; @@ -319,7 +329,7 @@ static PyObject *py_shader_uniform_bool(BPyGPUShader *self, PyObject *args) Py_RETURN_NONE; } -PyDoc_STRVAR(py_shader_uniform_float_doc, +PyDoc_STRVAR(pygpu_shader_uniform_float_doc, ".. method:: uniform_float(name, value)\n" "\n" " Specify the value of a uniform variable for the current program object.\n" @@ -328,7 +338,7 @@ PyDoc_STRVAR(py_shader_uniform_float_doc, " :type name: str\n" " :param value: Value that will be used to update the specified uniform variable.\n" " :type value: single number or sequence of numbers\n"); -static PyObject *py_shader_uniform_float(BPyGPUShader *self, PyObject *args) +static PyObject *pygpu_shader_uniform_float(BPyGPUShader *self, PyObject *args) { const char *error_prefix = "GPUShader.uniform_float"; @@ -377,7 +387,7 @@ static PyObject *py_shader_uniform_float(BPyGPUShader *self, PyObject *args) return NULL; } - const int location = py_uniform_location_get(self->shader, params.id, error_prefix); + const int location = pygpu_shader_uniform_location_get(self->shader, params.id, error_prefix); if (location == -1) { return NULL; @@ -388,7 +398,7 @@ static PyObject *py_shader_uniform_float(BPyGPUShader *self, PyObject *args) Py_RETURN_NONE; } -PyDoc_STRVAR(py_shader_uniform_int_doc, +PyDoc_STRVAR(pygpu_shader_uniform_int_doc, ".. method:: uniform_int(name, seq)\n" "\n" " Specify the value of a uniform variable for the current program object.\n" @@ -397,7 +407,7 @@ PyDoc_STRVAR(py_shader_uniform_int_doc, " :type name: str\n" " :param seq: Value that will be used to update the specified uniform variable.\n" " :type seq: sequence of numbers\n"); -static PyObject *py_shader_uniform_int(BPyGPUShader *self, PyObject *args) +static PyObject *pygpu_shader_uniform_int(BPyGPUShader *self, PyObject *args) { const char *error_prefix = "GPUShader.uniform_int"; @@ -447,7 +457,7 @@ static PyObject *py_shader_uniform_int(BPyGPUShader *self, PyObject *args) return NULL; } - const int location = py_uniform_location_get(self->shader, params.id, error_prefix); + const int location = pygpu_shader_uniform_location_get(self->shader, params.id, error_prefix); if (location == -1) { return NULL; @@ -458,8 +468,66 @@ static PyObject *py_shader_uniform_int(BPyGPUShader *self, PyObject *args) Py_RETURN_NONE; } +PyDoc_STRVAR(pygpu_shader_uniform_sampler_doc, + ".. method:: uniform_sampler(name, texture)\n" + "\n" + " Specify the value of a texture uniform variable for the current GPUShader.\n" + "\n" + " :param name: name of the uniform variable whose texture is to be specified.\n" + " :type name: str\n" + " :param texture: Texture to attach.\n" + " :type texture: :class:`gpu.types.GPUTexture`\n"); +static PyObject *pygpu_shader_uniform_sampler(BPyGPUShader *self, PyObject *args) +{ + const char *name; + BPyGPUTexture *py_texture; + if (!PyArg_ParseTuple( + args, "sO!:GPUShader.uniform_sampler", &name, &BPyGPUTexture_Type, &py_texture)) { + return NULL; + } + + int slot = GPU_shader_get_texture_binding(self->shader, name); + GPU_texture_bind(py_texture->tex, slot); + GPU_shader_uniform_1i(self->shader, name, slot); + + Py_RETURN_NONE; +} + PyDoc_STRVAR( - py_shader_attr_from_name_doc, + pygpu_shader_uniform_block_doc, + ".. method:: uniform_block(name, ubo)\n" + "\n" + " Specify the value of an uniform buffer object variable for the current GPUShader.\n" + "\n" + " :param name: name of the uniform variable whose UBO is to be specified.\n" + " :type name: str\n" + " :param ubo: Uniform Buffer to attach.\n" + " :type texture: :class:`gpu.types.GPUUniformBuf`\n"); +static PyObject *pygpu_shader_uniform_block(BPyGPUShader *self, PyObject *args) +{ + const char *name; + BPyGPUUniformBuf *py_ubo; + if (!PyArg_ParseTuple( + args, "sO!:GPUShader.uniform_block", &name, &BPyGPUUniformBuf_Type, &py_ubo)) { + return NULL; + } + + int slot = GPU_shader_get_uniform_block(self->shader, name); + if (slot == -1) { + PyErr_SetString( + PyExc_BufferError, + "GPUShader.uniform_buffer: uniform block not found, make sure the name is correct"); + return NULL; + } + + GPU_uniformbuf_bind(py_ubo->ubo, slot); + GPU_shader_uniform_1i(self->shader, name, slot); + + Py_RETURN_NONE; +} + +PyDoc_STRVAR( + pygpu_shader_attr_from_name_doc, ".. method:: attr_from_name(name)\n" "\n" " Get attribute location by name.\n" @@ -468,7 +536,7 @@ PyDoc_STRVAR( " :type name: str\n" " :return: The location of an attribute variable.\n" " :rtype: int\n"); -static PyObject *py_shader_attr_from_name(BPyGPUShader *self, PyObject *arg) +static PyObject *pygpu_shader_attr_from_name(BPyGPUShader *self, PyObject *arg) { const char *name = PyUnicode_AsUTF8(arg); if (name == NULL) { @@ -485,69 +553,83 @@ static PyObject *py_shader_attr_from_name(BPyGPUShader *self, PyObject *arg) return PyLong_FromLong(attr); } -PyDoc_STRVAR(py_shader_calc_format_doc, +PyDoc_STRVAR(pygpu_shader_calc_format_doc, ".. method:: calc_format()\n" "\n" " Build a new format based on the attributes of the shader.\n" "\n" " :return: vertex attribute format for the shader\n" " :rtype: GPUVertFormat\n"); -static PyObject *py_shader_calc_format(BPyGPUShader *self, PyObject *UNUSED(arg)) +static PyObject *pygpu_shader_calc_format(BPyGPUShader *self, PyObject *UNUSED(arg)) { BPyGPUVertFormat *ret = (BPyGPUVertFormat *)BPyGPUVertFormat_CreatePyObject(NULL); GPU_vertformat_from_shader(&ret->fmt, self->shader); return (PyObject *)ret; } -static struct PyMethodDef py_shader_methods[] = { - {"bind", (PyCFunction)py_shader_bind, METH_NOARGS, py_shader_bind_doc}, +static struct PyMethodDef pygpu_shader__tp_methods[] = { + {"bind", (PyCFunction)pygpu_shader_bind, METH_NOARGS, pygpu_shader_bind_doc}, {"uniform_from_name", - (PyCFunction)py_shader_uniform_from_name, + (PyCFunction)pygpu_shader_uniform_from_name, METH_O, - py_shader_uniform_from_name_doc}, + pygpu_shader_uniform_from_name_doc}, {"uniform_block_from_name", - (PyCFunction)py_shader_uniform_block_from_name, + (PyCFunction)pygpu_shader_uniform_block_from_name, METH_O, - py_shader_uniform_block_from_name_doc}, + pygpu_shader_uniform_block_from_name_doc}, {"uniform_vector_float", - (PyCFunction)py_shader_uniform_vector_float, + (PyCFunction)pygpu_shader_uniform_vector_float, METH_VARARGS, - py_shader_uniform_vector_float_doc}, + pygpu_shader_uniform_vector_float_doc}, {"uniform_vector_int", - (PyCFunction)py_shader_uniform_vector_int, + (PyCFunction)pygpu_shader_uniform_vector_int, METH_VARARGS, - py_shader_uniform_vector_int_doc}, + pygpu_shader_uniform_vector_int_doc}, {"uniform_bool", - (PyCFunction)py_shader_uniform_bool, + (PyCFunction)pygpu_shader_uniform_bool, METH_VARARGS, - py_shader_uniform_bool_doc}, + pygpu_shader_uniform_bool_doc}, {"uniform_float", - (PyCFunction)py_shader_uniform_float, + (PyCFunction)pygpu_shader_uniform_float, METH_VARARGS, - py_shader_uniform_float_doc}, - {"uniform_int", (PyCFunction)py_shader_uniform_int, METH_VARARGS, py_shader_uniform_int_doc}, + pygpu_shader_uniform_float_doc}, + {"uniform_int", + (PyCFunction)pygpu_shader_uniform_int, + METH_VARARGS, + pygpu_shader_uniform_int_doc}, + {"uniform_sampler", + (PyCFunction)pygpu_shader_uniform_sampler, + METH_VARARGS, + pygpu_shader_uniform_sampler_doc}, + {"uniform_block", + (PyCFunction)pygpu_shader_uniform_block, + METH_VARARGS, + pygpu_shader_uniform_block_doc}, {"attr_from_name", - (PyCFunction)py_shader_attr_from_name, + (PyCFunction)pygpu_shader_attr_from_name, METH_O, - py_shader_attr_from_name_doc}, - {"format_calc", (PyCFunction)py_shader_calc_format, METH_NOARGS, py_shader_calc_format_doc}, + pygpu_shader_attr_from_name_doc}, + {"format_calc", + (PyCFunction)pygpu_shader_calc_format, + METH_NOARGS, + pygpu_shader_calc_format_doc}, {NULL, NULL, 0, NULL}, }; PyDoc_STRVAR( - py_shader_program_doc, + pygpu_shader_program_doc, "The name of the program object for use by the OpenGL API (read-only).\n\n:type: int"); -static PyObject *py_shader_program_get(BPyGPUShader *self, void *UNUSED(closure)) +static PyObject *pygpu_shader_program_get(BPyGPUShader *self, void *UNUSED(closure)) { return PyLong_FromLong(GPU_shader_get_program(self->shader)); } -static PyGetSetDef py_shader_getseters[] = { - {"program", (getter)py_shader_program_get, (setter)NULL, py_shader_program_doc, NULL}, +static PyGetSetDef pygpu_shader__tp_getseters[] = { + {"program", (getter)pygpu_shader_program_get, (setter)NULL, pygpu_shader_program_doc, NULL}, {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; -static void py_shader_dealloc(BPyGPUShader *self) +static void pygpu_shader__tp_dealloc(BPyGPUShader *self) { if (self->is_builtin == false) { GPU_shader_free(self->shader); @@ -556,7 +638,7 @@ static void py_shader_dealloc(BPyGPUShader *self) } PyDoc_STRVAR( - py_shader_doc, + pygpu_shader__tp_doc, ".. class:: GPUShader(vertexcode, fragcode, geocode=None, libcode=None, defines=None)\n" "\n" " GPUShader combines multiple GLSL shaders into a program used for drawing.\n" @@ -587,12 +669,12 @@ PyDoc_STRVAR( PyTypeObject BPyGPUShader_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUShader", .tp_basicsize = sizeof(BPyGPUShader), - .tp_dealloc = (destructor)py_shader_dealloc, + .tp_dealloc = (destructor)pygpu_shader__tp_dealloc, .tp_flags = Py_TPFLAGS_DEFAULT, - .tp_doc = py_shader_doc, - .tp_methods = py_shader_methods, - .tp_getset = py_shader_getseters, - .tp_new = py_shader_new, + .tp_doc = pygpu_shader__tp_doc, + .tp_methods = pygpu_shader__tp_methods, + .tp_getset = pygpu_shader__tp_getseters, + .tp_new = pygpu_shader__tp_new, }; /** \} */ @@ -601,18 +683,18 @@ PyTypeObject BPyGPUShader_Type = { /** \name gpu.shader Module API * \{ */ -PyDoc_STRVAR(py_shader_unbind_doc, +PyDoc_STRVAR(pygpu_shader_unbind_doc, ".. function:: unbind()\n" "\n" " Unbind the bound shader object.\n"); -static PyObject *py_shader_unbind(BPyGPUShader *UNUSED(self)) +static PyObject *pygpu_shader_unbind(BPyGPUShader *UNUSED(self)) { GPU_shader_unbind(); Py_RETURN_NONE; } -PyDoc_STRVAR(py_shader_from_builtin_doc, - ".. function:: from_builtin(shader_name)\n" +PyDoc_STRVAR(pygpu_shader_from_builtin_doc, + ".. function:: from_builtin(pygpu_shader_name)\n" "\n" " Shaders that are embedded in the blender internal code.\n" " They all read the uniform ``mat4 ModelViewProjectionMatrix``,\n" @@ -620,7 +702,7 @@ PyDoc_STRVAR(py_shader_from_builtin_doc, " For more details, you can check the shader code with the\n" " :func:`gpu.shader.code_from_builtin` function.\n" "\n" - " :param shader_name: One of these builtin shader names:\n\n" + " :param pygpu_shader_name: One of these builtin shader names:\n\n" " - ``2D_UNIFORM_COLOR``\n" " - ``2D_FLAT_COLOR``\n" " - ``2D_SMOOTH_COLOR``\n" @@ -628,14 +710,14 @@ PyDoc_STRVAR(py_shader_from_builtin_doc, " - ``3D_UNIFORM_COLOR``\n" " - ``3D_FLAT_COLOR``\n" " - ``3D_SMOOTH_COLOR``\n" - " :type shader_name: str\n" + " :type pygpu_shader_name: str\n" " :return: Shader object corresponding to the given name.\n" " :rtype: :class:`bpy.types.GPUShader`\n"); -static PyObject *py_shader_from_builtin(PyObject *UNUSED(self), PyObject *arg) +static PyObject *pygpu_shader_from_builtin(PyObject *UNUSED(self), PyObject *arg) { BPYGPU_IS_INIT_OR_ERROR_OBJ; - struct PyC_StringEnum pygpu_bultinshader = {pygpu_bultinshader_items}; + struct PyC_StringEnum pygpu_bultinshader = {pygpu_shader_builtin_items}; if (!PyC_ParseStringEnum(arg, &pygpu_bultinshader)) { return NULL; } @@ -645,12 +727,12 @@ static PyObject *py_shader_from_builtin(PyObject *UNUSED(self), PyObject *arg) return BPyGPUShader_CreatePyObject(shader, true); } -PyDoc_STRVAR(py_shader_code_from_builtin_doc, - ".. function:: code_from_builtin(shader_name)\n" +PyDoc_STRVAR(pygpu_shader_code_from_builtin_doc, + ".. function:: code_from_builtin(pygpu_shader_name)\n" "\n" " Exposes the internal shader code for query.\n" "\n" - " :param shader_name: One of these builtin shader names:\n\n" + " :param pygpu_shader_name: One of these builtin shader names:\n\n" " - ``2D_UNIFORM_COLOR``\n" " - ``2D_FLAT_COLOR``\n" " - ``2D_SMOOTH_COLOR``\n" @@ -658,10 +740,10 @@ PyDoc_STRVAR(py_shader_code_from_builtin_doc, " - ``3D_UNIFORM_COLOR``\n" " - ``3D_FLAT_COLOR``\n" " - ``3D_SMOOTH_COLOR``\n" - " :type shader_name: str\n" + " :type pygpu_shader_name: str\n" " :return: Vertex, fragment and geometry shader codes.\n" " :rtype: dict\n"); -static PyObject *py_shader_code_from_builtin(BPyGPUShader *UNUSED(self), PyObject *arg) +static PyObject *pygpu_shader_code_from_builtin(BPyGPUShader *UNUSED(self), PyObject *arg) { const char *vert; const char *frag; @@ -670,7 +752,7 @@ static PyObject *py_shader_code_from_builtin(BPyGPUShader *UNUSED(self), PyObjec PyObject *item, *r_dict; - struct PyC_StringEnum pygpu_bultinshader = {pygpu_bultinshader_items}; + struct PyC_StringEnum pygpu_bultinshader = {pygpu_shader_builtin_items}; if (!PyC_ParseStringEnum(arg, &pygpu_bultinshader)) { return NULL; } @@ -697,17 +779,20 @@ static PyObject *py_shader_code_from_builtin(BPyGPUShader *UNUSED(self), PyObjec return r_dict; } -static struct PyMethodDef py_shader_module_methods[] = { - {"unbind", (PyCFunction)py_shader_unbind, METH_NOARGS, py_shader_unbind_doc}, - {"from_builtin", (PyCFunction)py_shader_from_builtin, METH_O, py_shader_from_builtin_doc}, - {"code_from_builtin", - (PyCFunction)py_shader_code_from_builtin, +static struct PyMethodDef pygpu_shader_module__tp_methods[] = { + {"unbind", (PyCFunction)pygpu_shader_unbind, METH_NOARGS, pygpu_shader_unbind_doc}, + {"from_builtin", + (PyCFunction)pygpu_shader_from_builtin, METH_O, - py_shader_code_from_builtin_doc}, + pygpu_shader_from_builtin_doc}, + {"code_from_builtin", + (PyCFunction)pygpu_shader_code_from_builtin, + METH_O, + pygpu_shader_code_from_builtin_doc}, {NULL, NULL, 0, NULL}, }; -PyDoc_STRVAR(py_shader_module_doc, +PyDoc_STRVAR(pygpu_shader_module__tp_doc, "This module provides access to GPUShader internal functions.\n" "\n" ".. rubric:: Built-in shaders\n" @@ -736,11 +821,11 @@ PyDoc_STRVAR(py_shader_module_doc, "3D_SMOOTH_COLOR\n" " :Attributes: vec3 pos, vec4 color\n" " :Uniforms: none\n"); -static PyModuleDef BPyGPU_shader_module_def = { +static PyModuleDef pygpu_shader_module_def = { PyModuleDef_HEAD_INIT, .m_name = "gpu.shader", - .m_doc = py_shader_module_doc, - .m_methods = py_shader_module_methods, + .m_doc = pygpu_shader_module__tp_doc, + .m_methods = pygpu_shader_module__tp_methods, }; /** \} */ @@ -760,11 +845,11 @@ PyObject *BPyGPUShader_CreatePyObject(GPUShader *shader, bool is_builtin) return (PyObject *)self; } -PyObject *BPyInit_gpu_shader(void) +PyObject *bpygpu_shader_init(void) { PyObject *submodule; - submodule = PyModule_Create(&BPyGPU_shader_module_def); + submodule = PyModule_Create(&pygpu_shader_module_def); return submodule; } diff --git a/source/blender/python/gpu/gpu_py_shader.h b/source/blender/python/gpu/gpu_py_shader.h index ee26c26acd4..745b9351649 100644 --- a/source/blender/python/gpu/gpu_py_shader.h +++ b/source/blender/python/gpu/gpu_py_shader.h @@ -30,4 +30,4 @@ typedef struct BPyGPUShader { } BPyGPUShader; PyObject *BPyGPUShader_CreatePyObject(struct GPUShader *shader, bool is_builtin); -PyObject *BPyInit_gpu_shader(void); +PyObject *bpygpu_shader_init(void); diff --git a/source/blender/python/gpu/gpu_py_state.c b/source/blender/python/gpu/gpu_py_state.c new file mode 100644 index 00000000000..d1b3a01e2e4 --- /dev/null +++ b/source/blender/python/gpu/gpu_py_state.c @@ -0,0 +1,423 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + * + * This file defines the gpu.state API. + * + * - Use ``bpygpu_`` for local API. + * - Use ``BPyGPU`` for public API. + */ + +#include + +#include "GPU_state.h" + +#include "../generic/py_capi_utils.h" +#include "../generic/python_utildefines.h" + +#include "gpu_py_state.h" /* own include */ + +/* -------------------------------------------------------------------- */ +/** \name Helper Functions + * \{ */ + +static const struct PyC_StringEnumItems pygpu_state_blend_items[] = { + {GPU_BLEND_NONE, "NONE"}, + {GPU_BLEND_ALPHA, "ALPHA"}, + {GPU_BLEND_ALPHA_PREMULT, "ALPHA_PREMULT"}, + {GPU_BLEND_ADDITIVE, "ADDITIVE"}, + {GPU_BLEND_ADDITIVE_PREMULT, "ADDITIVE_PREMULT"}, + {GPU_BLEND_MULTIPLY, "MULTIPLY"}, + {GPU_BLEND_SUBTRACT, "SUBTRACT"}, + {GPU_BLEND_INVERT, "INVERT"}, + /** + * These are quite special cases used inside the draw manager. + * {GPU_BLEND_OIT, "OIT"}, + * {GPU_BLEND_BACKGROUND, "BACKGROUND"}, + * {GPU_BLEND_CUSTOM, "CUSTOM"}, + */ + {0, NULL}, +}; + +static const struct PyC_StringEnumItems pygpu_state_depthtest_items[] = { + {GPU_DEPTH_NONE, "NONE"}, + {GPU_DEPTH_ALWAYS, "ALWAYS"}, + {GPU_DEPTH_LESS, "LESS"}, + {GPU_DEPTH_LESS_EQUAL, "LESS_EQUAL"}, + {GPU_DEPTH_EQUAL, "EQUAL"}, + {GPU_DEPTH_GREATER, "GREATER"}, + {GPU_DEPTH_GREATER_EQUAL, "GREATER_EQUAL"}, + {0, NULL}, +}; + +static const struct PyC_StringEnumItems pygpu_state_faceculling_items[] = { + {GPU_CULL_NONE, "NONE"}, + {GPU_CULL_FRONT, "FRONT"}, + {GPU_CULL_BACK, "BACK"}, + {0, NULL}, +}; + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Manage Stack + * \{ */ + +PyDoc_STRVAR(pygpu_state_blend_set_doc, + ".. function:: blend_set(mode)\n" + "\n" + " Defines the fixed pipeline blending equation.\n" + "\n" + " :param mode: One of these modes: {\n" + " `NONE`,\n" + " `ALPHA`,\n" + " `ALPHA_PREMULT`,\n" + " `ADDITIVE`,\n" + " `ADDITIVE_PREMULT`,\n" + " `MULTIPLY`,\n" + " `SUBTRACT`,\n" + " `INVERT`,\n" + //" `OIT`,\n" + //" `BACKGROUND`,\n" + //" `CUSTOM`,\n" + " :type mode: `str`\n"); +static PyObject *pygpu_state_blend_set(PyObject *UNUSED(self), PyObject *value) +{ + struct PyC_StringEnum pygpu_blend = {pygpu_state_blend_items}; + if (!PyC_ParseStringEnum(value, &pygpu_blend)) { + return NULL; + } + GPU_blend(pygpu_blend.value_found); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_state_blend_get_doc, + ".. function:: blend_get()\n" + "\n" + " Current blending equation.\n" + "\n"); +static PyObject *pygpu_state_blend_get(PyObject *UNUSED(self)) +{ + eGPUBlend blend = GPU_blend_get(); + return PyUnicode_FromString(PyC_StringEnum_FindIDFromValue(pygpu_state_blend_items, blend)); +} + +PyDoc_STRVAR(pygpu_state_depth_test_set_doc, + ".. function:: depth_test_set(mode)\n" + "\n" + " Defines the depth_test equation.\n" + "\n" + " :param mode: One of these modes: {\n" + " `NONE`,\n" + " `ALWAYS`,\n" + " `LESS`,\n" + " `LESS_EQUAL`,\n" + " `EQUAL`,\n" + " `GREATER`,\n" + " `GREATER_EQUAL`,\n" + " :type mode: `str`\n"); +static PyObject *pygpu_state_depth_test_set(PyObject *UNUSED(self), PyObject *value) +{ + struct PyC_StringEnum pygpu_depth_test = {pygpu_state_depthtest_items}; + if (!PyC_ParseStringEnum(value, &pygpu_depth_test)) { + return NULL; + } + GPU_depth_test(pygpu_depth_test.value_found); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_state_depth_test_get_doc, + ".. function:: blend_depth_test_get()\n" + "\n" + " Current depth_test equation.\n" + "\n"); +static PyObject *pygpu_state_depth_test_get(PyObject *UNUSED(self)) +{ + eGPUDepthTest test = GPU_depth_test_get(); + return PyUnicode_FromString(PyC_StringEnum_FindIDFromValue(pygpu_state_depthtest_items, test)); +} + +PyDoc_STRVAR(pygpu_state_depth_mask_set_doc, + ".. function:: depth_mask_set(value)\n" + "\n" + " Write to depth component.\n" + "\n" + " :param value: True for writing to the depth component.\n" + " :type near: `bool`\n"); +static PyObject *pygpu_state_depth_mask_set(PyObject *UNUSED(self), PyObject *value) +{ + bool write_to_depth; + if (!PyC_ParseBool(value, &write_to_depth)) { + return NULL; + } + GPU_depth_mask(write_to_depth); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_state_depth_mask_get_doc, + ".. function:: depth_mask_set_get()\n" + "\n" + " Writing status in the depth component.\n"); +static PyObject *pygpu_state_depth_mask_get(PyObject *UNUSED(self)) +{ + return PyBool_FromLong(GPU_depth_mask_get()); +} + +PyDoc_STRVAR(pygpu_state_viewport_set_doc, + ".. function:: viewport_set(x, y, xsize, ysize)\n" + "\n" + " Specifies the viewport of the active framebuffer.\n" + " Note: The viewport state is not saved upon framebuffer rebind.\n" + "\n" + " :param x, y: lower left corner of the viewport_set rectangle, in pixels.\n" + " :param width, height: width and height of the viewport_set.\n" + " :type x, y, xsize, ysize: `int`\n"); +static PyObject *pygpu_state_viewport_set(PyObject *UNUSED(self), PyObject *args) +{ + int x, y, xsize, ysize; + if (!PyArg_ParseTuple(args, "iiii:viewport_set", &x, &y, &xsize, &ysize)) { + return NULL; + } + + GPU_viewport(x, y, xsize, ysize); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_state_viewport_get_doc, + ".. function:: viewport_get()\n" + "\n" + " Viewport of the active framebuffer.\n"); +static PyObject *pygpu_state_viewport_get(PyObject *UNUSED(self), PyObject *UNUSED(args)) +{ + int viewport[4]; + GPU_viewport_size_get_i(viewport); + + PyObject *ret = PyTuple_New(4); + PyTuple_SET_ITEMS(ret, + PyLong_FromLong(viewport[0]), + PyLong_FromLong(viewport[1]), + PyLong_FromLong(viewport[2]), + PyLong_FromLong(viewport[3])); + return ret; +} + +PyDoc_STRVAR(pygpu_state_line_width_set_doc, + ".. function:: line_width_set(width)\n" + "\n" + " Specify the width of rasterized lines.\n" + "\n" + " :param size: New width.\n" + " :type mode: `float`\n"); +static PyObject *pygpu_state_line_width_set(PyObject *UNUSED(self), PyObject *value) +{ + float width = (float)PyFloat_AsDouble(value); + if (PyErr_Occurred()) { + return NULL; + } + + GPU_line_width(width); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_state_line_width_get_doc, + ".. function:: line_width_get()\n" + "\n" + " Current width of rasterized lines.\n"); +static PyObject *pygpu_state_line_width_get(PyObject *UNUSED(self)) +{ + float width = GPU_line_width_get(); + return PyFloat_FromDouble((double)width); +} + +PyDoc_STRVAR(pygpu_state_point_size_set_doc, + ".. function:: point_size_set(size)\n" + "\n" + " Specify the diameter of rasterized points.\n" + "\n" + " :param size: New diameter.\n" + " :type mode: `float`\n"); +static PyObject *pygpu_state_point_size_set(PyObject *UNUSED(self), PyObject *value) +{ + float size = (float)PyFloat_AsDouble(value); + if (PyErr_Occurred()) { + return NULL; + } + + GPU_point_size(size); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_state_color_mask_set_doc, + ".. function:: color_mask_set(r, g, b, a)\n" + "\n" + " Enable or disable writing of frame buffer color components.\n" + "\n" + " :param r, g, b, a: components red, green, blue, and alpha.\n" + " :type r, g, b, a: `bool`\n"); +static PyObject *pygpu_state_color_mask_set(PyObject *UNUSED(self), PyObject *args) +{ + int r, g, b, a; + if (!PyArg_ParseTuple(args, "pppp:color_mask_set", &r, &g, &b, &a)) { + return NULL; + } + + GPU_color_mask((bool)r, (bool)g, (bool)b, (bool)a); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_state_face_culling_set_doc, + ".. function:: face_culling_set(culling)\n" + "\n" + " Specify whether none, front-facing or back-facing facets can be culled.\n" + "\n" + " :param mode: One of these modes: {\n" + " `NONE`,\n" + " `FRONT`,\n" + " `BACK`,\n" + " :type mode: `str`\n"); +static PyObject *pygpu_state_face_culling_set(PyObject *UNUSED(self), PyObject *value) +{ + struct PyC_StringEnum pygpu_faceculling = {pygpu_state_faceculling_items}; + if (!PyC_ParseStringEnum(value, &pygpu_faceculling)) { + return NULL; + } + + GPU_face_culling(pygpu_faceculling.value_found); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_state_front_facing_set_doc, + ".. function:: front_facing_set(invert)\n" + "\n" + " Specifies the orientation of front-facing polygons.\n" + "\n" + " :param invert: True for clockwise polygons as front-facing.\n" + " :type mode: `bool`\n"); +static PyObject *pygpu_state_front_facing_set(PyObject *UNUSED(self), PyObject *value) +{ + bool invert; + if (!PyC_ParseBool(value, &invert)) { + return NULL; + } + + GPU_front_facing(invert); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_state_program_point_size_set_doc, + ".. function:: use_program_point_size(enable)\n" + "\n" + " If enabled, the derived point size is taken from the (potentially clipped) " + "shader builtin gl_PointSize.\n" + "\n" + " :param enable: True for shader builtin gl_PointSize.\n" + " :type enable: `bool`\n"); +static PyObject *pygpu_state_program_point_size_set(PyObject *UNUSED(self), PyObject *value) +{ + bool enable; + if (!PyC_ParseBool(value, &enable)) { + return NULL; + } + + GPU_program_point_size(enable); + Py_RETURN_NONE; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Module + * \{ */ + +static struct PyMethodDef pygpu_state__tp_methods[] = { + /* Manage Stack */ + {"blend_set", (PyCFunction)pygpu_state_blend_set, METH_O, pygpu_state_blend_set_doc}, + {"blend_get", (PyCFunction)pygpu_state_blend_get, METH_NOARGS, pygpu_state_blend_get_doc}, + {"depth_test_set", + (PyCFunction)pygpu_state_depth_test_set, + METH_O, + pygpu_state_depth_test_set_doc}, + {"depth_test_get", + (PyCFunction)pygpu_state_depth_test_get, + METH_NOARGS, + pygpu_state_depth_test_get_doc}, + {"depth_mask_set", + (PyCFunction)pygpu_state_depth_mask_set, + METH_O, + pygpu_state_depth_mask_set_doc}, + {"depth_mask_get", + (PyCFunction)pygpu_state_depth_mask_get, + METH_NOARGS, + pygpu_state_depth_mask_get_doc}, + {"viewport_set", + (PyCFunction)pygpu_state_viewport_set, + METH_VARARGS, + pygpu_state_viewport_set_doc}, + {"viewport_get", + (PyCFunction)pygpu_state_viewport_get, + METH_NOARGS, + pygpu_state_viewport_get_doc}, + {"line_width_set", + (PyCFunction)pygpu_state_line_width_set, + METH_O, + pygpu_state_line_width_set_doc}, + {"line_width_get", + (PyCFunction)pygpu_state_line_width_get, + METH_NOARGS, + pygpu_state_line_width_get_doc}, + {"point_size_set", + (PyCFunction)pygpu_state_point_size_set, + METH_O, + pygpu_state_point_size_set_doc}, + {"color_mask_set", + (PyCFunction)pygpu_state_color_mask_set, + METH_VARARGS, + pygpu_state_color_mask_set_doc}, + {"face_culling_set", + (PyCFunction)pygpu_state_face_culling_set, + METH_O, + pygpu_state_face_culling_set_doc}, + {"front_facing_set", + (PyCFunction)pygpu_state_front_facing_set, + METH_O, + pygpu_state_front_facing_set_doc}, + {"program_point_size_set", + (PyCFunction)pygpu_state_program_point_size_set, + METH_O, + pygpu_state_program_point_size_set_doc}, + {NULL, NULL, 0, NULL}, +}; + +PyDoc_STRVAR(pygpu_state__tp_doc, "This module provides access to the gpu state."); +static PyModuleDef pygpu_state_module_def = { + PyModuleDef_HEAD_INIT, + .m_name = "gpu.state", + .m_doc = pygpu_state__tp_doc, + .m_methods = pygpu_state__tp_methods, +}; + +PyObject *bpygpu_state_init(void) +{ + PyObject *submodule; + + submodule = PyModule_Create(&pygpu_state_module_def); + + return submodule; +} + +/** \} */ diff --git a/source/blender/python/gpu/gpu_py_state.h b/source/blender/python/gpu/gpu_py_state.h new file mode 100644 index 00000000000..415c5ede822 --- /dev/null +++ b/source/blender/python/gpu/gpu_py_state.h @@ -0,0 +1,23 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + */ + +#pragma once + +PyObject *bpygpu_state_init(void); diff --git a/source/blender/python/gpu/gpu_py_texture.c b/source/blender/python/gpu/gpu_py_texture.c new file mode 100644 index 00000000000..12855b8dbcc --- /dev/null +++ b/source/blender/python/gpu/gpu_py_texture.c @@ -0,0 +1,555 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + * + * This file defines the texture functionalities of the 'gpu' module + * + * - Use ``bpygpu_`` for local API. + * - Use ``BPyGPU`` for public API. + */ + +#include + +#include "BLI_string.h" + +#include "GPU_context.h" +#include "GPU_texture.h" + +#include "../generic/py_capi_utils.h" + +#include "gpu_py.h" +#include "gpu_py_buffer.h" + +#include "gpu_py_texture.h" /* own include */ + +/* -------------------------------------------------------------------- */ +/** \name GPUTexture Common Utilities + * \{ */ + +static const struct PyC_StringEnumItems pygpu_textureformat_items[] = { + {GPU_RGBA8UI, "RGBA8UI"}, + {GPU_RGBA8I, "RGBA8I"}, + {GPU_RGBA8, "RGBA8"}, + {GPU_RGBA32UI, "RGBA32UI"}, + {GPU_RGBA32I, "RGBA32I"}, + {GPU_RGBA32F, "RGBA32F"}, + {GPU_RGBA16UI, "RGBA16UI"}, + {GPU_RGBA16I, "RGBA16I"}, + {GPU_RGBA16F, "RGBA16F"}, + {GPU_RGBA16, "RGBA16"}, + {GPU_RG8UI, "RG8UI"}, + {GPU_RG8I, "RG8I"}, + {GPU_RG8, "RG8"}, + {GPU_RG32UI, "RG32UI"}, + {GPU_RG32I, "RG32I"}, + {GPU_RG32F, "RG32F"}, + {GPU_RG16UI, "RG16UI"}, + {GPU_RG16I, "RG16I"}, + {GPU_RG16F, "RG16F"}, + {GPU_RG16, "RG16"}, + {GPU_R8UI, "R8UI"}, + {GPU_R8I, "R8I"}, + {GPU_R8, "R8"}, + {GPU_R32UI, "R32UI"}, + {GPU_R32I, "R32I"}, + {GPU_R32F, "R32F"}, + {GPU_R16UI, "R16UI"}, + {GPU_R16I, "R16I"}, + {GPU_R16F, "R16F"}, + {GPU_R16, "R16"}, + {GPU_R11F_G11F_B10F, "R11F_G11F_B10F"}, + {GPU_DEPTH32F_STENCIL8, "DEPTH32F_STENCIL8"}, + {GPU_DEPTH24_STENCIL8, "DEPTH24_STENCIL8"}, + {GPU_SRGB8_A8, "SRGB8_A8"}, + {GPU_RGB16F, "RGB16F"}, + {GPU_SRGB8_A8_DXT1, "SRGB8_A8_DXT1"}, + {GPU_SRGB8_A8_DXT3, "SRGB8_A8_DXT3"}, + {GPU_SRGB8_A8_DXT5, "SRGB8_A8_DXT5"}, + {GPU_RGBA8_DXT1, "RGBA8_DXT1"}, + {GPU_RGBA8_DXT3, "RGBA8_DXT3"}, + {GPU_RGBA8_DXT5, "RGBA8_DXT5"}, + {GPU_DEPTH_COMPONENT32F, "DEPTH_COMPONENT32F"}, + {GPU_DEPTH_COMPONENT24, "DEPTH_COMPONENT24"}, + {GPU_DEPTH_COMPONENT16, "DEPTH_COMPONENT16"}, + {0, NULL}, +}; + +static int pygpu_texture_valid_check(BPyGPUTexture *bpygpu_tex) +{ + if (UNLIKELY(bpygpu_tex->tex == NULL)) { + PyErr_SetString(PyExc_ReferenceError, +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD + "GPU texture was freed, no further access is valid" +#else + "GPU texture: internal error" +#endif + ); + + return -1; + } + return 0; +} + +#define BPYGPU_TEXTURE_CHECK_OBJ(bpygpu) \ + { \ + if (UNLIKELY(pygpu_texture_valid_check(bpygpu) == -1)) { \ + return NULL; \ + } \ + } \ + ((void)0) + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name GPUTexture Type + * \{ */ + +static PyObject *pygpu_texture__tp_new(PyTypeObject *UNUSED(self), PyObject *args, PyObject *kwds) +{ + BPYGPU_IS_INIT_OR_ERROR_OBJ; + + PyObject *py_size; + int size[3] = {1, 1, 1}; + int layers = 0; + int is_cubemap = false; + struct PyC_StringEnum pygpu_textureformat = {pygpu_textureformat_items, GPU_RGBA8}; + BPyGPUBuffer *pybuffer_obj = NULL; + char err_out[256] = "unknown error. See console"; + + static const char *_keywords[] = {"size", "layers", "is_cubemap", "format", "data", NULL}; + static _PyArg_Parser _parser = {"O|$ipO&O!:GPUTexture.__new__", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast(args, + kwds, + &_parser, + &py_size, + &layers, + &is_cubemap, + PyC_ParseStringEnum, + &pygpu_textureformat, + &BPyGPU_BufferType, + &pybuffer_obj)) { + return NULL; + } + + int len = 1; + if (PySequence_Check(py_size)) { + len = PySequence_Size(py_size); + if (PyC_AsArray(size, py_size, len, &PyLong_Type, false, "GPUTexture.__new__") == -1) { + return NULL; + } + } + else if (PyLong_Check(py_size)) { + size[0] = PyLong_AsLong(py_size); + } + else { + PyErr_SetString(PyExc_ValueError, "GPUTexture.__new__: Expected an int or tuple as first arg"); + return NULL; + } + + void *data = NULL; + if (pybuffer_obj) { + if (pybuffer_obj->format != GPU_DATA_FLOAT) { + PyErr_SetString(PyExc_ValueError, + "GPUTexture.__new__: Only Buffer of format `FLOAT` is currently supported"); + return NULL; + } + + int component_len = GPU_texture_component_len(pygpu_textureformat.value_found); + int component_size_expected = sizeof(float); + size_t data_space_expected = (size_t)size[0] * size[1] * size[2] * max_ii(1, layers) * + component_len * component_size_expected; + if (is_cubemap) { + data_space_expected *= 6 * size[0]; + } + + if (bpygpu_Buffer_size(pybuffer_obj) < data_space_expected) { + PyErr_SetString(PyExc_ValueError, "GPUTexture.__new__: Buffer size smaller than requested"); + return NULL; + } + data = pybuffer_obj->buf.as_void; + } + + GPUTexture *tex = NULL; + if (is_cubemap && len != 1) { + STRNCPY(err_out, + "In cubemaps the same dimension represents height, width and depth. No tuple needed"); + } + else if (size[0] < 1 || size[1] < 1 || size[2] < 1) { + STRNCPY(err_out, "Values less than 1 are not allowed in dimensions"); + } + else if (layers && len == 3) { + STRNCPY(err_out, "3D textures have no layers"); + } + else if (!GPU_context_active_get()) { + STRNCPY(err_out, "No active GPU context found"); + } + else { + const char *name = "python_texture"; + if (is_cubemap) { + if (layers) { + tex = GPU_texture_create_cube_array( + name, size[0], layers, 1, pygpu_textureformat.value_found, data); + } + else { + tex = GPU_texture_create_cube(name, size[0], 1, pygpu_textureformat.value_found, data); + } + } + else if (layers) { + if (len == 2) { + tex = GPU_texture_create_2d_array( + name, size[0], size[1], layers, 1, pygpu_textureformat.value_found, data); + } + else { + tex = GPU_texture_create_1d_array( + name, size[0], layers, 1, pygpu_textureformat.value_found, data); + } + } + else if (len == 3) { + tex = GPU_texture_create_3d(name, + size[0], + size[1], + size[2], + 1, + pygpu_textureformat.value_found, + GPU_DATA_FLOAT, + NULL); + } + else if (len == 2) { + tex = GPU_texture_create_2d( + name, size[0], size[1], 1, pygpu_textureformat.value_found, data); + } + else { + tex = GPU_texture_create_1d(name, size[0], 1, pygpu_textureformat.value_found, data); + } + } + + if (tex == NULL) { + PyErr_Format(PyExc_RuntimeError, "gpu.texture.new(...) failed with '%s'", err_out); + return NULL; + } + + return BPyGPUTexture_CreatePyObject(tex); +} + +PyDoc_STRVAR(pygpu_texture_width_doc, "Width of the texture.\n\n:type: `int`"); +static PyObject *pygpu_texture_width_get(BPyGPUTexture *self, void *UNUSED(type)) +{ + BPYGPU_TEXTURE_CHECK_OBJ(self); + return PyLong_FromLong(GPU_texture_width(self->tex)); +} + +PyDoc_STRVAR(pygpu_texture_height_doc, "Height of the texture.\n\n:type: `int`"); +static PyObject *pygpu_texture_height_get(BPyGPUTexture *self, void *UNUSED(type)) +{ + BPYGPU_TEXTURE_CHECK_OBJ(self); + return PyLong_FromLong(GPU_texture_height(self->tex)); +} + +PyDoc_STRVAR(pygpu_texture_format_doc, "Format of the texture.\n\n:type: `str`"); +static PyObject *pygpu_texture_format_get(BPyGPUTexture *self, void *UNUSED(type)) +{ + BPYGPU_TEXTURE_CHECK_OBJ(self); + eGPUTextureFormat format = GPU_texture_format(self->tex); + return PyUnicode_FromString(PyC_StringEnum_FindIDFromValue(pygpu_textureformat_items, format)); +} + +PyDoc_STRVAR(pygpu_texture_clear_doc, + ".. method:: clear(format='FLOAT', value=(0.0, 0.0, 0.0, 1.0))\n" + "\n" + " Fill texture with specific value.\n" + "\n" + " :param format: One of these primitive types: {\n" + " `FLOAT`,\n" + " `INT`,\n" + " `UINT`,\n" + " `UBYTE`,\n" + " `UINT_24_8`,\n" + " `10_11_11_REV`,\n" + " :type type: `str`\n" + " :arg value: sequence each representing the value to fill.\n" + " :type value: sequence of 1, 2, 3 or 4 values\n"); +static PyObject *pygpu_texture_clear(BPyGPUTexture *self, PyObject *args, PyObject *kwds) +{ + BPYGPU_TEXTURE_CHECK_OBJ(self); + struct PyC_StringEnum pygpu_dataformat = {bpygpu_dataformat_items}; + union { + int i[4]; + float f[4]; + char c[4]; + } values; + + PyObject *py_values; + + static const char *_keywords[] = {"format", "value", NULL}; + static _PyArg_Parser _parser = {"$O&O:clear", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast( + args, kwds, &_parser, PyC_ParseStringEnum, &pygpu_dataformat, &py_values)) { + return NULL; + } + + int shape = PySequence_Size(py_values); + if (shape == -1) { + return NULL; + } + + if (shape > 4) { + PyErr_SetString(PyExc_AttributeError, "too many dimensions, max is 4"); + return NULL; + } + + if (shape != 1 && + ELEM(pygpu_dataformat.value_found, GPU_DATA_UINT_24_8, GPU_DATA_10_11_11_REV)) { + PyErr_SetString(PyExc_AttributeError, + "`UINT_24_8` and `10_11_11_REV` only support single values"); + return NULL; + } + + memset(&values, 0, sizeof(values)); + if (PyC_AsArray(&values, + py_values, + shape, + pygpu_dataformat.value_found == GPU_DATA_FLOAT ? &PyFloat_Type : &PyLong_Type, + false, + "clear") == -1) { + return NULL; + } + + if (pygpu_dataformat.value_found == GPU_DATA_UBYTE) { + /* Convert to byte. */ + values.c[0] = values.i[0]; + values.c[1] = values.i[1]; + values.c[2] = values.i[2]; + values.c[3] = values.i[3]; + } + + GPU_texture_clear(self->tex, pygpu_dataformat.value_found, &values); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_texture_read_doc, + ".. method:: read()\n" + "\n" + " Creates a buffer with the value of all pixels.\n" + "\n"); +static PyObject *pygpu_texture_read(BPyGPUTexture *self) +{ + BPYGPU_TEXTURE_CHECK_OBJ(self); + + /* #GPU_texture_read is restricted in combining 'data_format' with 'tex_format'. + * So choose data_format here. */ + eGPUDataFormat best_data_format; + switch (GPU_texture_format(self->tex)) { + case GPU_DEPTH_COMPONENT24: + case GPU_DEPTH_COMPONENT16: + case GPU_DEPTH_COMPONENT32F: + best_data_format = GPU_DATA_FLOAT; + break; + case GPU_DEPTH24_STENCIL8: + case GPU_DEPTH32F_STENCIL8: + best_data_format = GPU_DATA_UINT_24_8; + break; + case GPU_R8UI: + case GPU_R16UI: + case GPU_RG16UI: + case GPU_R32UI: + best_data_format = GPU_DATA_UINT; + break; + case GPU_RG16I: + case GPU_R16I: + best_data_format = GPU_DATA_INT; + break; + case GPU_R8: + case GPU_RG8: + case GPU_RGBA8: + case GPU_RGBA8UI: + case GPU_SRGB8_A8: + best_data_format = GPU_DATA_UBYTE; + break; + case GPU_R11F_G11F_B10F: + best_data_format = GPU_DATA_10_11_11_REV; + break; + default: + best_data_format = GPU_DATA_FLOAT; + break; + } + + void *buf = GPU_texture_read(self->tex, best_data_format, 0); + const Py_ssize_t shape[2] = {GPU_texture_height(self->tex), GPU_texture_width(self->tex)}; + return (PyObject *)BPyGPU_Buffer_CreatePyObject(best_data_format, shape, ARRAY_SIZE(shape), buf); +} + +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD +PyDoc_STRVAR(pygpu_texture_free_doc, + ".. method:: free()\n" + "\n" + " Free the texture object.\n" + " The texture object will no longer be accessible.\n"); +static PyObject *pygpu_texture_free(BPyGPUTexture *self) +{ + BPYGPU_TEXTURE_CHECK_OBJ(self); + + GPU_texture_free(self->tex); + self->tex = NULL; + Py_RETURN_NONE; +} +#endif + +static void BPyGPUTexture__tp_dealloc(BPyGPUTexture *self) +{ + if (self->tex) { + GPU_texture_free(self->tex); + } + Py_TYPE(self)->tp_free((PyObject *)self); +} + +static PyGetSetDef pygpu_texture__tp_getseters[] = { + {"width", (getter)pygpu_texture_width_get, (setter)NULL, pygpu_texture_width_doc, NULL}, + {"height", (getter)pygpu_texture_height_get, (setter)NULL, pygpu_texture_height_doc, NULL}, + {"format", (getter)pygpu_texture_format_get, (setter)NULL, pygpu_texture_format_doc, NULL}, + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ +}; + +static struct PyMethodDef pygpu_texture__tp_methods[] = { + {"clear", + (PyCFunction)pygpu_texture_clear, + METH_VARARGS | METH_KEYWORDS, + pygpu_texture_clear_doc}, + {"read", (PyCFunction)pygpu_texture_read, METH_NOARGS, pygpu_texture_read_doc}, +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD + {"free", (PyCFunction)pygpu_texture_free, METH_NOARGS, pygpu_texture_free_doc}, +#endif + {NULL, NULL, 0, NULL}, +}; + +PyDoc_STRVAR( + pygpu_texture__tp_doc, + ".. class:: GPUTexture(size, layers=0, is_cubemap=False, format='RGBA8', data=None)\n" + "\n" + " This object gives access to off GPU textures.\n" + "\n" + " :arg size: Dimensions of the texture 1D, 2D, 3D or cubemap.\n" + " :type size: `tuple` or `int`\n" + " :arg layers: Number of layers in texture array or number of cubemaps in cubemap array\n" + " :type layers: `int`\n" + " :arg is_cubemap: Indicates the creation of a cubemap texture.\n" + " :type is_cubemap: `int`\n" + " :arg format: One of these primitive types: {\n" + " `RGBA8UI`,\n" + " `RGBA8I`,\n" + " `RGBA8`,\n" + " `RGBA32UI`,\n" + " `RGBA32I`,\n" + " `RGBA32F`,\n" + " `RGBA16UI`,\n" + " `RGBA16I`,\n" + " `RGBA16F`,\n" + " `RGBA16`,\n" + " `RG8UI`,\n" + " `RG8I`,\n" + " `RG8`,\n" + " `RG32UI`,\n" + " `RG32I`,\n" + " `RG32F`,\n" + " `RG16UI`,\n" + " `RG16I`,\n" + " `RG16F`,\n" + " `RG16`,\n" + " `R8UI`,\n" + " `R8I`,\n" + " `R8`,\n" + " `R32UI`,\n" + " `R32I`,\n" + " `R32F`,\n" + " `R16UI`,\n" + " `R16I`,\n" + " `R16F`,\n" + " `R16`,\n" + " `R11F_G11F_B10F`,\n" + " `DEPTH32F_STENCIL8`,\n" + " `DEPTH24_STENCIL8`,\n" + " `SRGB8_A8`,\n" + " `RGB16F`,\n" + " `SRGB8_A8_DXT1`,\n" + " `SRGB8_A8_DXT3`,\n" + " `SRGB8_A8_DXT5`,\n" + " `RGBA8_DXT1`,\n" + " `RGBA8_DXT3`,\n" + " `RGBA8_DXT5`,\n" + " `DEPTH_COMPONENT32F`,\n" + " `DEPTH_COMPONENT24`,\n" + " `DEPTH_COMPONENT16`,\n" + " :type format: `str`\n" + " :arg data: Buffer object to fill the texture.\n" + " :type data: `Buffer`\n"); +PyTypeObject BPyGPUTexture_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUTexture", + .tp_basicsize = sizeof(BPyGPUTexture), + .tp_dealloc = (destructor)BPyGPUTexture__tp_dealloc, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_doc = pygpu_texture__tp_doc, + .tp_methods = pygpu_texture__tp_methods, + .tp_getset = pygpu_texture__tp_getseters, + .tp_new = pygpu_texture__tp_new, +}; + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Local API + * \{ */ + +int bpygpu_ParseTexture(PyObject *o, void *p) +{ + if (o == Py_None) { + *(GPUTexture **)p = NULL; + return 1; + } + + if (!BPyGPUTexture_Check(o)) { + PyErr_Format( + PyExc_ValueError, "expected a texture or None object, got %s", Py_TYPE(o)->tp_name); + return 0; + } + + if (UNLIKELY(pygpu_texture_valid_check((BPyGPUTexture *)o) == -1)) { + return 0; + } + + *(GPUTexture **)p = ((BPyGPUTexture *)o)->tex; + return 1; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Public API + * \{ */ + +PyObject *BPyGPUTexture_CreatePyObject(GPUTexture *tex) +{ + BPyGPUTexture *self; + + self = PyObject_New(BPyGPUTexture, &BPyGPUTexture_Type); + self->tex = tex; + + return (PyObject *)self; +} + +/** \} */ + +#undef BPYGPU_TEXTURE_CHECK_OBJ diff --git a/source/blender/python/gpu/gpu_py_texture.h b/source/blender/python/gpu/gpu_py_texture.h new file mode 100644 index 00000000000..be7348b2bd4 --- /dev/null +++ b/source/blender/python/gpu/gpu_py_texture.h @@ -0,0 +1,34 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + */ + +#pragma once + +#include "BLI_compiler_attrs.h" + +extern PyTypeObject BPyGPUTexture_Type; + +#define BPyGPUTexture_Check(v) (Py_TYPE(v) == &BPyGPUTexture_Type) + +typedef struct BPyGPUTexture { + PyObject_HEAD struct GPUTexture *tex; +} BPyGPUTexture; + +int bpygpu_ParseTexture(PyObject *o, void *p); +PyObject *BPyGPUTexture_CreatePyObject(struct GPUTexture *tex) ATTR_NONNULL(1); diff --git a/source/blender/python/gpu/gpu_py_types.c b/source/blender/python/gpu/gpu_py_types.c index 165af47b4b8..fdd589d788e 100644 --- a/source/blender/python/gpu/gpu_py_types.c +++ b/source/blender/python/gpu/gpu_py_types.c @@ -32,17 +32,20 @@ /** \name GPU Types Module * \{ */ -static struct PyModuleDef BPyGPU_types_module_def = { +static struct PyModuleDef pygpu_types_module_def = { PyModuleDef_HEAD_INIT, .m_name = "gpu.types", }; -PyObject *BPyInit_gpu_types(void) +PyObject *bpygpu_types_init(void) { PyObject *submodule; - submodule = PyModule_Create(&BPyGPU_types_module_def); + submodule = PyModule_Create(&pygpu_types_module_def); + if (PyType_Ready(&BPyGPU_BufferType) < 0) { + return NULL; + } if (PyType_Ready(&BPyGPUVertFormat_Type) < 0) { return NULL; } @@ -61,19 +64,26 @@ PyObject *BPyInit_gpu_types(void) if (PyType_Ready(&BPyGPUShader_Type) < 0) { return NULL; } + if (PyType_Ready(&BPyGPUTexture_Type) < 0) { + return NULL; + } + if (PyType_Ready(&BPyGPUFrameBuffer_Type) < 0) { + return NULL; + } + if (PyType_Ready(&BPyGPUUniformBuf_Type) < 0) { + return NULL; + } -#define MODULE_TYPE_ADD(s, t) \ - PyModule_AddObject(s, t.tp_name, (PyObject *)&t); \ - Py_INCREF((PyObject *)&t) - - MODULE_TYPE_ADD(submodule, BPyGPUVertFormat_Type); - MODULE_TYPE_ADD(submodule, BPyGPUVertBuf_Type); - MODULE_TYPE_ADD(submodule, BPyGPUIndexBuf_Type); - MODULE_TYPE_ADD(submodule, BPyGPUBatch_Type); - MODULE_TYPE_ADD(submodule, BPyGPUOffScreen_Type); - MODULE_TYPE_ADD(submodule, BPyGPUShader_Type); - -#undef MODULE_TYPE_ADD + PyModule_AddType(submodule, &BPyGPU_BufferType); + PyModule_AddType(submodule, &BPyGPUVertFormat_Type); + PyModule_AddType(submodule, &BPyGPUVertBuf_Type); + PyModule_AddType(submodule, &BPyGPUIndexBuf_Type); + PyModule_AddType(submodule, &BPyGPUBatch_Type); + PyModule_AddType(submodule, &BPyGPUOffScreen_Type); + PyModule_AddType(submodule, &BPyGPUShader_Type); + PyModule_AddType(submodule, &BPyGPUTexture_Type); + PyModule_AddType(submodule, &BPyGPUFrameBuffer_Type); + PyModule_AddType(submodule, &BPyGPUUniformBuf_Type); return submodule; } diff --git a/source/blender/python/gpu/gpu_py_types.h b/source/blender/python/gpu/gpu_py_types.h index 56f73b8a504..eb72c04d53e 100644 --- a/source/blender/python/gpu/gpu_py_types.h +++ b/source/blender/python/gpu/gpu_py_types.h @@ -20,11 +20,16 @@ #pragma once +#include "gpu_py_buffer.h" + #include "gpu_py_batch.h" #include "gpu_py_element.h" +#include "gpu_py_framebuffer.h" #include "gpu_py_offscreen.h" #include "gpu_py_shader.h" +#include "gpu_py_texture.h" +#include "gpu_py_uniformbuffer.h" #include "gpu_py_vertex_buffer.h" #include "gpu_py_vertex_format.h" -PyObject *BPyInit_gpu_types(void); +PyObject *bpygpu_types_init(void); diff --git a/source/blender/python/gpu/gpu_py_uniformbuffer.c b/source/blender/python/gpu/gpu_py_uniformbuffer.c new file mode 100644 index 00000000000..c60d6216834 --- /dev/null +++ b/source/blender/python/gpu/gpu_py_uniformbuffer.c @@ -0,0 +1,194 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + * + * This file defines the uniform buffer functionalities of the 'gpu' module + * + * - Use ``bpygpu_`` for local API. + * - Use ``BPyGPU`` for public API. + */ + +#include + +#include "BLI_string.h" + +#include "GPU_context.h" +#include "GPU_texture.h" +#include "GPU_uniform_buffer.h" + +#include "../generic/py_capi_utils.h" + +#include "gpu_py.h" +#include "gpu_py_buffer.h" + +#include "gpu_py_uniformbuffer.h" /* own include */ + +/* -------------------------------------------------------------------- */ +/** \name GPUUniformBuf Common Utilities + * \{ */ + +static int pygpu_uniformbuffer_valid_check(BPyGPUUniformBuf *bpygpu_ub) +{ + if (UNLIKELY(bpygpu_ub->ubo == NULL)) { + PyErr_SetString(PyExc_ReferenceError, +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD + "GPU uniform buffer was freed, no further access is valid"); +#else + + "GPU uniform buffer: internal error"); +#endif + return -1; + } + return 0; +} + +#define BPYGPU_UNIFORMBUF_CHECK_OBJ(bpygpu) \ + { \ + if (UNLIKELY(pygpu_uniformbuffer_valid_check(bpygpu) == -1)) { \ + return NULL; \ + } \ + } \ + ((void)0) + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name GPUUniformBuf Type + * \{ */ + +static PyObject *pygpu_uniformbuffer__tp_new(PyTypeObject *UNUSED(self), + PyObject *args, + PyObject *kwds) +{ + BPYGPU_IS_INIT_OR_ERROR_OBJ; + + GPUUniformBuf *ubo = NULL; + BPyGPUBuffer *pybuffer_obj; + char err_out[256] = "unknown error. See console"; + + static const char *_keywords[] = {"data", NULL}; + static _PyArg_Parser _parser = {"O!:GPUUniformBuf.__new__", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, &BPyGPU_BufferType, &pybuffer_obj)) { + return NULL; + } + + if (GPU_context_active_get()) { + ubo = GPU_uniformbuf_create_ex( + bpygpu_Buffer_size(pybuffer_obj), pybuffer_obj->buf.as_void, "python_uniformbuffer"); + } + else { + STRNCPY(err_out, "No active GPU context found"); + } + + if (ubo == NULL) { + PyErr_Format(PyExc_RuntimeError, "GPUUniformBuf.__new__(...) failed with '%s'", err_out); + return NULL; + } + + return BPyGPUUniformBuf_CreatePyObject(ubo); +} + +PyDoc_STRVAR(pygpu_uniformbuffer_update_doc, + ".. method::update(data)\n" + "\n" + " Update the data of the uniform buffer object.\n"); +static PyObject *pygpu_uniformbuffer_update(BPyGPUUniformBuf *self, PyObject *obj) +{ + BPYGPU_UNIFORMBUF_CHECK_OBJ(self); + + if (!BPyGPU_Buffer_Check(obj)) { + return NULL; + } + + GPU_uniformbuf_update(self->ubo, ((BPyGPUBuffer *)obj)->buf.as_void); + Py_RETURN_NONE; +} + +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD +PyDoc_STRVAR(pygpu_uniformbuffer_free_doc, + ".. method::free()\n" + "\n" + " Free the uniform buffer object.\n" + " The uniform buffer object will no longer be accessible.\n"); +static PyObject *pygpu_uniformbuffer_free(BPyGPUUniformBuf *self) +{ + BPYGPU_UNIFORMBUF_CHECK_OBJ(self); + + GPU_uniformbuf_free(self->ubo); + self->ubo = NULL; + Py_RETURN_NONE; +} +#endif + +static void BPyGPUUniformBuf__tp_dealloc(BPyGPUUniformBuf *self) +{ + if (self->ubo) { + GPU_uniformbuf_free(self->ubo); + } + Py_TYPE(self)->tp_free((PyObject *)self); +} + +static PyGetSetDef pygpu_uniformbuffer__tp_getseters[] = { + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ +}; + +static struct PyMethodDef pygpu_uniformbuffer__tp_methods[] = { + {"update", (PyCFunction)pygpu_uniformbuffer_update, METH_O, pygpu_uniformbuffer_update_doc}, +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD + {"free", (PyCFunction)pygpu_uniformbuffer_free, METH_NOARGS, pygpu_uniformbuffer_free_doc}, +#endif + {NULL, NULL, 0, NULL}, +}; + +PyDoc_STRVAR(pygpu_uniformbuffer__tp_doc, + ".. class:: GPUUniformBuf(data)\n" + "\n" + " This object gives access to off uniform buffers.\n" + "\n" + " :arg data: Buffer object.\n" + " :type data: `Buffer`\n"); +PyTypeObject BPyGPUUniformBuf_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUUniformBuf", + .tp_basicsize = sizeof(BPyGPUUniformBuf), + .tp_dealloc = (destructor)BPyGPUUniformBuf__tp_dealloc, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_doc = pygpu_uniformbuffer__tp_doc, + .tp_methods = pygpu_uniformbuffer__tp_methods, + .tp_getset = pygpu_uniformbuffer__tp_getseters, + .tp_new = pygpu_uniformbuffer__tp_new, +}; + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Public API + * \{ */ + +PyObject *BPyGPUUniformBuf_CreatePyObject(GPUUniformBuf *ubo) +{ + BPyGPUUniformBuf *self; + + self = PyObject_New(BPyGPUUniformBuf, &BPyGPUUniformBuf_Type); + self->ubo = ubo; + + return (PyObject *)self; +} + +/** \} */ + +#undef BPYGPU_UNIFORMBUF_CHECK_OBJ diff --git a/source/blender/python/gpu/gpu_py_uniformbuffer.h b/source/blender/python/gpu/gpu_py_uniformbuffer.h new file mode 100644 index 00000000000..a13c33ae78a --- /dev/null +++ b/source/blender/python/gpu/gpu_py_uniformbuffer.h @@ -0,0 +1,33 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + */ + +#pragma once + +#include "BLI_compiler_attrs.h" + +extern PyTypeObject BPyGPUUniformBuf_Type; + +#define BPyGPUUniformBuf_Check(v) (Py_TYPE(v) == &BPyGPUUniformBuf_Type) + +typedef struct BPyGPUUniformBuf { + PyObject_HEAD struct GPUUniformBuf *ubo; +} BPyGPUUniformBuf; + +PyObject *BPyGPUUniformBuf_CreatePyObject(struct GPUUniformBuf *ubo) ATTR_NONNULL(1); diff --git a/source/blender/python/gpu/gpu_py_vertex_buffer.c b/source/blender/python/gpu/gpu_py_vertex_buffer.c index 8e19eac76d0..dcea57e78dc 100644 --- a/source/blender/python/gpu/gpu_py_vertex_buffer.c +++ b/source/blender/python/gpu/gpu_py_vertex_buffer.c @@ -39,7 +39,7 @@ /** \name Utility Functions * \{ */ -#define PY_AS_NATIVE_SWITCH(attr) \ +#define PYGPU_AS_NATIVE_SWITCH(attr) \ switch (attr->comp_type) { \ case GPU_COMP_I8: { \ PY_AS_NATIVE(int8_t, PyC_Long_AsI8); \ @@ -75,7 +75,7 @@ ((void)0) /* No error checking, callers must run PyErr_Occurred */ -static void fill_format_elem(void *data_dst_void, PyObject *py_src, const GPUVertAttr *attr) +static void pygpu_fill_format_elem(void *data_dst_void, PyObject *py_src, const GPUVertAttr *attr) { #define PY_AS_NATIVE(ty_dst, py_as_native) \ { \ @@ -84,15 +84,15 @@ static void fill_format_elem(void *data_dst_void, PyObject *py_src, const GPUVer } \ ((void)0) - PY_AS_NATIVE_SWITCH(attr); + PYGPU_AS_NATIVE_SWITCH(attr); #undef PY_AS_NATIVE } /* No error checking, callers must run PyErr_Occurred */ -static void fill_format_sequence(void *data_dst_void, - PyObject *py_seq_fast, - const GPUVertAttr *attr) +static void pygpu_fill_format_sequence(void *data_dst_void, + PyObject *py_seq_fast, + const GPUVertAttr *attr) { const uint len = attr->comp_len; PyObject **value_fast_items = PySequence_Fast_ITEMS(py_seq_fast); @@ -107,19 +107,19 @@ static void fill_format_sequence(void *data_dst_void, } \ ((void)0) - PY_AS_NATIVE_SWITCH(attr); + PYGPU_AS_NATIVE_SWITCH(attr); #undef PY_AS_NATIVE } -#undef PY_AS_NATIVE_SWITCH +#undef PYGPU_AS_NATIVE_SWITCH #undef WARN_TYPE_LIMIT_PUSH #undef WARN_TYPE_LIMIT_POP -static bool py_vertbuf_fill_impl(GPUVertBuf *vbo, - uint data_id, - PyObject *seq, - const char *error_prefix) +static bool pygpu_vertbuf_fill_impl(GPUVertBuf *vbo, + uint data_id, + PyObject *seq, + const char *error_prefix) { const char *exc_str_size_mismatch = "Expected a %s of size %d, got %u"; @@ -173,7 +173,7 @@ static bool py_vertbuf_fill_impl(GPUVertBuf *vbo, for (uint i = 0; i < seq_len; i++) { uchar *data = (uchar *)GPU_vertbuf_raw_step(&data_step); PyObject *item = seq_items[i]; - fill_format_elem(data, item, attr); + pygpu_fill_format_elem(data, item, attr); } } else { @@ -197,7 +197,7 @@ static bool py_vertbuf_fill_impl(GPUVertBuf *vbo, } /* May trigger error, check below */ - fill_format_sequence(data, seq_fast_item, attr); + pygpu_fill_format_sequence(data, seq_fast_item, attr); Py_DECREF(seq_fast_item); } } @@ -213,7 +213,10 @@ static bool py_vertbuf_fill_impl(GPUVertBuf *vbo, return ok; } -static int py_attr_fill(GPUVertBuf *buf, int id, PyObject *py_seq_data, const char *error_prefix) +static int pygpu_vertbuf_fill(GPUVertBuf *buf, + int id, + PyObject *py_seq_data, + const char *error_prefix) { if (id < 0 || id >= GPU_vertbuf_get_format(buf)->attr_len) { PyErr_Format(PyExc_ValueError, "Format id %d out of range", id); @@ -225,7 +228,7 @@ static int py_attr_fill(GPUVertBuf *buf, int id, PyObject *py_seq_data, const ch return 0; } - if (!py_vertbuf_fill_impl(buf, (uint)id, py_seq_data, error_prefix)) { + if (!pygpu_vertbuf_fill_impl(buf, (uint)id, py_seq_data, error_prefix)) { return 0; } @@ -238,7 +241,7 @@ static int py_attr_fill(GPUVertBuf *buf, int id, PyObject *py_seq_data, const ch /** \name VertBuf Type * \{ */ -static PyObject *py_VertBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) +static PyObject *pygpu_vertbuf__tp_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) { struct { PyObject *py_fmt; @@ -260,7 +263,7 @@ static PyObject *py_VertBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyOb return BPyGPUVertBuf_CreatePyObject(vbo); } -PyDoc_STRVAR(py_VertBuf_attr_fill_doc, +PyDoc_STRVAR(pygpu_vertbuf_attr_fill_doc, ".. method:: attr_fill(id, data)\n" "\n" " Insert data into the buffer for a single attribute.\n" @@ -269,7 +272,7 @@ PyDoc_STRVAR(py_VertBuf_attr_fill_doc, " :type id: int or str\n" " :param data: Sequence of data that should be stored in the buffer\n" " :type data: sequence of values or tuples\n"); -static PyObject *py_VertBuf_attr_fill(BPyGPUVertBuf *self, PyObject *args, PyObject *kwds) +static PyObject *pygpu_vertbuf_attr_fill(BPyGPUVertBuf *self, PyObject *args, PyObject *kwds) { PyObject *data; PyObject *identifier; @@ -299,28 +302,28 @@ static PyObject *py_VertBuf_attr_fill(BPyGPUVertBuf *self, PyObject *args, PyObj return NULL; } - if (!py_attr_fill(self->buf, id, data, "GPUVertBuf.attr_fill")) { + if (!pygpu_vertbuf_fill(self->buf, id, data, "GPUVertBuf.attr_fill")) { return NULL; } Py_RETURN_NONE; } -static struct PyMethodDef py_VertBuf_methods[] = { +static struct PyMethodDef pygpu_vertbuf__tp_methods[] = { {"attr_fill", - (PyCFunction)py_VertBuf_attr_fill, + (PyCFunction)pygpu_vertbuf_attr_fill, METH_VARARGS | METH_KEYWORDS, - py_VertBuf_attr_fill_doc}, + pygpu_vertbuf_attr_fill_doc}, {NULL, NULL, 0, NULL}, }; -static void py_VertBuf_dealloc(BPyGPUVertBuf *self) +static void pygpu_vertbuf__tp_dealloc(BPyGPUVertBuf *self) { GPU_vertbuf_discard(self->buf); Py_TYPE(self)->tp_free(self); } -PyDoc_STRVAR(py_gpu_vertex_buffer_doc, +PyDoc_STRVAR(pygpu_vertbuf__tp_doc, ".. class:: GPUVertBuf(len, format)\n" "\n" " Contains a VBO.\n" @@ -332,11 +335,11 @@ PyDoc_STRVAR(py_gpu_vertex_buffer_doc, PyTypeObject BPyGPUVertBuf_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUVertBuf", .tp_basicsize = sizeof(BPyGPUVertBuf), - .tp_dealloc = (destructor)py_VertBuf_dealloc, + .tp_dealloc = (destructor)pygpu_vertbuf__tp_dealloc, .tp_flags = Py_TPFLAGS_DEFAULT, - .tp_doc = py_gpu_vertex_buffer_doc, - .tp_methods = py_VertBuf_methods, - .tp_new = py_VertBuf_new, + .tp_doc = pygpu_vertbuf__tp_doc, + .tp_methods = pygpu_vertbuf__tp_methods, + .tp_new = pygpu_vertbuf__tp_new, }; /** \} */ diff --git a/source/blender/python/gpu/gpu_py_vertex_format.c b/source/blender/python/gpu/gpu_py_vertex_format.c index 7d1e4ee4868..343cf06b20a 100644 --- a/source/blender/python/gpu/gpu_py_vertex_format.c +++ b/source/blender/python/gpu/gpu_py_vertex_format.c @@ -32,115 +32,31 @@ #include "gpu_py_vertex_format.h" /* own include */ -#ifdef __BIG_ENDIAN__ -/* big endian */ -# define MAKE_ID2(c, d) ((c) << 8 | (d)) -# define MAKE_ID3(a, b, c) ((int)(a) << 24 | (int)(b) << 16 | (c) << 8) -# define MAKE_ID4(a, b, c, d) ((int)(a) << 24 | (int)(b) << 16 | (c) << 8 | (d)) -#else -/* little endian */ -# define MAKE_ID2(c, d) ((d) << 8 | (c)) -# define MAKE_ID3(a, b, c) ((int)(c) << 16 | (b) << 8 | (a)) -# define MAKE_ID4(a, b, c, d) ((int)(d) << 24 | (int)(c) << 16 | (b) << 8 | (a)) -#endif - /* -------------------------------------------------------------------- */ /** \name Enum Conversion * * Use with PyArg_ParseTuple's "O&" formatting. * \{ */ -static int py_parse_component_type(const char *str, int length) -{ - if (length == 2) { - switch (*((ushort *)str)) { - case MAKE_ID2('I', '8'): - return GPU_COMP_I8; - case MAKE_ID2('U', '8'): - return GPU_COMP_U8; - default: - break; - } - } - else if (length == 3) { - switch (*((uint *)str)) { - case MAKE_ID3('I', '1', '6'): - return GPU_COMP_I16; - case MAKE_ID3('U', '1', '6'): - return GPU_COMP_U16; - case MAKE_ID3('I', '3', '2'): - return GPU_COMP_I32; - case MAKE_ID3('U', '3', '2'): - return GPU_COMP_U32; - case MAKE_ID3('F', '3', '2'): - return GPU_COMP_F32; - case MAKE_ID3('I', '1', '0'): - return GPU_COMP_I10; - default: - break; - } - } - return -1; -} +static struct PyC_StringEnumItems pygpu_vertcomptype_items[] = { + {GPU_COMP_I8, "I8"}, + {GPU_COMP_U8, "U8"}, + {GPU_COMP_I16, "I16"}, + {GPU_COMP_U16, "U16"}, + {GPU_COMP_I32, "I32"}, + {GPU_COMP_U32, "U32"}, + {GPU_COMP_F32, "F32"}, + {GPU_COMP_I10, "I10"}, + {0, NULL}, +}; -static int py_parse_fetch_mode(const char *str, int length) -{ -#define MATCH_ID(id) \ - if (length == strlen(STRINGIFY(id))) { \ - if (STREQ(str, STRINGIFY(id))) { \ - return GPU_FETCH_##id; \ - } \ - } \ - ((void)0) - - MATCH_ID(FLOAT); - MATCH_ID(INT); - MATCH_ID(INT_TO_FLOAT_UNIT); - MATCH_ID(INT_TO_FLOAT); -#undef MATCH_ID - - return -1; -} - -static int py_ParseVertCompType(PyObject *o, void *p) -{ - Py_ssize_t length; - const char *str = _PyUnicode_AsStringAndSize(o, &length); - - if (str == NULL) { - PyErr_Format(PyExc_ValueError, "expected a string, got %s", Py_TYPE(o)->tp_name); - return 0; - } - - const int comp_type = py_parse_component_type(str, length); - if (comp_type == -1) { - PyErr_Format(PyExc_ValueError, "unknown component type: '%s", str); - return 0; - } - - *((GPUVertCompType *)p) = comp_type; - return 1; -} - -static int py_ParseVertFetchMode(PyObject *o, void *p) -{ - Py_ssize_t length; - const char *str = _PyUnicode_AsStringAndSize(o, &length); - - if (str == NULL) { - PyErr_Format(PyExc_ValueError, "expected a string, got %s", Py_TYPE(o)->tp_name); - return 0; - } - - const int fetch_mode = py_parse_fetch_mode(str, length); - if (fetch_mode == -1) { - PyErr_Format(PyExc_ValueError, "unknown type literal: '%s'", str); - return 0; - } - - (*(GPUVertFetchMode *)p) = fetch_mode; - return 1; -} +static struct PyC_StringEnumItems pygpu_vertfetchmode_items[] = { + {GPU_FETCH_FLOAT, "FLOAT"}, + {GPU_FETCH_INT, "INT"}, + {GPU_FETCH_INT_TO_FLOAT_UNIT, "INT_TO_FLOAT_UNIT"}, + {GPU_FETCH_INT_TO_FLOAT, "INT_TO_FLOAT"}, + {0, NULL}, +}; /** \} */ @@ -148,7 +64,9 @@ static int py_ParseVertFetchMode(PyObject *o, void *p) /** \name VertFormat Type * \{ */ -static PyObject *py_VertFormat_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) +static PyObject *pygpu_vertformat__tp_new(PyTypeObject *UNUSED(type), + PyObject *args, + PyObject *kwds) { if (PyTuple_GET_SIZE(args) || (kwds && PyDict_Size(kwds))) { PyErr_SetString(PyExc_ValueError, "This function takes no arguments"); @@ -158,7 +76,7 @@ static PyObject *py_VertFormat_new(PyTypeObject *UNUSED(type), PyObject *args, P } PyDoc_STRVAR( - py_VertFormat_attr_add_doc, + pygpu_vertformat_attr_add_doc, ".. method:: attr_add(id, comp_type, len, fetch_mode)\n" "\n" " Add a new attribute to the format.\n" @@ -177,14 +95,12 @@ PyDoc_STRVAR( " converted to a normal 4 byte float when used.\n" " Possible values are `FLOAT`, `INT`, `INT_TO_FLOAT_UNIT` and `INT_TO_FLOAT`.\n" " :type fetch_mode: `str`\n"); -static PyObject *py_VertFormat_attr_add(BPyGPUVertFormat *self, PyObject *args, PyObject *kwds) +static PyObject *pygpu_vertformat_attr_add(BPyGPUVertFormat *self, PyObject *args, PyObject *kwds) { - struct { - const char *id; - GPUVertCompType comp_type; - uint len; - GPUVertFetchMode fetch_mode; - } params; + const char *id; + uint len; + struct PyC_StringEnum comp_type = {pygpu_vertcomptype_items, GPU_COMP_I8}; + struct PyC_StringEnum fetch_mode = {pygpu_vertfetchmode_items, GPU_FETCH_FLOAT}; if (self->fmt.attr_len == GPU_VERT_ATTR_MAX_LEN) { PyErr_SetString(PyExc_ValueError, "Maximum attr reached " STRINGIFY(GPU_VERT_ATTR_MAX_LEN)); @@ -196,45 +112,45 @@ static PyObject *py_VertFormat_attr_add(BPyGPUVertFormat *self, PyObject *args, if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, - ¶ms.id, - py_ParseVertCompType, - ¶ms.comp_type, - ¶ms.len, - py_ParseVertFetchMode, - ¶ms.fetch_mode)) { + &id, + PyC_ParseStringEnum, + &comp_type, + &len, + PyC_ParseStringEnum, + &fetch_mode)) { return NULL; } uint attr_id = GPU_vertformat_attr_add( - &self->fmt, params.id, params.comp_type, params.len, params.fetch_mode); + &self->fmt, id, comp_type.value_found, len, fetch_mode.value_found); return PyLong_FromLong(attr_id); } -static struct PyMethodDef py_VertFormat_methods[] = { +static struct PyMethodDef pygpu_vertformat__tp_methods[] = { {"attr_add", - (PyCFunction)py_VertFormat_attr_add, + (PyCFunction)pygpu_vertformat_attr_add, METH_VARARGS | METH_KEYWORDS, - py_VertFormat_attr_add_doc}, + pygpu_vertformat_attr_add_doc}, {NULL, NULL, 0, NULL}, }; -static void py_VertFormat_dealloc(BPyGPUVertFormat *self) +static void pygpu_vertformat__tp_dealloc(BPyGPUVertFormat *self) { Py_TYPE(self)->tp_free(self); } -PyDoc_STRVAR(py_VertFormat_doc, +PyDoc_STRVAR(pygpu_vertformat__tp_doc, ".. class:: GPUVertFormat()\n" "\n" " This object contains information about the structure of a vertex buffer.\n"); PyTypeObject BPyGPUVertFormat_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUVertFormat", .tp_basicsize = sizeof(BPyGPUVertFormat), - .tp_dealloc = (destructor)py_VertFormat_dealloc, + .tp_dealloc = (destructor)pygpu_vertformat__tp_dealloc, .tp_flags = Py_TPFLAGS_DEFAULT, - .tp_doc = py_VertFormat_doc, - .tp_methods = py_VertFormat_methods, - .tp_new = py_VertFormat_new, + .tp_doc = pygpu_vertformat__tp_doc, + .tp_methods = pygpu_vertformat__tp_methods, + .tp_new = pygpu_vertformat__tp_new, }; /** \} */ diff --git a/source/blender/python/intern/bpy.c b/source/blender/python/intern/bpy.c index 6462f8320d7..74fc8bcfec9 100644 --- a/source/blender/python/intern/bpy.c +++ b/source/blender/python/intern/bpy.c @@ -261,7 +261,7 @@ PyDoc_STRVAR(bpy_escape_identifier_doc, static PyObject *bpy_escape_identifier(PyObject *UNUSED(self), PyObject *value) { Py_ssize_t value_str_len; - const char *value_str = _PyUnicode_AsStringAndSize(value, &value_str_len); + const char *value_str = PyUnicode_AsUTF8AndSize(value, &value_str_len); if (value_str == NULL) { PyErr_SetString(PyExc_TypeError, "expected a string"); @@ -299,7 +299,7 @@ PyDoc_STRVAR(bpy_unescape_identifier_doc, static PyObject *bpy_unescape_identifier(PyObject *UNUSED(self), PyObject *value) { Py_ssize_t value_str_len; - const char *value_str = _PyUnicode_AsStringAndSize(value, &value_str_len); + const char *value_str = PyUnicode_AsUTF8AndSize(value, &value_str_len); if (value_str == NULL) { PyErr_SetString(PyExc_TypeError, "expected a string"); diff --git a/source/blender/python/intern/bpy_app_translations.c b/source/blender/python/intern/bpy_app_translations.c index ee64d0a409c..d00f205ddc0 100644 --- a/source/blender/python/intern/bpy_app_translations.c +++ b/source/blender/python/intern/bpy_app_translations.c @@ -211,7 +211,7 @@ static void _build_translations_cache(PyObject *py_messages, const char *locale) msgctxt = BLT_I18NCONTEXT_DEFAULT_BPYRNA; } else if (PyUnicode_Check(tmp)) { - msgctxt = _PyUnicode_AsString(tmp); + msgctxt = PyUnicode_AsUTF8(tmp); } else { invalid_key = true; @@ -219,7 +219,7 @@ static void _build_translations_cache(PyObject *py_messages, const char *locale) tmp = PyTuple_GET_ITEM(pykey, 1); if (PyUnicode_Check(tmp)) { - msgid = _PyUnicode_AsString(tmp); + msgid = PyUnicode_AsUTF8(tmp); } else { invalid_key = true; @@ -250,7 +250,7 @@ static void _build_translations_cache(PyObject *py_messages, const char *locale) /* Do not overwrite existing keys! */ if (BPY_app_translations_py_pgettext(msgctxt, msgid) == msgid) { GHashKey *key = _ghashutil_keyalloc(msgctxt, msgid); - BLI_ghash_insert(_translations_cache, key, BLI_strdup(_PyUnicode_AsString(trans))); + BLI_ghash_insert(_translations_cache, key, BLI_strdup(PyUnicode_AsUTF8(trans))); } } } @@ -341,7 +341,7 @@ static PyObject *app_translations_py_messages_register(BlenderAppTranslations *s PyExc_ValueError, "bpy.app.translations.register: translations message cache already contains some data for " "addon '%s'", - (const char *)_PyUnicode_AsString(module_name)); + (const char *)PyUnicode_AsUTF8(module_name)); return NULL; } @@ -795,11 +795,7 @@ static PyTypeObject BlenderAppTranslationsType = { /* methods */ /* No destructor, this is a singleton! */ NULL, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif + 0, /* tp_vectorcall_offset */ NULL, /* getattrfunc tp_getattr; */ NULL, /* setattrfunc tp_setattr; */ NULL, diff --git a/source/blender/python/intern/bpy_capi_utils.c b/source/blender/python/intern/bpy_capi_utils.c index 57dc4c0a679..b2670161d92 100644 --- a/source/blender/python/intern/bpy_capi_utils.c +++ b/source/blender/python/intern/bpy_capi_utils.c @@ -136,7 +136,7 @@ bool BPy_errors_to_report_ex(ReportList *reports, RPT_ERROR, TIP_("%s: %s\nlocation: %s:%d\n"), error_prefix, - _PyUnicode_AsString(pystring), + PyUnicode_AsUTF8(pystring), filename, lineno); @@ -144,12 +144,12 @@ bool BPy_errors_to_report_ex(ReportList *reports, fprintf(stderr, TIP_("%s: %s\nlocation: %s:%d\n"), error_prefix, - _PyUnicode_AsString(pystring), + PyUnicode_AsUTF8(pystring), filename, lineno); } else { - BKE_reportf(reports, RPT_ERROR, "%s: %s", error_prefix, _PyUnicode_AsString(pystring)); + BKE_reportf(reports, RPT_ERROR, "%s: %s", error_prefix, PyUnicode_AsUTF8(pystring)); } Py_DECREF(pystring); diff --git a/source/blender/python/intern/bpy_capi_utils.h b/source/blender/python/intern/bpy_capi_utils.h index 55f8a291410..0854713982d 100644 --- a/source/blender/python/intern/bpy_capi_utils.h +++ b/source/blender/python/intern/bpy_capi_utils.h @@ -20,8 +20,8 @@ #pragma once -#if PY_VERSION_HEX < 0x03070000 -# error "Python 3.7 or greater is required, you'll need to update your Python." +#if PY_VERSION_HEX < 0x03090000 +# error "Python 3.9 or greater is required, you'll need to update your Python." #endif #ifdef __cplusplus diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c index c0536693f38..5102aa17250 100644 --- a/source/blender/python/intern/bpy_driver.c +++ b/source/blender/python/intern/bpy_driver.c @@ -163,7 +163,7 @@ int bpy_pydriver_create_dict(void) PyObject *arg_key, *arg_value; Py_ssize_t arg_pos = 0; while (PyDict_Next(mod_math_dict, &arg_pos, &arg_key, &arg_value)) { - const char *arg_str = _PyUnicode_AsString(arg_key); + const char *arg_str = PyUnicode_AsUTF8(arg_key); if (arg_str[0] && arg_str[1] != '_') { PyDict_SetItem(bpy_pydriver_Dict__whitelist, arg_key, Py_None); } @@ -363,7 +363,7 @@ static bool bpy_driver_secure_bytecode_validate(PyObject *expr_code, PyObject *d fprintf(stderr, "\tBPY_driver_eval() - restricted access disallows name '%s', " "enable auto-execution to support\n", - _PyUnicode_AsString(name)); + PyUnicode_AsUTF8(name)); return false; } } diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index c4789407e4e..c5f5e9c71b8 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -304,100 +304,153 @@ static struct _inittab bpy_internal_modules[] = { {NULL, NULL}, }; +/** + * Convenience function for #BPY_python_start. + * + * These should happen so rarely that having comprehensive errors isn't needed. + * For example if `sys.argv` fails to allocate memory. + * + * Show an error just to avoid silent failure in the unlikely event something goes wrong, + * in this case a developer will need to track down the root cause. + */ +static void pystatus_exit_on_error(PyStatus status) +{ + if (UNLIKELY(PyStatus_Exception(status))) { + fputs("Internal error initializing Python!\n", stderr); + /* This calls `exit`. */ + Py_ExitStatusException(status); + } +} + /* call BPY_context_set first */ void BPY_python_start(bContext *C, int argc, const char **argv) { #ifndef WITH_PYTHON_MODULE - PyThreadState *py_tstate = NULL; - /* Needed for Python's initialization for portable Python installations. - * We could use #Py_SetPath, but this overrides Python's internal logic - * for calculating it's own module search paths. - * - * `sys.executable` is overwritten after initialization to the Python binary. */ + /* #PyPreConfig (early-configuration). */ { - const char *program_path = BKE_appdir_program_path(); - wchar_t program_path_wchar[FILE_MAX]; - BLI_strncpy_wchar_from_utf8(program_path_wchar, program_path, ARRAY_SIZE(program_path_wchar)); - Py_SetProgramName(program_path_wchar); + PyPreConfig preconfig; + PyStatus status; + + if (py_use_system_env) { + PyPreConfig_InitPythonConfig(&preconfig); + } + else { + /* Only use the systems environment variables and site when explicitly requested. + * Since an incorrect 'PYTHONPATH' causes difficult to debug errors, see: T72807. + * An alternative to setting `preconfig.use_environment = 0` */ + PyPreConfig_InitIsolatedConfig(&preconfig); + } + + /* Force `utf-8` on all platforms, since this is what's used for Blender's internal strings, + * providing consistent encoding behavior across all Blender installations. + * + * This also uses the `surrogateescape` error handler ensures any unexpected bytes are escaped + * instead of raising an error. + * + * Without this `sys.getfilesystemencoding()` and `sys.stdout` for example may be set to ASCII + * or some other encoding - where printing some `utf-8` values will raise an error. + * + * This can cause scripts to fail entirely on some systems. + * + * This assignment is the equivalent of enabling the `PYTHONUTF8` environment variable. + * See `PEP-540` for details on exactly what this changes. */ + preconfig.utf8_mode = true; + + /* Note that there is no reason to call #Py_PreInitializeFromBytesArgs here + * as this is only used so that command line arguments can be handled by Python itself, + * not for setting `sys.argv` (handled below). */ + status = Py_PreInitialize(&preconfig); + pystatus_exit_on_error(status); } - /* must run before python initializes */ + /* Must run before python initializes, but after #PyPreConfig. */ PyImport_ExtendInittab(bpy_internal_modules); - /* Allow to use our own included Python. `py_path_bundle` may be NULL. */ + /* #PyConfig (initialize Python). */ { - const char *py_path_bundle = BKE_appdir_folder_id(BLENDER_SYSTEM_PYTHON, NULL); - if (py_path_bundle != NULL) { - PyC_SetHomePath(py_path_bundle); + PyConfig config; + PyStatus status; + bool has_python_executable = false; + + PyConfig_InitPythonConfig(&config); + + /* Suppress error messages when calculating the module search path. + * While harmless, it's noisy. */ + config.pathconfig_warnings = 0; + + /* When using the system's Python, allow the site-directory as well. */ + config.user_site_directory = py_use_system_env; + + /* While `sys.argv` is set, we don't want Python to interpret it. */ + config.parse_argv = 0; + status = PyConfig_SetBytesArgv(&config, argc, (char *const *)argv); + pystatus_exit_on_error(status); + + /* Needed for Python's initialization for portable Python installations. + * We could use #Py_SetPath, but this overrides Python's internal logic + * for calculating it's own module search paths. + * + * `sys.executable` is overwritten after initialization to the Python binary. */ + { + const char *program_path = BKE_appdir_program_path(); + status = PyConfig_SetBytesString(&config, &config.program_name, program_path); + pystatus_exit_on_error(status); } - else { - /* Common enough to use the system Python on Linux/Unix, warn on other systems. */ + + /* Setting the program name is important so the 'multiprocessing' module + * can launch new Python instances. */ + { + char program_path[FILE_MAX]; + if (BKE_appdir_program_python_search( + program_path, sizeof(program_path), PY_MAJOR_VERSION, PY_MINOR_VERSION)) { + status = PyConfig_SetBytesString(&config, &config.executable, program_path); + pystatus_exit_on_error(status); + has_python_executable = true; + } + else { + /* Set to `sys.executable = None` below (we can't do before Python is initialized). */ + fprintf(stderr, + "Unable to find the python binary, " + "the multiprocessing module may not be functional!\n"); + } + } + + /* Allow to use our own included Python. `py_path_bundle` may be NULL. */ + { + const char *py_path_bundle = BKE_appdir_folder_id(BLENDER_SYSTEM_PYTHON, NULL); + if (py_path_bundle != NULL) { + +# ifdef __APPLE__ + /* Mac-OS allows file/directory names to contain `:` character + * (represented as `/` in the Finder) but current Python lib (as of release 3.1.1) + * doesn't handle these correctly. */ + if (strchr(py_path_bundle, ':')) { + fprintf(stderr, + "Warning! Blender application is located in a path containing ':' or '/' chars\n" + "This may make python import function fail\n"); + } +# endif /* __APPLE__ */ + + status = PyConfig_SetBytesString(&config, &config.home, py_path_bundle); + pystatus_exit_on_error(status); + } + else { + /* Common enough to use the system Python on Linux/Unix, warn on other systems. */ # if defined(__APPLE__) || defined(_WIN32) - fprintf(stderr, - "Bundled Python not found and is expected on this platform " - "(the 'install' target may have not been built)\n"); + fprintf(stderr, + "Bundled Python not found and is expected on this platform " + "(the 'install' target may have not been built)\n"); # endif + } } - } - /* Force `utf-8` on all platforms, since this is what's used for Blender's internal strings, - * providing consistent encoding behavior across all Blender installations. - * - * This also uses the `surrogateescape` error handler ensures any unexpected bytes are escaped - * instead of raising an error. - * - * Without this `sys.getfilesystemencoding()` and `sys.stdout` for example may be set to ASCII - * or some other encoding - where printing some `utf-8` values will raise an error. - * - * This can cause scripts to fail entirely on some systems. - * - * This assignment is the equivalent of enabling the `PYTHONUTF8` environment variable. - * See `PEP-540` for details on exactly what this changes. */ - Py_UTF8Mode = 1; + /* Initialize Python (also acquires lock). */ + status = Py_InitializeFromConfig(&config); + pystatus_exit_on_error(status); - /* Suppress error messages when calculating the module search path. - * While harmless, it's noisy. */ - Py_FrozenFlag = 1; - - /* Only use the systems environment variables and site when explicitly requested. - * Since an incorrect 'PYTHONPATH' causes difficult to debug errors, see: T72807. */ - Py_IgnoreEnvironmentFlag = !py_use_system_env; - Py_NoUserSiteDirectory = !py_use_system_env; - - /* Initialize Python (also acquires lock). */ - Py_Initialize(); - - /* We could convert to #wchar_t then pass to #PySys_SetArgv (or use #PyConfig in Python 3.8+). - * However this risks introducing subtle changes in encoding that are hard to track down. - * - * So rely on #PyC_UnicodeFromByte since it's a tried & true way of getting paths - * that include non `utf-8` compatible characters, see: T20021. */ - { - PyObject *py_argv = PyList_New(argc); - for (int i = 0; i < argc; i++) { - PyList_SET_ITEM(py_argv, i, PyC_UnicodeFromByte(argv[i])); - } - PySys_SetObject("argv", py_argv); - Py_DECREF(py_argv); - } - - /* Setting the program name is important so the 'multiprocessing' module - * can launch new Python instances. */ - { - const char *sys_variable = "executable"; - char program_path[FILE_MAX]; - if (BKE_appdir_program_python_search( - program_path, sizeof(program_path), PY_MAJOR_VERSION, PY_MINOR_VERSION)) { - PyObject *py_program_path = PyC_UnicodeFromByte(program_path); - PySys_SetObject(sys_variable, py_program_path); - Py_DECREF(py_program_path); - } - else { - fprintf(stderr, - "Unable to find the python binary, " - "the multiprocessing module may not be functional!\n"); - PySys_SetObject(sys_variable, Py_None); + if (!has_python_executable) { + PySys_SetObject("executable", Py_None); } } @@ -447,8 +500,9 @@ void BPY_python_start(bContext *C, int argc, const char **argv) /* py module runs atexit when bpy is freed */ BPY_atexit_register(); /* this can init any time */ - py_tstate = PyGILState_GetThisThreadState(); - PyEval_ReleaseThread(py_tstate); + /* Free the lock acquired (implicitly) when Python is initialized. */ + PyEval_ReleaseThread(PyGILState_GetThisThreadState()); + #endif #ifdef WITH_PYTHON_MODULE @@ -534,8 +588,8 @@ void BPY_python_backtrace(FILE *fp) PyFrameObject *frame = tstate->frame; do { const int line = PyCode_Addr2Line(frame->f_code, frame->f_lasti); - const char *filename = _PyUnicode_AsString(frame->f_code->co_filename); - const char *funcname = _PyUnicode_AsString(frame->f_code->co_name); + const char *filename = PyUnicode_AsUTF8(frame->f_code->co_filename); + const char *funcname = PyUnicode_AsUTF8(frame->f_code->co_name); fprintf(fp, " File \"%s\", line %d in %s\n", filename, line, funcname); } while ((frame = frame->f_back)); } @@ -727,7 +781,7 @@ static void bpy_module_delay_init(PyObject *bpy_proxy) /* updating the module dict below will lose the reference to __file__ */ PyObject *filename_obj = PyModule_GetFilenameObject(bpy_proxy); - const char *filename_rel = _PyUnicode_AsString(filename_obj); /* can be relative */ + const char *filename_rel = PyUnicode_AsUTF8(filename_obj); /* can be relative */ char filename_abs[1024]; BLI_strncpy(filename_abs, filename_rel, sizeof(filename_abs)); diff --git a/source/blender/python/intern/bpy_library_load.c b/source/blender/python/intern/bpy_library_load.c index 39d1fba2dc9..020c8f7ea49 100644 --- a/source/blender/python/intern/bpy_library_load.c +++ b/source/blender/python/intern/bpy_library_load.c @@ -94,13 +94,9 @@ static PyTypeObject bpy_lib_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)bpy_lib_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ + 0, /* tp_vectorcall_offset */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */ NULL, /* tp_repr */ @@ -365,7 +361,7 @@ static PyObject *bpy_lib_exit(BPy_Library *self, PyObject *UNUSED(args)) for (i = 0; i < size; i++) { PyObject *item_src = PyList_GET_ITEM(ls, i); PyObject *item_dst; /* must be set below */ - const char *item_idname = _PyUnicode_AsString(item_src); + const char *item_idname = PyUnicode_AsUTF8(item_src); // printf(" %s\n", item_idname); diff --git a/source/blender/python/intern/bpy_msgbus.c b/source/blender/python/intern/bpy_msgbus.c index df45007b68f..7cc7f864c9c 100644 --- a/source/blender/python/intern/bpy_msgbus.c +++ b/source/blender/python/intern/bpy_msgbus.c @@ -118,7 +118,7 @@ static int py_msgbus_rna_key_from_py(PyObject *py_sub, PointerRNA data_type_ptr = { .type = data_type, }; - const char *data_prop_str = _PyUnicode_AsString(data_prop_py); + const char *data_prop_str = PyUnicode_AsUTF8(data_prop_py); PropertyRNA *data_prop = RNA_struct_find_property(&data_type_ptr, data_prop_str); if (data_prop == NULL) { diff --git a/source/blender/python/intern/bpy_operator.c b/source/blender/python/intern/bpy_operator.c index 5ac76ab9ac1..967eece4bcb 100644 --- a/source/blender/python/intern/bpy_operator.c +++ b/source/blender/python/intern/bpy_operator.c @@ -58,7 +58,7 @@ static wmOperatorType *ot_lookup_from_py_string(PyObject *value, const char *py_fn_id) { - const char *opname = _PyUnicode_AsString(value); + const char *opname = PyUnicode_AsUTF8(value); if (opname == NULL) { PyErr_Format(PyExc_TypeError, "%s() expects a string argument", py_fn_id); return NULL; diff --git a/source/blender/python/intern/bpy_operator_wrap.c b/source/blender/python/intern/bpy_operator_wrap.c index 9fb25d41844..5137f41d43a 100644 --- a/source/blender/python/intern/bpy_operator_wrap.c +++ b/source/blender/python/intern/bpy_operator_wrap.c @@ -68,7 +68,7 @@ static void operator_properties_init(wmOperatorType *ot) if (bl_property) { if (PyUnicode_Check(bl_property)) { /* since the property is explicitly given, raise an error if its not found */ - prop_id = _PyUnicode_AsString(bl_property); + prop_id = PyUnicode_AsUTF8(bl_property); prop_raise_error = true; } else { diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c index 354086ef4c3..b2812e0eba7 100644 --- a/source/blender/python/intern/bpy_props.c +++ b/source/blender/python/intern/bpy_props.c @@ -193,6 +193,126 @@ static const EnumPropertyItem property_subtype_array_items[] = { "'XYZ', 'XYZ_LENGTH', 'COLOR_GAMMA', 'COORDINATES', 'LAYER', 'LAYER_MEMBER', 'NONE'].\n" \ " :type subtype: string\n" +/* -------------------------------------------------------------------- */ +/** \name Deferred Property Type + * + * Operators and classes use this so it can store the arguments given but defer + * running it until the operator runs where these values are used to setup + * the default arguments for that operator instance. + * \{ */ + +static void bpy_prop_deferred_dealloc(BPy_PropDeferred *self) +{ + if (self->kw) { + PyObject_GC_UnTrack(self); + Py_CLEAR(self->kw); + } + PyObject_GC_Del(self); +} + +static int bpy_prop_deferred_traverse(BPy_PropDeferred *self, visitproc visit, void *arg) +{ + Py_VISIT(self->kw); + return 0; +} + +static int bpy_prop_deferred_clear(BPy_PropDeferred *self) +{ + Py_CLEAR(self->kw); + return 0; +} + +static PyObject *bpy_prop_deferred_repr(BPy_PropDeferred *self) +{ + return PyUnicode_FromFormat("<%.200s, %R, %R>", Py_TYPE(self)->tp_name, self->fn, self->kw); +} + +/** + * HACK: needed by `typing.get_type_hints` + * with `from __future__ import annotations` enabled or when using Python 3.10 or newer. + * + * When callable this object type passes the test for being an acceptable annotation. + */ +static PyObject *bpy_prop_deferred_call(BPy_PropDeferred *UNUSED(self), + PyObject *UNUSED(args), + PyObject *UNUSED(kw)) +{ + /* Dummy value. */ + Py_RETURN_NONE; +} + +/* Get/Set Items. */ + +/** + * Expose the function in case scripts need to introspect this information + * (not currently used by Blender it's self). + */ +static PyObject *bpy_prop_deferred_function_get(BPy_PropDeferred *self, void *UNUSED(closure)) +{ + PyObject *ret = self->fn; + Py_IncRef(ret); + return ret; +} + +/** + * Expose keywords in case scripts need to introspect this information + * (not currently used by Blender it's self). + */ +static PyObject *bpy_prop_deferred_keywords_get(BPy_PropDeferred *self, void *UNUSED(closure)) +{ + PyObject *ret = self->kw; + Py_IncRef(ret); + return ret; +} + +static PyGetSetDef bpy_prop_deferred_getset[] = { + {"function", (getter)bpy_prop_deferred_function_get, (setter)NULL, NULL, NULL}, + {"keywords", (getter)bpy_prop_deferred_keywords_get, (setter)NULL, NULL, NULL}, + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ +}; + +PyDoc_STRVAR(bpy_prop_deferred_doc, + "Intermediate storage for properties before registration.\n" + "\n" + ".. note::\n" + "\n" + " This is not part of the stable API and may change between releases."); + +PyTypeObject bpy_prop_deferred_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + + .tp_name = "_PropertyDeferred", + .tp_basicsize = sizeof(BPy_PropDeferred), + .tp_dealloc = (destructor)bpy_prop_deferred_dealloc, + .tp_repr = (reprfunc)bpy_prop_deferred_repr, + .tp_call = (ternaryfunc)bpy_prop_deferred_call, + + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + + .tp_doc = bpy_prop_deferred_doc, + .tp_traverse = (traverseproc)bpy_prop_deferred_traverse, + .tp_clear = (inquiry)bpy_prop_deferred_clear, + + .tp_getset = bpy_prop_deferred_getset, +}; + +static PyObject *bpy_prop_deferred_data_CreatePyObject(PyObject *fn, PyObject *kw) +{ + BPy_PropDeferred *self = PyObject_GC_New(BPy_PropDeferred, &bpy_prop_deferred_Type); + self->fn = fn; + if (kw == NULL) { + kw = PyDict_New(); + } + else { + Py_INCREF(kw); + } + self->kw = kw; + PyObject_GC_Track(self); + return (PyObject *)self; +} + +/** \} */ + /* PyObject's */ static PyObject *pymeth_BoolProperty = NULL; static PyObject *pymeth_BoolVectorProperty = NULL; @@ -248,27 +368,6 @@ static void bpy_prop_assign_flag_override(PropertyRNA *prop, const int flag_over RNA_def_property_override_flag(prop, flag_override); } -/* operators and classes use this so it can store the args given but defer - * running it until the operator runs where these values are used to setup - * the default args for that operator instance */ -static PyObject *bpy_prop_deferred_return(PyObject *func, PyObject *kw) -{ - PyObject *ret = PyTuple_New(2); - PyTuple_SET_ITEM(ret, 0, func); - Py_INCREF(func); - - if (kw == NULL) { - kw = PyDict_New(); - } - else { - Py_INCREF(kw); - } - - PyTuple_SET_ITEM(ret, 1, kw); - - return ret; -} - /* callbacks */ static void bpy_prop_update_cb(struct bContext *C, struct PointerRNA *ptr, @@ -1152,7 +1251,7 @@ static void bpy_prop_string_get_cb(struct PointerRNA *ptr, struct PropertyRNA *p } else { Py_ssize_t length; - const char *buffer = _PyUnicode_AsStringAndSize(ret, &length); + const char *buffer = PyUnicode_AsUTF8AndSize(ret, &length); memcpy(value, buffer, length + 1); Py_DECREF(ret); } @@ -1213,7 +1312,7 @@ static int bpy_prop_string_length_cb(struct PointerRNA *ptr, struct PropertyRNA } else { Py_ssize_t length_ssize_t = 0; - _PyUnicode_AsStringAndSize(ret, &length_ssize_t); + PyUnicode_AsUTF8AndSize(ret, &length_ssize_t); length = length_ssize_t; Py_DECREF(ret); } @@ -1488,7 +1587,7 @@ static const EnumPropertyItem *enum_items_from_py(PyObject *seq_fast, else { if (def) { if (!py_long_as_int(def, &def_int_cmp)) { - def_string_cmp = _PyUnicode_AsString(def); + def_string_cmp = PyUnicode_AsUTF8(def); if (def_string_cmp == NULL) { PyErr_Format(PyExc_TypeError, "EnumProperty(...): default option must be a 'str' or 'int' " @@ -1517,14 +1616,13 @@ static const EnumPropertyItem *enum_items_from_py(PyObject *seq_fast, if ((PyTuple_CheckExact(item)) && (item_size = PyTuple_GET_SIZE(item)) && (item_size >= 3 && item_size <= 5) && - (tmp.identifier = _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 0), &id_str_size)) && - (tmp.name = _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 1), &name_str_size)) && - (tmp.description = _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 2), - &desc_str_size)) && + (tmp.identifier = PyUnicode_AsUTF8AndSize(PyTuple_GET_ITEM(item, 0), &id_str_size)) && + (tmp.name = PyUnicode_AsUTF8AndSize(PyTuple_GET_ITEM(item, 1), &name_str_size)) && + (tmp.description = PyUnicode_AsUTF8AndSize(PyTuple_GET_ITEM(item, 2), &desc_str_size)) && /* TODO, number isn't ensured to be unique from the script author */ (item_size != 4 || py_long_as_int(PyTuple_GET_ITEM(item, 3), &tmp.value)) && (item_size != 5 || ((py_long_as_int(PyTuple_GET_ITEM(item, 3), &tmp.icon) || - (tmp_icon = _PyUnicode_AsString(PyTuple_GET_ITEM(item, 3)))) && + (tmp_icon = PyUnicode_AsUTF8(PyTuple_GET_ITEM(item, 3)))) && py_long_as_int(PyTuple_GET_ITEM(item, 4), &tmp.value)))) { if (is_enum_flag) { if (item_size < 4) { @@ -1998,7 +2096,7 @@ static void bpy_prop_callback_assign_enum(struct PropertyRNA *prop, if (PyErr_Occurred()) { \ return NULL; \ } \ - return bpy_prop_deferred_return(pymeth_##_func, kw); \ + return bpy_prop_deferred_data_CreatePyObject(pymeth_##_func, kw); \ } \ (void)0 @@ -3301,7 +3399,7 @@ StructRNA *pointer_type_from_py(PyObject *value, const char *error_prefix) if (!srna) { if (PyErr_Occurred()) { PyObject *msg = PyC_ExceptionBuffer(); - const char *msg_char = _PyUnicode_AsString(msg); + const char *msg_char = PyUnicode_AsUTF8(msg); PyErr_Format( PyExc_TypeError, "%.200s expected an RNA type, failed with: %s", error_prefix, msg_char); Py_DECREF(msg); @@ -3669,5 +3767,10 @@ PyObject *BPY_rna_props(void) ASSIGN_STATIC(CollectionProperty); ASSIGN_STATIC(RemoveProperty); + if (PyType_Ready(&bpy_prop_deferred_Type) < 0) { + return NULL; + } + PyModule_AddType(submodule, &bpy_prop_deferred_Type); + return submodule; } diff --git a/source/blender/python/intern/bpy_props.h b/source/blender/python/intern/bpy_props.h index 3d7860dcdd8..6cebf82d373 100644 --- a/source/blender/python/intern/bpy_props.h +++ b/source/blender/python/intern/bpy_props.h @@ -30,6 +30,16 @@ PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *kw); PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject *kw); StructRNA *pointer_type_from_py(PyObject *value, const char *error_prefix); +typedef struct { + PyObject_HEAD + /* This isn't GC tracked, it's a function from `bpy.props` so it's not going away. */ + void *fn; + PyObject *kw; +} BPy_PropDeferred; + +extern PyTypeObject bpy_prop_deferred_Type; +#define BPy_PropDeferred_CheckTypeExact(v) (Py_TYPE(v) == &bpy_prop_deferred_Type) + #define PYRNA_STACK_ARRAY RNA_STACK_ARRAY #ifdef __cplusplus diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 39ba8448795..189d8308c14 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -80,6 +80,15 @@ #define USE_MATHUTILS #define USE_STRING_COERCE +/** + * This _must_ be enabled to support Python 3.10's postponed annotations, + * `from __future__ import annotations`. + * + * This has the disadvantage of evaluating strings at run-time, in the future we might be able to + * reinstate the older, more efficient logic using descriptors, see: pep-0649 + */ +#define USE_POSTPONED_ANNOTATIONS + /* Unfortunately Python needs to hold a global reference to the context. * If we remove this is means `bpy.context` won't be usable from some parts of the code: * `bpy.app.handler` callbacks for example. @@ -90,6 +99,9 @@ BPy_StructRNA *bpy_context_module = NULL; /* for fast access */ static PyObject *pyrna_struct_Subtype(PointerRNA *ptr); static PyObject *pyrna_prop_collection_values(BPy_PropertyRNA *self); +static PyObject *pyrna_register_class(PyObject *self, PyObject *py_class); +static PyObject *pyrna_unregister_class(PyObject *self, PyObject *py_class); + #define BPY_DOC_ID_PROP_TYPE_NOTE \ " .. note::\n" \ "\n" \ @@ -323,7 +335,7 @@ static bool rna_id_write_error(PointerRNA *ptr, PyObject *key) const char *idtype = BKE_idtype_idcode_to_name(idcode); const char *pyname; if (key && PyUnicode_Check(key)) { - pyname = _PyUnicode_AsString(key); + pyname = PyUnicode_AsUTF8(key); } else { pyname = ""; @@ -1252,7 +1264,7 @@ static const char *pyrna_enum_as_string(PointerRNA *ptr, PropertyRNA *prop) static int pyrna_string_to_enum( PyObject *item, PointerRNA *ptr, PropertyRNA *prop, int *r_value, const char *error_prefix) { - const char *param = _PyUnicode_AsString(item); + const char *param = PyUnicode_AsUTF8(item); if (param == NULL) { PyErr_Format(PyExc_TypeError, @@ -1299,7 +1311,7 @@ BLI_bitmap *pyrna_set_to_enum_bitmap(const EnumPropertyItem *items, BLI_bitmap *bitmap = BLI_BITMAP_NEW(bitmap_size, __func__); while (_PySet_NextEntry(value, &pos, &key, &hash)) { - const char *param = _PyUnicode_AsString(key); + const char *param = PyUnicode_AsUTF8(key); if (param == NULL) { PyErr_Format(PyExc_TypeError, "%.200s expected a string, not %.200s", @@ -1364,7 +1376,7 @@ int pyrna_set_to_enum_bitfield(const EnumPropertyItem *items, *r_value = 0; while (_PySet_NextEntry(value, &pos, &key, &hash)) { - const char *param = _PyUnicode_AsString(key); + const char *param = PyUnicode_AsUTF8(key); if (param == NULL) { PyErr_Format(PyExc_TypeError, @@ -1662,7 +1674,7 @@ int pyrna_pydict_to_props(PointerRNA *ptr, Py_ssize_t pos = 0; while (PyDict_Next(kw, &pos, &key, &value)) { - arg_name = _PyUnicode_AsString(key); + arg_name = PyUnicode_AsUTF8(key); if (RNA_struct_find_property(ptr, arg_name) == NULL) { break; } @@ -1871,10 +1883,10 @@ static int pyrna_py_to_prop( param = PyC_UnicodeAsByte(value, &value_coerce); } else { - param = _PyUnicode_AsString(value); + param = PyUnicode_AsUTF8(value); } #else /* USE_STRING_COERCE */ - param = _PyUnicode_AsString(value); + param = PyUnicode_AsUTF8(value); #endif /* USE_STRING_COERCE */ if (param == NULL) { @@ -2186,7 +2198,7 @@ static int pyrna_py_to_prop( if (pyrna_pydict_to_props( &itemptr, item, true, "Converting a Python list to an RNA collection") == -1) { PyObject *msg = PyC_ExceptionBuffer(); - const char *msg_char = _PyUnicode_AsString(msg); + const char *msg_char = PyUnicode_AsUTF8(msg); PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s error converting a member of a collection " @@ -2490,7 +2502,7 @@ static int pyrna_prop_collection_subscript_str_lib_pair_ptr(BPy_PropertyRNA *sel RNA_struct_identifier(self->ptr.type)); return -1; } - if ((keyname = _PyUnicode_AsString(PyTuple_GET_ITEM(key, 0))) == NULL) { + if ((keyname = PyUnicode_AsUTF8(PyTuple_GET_ITEM(key, 0))) == NULL) { PyErr_Format(PyExc_KeyError, "%s: id must be a string, not %.200s", err_prefix, @@ -2507,7 +2519,7 @@ static int pyrna_prop_collection_subscript_str_lib_pair_ptr(BPy_PropertyRNA *sel } else if (PyUnicode_Check(keylib)) { Main *bmain = self->ptr.data; - const char *keylib_str = _PyUnicode_AsString(keylib); + const char *keylib_str = PyUnicode_AsUTF8(keylib); lib = BLI_findstring(&bmain->libraries, keylib_str, offsetof(Library, filepath)); if (lib == NULL) { if (err_not_found) { @@ -2711,7 +2723,7 @@ static PyObject *pyrna_prop_collection_subscript(BPy_PropertyRNA *self, PyObject PYRNA_PROP_CHECK_OBJ(self); if (PyUnicode_Check(key)) { - return pyrna_prop_collection_subscript_str(self, _PyUnicode_AsString(key)); + return pyrna_prop_collection_subscript_str(self, PyUnicode_AsUTF8(key)); } if (PyIndex_Check(key)) { const Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError); @@ -2838,7 +2850,7 @@ static int pyrna_prop_collection_ass_subscript(BPy_PropertyRNA *self, #if 0 if (PyUnicode_Check(key)) { - return pyrna_prop_collection_subscript_str(self, _PyUnicode_AsString(key)); + return pyrna_prop_collection_subscript_str(self, PyUnicode_AsUTF8(key)); } else #endif @@ -2910,7 +2922,7 @@ static PyObject *pyrna_prop_array_subscript(BPy_PropertyArrayRNA *self, PyObject #if 0 if (PyUnicode_Check(key)) { - return pyrna_prop_array_subscript_str(self, _PyUnicode_AsString(key)); + return pyrna_prop_array_subscript_str(self, PyUnicode_AsUTF8(key)); } else #endif @@ -3359,7 +3371,7 @@ static int pyrna_prop_collection_contains(BPy_PropertyRNA *self, PyObject *key) } /* Key in dict style check. */ - const char *keyname = _PyUnicode_AsString(key); + const char *keyname = PyUnicode_AsUTF8(key); if (keyname == NULL) { PyErr_SetString(PyExc_TypeError, @@ -3377,7 +3389,7 @@ static int pyrna_prop_collection_contains(BPy_PropertyRNA *self, PyObject *key) static int pyrna_struct_contains(BPy_StructRNA *self, PyObject *value) { IDProperty *group; - const char *name = _PyUnicode_AsString(value); + const char *name = PyUnicode_AsUTF8(value); PYRNA_STRUCT_CHECK_INT(self); @@ -3447,7 +3459,7 @@ static PyObject *pyrna_struct_subscript(BPy_StructRNA *self, PyObject *key) { /* Mostly copied from BPy_IDGroup_Map_GetItem. */ IDProperty *group, *idprop; - const char *name = _PyUnicode_AsString(key); + const char *name = PyUnicode_AsUTF8(key); PYRNA_STRUCT_CHECK_OBJ(self); @@ -4231,7 +4243,7 @@ static PyObject *pyrna_struct_dir(BPy_StructRNA *self) /* ---------------getattr-------------------------------------------- */ static PyObject *pyrna_struct_getattro(BPy_StructRNA *self, PyObject *pyname) { - const char *name = _PyUnicode_AsString(pyname); + const char *name = PyUnicode_AsUTF8(pyname); PyObject *ret; PropertyRNA *prop; FunctionRNA *func; @@ -4353,12 +4365,6 @@ static int pyrna_struct_pydict_contains(PyObject *self, PyObject *pyname) #endif /* --------------- setattr------------------------------------------- */ -static bool pyrna_is_deferred_prop(const PyObject *value) -{ - return PyTuple_CheckExact(value) && PyTuple_GET_SIZE(value) == 2 && - PyCFunction_Check(PyTuple_GET_ITEM(value, 0)) && - PyDict_CheckExact(PyTuple_GET_ITEM(value, 1)); -} #if 0 static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr) @@ -4370,15 +4376,15 @@ static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr * >>> bpy.types.Scene.foo * * ...rather than returning the deferred class register tuple - * as checked by pyrna_is_deferred_prop() + * as checked by BPy_PropDeferred_CheckTypeExact() * * Disable for now, * this is faking internal behavior in a way that's too tricky to maintain well. */ # if 0 - if ((ret == NULL) /* || pyrna_is_deferred_prop(ret) */ ) { + if ((ret == NULL) /* || BPy_PropDeferred_CheckTypeExact(ret) */ ) { StructRNA *srna = srna_from_self(cls, "StructRNA.__getattr__"); if (srna) { - PropertyRNA *prop = RNA_struct_type_find_property(srna, _PyUnicode_AsString(attr)); + PropertyRNA *prop = RNA_struct_type_find_property(srna, PyUnicode_AsUTF8(attr)); if (prop) { PointerRNA tptr; PyErr_Clear(); /* Clear error from tp_getattro. */ @@ -4396,8 +4402,8 @@ static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyObject *value) { StructRNA *srna = srna_from_self(cls, "StructRNA.__setattr__"); - const bool is_deferred_prop = (value && pyrna_is_deferred_prop(value)); - const char *attr_str = _PyUnicode_AsString(attr); + const bool is_deferred_prop = (value && BPy_PropDeferred_CheckTypeExact(value)); + const char *attr_str = PyUnicode_AsUTF8(attr); if (srna && !pyrna_write_check() && (is_deferred_prop || RNA_struct_type_find_property(srna, attr_str))) { @@ -4458,7 +4464,7 @@ static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyOb static int pyrna_struct_setattro(BPy_StructRNA *self, PyObject *pyname, PyObject *value) { - const char *name = _PyUnicode_AsString(pyname); + const char *name = PyUnicode_AsUTF8(pyname); PropertyRNA *prop = NULL; PYRNA_STRUCT_CHECK_INT(self); @@ -4550,7 +4556,7 @@ static PyObject *pyrna_prop_array_getattro(BPy_PropertyRNA *self, PyObject *pyna static PyObject *pyrna_prop_collection_getattro(BPy_PropertyRNA *self, PyObject *pyname) { - const char *name = _PyUnicode_AsString(pyname); + const char *name = PyUnicode_AsUTF8(pyname); if (name == NULL) { PyErr_SetString(PyExc_AttributeError, "bpy_prop_collection: __getattr__ must be a string"); @@ -4618,7 +4624,7 @@ static PyObject *pyrna_prop_collection_getattro(BPy_PropertyRNA *self, PyObject /* --------------- setattr------------------------------------------- */ static int pyrna_prop_collection_setattro(BPy_PropertyRNA *self, PyObject *pyname, PyObject *value) { - const char *name = _PyUnicode_AsString(pyname); + const char *name = PyUnicode_AsUTF8(pyname); PropertyRNA *prop; PointerRNA r_ptr; @@ -5015,7 +5021,7 @@ static PyObject *pyrna_prop_collection_get(BPy_PropertyRNA *self, PyObject *args } if (PyUnicode_Check(key_ob)) { - const char *key = _PyUnicode_AsString(key_ob); + const char *key = PyUnicode_AsUTF8(key_ob); if (RNA_property_collection_lookup_string(&self->ptr, self->prop, key, &newptr)) { return pyrna_struct_CreatePyObject(&newptr); @@ -5050,7 +5056,7 @@ PyDoc_STRVAR(pyrna_prop_collection_find_doc, static PyObject *pyrna_prop_collection_find(BPy_PropertyRNA *self, PyObject *key_ob) { Py_ssize_t key_len_ssize_t; - const char *key = _PyUnicode_AsStringAndSize(key_ob, &key_len_ssize_t); + const char *key = PyUnicode_AsUTF8AndSize(key_ob, &key_len_ssize_t); const int key_len = (int)key_len_ssize_t; /* Compare with same type. */ char name[256], *nameptr; @@ -6035,7 +6041,7 @@ static PyObject *small_dict_get_item_string(PyObject *dict, const char *key_look while (PyDict_Next(dict, &pos, &key, &value)) { if (PyUnicode_Check(key)) { - if (STREQ(key_lookup, _PyUnicode_AsString(key))) { + if (STREQ(key_lookup, PyUnicode_AsUTF8(key))) { return value; } } @@ -6189,7 +6195,7 @@ static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject #ifdef DEBUG_STRING_FREE if (item) { if (PyUnicode_Check(item)) { - PyList_APPEND(string_free_ls, PyUnicode_FromString(_PyUnicode_AsString(item))); + PyList_APPEND(string_free_ls, PyUnicode_FromString(PyUnicode_AsUTF8(item))); } } #endif @@ -6245,7 +6251,7 @@ static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject while (PyDict_Next(kw, &pos, &key, &value)) { - arg_name = _PyUnicode_AsString(key); + arg_name = PyUnicode_AsUTF8(key); found = false; if (arg_name == NULL) { /* Unlikely the argname is not a string, but ignore if it is. */ @@ -6404,11 +6410,7 @@ PyTypeObject pyrna_struct_meta_idprop_Type = { 0, /* tp_itemsize */ /* methods */ NULL, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif + 0, /* tp_vectorcall_offset */ NULL, /* getattrfunc tp_getattr; */ NULL, /* setattrfunc tp_setattr; */ NULL, @@ -6460,7 +6462,7 @@ PyTypeObject pyrna_struct_meta_idprop_Type = { #if defined(_MSC_VER) NULL, /* defer assignment */ #else - &PyType_Type, /* struct _typeobject *tp_base; */ + &PyType_Type, /* struct _typeobject *tp_base; */ #endif NULL, /* PyObject *tp_dict; */ NULL, /* descrgetfunc tp_descr_get; */ @@ -6489,13 +6491,9 @@ PyTypeObject pyrna_struct_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)pyrna_struct_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ + 0, /* tp_vectorcall_offset */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ NULL, /* tp_compare */ /* DEPRECATED in Python 3.0! */ (reprfunc)pyrna_struct_repr, /* tp_repr */ @@ -6529,7 +6527,7 @@ PyTypeObject pyrna_struct_Type = { /* delete references to contained objects */ (inquiry)pyrna_struct_clear, /* inquiry tp_clear; */ #else - NULL, /* traverseproc tp_traverse; */ + NULL, /* traverseproc tp_traverse; */ /* delete references to contained objects */ NULL, /* inquiry tp_clear; */ @@ -6582,13 +6580,9 @@ PyTypeObject pyrna_prop_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)pyrna_prop_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ + 0, /* tp_vectorcall_offset */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ NULL, /* tp_compare */ /* DEPRECATED in Python 3.0! */ (reprfunc)pyrna_prop_repr, /* tp_repr */ @@ -6670,13 +6664,9 @@ PyTypeObject pyrna_prop_array_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)pyrna_prop_array_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ + 0, /* tp_vectorcall_offset */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ NULL, /* tp_compare */ /* DEPRECATED in Python 3.0! */ (reprfunc)pyrna_prop_array_repr, /* tp_repr */ @@ -6757,13 +6747,9 @@ PyTypeObject pyrna_prop_collection_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)pyrna_prop_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ + 0, /* tp_vectorcall_offset */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ NULL, /* tp_compare */ /* DEPRECATED in Python 3.0! */ NULL, @@ -6847,13 +6833,9 @@ static PyTypeObject pyrna_prop_collection_idprop_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)pyrna_prop_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ + 0, /* tp_vectorcall_offset */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ NULL, /* tp_compare */ /* DEPRECATED in Python 3.0! */ NULL, @@ -6937,11 +6919,7 @@ PyTypeObject pyrna_func_Type = { 0, /* tp_itemsize */ /* methods */ NULL, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif + 0, /* tp_vectorcall_offset */ NULL, /* getattrfunc tp_getattr; */ NULL, /* setattrfunc tp_setattr; */ NULL, @@ -7037,13 +7015,9 @@ static PyTypeObject pyrna_prop_collection_iter_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)pyrna_prop_collection_iter_dealloc, /* tp_dealloc */ -# if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -# else - (printfunc)NULL, /* printfunc tp_print */ -# endif - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ + 0, /* tp_vectorcall_offset */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ NULL, /* tp_compare */ /* DEPRECATED in Python 3.0! */ NULL, @@ -7689,32 +7663,47 @@ PyObject *BPY_rna_doc(void) } #endif -/* pyrna_basetype_* - BPy_BaseTypeRNA is just a BPy_PropertyRNA struct with a different type - * the self->ptr and self->prop are always set to the "structs" collection */ -/* ---------------getattr-------------------------------------------- */ -static PyObject *pyrna_basetype_getattro(BPy_BaseTypeRNA *self, PyObject *pyname) +/* -------------------------------------------------------------------- */ +/** \name RNA Types Module `bpy.types` + * \{ */ + +/** + * This could be a static variable as we only have one `bpy.types` module, + * it just keeps the data isolated to store in the module it's self. + * + * This data doesn't change one initialized. + */ +struct BPy_TypesModule_State { + /** `RNA_BlenderRNA`. */ + PointerRNA ptr; + /** `RNA_BlenderRNA.structs`, exposed as `bpy.types` */ + PropertyRNA *prop; +}; + +static PyObject *bpy_types_module_getattro(PyObject *self, PyObject *pyname) { + struct BPy_TypesModule_State *state = PyModule_GetState(self); PointerRNA newptr; PyObject *ret; - const char *name = _PyUnicode_AsString(pyname); + const char *name = PyUnicode_AsUTF8(pyname); if (name == NULL) { PyErr_SetString(PyExc_AttributeError, "bpy.types: __getattr__ must be a string"); ret = NULL; } - else if (RNA_property_collection_lookup_string(&self->ptr, self->prop, name, &newptr)) { + else if (RNA_property_collection_lookup_string(&state->ptr, state->prop, name, &newptr)) { ret = pyrna_struct_Subtype(&newptr); if (ret == NULL) { PyErr_Format(PyExc_RuntimeError, "bpy.types.%.200s subtype could not be generated, this is a bug!", - _PyUnicode_AsString(pyname)); + PyUnicode_AsUTF8(pyname)); } } else { #if 0 PyErr_Format(PyExc_AttributeError, "bpy.types.%.200s RNA_Struct does not exist", - _PyUnicode_AsString(pyname)); + PyUnicode_AsUTF8(pyname)); return NULL; #endif /* The error raised here will be displayed. */ @@ -7724,79 +7713,60 @@ static PyObject *pyrna_basetype_getattro(BPy_BaseTypeRNA *self, PyObject *pyname return ret; } -static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self); -static PyObject *pyrna_register_class(PyObject *self, PyObject *py_class); -static PyObject *pyrna_unregister_class(PyObject *self, PyObject *py_class); - -static struct PyMethodDef pyrna_basetype_methods[] = { - {"__dir__", (PyCFunction)pyrna_basetype_dir, METH_NOARGS, ""}, - {NULL, NULL, 0, NULL}, -}; - -/* Used to call ..._keys() direct, but we need to filter out operator subclasses. */ -#if 0 -static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self) -{ - PyObject *list; -# if 0 - PyMethodDef *meth; -# endif - - list = pyrna_prop_collection_keys(self); /* Like calling structs.keys(), avoids looping here. */ - -# if 0 /* For now only contains __dir__. */ - for (meth = pyrna_basetype_methods; meth->ml_name; meth++) { - PyList_APPEND(list, PyUnicode_FromString(meth->ml_name)); - } -# endif - return list; -} - -#else - -static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self) +static PyObject *bpy_types_module_dir(PyObject *self) { + struct BPy_TypesModule_State *state = PyModule_GetState(self); PyObject *ret = PyList_New(0); - RNA_PROP_BEGIN (&self->ptr, itemptr, self->prop) { + RNA_PROP_BEGIN (&state->ptr, itemptr, state->prop) { StructRNA *srna = itemptr.data; PyList_APPEND(ret, PyUnicode_FromString(RNA_struct_identifier(srna))); } RNA_PROP_END; + /* Include the modules `__dict__` for Python only types. */ + PyObject *submodule_dict = PyModule_GetDict(self); + PyObject *key, *value; + Py_ssize_t pos = 0; + while (PyDict_Next(submodule_dict, &pos, &key, &value)) { + PyList_Append(ret, key); + } return ret; } -#endif +static struct PyMethodDef bpy_types_module_methods[] = { + {"__getattr__", (PyCFunction)bpy_types_module_getattro, METH_O, NULL}, + {"__dir__", (PyCFunction)bpy_types_module_dir, METH_NOARGS, NULL}, + {NULL, NULL, 0, NULL}, +}; -static PyTypeObject pyrna_basetype_Type = BLANK_PYTHON_TYPE; +PyDoc_STRVAR(bpy_types_module_doc, "Access to internal Blender types"); +static struct PyModuleDef bpy_types_module_def = { + PyModuleDef_HEAD_INIT, + "bpy.types", /* m_name */ + bpy_types_module_doc, /* m_doc */ + sizeof(struct BPy_TypesModule_State), /* m_size */ + bpy_types_module_methods, /* m_methods */ + NULL, /* m_reload */ + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL, /* m_free */ +}; /** * Accessed from Python as 'bpy.types' */ PyObject *BPY_rna_types(void) { - BPy_BaseTypeRNA *self; + PyObject *submodule = PyModule_Create(&bpy_types_module_def); + struct BPy_TypesModule_State *state = PyModule_GetState(submodule); - if ((pyrna_basetype_Type.tp_flags & Py_TPFLAGS_READY) == 0) { - pyrna_basetype_Type.tp_name = "RNA_Types"; - pyrna_basetype_Type.tp_basicsize = sizeof(BPy_BaseTypeRNA); - pyrna_basetype_Type.tp_getattro = (getattrofunc)pyrna_basetype_getattro; - pyrna_basetype_Type.tp_flags = Py_TPFLAGS_DEFAULT; - pyrna_basetype_Type.tp_methods = pyrna_basetype_methods; - - if (PyType_Ready(&pyrna_basetype_Type) < 0) { - return NULL; - } - } - - /* Static members for the base class. */ - /* Add __name__ since help() expects it. */ - PyDict_SetItem(pyrna_basetype_Type.tp_dict, bpy_intern_str___name__, bpy_intern_str_bpy_types); + RNA_blender_rna_pointer_create(&state->ptr); + state->prop = RNA_struct_find_property(&state->ptr, "structs"); /* Internal base types we have no other accessors for. */ { - PyTypeObject *pyrna_types[] = { + static PyTypeObject *pyrna_types[] = { &pyrna_struct_meta_idprop_Type, &pyrna_struct_Type, &pyrna_prop_Type, @@ -7805,23 +7775,17 @@ PyObject *BPY_rna_types(void) &pyrna_func_Type, }; + PyObject *submodule_dict = PyModule_GetDict(submodule); for (int i = 0; i < ARRAY_SIZE(pyrna_types); i += 1) { - PyDict_SetItemString( - pyrna_basetype_Type.tp_dict, pyrna_types[i]->tp_name, (PyObject *)pyrna_types[i]); + PyDict_SetItemString(submodule_dict, pyrna_types[i]->tp_name, (PyObject *)pyrna_types[i]); } } - self = (BPy_BaseTypeRNA *)PyObject_NEW(BPy_BaseTypeRNA, &pyrna_basetype_Type); - - /* Avoid doing this lookup for every getattr. */ - RNA_blender_rna_pointer_create(&self->ptr); - self->prop = RNA_struct_find_property(&self->ptr, "structs"); -#ifdef USE_WEAKREFS - self->in_weakreflist = NULL; -#endif - return (PyObject *)self; + return submodule; } +/** \} */ + StructRNA *pyrna_struct_as_srna(PyObject *self, const bool parent, const char *error_prefix) { BPy_StructRNA *py_srna = NULL; @@ -7912,83 +7876,133 @@ StructRNA *srna_from_self(PyObject *self, const char *error_prefix) static int deferred_register_prop(StructRNA *srna, PyObject *key, PyObject *item) { + if (!BPy_PropDeferred_CheckTypeExact(item)) { + /* No error, ignoring. */ + return 0; + } + /* We only care about results from C which * are for sure types, save some time with error */ - if (pyrna_is_deferred_prop(item)) { + PyObject *py_func = ((BPy_PropDeferred *)item)->fn; + PyObject *py_kw = ((BPy_PropDeferred *)item)->kw; + PyObject *py_srna_cobject, *py_ret; - PyObject *py_func, *py_kw, *py_srna_cobject, *py_ret; + PyObject *args_fake; - if (PyArg_ParseTuple(item, "OO!", &py_func, &PyDict_Type, &py_kw)) { - PyObject *args_fake; + if (*PyUnicode_AsUTF8(key) == '_') { + PyErr_Format(PyExc_ValueError, + "bpy_struct \"%.200s\" registration error: " + "%.200s could not register because the property starts with an '_'\n", + RNA_struct_identifier(srna), + PyUnicode_AsUTF8(key)); + return -1; + } + py_srna_cobject = PyCapsule_New(srna, NULL, NULL); - if (*_PyUnicode_AsString(key) == '_') { - PyErr_Format(PyExc_ValueError, - "bpy_struct \"%.200s\" registration error: " - "%.200s could not register because the property starts with an '_'\n", - RNA_struct_identifier(srna), - _PyUnicode_AsString(key)); - return -1; - } - py_srna_cobject = PyCapsule_New(srna, NULL, NULL); + /* Not 100% nice :/, modifies the dict passed, should be ok. */ + PyDict_SetItem(py_kw, bpy_intern_str_attr, key); - /* Not 100% nice :/, modifies the dict passed, should be ok. */ - PyDict_SetItem(py_kw, bpy_intern_str_attr, key); + args_fake = PyTuple_New(1); + PyTuple_SET_ITEM(args_fake, 0, py_srna_cobject); - args_fake = PyTuple_New(1); - PyTuple_SET_ITEM(args_fake, 0, py_srna_cobject); - - PyObject *type = PyDict_GetItemString(py_kw, "type"); - StructRNA *type_srna = srna_from_self(type, ""); - if (type_srna) { - if (!RNA_struct_idprops_datablock_allowed(srna) && - (*(PyCFunctionWithKeywords)PyCFunction_GET_FUNCTION(py_func) == BPy_PointerProperty || - *(PyCFunctionWithKeywords)PyCFunction_GET_FUNCTION(py_func) == - BPy_CollectionProperty) && - RNA_struct_idprops_contains_datablock(type_srna)) { - PyErr_Format(PyExc_ValueError, - "bpy_struct \"%.200s\" doesn't support datablock properties\n", - RNA_struct_identifier(srna)); - return -1; - } - } - - py_ret = PyObject_Call(py_func, args_fake, py_kw); - - if (py_ret) { - Py_DECREF(py_ret); - Py_DECREF(args_fake); /* Free's py_srna_cobject too. */ - } - else { - /* _must_ print before decreffing args_fake. */ - PyErr_Print(); - PyErr_Clear(); - - Py_DECREF(args_fake); /* Free's py_srna_cobject too. */ - - // PyC_LineSpit(); - PyErr_Format(PyExc_ValueError, - "bpy_struct \"%.200s\" registration error: " - "%.200s could not register\n", - RNA_struct_identifier(srna), - _PyUnicode_AsString(key)); - return -1; - } - } - else { - /* Since this is a class dict, ignore args that can't be passed. */ - - /* For testing only. */ -#if 0 - PyC_ObSpit("Why doesn't this work??", item); - PyErr_Print(); -#endif - PyErr_Clear(); + PyObject *type = PyDict_GetItemString(py_kw, "type"); + StructRNA *type_srna = srna_from_self(type, ""); + if (type_srna) { + if (!RNA_struct_idprops_datablock_allowed(srna) && + (*(PyCFunctionWithKeywords)PyCFunction_GET_FUNCTION(py_func) == BPy_PointerProperty || + *(PyCFunctionWithKeywords)PyCFunction_GET_FUNCTION(py_func) == BPy_CollectionProperty) && + RNA_struct_idprops_contains_datablock(type_srna)) { + PyErr_Format(PyExc_ValueError, + "bpy_struct \"%.200s\" doesn't support datablock properties\n", + RNA_struct_identifier(srna)); + return -1; } } + py_ret = PyObject_Call(py_func, args_fake, py_kw); + + if (py_ret) { + Py_DECREF(py_ret); + Py_DECREF(args_fake); /* Free's py_srna_cobject too. */ + } + else { + /* _must_ print before decreffing args_fake. */ + PyErr_Print(); + PyErr_Clear(); + + Py_DECREF(args_fake); /* Free's py_srna_cobject too. */ + + // PyC_LineSpit(); + PyErr_Format(PyExc_ValueError, + "bpy_struct \"%.200s\" registration error: " + "%.200s could not register\n", + RNA_struct_identifier(srna), + PyUnicode_AsUTF8(key)); + return -1; + } + return 0; } +/** + * Extract `__annotations__` using `typing.get_type_hints` which handles the delayed evaluation. + */ +static int pyrna_deferred_register_class_from_type_hints(StructRNA *srna, PyTypeObject *py_class) +{ + PyObject *annotations_dict = NULL; + + /* `typing.get_type_hints(py_class)` */ + { + PyObject *typing_mod = PyImport_ImportModuleLevel("typing", NULL, NULL, NULL, 0); + if (typing_mod != NULL) { + PyObject *get_type_hints_fn = PyObject_GetAttrString(typing_mod, "get_type_hints"); + if (get_type_hints_fn != NULL) { + PyObject *args = PyTuple_New(1); + + PyTuple_SET_ITEM(args, 0, (PyObject *)py_class); + Py_INCREF(py_class); + + annotations_dict = PyObject_CallObject(get_type_hints_fn, args); + + Py_DECREF(args); + Py_DECREF(get_type_hints_fn); + } + Py_DECREF(typing_mod); + } + } + + int ret = 0; + if (annotations_dict != NULL) { + if (PyDict_CheckExact(annotations_dict)) { + PyObject *item, *key; + Py_ssize_t pos = 0; + + while (PyDict_Next(annotations_dict, &pos, &key, &item)) { + ret = deferred_register_prop(srna, key, item); + if (ret != 0) { + break; + } + } + } + else { + /* Should never happen, an error wont have been raised, so raise one. */ + PyErr_Format(PyExc_TypeError, + "typing.get_type_hints returned: %.200s, expected dict\n", + Py_TYPE(annotations_dict)->tp_name); + ret = -1; + } + + Py_DECREF(annotations_dict); + } + else { + BLI_assert(PyErr_Occurred()); + fprintf(stderr, "typing.get_type_hints failed with: %.200s\n", py_class->tp_name); + ret = -1; + } + + return ret; +} + static int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict) { PyObject *annotations_dict; @@ -8009,31 +8023,6 @@ static int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict) } } - if (ret == 0) { - /* This block can be removed once 2.8x is released and annotations are in use. */ - bool has_warning = false; - while (PyDict_Next(class_dict, &pos, &key, &item)) { - if (pyrna_is_deferred_prop(item)) { - if (!has_warning) { - printf( - "Warning: class %.200s " - "contains a property which should be an annotation!\n", - RNA_struct_identifier(srna)); - PyC_LineSpit(); - has_warning = true; - } - printf(" assign as a type annotation: %.200s.%.200s\n", - RNA_struct_identifier(srna), - _PyUnicode_AsString(key)); - } - ret = deferred_register_prop(srna, key, item); - - if (ret != 0) { - break; - } - } - } - return ret; } @@ -8078,6 +8067,15 @@ int pyrna_deferred_register_class(StructRNA *srna, PyTypeObject *py_class) return 0; } +#ifdef USE_POSTPONED_ANNOTATIONS + const bool use_postponed_annotations = true; +#else + const bool use_postponed_annotations = false; +#endif + + if (use_postponed_annotations) { + return pyrna_deferred_register_class_from_type_hints(srna, py_class); + } return pyrna_deferred_register_class_recursive(srna, py_class); } @@ -9120,7 +9118,7 @@ static PyObject *pyrna_bl_owner_id_set(PyObject *UNUSED(self), PyObject *value) name = NULL; } else if (PyUnicode_Check(value)) { - name = _PyUnicode_AsString(value); + name = PyUnicode_AsUTF8(value); } else { PyErr_Format(PyExc_ValueError, diff --git a/source/blender/python/intern/bpy_rna.h b/source/blender/python/intern/bpy_rna.h index a2c2171d151..e891f5c1fc1 100644 --- a/source/blender/python/intern/bpy_rna.h +++ b/source/blender/python/intern/bpy_rna.h @@ -177,9 +177,6 @@ typedef struct { FunctionRNA *func; } BPy_FunctionRNA; -/* cheap trick */ -#define BPy_BaseTypeRNA BPy_PropertyRNA - StructRNA *srna_from_self(PyObject *self, const char *error_prefix); StructRNA *pyrna_struct_as_srna(PyObject *self, const bool parent, const char *error_prefix); diff --git a/source/blender/python/intern/bpy_rna_callback.c b/source/blender/python/intern/bpy_rna_callback.c index 2f8be0c44e0..7f8ea54ab98 100644 --- a/source/blender/python/intern/bpy_rna_callback.c +++ b/source/blender/python/intern/bpy_rna_callback.c @@ -23,28 +23,24 @@ #include -#include "RNA_types.h" +#include "../generic/python_utildefines.h" -#include "BLI_utildefines.h" - -#include "bpy_capi_utils.h" -#include "bpy_rna.h" -#include "bpy_rna_callback.h" - -#include "DNA_screen_types.h" #include "DNA_space_types.h" #include "RNA_access.h" #include "RNA_enum_types.h" -#include "BKE_context.h" #include "BKE_screen.h" #include "WM_api.h" #include "ED_space_api.h" -#include "../generic/python_utildefines.h" +#include "BPY_extern.h" /* For public API. */ + +#include "bpy_capi_utils.h" +#include "bpy_rna.h" +#include "bpy_rna_callback.h" /* Own include. */ /* Use this to stop other capsules from being mis-used. */ static const char *rna_capsual_id = "RNA_HANDLE"; @@ -261,6 +257,12 @@ static eSpace_Type rna_Space_refine_reverse(StructRNA *srna) return SPACE_EMPTY; } +static void cb_rna_capsule_destructor(PyObject *capsule) +{ + PyObject *args = PyCapsule_GetContext(capsule); + Py_DECREF(args); +} + PyObject *pyrna_callback_classmethod_add(PyObject *UNUSED(self), PyObject *args) { void *handle; @@ -378,10 +380,14 @@ PyObject *pyrna_callback_classmethod_add(PyObject *UNUSED(self), PyObject *args) return NULL; } + /* Keep the 'args' reference as long as the callback exists. + * This reference is decremented in #BPY_callback_screen_free and #BPY_callback_wm_free. */ + Py_INCREF(args); + PyObject *ret = PyCapsule_New((void *)handle, rna_capsual_id, NULL); - /* Store 'args' in context as well as the handler custom-data, - * because the handle may be freed by Blender (new file, new window... etc) */ + /* Store 'args' in context as well for simple access. */ + PyCapsule_SetDestructor(ret, cb_rna_capsule_destructor); PyCapsule_SetContext(ret, args); Py_INCREF(args); @@ -412,7 +418,6 @@ PyObject *pyrna_callback_classmethod_remove(PyObject *UNUSED(self), PyObject *ar "callback_remove(handler): NULL handler given, invalid or already removed"); return NULL; } - PyObject *handle_args = PyCapsule_GetContext(py_handle); if (srna == &RNA_WindowManager) { if (!PyArg_ParseTuple( @@ -466,11 +471,52 @@ PyObject *pyrna_callback_classmethod_remove(PyObject *UNUSED(self), PyObject *ar return NULL; } + /* The handle has been removed, so decrement its customdata. */ + PyObject *handle_args = PyCapsule_GetContext(py_handle); + Py_DECREF(handle_args); + /* don't allow reuse */ if (capsule_clear) { - Py_DECREF(handle_args); + PyCapsule_Destructor destructor_fn = PyCapsule_GetDestructor(py_handle); + if (destructor_fn) { + destructor_fn(py_handle); + PyCapsule_SetDestructor(py_handle, NULL); + } PyCapsule_SetName(py_handle, rna_capsual_id_invalid); } Py_RETURN_NONE; } + +/* -------------------------------------------------------------------- */ +/** \name Public API + * \{ */ + +static void cb_customdata_free(void *customdata) +{ + PyObject *tuple = customdata; + bool use_gil = true; /* !PyC_IsInterpreterActive(); */ + + PyGILState_STATE gilstate; + if (use_gil) { + gilstate = PyGILState_Ensure(); + } + + Py_DECREF(tuple); + + if (use_gil) { + PyGILState_Release(gilstate); + } +} + +void BPY_callback_screen_free(struct ARegionType *art) +{ + ED_region_draw_cb_remove_by_type(art, cb_region_draw, cb_customdata_free); +} + +void BPY_callback_wm_free(struct wmWindowManager *wm) +{ + WM_paint_cursor_remove_by_type(wm, cb_wm_cursor_draw, cb_customdata_free); +} + +/** \} */ diff --git a/source/blender/python/intern/bpy_rna_id_collection.c b/source/blender/python/intern/bpy_rna_id_collection.c index bf6eba93b9f..d4127b26629 100644 --- a/source/blender/python/intern/bpy_rna_id_collection.c +++ b/source/blender/python/intern/bpy_rna_id_collection.c @@ -304,7 +304,7 @@ static PyObject *bpy_batch_remove(PyObject *UNUSED(self), PyObject *args, PyObje PyObject *ret = NULL; static const char *_keywords[] = {"ids", NULL}; - static _PyArg_Parser _parser = {"O:user_map", _keywords, 0}; + static _PyArg_Parser _parser = {"O:batch_remove", _keywords, 0}; if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, &ids)) { return ret; } @@ -353,12 +353,15 @@ PyDoc_STRVAR(bpy_orphans_purge_doc, "\n" " Remove (delete) all IDs with no user.\n" "\n" - " :return: The number of deleted IDs.\n" - "\n" - " WARNING: Considered experimental feature currently.\n"); -static PyObject *bpy_orphans_purge(PyObject *UNUSED(self), - PyObject *UNUSED(args), - PyObject *UNUSED(kwds)) + " :arg do_local_ids: Include unused local IDs in the deletion, defaults to True\n" + " :type do_local_ids: bool, optional\n" + " :arg do_linked_ids: Include unused linked IDs in the deletion, defaults to True\n" + " :type do_linked_ids: bool, optional\n" + " :arg do_recursive: Recursively check for unused IDs, ensuring no orphaned one " + "remain after a single run of that function, defaults to False\n" + " :type do_recursive: bool, optional\n" + " :return: The number of deleted IDs.\n"); +static PyObject *bpy_orphans_purge(PyObject *UNUSED(self), PyObject *args, PyObject *kwds) { #if 0 /* If someone knows how to get a proper 'self' in that case... */ BPy_StructRNA *pyrna = (BPy_StructRNA *)self; @@ -367,16 +370,26 @@ static PyObject *bpy_orphans_purge(PyObject *UNUSED(self), Main *bmain = G_MAIN; /* XXX Ugly, but should work! */ #endif - ID *id; - FOREACH_MAIN_ID_BEGIN (bmain, id) { - if (id->us == 0) { - id->tag |= LIB_TAG_DOIT; - } - else { - id->tag &= ~LIB_TAG_DOIT; - } + int num_tagged[INDEX_ID_MAX] = {0}; + + bool do_local_ids = true; + bool do_linked_ids = true; + bool do_recursive_cleanup = false; + + static const char *_keywords[] = {"do_local_ids", "do_linked_ids", "do_recursive", NULL}; + static _PyArg_Parser _parser = {"|$ppp:orphans_purge", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast( + args, kwds, &_parser, &do_local_ids, &do_linked_ids, &do_recursive_cleanup)) { + return NULL; + } + + /* Tag all IDs to delete. */ + BKE_lib_query_unused_ids_tag( + bmain, LIB_TAG_DOIT, do_local_ids, do_linked_ids, do_recursive_cleanup, num_tagged); + + if (num_tagged[INDEX_ID_NULL] == 0) { + return PyLong_FromSize_t(0); } - FOREACH_MAIN_ID_END; const size_t num_datablocks_deleted = BKE_id_multi_tagged_delete(bmain); /* Force full redraw, mandatory to avoid crashes when running this from UI... */ diff --git a/source/blender/python/intern/bpy_traceback.c b/source/blender/python/intern/bpy_traceback.c index e2c894e90f8..00b414e027e 100644 --- a/source/blender/python/intern/bpy_traceback.c +++ b/source/blender/python/intern/bpy_traceback.c @@ -149,7 +149,7 @@ void python_script_error_jump(const char *filepath, int *lineno, int *offset) PyObject *filename_py, *text_py; if (parse_syntax_error(value, &message, &filename_py, lineno, offset, &text_py)) { - const char *filename = _PyUnicode_AsString(filename_py); + const char *filename = PyUnicode_AsUTF8(filename_py); /* python adds a '/', prefix, so check for both */ if ((BLI_path_cmp(filename, filepath) == 0) || (ELEM(filename[0], '\\', '/') && BLI_path_cmp(filename + 1, filepath) == 0)) { diff --git a/source/blender/python/mathutils/mathutils.c b/source/blender/python/mathutils/mathutils.c index 1616bbeeea9..3791a6c2d29 100644 --- a/source/blender/python/mathutils/mathutils.c +++ b/source/blender/python/mathutils/mathutils.c @@ -784,11 +784,11 @@ PyMODINIT_FUNC PyInit_mathutils(void) mod = PyModule_Create(&M_Mathutils_module_def); /* each type has its own new() function */ - PyModule_AddObject(mod, vector_Type.tp_name, (PyObject *)&vector_Type); - PyModule_AddObject(mod, matrix_Type.tp_name, (PyObject *)&matrix_Type); - PyModule_AddObject(mod, euler_Type.tp_name, (PyObject *)&euler_Type); - PyModule_AddObject(mod, quaternion_Type.tp_name, (PyObject *)&quaternion_Type); - PyModule_AddObject(mod, color_Type.tp_name, (PyObject *)&color_Type); + PyModule_AddType(mod, &vector_Type); + PyModule_AddType(mod, &matrix_Type); + PyModule_AddType(mod, &euler_Type); + PyModule_AddType(mod, &quaternion_Type); + PyModule_AddType(mod, &color_Type); /* submodule */ PyModule_AddObject(mod, "geometry", (submodule = PyInit_mathutils_geometry())); diff --git a/source/blender/python/mathutils/mathutils_Euler.c b/source/blender/python/mathutils/mathutils_Euler.c index ebc71706bef..f2a8af18073 100644 --- a/source/blender/python/mathutils/mathutils_Euler.c +++ b/source/blender/python/mathutils/mathutils_Euler.c @@ -670,7 +670,7 @@ static int Euler_order_set(EulerObject *self, PyObject *value, void *UNUSED(clos return -1; } - if (((order_str = _PyUnicode_AsString(value)) == NULL) || + if (((order_str = PyUnicode_AsUTF8(value)) == NULL) || ((order = euler_order_from_string(order_str, "euler.order")) == -1)) { return -1; } diff --git a/source/blender/python/mathutils/mathutils_Matrix.c b/source/blender/python/mathutils/mathutils_Matrix.c index 87d16656d70..016ba462030 100644 --- a/source/blender/python/mathutils/mathutils_Matrix.c +++ b/source/blender/python/mathutils/mathutils_Matrix.c @@ -499,7 +499,7 @@ static PyObject *C_Matrix_Rotation(PyObject *cls, PyObject *args) } if (vec && PyUnicode_Check(vec)) { - axis = _PyUnicode_AsString((PyObject *)vec); + axis = PyUnicode_AsUTF8((PyObject *)vec); if (axis == NULL || axis[0] == '\0' || axis[1] != '\0' || axis[0] < 'X' || axis[0] > 'Z') { PyErr_SetString(PyExc_ValueError, "Matrix.Rotation(): " @@ -768,7 +768,7 @@ static PyObject *C_Matrix_OrthoProjection(PyObject *cls, PyObject *args) if (PyUnicode_Check(axis)) { /* ortho projection onto cardinal plane */ Py_ssize_t plane_len; - const char *plane = _PyUnicode_AsStringAndSize(axis, &plane_len); + const char *plane = PyUnicode_AsUTF8AndSize(axis, &plane_len); if (matSize == 2) { if (plane_len == 1 && plane[0] == 'X') { mat[0] = 1.0f; diff --git a/source/blender/python/mathutils/mathutils_Quaternion.c b/source/blender/python/mathutils/mathutils_Quaternion.c index 8d2ab614728..3bc60190d56 100644 --- a/source/blender/python/mathutils/mathutils_Quaternion.c +++ b/source/blender/python/mathutils/mathutils_Quaternion.c @@ -195,7 +195,7 @@ static PyObject *Quaternion_to_swing_twist(QuaternionObject *self, PyObject *axi int axis; if (axis_arg && PyUnicode_Check(axis_arg)) { - axis_str = _PyUnicode_AsString(axis_arg); + axis_str = PyUnicode_AsUTF8(axis_arg); } if (axis_str && axis_str[0] >= 'X' && axis_str[0] <= 'Z' && axis_str[1] == 0) { diff --git a/source/blender/python/mathutils/mathutils_Vector.c b/source/blender/python/mathutils/mathutils_Vector.c index 61487df1ab5..1766c7dea66 100644 --- a/source/blender/python/mathutils/mathutils_Vector.c +++ b/source/blender/python/mathutils/mathutils_Vector.c @@ -3042,15 +3042,11 @@ PyTypeObject vector_Type = { /* Methods to implement standard operations */ (destructor)BaseMathObject_dealloc, /* destructor tp_dealloc; */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ - NULL, /* cmpfunc tp_compare; */ - (reprfunc)Vector_repr, /* reprfunc tp_repr; */ + 0, /* tp_vectorcall_offset */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ + NULL, /* cmpfunc tp_compare; */ + (reprfunc)Vector_repr, /* reprfunc tp_repr; */ /* Method suites for standard classes */ @@ -3065,7 +3061,7 @@ PyTypeObject vector_Type = { #ifndef MATH_STANDALONE (reprfunc)Vector_str, /* reprfunc tp_str; */ #else - NULL, /* reprfunc tp_str; */ + NULL, /* reprfunc tp_str; */ #endif NULL, /* getattrofunc tp_getattro; */ NULL, /* setattrofunc tp_setattro; */ diff --git a/source/blender/python/mathutils/mathutils_bvhtree.c b/source/blender/python/mathutils/mathutils_bvhtree.c index 1d477421e30..1acbcc006ca 100644 --- a/source/blender/python/mathutils/mathutils_bvhtree.c +++ b/source/blender/python/mathutils/mathutils_bvhtree.c @@ -333,8 +333,8 @@ PyDoc_STRVAR(py_bvhtree_ray_cast_doc, "\n" " Cast a ray onto the mesh.\n" "\n" - " :arg co: Start location of the ray in object space.\n" - " :type co: :class:`Vector`\n" + " :arg origin: Start location of the ray in object space.\n" + " :type origin: :class:`Vector`\n" " :arg direction: Direction of the ray in object space.\n" " :type direction: :class:`Vector`\n" PYBVH_FIND_GENERIC_DISTANCE_DOC PYBVH_FIND_GENERIC_RETURN_DOC); @@ -1331,7 +1331,7 @@ PyMODINIT_FUNC PyInit_mathutils_bvhtree(void) return NULL; } - PyModule_AddObject(m, "BVHTree", (PyObject *)&PyBVHTree_Type); + PyModule_AddType(m, &PyBVHTree_Type); return m; } diff --git a/source/blender/python/mathutils/mathutils_kdtree.c b/source/blender/python/mathutils/mathutils_kdtree.c index 1de3c23838f..fe8f9ec0334 100644 --- a/source/blender/python/mathutils/mathutils_kdtree.c +++ b/source/blender/python/mathutils/mathutils_kdtree.c @@ -459,7 +459,7 @@ PyMODINIT_FUNC PyInit_mathutils_kdtree(void) if (PyType_Ready(&PyKDTree_Type)) { return NULL; } - PyModule_AddObject(m, "KDTree", (PyObject *)&PyKDTree_Type); + PyModule_AddType(m, &PyKDTree_Type); return m; } diff --git a/source/blender/render/RE_bake.h b/source/blender/render/RE_bake.h index 3463362adb1..bb30b524b61 100644 --- a/source/blender/render/RE_bake.h +++ b/source/blender/render/RE_bake.h @@ -59,6 +59,7 @@ typedef struct BakeTargets { typedef struct BakePixel { int primitive_id, object_id; + int seed; float uv[2]; float du_dx, du_dy; float dv_dx, dv_dy; diff --git a/source/blender/render/RE_pipeline.h b/source/blender/render/RE_pipeline.h index 688709d55f3..27dcd9e70ed 100644 --- a/source/blender/render/RE_pipeline.h +++ b/source/blender/render/RE_pipeline.h @@ -331,7 +331,7 @@ void RE_display_update_cb(struct Render *re, void (*f)(void *handle, RenderResult *rr, volatile struct rcti *rect)); void RE_stats_draw_cb(struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs)); void RE_progress_cb(struct Render *re, void *handle, void (*f)(void *handle, float)); -void RE_draw_lock_cb(struct Render *re, void *handle, void (*f)(void *handle, int)); +void RE_draw_lock_cb(struct Render *re, void *handle, void (*f)(void *handle, bool lock)); void RE_test_break_cb(struct Render *re, void *handle, int (*f)(void *handle)); void RE_current_scene_update_cb(struct Render *re, void *handle, diff --git a/source/blender/render/intern/bake.c b/source/blender/render/intern/bake.c index caf81870fac..7af6d3e234f 100644 --- a/source/blender/render/intern/bake.c +++ b/source/blender/render/intern/bake.c @@ -135,6 +135,7 @@ static void store_bake_pixel(void *handle, int x, int y, float u, float v) pixel->dv_dx = bd->dv_dx; pixel->dv_dy = bd->dv_dy; pixel->object_id = 0; + pixel->seed = i; } void RE_bake_mask_fill(const BakePixel pixel_array[], const size_t num_pixels, char *mask) @@ -383,6 +384,7 @@ static bool cast_ray_highpoly(BVHTreeFromMesh *treeData, pixel_high->primitive_id = primitive_id_high; pixel_high->object_id = hit_mesh; + pixel_high->seed = pixel_id; /* ray direction in high poly object space */ float dir_high[3]; @@ -434,6 +436,7 @@ static bool cast_ray_highpoly(BVHTreeFromMesh *treeData, else { pixel_array[pixel_id].primitive_id = -1; pixel_array[pixel_id].object_id = -1; + pixel_array[pixel_id].seed = 0; } MEM_freeN(hits); diff --git a/source/blender/render/intern/engine.c b/source/blender/render/intern/engine.c index 151d994dddf..a43a78f5d3d 100644 --- a/source/blender/render/intern/engine.c +++ b/source/blender/render/intern/engine.c @@ -194,7 +194,7 @@ static RenderResult *render_result_from_bake(RenderEngine *engine, int x, int y, primitive[1] = int_as_float(-1); } else { - primitive[0] = int_as_float(bake_pixel->object_id); + primitive[0] = int_as_float(bake_pixel->seed); primitive[1] = int_as_float(bake_pixel->primitive_id); primitive[2] = bake_pixel->uv[0]; primitive[3] = bake_pixel->uv[1]; @@ -757,7 +757,7 @@ static void engine_render_view_layer(Render *re, { /* Lock UI so scene can't be edited while we read from it in this render thread. */ if (re->draw_lock) { - re->draw_lock(re->dlh, 1); + re->draw_lock(re->dlh, true); } /* Create depsgraph with scene evaluated at render resolution. */ @@ -773,7 +773,7 @@ static void engine_render_view_layer(Render *re, } if (re->draw_lock) { - re->draw_lock(re->dlh, 0); + re->draw_lock(re->dlh, false); } /* Perform render with engine. */ @@ -824,7 +824,7 @@ bool RE_engine_render(Render *re, bool do_all) /* Lock drawing in UI during data phase. */ if (re->draw_lock) { - re->draw_lock(re->dlh, 1); + re->draw_lock(re->dlh, true); } /* update animation here so any render layer animation is applied before @@ -852,7 +852,7 @@ bool RE_engine_render(Render *re, bool do_all) if (re->result == NULL) { /* Clear UI drawing locks. */ if (re->draw_lock) { - re->draw_lock(re->dlh, 0); + re->draw_lock(re->dlh, false); } /* Too small image is handled earlier, here it could only happen if * there was no sufficient memory to allocate all passes. @@ -902,7 +902,7 @@ bool RE_engine_render(Render *re, bool do_all) /* Clear UI drawing locks. */ if (re->draw_lock) { - re->draw_lock(re->dlh, 0); + re->draw_lock(re->dlh, false); } /* Render view layers. */ diff --git a/source/blender/render/intern/pipeline.c b/source/blender/render/intern/pipeline.c index 0a8b8f24614..92bec9c6fd4 100644 --- a/source/blender/render/intern/pipeline.c +++ b/source/blender/render/intern/pipeline.c @@ -1017,7 +1017,7 @@ void RE_progress_cb(Render *re, void *handle, void (*f)(void *handle, float)) re->prh = handle; } -void RE_draw_lock_cb(Render *re, void *handle, void (*f)(void *handle, int i)) +void RE_draw_lock_cb(Render *re, void *handle, void (*f)(void *handle, bool lock)) { re->draw_lock = f; re->dlh = handle; diff --git a/source/blender/render/intern/render_types.h b/source/blender/render/intern/render_types.h index 7a4374dcf7c..0488bf6e87a 100644 --- a/source/blender/render/intern/render_types.h +++ b/source/blender/render/intern/render_types.h @@ -141,7 +141,7 @@ struct Render { void (*progress)(void *handle, float i); void *prh; - void (*draw_lock)(void *handle, int i); + void (*draw_lock)(void *handle, bool lock); void *dlh; int (*test_break)(void *handle); void *tbh; diff --git a/source/blender/render/intern/texture_image.c b/source/blender/render/intern/texture_image.c index 5614318afbb..0299315beaf 100644 --- a/source/blender/render/intern/texture_image.c +++ b/source/blender/render/intern/texture_image.c @@ -630,7 +630,7 @@ static void boxsample(ImBuf *ibuf, const short imapextend) { /* Sample box, performs clip. minx etc are in range 0.0 - 1.0 . - * Enlarge with antialiased edges of pixels. + * Enlarge with anti-aliased edges of pixels. * If variable 'imaprepeat' has been set, the * clipped-away parts are sampled as well. */ diff --git a/source/blender/sequencer/intern/effects.c b/source/blender/sequencer/intern/effects.c index 65c768076c5..fc8a5c62744 100644 --- a/source/blender/sequencer/intern/effects.c +++ b/source/blender/sequencer/intern/effects.c @@ -3157,7 +3157,7 @@ static void store_icu_yrange_speed(Sequence *seq, short UNUSED(adrcode), float * */ static int seq_effect_speed_get_strip_content_length(const Sequence *seq) { - if (SEQ_effect_get_num_inputs(seq->type) == 0) { + if ((seq->type & SEQ_TYPE_EFFECT) != 0 && SEQ_effect_get_num_inputs(seq->type) == 0) { return seq->enddisp - seq->startdisp; } diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 69177f39c04..545371f4540 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -171,15 +171,24 @@ void WM_opengl_context_dispose(void *context); void WM_opengl_context_activate(void *context); void WM_opengl_context_release(void *context); -struct wmWindow *WM_window_open(struct bContext *C, const struct rcti *rect); -struct wmWindow *WM_window_open_temp(struct bContext *C, - const char *title, - int x, - int y, - int sizex, - int sizey, - int space_type, - bool dialog); +/* WM_window_open alignment */ +typedef enum WindowAlignment { + WIN_ALIGN_ABSOLUTE = 0, + WIN_ALIGN_LOCATION_CENTER, + WIN_ALIGN_PARENT_CENTER, +} WindowAlignment; + +struct wmWindow *WM_window_open(struct bContext *C, + const char *title, + int x, + int y, + int sizex, + int sizey, + int space_type, + bool dialog, + bool temp, + WindowAlignment alignment); + void WM_window_set_dpi(const wmWindow *win); bool WM_stereo3d_enabled(struct wmWindow *win, bool only_fullscreen_test); @@ -218,6 +227,9 @@ struct wmPaintCursor *WM_paint_cursor_activate( void *customdata); bool WM_paint_cursor_end(struct wmPaintCursor *handle); +void WM_paint_cursor_remove_by_type(struct wmWindowManager *wm, + void *draw_fn, + void (*free)(void *)); void WM_paint_cursor_tag_redraw(struct wmWindow *win, struct ARegion *region); void WM_cursor_warp(struct wmWindow *win, int x, int y); @@ -678,7 +690,8 @@ struct wmDropBox *WM_dropbox_add( ListBase *lb, const char *idname, bool (*poll)(struct bContext *, struct wmDrag *, const struct wmEvent *event, const char **), - void (*copy)(struct wmDrag *, struct wmDropBox *)); + void (*copy)(struct wmDrag *, struct wmDropBox *), + void (*cancel)(struct Main *, struct wmDrag *, struct wmDropBox *)); ListBase *WM_dropboxmap_find(const char *idname, int spaceid, int regionid); /* ID drag and drop */ @@ -690,6 +703,10 @@ bool WM_drag_is_ID_type(const struct wmDrag *drag, int idcode); struct wmDragAsset *WM_drag_get_asset_data(const struct wmDrag *drag, int idcode); struct ID *WM_drag_get_local_ID_or_import_from_asset(const struct wmDrag *drag, int idcode); +void WM_drag_free_imported_drag_ID(struct Main *bmain, + struct wmDrag *drag, + struct wmDropBox *drop); + /* Set OpenGL viewport and scissor */ void wmViewport(const struct rcti *winrct); void wmPartialViewport(rcti *drawrct, const rcti *winrct, const rcti *partialrct); diff --git a/source/blender/windowmanager/WM_toolsystem.h b/source/blender/windowmanager/WM_toolsystem.h index 451f0ecd424..d2e2b9c8f3b 100644 --- a/source/blender/windowmanager/WM_toolsystem.h +++ b/source/blender/windowmanager/WM_toolsystem.h @@ -42,7 +42,7 @@ struct wmOperatorType; #define WM_TOOLSYSTEM_SPACE_MASK \ ((1 << SPACE_IMAGE) | (1 << SPACE_NODE) | (1 << SPACE_VIEW3D) | (1 << SPACE_SEQ)) -/* Values that define a categoey of active tool. */ +/* Values that define a category of active tool. */ typedef struct bToolKey { int space_type; int mode; diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 0a32d2f0405..d40c0715a09 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -549,7 +549,7 @@ typedef struct wmEvent { /** Event code itself (short, is also in keymap). */ short type; - /** Press, release, scrollvalue. */ + /** Press, release, scroll-value. */ short val; /** Mouse pointer position, screen coord. */ int x, y; @@ -903,6 +903,12 @@ typedef struct wmDropBox { /** Before exec, this copies drag info to #wmDrop properties. */ void (*copy)(struct wmDrag *, struct wmDropBox *); + /** + * If the operator is cancelled (returns `OPERATOR_CANCELLED`), this can be used for cleanup of + * `copy()` resources. + */ + void (*cancel)(struct Main *, struct wmDrag *, struct wmDropBox *); + /** * If poll succeeds, operator is called. * Not saved in file, so can be pointer. diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo.c index a56a506b1ab..cfedd67b2f0 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo.c +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo.c @@ -378,7 +378,6 @@ void WM_gizmo_set_color_highlight(wmGizmo *gz, const float color_hi[4]) /* -------------------------------------------------------------------- */ /** \name Gizmo Callback Assignment - * * \{ */ void WM_gizmo_set_fn_custom_modal(struct wmGizmo *gz, wmGizmoFnModal fn) @@ -758,7 +757,6 @@ void WM_gizmo_properties_free(PointerRNA *ptr) /* -------------------------------------------------------------------- */ /** \name General Utilities - * * \{ */ bool WM_gizmo_context_check_drawstep(const struct bContext *C, eWM_GizmoFlagMapDrawStep step) diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c index e9a1b5e3df0..1e77ccd7a1c 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c @@ -61,7 +61,6 @@ /* -------------------------------------------------------------------- */ /** \name wmGizmoGroup - * * \{ */ /** @@ -697,7 +696,6 @@ wmKeyMap *wm_gizmogroup_tweak_modal_keymap(wmKeyConfig *keyconf) /* -------------------------------------------------------------------- */ /** \name wmGizmoGroup (Key-map callbacks) - * * \{ */ wmKeyMap *WM_gizmogroup_setup_keymap_generic(const wmGizmoGroupType *UNUSED(gzgt), wmKeyConfig *kc) @@ -837,7 +835,6 @@ struct wmKeyMap *WM_gizmo_keymap_generic_maybe_drag(wmWindowManager *wm) /* -------------------------------------------------------------------- */ /** \name wmGizmoGroupType - * * \{ */ struct wmGizmoGroupTypeRef *WM_gizmomaptype_group_find_ptr(struct wmGizmoMapType *gzmap_type, @@ -1142,7 +1139,6 @@ void WM_gizmo_group_unlink_delayed_ptr_from_space(wmGizmoGroupType *gzgt, /* -------------------------------------------------------------------- */ /** \name Gizmo Group Type Callback Wrappers - * * \{ */ bool WM_gizmo_group_type_poll(const bContext *C, const wmGizmoGroupType *gzgt) diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c index 12c6eb46c12..051e3e4c1a9 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c @@ -158,7 +158,6 @@ void wm_gizmomap_select_array_remove(wmGizmoMap *gzmap, wmGizmo *gz) /* -------------------------------------------------------------------- */ /** \name wmGizmoMap - * * \{ */ static wmGizmoMap *wm_gizmomap_new_from_type_ex(struct wmGizmoMapType *gzmap_type, @@ -1182,7 +1181,6 @@ void WM_gizmomap_message_subscribe(const bContext *C, /* -------------------------------------------------------------------- */ /** \name Tooltip Handling - * * \{ */ struct ARegion *WM_gizmomap_tooltip_init(struct bContext *C, @@ -1211,7 +1209,6 @@ struct ARegion *WM_gizmomap_tooltip_init(struct bContext *C, /* -------------------------------------------------------------------- */ /** \name wmGizmoMapType - * * \{ */ wmGizmoMapType *WM_gizmomaptype_find(const struct wmGizmoMapType_Params *gzmap_params) @@ -1277,7 +1274,6 @@ void wm_gizmos_keymap(wmKeyConfig *keyconf) /* -------------------------------------------------------------------- */ /** \name Updates for Dynamic Type Registration - * * \{ */ void WM_gizmoconfig_update_tag_group_type_init(wmGizmoMapType *gzmap_type, wmGizmoGroupType *gzgt) diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c index 549b59e9e1d..a9c0d1dd8fe 100644 --- a/source/blender/windowmanager/intern/wm.c +++ b/source/blender/windowmanager/intern/wm.c @@ -272,6 +272,7 @@ IDTypeInfo IDType_ID_WM = { .make_local = NULL, .foreach_id = window_manager_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = window_manager_blend_write, .blend_read_data = window_manager_blend_read_data, @@ -595,6 +596,9 @@ void wm_close_and_free(bContext *C, wmWindowManager *wm) WM_msgbus_destroy(wm->message_bus); } +#ifdef WITH_PYTHON + BPY_callback_wm_free(wm); +#endif BLI_freelistN(&wm->paintcursors); WM_drag_free_list(&wm->drags); diff --git a/source/blender/windowmanager/intern/wm_dragdrop.c b/source/blender/windowmanager/intern/wm_dragdrop.c index 6fdcbab889c..9684c21605a 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop.c +++ b/source/blender/windowmanager/intern/wm_dragdrop.c @@ -39,6 +39,7 @@ #include "BKE_context.h" #include "BKE_global.h" #include "BKE_idtype.h" +#include "BKE_lib_id.h" #include "GPU_shader.h" #include "GPU_state.h" @@ -95,11 +96,13 @@ ListBase *WM_dropboxmap_find(const char *idname, int spaceid, int regionid) wmDropBox *WM_dropbox_add(ListBase *lb, const char *idname, bool (*poll)(bContext *, wmDrag *, const wmEvent *, const char **), - void (*copy)(wmDrag *, wmDropBox *)) + void (*copy)(wmDrag *, wmDropBox *), + void (*cancel)(struct Main *, wmDrag *, wmDropBox *)) { wmDropBox *drop = MEM_callocN(sizeof(wmDropBox), "wmDropBox"); drop->poll = poll; drop->copy = copy; + drop->cancel = cancel; drop->ot = WM_operatortype_find(idname, 0); drop->opcontext = WM_OP_INVOKE_DEFAULT; @@ -382,6 +385,9 @@ static ID *wm_drag_asset_id_import(wmDragAsset *asset_drag) /** * When dragging a local ID, return that. Otherwise, if dragging an asset-handle, link or append * that depending on what was chosen by the drag-box (currently append only in fact). + * + * Use #WM_drag_free_imported_drag_ID() as cancel callback of the drop-box, so that the asset + * import is rolled back if the drop operator fails. */ ID *WM_drag_get_local_ID_or_import_from_asset(const wmDrag *drag, int idcode) { @@ -402,6 +408,39 @@ ID *WM_drag_get_local_ID_or_import_from_asset(const wmDrag *drag, int idcode) return wm_drag_asset_id_import(asset_drag); } +/** + * \brief Free asset ID imported for cancelled drop. + * + * If the asset was imported (linked/appended) using #WM_drag_get_local_ID_or_import_from_asset()` + * (typically via a #wmDropBox.copy() callback), we want the ID to be removed again if the drop + * operator cancels. + * This is for use as #wmDropBox.cancel() callback. + */ +void WM_drag_free_imported_drag_ID(struct Main *bmain, wmDrag *drag, wmDropBox *drop) +{ + if (drag->type != WM_DRAG_ASSET) { + return; + } + + wmDragAsset *asset_drag = WM_drag_get_asset_data(drag, 0); + if (!asset_drag) { + return; + } + + /* Get name from property, not asset data - it may have changed after importing to ensure + * uniqueness (name is assumed to be set from the imported ID name). */ + char name[MAX_ID_NAME - 2]; + RNA_string_get(drop->ptr, "name", name); + if (!name[0]) { + return; + } + + ID *id = BKE_libblock_find_name(bmain, asset_drag->id_type, name); + if (id) { + BKE_id_delete(bmain, id); + } +} + /* ************** draw ***************** */ static void wm_drop_operator_draw(const char *name, int x, int y) diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index e132caede0d..dc38bd79b7d 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -148,8 +148,29 @@ wmEvent *WM_event_add_simulate(wmWindow *win, const wmEvent *event_to_add) return NULL; } wmEvent *event = wm_event_add(win, event_to_add); + win->eventstate->x = event->x; win->eventstate->y = event->y; + + win->eventstate->prevval = event->prevval = win->eventstate->val; + win->eventstate->prevtype = event->prevtype = win->eventstate->type; + win->eventstate->prevx = event->prevx = win->eventstate->x; + win->eventstate->prevy = event->prevy = win->eventstate->y; + + if (event->type == MOUSEMOVE) { + /* Pass. */ + } + else { + win->eventstate->val = event->val; + win->eventstate->type = event->type; + + if (ISMOUSE_BUTTON(event->type)) { + if (event->val == KM_PRESS) { + win->eventstate->prevclickx = event->x; + win->eventstate->prevclicky = event->y; + } + } + } return event; } @@ -2820,8 +2841,14 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers ListBase single_lb = {drag, drag}; event->customdata = &single_lb; - wm_operator_call_internal( + int op_retval = wm_operator_call_internal( C, drop->ot, drop->ptr, NULL, drop->opcontext, false, event); + OPERATOR_RETVAL_CHECK(op_retval); + + if ((op_retval & OPERATOR_CANCELLED) && drop->cancel) { + drop->cancel(CTX_data_main(C), drag, drop); + } + action |= WM_HANDLER_BREAK; /* Free the drags. */ @@ -5135,7 +5162,6 @@ void WM_window_cursor_keymap_status_refresh(bContext *C, wmWindow *win) /* -------------------------------------------------------------------- */ /** \name Modal Keymap Status - * * \{ */ bool WM_window_modal_keymap_status_draw(bContext *C, wmWindow *win, uiLayout *layout) diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index 7680a786634..d2d080a9a68 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -140,6 +140,7 @@ static RecentFile *wm_file_history_find(const char *filepath); static void wm_history_file_free(RecentFile *recent); +static void wm_history_files_free(void); static void wm_history_file_update(void); static void wm_history_file_write(void); @@ -580,7 +581,10 @@ static void wm_file_read_post(bContext *C, #ifdef WITH_PYTHON if (is_startup_file) { - /* possible python hasn't been initialized */ + /* On startup (by default), Python won't have been initialized. + * + * The following block handles data & preferences being reloaded + * which requires resetting some internal variables. */ if (CTX_py_init_get(C)) { bool reset_all = use_userdef; if (use_userdef || reset_app_template) { @@ -592,8 +596,16 @@ static void wm_file_read_post(bContext *C, } } if (reset_all) { - /* sync addons, these may have changed from the defaults */ - BPY_run_string_eval(C, (const char *[]){"addon_utils", NULL}, "addon_utils.reset_all()"); + BPY_run_string_exec( + C, + (const char *[]){"bpy", "addon_utils", NULL}, + /* Refresh scripts as the preferences may have changed the user-scripts path. + * + * This is needed when loading settings from the previous version, + * otherwise the script path stored in the preferences would be ignored. */ + "bpy.utils.refresh_script_paths()\n" + /* Sync add-ons, these may have changed from the defaults. */ + "addon_utils.reset_all()"); } if (use_data) { BPY_python_reset(C); @@ -1177,7 +1189,7 @@ void wm_history_file_read(void) lines = BLI_file_read_as_lines(name); - BLI_listbase_clear(&G.recent_files); + wm_history_files_free(); /* read list of recent opened files from recent-files.txt to memory */ for (l = lines, num = 0; l && (num < U.recent_files); l = l->next) { @@ -1208,6 +1220,13 @@ static void wm_history_file_free(RecentFile *recent) BLI_freelinkN(&G.recent_files, recent); } +static void wm_history_files_free(void) +{ + LISTBASE_FOREACH_MUTABLE (RecentFile *, recent, &G.recent_files) { + wm_history_file_free(recent); + } +} + static RecentFile *wm_file_history_find(const char *filepath) { return BLI_findstring_ptr(&G.recent_files, filepath, offsetof(RecentFile, filepath)); @@ -1363,6 +1382,7 @@ static ImBuf *blend_file_thumb(const bContext *C, IB_rect, R_ALPHAPREMUL, NULL, + true, NULL, err_out); } @@ -1378,14 +1398,8 @@ static ImBuf *blend_file_thumb(const bContext *C, } if (ibuf) { - float aspect = (scene->r.xsch * scene->r.xasp) / (scene->r.ysch * scene->r.yasp); - /* dirty oversampling */ IMB_scaleImBuf(ibuf, BLEN_THUMB_SIZE, BLEN_THUMB_SIZE); - - /* add pretty overlay */ - IMB_thumb_overlay_blend(ibuf->rect, ibuf->x, ibuf->y, aspect); - thumb = BKE_main_thumbnail_from_imbuf(NULL, ibuf); } else { diff --git a/source/blender/windowmanager/intern/wm_files_link.c b/source/blender/windowmanager/intern/wm_files_link.c index 49ac250d9a3..d4495821672 100644 --- a/source/blender/windowmanager/intern/wm_files_link.c +++ b/source/blender/windowmanager/intern/wm_files_link.c @@ -629,7 +629,7 @@ void WM_OT_append(wmOperatorType *ot) "set_fake", false, "Fake User", - "Set Fake User for appended items (except Objects and Groups)"); + "Set \"Fake User\" for appended items (except objects and collections)"); RNA_def_boolean( ot->srna, "use_recursive", diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c index 918836041df..56fd51ac6fd 100644 --- a/source/blender/windowmanager/intern/wm_init_exit.c +++ b/source/blender/windowmanager/intern/wm_init_exit.c @@ -624,13 +624,13 @@ void WM_exit_ex(bContext *C, const bool do_python) #ifdef WITH_PYTHON /* option not to close python so we can use 'atexit' */ if (do_python && ((C == NULL) || CTX_py_init_get(C))) { - /* XXX - old note */ - /* before BKE_blender_free so py's gc happens while library still exists */ - /* needed at least for a rare sigsegv that can happen in pydrivers */ - - /* Update for blender 2.5, move after BKE_blender_free because Blender now holds references to - * PyObject's so decref'ing them after python ends causes bad problems every time - * the py-driver bug can be fixed if it happens again we can deal with it then. */ + /* NOTE: (old note) + * before BKE_blender_free so Python's garbage-collection happens while library still exists. + * Needed at least for a rare crash that can happen in python-drivers. + * + * Update for Blender 2.5, move after #BKE_blender_free because Blender now holds references + * to #PyObject's so #Py_DECREF'ing them after Python ends causes bad problems every time + * the python-driver bug can be fixed if it happens again we can deal with it then. */ BPY_python_end(); } #else diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c index fcb13fff0a5..6cc9a4c9b64 100644 --- a/source/blender/windowmanager/intern/wm_keymap.c +++ b/source/blender/windowmanager/intern/wm_keymap.c @@ -1333,7 +1333,7 @@ static wmKeyMapItem *wm_keymap_item_find_in_keymap(wmKeyMap *keymap, if (IDP_EqualsProperties_ex(properties, properties_default, is_strict)) { char kmi_str[128]; WM_keymap_item_to_string(kmi, false, kmi_str, sizeof(kmi_str)); - /* Note gievn properties could come from other things than menu entry... */ + /* NOTE: given properties could come from other things than menu entry. */ printf( "%s: Some set values in menu entry match default op values, " "this might not be desired!\n", diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index e82f6cc9d76..f96c45f8a05 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -2056,6 +2056,22 @@ bool WM_paint_cursor_end(wmPaintCursor *handle) return false; } +void WM_paint_cursor_remove_by_type(wmWindowManager *wm, void *draw_fn, void (*free)(void *)) +{ + wmPaintCursor *pc = wm->paintcursors.first; + while (pc) { + wmPaintCursor *pc_next = pc->next; + if (pc->draw == draw_fn) { + if (free) { + free(pc->customdata); + } + BLI_remlink(&wm->paintcursors, pc); + MEM_freeN(pc); + } + pc = pc_next; + } +} + /** \} */ /* -------------------------------------------------------------------- */ @@ -2087,6 +2103,7 @@ typedef struct { bool use_secondary_tex; void *cursor; NumInput num_input; + int init_event; } RadialControl; static void radial_control_update_header(wmOperator *op, bContext *C) @@ -2705,6 +2722,8 @@ static int radial_control_invoke(bContext *C, wmOperator *op, const wmEvent *eve radial_control_set_initial_mouse(rc, event); radial_control_set_tex(rc); + rc->init_event = WM_userdef_event_type_from_keymap_type(event->type); + /* temporarily disable other paint cursors */ wm = CTX_wm_manager(C); rc->orig_paintcursors = wm->paintcursors; @@ -2962,6 +2981,11 @@ static int radial_control_modal(bContext *C, wmOperator *op, const wmEvent *even return OPERATOR_RUNNING_MODAL; } + if (!handled && (event->val == KM_RELEASE) && (rc->init_event == event->type) && + RNA_boolean_get(op->ptr, "release_confirm")) { + ret = OPERATOR_FINISHED; + } + ED_region_tag_redraw(CTX_wm_region(C)); radial_control_update_header(op, C); @@ -2986,7 +3010,7 @@ static void WM_OT_radial_control(wmOperatorType *ot) { ot->name = "Radial Control"; ot->idname = "WM_OT_radial_control"; - ot->description = "Set some size property (like e.g. brush size) with mouse wheel"; + ot->description = "Set some size property (e.g. brush size) with mouse wheel"; ot->invoke = radial_control_invoke; ot->modal = radial_control_modal; @@ -3070,6 +3094,10 @@ static void WM_OT_radial_control(wmOperatorType *ot) prop = RNA_def_boolean( ot->srna, "secondary_tex", false, "Secondary Texture", "Tweak brush secondary/mask texture"); RNA_def_property_flag(prop, PROP_SKIP_SAVE); + + prop = RNA_def_boolean( + ot->srna, "release_confirm", false, "Confirm On Release", "Finish operation on key release"); + RNA_def_property_flag(prop, PROP_SKIP_SAVE); } /** \} */ diff --git a/source/blender/windowmanager/intern/wm_playanim.c b/source/blender/windowmanager/intern/wm_playanim.c index 60bcb687dbf..02a8951e60e 100644 --- a/source/blender/windowmanager/intern/wm_playanim.c +++ b/source/blender/windowmanager/intern/wm_playanim.c @@ -1097,6 +1097,7 @@ static void playanim_window_open(const char *title, int posx, int posy, int size posy = (scr_h - posy - sizey); g_WS.ghost_window = GHOST_CreateWindow(g_WS.ghost_system, + NULL, title, posx, posy, @@ -1104,6 +1105,7 @@ static void playanim_window_open(const char *title, int posx, int posy, int size sizey, /* could optionally start fullscreen */ GHOST_kWindowStateNormal, + false, GHOST_kDrawingContextTypeOpenGL, glsettings); } @@ -1144,7 +1146,6 @@ static char *wm_main_playanim_intern(int argc, const char **argv) PlayState ps = {0}; - /* ps.doubleb = true;*/ /* UNUSED */ ps.go = true; ps.direction = true; ps.next_frame = 1; @@ -1160,7 +1161,6 @@ static char *wm_main_playanim_intern(int argc, const char **argv) ps.indicator = false; ps.dropped_file[0] = 0; ps.zoom = 1.0f; - /* resetmap = false */ ps.draw_flip[0] = false; ps.draw_flip[1] = false; @@ -1421,7 +1421,7 @@ static char *wm_main_playanim_intern(int argc, const char **argv) #endif #ifdef USE_FRAME_CACHE_LIMIT - /* really basic memory conservation scheme. Keep frames in a fifo queue */ + /* Really basic memory conservation scheme. Keep frames in a FIFO queue. */ node = inmempicsbase.last; while (node && added_images > PLAY_FRAME_CACHE_MAX) { diff --git a/source/blender/windowmanager/intern/wm_splash_screen.c b/source/blender/windowmanager/intern/wm_splash_screen.c index a3619a69152..ae726e73fe7 100644 --- a/source/blender/windowmanager/intern/wm_splash_screen.c +++ b/source/blender/windowmanager/intern/wm_splash_screen.c @@ -226,7 +226,26 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *region, void *UNUSE 0, style); - MenuType *mt = WM_menutype_find("WM_MT_splash", true); + MenuType *mt; + char userpref[FILE_MAX]; + const char *const cfgdir = BKE_appdir_folder_id(BLENDER_USER_CONFIG, NULL); + + if (cfgdir) { + BLI_path_join(userpref, sizeof(userpref), cfgdir, BLENDER_USERPREF_FILE, NULL); + } + + /* Draw setup screen if no preferences have been saved yet. */ + if (!BLI_exists(userpref)) { + mt = WM_menutype_find("WM_MT_splash_quick_setup", true); + + /* The UI_BLOCK_QUICK_SETUP flag prevents the button text from being left-aligned, + as it is for all menus due to the UI_BLOCK_LOOP flag, see in 'ui_def_but'. */ + UI_block_flag_enable(block, UI_BLOCK_QUICK_SETUP); + } + else { + mt = WM_menutype_find("WM_MT_splash", true); + } + if (mt) { UI_menutype_draw(C, mt, layout); } diff --git a/source/blender/windowmanager/intern/wm_toolsystem.c b/source/blender/windowmanager/intern/wm_toolsystem.c index 5327062d9bb..5eaf026191f 100644 --- a/source/blender/windowmanager/intern/wm_toolsystem.c +++ b/source/blender/windowmanager/intern/wm_toolsystem.c @@ -620,7 +620,7 @@ bToolRef *WM_toolsystem_ref_set_by_id_ex( bContext *C, WorkSpace *workspace, const bToolKey *tkey, const char *name, bool cycle) { wmOperatorType *ot = WM_operatortype_find("WM_OT_tool_set_by_id", false); - /* On startup, Python operatores are not yet loaded. */ + /* On startup, Python operators are not yet loaded. */ if (ot == NULL) { return NULL; } diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index c4b50f1c889..ada4093080c 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -158,37 +158,16 @@ void wm_get_desktopsize(int *r_width, int *r_height) *r_height = uiheight; } -/* keeps offset and size within monitor bounds */ -/* XXX solve dual screen... */ -static void wm_window_check_position(rcti *rect) +/* keeps size within monitor bounds */ +static void wm_window_check_size(rcti *rect) { int width, height; wm_get_screensize(&width, &height); - - if (rect->xmin < 0) { - rect->xmax -= rect->xmin; - rect->xmin = 0; + if (BLI_rcti_size_x(rect) > width) { + BLI_rcti_resize_x(rect, width); } - if (rect->ymin < 0) { - rect->ymax -= rect->ymin; - rect->ymin = 0; - } - if (rect->xmax > width) { - int d = rect->xmax - width; - rect->xmax -= d; - rect->xmin -= d; - } - if (rect->ymax > height) { - int d = rect->ymax - height; - rect->ymax -= d; - rect->ymin -= d; - } - - if (rect->xmin < 0) { - rect->xmin = 0; - } - if (rect->ymin < 0) { - rect->ymin = 0; + if (BLI_rcti_size_y(rect) > height) { + BLI_rcti_resize_y(rect, height); } } @@ -462,7 +441,7 @@ void wm_window_title(wmWindowManager *wm, wmWindow *win) { if (WM_window_is_temp_screen(win)) { /* nothing to do for 'temp' windows, - * because WM_window_open_temp always sets window title */ + * because WM_window_open always sets window title */ } else if (win->ghostwin) { /* this is set to 1 if you don't have startup.blend open */ @@ -560,14 +539,6 @@ static void wm_window_ghostwindow_add(wmWindowManager *wm, wmWindow *win, bool is_dialog) { - /* On Windows, if there is a parent window then force is_dialog. Otherwise the parent - handle is not used in window creation and they do not stay on top of parents. */ -#ifdef WIN32 - if (win->parent) { - is_dialog = true; - } -#endif - /* a new window is created when pageflip mode is required for a window */ GHOST_GLSettings glSettings = {0}; if (win->stereo3d_format->display_mode == S3D_DISPLAY_PAGEFLIP) { @@ -586,30 +557,17 @@ static void wm_window_ghostwindow_add(wmWindowManager *wm, wmWindow *prev_windrawable = wm->windrawable; wm_window_clear_drawable(wm); - GHOST_WindowHandle ghostwin; - if (is_dialog && win->parent) { - ghostwin = GHOST_CreateDialogWindow(g_system, - win->parent->ghostwin, - title, - win->posx, - posy, - win->sizex, - win->sizey, - (GHOST_TWindowState)win->windowstate, - GHOST_kDrawingContextTypeOpenGL, - glSettings); - } - else { - ghostwin = GHOST_CreateWindow(g_system, - title, - win->posx, - posy, - win->sizex, - win->sizey, - (GHOST_TWindowState)win->windowstate, - GHOST_kDrawingContextTypeOpenGL, - glSettings); - } + GHOST_WindowHandle ghostwin = GHOST_CreateWindow(g_system, + (win->parent) ? win->parent->ghostwin : NULL, + title, + win->posx, + posy, + win->sizex, + win->sizey, + (GHOST_TWindowState)win->windowstate, + is_dialog, + GHOST_kDrawingContextTypeOpenGL, + glSettings); if (ghostwin) { win->gpuctx = GPU_context_create(ghostwin); @@ -797,92 +755,77 @@ static bool wm_window_update_size_position(wmWindow *win) } /** - * new window, no screen yet, but we open ghostwindow for it, - * also gets the window level handlers - * \note area-rip calls this. - * \return the window or NULL. - */ -wmWindow *WM_window_open(bContext *C, const rcti *rect) -{ - wmWindowManager *wm = CTX_wm_manager(C); - wmWindow *win_prev = CTX_wm_window(C); - wmWindow *win = wm_window_new(CTX_data_main(C), wm, win_prev, false); - - const float native_pixel_size = GHOST_GetNativePixelSize(win_prev->ghostwin); - - win->posx = rect->xmin / native_pixel_size; - win->posy = rect->ymin / native_pixel_size; - win->sizex = BLI_rcti_size_x(rect) / native_pixel_size; - win->sizey = BLI_rcti_size_y(rect) / native_pixel_size; - - WM_check(C); - - if (win->ghostwin) { - return win; - } - - wm_window_close(C, wm, win); - CTX_wm_window_set(C, win_prev); - return NULL; -} - -/** - * Uses `screen->temp` tag to define what to do, currently it limits - * to only one "temp" window for render out, preferences, filewindow, etc... - * * \param space_type: SPACE_VIEW3D, SPACE_INFO, ... (eSpace_Type) + * \param dialog: whether this should be made as a dialog-style window + * \param temp: whether this is considered a short-lived window + * \param alignment: how this window is positioned relative to its parent * \return the window or NULL in case of failure. */ -wmWindow *WM_window_open_temp(bContext *C, - const char *title, - int x, - int y, - int sizex, - int sizey, - int space_type, - bool dialog) +wmWindow *WM_window_open(bContext *C, + const char *title, + int x, + int y, + int sizex, + int sizey, + int space_type, + bool dialog, + bool temp, + WindowAlignment alignment) { Main *bmain = CTX_data_main(C); wmWindowManager *wm = CTX_wm_manager(C); wmWindow *win_prev = CTX_wm_window(C); Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); + rcti rect; - /* convert to native OS window coordinates */ const float native_pixel_size = GHOST_GetNativePixelSize(win_prev->ghostwin); - x /= native_pixel_size; - y /= native_pixel_size; + /* convert to native OS window coordinates */ + rect.xmin = win_prev->posx + (x / native_pixel_size); + rect.ymin = win_prev->posy + (y / native_pixel_size); sizex /= native_pixel_size; sizey /= native_pixel_size; - /* calculate position */ - rcti rect; - rect.xmin = x + win_prev->posx - sizex / 2; - rect.ymin = y + win_prev->posy - sizey / 2; + if (alignment == WIN_ALIGN_LOCATION_CENTER) { + /* Window centered around x,y location. */ + rect.xmin -= sizex / 2; + rect.ymin -= sizey / 2; + } + else if (alignment == WIN_ALIGN_PARENT_CENTER) { + /* Centered within parent. X,Y as offsets from there. */ + rect.xmin += (win_prev->sizex - sizex) / 2; + rect.ymin += (win_prev->sizey - sizey) / 2; + } + else { + /* Positioned absolutely within parent bounds. */ + } + rect.xmax = rect.xmin + sizex; rect.ymax = rect.ymin + sizey; /* changes rect to fit within desktop */ - wm_window_check_position(&rect); + wm_window_check_size(&rect); /* Reuse temporary windows when they share the same title. */ wmWindow *win = NULL; - LISTBASE_FOREACH (wmWindow *, win_iter, &wm->windows) { - if (WM_window_is_temp_screen(win_iter)) { - char *wintitle = GHOST_GetTitle(win_iter->ghostwin); - if (strcmp(title, wintitle) == 0) { - win = win_iter; + if (temp) { + LISTBASE_FOREACH (wmWindow *, win_iter, &wm->windows) { + if (WM_window_is_temp_screen(win_iter)) { + char *wintitle = GHOST_GetTitle(win_iter->ghostwin); + if (strcmp(title, wintitle) == 0) { + win = win_iter; + } + free(wintitle); } - free(wintitle); } } /* add new window? */ if (win == NULL) { win = wm_window_new(bmain, wm, win_prev, dialog); - win->posx = rect.xmin; win->posy = rect.ymin; + *win->stereo3d_format = *win_prev->stereo3d_format; } bScreen *screen = WM_window_get_active_screen(win); @@ -910,7 +853,7 @@ wmWindow *WM_window_open_temp(bContext *C, ED_screen_scene_change(C, win, scene); } - screen->temp = 1; + screen->temp = temp; /* make window active, and validate/resize */ CTX_wm_window_set(C, win); @@ -927,10 +870,11 @@ wmWindow *WM_window_open_temp(bContext *C, */ /* ensure it shows the right spacetype editor */ - ScrArea *area = screen->areabase.first; - CTX_wm_area_set(C, area); - - ED_area_newspace(C, area, space_type, false); + if (space_type != SPACE_EMPTY) { + ScrArea *area = screen->areabase.first; + CTX_wm_area_set(C, area); + ED_area_newspace(C, area, space_type, false); + } ED_screen_change(C, screen); @@ -970,8 +914,18 @@ int wm_window_close_exec(bContext *C, wmOperator *UNUSED(op)) int wm_window_new_exec(bContext *C, wmOperator *UNUSED(op)) { wmWindow *win_src = CTX_wm_window(C); + ScrArea *area = BKE_screen_find_big_area(CTX_wm_screen(C), SPACE_TYPE_ANY, 0); - bool ok = (wm_window_copy_test(C, win_src, true, true) != NULL); + bool ok = (WM_window_open(C, + IFACE_("Blender"), + 0, + 0, + win_src->sizex * 0.95f, + win_src->sizey * 0.9f, + area->spacetype, + false, + false, + WIN_ALIGN_PARENT_CENTER) != NULL); return ok ? OPERATOR_FINISHED : OPERATOR_CANCELLED; } @@ -1946,7 +1900,6 @@ bool wm_window_get_swap_interval(wmWindow *win, int *intervalOut) /* -------------------------------------------------------------------- */ /** \name Find Window Utility - * * \{ */ static void wm_window_desktop_pos_get(const wmWindow *win, const int screen_pos[2], @@ -2047,7 +2000,7 @@ uint *WM_window_pixels_read(wmWindowManager *wm, wmWindow *win, int r_size[2]) const uint rect_len = r_size[0] * r_size[1]; uint *rect = MEM_mallocN(sizeof(*rect) * rect_len, __func__); - GPU_frontbuffer_read_pixels(0, 0, r_size[0], r_size[1], 4, GPU_DATA_UNSIGNED_BYTE, rect); + GPU_frontbuffer_read_pixels(0, 0, r_size[0], r_size[1], 4, GPU_DATA_UBYTE, rect); if (setup_context) { if (wm->windrawable) { diff --git a/source/blender/windowmanager/xr/intern/wm_xr.c b/source/blender/windowmanager/xr/intern/wm_xr.c index 90f30809136..439d611b085 100644 --- a/source/blender/windowmanager/xr/intern/wm_xr.c +++ b/source/blender/windowmanager/xr/intern/wm_xr.c @@ -138,7 +138,6 @@ bool wm_xr_events_handle(wmWindowManager *wm) /* -------------------------------------------------------------------- */ /** \name XR Runtime Data - * * \{ */ wmXrRuntimeData *wm_xr_runtime_data_create(void) diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index fd1d721d869..c7b940d0012 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -574,7 +574,7 @@ if(UNIX AND NOT APPLE) DIRECTORY ${PYTHON_LIBPATH}/python${PYTHON_VERSION} DESTINATION ${TARGETDIR_VER}/python/${_target_LIB} PATTERN "__pycache__" EXCLUDE # * any cache * - PATTERN "config-${PYTHON_VERSION}m/*.a" EXCLUDE # static lib + PATTERN "config-${PYTHON_VERSION}/*.a" EXCLUDE # static lib PATTERN "lib2to3" EXCLUDE # ./lib2to3 PATTERN "site-packages/*" EXCLUDE # ./site-packages/* PATTERN "tkinter" EXCLUDE # ./tkinter @@ -803,13 +803,13 @@ elseif(WIN32) if(WINDOWS_PYTHON_DEBUG) install( - FILES ${LIBDIR}/python/37/libs/python${_PYTHON_VERSION_NO_DOTS}.pdb + FILES ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/libs/python${_PYTHON_VERSION_NO_DOTS}.pdb DESTINATION "." CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel ) install( - FILES ${LIBDIR}/python/37/libs/python${_PYTHON_VERSION_NO_DOTS}_d.pdb + FILES ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/libs/python${_PYTHON_VERSION_NO_DOTS}_d.pdb DESTINATION "." CONFIGURATIONS Debug ) @@ -944,7 +944,7 @@ elseif(APPLE) PATTERN "__pycache__" EXCLUDE PATTERN "__MACOSX" EXCLUDE PATTERN ".DS_Store" EXCLUDE - PATTERN "config-${PYTHON_VERSION}m/*.a" EXCLUDE # static lib + PATTERN "config-${PYTHON_VERSION}/*.a" EXCLUDE # static lib PATTERN "lib2to3" EXCLUDE # ./lib2to3 PATTERN "tkinter" EXCLUDE # ./tkinter PATTERN "lib-dynload/_tkinter.*" EXCLUDE # ./lib-dynload/_tkinter.co diff --git a/source/creator/blender.map b/source/creator/blender.map index 5171e94382d..9aafddd9666 100644 --- a/source/creator/blender.map +++ b/source/creator/blender.map @@ -16,6 +16,7 @@ local: *boost*; *ceres*; *cineon*; + *clang*; *COLLADA*; cu*; *default_error_condition*; diff --git a/source/creator/creator_args.c b/source/creator/creator_args.c index 98a8a7aa189..e31be24ec7b 100644 --- a/source/creator/creator_args.c +++ b/source/creator/creator_args.c @@ -590,8 +590,6 @@ static int arg_handle_print_help(int UNUSED(argc), const char **UNUSED(argv), vo BLI_args_print_arg_doc(ba, "--debug-ghost"); BLI_args_print_arg_doc(ba, "--debug-gpu"); BLI_args_print_arg_doc(ba, "--debug-gpu-force-workarounds"); - BLI_args_print_arg_doc(ba, "--debug-gpu-shaders"); - BLI_args_print_arg_doc(ba, "--debug-gpumem"); BLI_args_print_arg_doc(ba, "--debug-wm"); # ifdef WITH_XR_OPENXR BLI_args_print_arg_doc(ba, "--debug-xr"); diff --git a/source/creator/creator_intern.h b/source/creator/creator_intern.h index 0a13f45eef1..bcc8a15355a 100644 --- a/source/creator/creator_intern.h +++ b/source/creator/creator_intern.h @@ -73,7 +73,7 @@ enum { /* for the callbacks: */ #ifndef WITH_PYTHON_MODULE # define BLEND_VERSION_FMT "Blender %d.%02d.%d" -# define BLEND_VERSION_ARG BLENDER_VERSION / 100, BLENDER_VERSION % 100, BLENDER_VERSION_PATCH +# define BLEND_VERSION_ARG (BLENDER_VERSION / 100), (BLENDER_VERSION % 100), BLENDER_VERSION_PATCH #endif #ifdef WITH_BUILDINFO_HEADER diff --git a/source/creator/osx_locals.map b/source/creator/osx_locals.map index 86cd32791dd..5619f151bd2 100644 --- a/source/creator/osx_locals.map +++ b/source/creator/osx_locals.map @@ -7,6 +7,7 @@ blosc* *boost* *ceres* *cineon* +*clang* *COLLADA* cu* decodeInstruction diff --git a/source/tools b/source/tools index d7d7e9d41f7..f067d32f4e8 160000 --- a/source/tools +++ b/source/tools @@ -1 +1 @@ -Subproject commit d7d7e9d41f7499aa4639f96c843156ff834385ba +Subproject commit f067d32f4e8c830cfca758a74a49fa39d7f851ec diff --git a/tests/python/curve_to_mesh.py b/tests/python/curve_to_mesh.py index 1e22ea8fd56..998ecdae116 100644 --- a/tests/python/curve_to_mesh.py +++ b/tests/python/curve_to_mesh.py @@ -41,6 +41,8 @@ def main(): [OperatorSpecObjectMode('convert', {'target': 'MESH'})]), MeshTest('2D Square', 'test2DSquare', 'expected2DSquare', [OperatorSpecObjectMode('convert', {'target': 'MESH'})]), + MeshTest('2D Extrude', 'test2DExtrude', 'expected2DExtrude', + [OperatorSpecObjectMode('convert', {'target': 'MESH'})]), MeshTest('Bevel Back', 'testBevelBack', 'expectedBevelBack', [OperatorSpecObjectMode('convert', {'target': 'MESH'})]), MeshTest('Bevel Back Low Res', 'testBevelBackLowRes', 'expectedBevelBackLowRes', diff --git a/tests/python/modules/mesh_test.py b/tests/python/modules/mesh_test.py index b1dadfdb5af..1749e798a32 100644 --- a/tests/python/modules/mesh_test.py +++ b/tests/python/modules/mesh_test.py @@ -247,9 +247,11 @@ class MeshTest: # Replace expected object with object we ran operations on, i.e. evaluated_test_object. evaluated_test_object.location = self.expected_object.location expected_object_name = self.expected_object.name + evaluated_selection = {v.index for v in evaluated_test_object.data.vertices if v.select} bpy.data.objects.remove(self.expected_object, do_unlink=True) evaluated_test_object.name = expected_object_name + self._do_selection(evaluated_test_object.data, "VERT", evaluated_selection) # Save file. bpy.ops.wm.save_as_mainfile(filepath=bpy.data.filepath) @@ -428,30 +430,40 @@ class MeshTest: if self.apply_modifier: self._apply_modifier(test_object, particle_sys_spec.modifier_name) + def _do_selection(self, mesh: bpy.types.Mesh, select_mode: str, selection: set): + """ + Do selection on a mesh + :param mesh: bpy.types.Mesh - input mesh + :param: select_mode: str - selection mode. Must be 'VERT', 'EDGE' or 'FACE' + :param: selection: set - indices of selection. + + Example: select_mode='VERT' and selection={1,2,3} selects veritces 1, 2 and 3 of input mesh + """ + # deselect all + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.mesh.select_all(action='DESELECT') + bpy.ops.object.mode_set(mode='OBJECT') + + bpy.context.tool_settings.mesh_select_mode = (select_mode == 'VERT', + select_mode == 'EDGE', + select_mode == 'FACE') + + items = (mesh.vertices if select_mode == 'VERT' + else mesh.edges if select_mode == 'EDGE' + else mesh.polygons if select_mode == 'FACE' + else None) + if items is None: + raise ValueError("Invalid selection mode") + for index in selection: + items[index].select = True + def _apply_operator_edit_mode(self, test_object, operator: OperatorSpecEditMode): """ Apply operator on test object. :param test_object: bpy.types.Object - Blender object to apply operator on. :param operator: OperatorSpecEditMode - OperatorSpecEditMode object with parameters. """ - mesh = test_object.data - bpy.ops.object.mode_set(mode='EDIT') - bpy.ops.mesh.select_all(action='DESELECT') - bpy.ops.object.mode_set(mode='OBJECT') - - # Do selection. - bpy.context.tool_settings.mesh_select_mode = (operator.select_mode == 'VERT', - operator.select_mode == 'EDGE', - operator.select_mode == 'FACE') - for index in operator.selection: - if operator.select_mode == 'VERT': - mesh.vertices[index].select = True - elif operator.select_mode == 'EDGE': - mesh.edges[index].select = True - elif operator.select_mode == 'FACE': - mesh.polygons[index].select = True - else: - raise ValueError("Invalid selection mode") + self._do_selection(test_object.data, operator.select_mode, operator.selection) # Apply operator in edit mode. bpy.ops.object.mode_set(mode='EDIT') @@ -579,8 +591,14 @@ class MeshTest: compare_result = evaluated_test_mesh.unit_test_compare(mesh=expected_mesh) compare_success = (compare_result == 'Same') + selected_evaluatated_verts = [v.index for v in evaluated_test_mesh.vertices if v.select] + selected_expected_verts = [v.index for v in expected_mesh.vertices if v.select] + if selected_evaluatated_verts != selected_expected_verts: + compare_result = "Selection doesn't match" + compare_success = False + # Also check if invalid geometry (which is never expected) had to be corrected... - validation_success = evaluated_test_mesh.validate(verbose=True) == False + validation_success = not evaluated_test_mesh.validate(verbose=True) if compare_success and validation_success: if self.verbose: @@ -662,8 +680,7 @@ class RunTest: test_name = each_test.test_name if self.verbose: print() - print("Running test {}...".format(test_number)) - print("Test name {}\n".format(test_name)) + print("Running test {}/{}: {}...".format(test_number+1, len(self.tests), test_name)) success = self.run_test(test_name) if not success: diff --git a/tests/python/operators.py b/tests/python/operators.py index 93cdfebab7b..461880ec214 100644 --- a/tests/python/operators.py +++ b/tests/python/operators.py @@ -37,7 +37,6 @@ MONKEY_LOOP_EDGE = {131, 278, 299, 305, 307, 334, 337, 359, 384, 396, 399, 412, def main(): tests = [ - #### 0 # bisect MeshTest("CubeBisect", "testCubeBisect", "expectedCubeBisect", [OperatorSpecEditMode("bisect", @@ -57,7 +56,6 @@ def main(): [OperatorSpecEditMode("decimate", {"ratio": 0.1}, "FACE", {i for i in range(500)})]), - ### 4 # delete MeshTest("CubeDeleteVertices", "testCubeDeleteVertices", "expectedCubeDeleteVertices", [OperatorSpecEditMode("delete", {}, "VERT", {3})]), @@ -75,7 +73,6 @@ def main(): "expectedMonkeyDeleteEdgeLoopEdges", [OperatorSpecEditMode("delete_edgeloop", {}, "EDGE", MONKEY_LOOP_EDGE)]), - ### 9 # delete loose MeshTest("CubeDeleteLooseVertices", "testCubeDeleteLooseVertices", "expectedCubeDeleteLooseVertices", @@ -98,7 +95,6 @@ def main(): "expectedCubeDissolveDegenerate", [OperatorSpecEditMode("dissolve_degenerate", {}, "VERT", {i for i in range(8)})]), - ### 13 # dissolve edges MeshTest("CylinderDissolveEdges", "testCylinderDissolveEdges", "expectedCylinderDissolveEdges", [OperatorSpecEditMode("dissolve_edges", {}, "EDGE", {0, 5, 6, 9})]), @@ -107,7 +103,6 @@ def main(): MeshTest("CubeDissolveFaces", "testCubeDissolveFaces", "expectedCubeDissolveFaces", [OperatorSpecEditMode("dissolve_faces", {}, "VERT", {5, 34, 47, 49, 83, 91, 95})]), - ### 15 # dissolve verts MeshTest("CubeDissolveVerts", "testCubeDissolveVerts", "expectedCubeDissolveVerts", [OperatorSpecEditMode("dissolve_verts", {}, "VERT", {16, 20, 22, 23, 25})]), @@ -124,7 +119,6 @@ def main(): MeshTest("ConeDuplicateEdges", "testConeDuplicateEdges", "expectedConeDuplicateEdges", [OperatorSpecEditMode("duplicate", {}, "EDGE", {i for i in range(64)})]), - ### 20 # edge collapse MeshTest("CylinderEdgeCollapse", "testCylinderEdgeCollapse", "expectedCylinderEdgeCollapse", [OperatorSpecEditMode("edge_collapse", {}, "EDGE", {1, 9, 4})]), @@ -144,6 +138,14 @@ def main(): [OperatorSpecEditMode("edge_split", {}, "EDGE", {2, 5, 8, 11, 14, 17, 20, 23})]), ### 25 + # edge ring select - Cannot be tested. Need user input. + # MeshTest("CubeEdgeRingSelect", "testCubeEdgeRingSelect", "expectedCubeEdgeRingSelect", + # [OperatorSpecEditMode("edgering_select", {}, "EDGE", {5, 20, 25, 26})]), + # MeshTest("EmptyMeshEdgeRingSelect", "testGridEdgeRingSelect", "expectedGridEdgeRingSelect", + # [OperatorSpecEditMode("edgering_select", {}, "VERT", {65, 66, 67})]), + # MeshTest("EmptyMeshEdgeRingSelect", "testEmptyMeshdgeRingSelect", "expectedEmptyMeshEdgeRingSelect", + # [OperatorSpecEditMode("edgering_select", {}, "VERT", {})]), + # face make planar MeshTest("MonkeyFaceMakePlanar", "testMonkeyFaceMakePlanar", "expectedMonkeyFaceMakePlanar", @@ -154,6 +156,15 @@ def main(): "expectedPlaneFaceSplitByEdges", [OperatorSpecEditMode("face_split_by_edges", {}, "VERT", {i for i in range(6)})]), + # faces select linked flat + MeshTest("CubeFacesSelectLinkedFlat", "testCubeFaceSelectLinkedFlat", "expectedCubeFaceSelectLinkedFlat", + [OperatorSpecEditMode("faces_select_linked_flat", {}, "FACE", {7})]), + MeshTest("PlaneFacesSelectLinkedFlat", "testPlaneFaceSelectLinkedFlat", "expectedPlaneFaceSelectLinkedFlat", + [OperatorSpecEditMode("faces_select_linked_flat", {}, "VERT", {1})]), + MeshTest("EmptyMeshFacesSelectLinkedFlat", "testEmptyMeshFaceSelectLinkedFlat", + "expectedEmptyMeshFaceSelectLinkedFlat", + [OperatorSpecEditMode("faces_select_linked_flat", {}, "VERT", {})]), + # fill MeshTest("IcosphereFill", "testIcosphereFill", "expectedIcosphereFill", [OperatorSpecEditMode("fill", {}, "EDGE", {20, 21, 22, 23, 24, 45, 46, 47, 48, 49})]), @@ -166,14 +177,12 @@ def main(): MeshTest("PlaneFillGrid", "testPlaneFillGrid", "expectedPlaneFillGrid", [OperatorSpecEditMode("fill_grid", {}, "EDGE", {1, 2, 3, 4, 5, 7, 9, 10, 11, 12, 13, 15})]), - MeshTest("PlaneFillGridSimpleBlending", "testPlaneFillGridSimpleBlending", "expectedPlaneFillGridSimpleBlending", [OperatorSpecEditMode("fill_grid", {"use_interp_simple": True}, "EDGE", {1, 2, 3, 4, 5, 7, 9, 10, 11, 12, 13, 15})]), - ### 31 # fill holes MeshTest("SphereFillHoles", "testSphereFillHoles", "expectedSphereFillHoles", [OperatorSpecEditMode("fill_holes", {"sides": 9}, "VERT", {i for i in range(481)})]), @@ -184,7 +193,6 @@ def main(): {5, 16, 17, 19, 20, 22, 23, 34, 47, 49, 50, 52, 59, 61, 62, 65, 83, 91, 95})]), - MeshTest("CubeInsetEvenOffsetFalse", "testCubeInsetEvenOffsetFalse", "expectedCubeInsetEvenOffsetFalse", [OperatorSpecEditMode("inset", {"thickness": 0.2, "use_even_offset": False}, "VERT",